diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftChunk.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftChunk.java index db700abfad..592e12033e 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftChunk.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftChunk.java @@ -11,7 +11,7 @@ import org.bukkit.block.Block; import org.bukkit.craftbukkit.block.CraftBlock; public class CraftChunk implements Chunk { - private final net.minecraft.server.Chunk chunk; + private net.minecraft.server.Chunk chunk; private final HashMap cache = new HashMap(); public CraftChunk(net.minecraft.server.Chunk chunk) { @@ -48,4 +48,8 @@ public class CraftChunk implements Chunk { } return block; } + + public void breakLink() { + this.chunk = null; + } } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index 7be7c4586b..2f3fe70563 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -28,6 +28,7 @@ public class CraftWorld implements World { private final Environment environment; private final CraftServer server; private final ChunkProviderServer provider; + private HashMap unloadedChunks = new HashMap(); private static final Random rand = new Random(); @@ -45,6 +46,15 @@ public class CraftWorld implements World { server.addWorld(this); } + public void preserveChunk( CraftChunk chunk ) { + chunk.breakLink(); + unloadedChunks.put( chunk.getX() << 16 + chunk.getZ(), chunk ); + } + + public CraftChunk popPreservedChunk( int x, int z ) { + return unloadedChunks.remove( x << 16 + z ); + } + public Block getBlockAt(int x, int y, int z) { return getChunkAt(x >> 4, z >> 4).getBlock(x & 0xF, y & 0x7F, z & 0xF); }