/** * On starting to adding blocks: processBlocks has to be empty. If not empty, warn and clear. */ private void checkProcessBlocks() { if (!processBlocks.isEmpty()) { processBlocks.clear(); NCPAPIProvider.getNoCheatPlusAPI().getLogManager().warning(Streams.STATUS, "BlockChangeTracker: processBlocks is not empty on starting to add blocks."); } }
/** * * @param streamID * May get ignored if only the console is available. * @param level * @param msg */ public static void log(final StreamID streamID, final Level level, final String msg) { if (useLogManager) { NCPAPIProvider.getNoCheatPlusAPI().getLogManager().log(streamID, level, msg); } else { System.out.println("[" + level + "][NoCheatPlus] " + new Date()); System.out.println(msg); } }
private void noConfirmTeleportPacket() { acceptConfirmTeleportPackets = false; // TODO: Attempt to unregister. NCPAPIProvider.getNoCheatPlusAPI().getLogManager().info(Streams.STATUS, "Confirm teleport packet not available."); }
@Override public void getPositionAndLook(final Entity entity, final ISetPositionWithLook location) { try { performGet(entity, location); } catch (Throwable t) { NCPAPIProvider.getNoCheatPlusAPI().getLogManager().warning(Streams.STATUS, "Could not retrieve last position and look for Entity: " + entity.getClass().getName()); } }
@Override public void setPositionAndLook(Entity entity, IGetPositionWithLook location) { try { performSet(entity, location); } catch (Throwable t) { NCPAPIProvider.getNoCheatPlusAPI().getLogManager().warning(Streams.STATUS, "Could not set last position and look for Entity: " + entity.getClass().getName()); } }
/** * Debug to TRACE_FILE. Meant for temporary use, use CheckUtils.debug for * permanent inserts. * * @return The given returnValue. */ public static boolean debug(String message, boolean returnValue) { NCPAPIProvider.getNoCheatPlusAPI().getLogManager().debug(Streams.TRACE_FILE, message); return returnValue; }
/** * Debug to TRACE_FILE. Meant for temporary use, use CheckUtils.debug for * permanent inserts. * * @param message * @return */ public static void debug(String message) { NCPAPIProvider.getNoCheatPlusAPI().getLogManager().debug(Streams.TRACE_FILE, message); }
/** * Log warning to console, stop interpreting packet content. */ private void packetMismatch(final PacketEvent packetEvent) { final long time = Monotonic.synchMillis(); if (time - packetMismatchLogFrequency > packetMismatch) { packetMismatch = time; StringBuilder builder = new StringBuilder(512); builder.append(CheckUtils.getLogMessagePrefix(packetEvent.getPlayer(), checkType)); builder.append("Incoming packet could not be interpreted. Are server and plugins up to date (NCP/ProtocolLib...)? This message is logged every "); builder.append(Long.toString(packetMismatchLogFrequency / 1000)); builder.append(" seconds, disregarding for which player this happens."); if (!validContent.isEmpty()) { builder.append(" On other occasion, valid content was received for: "); StringUtil.join(validContent, ", ", builder); } NCPAPIProvider.getNoCheatPlusAPI().getLogManager().warning(Streams.STATUS, builder.toString()); } }
/** * Log that a hook failed. * * @param checkType * the check type * @param player * the player * @param hook * the hook * @param throwable * the throwable */ private static final void logHookFailure(final CheckType checkType, final Player player, final NCPHook hook, final Throwable t) { // TODO: might accumulate failure rate and only log every so and so seconds or disable hook if spamming (leads // to NCP spam though)? final StringBuilder builder = new StringBuilder(1024); builder.append("Hook " + getHookDescription(hook) + " encountered an unexpected exception:\n"); builder.append("Processing: "); if (checkType.getParent() != null) { builder.append("Parent " + checkType.getParent() + " "); } builder.append("Check " + checkType); builder.append(" Player " + player.getName()); builder.append("\n"); builder.append("Exception (" + t.getClass().getSimpleName() + "): " + t.getMessage() + "\n"); for (final StackTraceElement el : t.getStackTrace()) { builder.append(el.toString()); } NCPAPIProvider.getNoCheatPlusAPI().getLogManager().severe(Streams.STATUS, builder.toString()); }
/** * Log that a hook was removed. * * @param hook * the hook */ private static final void logHookRemoved(final NCPHook hook) { NCPAPIProvider.getNoCheatPlusAPI().getLogManager().info(Streams.STATUS, "Removed hook: " + getHookDescription(hook) + "."); }
/** * Log that a hook was added. * * @param hook * the hook */ private static final void logHookAdded(final NCPHook hook) { NCPAPIProvider.getNoCheatPlusAPI().getLogManager().info(Streams.STATUS, "Added hook: " + getHookDescription(hook) + "."); }
public BlockChangeListener(final BlockChangeTracker tracker) { this.tracker = tracker; if (ReflectionUtil.getMethodNoArgs(BlockPistonRetractEvent.class, "getBlocks") == null) { retractHasBlocks = false; NCPAPIProvider.getNoCheatPlusAPI().getLogManager().info(Streams.STATUS, "Assume legacy piston behavior."); } else { retractHasBlocks = true; } }
/** * Static relay for the check-specific convenience methods, logging with * standard format ([check_type] [player_name] ...). * * @param player * May be null. * @param checkType * the check type * @param message * the message */ public static void debug(final Player player, final CheckType checkType, final String message) { NCPAPIProvider.getNoCheatPlusAPI().getLogManager().debug(Streams.TRACE_FILE, getLogMessagePrefix(player, checkType) + message); }
/** * Register result as generic instance, if not null. Log if registered or if * not. Meant to register the output of a factory method. * * @param registerFor * The class the given result will be registered for. * @param result * @return The given result as instance of T. */ public static <T, ET extends T> T registerGenericInstance(Class<T> registerFor, ET result) { if (result != null) { NCPAPIProvider.getNoCheatPlusAPI().registerGenericInstance(registerFor, result); } else { NCPAPIProvider.getNoCheatPlusAPI().getLogManager().info(Streams.STATUS, "Could not register an instance for: " + registerFor.getName()); } return result; }
private void updatePlayerName(final UUID playerId, final String playerName, final PlayerData pData, String tag) { // Name change. pData.updatePlayerName(playerName); NCPAPIProvider.getNoCheatPlusAPI().getLogManager().info(Streams.STATUS, CheckUtils.getLogMessagePrefix(playerName, null) + " Update player name for id " + playerId + ": " + playerName + "(" + tag + (pData.hasTag(PlayerData.TAG_OPTIMISTIC_CREATE) ? ", optimistically created data" : "") + ")"); }
public MCAccessCBReflect() throws ReflectFailureException { // TODO: Add unavailable stuff to features / missing (TBD). helper = new ReflectHelper(); // Version Envelope tests (1.4.5-R1.0 ... 1.8.x is considered to be ok). final String mcVersion = ServerVersion.getMinecraftVersion(); if (mcVersion == GenericVersion.UNKNOWN_VERSION) { NCPAPIProvider.getNoCheatPlusAPI().getLogManager().warning(Streams.INIT, "The Minecraft version could not be detected, Compat-CB-Reflect might or might not work."); this.knownSupportedVersion = false; } else if (GenericVersion.compareVersions(mcVersion, "1.4.5") < 0) { NCPAPIProvider.getNoCheatPlusAPI().getLogManager().warning(Streams.INIT, "The Minecraft version seems to be older than what Compat-CB-Reflect can support."); this.knownSupportedVersion = false; } else if (GenericVersion.compareVersions(mcVersion, "1.12.2") > 0) { this.knownSupportedVersion = false; NCPAPIProvider.getNoCheatPlusAPI().getLogManager().warning(Streams.INIT, "The Minecraft version seems to be more recent than the one Compat-CB-Reflect has been built with - this might work, but there could be incompatibilities."); } else { this.knownSupportedVersion = true; } // Fall damage / event. TODO: Tests between 1.8 and 1.7.2. How about spigot vs. CB? if (mcVersion == GenericVersion.UNKNOWN_VERSION || GenericVersion.compareVersions(mcVersion, "1.8") < 0) { dealFallDamageFiresAnEvent = false; } else { // Assume higher versions to fire an event. dealFallDamageFiresAnEvent = true; } }
private boolean checkUntrackedLocation(final Player player, final String message, final MovingConfig mcc, final IPlayerData pData) { final Location loc = player.getLocation(useLoc); boolean cancel = false; if (MovingUtil.shouldCheckUntrackedLocation(player, loc, pData)) { final Location newTo = MovingUtil.checkUntrackedLocation(loc); if (newTo != null) { if (mcc.passableUntrackedCommandTryTeleport && player.teleport(newTo, BridgeMisc.TELEPORT_CAUSE_CORRECTION_OF_POSITION)) { NCPAPIProvider.getNoCheatPlusAPI().getLogManager().info(Streams.TRACE_FILE, player.getName() + " runs the command '" + message + "' at an untracked location: " + loc + " , teleport to: " + newTo); } else { // TODO: Allow disabling cancel? // TODO: Should message the player? NCPAPIProvider.getNoCheatPlusAPI().getLogManager().info(Streams.TRACE_FILE, player.getName() + " runs the command '" + message + "' at an untracked location: " + loc + " , cancel the command."); cancel = true; } } } useLoc.setWorld(null); // Cleanup. return cancel; }
private void onPlayerTeleportMonitorCancelled(final Player player, final PlayerTeleportEvent event, final Location to, final MovingData data, final IPlayerData pData) { if (data.isTeleported(to)) { // (Only precise match.) // TODO: Schedule a teleport to set back with PlayerData (+ failure count)? // TODO: Log once per player always? NCPAPIProvider.getNoCheatPlusAPI().getLogManager().warning( Streams.TRACE_FILE, CheckUtils.getLogMessagePrefix(player, CheckType.MOVING) + " TP " + event.getCause() + " (set back was prevented): " + to); } else { if (pData.isDebugActive(checkType)) { debugTeleportMessage(player, event, to); } } data.resetTeleported(); }
@Override public void execute(final ViolationData violationData) { // TODO: Consider permission caching or removing the feature? [Besides, check earlier?] final RegisteredPermission permissionSilent = violationData.getPermissionSilent(); // TODO: Store PlayerData in ViolationData ? Must query cache here. if (permissionSilent != null && DataManager.getPlayerData(violationData.player).hasPermission(permissionSilent, violationData.player)) { return; } final LogManager logManager = NCPAPIProvider.getNoCheatPlusAPI().getLogManager(); final String message = getMessage(violationData); final String messageNoColor = stripColor ? ColorUtil.removeColors(message) : null; final String messageWithColor = replaceColor ? ColorUtil.replaceColors(message) : null; final ConfigFile configFile = checkActive ? ConfigManager.getConfigFile() : null; for (int i = 0; i < configs.length; i ++) { final GenericLogActionConfig config = configs[i]; if (checkActive && config.configPathActive != null && !configFile.getBoolean(config.configPathActive)) { continue; } logManager.log(config.streamID, config.level, config.chatColor ? messageWithColor : messageNoColor); } }
private final void undoCancelledSetBack(final Player player, final PlayerTeleportEvent event, final MovingData data, final IPlayerData pData) { // Prevent cheaters getting rid of flying data (morepackets, other). // TODO: even more strict enforcing ? event.setCancelled(false); // TODO: Does this make sense? Have it configurable rather? if (!data.isTeleported(event.getTo())) { final Location teleported = data.getTeleported(); event.setTo(teleported); /* * Setting from ... not sure this is relevant. Idea was to avoid * subtleties with other plugins, but it probably can't be * estimated, if this means more or less 'subtleties' in the end * (amortized). */ event.setFrom(teleported); } if (pData.isDebugActive(checkType)) { NCPAPIProvider.getNoCheatPlusAPI().getLogManager().warning( Streams.TRACE_FILE, player.getName() + " TP " + event.getCause() + " (revert cancel on set back): " + event.getTo()); } }