finished plot command confirmation (clear, delete, unlink)

This commit is contained in:
boy0001 2015-03-07 16:22:15 +11:00
parent 972a3325e4
commit 37e638acad
14 changed files with 174 additions and 52 deletions

View File

@ -708,6 +708,12 @@ public class PlotSquared {
final Map<String, Object> options = new HashMap<>(); final Map<String, Object> options = new HashMap<>();
options.put("teleport.delay", 0); options.put("teleport.delay", 0);
options.put("auto_update", false); options.put("auto_update", false);
options.put("confirmation.clear", Settings.CONFIRM_CLEAR);
options.put("confirmation.delete", Settings.CONFIRM_DELETE);
options.put("confirmation.unlink", Settings.CONFIRM_UNLINK);
options.put("clusters.enabled", Settings.ENABLE_CLUSTERS); options.put("clusters.enabled", Settings.ENABLE_CLUSTERS);
options.put("plotme-alias", Settings.USE_PLOTME_ALIAS); options.put("plotme-alias", Settings.USE_PLOTME_ALIAS);
options.put("plotme-convert.enabled", Settings.CONVERT_PLOTME); options.put("plotme-convert.enabled", Settings.CONVERT_PLOTME);
@ -738,6 +744,11 @@ public class PlotSquared {
if (Settings.DEBUG) { if (Settings.DEBUG) {
log(C.PREFIX.s() + "&6Debug Mode Enabled (Default). Edit the config to turn this off."); log(C.PREFIX.s() + "&6Debug Mode Enabled (Default). Edit the config to turn this off.");
} }
Settings.CONFIRM_CLEAR = config.getBoolean("confirmation.clear");
Settings.CONFIRM_DELETE = config.getBoolean("confirmation.delete");
Settings.CONFIRM_UNLINK = config.getBoolean("confirmation.unlink");
Settings.TELEPORT_DELAY = config.getInt("teleport.delay"); Settings.TELEPORT_DELAY = config.getInt("teleport.delay");
Settings.CONSOLE_COLOR = config.getBoolean("console.color"); Settings.CONSOLE_COLOR = config.getBoolean("console.color");
Settings.TELEPORT_ON_LOGIN = config.getBoolean("teleport.on_login"); Settings.TELEPORT_ON_LOGIN = config.getBoolean("teleport.on_login");

View File

@ -24,12 +24,15 @@ import java.util.Set;
import com.intellectualcrafters.plot.PlotSquared; import com.intellectualcrafters.plot.PlotSquared;
import com.intellectualcrafters.plot.config.C; import com.intellectualcrafters.plot.config.C;
import com.intellectualcrafters.plot.config.Settings;
import com.intellectualcrafters.plot.object.Location; import com.intellectualcrafters.plot.object.Location;
import com.intellectualcrafters.plot.object.Plot; import com.intellectualcrafters.plot.object.Plot;
import com.intellectualcrafters.plot.object.PlotId; import com.intellectualcrafters.plot.object.PlotId;
import com.intellectualcrafters.plot.object.PlotPlayer; import com.intellectualcrafters.plot.object.PlotPlayer;
import com.intellectualcrafters.plot.util.CmdConfirm;
import com.intellectualcrafters.plot.util.MainUtil; import com.intellectualcrafters.plot.util.MainUtil;
import com.intellectualcrafters.plot.util.Permissions; import com.intellectualcrafters.plot.util.Permissions;
import com.intellectualcrafters.plot.util.TaskManager;
import com.intellectualcrafters.plot.util.bukkit.UUIDHandler; import com.intellectualcrafters.plot.util.bukkit.UUIDHandler;
public class Clear extends SubCommand { public class Clear extends SubCommand {
@ -56,8 +59,19 @@ public class Clear extends SubCommand {
if (plot == null) { if (plot == null) {
PlotSquared.log("Could not find plot " + args[0] + " in world " + world); PlotSquared.log("Could not find plot " + args[0] + " in world " + world);
} else { } else {
MainUtil.clear(world, plot, true, null); Runnable runnable = new Runnable() {
PlotSquared.log("Plot " + plot.getId().toString() + " cleared."); @Override
public void run() {
MainUtil.clear(world, plot, true, null);
PlotSquared.log("Plot " + plot.getId().toString() + " cleared.");
}
};
if (Settings.CONFIRM_CLEAR) {
CmdConfirm.addPending(plr, "/plot clear " + id, runnable);
}
else {
TaskManager.runTask(runnable);
}
} }
} }
} }
@ -100,18 +114,31 @@ public class Clear extends SubCommand {
return sendMessage(plr, C.NO_PLOT_PERMS); return sendMessage(plr, C.NO_PLOT_PERMS);
} }
assert plot != null; assert plot != null;
final long start = System.currentTimeMillis(); if (MainUtil.runners.containsKey(plot)) {
final boolean result = MainUtil.clearAsPlayer(plot, false, new Runnable() { MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
return false;
}
Runnable runnable = new Runnable() {
@Override @Override
public void run() { public void run() {
MainUtil.sendMessage(plr, C.CLEARING_DONE, "" + (System.currentTimeMillis() - start)); final long start = System.currentTimeMillis();
final boolean result = MainUtil.clearAsPlayer(plot, false, new Runnable() {
@Override
public void run() {
MainUtil.sendMessage(plr, C.CLEARING_DONE, "" + (System.currentTimeMillis() - start));
}
});
if (!result) {
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
}
} }
}); };
if (!result) { if (Settings.CONFIRM_CLEAR) {
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER); CmdConfirm.addPending(plr, "/plot clear " + plot.id, runnable);
} }
// sign else {
// wall TaskManager.runTask(runnable);
return result; }
return true;
} }
} }

