From 67d1931a651efdd11945cd8e602307a835a617d1 Mon Sep 17 00:00:00 2001 From: Evenprime Date: Sun, 12 Feb 2012 20:51:48 +0100 Subject: [PATCH] Reorganize some code to make it more obvious and added some comments. --- .../bukkit/nocheat/checks/Check.java | 44 ++-- .../checks/blockbreak/BlockBreakCheck.java | 9 +- .../blockbreak/BlockBreakCheckListener.java | 40 ++-- .../checks/blockbreak/BlockBreakConfig.java | 4 - .../checks/blockbreak/DirectionCheck.java | 7 +- .../checks/blockbreak/NoswingCheck.java | 7 +- .../nocheat/checks/blockbreak/ReachCheck.java | 7 +- .../checks/blockplace/BlockPlaceCheck.java | 8 +- .../blockplace/BlockPlaceCheckListener.java | 30 ++- .../checks/blockplace/BlockPlaceConfig.java | 5 - .../checks/blockplace/DirectionCheck.java | 8 +- .../nocheat/checks/blockplace/ReachCheck.java | 8 +- .../bukkit/nocheat/checks/chat/ChatCheck.java | 8 +- .../checks/chat/ChatCheckListener.java | 33 ++- .../nocheat/checks/chat/ChatConfig.java | 4 - .../nocheat/checks/chat/ColorCheck.java | 8 +- .../bukkit/nocheat/checks/chat/SpamCheck.java | 8 +- .../nocheat/checks/fight/FightCheck.java | 4 +- .../checks/fight/FightCheckListener.java | 4 +- .../nocheat/checks/inventory/DropCheck.java | 3 +- .../checks/inventory/InstantBowCheck.java | 3 +- .../checks/inventory/InstantEatCheck.java | 3 +- .../checks/inventory/InventoryCheck.java | 4 +- .../inventory/InventoryCheckListener.java | 6 +- .../nocheat/checks/moving/FlyingCheck.java | 7 +- .../checks/moving/MorePacketsCheck.java | 8 +- .../nocheat/checks/moving/MovingCheck.java | 14 +- .../checks/moving/MovingCheckListener.java | 211 ++++++++++++------ .../nocheat/checks/moving/MovingConfig.java | 5 - .../nocheat/checks/moving/MovingData.java | 2 +- .../nocheat/checks/moving/NoFallCheck.java | 15 +- .../nocheat/checks/moving/RunflyCheck.java | 48 ---- .../nocheat/checks/moving/RunningCheck.java | 6 +- 33 files changed, 255 insertions(+), 326 deletions(-) delete mode 100644 src/cc/co/evenprime/bukkit/nocheat/checks/moving/RunflyCheck.java diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/Check.java b/src/cc/co/evenprime/bukkit/nocheat/checks/Check.java index a5cc4a7b..07f53e91 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/Check.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/Check.java @@ -21,33 +21,29 @@ import cc.co.evenprime.bukkit.nocheat.data.Statistics.Id; public abstract class Check { private final String name; - private final String groupId; // used to bundle information of multiple checks - private final String permission; + // used to bundle information of multiple checks + private final String groupId; private static final CommandSender noCheatCommandSender = new NoCheatCommandSender(); protected final NoCheat plugin; - public Check(NoCheat plugin, String groupId, String name, String permission) { - + public Check(NoCheat plugin, String groupId, String name) { this.plugin = plugin; this.groupId = groupId; this.name = name; - this.permission = permission; - } - - public final String getName() { - return name; - } - - public final String getPermission() { - return permission; } + /** + * Execute some actions for the specified player + * + * @param player + * @param actions + * @return + */ protected final boolean executeActions(NoCheatPlayer player, Action[] actions) { boolean special = false; - final long time = System.currentTimeMillis() / 1000; - + final long time = System.currentTimeMillis() / 1000L; final ConfigurationCacheStore cc = player.getConfigurationStore(); for(Action ac : actions) { @@ -67,6 +63,13 @@ public abstract class Check { return special; } + /** + * Collect information about the players violations + * + * @param player + * @param id + * @param vl + */ protected void incrementStatistics(NoCheatPlayer player, Id id, double vl) { player.getDataStore().getStatistics().increment(id, vl); } @@ -91,12 +94,21 @@ public abstract class Check { } } + /** + * Replace a parameter for commands or log actions with an actual + * value. Individual checks should override this to get their own + * parameters handled too. + * + * @param wildcard + * @param player + * @return + */ public String getParameter(ParameterName wildcard, NoCheatPlayer player) { if(wildcard == ParameterName.PLAYER) return player.getName(); else if(wildcard == ParameterName.CHECK) - return getName(); + return name; else if(wildcard == ParameterName.LOCATION) { Location l = player.getPlayer().getLocation(); return String.format(Locale.US, "%.2f,%.2f,%.2f", l.getX(), l.getY(), l.getZ()); diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/BlockBreakCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/BlockBreakCheck.java index 51c39af1..5b6482ea 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/BlockBreakCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/BlockBreakCheck.java @@ -1,7 +1,6 @@ package cc.co.evenprime.bukkit.nocheat.checks.blockbreak; import cc.co.evenprime.bukkit.nocheat.NoCheat; -import cc.co.evenprime.bukkit.nocheat.NoCheatPlayer; import cc.co.evenprime.bukkit.nocheat.checks.Check; import cc.co.evenprime.bukkit.nocheat.config.ConfigurationCacheStore; import cc.co.evenprime.bukkit.nocheat.data.DataStore; @@ -10,14 +9,10 @@ public abstract class BlockBreakCheck extends Check { private static final String id = "blockbreak"; - public BlockBreakCheck(NoCheat plugin, String name, String permission) { - super(plugin, id, name, permission); + public BlockBreakCheck(NoCheat plugin, String name) { + super(plugin, id, name); } - public abstract boolean check(NoCheatPlayer player, BlockBreakData data, BlockBreakConfig cc); - - public abstract boolean isEnabled(BlockBreakConfig cc); - public static BlockBreakData getData(DataStore base) { BlockBreakData data = base.get(id); if(data == null) { diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/BlockBreakCheckListener.java b/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/BlockBreakCheckListener.java index 018f67a4..e098c118 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/BlockBreakCheckListener.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/BlockBreakCheckListener.java @@ -1,6 +1,5 @@ package cc.co.evenprime.bukkit.nocheat.checks.blockbreak; -import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import org.bukkit.event.EventHandler; @@ -23,16 +22,16 @@ import cc.co.evenprime.bukkit.nocheat.config.Permissions; */ public class BlockBreakCheckListener implements Listener, EventManager { - private final List checks; - private final NoCheat plugin; + private final NoswingCheck noswingCheck; + private final ReachCheck reachCheck; + private final DirectionCheck directionCheck; + private final NoCheat plugin; public BlockBreakCheckListener(NoCheat plugin) { - // Three checks exist for this event type - this.checks = new ArrayList(3); - this.checks.add(new NoswingCheck(plugin)); - this.checks.add(new ReachCheck(plugin)); - this.checks.add(new DirectionCheck(plugin)); + noswingCheck = new NoswingCheck(plugin); + reachCheck = new ReachCheck(plugin); + directionCheck = new DirectionCheck(plugin); this.plugin = plugin; } @@ -48,10 +47,6 @@ public class BlockBreakCheckListener implements Listener, EventManager { final NoCheatPlayer player = plugin.getPlayer(event.getPlayer()); final BlockBreakConfig cc = BlockBreakCheck.getConfig(player.getConfigurationStore()); - if(!cc.check || player.hasPermission(Permissions.BLOCKBREAK)) { - return; - } - final BlockBreakData data = BlockBreakCheck.getData(player.getDataStore()); data.brokenBlockLocation.set(event.getBlock()); @@ -64,12 +59,15 @@ public class BlockBreakCheckListener implements Listener, EventManager { return; } - // Go through all "blockbreak" checks - for(BlockBreakCheck check : checks) { - // If it should be executed, do it - if(!cancelled && check.isEnabled(cc) && !player.hasPermission(check.getPermission())) { - cancelled = check.check(player, data, cc); - } + // Now do the actual checks, if still needed + if(cc.noswingCheck && !player.hasPermission(Permissions.BLOCKBREAK_NOSWING)) { + cancelled = noswingCheck.check(player, data, cc); + } + if(!cancelled && cc.reachCheck && !player.hasPermission(Permissions.BLOCKBREAK_REACH)) { + cancelled = reachCheck.check(player, data, cc); + } + if(!cancelled && cc.directionCheck && !player.hasPermission(Permissions.BLOCKBREAK_DIRECTION)) { + cancelled = directionCheck.check(player, data, cc); } if(cancelled) @@ -117,11 +115,11 @@ public class BlockBreakCheckListener implements Listener, EventManager { BlockBreakConfig bb = BlockBreakCheck.getConfig(cc); - if(bb.check && bb.directionCheck) + if(bb.directionCheck) s.add("blockbreak.direction"); - if(bb.check && bb.reachCheck) + if(bb.reachCheck) s.add("blockbreak.reach"); - if(bb.check && bb.noswingCheck) + if(bb.noswingCheck) s.add("blockbreak.noswing"); return s; diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/BlockBreakConfig.java b/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/BlockBreakConfig.java index 22159cc6..b1c7a8a0 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/BlockBreakConfig.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/BlockBreakConfig.java @@ -12,7 +12,6 @@ import cc.co.evenprime.bukkit.nocheat.config.NoCheatConfiguration; */ public class BlockBreakConfig implements ConfigItem { - public final boolean check; public final boolean reachCheck; public final double reachDistance; public final ActionList reachActions; @@ -34,8 +33,5 @@ public class BlockBreakConfig implements ConfigItem { directionActions = data.getActionList(ConfPaths.BLOCKBREAK_DIRECTION_ACTIONS); noswingCheck = data.getBoolean(ConfPaths.BLOCKBREAK_NOSWING_CHECK); noswingActions = data.getActionList(ConfPaths.BLOCKBREAK_NOSWING_ACTIONS); - - check = reachCheck || directionCheck || noswingCheck; - } } diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/DirectionCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/DirectionCheck.java index 2bf71573..4dee9342 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/DirectionCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/DirectionCheck.java @@ -5,7 +5,6 @@ import cc.co.evenprime.bukkit.nocheat.NoCheat; import cc.co.evenprime.bukkit.nocheat.NoCheatPlayer; import cc.co.evenprime.bukkit.nocheat.actions.ParameterName; import cc.co.evenprime.bukkit.nocheat.checks.CheckUtil; -import cc.co.evenprime.bukkit.nocheat.config.Permissions; import cc.co.evenprime.bukkit.nocheat.data.SimpleLocation; import cc.co.evenprime.bukkit.nocheat.data.Statistics.Id; @@ -17,7 +16,7 @@ import cc.co.evenprime.bukkit.nocheat.data.Statistics.Id; public class DirectionCheck extends BlockBreakCheck { public DirectionCheck(NoCheat plugin) { - super(plugin, "blockbreak.direction", Permissions.BLOCKBREAK_DIRECTION); + super(plugin, "blockbreak.direction"); } public boolean check(final NoCheatPlayer player, final BlockBreakData data, final BlockBreakConfig ccblockbreak) { @@ -65,10 +64,6 @@ public class DirectionCheck extends BlockBreakCheck { return cancel; } - public boolean isEnabled(BlockBreakConfig cc) { - return cc.directionCheck; - } - public String getParameter(ParameterName wildcard, NoCheatPlayer player) { if(wildcard == ParameterName.VIOLATIONS) diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/NoswingCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/NoswingCheck.java index f3331063..f0664b21 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/NoswingCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/NoswingCheck.java @@ -4,13 +4,12 @@ import java.util.Locale; import cc.co.evenprime.bukkit.nocheat.NoCheat; import cc.co.evenprime.bukkit.nocheat.NoCheatPlayer; import cc.co.evenprime.bukkit.nocheat.actions.ParameterName; -import cc.co.evenprime.bukkit.nocheat.config.Permissions; import cc.co.evenprime.bukkit.nocheat.data.Statistics.Id; public class NoswingCheck extends BlockBreakCheck { public NoswingCheck(NoCheat plugin) { - super(plugin, "blockbreak.noswing", Permissions.BLOCKBREAK_NOSWING); + super(plugin, "blockbreak.noswing"); } public boolean check(NoCheatPlayer player, BlockBreakData data, BlockBreakConfig cc) { @@ -31,10 +30,6 @@ public class NoswingCheck extends BlockBreakCheck { return cancel; } - public boolean isEnabled(BlockBreakConfig cc) { - return cc.noswingCheck; - } - public String getParameter(ParameterName wildcard, NoCheatPlayer player) { if(wildcard == ParameterName.VIOLATIONS) diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/ReachCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/ReachCheck.java index d0c7af79..bfea00bc 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/ReachCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/ReachCheck.java @@ -5,7 +5,6 @@ import cc.co.evenprime.bukkit.nocheat.NoCheat; import cc.co.evenprime.bukkit.nocheat.NoCheatPlayer; import cc.co.evenprime.bukkit.nocheat.actions.ParameterName; import cc.co.evenprime.bukkit.nocheat.checks.CheckUtil; -import cc.co.evenprime.bukkit.nocheat.config.Permissions; import cc.co.evenprime.bukkit.nocheat.data.SimpleLocation; import cc.co.evenprime.bukkit.nocheat.data.Statistics.Id; @@ -17,7 +16,7 @@ import cc.co.evenprime.bukkit.nocheat.data.Statistics.Id; public class ReachCheck extends BlockBreakCheck { public ReachCheck(NoCheat plugin) { - super(plugin, "blockbreak.reach", Permissions.BLOCKBREAK_REACH); + super(plugin, "blockbreak.reach"); } public boolean check(NoCheatPlayer player, BlockBreakData data, BlockBreakConfig cc) { @@ -44,10 +43,6 @@ public class ReachCheck extends BlockBreakCheck { return cancel; } - public boolean isEnabled(BlockBreakConfig cc) { - return cc.reachCheck; - } - public String getParameter(ParameterName wildcard, NoCheatPlayer player) { if(wildcard == ParameterName.VIOLATIONS) diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/BlockPlaceCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/BlockPlaceCheck.java index c1e261fa..c76e7366 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/BlockPlaceCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/BlockPlaceCheck.java @@ -16,14 +16,10 @@ public abstract class BlockPlaceCheck extends Check { private static final String id = "blockplace"; - public BlockPlaceCheck(NoCheat plugin, String name, String permission) { - super(plugin, id, name, permission); + public BlockPlaceCheck(NoCheat plugin, String name) { + super(plugin, id, name); } - public abstract boolean check(NoCheatPlayer player, BlockPlaceData data, BlockPlaceConfig cc); - - public abstract boolean isEnabled(BlockPlaceConfig cc); - @Override public String getParameter(ParameterName wildcard, NoCheatPlayer player) { if(wildcard == ParameterName.PLACE_LOCATION) { diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/BlockPlaceCheckListener.java b/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/BlockPlaceCheckListener.java index 3bb98c99..dea8492c 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/BlockPlaceCheckListener.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/BlockPlaceCheckListener.java @@ -1,6 +1,5 @@ package cc.co.evenprime.bukkit.nocheat.checks.blockplace; -import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import org.bukkit.event.EventHandler; @@ -20,16 +19,16 @@ import cc.co.evenprime.bukkit.nocheat.config.Permissions; */ public class BlockPlaceCheckListener implements Listener, EventManager { - private final List checks; - private final NoCheat plugin; + private final ReachCheck reachCheck; + private final DirectionCheck directionCheck; + private final NoCheat plugin; public BlockPlaceCheckListener(NoCheat plugin) { this.plugin = plugin; - this.checks = new ArrayList(2); - this.checks.add(new ReachCheck(plugin)); - this.checks.add(new DirectionCheck(plugin)); + reachCheck = new ReachCheck(plugin); + directionCheck = new DirectionCheck(plugin); } @EventHandler(priority = EventPriority.LOWEST) @@ -46,20 +45,17 @@ public class BlockPlaceCheckListener implements Listener, EventManager { final NoCheatPlayer player = plugin.getPlayer(event.getPlayer()); final BlockPlaceConfig cc = BlockPlaceCheck.getConfig(player.getConfigurationStore()); - if(!cc.check || player.hasPermission(Permissions.BLOCKPLACE)) { - return; - } - final BlockPlaceData data = BlockPlaceCheck.getData(player.getDataStore()); data.blockPlaced.set(event.getBlock()); data.blockPlacedAgainst.set(event.getBlockAgainst()); - for(BlockPlaceCheck check : checks) { - // If it should be executed, do it - if(!cancelled && check.isEnabled(cc) && !player.hasPermission(check.getPermission())) { - cancelled = check.check(player, data, cc); - } + // Now do the actual checks + if(cc.reachCheck && !player.hasPermission(Permissions.BLOCKPLACE_REACH)) { + cancelled = reachCheck.check(player, data, cc); + } + if(!cancelled && cc.directionCheck && !player.hasPermission(Permissions.BLOCKPLACE_DIRECTION)) { + cancelled = directionCheck.check(player, data, cc); } if(cancelled) @@ -71,8 +67,10 @@ public class BlockPlaceCheckListener implements Listener, EventManager { BlockPlaceConfig bp = BlockPlaceCheck.getConfig(cc); - if(bp.check && bp.reachCheck) + if(bp.reachCheck) s.add("blockplace.reach"); + if(bp.directionCheck) + s.add("blockplace.direction"); return s; } diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/BlockPlaceConfig.java b/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/BlockPlaceConfig.java index e5b502e8..9004ad81 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/BlockPlaceConfig.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/BlockPlaceConfig.java @@ -10,8 +10,6 @@ import cc.co.evenprime.bukkit.nocheat.config.NoCheatConfiguration; */ public class BlockPlaceConfig implements ConfigItem { - public final boolean check; - public final boolean reachCheck; public final double reachDistance; public final ActionList reachActions; @@ -31,8 +29,5 @@ public class BlockPlaceConfig implements ConfigItem { directionPenaltyTime = data.getInt(ConfPaths.BLOCKPLACE_DIRECTION_PENALTYTIME); directionPrecision = ((double) data.getInt(ConfPaths.BLOCKPLACE_DIRECTION_PRECISION)) / 100D; directionActions = data.getActionList(ConfPaths.BLOCKPLACE_DIRECTION_ACTIONS); - - check = reachCheck || directionCheck; - } } diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/DirectionCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/DirectionCheck.java index 50b664ee..54eeecbf 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/DirectionCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/DirectionCheck.java @@ -5,14 +5,13 @@ import cc.co.evenprime.bukkit.nocheat.NoCheat; import cc.co.evenprime.bukkit.nocheat.NoCheatPlayer; import cc.co.evenprime.bukkit.nocheat.actions.ParameterName; import cc.co.evenprime.bukkit.nocheat.checks.CheckUtil; -import cc.co.evenprime.bukkit.nocheat.config.Permissions; import cc.co.evenprime.bukkit.nocheat.data.SimpleLocation; import cc.co.evenprime.bukkit.nocheat.data.Statistics.Id; public class DirectionCheck extends BlockPlaceCheck { public DirectionCheck(NoCheat plugin) { - super(plugin, "blockplace.direction", Permissions.BLOCKPLACE_DIRECTION); + super(plugin, "blockplace.direction"); } public boolean check(NoCheatPlayer player, BlockPlaceData data, BlockPlaceConfig cc) { @@ -84,11 +83,6 @@ public class DirectionCheck extends BlockPlaceCheck { return cancel; } - @Override - public boolean isEnabled(BlockPlaceConfig cc) { - return cc.directionCheck; - } - public String getParameter(ParameterName wildcard, NoCheatPlayer player) { if(wildcard == ParameterName.VIOLATIONS) diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/ReachCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/ReachCheck.java index 2d2c253f..4b03acc3 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/ReachCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/blockplace/ReachCheck.java @@ -5,7 +5,6 @@ import cc.co.evenprime.bukkit.nocheat.NoCheat; import cc.co.evenprime.bukkit.nocheat.NoCheatPlayer; import cc.co.evenprime.bukkit.nocheat.actions.ParameterName; import cc.co.evenprime.bukkit.nocheat.checks.CheckUtil; -import cc.co.evenprime.bukkit.nocheat.config.Permissions; import cc.co.evenprime.bukkit.nocheat.data.SimpleLocation; import cc.co.evenprime.bukkit.nocheat.data.Statistics.Id; @@ -17,7 +16,7 @@ import cc.co.evenprime.bukkit.nocheat.data.Statistics.Id; public class ReachCheck extends BlockPlaceCheck { public ReachCheck(NoCheat plugin) { - super(plugin, "blockplace.reach", Permissions.BLOCKPLACE_REACH); + super(plugin, "blockplace.reach"); } public boolean check(NoCheatPlayer player, BlockPlaceData data, BlockPlaceConfig cc) { @@ -44,11 +43,6 @@ public class ReachCheck extends BlockPlaceCheck { return cancel; } - @Override - public boolean isEnabled(BlockPlaceConfig cc) { - return cc.reachCheck; - } - public String getParameter(ParameterName wildcard, NoCheatPlayer player) { if(wildcard == ParameterName.VIOLATIONS) diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/chat/ChatCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/chat/ChatCheck.java index 61224934..fecfe816 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/chat/ChatCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/chat/ChatCheck.java @@ -11,14 +11,10 @@ public abstract class ChatCheck extends Check { private static final String id = "chat"; - public ChatCheck(NoCheat plugin, String name, String permission) { - super(plugin, id, name, permission); + public ChatCheck(NoCheat plugin, String name) { + super(plugin, id, name); } - public abstract boolean check(NoCheatPlayer player, ChatData data, ChatConfig cc); - - public abstract boolean isEnabled(ChatConfig cc); - @Override public String getParameter(ParameterName wildcard, NoCheatPlayer player) { diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/chat/ChatCheckListener.java b/src/cc/co/evenprime/bukkit/nocheat/checks/chat/ChatCheckListener.java index 76115afe..d47ee535 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/chat/ChatCheckListener.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/chat/ChatCheckListener.java @@ -1,6 +1,5 @@ package cc.co.evenprime.bukkit.nocheat.checks.chat; -import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import org.bukkit.event.EventHandler; @@ -16,16 +15,17 @@ import cc.co.evenprime.bukkit.nocheat.config.Permissions; public class ChatCheckListener implements Listener, EventManager { - private final List checks; - private final NoCheat plugin; + private final SpamCheck spamCheck; + private final ColorCheck colorCheck; + + private final NoCheat plugin; public ChatCheckListener(NoCheat plugin) { - this.checks = new ArrayList(3); - this.checks.add(new SpamCheck(plugin)); - this.checks.add(new ColorCheck(plugin)); - this.plugin = plugin; + + spamCheck = new SpamCheck(plugin); + colorCheck = new ColorCheck(plugin); } @EventHandler(priority = EventPriority.LOWEST) @@ -44,19 +44,16 @@ public class ChatCheckListener implements Listener, EventManager { final NoCheatPlayer player = plugin.getPlayer(event.getPlayer()); final ChatConfig cc = ChatCheck.getConfig(player.getConfigurationStore()); - if(!cc.check || player.hasPermission(Permissions.CHAT)) { - return; - } - final ChatData data = ChatCheck.getData(player.getDataStore()); data.message = event.getMessage(); - for(ChatCheck check : checks) { - // If it should be executed, do it - if(!cancelled && check.isEnabled(cc) && !player.hasPermission(check.getPermission())) { - cancelled = check.check(player, data, cc); - } + // Now do the actual checks + if(cc.spamCheck && !player.hasPermission(Permissions.CHAT_SPAM)) { + cancelled = spamCheck.check(player, data, cc); + } + if(!cancelled && cc.colorCheck && !player.hasPermission(Permissions.CHAT_COLOR)) { + cancelled = colorCheck.check(player, data, cc); } if(cancelled) { @@ -71,9 +68,9 @@ public class ChatCheckListener implements Listener, EventManager { LinkedList s = new LinkedList(); ChatConfig c = ChatCheck.getConfig(cc); - if(c.check && c.spamCheck) + if(c.spamCheck) s.add("chat.spam"); - if(c.check && c.colorCheck) + if(c.colorCheck) s.add("chat.color"); return s; } diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/chat/ChatConfig.java b/src/cc/co/evenprime/bukkit/nocheat/checks/chat/ChatConfig.java index 1c275210..1559a346 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/chat/ChatConfig.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/chat/ChatConfig.java @@ -9,7 +9,6 @@ import cc.co.evenprime.bukkit.nocheat.config.NoCheatConfiguration; public class ChatConfig implements ConfigItem { - public final boolean check; public final boolean spamCheck; public final String[] spamWhitelist; public final int spamTimeframe; @@ -29,9 +28,6 @@ public class ChatConfig implements ConfigItem { spamActions = data.getActionList(ConfPaths.CHAT_SPAM_ACTIONS); colorCheck = data.getBoolean(ConfPaths.CHAT_COLOR_CHECK); colorActions = data.getActionList(ConfPaths.CHAT_COLOR_ACTIONS); - - check = spamCheck || colorCheck; - } private String[] splitWhitelist(String string) { diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/chat/ColorCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/chat/ColorCheck.java index 88c6afad..13177862 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/chat/ColorCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/chat/ColorCheck.java @@ -4,13 +4,12 @@ import java.util.Locale; import cc.co.evenprime.bukkit.nocheat.NoCheat; import cc.co.evenprime.bukkit.nocheat.NoCheatPlayer; import cc.co.evenprime.bukkit.nocheat.actions.ParameterName; -import cc.co.evenprime.bukkit.nocheat.config.Permissions; import cc.co.evenprime.bukkit.nocheat.data.Statistics.Id; public class ColorCheck extends ChatCheck { public ColorCheck(NoCheat plugin) { - super(plugin, "chat.color", Permissions.CHAT_COLOR); + super(plugin, "chat.color"); } public boolean check(NoCheatPlayer player, ChatData data, ChatConfig cc) { @@ -31,11 +30,6 @@ public class ColorCheck extends ChatCheck { return false; } - @Override - public boolean isEnabled(ChatConfig cc) { - return cc.colorCheck; - } - public String getParameter(ParameterName wildcard, NoCheatPlayer player) { if(wildcard == ParameterName.VIOLATIONS) diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/chat/SpamCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/chat/SpamCheck.java index 442e328f..560824e4 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/chat/SpamCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/chat/SpamCheck.java @@ -4,13 +4,12 @@ import java.util.Locale; import cc.co.evenprime.bukkit.nocheat.NoCheat; import cc.co.evenprime.bukkit.nocheat.NoCheatPlayer; import cc.co.evenprime.bukkit.nocheat.actions.ParameterName; -import cc.co.evenprime.bukkit.nocheat.config.Permissions; import cc.co.evenprime.bukkit.nocheat.data.Statistics.Id; public class SpamCheck extends ChatCheck { public SpamCheck(NoCheat plugin) { - super(plugin, "chat.spam", Permissions.CHAT_SPAM); + super(plugin, "chat.spam"); } public boolean check(NoCheatPlayer player, ChatData data, ChatConfig cc) { @@ -53,11 +52,6 @@ public class SpamCheck extends ChatCheck { return cancel; } - @Override - public boolean isEnabled(ChatConfig cc) { - return cc.spamCheck; - } - public String getParameter(ParameterName wildcard, NoCheatPlayer player) { if(wildcard == ParameterName.VIOLATIONS) diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/fight/FightCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/fight/FightCheck.java index e4e34906..5ce1b15e 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/fight/FightCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/fight/FightCheck.java @@ -13,9 +13,11 @@ import cc.co.evenprime.bukkit.nocheat.data.DataStore; public abstract class FightCheck extends Check { private static final String id = "fight"; + public final String permission; public FightCheck(NoCheat plugin, String name, String permission) { - super(plugin, id, name, permission); + super(plugin, id, name); + this.permission = permission; } public abstract boolean check(NoCheatPlayer player, FightData data, FightConfig cc); diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/fight/FightCheckListener.java b/src/cc/co/evenprime/bukkit/nocheat/checks/fight/FightCheckListener.java index 3e970760..1fdbbeeb 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/fight/FightCheckListener.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/fight/FightCheckListener.java @@ -71,7 +71,7 @@ public class FightCheckListener implements Listener, EventManager { NoCheatPlayer player = plugin.getPlayer((Player) entity); FightConfig cc = FightCheck.getConfig(player.getConfigurationStore()); - if(!godmodeCheck.isEnabled(cc) || player.hasPermission(godmodeCheck.getPermission())) { + if(!godmodeCheck.isEnabled(cc) || player.hasPermission(godmodeCheck.permission)) { return; } @@ -109,7 +109,7 @@ public class FightCheckListener implements Listener, EventManager { for(FightCheck check : checks) { // If it should be executed, do it - if(!cancelled && check.isEnabled(cc) && !player.hasPermission(check.getPermission())) { + if(!cancelled && check.isEnabled(cc) && !player.hasPermission(check.permission)) { cancelled = check.check(player, data, cc); } } diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/inventory/DropCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/inventory/DropCheck.java index d4666aa1..e2c45c60 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/inventory/DropCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/inventory/DropCheck.java @@ -4,13 +4,12 @@ import java.util.Locale; import cc.co.evenprime.bukkit.nocheat.NoCheat; import cc.co.evenprime.bukkit.nocheat.NoCheatPlayer; import cc.co.evenprime.bukkit.nocheat.actions.ParameterName; -import cc.co.evenprime.bukkit.nocheat.config.Permissions; import cc.co.evenprime.bukkit.nocheat.data.Statistics.Id; public class DropCheck extends InventoryCheck { public DropCheck(NoCheat plugin) { - super(plugin, "inventory.drop", Permissions.INVENTORY_DROP); + super(plugin, "inventory.drop"); } public boolean check(NoCheatPlayer player, InventoryData data, InventoryConfig cc) { diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/inventory/InstantBowCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/inventory/InstantBowCheck.java index 6bdcfe2e..c530fa53 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/inventory/InstantBowCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/inventory/InstantBowCheck.java @@ -5,13 +5,12 @@ import org.bukkit.event.entity.EntityShootBowEvent; import cc.co.evenprime.bukkit.nocheat.NoCheat; import cc.co.evenprime.bukkit.nocheat.NoCheatPlayer; import cc.co.evenprime.bukkit.nocheat.actions.ParameterName; -import cc.co.evenprime.bukkit.nocheat.config.Permissions; import cc.co.evenprime.bukkit.nocheat.data.Statistics.Id; public class InstantBowCheck extends InventoryCheck { public InstantBowCheck(NoCheat plugin) { - super(plugin, "inventory.instantbow", Permissions.INVENTORY_INSTANTBOW); + super(plugin, "inventory.instantbow"); } public boolean check(NoCheatPlayer player, EntityShootBowEvent event, InventoryData data, InventoryConfig cc) { diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/inventory/InstantEatCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/inventory/InstantEatCheck.java index 7d8b1e11..bbcd887e 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/inventory/InstantEatCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/inventory/InstantEatCheck.java @@ -5,13 +5,12 @@ import org.bukkit.event.entity.FoodLevelChangeEvent; import cc.co.evenprime.bukkit.nocheat.NoCheat; import cc.co.evenprime.bukkit.nocheat.NoCheatPlayer; import cc.co.evenprime.bukkit.nocheat.actions.ParameterName; -import cc.co.evenprime.bukkit.nocheat.config.Permissions; import cc.co.evenprime.bukkit.nocheat.data.Statistics.Id; public class InstantEatCheck extends InventoryCheck { public InstantEatCheck(NoCheat plugin) { - super(plugin, "inventory.instanteat", Permissions.INVENTORY_INSTANTEAT); + super(plugin, "inventory.instanteat"); } public boolean check(NoCheatPlayer player, FoodLevelChangeEvent event, InventoryData data, InventoryConfig cc) { diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/inventory/InventoryCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/inventory/InventoryCheck.java index 3c6a86f3..5e0f4577 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/inventory/InventoryCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/inventory/InventoryCheck.java @@ -9,8 +9,8 @@ public abstract class InventoryCheck extends Check { private static final String id = "inventory"; - public InventoryCheck(NoCheat plugin, String name, String permission) { - super(plugin, id, name, permission); + public InventoryCheck(NoCheat plugin, String name) { + super(plugin, id, name); } public static InventoryData getData(DataStore base) { diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/inventory/InventoryCheckListener.java b/src/cc/co/evenprime/bukkit/nocheat/checks/inventory/InventoryCheckListener.java index 060a1265..75f543fa 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/inventory/InventoryCheckListener.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/inventory/InventoryCheckListener.java @@ -53,7 +53,7 @@ public class InventoryCheckListener implements Listener, EventManager { boolean cancelled = false; // If it should be executed, do it - if(cc.dropCheck && !player.hasPermission(dropCheck.getPermission())) { + if(cc.dropCheck && !player.hasPermission(Permissions.INVENTORY_DROP)) { cancelled = dropCheck.check(player, data, cc); } @@ -93,7 +93,7 @@ public class InventoryCheckListener implements Listener, EventManager { final InventoryConfig cc = InventoryCheck.getConfig(player.getConfigurationStore()); final InventoryData data = InventoryCheck.getData(player.getDataStore()); - if(cc.eatCheck && !player.hasPermission(instantEatCheck.getPermission())) { + if(cc.eatCheck && !player.hasPermission(Permissions.INVENTORY_INSTANTEAT)) { boolean cancelled = instantEatCheck.check(player, event, data, cc); event.setCancelled(cancelled); @@ -110,7 +110,7 @@ public class InventoryCheckListener implements Listener, EventManager { final NoCheatPlayer player = plugin.getPlayer((Player) event.getEntity()); final InventoryConfig cc = InventoryCheck.getConfig(player.getConfigurationStore()); - if(cc.bowCheck && !player.hasPermission(instantBowCheck.getPermission())) { + if(cc.bowCheck && !player.hasPermission(Permissions.INVENTORY_INSTANTBOW)) { final InventoryData data = InventoryCheck.getData(player.getDataStore()); boolean cancelled = instantBowCheck.check(player, event, data, cc); diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/FlyingCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/FlyingCheck.java index da0c1cb2..99f376c9 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/FlyingCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/FlyingCheck.java @@ -16,7 +16,7 @@ import cc.co.evenprime.bukkit.nocheat.data.Statistics.Id; public class FlyingCheck extends MovingCheck { public FlyingCheck(NoCheat plugin) { - super(plugin, "moving.flying", null); + super(plugin, "moving.flying"); } private static final double creativeSpeed = 0.60D; @@ -125,11 +125,6 @@ public class FlyingCheck extends MovingCheck { return newToLocation; } - @Override - public boolean isEnabled(MovingConfig moving) { - return moving.allowFlying && moving.runflyCheck; - } - public String getParameter(ParameterName wildcard, NoCheatPlayer player) { if(wildcard == ParameterName.VIOLATIONS) diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/MorePacketsCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/MorePacketsCheck.java index ede98ddd..0fcefd8c 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/MorePacketsCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/MorePacketsCheck.java @@ -4,7 +4,6 @@ import java.util.Locale; import cc.co.evenprime.bukkit.nocheat.NoCheat; import cc.co.evenprime.bukkit.nocheat.NoCheatPlayer; import cc.co.evenprime.bukkit.nocheat.actions.ParameterName; -import cc.co.evenprime.bukkit.nocheat.config.Permissions; import cc.co.evenprime.bukkit.nocheat.data.PreciseLocation; import cc.co.evenprime.bukkit.nocheat.data.Statistics.Id; @@ -23,7 +22,7 @@ public class MorePacketsCheck extends MovingCheck { private final static int packetsPerTimeframe = 22; public MorePacketsCheck(NoCheat plugin) { - super(plugin, "moving.morepackets", Permissions.MOVING_MOREPACKETS); + super(plugin, "moving.morepackets"); } /** @@ -97,11 +96,6 @@ public class MorePacketsCheck extends MovingCheck { return newToLocation; } - @Override - public boolean isEnabled(MovingConfig moving) { - return moving.morePacketsCheck; - } - @Override public String getParameter(ParameterName wildcard, NoCheatPlayer player) { diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/MovingCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/MovingCheck.java index 1ba7693e..0878a01b 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/MovingCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/MovingCheck.java @@ -13,20 +13,10 @@ public abstract class MovingCheck extends Check { private static final String id = "moving"; - public MovingCheck(NoCheat plugin, String name, String permission) { - super(plugin, id, name, permission); + public MovingCheck(NoCheat plugin, String name) { + super(plugin, id, name); } - /** - * Return a new destination location or null - * - * @param event - * @return - */ - public abstract PreciseLocation check(final NoCheatPlayer player, MovingData data, MovingConfig cc); - - public abstract boolean isEnabled(MovingConfig moving); - @Override public String getParameter(ParameterName wildcard, NoCheatPlayer player) { diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/MovingCheckListener.java b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/MovingCheckListener.java index f4e9e087..e2a5719f 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/MovingCheckListener.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/MovingCheckListener.java @@ -1,6 +1,5 @@ package cc.co.evenprime.bukkit.nocheat.checks.moving; -import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import org.bukkit.Location; @@ -23,7 +22,6 @@ import cc.co.evenprime.bukkit.nocheat.checks.CheckUtil; import cc.co.evenprime.bukkit.nocheat.config.ConfigurationCacheStore; import cc.co.evenprime.bukkit.nocheat.config.Permissions; import cc.co.evenprime.bukkit.nocheat.data.PreciseLocation; -import cc.co.evenprime.bukkit.nocheat.data.SimpleLocation; /** * The only place that listens to and modifies player_move events if necessary @@ -34,51 +32,87 @@ import cc.co.evenprime.bukkit.nocheat.data.SimpleLocation; */ public class MovingCheckListener implements Listener, EventManager { - private final List checks; - private final NoCheat plugin; + private final MorePacketsCheck morePacketsCheck; + private final FlyingCheck flyingCheck; + private final RunningCheck runningCheck; + + private final NoCheat plugin; public MovingCheckListener(NoCheat plugin) { - this.checks = new ArrayList(2); - - checks.add(new RunflyCheck(plugin)); - checks.add(new MorePacketsCheck(plugin)); + flyingCheck = new FlyingCheck(plugin); + runningCheck = new RunningCheck(plugin); + morePacketsCheck = new MorePacketsCheck(plugin); this.plugin = plugin; } + /** + * A workaround for players placing blocks below them getting pushed + * off the block by NoCheat. + * + * It essentially moves the "setbackpoint" to the top of the newly + * placed block, therefore tricking NoCheat into thinking the player + * was already on top of that block and should be allowed to stay + * there + * + * @param event + */ @EventHandler(priority = EventPriority.MONITOR) public void blockPlace(final BlockPlaceEvent event) { + + // Block wasn't placed, so we don't care if(event.isCancelled()) return; final NoCheatPlayer player = plugin.getPlayer(event.getPlayer()); - // Get the player-specific stored data that applies here - final MovingData data = MovingCheck.getData(player.getDataStore()); + final MovingConfig config = MovingCheck.getConfig(player.getConfigurationStore()); - final Block blockPlaced = event.getBlockPlaced(); - - if(blockPlaced == null || !data.runflySetBackPoint.isSet()) { + // If the player is allowed to fly anyway, the workaround is not needed + // It's kind of expensive (looking up block types) therefore it makes + // sense to avoid it + if(config.allowFlying || !config.runflyCheck || player.hasPermission(Permissions.MOVING_FLYING) || player.hasPermission(Permissions.MOVING_RUNFLY)) { return; } - final SimpleLocation lblock = new SimpleLocation(); - lblock.set(blockPlaced); - final SimpleLocation lplayer = new SimpleLocation(); - lplayer.setLocation(player.getPlayer().getLocation()); + // Get the player-specific stored data that applies here + final MovingData data = MovingCheck.getData(player.getDataStore()); - if(Math.abs(lplayer.x - lblock.x) <= 1 && Math.abs(lplayer.z - lblock.z) <= 1 && lplayer.y - lblock.y >= 0 && lplayer.y - lblock.y <= 2) { + final Block block = event.getBlockPlaced(); - final int type = CheckUtil.getType(blockPlaced.getTypeId()); + if(block == null || !data.runflySetBackPoint.isSet()) { + return; + } + + // Keep some results of "expensive calls + final Location l = player.getPlayer().getLocation(); + final int playerX = l.getBlockX(); + final int playerY = l.getBlockY(); + final int playerZ = l.getBlockZ(); + final int blockY = block.getY(); + + // Was the block below the player? + if(Math.abs(playerX - block.getX()) <= 1 && Math.abs(playerZ - block.getZ()) <= 1 && playerY - blockY >= 0 && playerY - blockY <= 2) { + // yes + final int type = CheckUtil.getType(block.getTypeId()); if(CheckUtil.isSolid(type) || CheckUtil.isLiquid(type)) { - if(lblock.y + 1 >= data.runflySetBackPoint.y) { - data.runflySetBackPoint.y = (lblock.y + 1); + if(blockY + 1 >= data.runflySetBackPoint.y) { + data.runflySetBackPoint.y = (blockY + 1); data.jumpPhase = 0; } } } } + /** + * If a player gets teleported, it may have two reasons. Either + * it was NoCheat or another plugin. If it was NoCheat, the target + * location should match the "data.teleportTo" value. + * + * On teleports, reset some movement related data + * + * @param event + */ @EventHandler(priority = EventPriority.HIGHEST) public void teleport(final PlayerTeleportEvent event) { @@ -86,20 +120,31 @@ public class MovingCheckListener implements Listener, EventManager { final MovingData data = MovingCheck.getData(player.getDataStore()); // If it was a teleport initialized by NoCheat, do it anyway + // even if another plugin said "no" if(data.teleportTo.isSet() && data.teleportTo.equals(event.getTo())) { event.setCancelled(false); } else { - // Only if it wasn't NoCheat, drop data from morepackets check + // Only if it wasn't NoCheat, drop data from morepackets check. + // If it was NoCheat, we don't want players to exploit the + // runfly check teleporting to get rid of the "morepackets" + // data. data.clearMorePacketsData(); } - // Always forget runfly specific data + // Always drop data from runfly check, as it always loses its validity + // after teleports. Always! data.teleportTo.reset(); data.clearRunFlyData(); return; } + /** + * Just for security, if a player switches between worlds, reset the + * runfly and morepackets checks. + * + * @param event + */ @EventHandler(priority = EventPriority.MONITOR) public void worldChange(final PlayerChangedWorldEvent event) { // Maybe this helps with people teleporting through multiverse portals having problems? @@ -109,6 +154,12 @@ public class MovingCheckListener implements Listener, EventManager { data.clearMorePacketsData(); } + /** + * When a player uses a portal, all information related to the + * moving checks becomes invalid. + * + * @param event + */ @EventHandler(priority = EventPriority.MONITOR) public void portal(final PlayerPortalEvent event) { final MovingData data = MovingCheck.getData(plugin.getPlayer(event.getPlayer()).getDataStore()); @@ -116,6 +167,12 @@ public class MovingCheckListener implements Listener, EventManager { data.clearRunFlyData(); } + /** + * When a player respawns, all information related to the + * moving checks becomes invalid. + * + * @param event + */ @EventHandler(priority = EventPriority.MONITOR) public void respawn(final PlayerRespawnEvent event) { final MovingData data = MovingCheck.getData(plugin.getPlayer(event.getPlayer()).getDataStore()); @@ -123,63 +180,75 @@ public class MovingCheckListener implements Listener, EventManager { data.clearRunFlyData(); } + /** + * When a player moves, he will be checked for various + * suspicious behaviour. + * + * @param event + */ @EventHandler(priority = EventPriority.LOWEST) public void move(final PlayerMoveEvent event) { - if(event.isCancelled()) + if(event.isCancelled() || event.getPlayer().isInsideVehicle() || event.getPlayer().isDead()) return; - // Get the world-specific configuration that applies here - final NoCheatPlayer player = plugin.getPlayer(event.getPlayer()); - // Not interested at all in players in vehicles or dead - if(event.getPlayer().isInsideVehicle() || player.isDead()) { - return; - } + final NoCheatPlayer player = plugin.getPlayer(event.getPlayer()); final MovingConfig cc = MovingCheck.getConfig(player.getConfigurationStore()); final MovingData data = MovingCheck.getData(player.getDataStore()); - // Various calculations related to velocity estimates - updateVelocities(data); + // Advance various counters and values that change per movement + // tick. They are needed to decide on how fast a player may + // move. + tickVelocities(data); - if(!cc.check || player.hasPermission(Permissions.MOVING)) { + // Remember locations + data.from.set(event.getFrom()); + final Location to = event.getTo(); + data.to.set(to); + + PreciseLocation newTo = null; + + /** RUNFLY CHECK SECTION **/ + // If the player isn't handled by runfly checks + if(!cc.runflyCheck || player.hasPermission(Permissions.MOVING_RUNFLY)) { // Just because he is allowed now, doesn't mean he will always // be. So forget data about the player related to moving data.clearRunFlyData(); + } else if(cc.allowFlying || (player.isCreative() && cc.identifyCreativeMode) || player.hasPermission(Permissions.MOVING_FLYING)) { + // Only do the limited flying check + newTo = flyingCheck.check(player, data, cc); + } else { + // Go for the full treatment + newTo = runningCheck.check(player, data, cc); + } + + /** MOREPACKETS CHECK SECTION **/ + if(!cc.morePacketsCheck || player.hasPermission(Permissions.MOVING_MOREPACKETS)) { data.clearMorePacketsData(); - return; + } else if(newTo != null) { + newTo = morePacketsCheck.check(player, data, cc); } - // Get some data that's needed from this event, to avoid passing the - // event itself on to the checks (and risk to - // accidentally modifying the event there) - - final Location to = event.getTo(); - - data.from.set(event.getFrom()); - data.to.set(to); - - // This variable will have the modified data of the event (new - // "to"-location) - PreciseLocation newTo = null; - - for(MovingCheck check : checks) { - if(newTo == null && check.isEnabled(cc) && !player.hasPermission(check.getPermission())) { - newTo = check.check(player, data, cc); - } - } - - // Did the check(s) decide we need a new "to"-location? + // Did one of the check(s) decide we need a new "to"-location? if(newTo != null) { // Compose a new location based on coordinates of "newTo" and // viewing direction of "event.getTo()" event.setTo(new Location(player.getPlayer().getWorld(), newTo.x, newTo.y, newTo.z, to.getYaw(), to.getPitch())); + // remember where we send the player to data.teleportTo.set(newTo); } } - private void updateVelocities(MovingData data) { + /** + * Just try to estimate velocities over time + * Not very precise, but works good enough most + * of the time. + * + * @param data + */ + private void tickVelocities(MovingData data) { /******** DO GENERAL DATA MODIFICATIONS ONCE FOR EACH EVENT *****/ if(data.horizVelocityCounter > 0) { @@ -200,10 +269,18 @@ public class MovingCheckListener implements Listener, EventManager { } } + /** + * Player got a velocity packet. The server can't keep track + * of actual velocity values (by design), so we have to try + * and do that ourselves. + * + * @param event + */ @EventHandler(priority = EventPriority.MONITOR) public void velocity(final PlayerVelocityEvent event) { if(event.isCancelled()) return; + final MovingData data = MovingCheck.getData(plugin.getPlayer(event.getPlayer()).getDataStore()); final Vector v = event.getVelocity(); @@ -228,22 +305,20 @@ public class MovingCheckListener implements Listener, EventManager { MovingConfig m = MovingCheck.getConfig(cc); - if(m.check) { - if(m.runflyCheck) { + if(m.runflyCheck) { - if(!m.allowFlying) { - s.add("moving.runfly"); - if(m.sneakingCheck) - s.add("moving.sneaking"); - if(m.nofallCheck) - s.add("moving.nofall"); - } else - s.add("moving.flying"); + if(!m.allowFlying) { + s.add("moving.runfly"); + if(m.sneakingCheck) + s.add("moving.sneaking"); + if(m.nofallCheck) + s.add("moving.nofall"); + } else + s.add("moving.flying"); - } - if(m.morePacketsCheck) - s.add("moving.morepackets"); } + if(m.morePacketsCheck) + s.add("moving.morepackets"); return s; } diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/MovingConfig.java b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/MovingConfig.java index 6cf61144..5d32dd32 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/MovingConfig.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/MovingConfig.java @@ -12,8 +12,6 @@ import cc.co.evenprime.bukkit.nocheat.config.NoCheatConfiguration; */ public class MovingConfig implements ConfigItem { - public final boolean check; - public final boolean runflyCheck; public final boolean identifyCreativeMode; public final double walkingSpeedLimit; @@ -70,8 +68,5 @@ public class MovingConfig implements ConfigItem { morePacketsCheck = data.getBoolean(ConfPaths.MOVING_MOREPACKETS_CHECK); morePacketsActions = data.getActionList(ConfPaths.MOVING_MOREPACKETS_ACTIONS); - - check = runflyCheck || morePacketsCheck; - } } diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/MovingData.java b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/MovingData.java index 7fa26350..021885a3 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/MovingData.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/MovingData.java @@ -15,7 +15,7 @@ public class MovingData implements DataItem { public int jumpPhase; public double lastJumpAmplifier; - public int onIce = 0; + public int onIce; public final PreciseLocation runflySetBackPoint = new PreciseLocation(); diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/NoFallCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/NoFallCheck.java index 16df8c77..6a823de0 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/NoFallCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/NoFallCheck.java @@ -4,8 +4,6 @@ import java.util.Locale; import cc.co.evenprime.bukkit.nocheat.NoCheat; import cc.co.evenprime.bukkit.nocheat.NoCheatPlayer; import cc.co.evenprime.bukkit.nocheat.actions.ParameterName; -import cc.co.evenprime.bukkit.nocheat.config.Permissions; -import cc.co.evenprime.bukkit.nocheat.data.PreciseLocation; import cc.co.evenprime.bukkit.nocheat.data.Statistics.Id; /** @@ -16,21 +14,21 @@ import cc.co.evenprime.bukkit.nocheat.data.Statistics.Id; public class NoFallCheck extends MovingCheck { public NoFallCheck(NoCheat plugin) { - super(plugin, "moving.nofall", Permissions.MOVING_NOFALL); + super(plugin, "moving.nofall"); } /** * Calculate if and how much the player "failed" this check. * */ - public PreciseLocation check(NoCheatPlayer player, MovingData data, MovingConfig cc) { + public void check(NoCheatPlayer player, MovingData data, MovingConfig cc) { // If the player is serverside in creative mode, we have to stop here to // avoid hurting him when he switches back to "normal" mode if(player.isCreative()) { data.fallDistance = 0F; data.lastAddedFallDistance = 0F; - return null; + return; } // This check is pretty much always a step behind for technical reasons. @@ -110,12 +108,7 @@ public class NoFallCheck extends MovingCheck { // Reduce falldamage violation level data.nofallVL *= 0.99D; - return null; - } - - @Override - public boolean isEnabled(MovingConfig moving) { - return moving.nofallCheck; + return; } @Override diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/RunflyCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/RunflyCheck.java deleted file mode 100644 index fd9091cf..00000000 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/RunflyCheck.java +++ /dev/null @@ -1,48 +0,0 @@ -package cc.co.evenprime.bukkit.nocheat.checks.moving; - -import cc.co.evenprime.bukkit.nocheat.NoCheat; -import cc.co.evenprime.bukkit.nocheat.NoCheatPlayer; -import cc.co.evenprime.bukkit.nocheat.config.Permissions; -import cc.co.evenprime.bukkit.nocheat.data.PreciseLocation; - -public class RunflyCheck extends MovingCheck { - - private final FlyingCheck flyingCheck; - private final RunningCheck runningCheck; - - public RunflyCheck(NoCheat plugin) { - // Permission field intentionally left blank here - // We check in the actual "check" method, because - // we have to do something beside skipping the test - super(plugin, "moving.runfly", null); - - flyingCheck = new FlyingCheck(plugin); - runningCheck = new RunningCheck(plugin); - } - - @Override - public PreciseLocation check(NoCheatPlayer player, MovingData data, MovingConfig cc) { - - if(player.hasPermission(Permissions.MOVING_RUNFLY)) { - // If the player doesn't get checked for movement - // reset his critical data - data.clearRunFlyData(); - return null; - } - final boolean flyAllowed = cc.allowFlying || player.hasPermission(Permissions.MOVING_FLYING) || (player.isCreative() && cc.identifyCreativeMode); - - /********************* EXECUTE THE FLY/JUMP/RUNNING CHECK ********************/ - // If the player is not allowed to fly and not allowed to run - - if(flyAllowed) { - return flyingCheck.check(player, data, cc); - } else { - return runningCheck.check(player, data, cc); - } - } - - @Override - public boolean isEnabled(MovingConfig moving) { - return moving.runflyCheck; - } -} diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/RunningCheck.java b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/RunningCheck.java index 7eac8e6b..50ab7390 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/moving/RunningCheck.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/moving/RunningCheck.java @@ -30,7 +30,7 @@ public class RunningCheck extends MovingCheck { public RunningCheck(NoCheat plugin) { - super(plugin, "moving.running", null); + super(plugin, "moving.running"); this.noFallCheck = new NoFallCheck(plugin); } @@ -235,10 +235,6 @@ public class RunningCheck extends MovingCheck { } @Override - public boolean isEnabled(MovingConfig moving) { - return moving.runflyCheck && !moving.allowFlying; - } - public String getParameter(ParameterName wildcard, NoCheatPlayer player) { if(wildcard == ParameterName.CHECK)