From 8142e1c28fc11a4bd1878d36bc50a7be0eb984c7 Mon Sep 17 00:00:00 2001 From: Brettflan Date: Tue, 17 Jan 2012 01:57:16 -0600 Subject: [PATCH] improved TNT exploit prevention Now, canceled exploit attempts don't injure players or mobs as if the TNT had successfully exploded, and if it's the case of an existing TNT block which a redstone torch is attempted to be placed next to, it no longer drops a free TNT item. In that case, the existing TNT block is still destroyed itself, but... oh well, it's close enough to perfect. --- src/com/massivecraft/factions/P.java | 1 + .../listeners/FactionsEntityListener.java | 78 ++++++++++--------- 2 files changed, 44 insertions(+), 35 deletions(-) diff --git a/src/com/massivecraft/factions/P.java b/src/com/massivecraft/factions/P.java index 9e1781b9..2b28d16f 100644 --- a/src/com/massivecraft/factions/P.java +++ b/src/com/massivecraft/factions/P.java @@ -132,6 +132,7 @@ public class P extends MPlugin this.registerEvent(Event.Type.ENTITY_TARGET, this.entityListener, Event.Priority.Normal); this.registerEvent(Event.Type.PAINTING_BREAK, this.entityListener, Event.Priority.Normal); this.registerEvent(Event.Type.PAINTING_PLACE, this.entityListener, Event.Priority.Normal); + this.registerEvent(Event.Type.EXPLOSION_PRIME, this.entityListener, Event.Priority.Normal); // Block Events this.registerEvent(Event.Type.BLOCK_BREAK, this.blockListener, Event.Priority.Normal); diff --git a/src/com/massivecraft/factions/listeners/FactionsEntityListener.java b/src/com/massivecraft/factions/listeners/FactionsEntityListener.java index d744ed2c..ed1b9dd9 100644 --- a/src/com/massivecraft/factions/listeners/FactionsEntityListener.java +++ b/src/com/massivecraft/factions/listeners/FactionsEntityListener.java @@ -20,6 +20,7 @@ import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntityListener; import org.bukkit.event.entity.EntityTargetEvent; +import org.bukkit.event.entity.ExplosionPrimeEvent; import org.bukkit.event.painting.PaintingBreakByEntityEvent; import org.bukkit.event.painting.PaintingBreakEvent; import org.bukkit.event.painting.PaintingPlaceEvent; @@ -92,46 +93,53 @@ public class FactionsEntityListener extends EntityListener event.setCancelled(true); }*/ } - + + @Override + public void onExplosionPrime(ExplosionPrimeEvent event) + { + if (event.isCancelled()) return; + if (! (event.getEntity() instanceof TNTPrimed)) return; + if (exploitExplosions.isEmpty()) return; + + // make sure this isn't a TNT explosion exploit attempt + + int locX = event.getEntity().getLocation().getBlockX(); + int locZ = event.getEntity().getLocation().getBlockZ(); + + for (int i = exploitExplosions.size() - 1; i >= 0; i--) + { + PotentialExplosionExploit ex = exploitExplosions.get(i); + + // remove anything from the list older than 10 seconds (TNT takes 4 seconds to trigger; provide some leeway) + if (ex.timeMillis + 10000 < System.currentTimeMillis()) + { + exploitExplosions.remove(i); + continue; + } + + int absX = Math.abs(ex.X - locX); + int absZ = Math.abs(ex.Z - locZ); + if (absX < 5 && absZ < 5) + { // it sure looks like an exploit attempt + // let's tattle on him to everyone + String msg = "NOTICE: Player \""+ex.playerName+"\" attempted to exploit a TNT bug in the territory of \""+ex.faction.getTag()+"\" at "+ex.X+","+ex.Z+" (X,Z) using "+ex.item.name(); + P.p.log(Level.WARNING, msg); + for (FPlayer fplayer : FPlayers.i.getOnline()) + { + fplayer.sendMessage(msg); + } + event.setCancelled(true); + exploitExplosions.remove(i); + return; + } + } + } + @Override public void onEntityExplode(EntityExplodeEvent event) { if ( event.isCancelled()) return; - if (event.getEntity() instanceof TNTPrimed && exploitExplosions.size() > 0) - { // make sure this isn't a TNT explosion exploit attempt - int locX = event.getLocation().getBlockX(); - int locZ = event.getLocation().getBlockZ(); - - for (int i = exploitExplosions.size() - 1; i >= 0; i--) - { - PotentialExplosionExploit ex = exploitExplosions.get(i); - - // remove anything from the list older than 10 seconds (TNT takes 4 seconds to trigger; provide some leeway) - if (ex.timeMillis + 10000 < System.currentTimeMillis()) - { - exploitExplosions.remove(i); - continue; - } - - int absX = Math.abs(ex.X - locX); - int absZ = Math.abs(ex.Z - locZ); - if (absX < 5 && absZ < 5) - { // it sure looks like an exploit attempt - // let's tattle on him to everyone - String msg = "NOTICE: Player \""+ex.playerName+"\" attempted to exploit a TNT bug in the territory of \""+ex.faction.getTag()+"\" at "+ex.X+","+ex.Z+" (X,Z) using "+ex.item.name(); - P.p.log(Level.WARNING, msg); - for (FPlayer fplayer : FPlayers.i.getOnline()) - { - fplayer.sendMessage(msg); - } - event.setCancelled(true); - exploitExplosions.remove(i); - return; - } - } - } - for (Block block : event.blockList()) { Faction faction = Board.getFactionAt(new FLocation(block));