Enables extended protection for explosion and piston events
This commit is contained in:
parent
69d182ec10
commit
0283c917e7
@ -16,6 +16,8 @@ import org.bukkit.event.Listener;
|
|||||||
import org.bukkit.event.block.BlockBreakEvent;
|
import org.bukkit.event.block.BlockBreakEvent;
|
||||||
import org.bukkit.event.block.BlockExplodeEvent;
|
import org.bukkit.event.block.BlockExplodeEvent;
|
||||||
import org.bukkit.event.block.BlockPhysicsEvent;
|
import org.bukkit.event.block.BlockPhysicsEvent;
|
||||||
|
import org.bukkit.event.block.BlockPistonExtendEvent;
|
||||||
|
import org.bukkit.event.block.BlockPistonRetractEvent;
|
||||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -36,14 +38,24 @@ public class BlockListener implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPistonExtend(BlockPistonExtendEvent event) {
|
||||||
|
preventDestruction(event.getBlocks(), event);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPistonRetract(BlockPistonRetractEvent event) {
|
||||||
|
preventDestruction(event.getBlocks(), event);
|
||||||
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onBlockExplode(BlockExplodeEvent event) {
|
public void onBlockExplode(BlockExplodeEvent event) {
|
||||||
preventExplosion(event.blockList(), event);
|
preventDestruction(event.blockList(), event);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onEntityExplode(EntityExplodeEvent event) {
|
public void onEntityExplode(EntityExplodeEvent event) {
|
||||||
preventExplosion(event.blockList(), event);
|
preventDestruction(event.blockList(), event);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
@ -67,35 +79,15 @@ 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
|
* Protects signs on falling blocks in the given direction
|
||||||
*
|
*
|
||||||
* @param event <p>The triggered block break event</p>
|
* @param event <p>The triggered event</p>
|
||||||
* @param block <p>The broken block</p>
|
* @param block <p>The broken block</p>
|
||||||
* @param player <p>The player breaking the block</p>
|
* @param player <p>The player breaking the block</p>
|
||||||
* @param direction <p>The direction to check for affected blocks</p>
|
* @param direction <p>The direction to check for affected blocks</p>
|
||||||
*/
|
*/
|
||||||
private void protectSignsInDirection(BlockBreakEvent event, Block block, Player player, BlockFace direction) {
|
private void protectSignsInDirection(Cancellable event, Block block, Player player, BlockFace direction) {
|
||||||
Block directionBlock = block.getRelative(direction);
|
Block directionBlock = block.getRelative(direction);
|
||||||
while ((direction == BlockFace.DOWN && directionBlock.getBlockData().getMaterial() ==
|
while ((direction == BlockFace.DOWN && directionBlock.getBlockData().getMaterial() ==
|
||||||
Material.POINTED_DRIPSTONE) || (direction == BlockFace.UP &&
|
Material.POINTED_DRIPSTONE) || (direction == BlockFace.UP &&
|
||||||
@ -108,14 +100,37 @@ public class BlockListener implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prevents an event from destroying permission signs
|
||||||
|
*
|
||||||
|
* @param blocks <p>The blocks affected by the event</p>
|
||||||
|
* @param event <p>The event to cancel if a permission sign is found</p>
|
||||||
|
*/
|
||||||
|
private void preventDestruction(List<Block> blocks, Cancellable event) {
|
||||||
|
for (Block block : blocks) {
|
||||||
|
protectBlockIfPermissionSign(event, block, null);
|
||||||
|
if (event.isCancelled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (extensiveSignProtectionEnabled()) {
|
||||||
|
protectSignsInDirection(event, block, null, BlockFace.UP);
|
||||||
|
if (event.isCancelled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
protectSignsInDirection(event, block, null, BlockFace.DOWN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Protects the given sign
|
* Protects the given sign
|
||||||
*
|
*
|
||||||
* @param event <p>The triggered block break event</p>
|
* @param event <p>The triggered event</p>
|
||||||
* @param block <p>The block to check if it's a sign</p>
|
* @param block <p>The block to check if it's a sign</p>
|
||||||
* @param player <p>The player breaking the block</p>
|
* @param player <p>The player breaking the block</p>
|
||||||
*/
|
*/
|
||||||
private void protectBlockIfPermissionSign(BlockBreakEvent event, Block block, Player player) {
|
private void protectBlockIfPermissionSign(Cancellable event, Block block, Player player) {
|
||||||
//Protect the permission sign itself
|
//Protect the permission sign itself
|
||||||
Material material = block.getBlockData().getMaterial();
|
Material material = block.getBlockData().getMaterial();
|
||||||
if (Tag.SIGNS.isTagged(material)) {
|
if (Tag.SIGNS.isTagged(material)) {
|
||||||
@ -131,11 +146,11 @@ public class BlockListener implements Listener {
|
|||||||
/**
|
/**
|
||||||
* Looks for permission signs adjacent to the current block
|
* Looks for permission signs adjacent to the current block
|
||||||
*
|
*
|
||||||
* @param event <p>The triggered block break event</p>
|
* @param event <p>The triggered event</p>
|
||||||
* @param block <p>The block to check if it's a sign</p>
|
* @param block <p>The block to check if it's a sign</p>
|
||||||
* @param player <p>The player breaking the block</p>
|
* @param player <p>The player breaking the block</p>
|
||||||
*/
|
*/
|
||||||
private void lookForAdjacentPermissionSigns(BlockBreakEvent event, Block block, Player player) {
|
private void lookForAdjacentPermissionSigns(Cancellable event, Block block, Player player) {
|
||||||
Block aboveBlock = block.getRelative(BlockFace.UP);
|
Block aboveBlock = block.getRelative(BlockFace.UP);
|
||||||
if (Tag.STANDING_SIGNS.isTagged(aboveBlock.getBlockData().getMaterial())) {
|
if (Tag.STANDING_SIGNS.isTagged(aboveBlock.getBlockData().getMaterial())) {
|
||||||
checkIfBlockIsPermissionSign(aboveBlock, player, event);
|
checkIfBlockIsPermissionSign(aboveBlock, player, event);
|
||||||
@ -162,14 +177,18 @@ public class BlockListener implements Listener {
|
|||||||
*
|
*
|
||||||
* @param block <p>The block to check</p>
|
* @param block <p>The block to check</p>
|
||||||
* @param player <p>The player that caused the event</p>
|
* @param player <p>The player that caused the event</p>
|
||||||
* @param event <p>The triggered block break event</p>
|
* @param event <p>The triggered event</p>
|
||||||
*/
|
*/
|
||||||
private void checkIfBlockIsPermissionSign(Block block, Player player, BlockBreakEvent event) {
|
private void checkIfBlockIsPermissionSign(Block block, Player player, Cancellable event) {
|
||||||
Sign sign = (Sign) block.getState();
|
Sign sign = (Sign) block.getState();
|
||||||
boolean registered = SignManager.getSign(sign.getLocation()) != null;
|
boolean registered = SignManager.getSign(sign.getLocation()) != null;
|
||||||
if (!registered) {
|
if (!registered) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (player == null) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (!player.hasPermission("permissionsigns.admin.create")) {
|
if (!player.hasPermission("permissionsigns.admin.create")) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
player.sendMessage(StringFormatter.getTranslatedErrorMessage(TranslatableMessage.PERMISSION_SIGN_DESTROY_DENY));
|
player.sendMessage(StringFormatter.getTranslatedErrorMessage(TranslatableMessage.PERMISSION_SIGN_DESTROY_DENY));
|
||||||
|
Loading…
Reference in New Issue
Block a user