added ability to override shape (round/square) of individual worlds with new /wb wshape command

This commit is contained in:
Brettflan 2011-05-08 04:36:50 -05:00
parent 6fea83f8bd
commit 9bbea2af1a
4 changed files with 104 additions and 12 deletions

View File

@ -13,6 +13,7 @@ public class BorderData
private double x = 0; private double x = 0;
private double z = 0; private double z = 0;
private int radius = 0; private int radius = 0;
private Boolean shapeRound = null;
// some extra data kept handy for faster border checks // some extra data kept handy for faster border checks
private double maxX; private double maxX;
@ -23,6 +24,14 @@ public class BorderData
private double DefiniteSquare; private double DefiniteSquare;
public BorderData(double x, double z, int radius) public BorderData(double x, double z, int radius)
{
setData(x, z, radius, null);
}
public BorderData(double x, double z, int radius, Boolean shapeRound)
{
setData(x, z, radius, shapeRound);
}
public void setData(double x, double z, int radius, Boolean shapeRound)
{ {
this.x = x; this.x = x;
this.z = z; this.z = z;
@ -32,6 +41,7 @@ public class BorderData
this.maxZ = z + radius; this.maxZ = z + radius;
this.minZ = z - radius; this.minZ = z - radius;
this.radiusSquared = radius * radius; this.radiusSquared = radius * radius;
this.shapeRound = shapeRound;
this.DefiniteSquare = Math.sqrt(.5 * this.radiusSquared); this.DefiniteSquare = Math.sqrt(.5 * this.radiusSquared);
} }
@ -70,15 +80,28 @@ public class BorderData
this.DefiniteSquare = Math.sqrt(.5 * this.radiusSquared); this.DefiniteSquare = Math.sqrt(.5 * this.radiusSquared);
} }
public Boolean getShape()
{
return shapeRound;
}
public void setShape(Boolean shapeRound)
{
this.shapeRound = shapeRound;
}
@Override @Override
public String toString() public String toString()
{ {
return "radius " + radius + " at X: " + Config.coord.format(x) + " Z: " + Config.coord.format(z); return "radius " + radius + " at X: " + Config.coord.format(x) + " Z: " + Config.coord.format(z) + (shapeRound != null ? (" (shape override: " + (shapeRound.booleanValue() ? "round" : "square") + ")") : "");
} }
// This algorithm of course needs to be fast, since it will be run very frequently // This algorithm of course needs to be fast, since it will be run very frequently
public boolean insideBorder(double xLoc, double zLoc, boolean round) public boolean insideBorder(double xLoc, double zLoc, boolean round)
{ {
// if this border has a shape override set, use it
if (shapeRound != null)
round = shapeRound.booleanValue();
// square border // square border
if (!round) if (!round)
return !(xLoc < minX || xLoc > maxX || zLoc < minZ || zLoc > maxZ); return !(xLoc < minX || xLoc > maxX || zLoc < minZ || zLoc > maxZ);
@ -103,6 +126,10 @@ public class BorderData
public Location correctedPosition(Location loc, boolean round) public Location correctedPosition(Location loc, boolean round)
{ {
// if this border has a shape override set, use it
if (shapeRound != null)
round = shapeRound.booleanValue();
double xLoc = loc.getX(); double xLoc = loc.getX();
double zLoc = loc.getZ(); double zLoc = loc.getZ();
double yLoc = loc.getY(); double yLoc = loc.getY();
@ -159,11 +186,12 @@ public class BorderData
); );
} }
static final private int limTop = 120, limBot = 1;
// find closest safe Y position from the starting position // find closest safe Y position from the starting position
private double getSafeY(World world, int X, int Y, int Z) private double getSafeY(World world, int X, int Y, int Z)
{ {
// Expanding Y search method adapted from Acru's code in the Nether plugin // Expanding Y search method adapted from Acru's code in the Nether plugin
int limTop = 120, limBot = 1;
for(int y1 = Y, y2 = Y; (y1 > limBot) || (y2 < limTop); y1--, y2++){ for(int y1 = Y, y2 = Y; (y1 > limBot) || (y2 < limTop); y1--, y2++){
// Look below. // Look below.

View File

@ -56,9 +56,15 @@ public class Config
Log("Border set. " + BorderDescription(world)); Log("Border set. " + BorderDescription(world));
save(true); save(true);
} }
public static void setBorder(String world, int radius, double x, double z, Boolean shapeRound)
{
setBorder(world, new BorderData(x, z, radius, shapeRound));
}
public static void setBorder(String world, int radius, double x, double z) public static void setBorder(String world, int radius, double x, double z)
{ {
setBorder(world, new BorderData(x, z, radius)); BorderData old = Border(world);
Boolean oldShape = (old == null) ? null : old.getShape();
setBorder(world, new BorderData(x, z, radius, oldShape));
} }
public static void removeBorder(String world) public static void removeBorder(String world)
@ -117,7 +123,7 @@ public class Config
public static void setShape(boolean round) public static void setShape(boolean round)
{ {
shapeRound = round; shapeRound = round;
Log("Set border shape to " + (round ? "round" : "square") + "."); Log("Set default border shape to " + (round ? "round" : "square") + ".");
save(true); save(true);
} }
@ -302,7 +308,8 @@ public class Config
name = ((String)wdata.getKey()).replace("/", "."); name = ((String)wdata.getKey()).replace("/", ".");
ConfigurationNode bord = (ConfigurationNode)wdata.getValue(); ConfigurationNode bord = (ConfigurationNode)wdata.getValue();
BorderData border = new BorderData(bord.getDouble("x", 0), bord.getDouble("z", 0), bord.getInt("radius", 0)); Boolean overrideShape = (Boolean) bord.getProperty("shape-round");
BorderData border = new BorderData(bord.getDouble("x", 0), bord.getDouble("z", 0), bord.getInt("radius", 0), overrideShape);
borders.put(name, border); borders.put(name, border);
LogConfig(BorderDescription(name)); LogConfig(BorderDescription(name));
} }
@ -333,9 +340,13 @@ public class Config
Entry wdata = (Entry)world.next(); Entry wdata = (Entry)world.next();
String name = (String)wdata.getKey(); String name = (String)wdata.getKey();
BorderData bord = (BorderData)wdata.getValue(); BorderData bord = (BorderData)wdata.getValue();
cfg.setProperty("worlds." + name.replace(".", "¨") + ".x", bord.getX()); cfg.setProperty("worlds." + name.replace(".", "¨") + ".x", bord.getX());
cfg.setProperty("worlds." + name.replace(".", "¨") + ".z", bord.getZ()); cfg.setProperty("worlds." + name.replace(".", "¨") + ".z", bord.getZ());
cfg.setProperty("worlds." + name.replace(".", "¨") + ".radius", bord.getRadius()); cfg.setProperty("worlds." + name.replace(".", "¨") + ".radius", bord.getRadius());
if (bord.getShape() != null)
cfg.setProperty("worlds." + name.replace(".", "¨") + ".shape-round", bord.getShape());
} }
cfg.save(); cfg.save();

