diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 33c18f24..e2278900 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,4 +1,5 @@ 1.2 +- /stopfire and /allowfire disable and enable fire spreading globally. - Block lag fix slightly improved in accuracy for item drops. - Sponge updated to remove water when the sponge block is set. Sponge radius can now be controlled using the 'sponge-radius' parameter and the diff --git a/README.txt b/README.txt index a2a9a946..f714f919 100644 --- a/README.txt +++ b/README.txt @@ -147,6 +147,25 @@ WorldGuard on your server. You can either restart your server or use - log-database-table (def. "blacklist_events") Database table to use. +Commands +-------- + +- /stopfire and /allowfire + Disables and enables fire spread globally. Both commands require the + permission to use only "/stopfire. Re-enabling fire spread with this + command will not override other fire spread control features of + WorldGuard. Note that disabling fire does not disable fire damage + but fire at least won't spread. + +Server Commands +--------------- + +- fire-stop and fire-allow + Disables and enables fire spread globally. Re-enabling fire spread + with this command will not override other fire spread control features + of WorldGuard. Note that disabling fire does not disable fire damage + but fire at least won't spread. + Blacklists ---------- diff --git a/src/WorldGuard.java b/src/WorldGuard.java index aaa72ef7..2d0d8731 100644 --- a/src/WorldGuard.java +++ b/src/WorldGuard.java @@ -53,6 +53,10 @@ public WorldGuard() { public void initialize() { PluginLoader loader = etc.getLoader(); + loader.addListener(PluginLoader.Hook.COMMAND, listener, this, + PluginListener.Priority.MEDIUM); + loader.addListener(PluginLoader.Hook.SERVERCOMMAND, listener, this, + PluginListener.Priority.MEDIUM); loader.addListener(PluginLoader.Hook.EXPLODE, listener, this, PluginListener.Priority.HIGH); loader.addListener(PluginLoader.Hook.IGNITE, listener, this, @@ -61,6 +65,8 @@ public void initialize() { PluginListener.Priority.HIGH); loader.addListener(PluginLoader.Hook.LOGINCHECK, listener, this, PluginListener.Priority.HIGH); + loader.addListener(PluginLoader.Hook.LOGIN, listener, this, + PluginListener.Priority.MEDIUM); loader.addListener(PluginLoader.Hook.BLOCK_CREATED, listener, this, PluginListener.Priority.HIGH); loader.addListener(PluginLoader.Hook.BLOCK_DESTROYED, listener, this, @@ -68,11 +74,11 @@ public void initialize() { loader.addListener(PluginLoader.Hook.DISCONNECT, listener, this, PluginListener.Priority.HIGH); loader.addListener(PluginLoader.Hook.ITEM_DROP , listener, this, - PluginListener.Priority.HIGH); + PluginListener.Priority.HIGH); loader.addListener(PluginLoader.Hook.COMPLEX_BLOCK_CHANGE, listener, this, - PluginListener.Priority.HIGH); + PluginListener.Priority.HIGH); loader.addListener(PluginLoader.Hook.COMPLEX_BLOCK_SEND, listener, this, - PluginListener.Priority.HIGH); + PluginListener.Priority.HIGH); } /** @@ -82,6 +88,9 @@ public void initialize() { public void enable() { logger.log(Level.INFO, "WorldGuard version " + getVersion() + " loaded"); listener.loadConfiguration(); + + etc.getInstance().addCommand("/stopfire", "Globally stop fire spread"); + etc.getInstance().addCommand("/allowfire", "Globally re-enable fire spread"); } /** @@ -94,6 +103,9 @@ public void disable() { BlacklistEntry.forgetAllPlayers(); } catch (Throwable t) { } + + etc.getInstance().removeCommand("/stopfire"); + etc.getInstance().removeCommand("/allowfire"); } /** diff --git a/src/WorldGuardListener.java b/src/WorldGuardListener.java index 61828954..e7875554 100644 --- a/src/WorldGuardListener.java +++ b/src/WorldGuardListener.java @@ -63,6 +63,11 @@ public class WorldGuardListener extends PluginListener { */ private LinkedList blockRemoveQueue = new LinkedList(); + /** + * Stop fire spread mode. + */ + private boolean stopFireSpread = false; + private boolean enforceOneSession; private boolean blockCreepers; private boolean blockTNT; @@ -237,6 +242,84 @@ public String onLoginChecks(String user) { return null; } + + /** + * Called during the later login process + * + * @param player + */ + public void onLogin(Player player) { + if (stopFireSpread) { + player.sendMessage(Colors.Yellow + "Fire spread is currently globally disabled."); + } + } + + /** + * Called before the command is parsed. Return true if you don't want the + * command to be parsed. + * + * @param player + * @param split + * @return false if you want the command to be parsed. + */ + public boolean onCommand(Player player, String[] split) { + if (split[0].equalsIgnoreCase("/stopfire") && + player.canUseCommand("/stopfire")) { + if (!stopFireSpread) { + etc.getServer().messageAll(Colors.Yellow + + "Fire spread has been globally disabled by " + player.getName() + "."); + } else { + player.sendMessage(Colors.Yellow + "Fire spread was already globally disabled."); + } + stopFireSpread = true; + return true; + } else if (split[0].equalsIgnoreCase("/allowfire") + && player.canUseCommand("/stopfire")) { + if (stopFireSpread) { + etc.getServer().messageAll(Colors.Yellow + + "Fire spread has been globally re-enabled by " + player.getName() + "."); + } else { + player.sendMessage(Colors.Yellow + "Fire spread was already globally enabled."); + } + stopFireSpread = false; + return true; + } + + return false; + } + + /** + * Called before the console command is parsed. Return true if you don't + * want the server command to be parsed by the server. + * + * @param split + * @return false if you want the command to be parsed. + */ + public boolean onConsoleCommand(String[] split) { + if (split[0].equalsIgnoreCase("fire-stop")) { + if (!stopFireSpread) { + etc.getServer().messageAll(Colors.Yellow + + "Fire spread has been globally disabled by server console."); + logger.log(Level.INFO, "Fire spread is now globally disabled."); + } else { + logger.log(Level.INFO, "Fire spread was already globally disabled."); + } + stopFireSpread = true; + return true; + } else if (split[0].equalsIgnoreCase("fire-allow")) { + if (stopFireSpread) { + etc.getServer().messageAll(Colors.Yellow + + "Fire spread has been globally re-enabled by server console."); + logger.log(Level.INFO, "Fire spread is now globally enabled."); + } else { + logger.log(Level.INFO, "Fire spread was already globally enabled."); + } + stopFireSpread = false; + return true; + } + + return false; + } /** * Called when a player drops an item. @@ -539,6 +622,10 @@ public boolean onIgnite(Block block, Player player) { && !player.canUseCommand("/lighter"); } + if (stopFireSpread && block.getStatus() == 3) { + return true; + } + if (disableAllFire && block.getStatus() == 3) { return true; }