From 69d182ec102786196f7ef64dede4d366c3723310 Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Sat, 22 Jan 2022 16:15:59 +0100 Subject: [PATCH] Cancels explosions near permission signs --- .../listener/BlockListener.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/main/java/net/knarcraft/permissionsigns/listener/BlockListener.java b/src/main/java/net/knarcraft/permissionsigns/listener/BlockListener.java index fd9bf91..1445a90 100644 --- a/src/main/java/net/knarcraft/permissionsigns/listener/BlockListener.java +++ b/src/main/java/net/knarcraft/permissionsigns/listener/BlockListener.java @@ -10,10 +10,13 @@ import org.bukkit.block.BlockFace; import org.bukkit.block.Sign; import org.bukkit.block.data.type.WallSign; import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockExplodeEvent; import org.bukkit.event.block.BlockPhysicsEvent; +import org.bukkit.event.entity.EntityExplodeEvent; import java.util.ArrayList; import java.util.List; @@ -33,6 +36,16 @@ public class BlockListener implements Listener { } } + @EventHandler + public void onBlockExplode(BlockExplodeEvent event) { + preventExplosion(event.blockList(), event); + } + + @EventHandler + public void onEntityExplode(EntityExplodeEvent event) { + preventExplosion(event.blockList(), event); + } + @EventHandler public void onBlockBreak(BlockBreakEvent event) { Block block = event.getBlock(); @@ -54,6 +67,26 @@ public class BlockListener implements Listener { } } + /** + * Prevents explosions from destroying permission signs + * + * @param blocks

The blocks affected by the explosion

+ * @param event

The explosion event to cancel if a permission sign is found

+ */ + private void preventExplosion(List blocks, Cancellable event) { + for (Block block : blocks) { + if (!Tag.SIGNS.isTagged(block.getBlockData().getMaterial())) { + continue; + } + Sign sign = (Sign) block.getState(); + boolean registered = SignManager.getSign(sign.getLocation()) != null; + if (registered) { + event.setCancelled(true); + break; + } + } + } + /** * Protects signs on falling blocks in the given direction *