View File

@ -190,7 +190,7 @@ public class WBCommand implements CommandExecutor
{ {
if (!Config.HasPermission(player, "list")) return true; if (!Config.HasPermission(player, "list")) return true;
sender.sendMessage("Border shape for all worlds is \"" + (Config.ShapeRound() ? "round" : "square") + "\"."); sender.sendMessage("Default border shape for all worlds is \"" + (Config.ShapeRound() ? "round" : "square") + "\".");
Set<String> list = Config.BorderDescriptions(); Set<String> list = Config.BorderDescriptions();
@ -223,7 +223,7 @@ public class WBCommand implements CommandExecutor
} }
if (player != null) if (player != null)
sender.sendMessage("Border shape for all worlds is now set to \"" + (Config.ShapeRound() ? "round" : "square") + "\"."); sender.sendMessage("Default border shape for all worlds is now set to \"" + (Config.ShapeRound() ? "round" : "square") + "\".");
} }
// "getmsg" command from player or console // "getmsg" command from player or console
@ -340,6 +340,57 @@ public class WBCommand implements CommandExecutor
sender.sendMessage("Timer delay set to " + delay + " tick(s). That is roughly " + (delay * 50) + "ms."); sender.sendMessage("Timer delay set to " + delay + " tick(s). That is roughly " + (delay * 50) + "ms.");
} }
// "wshape" command from player or console, world specified
else if (split.length == 3 && split[0].equalsIgnoreCase("wshape"))
{
if (!Config.HasPermission(player, "wshape")) return true;
String world = split[1];
BorderData border = Config.Border(world);
if (border == null)
{
sender.sendMessage("The world you specified (\"" + world + "\") does not have a border set.");
return true;
}
Boolean shape = null;
if (split[2].equalsIgnoreCase("square"))
shape = false;
else if (split[2].equalsIgnoreCase("round"))
shape = true;
border.setShape(shape);
Config.setBorder(world, border);
if (player != null)
sender.sendMessage("Border shape for world \"" + world + "\" is now set to \"" + (shape == null ? "default" : (shape.booleanValue() ? "round" : "square")) + "\".");
}
// "wshape" command from player, using current world
else if (split.length == 2 && split[0].equalsIgnoreCase("wshape") && player != null)
{
if (!Config.HasPermission(player, "wshape")) return true;
String world = player.getWorld().getName();
BorderData border = Config.Border(world);
if (border == null)
{
sender.sendMessage("This world (\"" + world + "\") does not have a border set.");
return true;
}
Boolean shape = null;
if (split[1].equalsIgnoreCase("square"))
shape = false;
else if (split[1].equalsIgnoreCase("round"))
shape = true;
border.setShape(shape);
Config.setBorder(world, border);
sender.sendMessage("Border shape for world \"" + world + "\" is now set to \"" + (shape == null ? "default" : (shape.booleanValue() ? "round" : "square")) + "\".");
}
// we couldn't decipher any known commands, so show help // we couldn't decipher any known commands, so show help
else else
{ {
@ -370,7 +421,7 @@ public class WBCommand implements CommandExecutor
sender.sendMessage(cmdW+" clear" + ChatColor.WHITE + " - remove border for this world."); sender.sendMessage(cmdW+" clear" + ChatColor.WHITE + " - remove border for this world.");
sender.sendMessage(cmd+" clear all" + ChatColor.WHITE + " - remove border for all worlds."); sender.sendMessage(cmd+" clear all" + ChatColor.WHITE + " - remove border for all worlds.");
sender.sendMessage(cmd+" list" + ChatColor.WHITE + " - show border information for all worlds."); sender.sendMessage(cmd+" list" + ChatColor.WHITE + " - show border information for all worlds.");
sender.sendMessage(cmd+" shape " + ChatColor.GREEN + "<round|square>" + ChatColor.WHITE + " - set the border shape."); sender.sendMessage(cmd+" shape " + ChatColor.GREEN + "<round|square>" + ChatColor.WHITE + " - set the default border shape.");
sender.sendMessage(cmd+" knockback " + ChatColor.GREEN + "<distance>" + ChatColor.WHITE + " - how far to move the player back."); sender.sendMessage(cmd+" knockback " + ChatColor.GREEN + "<distance>" + ChatColor.WHITE + " - how far to move the player back.");
if (page == 1) if (page == 1)
sender.sendMessage(cmd+" 2" + ChatColor.WHITE + " - view second page of commands."); sender.sendMessage(cmd+" 2" + ChatColor.WHITE + " - view second page of commands.");
@ -378,6 +429,7 @@ public class WBCommand implements CommandExecutor
if (page == 0 || page == 2) if (page == 0 || page == 2)
{ {
sender.sendMessage(cmd+" wshape " + ((player == null) ? ChatColor.GREEN + "<world>" : ChatColor.DARK_GREEN + "[world]") + ChatColor.GREEN + " <round|square|default>" + ChatColor.WHITE + " - shape override.");
sender.sendMessage(cmd+" getmsg" + ChatColor.WHITE + " - display border message."); sender.sendMessage(cmd+" getmsg" + ChatColor.WHITE + " - display border message.");
sender.sendMessage(cmd+" setmsg " + ChatColor.GREEN + "<text>" + ChatColor.WHITE + " - set border message."); sender.sendMessage(cmd+" setmsg " + ChatColor.GREEN + "<text>" + ChatColor.WHITE + " - set border message.");
sender.sendMessage(cmd+" delay " + ChatColor.GREEN + "<amount>" + ChatColor.WHITE + " - time between border checks."); sender.sendMessage(cmd+" delay " + ChatColor.GREEN + "<amount>" + ChatColor.WHITE + " - time between border checks.");

View File

@ -1,7 +1,7 @@
name: WorldBorder name: WorldBorder
author: Brettflan author: Brettflan
description: Limit the size of your worlds with a border, round or square. description: Efficient, feature-rich plugin for limiting the size of your worlds.
version: 1.1.2 version: 1.2
main: com.wimbli.WorldBorder.WorldBorder main: com.wimbli.WorldBorder.WorldBorder
commands: commands:
wborder: wborder:
@ -15,8 +15,9 @@ commands:
/<command> [world] clear - remove border for this world. /<command> [world] clear - remove border for this world.
/<command> clear all - remove border for all worlds. /<command> clear all - remove border for all worlds.
/<command> list - show border information for all worlds. /<command> list - show border information for all worlds.
/<command> shape <round|square> - set the border shape. /<command> shape <round|square> - set the default border shape.
/<command> getmsg - display border message. /<command> getmsg - display border message.
/<command> setmsg <text> - set border message. /<command> setmsg <text> - set border message.
/<command> knockback <distance> - how far to move the player back. /<command> knockback <distance> - how far to move the player back.
/<command> delay <amount> - time between border checks. /<command> delay <amount> - time between border checks.
/<command> wshape [world] <round|square|default> - override shape.