From b23e35cf2692ef2354be96428be86b7c666f01b2 Mon Sep 17 00:00:00 2001 From: sk89q Date: Wed, 4 May 2011 01:24:38 -0700 Subject: [PATCH] Improved chest-sign protection. --- .../bukkit/SignChestProtection.java | 4 +++ .../worldguard/bukkit/WorldConfiguration.java | 10 ++++++ .../bukkit/WorldGuardBlockListener.java | 32 ++++++++++++++++--- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/sk89q/worldguard/bukkit/SignChestProtection.java b/src/main/java/com/sk89q/worldguard/bukkit/SignChestProtection.java index 8f39e3e4..9e3e869f 100644 --- a/src/main/java/com/sk89q/worldguard/bukkit/SignChestProtection.java +++ b/src/main/java/com/sk89q/worldguard/bukkit/SignChestProtection.java @@ -46,6 +46,10 @@ public boolean isProtected(Block block, Player player) { } } + public boolean isProtectedPlacement(Block block, Player player) { + return isProtectedSignAround(block, player); + } + private boolean isProtectedSignAround(Block searchBlock, Player player) { Block side; Boolean res; diff --git a/src/main/java/com/sk89q/worldguard/bukkit/WorldConfiguration.java b/src/main/java/com/sk89q/worldguard/bukkit/WorldConfiguration.java index 9a0b9a6d..a7a645d8 100644 --- a/src/main/java/com/sk89q/worldguard/bukkit/WorldConfiguration.java +++ b/src/main/java/com/sk89q/worldguard/bukkit/WorldConfiguration.java @@ -346,5 +346,15 @@ public boolean isChestProtected(Block block) { } return chestProtection.isProtected(block, null); } + + public boolean isChestProtectedPlacement(Block block, Player player) { + if (!signChestProtection) { + return false; + } + if (plugin.hasPermission(player, "worldguard.chest-protection.override")) { + return false; + } + return chestProtection.isProtectedPlacement(block, player); + } } diff --git a/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardBlockListener.java b/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardBlockListener.java index f9aaa6a4..1f5986b3 100644 --- a/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardBlockListener.java +++ b/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardBlockListener.java @@ -365,6 +365,7 @@ public void onBlockBurn(BlockBurnEvent event) { } } + if (wcfg.isChestProtected(event.getBlock())) { event.setCancelled(true); return; } if (wcfg.useRegions) { Block block = event.getBlock(); Vector pt = toVector(block); @@ -512,6 +513,13 @@ public void onSignChange(SignChangeEvent event) { if (wcfg.signChestProtection) { if (event.getLine(0).equalsIgnoreCase("[Lock]")) { + if (wcfg.isChestProtectedPlacement(event.getBlock(), player)) { + player.sendMessage(ChatColor.DARK_RED + "You do not own the adjacent chest."); + dropSign(event.getBlock()); + event.setCancelled(true); + return; + } + if (event.getBlock().getType() != Material.SIGN_POST) { player.sendMessage(ChatColor.RED + "The [Lock] sign must be a sign post, not a wall sign."); @@ -519,18 +527,32 @@ public void onSignChange(SignChangeEvent event) { dropSign(event.getBlock()); event.setCancelled(true); return; - } else if (!event.getLine(1).equalsIgnoreCase(player.getName())) { + } + + if (!event.getLine(1).equalsIgnoreCase(player.getName())) { player.sendMessage(ChatColor.RED + "The first owner line must be your name."); dropSign(event.getBlock()); event.setCancelled(true); return; - } else { - event.setLine(0, "[Lock]"); - player.sendMessage(ChatColor.YELLOW - + "A chest or double chest above is now protected."); } + + Material below = event.getBlock().getRelative(0, -1, 0).getType(); + + if (below == Material.TNT || below == Material.SAND + || below == Material.GRAVEL || below == Material.SIGN_POST) { + player.sendMessage(ChatColor.RED + + "That is not a safe block that you're putting this sign on."); + + dropSign(event.getBlock()); + event.setCancelled(true); + return; + } + + event.setLine(0, "[Lock]"); + player.sendMessage(ChatColor.YELLOW + + "A chest or double chest above is now protected."); } } else { if (event.getLine(0).equalsIgnoreCase("[Lock]")) {