Cancels explosions near permission signs

This commit is contained in:
Kristian Knarvik 2022-01-22 16:15:59 +01:00
parent 0e8f2bd066
commit 69d182ec10

View File

@ -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 <p>The blocks affected by the explosion</p>
* @param event <p>The explosion event to cancel if a permission sign is found</p>
*/
private void preventExplosion(List<Block> 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
*