From 92edff6ffec6980d2aa2561864a74a1f53986ad7 Mon Sep 17 00:00:00 2001 From: sk89q Date: Wed, 17 Nov 2010 22:51:09 -0800 Subject: [PATCH] Added protection and plugin support. --- src/WorldGuard.java | 10 ++++++++-- src/WorldGuardListener.java | 34 +++++++++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/WorldGuard.java b/src/WorldGuard.java index 89adb145..1490a366 100644 --- a/src/WorldGuard.java +++ b/src/WorldGuard.java @@ -37,8 +37,14 @@ public class WorldGuard extends Plugin { /** * Listener for the plugin system. */ - private static final WorldGuardListener listener = - new WorldGuardListener(); + private WorldGuardListener listener; + + /** + * Initialize the plugin. + */ + public WorldGuard() { + listener = new WorldGuardListener(this); + } /** * Initializes the plugin. diff --git a/src/WorldGuardListener.java b/src/WorldGuardListener.java index 5fe91c63..867e4025 100644 --- a/src/WorldGuardListener.java +++ b/src/WorldGuardListener.java @@ -48,6 +48,10 @@ public class WorldGuardListener extends PluginListener { */ private static Random rand = new Random(); + /** + * Plugin host. + */ + private WorldGuard plugin; /** * Properties file for CraftBook. */ @@ -70,6 +74,15 @@ public class WorldGuardListener extends PluginListener { private boolean classicWater; private Map blacklist; + /** + * Construct the listener. + * + * @param plugin + */ + public WorldGuardListener(WorldGuard plugin) { + this.plugin = plugin; + } + /** * Convert a comma-delimited list to a set of integers. * @@ -245,7 +258,7 @@ public boolean onBlockDestroy(Player player, Block block) { && type != 50 // Torch && type != 75 // Redstone torch && type != 76 // Redstone torch - ) { + && canDestroyBlock(player, block)) { if (block.getStatus() == 3) { int dropped = type; @@ -423,6 +436,25 @@ public void onDisconnect(Player player) { BlacklistEntry.forgetPlayer(player); } + /** + * Checks if a block can be destroyed. + * + * @param player + * @param block + * @return + */ + public boolean canDestroyBlock(Player player, Block block) { + plugin.toggleEnabled(); // Prevent infinite loop + try { + return !(Boolean)etc.getLoader().callHook(PluginLoader.Hook.BLOCK_DESTROYED, + new Object[]{ player.getUser(), block }); + } catch (Throwable t) { + return true; + } finally { + plugin.toggleEnabled(); + } + } + /** * Load the blacklist. *