From ecaecc5e62f69a74763289d73b619b21bbd051de Mon Sep 17 00:00:00 2001 From: snowleo Date: Fri, 1 Jul 2011 01:33:35 +0200 Subject: [PATCH] Fix Protection signs --- .../essentials/signs/SignProtection.java | 111 +++++++++--------- 1 file changed, 55 insertions(+), 56 deletions(-) diff --git a/Essentials/src/com/earth2me/essentials/signs/SignProtection.java b/Essentials/src/com/earth2me/essentials/signs/SignProtection.java index 8e0f4461f..555bb0114 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignProtection.java +++ b/Essentials/src/com/earth2me/essentials/signs/SignProtection.java @@ -21,7 +21,7 @@ import org.bukkit.inventory.ItemStack; public class SignProtection extends EssentialsSign { private final transient Set protectedBlocks = EnumSet.noneOf(Material.class); - + public SignProtection() { super("Protection"); @@ -30,25 +30,27 @@ public class SignProtection extends EssentialsSign protectedBlocks.add(Material.FURNACE); protectedBlocks.add(Material.DISPENSER); } - + @Override protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException { sign.setLine(3, "§4" + username); - if (hasAdjacentBlock(sign.getBlock()) && isBlockProtected(sign.getBlock(), player, username) != SignProtectionState.NOT_ALLOWED) + if (hasAdjacentBlock(sign.getBlock()) && isBlockProtected(sign.getBlock(), player, username, true) != SignProtectionState.NOT_ALLOWED) { sign.setLine(3, "§1" + username); + return true; } - return true; + player.sendMessage("§4You are not allowed to create sign here."); + return false; } - + @Override protected boolean onSignBreak(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException { final SignProtectionState state = checkProtectionSign(sign, player, username); return state == SignProtectionState.OWNER; } - + public boolean hasAdjacentBlock(final Block block, final Block... ignoredBlocks) { final Block[] faces = getAdjacentBlocks(block); @@ -68,10 +70,10 @@ public class SignProtection extends EssentialsSign } return false; } - + private void checkIfSignsAreBroken(final Block block, final User player, final String username, final IEssentials ess) { - final Map signs = getConnectedSigns(block, player, username); + final Map signs = getConnectedSigns(block, player, username, false); for (Map.Entry entry : signs.entrySet()) { if (entry.getValue() != SignProtectionState.NOSIGN) @@ -86,14 +88,14 @@ public class SignProtection extends EssentialsSign } } } - - private Map getConnectedSigns(final Block block, final User user, final String username) + + private Map getConnectedSigns(final Block block, final User user, final String username, boolean secure) { final Map signs = new HashMap(); - getConnectedSigns(block, signs, user, username, 2); + getConnectedSigns(block, signs, user, username, secure ? 4 : 2); return signs; } - + private void getConnectedSigns(final Block block, final Map signs, final User user, final String username, final int depth) { final Block[] faces = getAdjacentBlocks(block); @@ -106,20 +108,20 @@ public class SignProtection extends EssentialsSign } final SignProtectionState check = checkProtectionSign(b, user, username); signs.put(loc, check); - + if (protectedBlocks.contains(b.getType()) && depth > 0) { getConnectedSigns(b, signs, user, username, depth - 1); } } } - - + + public enum SignProtectionState { NOT_ALLOWED, ALLOWED, NOSIGN, OWNER } - + private SignProtectionState checkProtectionSign(final Block block, final User user, final String username) { if (block.getType() == Material.SIGN_POST || block.getType() == Material.WALL_SIGN) @@ -132,7 +134,7 @@ public class SignProtection extends EssentialsSign } return SignProtectionState.NOSIGN; } - + private SignProtectionState checkProtectionSign(final ISign sign, final User user, final String username) { if (user == null || username == null) @@ -155,13 +157,13 @@ public class SignProtection extends EssentialsSign return SignProtectionState.ALLOWED; } } - if (sign.getLine(3).equalsIgnoreCase(username)) + if (sign.getLine(3).substring(2).equalsIgnoreCase(username)) { return SignProtectionState.OWNER; } return SignProtectionState.NOT_ALLOWED; } - + private Block[] getAdjacentBlocks(final Block block) { return new Block[] @@ -174,10 +176,10 @@ public class SignProtection extends EssentialsSign block.getFace(BlockFace.UP) }; } - - public SignProtectionState isBlockProtected(final Block block, final User user, final String username) + + public SignProtectionState isBlockProtected(final Block block, final User user, final String username, boolean secure) { - final Map signs = getConnectedSigns(block, user, username); + final Map signs = getConnectedSigns(block, user, username, secure); SignProtectionState retstate = SignProtectionState.NOSIGN; for (SignProtectionState state : signs.values()) { @@ -192,7 +194,7 @@ public class SignProtection extends EssentialsSign } return retstate; } - + public boolean isBlockProtected(final Block block) { final Block[] faces = getAdjacentBlocks(block); @@ -209,7 +211,7 @@ public class SignProtection extends EssentialsSign if (protectedBlocks.contains(b.getType())) { final Block[] faceChest = getAdjacentBlocks(b); - + for (Block a : faceChest) { if (a.getType() == Material.SIGN_POST || a.getType() == Material.WALL_SIGN) @@ -225,7 +227,7 @@ public class SignProtection extends EssentialsSign } return false; } - + @Override public Set getBlocks() { @@ -235,81 +237,78 @@ public class SignProtection extends EssentialsSign @Override protected boolean onBlockPlace(final Block block, final User player, final String username, final IEssentials ess) throws SignException { - final SignProtectionState state = isBlockProtected(block, player, username); - - if (state == SignProtectionState.OWNER || state == SignProtectionState.NOSIGN) + for (Block adjBlock : getAdjacentBlocks(block)) { - return true; + final SignProtectionState state = isBlockProtected(adjBlock, player, username, true); + + if ((state == SignProtectionState.ALLOWED || state == SignProtectionState.NOT_ALLOWED) + && !player.isAuthorized("essentials.signs.protection.override")) + { + player.sendMessage(Util.format("noPlacePermission", block.getType().toString().toLowerCase())); + return false; + } } - - if ((state == SignProtectionState.ALLOWED || state == SignProtectionState.NOT_ALLOWED) - && player.isAuthorized("essentials.signs.protection.override")) - { - return true; - } - - - player.sendMessage(Util.format("noPlacePermission", block.getType().toString().toLowerCase())); - return false; + return true; + } @Override protected boolean onBlockInteract(final Block block, final User player, final String username, final IEssentials ess) throws SignException { - final SignProtectionState state = isBlockProtected(block, player, username); - + final SignProtectionState state = isBlockProtected(block, player, username, false); + if (state == SignProtectionState.OWNER || state == SignProtectionState.NOSIGN || state == SignProtectionState.ALLOWED) { return true; } - + if (state == SignProtectionState.NOT_ALLOWED && player.isAuthorized("essentials.signs.protection.override")) { return true; } - - + + player.sendMessage(Util.format("noAccessPermission", block.getType().toString().toLowerCase())); return false; } - + @Override protected boolean onBlockBreak(final Block block, final User player, final String username, final IEssentials ess) throws SignException { - final SignProtectionState state = isBlockProtected(block, player, username); - + final SignProtectionState state = isBlockProtected(block, player, username, false); + if (state == SignProtectionState.OWNER || state == SignProtectionState.NOSIGN) { checkIfSignsAreBroken(block, player, username, ess); return true; } - + if ((state == SignProtectionState.ALLOWED || state == SignProtectionState.NOT_ALLOWED) && player.isAuthorized("essentials.signs.protection.override")) { checkIfSignsAreBroken(block, player, username, ess); return true; } - - + + player.sendMessage(Util.format("noDestroyPermission", block.getType().toString().toLowerCase())); return false; } - + @Override public boolean onBlockExplode(final Block block, final IEssentials ess) { - final SignProtectionState state = isBlockProtected(block, null, null); - + final SignProtectionState state = isBlockProtected(block, null, null, false); + return state == SignProtectionState.NOSIGN; } - + @Override public boolean onBlockBurn(final Block block, final IEssentials ess) { - final SignProtectionState state = isBlockProtected(block, null, null); - + final SignProtectionState state = isBlockProtected(block, null, null, false); + return state == SignProtectionState.NOSIGN; } }