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