diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/BlockBreakData.java b/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/BlockBreakData.java index 51263466..3b7f125e 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/BlockBreakData.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/BlockBreakData.java @@ -30,6 +30,7 @@ public class BlockBreakData implements DataItem { public double reachDistance; public boolean armswung = true; + public final SimpleLocation lastDamagedBlock = new SimpleLocation(); @Override public void clearCriticalData() { diff --git a/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/BlockBreakEventManager.java b/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/BlockBreakEventManager.java index d709d5cf..53adc50b 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/BlockBreakEventManager.java +++ b/src/cc/co/evenprime/bukkit/nocheat/checks/blockbreak/BlockBreakEventManager.java @@ -57,6 +57,14 @@ public class BlockBreakEventManager extends EventManagerImpl { data.brokenBlockLocation.set(event.getBlock()); + // Only if the block got damaged before, do the check(s) + if(!data.brokenBlockLocation.equals(data.lastDamagedBlock)) { + // Something caused a blockbreak event that's not from the player + // Don't check it at all + data.lastDamagedBlock.reset(); + return; + } + for(BlockBreakCheck check : checks) { // If it should be executed, do it if(!cancelled && check.isEnabled(cc) && !player.hasPermission(check.getPermission())) { @@ -71,13 +79,20 @@ public class BlockBreakEventManager extends EventManagerImpl { @Override protected void handleBlockDamageEvent(final BlockDamageEvent event, final Priority priority) { - // Only interested in insta-break events here - if(!event.getInstaBreak()) - return; + NoCheatPlayer player = plugin.getPlayer(event.getPlayer()); + BlockBreakData data = BlockBreakCheck.getData(player.getDataStore()); + + // Only interested in insta-break events here + if(event.getInstaBreak()) { + // Remember this location. We ignore block breaks in the block-break + // direction check that are insta-breaks + data.instaBrokenBlockLocation.set(event.getBlock()); + } + + // Remember this location. Only blockbreakevents for this specific block + // will be handled at all + data.lastDamagedBlock.set(event.getBlock()); - // Remember this location. We ignore block breaks in the block-break - // direction check that are insta-breaks - BlockBreakCheck.getData(plugin.getPlayer(event.getPlayer()).getDataStore()).instaBrokenBlockLocation.set(event.getBlock()); } @Override diff --git a/src/cc/co/evenprime/bukkit/nocheat/data/SimpleLocation.java b/src/cc/co/evenprime/bukkit/nocheat/data/SimpleLocation.java index 71cec858..c481be60 100644 --- a/src/cc/co/evenprime/bukkit/nocheat/data/SimpleLocation.java +++ b/src/cc/co/evenprime/bukkit/nocheat/data/SimpleLocation.java @@ -23,6 +23,15 @@ public final class SimpleLocation { return block.getX() == x && block.getY() == y && block.getZ() == z; } + public final boolean equals(SimpleLocation simpleLocation) { + if(!isSet() && !simpleLocation.isSet()) + return true; + else if(!isSet() || !simpleLocation.isSet()) + return false; + + return simpleLocation.x == x && simpleLocation.y == y && simpleLocation.z == z; + } + public final void set(Block block) { x = block.getX(); y = block.getY();