diff --git a/src/main/java/com/wimbli/WorldBorder/BlockPlaceListener.java b/src/main/java/com/wimbli/WorldBorder/BlockPlaceListener.java new file mode 100644 index 0000000..b1e5f82 --- /dev/null +++ b/src/main/java/com/wimbli/WorldBorder/BlockPlaceListener.java @@ -0,0 +1,31 @@ +package com.wimbli.WorldBorder; + +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockPlaceEvent; + +public class BlockPlaceListener implements Listener { + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onBlockPlace(BlockPlaceEvent event) + { + Location loc = event.getBlockPlaced().getLocation(); + if (loc == null) return; + + World world = loc.getWorld(); + if (world == null) return; + BorderData border = Config.Border(world.getName()); + if (border == null) return; + + if (!border.insideBorder(loc.getX(), loc.getZ(), Config.ShapeRound())) { + event.setCancelled(true); + } + } + + public void unregister() { + HandlerList.unregisterAll(this); + } +} diff --git a/src/main/java/com/wimbli/WorldBorder/Config.java b/src/main/java/com/wimbli/WorldBorder/Config.java index f340aa0..5a6216a 100644 --- a/src/main/java/com/wimbli/WorldBorder/Config.java +++ b/src/main/java/com/wimbli/WorldBorder/Config.java @@ -54,6 +54,7 @@ public class Config private static boolean denyEnderpearl = false; private static int fillAutosaveFrequency = 30; private static int fillMemoryTolerance = 500; + private static boolean preventBlockPlace = false; // for monitoring plugin efficiency // public static long timeUsed = 0; @@ -259,6 +260,18 @@ public class Config world.playEffect(loc, Effect.SMOKE, 4); world.playEffect(loc, Effect.GHAST_SHOOT, 0); } + + public static void setPreventBlockPlace(boolean enable) + { + preventBlockPlace = enable; + log("prevent block place " + (enable ? "enabled" : "disabled") + "."); + save(true); + } + + public static boolean preventBlockPlace() + { + return preventBlockPlace; + } public static boolean getIfPlayerKill() { @@ -566,6 +579,7 @@ public class Config fillAutosaveFrequency = cfg.getInt("fill-autosave-frequency", 30); importBypassStringList(cfg.getStringList("bypass-list-uuids")); fillMemoryTolerance = cfg.getInt("fill-memory-tolerance", 500); + preventBlockPlace = cfg.getBoolean("prevent-block-place"); StartBorderTimer(); @@ -672,6 +686,7 @@ public class Config cfg.set("fill-autosave-frequency", fillAutosaveFrequency); cfg.set("bypass-list-uuids", exportBypassStringList()); cfg.set("fill-memory-tolerance", fillMemoryTolerance); + cfg.set("prevent-block-place", preventBlockPlace); cfg.set("worlds", null); for(Entry stringBorderDataEntry : borders.entrySet()) diff --git a/src/main/java/com/wimbli/WorldBorder/WBCommand.java b/src/main/java/com/wimbli/WorldBorder/WBCommand.java index 83f1bd7..eab3e5d 100644 --- a/src/main/java/com/wimbli/WorldBorder/WBCommand.java +++ b/src/main/java/com/wimbli/WorldBorder/WBCommand.java @@ -42,6 +42,7 @@ public class WBCommand implements CommandExecutor addCmd(new CmdKnockback()); // 1 addCmd(new CmdWrap()); // 1 addCmd(new CmdWhoosh()); // 1 + addCmd(new CmdPreventPlace()); // 1 addCmd(new CmdGetmsg()); // 1 addCmd(new CmdSetmsg()); // 1 addCmd(new CmdWshape()); // 3 diff --git a/src/main/java/com/wimbli/WorldBorder/WorldBorder.java b/src/main/java/com/wimbli/WorldBorder/WorldBorder.java index 0173587..8379f44 100644 --- a/src/main/java/com/wimbli/WorldBorder/WorldBorder.java +++ b/src/main/java/com/wimbli/WorldBorder/WorldBorder.java @@ -8,6 +8,7 @@ public class WorldBorder extends JavaPlugin { public static volatile WorldBorder plugin = null; public static volatile WBCommand wbCommand = null; + private BlockPlaceListener blockPlaceListener = null; @Override public void onEnable() @@ -25,6 +26,10 @@ public class WorldBorder extends JavaPlugin // keep an eye on teleports, to redirect them to a spot inside the border if necessary getServer().getPluginManager().registerEvents(new WBListener(), this); + + if (Config.preventBlockPlace()) { + enableBlockPlaceListener(true); + } // integrate with DynMap if it's available DynMapFeatures.setup(); @@ -57,4 +62,13 @@ public class WorldBorder extends JavaPlugin { return getWorldBorder(worldName); } + + public void enableBlockPlaceListener(boolean enable) { + if (enable) { + getServer().getPluginManager().registerEvents(this.blockPlaceListener = new BlockPlaceListener(), this); + } else { + blockPlaceListener.unregister(); + } + + } } diff --git a/src/main/java/com/wimbli/WorldBorder/cmd/CmdPreventPlace.java b/src/main/java/com/wimbli/WorldBorder/cmd/CmdPreventPlace.java new file mode 100644 index 0000000..f81da6f --- /dev/null +++ b/src/main/java/com/wimbli/WorldBorder/cmd/CmdPreventPlace.java @@ -0,0 +1,47 @@ +package com.wimbli.WorldBorder.cmd; + +import java.util.List; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; + +import com.wimbli.WorldBorder.BlockPlaceListener; +import com.wimbli.WorldBorder.Config; +import com.wimbli.WorldBorder.WorldBorder; + +public class CmdPreventPlace extends WBCmd { + + public CmdPreventPlace() { + name = permission = "preventblockplace"; + minParams = 0; + maxParams = 1; + + addCmdExample(nameEmphasized() + " - turn prevent-block-place on or off."); + helpText = "Default value: off. This will prevent players from placing blocks outside the world's border."; + } + + @Override + public void cmdStatus(CommandSender sender) + { + sender.sendMessage(C_HEAD + "preventblockplace is " + enabledColored(Config.preventBlockPlace()) + C_HEAD + "."); + } + + @Override + public void execute(CommandSender sender, Player player, List params, String worldName) + { + if (params.size() == 1) { + boolean previousSetting = Config.preventBlockPlace(); + Config.setPreventBlockPlace(strAsBool(params.get(0))); + if (previousSetting != Config.preventBlockPlace()) { + WorldBorder.plugin.enableBlockPlaceListener(Config.preventBlockPlace()); + } + } + + if (player != null) + { + Config.log((Config.preventBlockPlace() ? "Enabled" : "Disabled") + " preventblockplace at the command of player \"" + player.getName() + "\"."); + cmdStatus(sender); + } + } +}