summaryrefslogtreecommitdiffstats
path: root/EssentialsAntiCheat/src/com/earth2me/essentials/anticheat/NoCheat.java
diff options
context:
space:
mode:
Diffstat (limited to 'EssentialsAntiCheat/src/com/earth2me/essentials/anticheat/NoCheat.java')
-rw-r--r--EssentialsAntiCheat/src/com/earth2me/essentials/anticheat/NoCheat.java204
1 files changed, 204 insertions, 0 deletions
diff --git a/EssentialsAntiCheat/src/com/earth2me/essentials/anticheat/NoCheat.java b/EssentialsAntiCheat/src/com/earth2me/essentials/anticheat/NoCheat.java
new file mode 100644
index 000000000..dd378bac5
--- /dev/null
+++ b/EssentialsAntiCheat/src/com/earth2me/essentials/anticheat/NoCheat.java
@@ -0,0 +1,204 @@
+package com.earth2me.essentials.anticheat;
+
+import com.earth2me.essentials.anticheat.checks.WorkaroundsListener;
+import com.earth2me.essentials.anticheat.checks.blockbreak.BlockBreakCheckListener;
+import com.earth2me.essentials.anticheat.checks.blockplace.BlockPlaceCheckListener;
+import com.earth2me.essentials.anticheat.checks.chat.ChatCheckListener;
+import com.earth2me.essentials.anticheat.checks.fight.FightCheckListener;
+import com.earth2me.essentials.anticheat.checks.inventory.InventoryCheckListener;
+import com.earth2me.essentials.anticheat.checks.moving.MovingCheckListener;
+import com.earth2me.essentials.anticheat.command.CommandHandler;
+import com.earth2me.essentials.anticheat.config.ConfigurationCacheStore;
+import com.earth2me.essentials.anticheat.config.ConfigurationManager;
+import com.earth2me.essentials.anticheat.config.Permissions;
+import com.earth2me.essentials.anticheat.data.PlayerManager;
+import com.earth2me.essentials.anticheat.debug.ActiveCheckPrinter;
+import com.earth2me.essentials.anticheat.debug.LagMeasureTask;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Logger;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.Listener;
+import org.bukkit.plugin.java.JavaPlugin;
+
+
+/**
+ *
+ * NoCheat
+ *
+ * Check various player events for their plausibility and log/deny them/react to them based on configuration
+ */
+public class NoCheat extends JavaPlugin implements Listener
+{
+ private ConfigurationManager conf;
+ private CommandHandler commandHandler;
+ private PlayerManager players = new PlayerManager(this);
+ private List<EventManager> eventManagers = new ArrayList<EventManager>();
+ private LagMeasureTask lagMeasureTask;
+ private Logger fileLogger;
+
+ @Override
+ public void onDisable()
+ {
+ if (lagMeasureTask != null)
+ {
+ lagMeasureTask.cancel();
+ }
+
+ if (conf != null)
+ {
+ conf.cleanup();
+ }
+
+ // Just to be sure nothing gets left out
+ getServer().getScheduler().cancelTasks(this);
+ }
+
+ @Override
+ public void onEnable()
+ {
+ commandHandler = new CommandHandler(this);
+ conf = new ConfigurationManager(this, getDataFolder());
+ // Set up the event listeners
+ eventManagers.add(new MovingCheckListener(this));
+ eventManagers.add(new WorkaroundsListener());
+ eventManagers.add(new ChatCheckListener(this));
+ eventManagers.add(new BlockBreakCheckListener(this));
+ eventManagers.add(new BlockPlaceCheckListener(this));
+ eventManagers.add(new FightCheckListener(this));
+ eventManagers.add(new InventoryCheckListener(this));
+
+ // Then set up a task to monitor server lag
+ if (lagMeasureTask == null)
+ {
+ lagMeasureTask = new LagMeasureTask(this);
+ lagMeasureTask.start();
+ }
+
+ // Then print a list of active checks per world
+ ActiveCheckPrinter.printActiveChecks(this, eventManagers);
+
+ // register all listeners
+ for (EventManager eventManager : eventManagers)
+ {
+ Bukkit.getPluginManager().registerEvents(eventManager, this);
+ }
+
+ getServer().getPluginManager().registerEvents(this, this);
+ }
+
+ public ConfigurationCacheStore getConfig(Player player)
+ {
+ if (player != null)
+ {
+ return getConfig(player.getWorld());
+ }
+ else
+ {
+ return conf.getConfigurationCacheForWorld(null);
+ }
+ }
+
+ public ConfigurationCacheStore getConfig(World world)
+ {
+ if (world != null)
+ {
+ return conf.getConfigurationCacheForWorld(world.getName());
+ }
+ else
+ {
+ return conf.getConfigurationCacheForWorld(null);
+ }
+ }
+
+ @Override
+ public boolean onCommand(CommandSender sender, Command command, String label, String[] args)
+ {
+ boolean result = commandHandler.handleCommand(this, sender, command, label, args);
+
+ return result;
+ }
+
+ public boolean skipCheck()
+ {
+ if (lagMeasureTask != null)
+ {
+ return lagMeasureTask.skipCheck();
+ }
+ return false;
+ }
+
+ public void reloadConfiguration()
+ {
+ conf.cleanup();
+ this.conf = new ConfigurationManager(this, this.getDataFolder());
+ players.cleanDataMap();
+ }
+
+ /**
+ * Call this periodically to walk over the stored data map and remove old/unused entries
+ *
+ */
+ public void cleanDataMap()
+ {
+ players.cleanDataMap();
+ }
+
+ /**
+ * An interface method usable by other plugins to collect information about a player. It will include the plugin
+ * version, two timestamps (beginning and end of data collection for that player), and various data from checks)
+ *
+ * @param playerName a player name
+ * @return A newly created map of identifiers and corresponding values
+ */
+ public Map<String, Object> getPlayerData(String playerName)
+ {
+
+ Map<String, Object> map = players.getPlayerData(playerName);
+ map.put("nocheat.version", this.getDescription().getVersion());
+ return map;
+ }
+
+ public NoCheatPlayer getPlayer(Player player)
+ {
+ return players.getPlayer(player);
+ }
+
+ @EventHandler(priority = EventPriority.MONITOR)
+ public void logEvent(NoCheatLogEvent event)
+ {
+ if (event.toConsole())
+ {
+ // Console logs are not colored
+ getServer().getLogger().info(Colors.removeColors(event.getPrefix() + event.getMessage()));
+ }
+ if (event.toChat())
+ {
+ for (Player player : Bukkit.getServer().getOnlinePlayers())
+ {
+ if (player.hasPermission(Permissions.ADMIN_CHATLOG))
+ {
+ // Chat logs are potentially colored
+ player.sendMessage(Colors.replaceColors(event.getPrefix() + event.getMessage()));
+ }
+ }
+ }
+ if (event.toFile())
+ {
+ // File logs are not colored
+ fileLogger.info(Colors.removeColors(event.getMessage()));
+ }
+ }
+
+ public void setFileLogger(Logger logger)
+ {
+ this.fileLogger = logger;
+ }
+}