From dcb815878f3588c8fb13e52f531e70570595e7ed Mon Sep 17 00:00:00 2001 From: Lang Lukas Date: Thu, 14 Feb 2013 10:35:35 +0100 Subject: [PATCH] Added support for rectangular and elliptic borders --- src/com/wimbli/WorldBorder/BorderData.java | 99 ++++++++++++------- src/com/wimbli/WorldBorder/Config.java | 18 ++-- .../wimbli/WorldBorder/DynMapFeatures.java | 8 +- src/com/wimbli/WorldBorder/WBCommand.java | 85 ++++++++-------- src/com/wimbli/WorldBorder/WorldFillTask.java | 14 ++- src/com/wimbli/WorldBorder/WorldTrimTask.java | 3 +- src/plugin.yml | 10 +- src/readme.txt | 42 ++++++++ 8 files changed, 184 insertions(+), 95 deletions(-) create mode 100644 src/readme.txt diff --git a/src/com/wimbli/WorldBorder/BorderData.java b/src/com/wimbli/WorldBorder/BorderData.java index 187e3a9..cba5654 100644 --- a/src/com/wimbli/WorldBorder/BorderData.java +++ b/src/com/wimbli/WorldBorder/BorderData.java @@ -13,7 +13,8 @@ public class BorderData // the main data interacted with private double x = 0; private double z = 0; - private int radius = 0; + private int radiusX = 0; + private int radiusZ = 0; private Boolean shapeRound = null; // some extra data kept handy for faster border checks @@ -21,28 +22,33 @@ public class BorderData private double minX; private double maxZ; private double minZ; - private double radiusSquared; - private double DefiniteSquare; + private double radiusXSquared; + private double radiusZSquared; + private double DefiniteRectangleX; + private double DefiniteRectangleZ; + private double radiusSquaredQuotient; - public BorderData(double x, double z, int radius) + public BorderData(double x, double z, int radiusX, int radiusZ) { - setData(x, z, radius, null); + setData(x, z, radiusX, radiusZ , null); } - public BorderData(double x, double z, int radius, Boolean shapeRound) + public BorderData(double x, double z, int radiusX, int radiusZ, Boolean shapeRound) { - setData(x, z, radius, shapeRound); + setData(x, z, radiusX, radiusZ, shapeRound); } - public final void setData(double x, double z, int radius, Boolean shapeRound) + + public final void setData(double x, double z, int radiusX, int radiusZ, Boolean shapeRound) { this.x = x; this.z = z; this.shapeRound = shapeRound; - this.setRadius(radius); + this.setRadiusX(radiusX); + this.setRadiusZ(radiusZ); } public BorderData copy() { - return new BorderData(x, z, radius, shapeRound); + return new BorderData(x, z, radiusX, radiusZ, shapeRound); } public double getX() @@ -52,8 +58,8 @@ public class BorderData public void setX(double x) { this.x = x; - this.maxX = x + radius; - this.minX = x - radius; + this.maxX = x + radiusX; + this.minX = x - radiusX; } public double getZ() { @@ -62,22 +68,34 @@ public class BorderData public void setZ(double z) { this.z = z; - this.maxZ = z + radius; - this.minZ = z - radius; + this.maxZ = z + radiusZ; + this.minZ = z - radiusZ; } - public int getRadius() + public int getRadiusX() { - return radius; + return radiusX; } - public void setRadius(int radius) + public int getRadiusZ() { - this.radius = radius; - this.maxX = x + radius; - this.minX = x - radius; - this.maxZ = z + radius; - this.minZ = z - radius; - this.radiusSquared = (double)radius * (double)radius; - this.DefiniteSquare = Math.sqrt(.5 * this.radiusSquared); + return radiusZ; + } + public void setRadiusX(int radiusX) + { + this.radiusX = radiusX; + this.maxX = x + radiusX; + this.minX = x - radiusX; + this.radiusXSquared = (double)radiusX * (double)radiusX; + this.radiusSquaredQuotient = this.radiusXSquared / this.radiusZSquared; + this.DefiniteRectangleX = Math.sqrt(.5 * this.radiusXSquared); + } + public void setRadiusZ(int radiusZ) + { + this.radiusZ = radiusZ; + this.maxZ = z + radiusZ; + this.minZ = z - radiusZ; + this.radiusZSquared = (double)radiusZ * (double)radiusZ; + this.radiusSquaredQuotient = this.radiusXSquared / this.radiusZSquared; + this.DefiniteRectangleZ = Math.sqrt(.5 * this.radiusZSquared); } public Boolean getShape() @@ -92,7 +110,7 @@ public class BorderData @Override public String toString() { - return "radius " + radius + " at X: " + Config.coord.format(x) + " Z: " + Config.coord.format(z) + (shapeRound != null ? (" (shape override: " + (shapeRound.booleanValue() ? "round" : "square") + ")") : ""); + return "radius " + radiusX + "-" + radiusZ + " 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 @@ -113,11 +131,11 @@ public class BorderData double X = Math.abs(x - xLoc); double Z = Math.abs(z - zLoc); - if (X < DefiniteSquare && Z < DefiniteSquare) + if (X < DefiniteRectangleX && Z < DefiniteRectangleZ) return true; // Definitely inside - else if (X >= radius || Z >= radius) + else if (X >= radiusX || Z >= radiusZ) //I'm not sure about this one...the chance that a player is totally outside the rectangle around the ellipse is only given if he teleports, and that shouldn't be that frequently return false; // Definitely outside - else if (X * X + Z * Z < radiusSquared) + else if (X * X + Z * Z * radiusSquaredQuotient < radiusXSquared) return true; // After further calculation, inside else return false; // Apparently outside, then @@ -159,11 +177,22 @@ public class BorderData else { // algorithm from: http://stackoverflow.com/questions/300871/best-way-to-find-a-point-on-a-circle-closest-to-a-given-point - double vX = xLoc - x; - double vZ = zLoc - z; - double magV = Math.sqrt(vX*vX + vZ*vZ); - xLoc = x + vX / magV * (radius - Config.KnockBack()); - zLoc = z + vZ / magV * (radius - Config.KnockBack()); + //double vX = xLoc - x; + //double vZ = zLoc - z; + //double magV = Math.sqrt(vX*vX / radiusXSquared + vZ*vZ / radiusZSquared); + //xLoc = x + vX / (radiusX * magV) * (radiusX - Config.KnockBack()); + //zLoc = z + vZ / (radiusZ * magV) * (radiusZ - Config.KnockBack()); + + + //Transform the ellipse to a circle with radius 1 (we need to transform the point the same way) + double dX = xLoc - x; + double dZ = zLoc - z; + double dU = Math.sqrt(dX *dX + dZ * dZ); //distance of the untransformed point from the center + double dT = Math.sqrt(dX *dX / radiusXSquared + dZ * dZ / radiusZSquared); //distance of the transformed point from the center + double f = (1 / dT - Config.KnockBack() / dU); //"correction" factor for the distances + xLoc = x + dX * f; + zLoc = z + dZ * f; + } int ixLoc = Location.locToBlock(xLoc); @@ -244,12 +273,12 @@ public class BorderData return false; BorderData test = (BorderData)obj; - return test.x == this.x && test.z == this.z && test.radius == this.radius; + return test.x == this.x && test.z == this.z && test.radiusX == this.radiusX && test.radiusZ == this.radiusZ; } @Override public int hashCode() { - return (((int)(this.x * 10) << 4) + (int)this.z + (this.radius << 2)); + return (((int)(this.x * 10) << 4) + (int)this.z + (this.radiusX << 2)); } } \ No newline at end of file diff --git a/src/com/wimbli/WorldBorder/Config.java b/src/com/wimbli/WorldBorder/Config.java index 51bbe8b..5a882a5 100644 --- a/src/com/wimbli/WorldBorder/Config.java +++ b/src/com/wimbli/WorldBorder/Config.java @@ -56,15 +56,16 @@ public class Config save(true); DynMapFeatures.showBorder(world, border); } - public static void setBorder(String world, int radius, double x, double z, Boolean shapeRound) + + public static void setBorder(String world, int radiusX, int radiusZ, double x, double z, Boolean shapeRound) { - setBorder(world, new BorderData(x, z, radius, shapeRound)); + setBorder(world, new BorderData(x, z, radiusX, radiusZ, shapeRound)); } - public static void setBorder(String world, int radius, double x, double z) + public static void setBorder(String world, int radiusX, int radiusZ, double x, double z) { BorderData old = Border(world); Boolean oldShape = (old == null) ? null : old.getShape(); - setBorder(world, new BorderData(x, z, radius, oldShape)); + setBorder(world, new BorderData(x, z, radiusX, radiusZ, oldShape)); } public static void removeBorder(String world) @@ -130,7 +131,7 @@ public class Config public static void setShape(boolean round) { shapeRound = round; - Log("Set default border shape to " + (round ? "round" : "square") + "."); + Log("Set default border shape to " + (round ? "elliptic" : "rectangular") + "."); save(true); DynMapFeatures.showAllBorders(); } @@ -361,7 +362,7 @@ public class Config timerTicks = cfg.getInt("timer-delay-ticks", 5); dynmapEnable = cfg.getBoolean("dynmap-border-enabled", true); dynmapMessage = cfg.getString("dynmap-border-message", "The border of the world."); - LogConfig("Using " + (shapeRound ? "round" : "square") + " border, knockback of " + knockBack + " blocks, and timer delay of " + timerTicks + "."); + LogConfig("Using " + (shapeRound ? "elliptic" : "rectangular") + " border, knockback of " + knockBack + " blocks, and timer delay of " + timerTicks + "."); StartBorderTimer(); @@ -389,7 +390,7 @@ public class Config worldName = worldName.replace("<", "."); Boolean overrideShape = (Boolean) bord.get("shape-round"); - BorderData border = new BorderData(bord.getDouble("x", 0), bord.getDouble("z", 0), bord.getInt("radius", 0), overrideShape); + BorderData border = new BorderData(bord.getDouble("x", 0), bord.getDouble("z", 0), bord.getInt("radiusX", 0), bord.getInt("radiusZ", 0), overrideShape); borders.put(worldName, border); LogConfig(BorderDescription(worldName)); } @@ -446,7 +447,8 @@ public class Config cfg.set("worlds." + name + ".x", bord.getX()); cfg.set("worlds." + name + ".z", bord.getZ()); - cfg.set("worlds." + name + ".radius", bord.getRadius()); + cfg.set("worlds." + name + ".radiusX", bord.getRadiusX()); + cfg.set("worlds." + name + ".radiusZ", bord.getRadiusZ()); if (bord.getShape() != null) cfg.set("worlds." + name + ".shape-round", bord.getShape()); diff --git a/src/com/wimbli/WorldBorder/DynMapFeatures.java b/src/com/wimbli/WorldBorder/DynMapFeatures.java index 16f1b25..220d0ae 100644 --- a/src/com/wimbli/WorldBorder/DynMapFeatures.java +++ b/src/com/wimbli/WorldBorder/DynMapFeatures.java @@ -178,7 +178,7 @@ public class DynMapFeatures CircleMarker marker = roundBorders.get(worldName); if (marker == null) { - marker = markSet.createCircleMarker("worldborder_"+worldName, Config.DynmapMessage(), false, worldName, border.getX(), 64.0, border.getZ(), border.getRadius(), border.getRadius(), true); + marker = markSet.createCircleMarker("worldborder_"+worldName, Config.DynmapMessage(), false, worldName, border.getX(), 64.0, border.getZ(), border.getRadiusX(), border.getRadiusZ(), true); marker.setLineStyle(lineWeight, lineOpacity, lineColor); marker.setFillStyle(0.0, 0x000000); roundBorders.put(worldName, marker); @@ -186,7 +186,7 @@ public class DynMapFeatures else { marker.setCenter(worldName, border.getX(), 64.0, border.getZ()); - marker.setRadius(border.getRadius(), border.getRadius()); + marker.setRadius(border.getRadiusX(), border.getRadiusZ()); } } @@ -196,8 +196,8 @@ public class DynMapFeatures removeBorder(worldName); // corners of the square border - double[] xVals = {border.getX() - border.getRadius(), border.getX() + border.getRadius()}; - double[] zVals = {border.getZ() - border.getRadius(), border.getZ() + border.getRadius()}; + double[] xVals = {border.getX() - border.getRadiusX(), border.getX() + border.getRadiusX()}; + double[] zVals = {border.getZ() - border.getRadiusZ(), border.getZ() + border.getRadiusZ()}; AreaMarker marker = squareBorders.get(worldName); if (marker == null) diff --git a/src/com/wimbli/WorldBorder/WBCommand.java b/src/com/wimbli/WorldBorder/WBCommand.java index c31ed92..9eb1cfc 100644 --- a/src/com/wimbli/WorldBorder/WBCommand.java +++ b/src/com/wimbli/WorldBorder/WBCommand.java @@ -71,7 +71,7 @@ public class WBCommand implements CommandExecutor } // "set" command from player or console, world specified - if (split.length == 5 && split[1].equalsIgnoreCase("set")) + if (split.length == 6 && split[1].equalsIgnoreCase("set")) { if (!Config.HasPermission(player, "set")) return true; @@ -84,7 +84,7 @@ public class WBCommand implements CommandExecutor } // "set" command from player, using current world, X and Z specified - else if (split.length == 4 && split[0].equalsIgnoreCase("set") && player != null) + else if (split.length == 5 && split[0].equalsIgnoreCase("set") && player != null) { if (!Config.HasPermission(player, "set")) return true; @@ -95,7 +95,7 @@ public class WBCommand implements CommandExecutor } // "set" command from player, using current world, X and Z NOT specified - else if (split.length == 2 && split[0].equalsIgnoreCase("set") && player != null) + else if (split.length == 3 && split[0].equalsIgnoreCase("set") && player != null) { if (!Config.HasPermission(player, "set")) return true; @@ -103,23 +103,25 @@ public class WBCommand implements CommandExecutor double x = player.getLocation().getX(); double z = player.getLocation().getZ(); - int radius; + int radiusX; + int radiusZ; try { - radius = Integer.parseInt(split[1]); + radiusX = Integer.parseInt(split[1]); + radiusZ = Integer.parseInt(split[2]); } catch(NumberFormatException ex) { - sender.sendMessage(clrErr + "The radius value must be an integer."); + sender.sendMessage(clrErr + "The radius values must be integers."); return true; } - Config.setBorder(world, radius, x, z); + Config.setBorder(world, radiusX, radiusZ, x, z); sender.sendMessage("Border has been set. " + Config.BorderDescription(world)); } // "radius" command from player or console, world specified - else if (split.length == 3 && split[1].equalsIgnoreCase("radius")) + else if (split.length == 4 && split[1].equalsIgnoreCase("radius")) { if (!Config.HasPermission(player, "radius")) return true; @@ -134,25 +136,27 @@ public class WBCommand implements CommandExecutor double x = border.getX(); double z = border.getZ(); - int radius; + int radiusX; + int radiusZ; try { - radius = Integer.parseInt(split[2]); + radiusX = Integer.parseInt(split[2]); + radiusZ = Integer.parseInt(split[3]); } catch(NumberFormatException ex) { - sender.sendMessage(clrErr + "The radius value must be an integer."); + sender.sendMessage(clrErr + "The radius values must be integers."); return true; } - Config.setBorder(world, radius, x, z); + Config.setBorder(world, radiusX, radiusZ, x, z); if (player != null) sender.sendMessage("Radius has been set. " + Config.BorderDescription(world)); } // "radius" command from player, using current world - else if (split.length == 2 && split[0].equalsIgnoreCase("radius") && player != null) + else if (split.length == 3 && split[0].equalsIgnoreCase("radius") && player != null) { if (!Config.HasPermission(player, "radius")) return true; @@ -167,18 +171,20 @@ public class WBCommand implements CommandExecutor double x = border.getX(); double z = border.getZ(); - int radius; + int radiusX; + int radiusZ; try { - radius = Integer.parseInt(split[1]); + radiusX = Integer.parseInt(split[2]); + radiusZ = Integer.parseInt(split[3]); } catch(NumberFormatException ex) { - sender.sendMessage(clrErr + "The radius value must be an integer."); + sender.sendMessage(clrErr + "The radius values must be integers."); return true; } - Config.setBorder(world, radius, x, z); + Config.setBorder(world, radiusX, radiusZ, x, z); sender.sendMessage("Radius has been set. " + Config.BorderDescription(world)); } @@ -234,7 +240,7 @@ public class WBCommand implements CommandExecutor { if (!Config.HasPermission(player, "list")) return true; - sender.sendMessage("Default border shape for all worlds is \"" + (Config.ShapeRound() ? "round" : "square") + "\"."); + sender.sendMessage("Default border shape for all worlds is \"" + (Config.ShapeRound() ? "elliptic" : "rectangular") + "\"."); Set list = Config.BorderDescriptions(); @@ -256,18 +262,18 @@ public class WBCommand implements CommandExecutor { if (!Config.HasPermission(player, "shape")) return true; - if (split[1].equalsIgnoreCase("square")) + if (split[1].equalsIgnoreCase("rectangular")) Config.setShape(false); - else if (split[1].equalsIgnoreCase("round")) + else if (split[1].equalsIgnoreCase("elliptic")) Config.setShape(true); else { - sender.sendMessage("You must specify a shape of \"round\" or \"square\"."); + sender.sendMessage("You must specify a shape of \"elliptic\" or \"rectangular\"."); return true; } if (player != null) - sender.sendMessage("Default 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() ? "elliptic" : "rectangular") + "\"."); } // "getmsg" command from player or console @@ -412,16 +418,16 @@ public class WBCommand implements CommandExecutor } Boolean shape = null; - if (split[2].equalsIgnoreCase("square")) + if (split[2].equalsIgnoreCase("rectangular")) shape = false; - else if (split[2].equalsIgnoreCase("round")) + else if (split[2].equalsIgnoreCase("elliptic")) 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")) + "\"."); + sender.sendMessage("Border shape for world \"" + world + "\" is now set to \"" + (shape == null ? "default" : (shape.booleanValue() ? "elliptic" : "rectangular")) + "\"."); } // "wshape" command from player, using current world @@ -438,15 +444,15 @@ public class WBCommand implements CommandExecutor } Boolean shape = null; - if (split[1].equalsIgnoreCase("square")) + if (split[1].equalsIgnoreCase("rectangular")) shape = false; - else if (split[1].equalsIgnoreCase("round")) + else if (split[1].equalsIgnoreCase("elliptic")) 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")) + "\"."); + sender.sendMessage("Border shape for world \"" + world + "\" is now set to \"" + (shape == null ? "default" : (shape.booleanValue() ? "elliptic" : "rectangular")) + "\"."); } // "fill" command from player or console, world specified @@ -652,13 +658,13 @@ public class WBCommand implements CommandExecutor if (page == 0 || page == 1) { if (player != null) - sender.sendMessage(cmd+" set " + clrReq + "" + clrDesc + " - set world border, centered on you."); - sender.sendMessage(cmdW+" set " + clrReq + " " + clrDesc + " - set world border."); - sender.sendMessage(cmdW+" radius " + clrReq + "" + clrDesc + " - change a border radius."); + sender.sendMessage(cmd+" set " + clrReq + " " + clrDesc + " - set world border, centered on you."); + sender.sendMessage(cmdW+" set " + clrReq + " " + clrDesc + " - set world border."); + sender.sendMessage(cmdW+" radius " + clrReq + " " + clrDesc + " - change a border radius."); sender.sendMessage(cmdW+" clear" + clrDesc + " - remove border for this world."); sender.sendMessage(cmd+" clear all" + clrDesc + " - remove border for all worlds."); sender.sendMessage(cmd+" list" + clrDesc + " - show border information for all worlds."); - sender.sendMessage(cmd+" shape " + clrReq + "" + clrDesc + " - set the default border shape."); + sender.sendMessage(cmd+" shape " + clrReq + "" + clrDesc + " - set the default border shape."); sender.sendMessage(cmd+" knockback " + clrReq + "" + clrDesc + " - how far to move the player back."); if (page == 1) sender.sendMessage(cmd+" 2" + clrDesc + " - view second page of commands."); @@ -668,7 +674,7 @@ public class WBCommand implements CommandExecutor sender.sendMessage(cmdW+" fill " + clrOpt + "[freq] [pad]" + clrDesc + " - generate world out to border."); sender.sendMessage(cmdW+" trim " + clrOpt + "[freq] [pad]" + clrDesc + " - trim world outside of border."); sender.sendMessage(cmd+" bypass " + ((player == null) ? clrReq + "" : clrOpt + "[player]") + clrOpt + " [on/off]" + clrDesc + " - let player go beyond border."); - sender.sendMessage(cmd+" wshape " + ((player == null) ? clrReq + "" : clrOpt + "[world]") + clrReq + " " + clrDesc + " - shape override."); + sender.sendMessage(cmd+" wshape " + ((player == null) ? clrReq + "" : clrOpt + "[world]") + clrReq + " " + clrDesc + " - shape override."); sender.sendMessage(cmd+" getmsg" + clrDesc + " - display border message."); sender.sendMessage(cmd+" setmsg " + clrReq + "" + clrDesc + " - set border message."); sender.sendMessage(cmd+" whoosh " + clrReq + "" + clrDesc + " - turn knockback effect on or off."); @@ -708,21 +714,22 @@ public class WBCommand implements CommandExecutor private boolean cmdSet(CommandSender sender, String world, String[] data, int offset) { - int radius; + int radiusX, radiusZ; double x, z; try { - radius = Integer.parseInt(data[offset]); - x = Double.parseDouble(data[offset+1]); - z = Double.parseDouble(data[offset+2]); + radiusX = Integer.parseInt(data[offset]); + radiusZ = Integer.parseInt(data[offset+1]); + x = Double.parseDouble(data[offset+2]); + z = Double.parseDouble(data[offset+3]); } catch(NumberFormatException ex) { - sender.sendMessage(clrErr + "The radius value must be an integer and the x and z values must be numerical."); + sender.sendMessage(clrErr + "The radius values must be integers and the x and z values must be numerical."); return false; } - Config.setBorder(world, radius, x, z); + Config.setBorder(world, radiusX, radiusZ, x, z); return true; } diff --git a/src/com/wimbli/WorldBorder/WorldFillTask.java b/src/com/wimbli/WorldBorder/WorldFillTask.java index 6e383eb..6e1a654 100644 --- a/src/com/wimbli/WorldBorder/WorldFillTask.java +++ b/src/com/wimbli/WorldBorder/WorldFillTask.java @@ -89,13 +89,21 @@ public class WorldFillTask implements Runnable return; } - this.border.setRadius(border.getRadius() + fillDistance); + this.border.setRadiusX(border.getRadiusX() + fillDistance); + this.border.setRadiusZ(border.getRadiusZ() + fillDistance); this.x = CoordXZ.blockToChunk((int)border.getX()); this.z = CoordXZ.blockToChunk((int)border.getZ()); - int chunkWidth = (int) Math.ceil((double)((border.getRadius() + 16) * 2) / 16); - this.reportTarget = (chunkWidth * chunkWidth) + chunkWidth + 1; + int chunkWidthX = (int) Math.ceil((double)((border.getRadiusX() + 16) * 2) / 16); + int chunkWidthZ = (int) Math.ceil((double)((border.getRadiusZ() + 16) * 2) / 16); + int biggerWidth = (chunkWidthX > chunkWidthZ) ? chunkWidthX : chunkWidthZ; //We need to calculate the reportTarget with the bigger with, since the spiral will only stop if it has a size of biggerWidth x biggerWidth + this.reportTarget = (biggerWidth * biggerWidth) + biggerWidth + 1; + //This would be another way to calculate reportTarget, it assumes that we don't need time to check if the chunk is outside and then skip it (it calculates the area of the rectangle/ellipse) + //this.reportTarget = (this.border.getShape()) ? ((int) Math.ceil(chunkWidthX * chunkWidthZ / 4 * Math.PI + 2 * chunkWidthX)) : (chunkWidthX * chunkWidthZ); + // Area of the ellipse just to be safe area of the rectangle + + // keep track of the chunks which are already loaded when the task starts, to not unload them Chunk[] originals = world.getLoadedChunks(); for (Chunk original : originals) diff --git a/src/com/wimbli/WorldBorder/WorldTrimTask.java b/src/com/wimbli/WorldBorder/WorldTrimTask.java index 83838b4..4604b92 100644 --- a/src/com/wimbli/WorldBorder/WorldTrimTask.java +++ b/src/com/wimbli/WorldBorder/WorldTrimTask.java @@ -64,7 +64,8 @@ public class WorldTrimTask implements Runnable return; } - this.border.setRadius(border.getRadius() + trimDistance); + this.border.setRadiusX(border.getRadiusX() + trimDistance); + this.border.setRadiusZ(border.getRadiusZ() + trimDistance); worldData = WorldFileData.create(world, notifyPlayer); if (worldData == null) diff --git a/src/plugin.yml b/src/plugin.yml index ca9f4f7..886acc6 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -11,19 +11,19 @@ commands: aliases: [worldborder, wb] usage: | / - list available commands (show help). - / set - set world border, centered on you. - / [world] set - set world border. - / [world] radius - change world's border radius. + / set - set world border, centered on you. + / [world] set - set world border. + / [world] radius - change world's border radius. / [world] clear - remove border for this world. / clear all - remove border for all worlds. / list - show border information for all worlds. - / shape - set the default border shape. + / shape - set the default border shape. / getmsg - display border message. / setmsg - set border message. / knockback - how far to move the player back. / whoosh - turn knockback effect on or off. / delay - time between border checks. - / wshape [world] - override shape. + / wshape [world] - override shape. / [world] fill [freq] [pad] - generate world out to border. / [world] trim [freq] [pad] - trim world outside of border. / bypass [player] [on/off] - let player go beyond border. diff --git a/src/readme.txt b/src/readme.txt new file mode 100644 index 0000000..1405e17 --- /dev/null +++ b/src/readme.txt @@ -0,0 +1,42 @@ +The things I changed (I hope I didn't forget anything) + +plugin.yml: + changed the help ( --> ) +BorderCheckTask.java: + nothing +BorderData.java: + added variable radiusZ and renamed radius to radiusX + changed the "handy data for borderChecks" + adapted constructors to accept to radius-values + added set-/getRadiusZ + adapted toString function (it outputs "radiusX-radiusZ", I'm sure there a clearer way) + changed the inside-border-check procedure for the ellipse (I added a comment, explaining why I think you could remove one check) + changed the procedure that calculates the point inside the border the player need to be teleported to + adapted the equals function + adapted the hashCode function (not sure about this one, maybe you could improve it) +Config.java + adapted the setBorder function to accept both radius-values + adapted config-messages (round --> elliptic...) + adapted the config-file-to-border function + adapted the save procedure +CoordXZ.java: + nothing +DynMapFeatures.java: + adapted the showSquareBorder/showRoundBorder +WBCommand.java: + changed all the commands to accept one parameter more (you always have to enter two values) + changed the names of the shapes to rectangular and elliptic + adapted the help ( --> ) + adapted the error messages to speak of two radius-values +WBListener.java: + nothing +WorldBorder.java: + nothing +WorldFileData.java: + nothing +WorldFillTask.java: + adapted calculation of the toFillBorder + changed calculation of reportTarget + added proposal for different method to calculate reportTarget +WorldTrimTask.java: + adapted calculation of the toTrimBorder \ No newline at end of file