diff --git a/pom.xml b/pom.xml
index c84f63ec..206f7f27 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.wimbli.WorldBorder
WorldBorder
- 1.8.2_dev
+ 1.8.4_dev
WorldBorder
https://github.com/Brettflan/WorldBorder
diff --git a/src/main/java/com/wimbli/WorldBorder/BorderData.java b/src/main/java/com/wimbli/WorldBorder/BorderData.java
index 325189cc..7249bad4 100644
--- a/src/main/java/com/wimbli/WorldBorder/BorderData.java
+++ b/src/main/java/com/wimbli/WorldBorder/BorderData.java
@@ -5,6 +5,7 @@
import org.bukkit.Chunk;
import org.bukkit.Location;
+import org.bukkit.Material;
import org.bukkit.World;
@@ -275,9 +276,52 @@ else if (zLoc >= maxZ)
if (!tChunk.isLoaded())
tChunk.load();
+ double originalY = yLoc;
+
yLoc = getSafeY(loc.getWorld(), ixLoc, Location.locToBlock(yLoc), izLoc, flying);
if (yLoc == -1)
- return null;
+ {
+ int searchArea = Config.getSearchArea();
+ for (int cX = ixLoc - searchArea; cX <= ixLoc + searchArea; ++cX) {
+ for (int cZ = izLoc - searchArea; cZ <= izLoc + searchArea; ++cZ) {
+ if (cX == ixLoc && cZ == izLoc)
+ continue; // Skips the block that was already checked
+
+ if (insideBorder(new CoordXZ(cX, cZ)))
+ continue;
+
+ ixLoc = cX;
+ izLoc = cZ;
+
+
+ // Make sure the chunk we're checking in is actually loaded
+ tChunk = loc.getWorld().getChunkAt(CoordXZ.blockToChunk(ixLoc), CoordXZ.blockToChunk(izLoc));
+ if (!tChunk.isLoaded())
+ tChunk.load();
+
+ yLoc = getSafeY(loc.getWorld(), ixLoc, Location.locToBlock(yLoc), izLoc, flying);
+ if (yLoc != -1) {
+ xLoc = cX;
+ zLoc = cZ;
+ ixLoc = Location.locToBlock(xLoc);
+ izLoc = Location.locToBlock(zLoc);
+ break;
+ }
+ }
+ }
+
+ if (yLoc == -1)
+ {
+ if (Config.getFixTpTarget()) {
+ loc.getWorld().getBlockAt(ixLoc, Location.locToBlock(originalY) - 1, izLoc).setType(Material.STONE);
+ loc.getWorld().getBlockAt(ixLoc, Location.locToBlock(originalY), izLoc).setType(Material.AIR);
+ loc.getWorld().getBlockAt(ixLoc, Location.locToBlock(originalY) + 1, izLoc).setType(Material.AIR);
+ return new Location(loc.getWorld(), Math.floor(xLoc) + 0.5, originalY, Math.floor(zLoc) + 0.5, loc.getYaw(), loc.getPitch());
+ }
+ return null;
+ }
+ return new Location(loc.getWorld(), Math.floor(xLoc) + 0.5, yLoc, Math.floor(zLoc) + 0.5, loc.getYaw(), loc.getPitch());
+ }
return new Location(loc.getWorld(), Math.floor(xLoc) + 0.5, yLoc, Math.floor(zLoc) + 0.5, loc.getYaw(), loc.getPitch());
}
diff --git a/src/main/java/com/wimbli/WorldBorder/Config.java b/src/main/java/com/wimbli/WorldBorder/Config.java
index 5a6216aa..2ee7974b 100644
--- a/src/main/java/com/wimbli/WorldBorder/Config.java
+++ b/src/main/java/com/wimbli/WorldBorder/Config.java
@@ -55,6 +55,8 @@ public class Config
private static int fillAutosaveFrequency = 30;
private static int fillMemoryTolerance = 500;
private static boolean preventBlockPlace = false;
+ private static int searchArea = 0;
+ private static boolean fixTpTarget = false;
// for monitoring plugin efficiency
// public static long timeUsed = 0;
@@ -283,6 +285,16 @@ public static boolean getDenyEnderpearl()
return denyEnderpearl;
}
+ public static boolean getFixTpTarget()
+ {
+ return fixTpTarget;
+ }
+
+ public static int getSearchArea()
+ {
+ return searchArea;
+ }
+
public static void setDenyEnderpearl(boolean enable)
{
denyEnderpearl = enable;
@@ -580,6 +592,8 @@ public static void load(WorldBorder master, boolean logIt)
importBypassStringList(cfg.getStringList("bypass-list-uuids"));
fillMemoryTolerance = cfg.getInt("fill-memory-tolerance", 500);
preventBlockPlace = cfg.getBoolean("prevent-block-place");
+ searchArea = cfg.getInt("search-area", 0);
+ fixTpTarget = cfg.getBoolean("fix-tp-target");
StartBorderTimer();
@@ -687,6 +701,8 @@ public static void save(boolean logIt, boolean storeFillTask)
cfg.set("bypass-list-uuids", exportBypassStringList());
cfg.set("fill-memory-tolerance", fillMemoryTolerance);
cfg.set("prevent-block-place", preventBlockPlace);
+ cfg.set("search-area", searchArea);
+ cfg.set("fix-tp-target", fixTpTarget);
cfg.set("worlds", null);
for(Entry stringBorderDataEntry : borders.entrySet())
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index 05fb0ae5..e794a86f 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -1,7 +1,7 @@
name: WorldBorder
author: Brettflan
description: Efficient, feature-rich plugin for limiting the size of your worlds.
-version: 1.8.1
+version: 1.8.4
main: com.wimbli.WorldBorder.WorldBorder
softdepend:
- dynmap