View File

@ -74,6 +74,7 @@ public enum Command {
BAN("ban", "block"), BAN("ban", "block"),
UNBAN("unban", "unblock"), UNBAN("unban", "unblock"),
DATABASE("database", "convert"), DATABASE("database", "convert"),
CONFIRM("confirm"),
TP("tp", "tp"); TP("tp", "tp");
/** /**
* Command * Command

View File

@ -34,6 +34,7 @@ import com.intellectualcrafters.plot.object.PlotWorld;
import com.intellectualcrafters.plot.util.CmdConfirm; import com.intellectualcrafters.plot.util.CmdConfirm;
import com.intellectualcrafters.plot.util.EconHandler; import com.intellectualcrafters.plot.util.EconHandler;
import com.intellectualcrafters.plot.util.MainUtil; import com.intellectualcrafters.plot.util.MainUtil;
import com.intellectualcrafters.plot.util.TaskManager;
import com.intellectualcrafters.plot.util.bukkit.UUIDHandler; import com.intellectualcrafters.plot.util.bukkit.UUIDHandler;
/** /**
@ -47,12 +48,17 @@ public class Confirm extends SubCommand {
@Override @Override
public boolean execute(final PlotPlayer plr, final String... args) { public boolean execute(final PlotPlayer plr, final String... args) {
String name = plr.getName(); String name = plr.getName();
CmdInstance command = CmdConfirm.pending.get(name); CmdInstance command = CmdConfirm.getPending(plr);
if (cmd == null) { if (command == null) {
// Tell user no pending commands MainUtil.sendMessage(plr, C.FAILED_CONFIRM);
return false; return false;
} }
// TODO check command timestamp; CmdConfirm.removePending(plr);
return command.command.execute(plr, command.args); if (System.currentTimeMillis() - command.timestamp > 10000) {
MainUtil.sendMessage(plr, C.FAILED_CONFIRM);
return false;
}
TaskManager.runTask(command.command);
return true;
} }
} }

View File

@ -22,14 +22,17 @@ package com.intellectualcrafters.plot.commands;
import com.intellectualcrafters.plot.PlotSquared; import com.intellectualcrafters.plot.PlotSquared;
import com.intellectualcrafters.plot.config.C; import com.intellectualcrafters.plot.config.C;
import com.intellectualcrafters.plot.config.Settings;
import com.intellectualcrafters.plot.database.DBFunc; import com.intellectualcrafters.plot.database.DBFunc;
import com.intellectualcrafters.plot.object.Location; import com.intellectualcrafters.plot.object.Location;
import com.intellectualcrafters.plot.object.Plot; import com.intellectualcrafters.plot.object.Plot;
import com.intellectualcrafters.plot.object.PlotPlayer; import com.intellectualcrafters.plot.object.PlotPlayer;
import com.intellectualcrafters.plot.object.PlotWorld; import com.intellectualcrafters.plot.object.PlotWorld;
import com.intellectualcrafters.plot.util.CmdConfirm;
import com.intellectualcrafters.plot.util.EconHandler; import com.intellectualcrafters.plot.util.EconHandler;
import com.intellectualcrafters.plot.util.MainUtil; import com.intellectualcrafters.plot.util.MainUtil;
import com.intellectualcrafters.plot.util.Permissions; import com.intellectualcrafters.plot.util.Permissions;
import com.intellectualcrafters.plot.util.TaskManager;
import com.intellectualcrafters.plot.util.bukkit.UUIDHandler; import com.intellectualcrafters.plot.util.bukkit.UUIDHandler;
public class Delete extends SubCommand { public class Delete extends SubCommand {
@ -52,32 +55,39 @@ public class Delete extends SubCommand {
} }
assert plot != null; assert plot != null;
final PlotWorld pWorld = PlotSquared.getPlotWorld(plot.world); final PlotWorld pWorld = PlotSquared.getPlotWorld(plot.world);
if ((PlotSquared.economy != null) && pWorld.USE_ECONOMY && (plot != null) && plot.hasOwner() && plot.getOwner().equals(UUIDHandler.getUUID(plr))) {
final double c = pWorld.SELL_PRICE;
if (c > 0d) {
EconHandler.depositPlayer(plr, c);
sendMessage(plr, C.ADDED_BALANCE, c + "");
}
}
if (MainUtil.runners.containsKey(plot)) { if (MainUtil.runners.containsKey(plot)) {
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER); MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
return false; return false;
} }
final boolean result = PlotSquared.removePlot(loc.getWorld(), plot.id, true); Runnable runnable = new Runnable() {
final long start = System.currentTimeMillis(); @Override
if (result) { public void run() {
final boolean result2 = MainUtil.clearAsPlayer(plot, true, new Runnable() { if ((PlotSquared.economy != null) && pWorld.USE_ECONOMY && (plot != null) && plot.hasOwner() && plot.getOwner().equals(UUIDHandler.getUUID(plr))) {
@Override final double c = pWorld.SELL_PRICE;
public void run() { if (c > 0d) {
MainUtil.sendMessage(plr, C.CLEARING_DONE, "" + (System.currentTimeMillis() - start)); EconHandler.depositPlayer(plr, c);
sendMessage(plr, C.ADDED_BALANCE, c + "");
}
} }
}); PlotSquared.removePlot(loc.getWorld(), plot.id, true);
if (!result2) { final long start = System.currentTimeMillis();
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER); final boolean result = MainUtil.clearAsPlayer(plot, true, new Runnable() {
@Override
public void run() {
MainUtil.sendMessage(plr, C.CLEARING_DONE, "" + (System.currentTimeMillis() - start));
}
});
if (!result) {
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
}
DBFunc.delete(loc.getWorld(), plot);
} }
DBFunc.delete(loc.getWorld(), plot); };
} else { if (Settings.CONFIRM_DELETE) {
MainUtil.sendMessage(plr, "Plot deletion has been denied."); CmdConfirm.addPending(plr, "/plot delete " + plot.id, runnable);
}
else {
TaskManager.runTask(runnable);
} }
return true; return true;
} }

View File

@ -40,7 +40,7 @@ public class MainCommand {
/** /**
* Main Permission Node * Main Permission Node
*/ */
private final static SubCommand[] _subCommands = new SubCommand[] { new Template(), new Setup(), new DebugSaveTest(), new DebugLoadTest(), new CreateRoadSchematic(), new RegenAllRoads(), new DebugClear(), new Claim(), new Auto(), new Home(), new Visit(), new TP(), new Set(), new Clear(), new Delete(), new SetOwner(), new Denied(), new Helpers(), new Trusted(), new Info(), new list(), new Help(), new Debug(), new SchematicCmd(), new plugin(), new Inventory(), new Purge(), new Reload(), new Merge(), new Unlink(), new Kick(), new Rate(), new DebugClaimTest(), new Inbox(), new Comment(), new Database(), new Unclaim(), new Swap(), new MusicSubcommand(), new DebugRoadRegen(), new Trim(), new DebugExec(), new FlagCmd(), new Target(), new DebugFixFlags(), new Move(), new Condense() }; private final static SubCommand[] _subCommands = new SubCommand[] { new Template(), new Setup(), new DebugSaveTest(), new DebugLoadTest(), new CreateRoadSchematic(), new RegenAllRoads(), new DebugClear(), new Claim(), new Auto(), new Home(), new Visit(), new TP(), new Set(), new Clear(), new Delete(), new SetOwner(), new Denied(), new Helpers(), new Trusted(), new Info(), new list(), new Help(), new Debug(), new SchematicCmd(), new plugin(), new Inventory(), new Purge(), new Reload(), new Merge(), new Unlink(), new Kick(), new Rate(), new DebugClaimTest(), new Inbox(), new Comment(), new Database(), new Unclaim(), new Swap(), new MusicSubcommand(), new DebugRoadRegen(), new Trim(), new DebugExec(), new FlagCmd(), new Target(), new DebugFixFlags(), new Move(), new Condense(), new Confirm() };
public final static ArrayList<SubCommand> subCommands = new ArrayList<SubCommand>() { public final static ArrayList<SubCommand> subCommands = new ArrayList<SubCommand>() {
{ {
addAll(Arrays.asList(_subCommands)); addAll(Arrays.asList(_subCommands));

View File

@ -70,9 +70,11 @@ public class Set extends SubCommand {
sendMessage(plr, C.PLOT_NOT_CLAIMED); sendMessage(plr, C.PLOT_NOT_CLAIMED);
return false; return false;
} }
if (!plot.isAdded(plr.getUUID()) && !Permissions.hasPermission(plr, "plots.admin.command.set")) { if (!plot.isAdded(plr.getUUID())) {
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS); if (!Permissions.hasPermission(plr, "plots.set.other")) {
return false; MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.set.other");
return false;
}
} }
if (args.length < 1) { if (args.length < 1) {
PlotManager manager = PlotSquared.getPlotManager(loc.getWorld()); PlotManager manager = PlotSquared.getPlotManager(loc.getWorld());
@ -111,7 +113,7 @@ public class Set extends SubCommand {
return false; return false;
} }
if (!Permissions.hasPermission(plr, "plots.set.flag." + args[1].toLowerCase())) { if (!Permissions.hasPermission(plr, "plots.set.flag." + args[1].toLowerCase())) {
MainUtil.sendMessage(plr, C.NO_PERMISSION); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.set.flag." + args[1].toLowerCase());
return false; return false;
} }
if (args.length == 2) { if (args.length == 2) {
@ -225,6 +227,9 @@ public class Set extends SubCommand {
final String[] components = manager.getPlotComponents(plotworld, plot.id); final String[] components = manager.getPlotComponents(plotworld, plot.id);
for (final String component : components) { for (final String component : components) {
if (component.equalsIgnoreCase(args[0])) { if (component.equalsIgnoreCase(args[0])) {
if (!Permissions.hasPermission(plr, "plots.set." + component)) {
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.set." + component);
}
PlotBlock[] blocks; PlotBlock[] blocks;
try { try {
blocks = (PlotBlock[]) Configuration.BLOCKLIST.parseString(args[1]); blocks = (PlotBlock[]) Configuration.BLOCKLIST.parseString(args[1]);

View File

@ -24,6 +24,7 @@ import java.util.ArrayList;
import com.intellectualcrafters.plot.PlotSquared; import com.intellectualcrafters.plot.PlotSquared;
import com.intellectualcrafters.plot.config.C; import com.intellectualcrafters.plot.config.C;
import com.intellectualcrafters.plot.config.Settings;
import com.intellectualcrafters.plot.database.DBFunc; import com.intellectualcrafters.plot.database.DBFunc;
import com.intellectualcrafters.plot.object.Location; import com.intellectualcrafters.plot.object.Location;
import com.intellectualcrafters.plot.object.Plot; import com.intellectualcrafters.plot.object.Plot;
@ -31,9 +32,11 @@ import com.intellectualcrafters.plot.object.PlotId;
import com.intellectualcrafters.plot.object.PlotManager; import com.intellectualcrafters.plot.object.PlotManager;
import com.intellectualcrafters.plot.object.PlotPlayer; import com.intellectualcrafters.plot.object.PlotPlayer;
import com.intellectualcrafters.plot.object.PlotWorld; import com.intellectualcrafters.plot.object.PlotWorld;
import com.intellectualcrafters.plot.util.CmdConfirm;
import com.intellectualcrafters.plot.util.EventUtil; import com.intellectualcrafters.plot.util.EventUtil;
import com.intellectualcrafters.plot.util.MainUtil; import com.intellectualcrafters.plot.util.MainUtil;
import com.intellectualcrafters.plot.util.Permissions; import com.intellectualcrafters.plot.util.Permissions;
import com.intellectualcrafters.plot.util.TaskManager;
import com.intellectualcrafters.plot.util.bukkit.UUIDHandler; import com.intellectualcrafters.plot.util.bukkit.UUIDHandler;
/** /**
@ -59,12 +62,24 @@ public class Unlink extends SubCommand {
if (MainUtil.getTopPlot(plot).equals(MainUtil.getBottomPlot(plot))) { if (MainUtil.getTopPlot(plot).equals(MainUtil.getBottomPlot(plot))) {
return sendMessage(plr, C.UNLINK_IMPOSSIBLE); return sendMessage(plr, C.UNLINK_IMPOSSIBLE);
} }
if (!unlinkPlot(plot)) {
MainUtil.sendMessage(plr, "&cUnlink has been cancelled"); Runnable runnable = new Runnable() {
return false; @Override
public void run() {
if (!unlinkPlot(plot)) {
MainUtil.sendMessage(plr, "&cUnlink has been cancelled");
return;
}
MainUtil.update(plr.getLocation());
MainUtil.sendMessage(plr, C.UNLINK_SUCCESS);
}
};
if (Settings.CONFIRM_UNLINK) {
CmdConfirm.addPending(plr, "/plot unlink " + plot.id, runnable);
}
else {
TaskManager.runTask(runnable);
} }
MainUtil.update(plr.getLocation());
MainUtil.sendMessage(plr, "&6Plots unlinked successfully!");
return true; return true;
} }

View File

@ -35,6 +35,11 @@ import com.intellectualsites.translation.bukkit.BukkitTranslation;
* @author Citymonstret * @author Citymonstret
*/ */
public enum C { public enum C {
/*
* Confirm
*/
FAILED_CONFIRM("$2You have no pending actions to confirm!"),
REQUIRES_CONFIRM("$2Are you sure you wish to execute: $1%s$2?\n$2If you are sure: $1/plot confirm"),
/* /*
* Move * Move
*/ */
@ -208,6 +213,7 @@ public enum C {
NO_PERM_MERGE("$2You are not the owner of the plot: $1%plot%"), NO_PERM_MERGE("$2You are not the owner of the plot: $1%plot%"),
UNLINK_REQUIRED("$2An unlink is required to do this."), UNLINK_REQUIRED("$2An unlink is required to do this."),
UNLINK_IMPOSSIBLE("$2You can only unlink a mega-plot"), UNLINK_IMPOSSIBLE("$2You can only unlink a mega-plot"),
UNLINK_SUCCESS("$2Successfully unlinked plots."),
NO_MERGE_TO_MEGA("$2Mega plots cannot be merged into. Please merge from the desired mega plot."), NO_MERGE_TO_MEGA("$2Mega plots cannot be merged into. Please merge from the desired mega plot."),
/* /*
* Commands * Commands

View File

@ -136,6 +136,12 @@ public class Settings {
* Use offline mode storage * Use offline mode storage
*/ */
public static boolean OFFLINE_MODE = false; public static boolean OFFLINE_MODE = false;
/**
* Command confirmation
*/
public static boolean CONFIRM_CLEAR = true;
public static boolean CONFIRM_DELETE = true;
public static boolean CONFIRM_UNLINK = true;
/** /**
* Database settings * Database settings

View File

@ -79,6 +79,7 @@ import com.intellectualcrafters.plot.object.PlotManager;
import com.intellectualcrafters.plot.object.PlotPlayer; import com.intellectualcrafters.plot.object.PlotPlayer;
import com.intellectualcrafters.plot.object.PlotWorld; import com.intellectualcrafters.plot.object.PlotWorld;
import com.intellectualcrafters.plot.object.StringWrapper; import com.intellectualcrafters.plot.object.StringWrapper;
import com.intellectualcrafters.plot.util.CmdConfirm;
import com.intellectualcrafters.plot.util.MainUtil; import com.intellectualcrafters.plot.util.MainUtil;
import com.intellectualcrafters.plot.util.Permissions; import com.intellectualcrafters.plot.util.Permissions;
import com.intellectualcrafters.plot.util.SetupUtils; import com.intellectualcrafters.plot.util.SetupUtils;
@ -812,6 +813,7 @@ public class PlayerEvents extends com.intellectualcrafters.plot.listeners.PlotLi
if (SetupUtils.setupMap.containsKey(name)) { if (SetupUtils.setupMap.containsKey(name)) {
SetupUtils.setupMap.remove(name); SetupUtils.setupMap.remove(name);
} }
CmdConfirm.removePending(name);
BukkitUtil.removePlayer(name); BukkitUtil.removePlayer(name);
if (Settings.DELETE_PLOTS_ON_BAN && event.getPlayer().isBanned()) { if (Settings.DELETE_PLOTS_ON_BAN && event.getPlayer().isBanned()) {
final Collection<Plot> plots = PlotSquared.getPlots(name).values(); final Collection<Plot> plots = PlotSquared.getPlots(name).values();

View File

@ -1,15 +1,12 @@
package com.intellectualcrafters.plot.object; package com.intellectualcrafters.plot.object;
import com.intellectualcrafters.plot.commands.SubCommand;
public class CmdInstance { public class CmdInstance {
public final SubCommand command; public final Runnable command;
public final String[] args;
public final long timestamp; public final long timestamp;
public CmdInstance(SubCommand command, String[] args) { public CmdInstance(Runnable command) {
this.command = command; this.command = command;
this.args = args;
this.timestamp = System.currentTimeMillis(); this.timestamp = System.currentTimeMillis();
} }
} }

View File

@ -3,8 +3,43 @@ package com.intellectualcrafters.plot.util;
import java.util.HashMap; import java.util.HashMap;
import com.intellectualcrafters.plot.commands.SubCommand; import com.intellectualcrafters.plot.commands.SubCommand;
import com.intellectualcrafters.plot.config.C;
import com.intellectualcrafters.plot.object.CmdInstance; import com.intellectualcrafters.plot.object.CmdInstance;
import com.intellectualcrafters.plot.object.PlotPlayer;
public class CmdConfirm { public class CmdConfirm {
public static HashMap<String, CmdInstance> pending = new HashMap<>(); private static HashMap<String, CmdInstance> pending = new HashMap<>();
public static CmdInstance getPending(PlotPlayer player) {
if (player == null) {
return pending.get("__CONSOLE__");
}
return pending.get(player.getName());
}
public static void removePending(PlotPlayer player) {
if (player == null) {
pending.remove("__CONSOLE__");
}
else {
pending.remove(player.getName());
}
}
public static void removePending(String name) {
pending.remove(name);
}
public static void addPending(PlotPlayer player, String commandStr, Runnable runnable) {
MainUtil.sendMessage(player, C.REQUIRES_CONFIRM, commandStr);
CmdInstance cmd = new CmdInstance(runnable);
String name;
if (player == null) {
name = "__CONSOLE__";
}
else {
name = player.getName();
}
pending.put(name, cmd);
}
} }

View File

@ -591,6 +591,7 @@ public class MainUtil {
final int bottomZ = getPlotBottomLoc(world, plot.id).getZ() + 1; final int bottomZ = getPlotBottomLoc(world, plot.id).getZ() + 1;
final int topZ = getPlotTopLoc(world, plot.id).getZ(); final int topZ = getPlotTopLoc(world, plot.id).getZ();
BukkitUtil.setBiome(world, bottomX, bottomZ, topX, topZ, biome); BukkitUtil.setBiome(world, bottomX, bottomZ, topX, topZ, biome);
update(getPlotHome(world, plot));
} }
public static int getHeighestBlock(final String world, final int x, final int z) { public static int getHeighestBlock(final String world, final int x, final int z) {