From d8da89703b7deb6b85de7d0ad7225548575e2e19 Mon Sep 17 00:00:00 2001 From: sk89q Date: Fri, 22 Aug 2014 11:27:23 -0700 Subject: [PATCH] Handle the TNT flag better in the new system. Now the build flag works in tandem with the TNT flag. --- .../sk89q/worldguard/bukkit/cause/Cause.java | 22 +++++++++++++++++++ .../bukkit/listener/RegionFlagsListener.java | 9 -------- .../listener/RegionProtectionListener.java | 11 +++++++++- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/sk89q/worldguard/bukkit/cause/Cause.java b/src/main/java/com/sk89q/worldguard/bukkit/cause/Cause.java index 15cb9c60..441a7707 100644 --- a/src/main/java/com/sk89q/worldguard/bukkit/cause/Cause.java +++ b/src/main/java/com/sk89q/worldguard/bukkit/cause/Cause.java @@ -23,6 +23,7 @@ import com.sk89q.worldguard.bukkit.util.WGMetadata; import org.bukkit.block.Block; import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; import org.bukkit.entity.TNTPrimed; @@ -114,6 +115,27 @@ public Block getFirstBlock() { return null; } + /** + * Find the first type matching one in the given array. + * + * @param types an array of types + * @return a found type or null + */ + @Nullable + public EntityType find(EntityType... types) { + for (Object object : causes) { + if (object instanceof Entity) { + for (EntityType type : types) { + if (((Entity) object).getType() == type) { + return type; + } + } + } + } + + return null; + } + @Override public String toString() { return Joiner.on(" | ").join(causes); diff --git a/src/main/java/com/sk89q/worldguard/bukkit/listener/RegionFlagsListener.java b/src/main/java/com/sk89q/worldguard/bukkit/listener/RegionFlagsListener.java index 3f624937..dd1c6a1e 100644 --- a/src/main/java/com/sk89q/worldguard/bukkit/listener/RegionFlagsListener.java +++ b/src/main/java/com/sk89q/worldguard/bukkit/listener/RegionFlagsListener.java @@ -26,7 +26,6 @@ import com.sk89q.worldguard.bukkit.event.block.BreakBlockEvent; import com.sk89q.worldguard.bukkit.event.block.PlaceBlockEvent; import com.sk89q.worldguard.bukkit.event.entity.SpawnEntityEvent; -import com.sk89q.worldguard.bukkit.util.Entities; import com.sk89q.worldguard.bukkit.util.Materials; import com.sk89q.worldguard.protection.flags.DefaultFlag; import com.sk89q.worldguard.protection.flags.StateFlag; @@ -106,14 +105,6 @@ public void onBreakBlock(final BreakBlockEvent event) { event.filter(testState(query, DefaultFlag.ENDERDRAGON_BLOCK_DAMAGE), config.explosionFlagCancellation); } - // ================================================================ - // TNT flag - // ================================================================ - - if (Entities.isTNTBased(entity)) { // TNT + explosive TNT carts - event.filter(testState(query, DefaultFlag.TNT), config.explosionFlagCancellation); - } - } } diff --git a/src/main/java/com/sk89q/worldguard/bukkit/listener/RegionProtectionListener.java b/src/main/java/com/sk89q/worldguard/bukkit/listener/RegionProtectionListener.java index ad5c7b0c..b0956662 100644 --- a/src/main/java/com/sk89q/worldguard/bukkit/listener/RegionProtectionListener.java +++ b/src/main/java/com/sk89q/worldguard/bukkit/listener/RegionProtectionListener.java @@ -146,7 +146,16 @@ public void onBreakBlock(final BreakBlockEvent event) { event.filter(new Predicate() { @Override public boolean apply(Location target) { - boolean canBreak = query.testBuild(target, associable); + boolean canBreak; + + /* TNT */ + if (event.getCause().find(EntityType.PRIMED_TNT, EntityType.PRIMED_TNT) != null) { + canBreak = query.testBuild(target, associable, DefaultFlag.TNT); + + /* Everything else */ + } else { + canBreak = query.testBuild(target, associable); + } if (!canBreak) { tellErrorMessage(event.getCause(), target);