Merge pull request #39 from gipsy-king/prevent_block_place

add prevent-block-place option
This commit is contained in:
Brett Flannigan 2014-11-26 03:54:55 -06:00
commit d2fbd83bd5
5 changed files with 108 additions and 0 deletions

View File

@ -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);
}
}

View File

@ -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<String, BorderData> stringBorderDataEntry : borders.entrySet())

View File

@ -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

View File

@ -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();
}
}
}

View File

@ -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() + "<on|off> - 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<String> 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);
}
}
}