From 1a1cbab798f802cf81d0968bf019a26cdc10a621 Mon Sep 17 00:00:00 2001 From: Tobias Ottenweller Date: Mon, 10 Jun 2013 12:09:37 +0200 Subject: [PATCH] World generation is not working correctly. --- .../borderprotection/borders/Border.java | 17 +++++- .../borderprotection/borders/CircBorder.java | 14 ++--- .../borderprotection/borders/RectBorder.java | 31 +++------- .../borderprotection/util/ChunkGenerator.java | 59 ++----------------- 4 files changed, 32 insertions(+), 89 deletions(-) diff --git a/src/main/java/de/craftinc/borderprotection/borders/Border.java b/src/main/java/de/craftinc/borderprotection/borders/Border.java index 151342c..f3f2b09 100644 --- a/src/main/java/de/craftinc/borderprotection/borders/Border.java +++ b/src/main/java/de/craftinc/borderprotection/borders/Border.java @@ -71,7 +71,19 @@ public abstract class Border * @param l Location to check if inside the border * @return null if l is inside the border otherwise a new Location which is inside */ - public abstract Location checkBorder( Location l ); + public Location checkBorder( Location l ) + { + return checkBorder(l, 0.0); + } + + /** + * Checks if the given location is inside or outside the border. If it is outside a new location (inside the border) + * is returned, otherwise null. Applies padding to the border. (Simulates a larger border using padding.) + * @param l Location to check if inside the border + * @param padding number of Blocks of padding applied to the border. + * @return null if l is inside the border otherwise a new Location which is inside + */ + public abstract Location checkBorder (Location l, double padding); /** * Returns an array of two Location objects defining a rectangle bigger or at size of the border. There are no @@ -79,8 +91,6 @@ public abstract class Border */ public abstract Location[] getSurroundingRect(); - public abstract Location getCenter(); - public Boolean isActive() { return isActive; @@ -105,6 +115,7 @@ public abstract class Border isActive = true; } + @SuppressWarnings("unused") public static void loadBorders() { bordersFileConf.getList(bordersKey); diff --git a/src/main/java/de/craftinc/borderprotection/borders/CircBorder.java b/src/main/java/de/craftinc/borderprotection/borders/CircBorder.java index 87022e3..74ffa9a 100644 --- a/src/main/java/de/craftinc/borderprotection/borders/CircBorder.java +++ b/src/main/java/de/craftinc/borderprotection/borders/CircBorder.java @@ -93,13 +93,15 @@ public class CircBorder extends Border implements ConfigurationSerializable } @Override - public Location checkBorder( Location l ) + public Location checkBorder( Location l, double padding ) { + double paddedRadius = radius + padding; + double distX = l.getX() - center.getX(); double distZ = l.getZ() - center.getZ(); double distanceFromCenterSquared = distX * distX + distZ * distZ; - double radiusSquared = radius * radius; + double radiusSquared = paddedRadius * paddedRadius; // inside the border if ( distanceFromCenterSquared <= radiusSquared ) @@ -108,7 +110,7 @@ public class CircBorder extends Border implements ConfigurationSerializable } // outside the border: it's ok to use square-root function here, because this only happens very few times - double ratio = radius / Math.sqrt(distanceFromCenterSquared); + double ratio = paddedRadius / Math.sqrt(distanceFromCenterSquared); double newX = center.getX() + ( ratio * distX ); double newZ = center.getZ() + ( ratio * distZ ); @@ -129,10 +131,4 @@ public class CircBorder extends Border implements ConfigurationSerializable return new Location[]{ l1, l2 }; } - - @Override - public Location getCenter() - { - return center; - } } \ No newline at end of file diff --git a/src/main/java/de/craftinc/borderprotection/borders/RectBorder.java b/src/main/java/de/craftinc/borderprotection/borders/RectBorder.java index a17fa28..898c6b3 100644 --- a/src/main/java/de/craftinc/borderprotection/borders/RectBorder.java +++ b/src/main/java/de/craftinc/borderprotection/borders/RectBorder.java @@ -21,7 +21,6 @@ import de.craftinc.borderprotection.Plugin; import de.craftinc.borderprotection.util.PlayerMovementUtil; import org.bukkit.ChatColor; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.configuration.serialization.ConfigurationSerializable; import java.util.HashMap; @@ -108,22 +107,16 @@ public class RectBorder extends Border implements ConfigurationSerializable ChatColor.YELLOW + "Point 2: " + ChatColor.WHITE + rectPoint2.getX() + "," + rectPoint2.getZ(); } - /** - * Checks if the given location is inside the rectBorder rectangle. Returns null if yes, otherwise new coordinates. - * - * @param l location to check - * @return null if the player is inside, otherwise a new player location - */ @Override - public Location checkBorder( Location l ) + public Location checkBorder( Location l, double padding ) { // New x and z: null by default Double[] newXZ = { null, null }; // check if player is withing the X borders - newXZ[0] = _checkBorder(l.getX(), this.rectPoint1.getX(), this.rectPoint2.getX()); + newXZ[0] = _checkBorder(l.getX(), this.rectPoint1.getX(), this.rectPoint2.getX(), padding); // check if player is withing the Z borders - newXZ[1] = _checkBorder(l.getZ(), this.rectPoint1.getZ(), this.rectPoint2.getZ()); + newXZ[1] = _checkBorder(l.getZ(), this.rectPoint1.getZ(), this.rectPoint2.getZ(), padding); // Do nothing, if no new coordinates have been calculated. if ( newXZ[0] == null && newXZ[1] == null ) @@ -151,12 +144,13 @@ public class RectBorder extends Border implements ConfigurationSerializable * @param location part of the location coordinates * @param border1 one side of the rectangle * @param border2 opposite side of the rectangle + * @param padding a padding (number of block) used to enlarge the border * @return null if the location is inside, otherwise a new location */ - private static Double _checkBorder( double location, double border1, double border2 ) + private static Double _checkBorder( double location, double border1, double border2, double padding ) { - double bigBorder = Math.max(border1, border2); - double smallBorder = Math.min(border1, border2); + double bigBorder = Math.max(border1, border2) + padding; + double smallBorder = Math.min(border1, border2) - padding; // if location is between borders do nothing if ( location >= smallBorder && location <= bigBorder ) @@ -187,15 +181,4 @@ public class RectBorder extends Border implements ConfigurationSerializable { return new Location[]{ rectPoint1, rectPoint2 }; } - - @Override - public Location getCenter() - { - World w = rectPoint1.getWorld(); - double x = Math.abs(rectPoint1.getX() - rectPoint2.getX()) / 2.0 + Math.min(rectPoint1.getX(), rectPoint2.getX()); - double y = rectPoint1.getY(); - double z = Math.abs(rectPoint1.getZ() - rectPoint2.getZ()) / 2.0 + Math.min(rectPoint1.getZ(), rectPoint2.getZ()); - - return new Location(w, x, y, z); - } } diff --git a/src/main/java/de/craftinc/borderprotection/util/ChunkGenerator.java b/src/main/java/de/craftinc/borderprotection/util/ChunkGenerator.java index 59ce0f4..c9ce914 100644 --- a/src/main/java/de/craftinc/borderprotection/util/ChunkGenerator.java +++ b/src/main/java/de/craftinc/borderprotection/util/ChunkGenerator.java @@ -190,61 +190,14 @@ public class ChunkGenerator protected static boolean chunkIsInsideBorder(int x, int z, World w, Border b) { -// double xLoc = (double)(x << 4); -// double yLoc = 100.0; -// double yLoc = 0.0; -// double zLoc = (double)(z << 4); -// -// Location center = b.getCenter(); -// double centerX = center.getX(); -// double centerZ = center.getZ(); -// -// double padding = paddingChunksAroundBorder << 4; -// -// if (Math.abs(xLoc) < padding) -// { -// xLoc = centerX; -// } -// else -// { -// xLoc = centerX < xLoc ? xLoc-padding : xLoc+padding; -// xLoc = centerX < xLoc ? xLoc-padding : xLoc+padding; -// } -// -// if (Math.abs(zLoc) < padding) -// { -// zLoc = centerZ; -// } -// else -// { -// zLoc = centerZ < zLoc ? zLoc-padding : zLoc+padding; -// zLoc = centerZ < zLoc ? zLoc-padding : zLoc+padding; -// } -// -// Location chunkLocation = new Location(w, xLoc, yLoc, zLoc); -// return b.checkBorder(chunkLocation) == null; -// + double xLoc = (double)(x << 4) + 8.0; + double yLoc = 0.0; + double zLoc = (double)(z << 4) + 8.0; - // make the location to check the length of 'paddingChunksAroundBorder' closer to center of the border - Location center = b.getCenter(); - double vecX = center.getX() - (x << 4); - double vecZ = center.getZ() - (z << 4); - double length = Math.sqrt(vecX*vecX + vecZ*vecZ); + double padding = (double)(paddingChunksAroundBorder << 4); + Location l = new Location(w, xLoc, yLoc, zLoc); - double padding = paddingChunksAroundBorder << 4; - - if (Math.abs(length) < padding) - { - vecX = vecZ = 0.0; // avoid 'crossing' the center of the border - } - else - { - vecX -= vecX / length * padding; - vecZ -= vecZ / length * padding; - } - - Location locationMinusPadding = new Location(w, center.getX()+vecX, 0.0, center.getZ()+vecZ); - return b.checkBorder(locationMinusPadding) == null; + return b.checkBorder(l, padding) == null; } protected static void loadSurroundingChunks(int x, int z, World w)