diff --git a/src/main/java/org/dynmap/bukkit/BukkitVersionHelper.java b/src/main/java/org/dynmap/bukkit/BukkitVersionHelper.java index 35ab52ca..90b1faa8 100644 --- a/src/main/java/org/dynmap/bukkit/BukkitVersionHelper.java +++ b/src/main/java/org/dynmap/bukkit/BukkitVersionHelper.java @@ -144,4 +144,8 @@ public abstract class BukkitVersionHelper { * Get world border */ public Polygon getWorldBorder(World world) { return null; } + /** + * Test if broken unloadChunk + */ + public boolean isUnloadChunkBroken() { return false; } } diff --git a/src/main/java/org/dynmap/bukkit/BukkitVersionHelperCB.java b/src/main/java/org/dynmap/bukkit/BukkitVersionHelperCB.java index 78b50f69..89a3d07c 100644 --- a/src/main/java/org/dynmap/bukkit/BukkitVersionHelperCB.java +++ b/src/main/java/org/dynmap/bukkit/BukkitVersionHelperCB.java @@ -33,8 +33,10 @@ public class BukkitVersionHelperCB extends BukkitVersionHelperGeneric { private Method worldbordermaxz; private Method getbiomebyid; private Method getidbybiome; + private boolean isBadUnload = false; BukkitVersionHelperCB() { + isBadUnload = Bukkit.getServer().getBukkitVersion().contains("1.9"); } @Override protected String getNMSPackage() { @@ -314,5 +316,10 @@ public class BukkitVersionHelperCB extends BukkitVersionHelperGeneric { } return super.getBiomeBaseID(bb); } + /** + * Test if broken unloadChunk + */ + @Override + public boolean isUnloadChunkBroken() { return isBadUnload; } } diff --git a/src/main/java/org/dynmap/bukkit/NewMapChunkCache.java b/src/main/java/org/dynmap/bukkit/NewMapChunkCache.java index 9e343713..9494635a 100644 --- a/src/main/java/org/dynmap/bukkit/NewMapChunkCache.java +++ b/src/main/java/org/dynmap/bukkit/NewMapChunkCache.java @@ -878,7 +878,13 @@ public class NewMapChunkCache extends MapChunkCache { * by the MC base server is 21x21 (or about a 160 block radius). * Also, if we did generate it, need to save it */ if (w.isChunkInUse(chunk.x, chunk.z) == false) { - helper.unloadChunkNoSave(w, c, chunk.x, chunk.z); + if (helper.isUnloadChunkBroken()) { + // Give up on broken unloadChunk API - lets see if this works + w.unloadChunkRequest(chunk.x, chunk.z); + } + else { + helper.unloadChunkNoSave(w, c, chunk.x, chunk.z); + } } endChunkLoad(startTime, ChunkStats.UNLOADED_CHUNKS); }