From 59d5bfe6d1ccfc4fa03977a5b27b708e7732ace7 Mon Sep 17 00:00:00 2001 From: TheMode Date: Tue, 12 Apr 2022 23:55:17 +0200 Subject: [PATCH] Invalidate ChunkCache on unload Signed-off-by: TheMode --- .../minestom/server/utils/chunk/ChunkCache.java | 3 ++- .../instance/InstanceBlockIntegrationTest.java | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minestom/server/utils/chunk/ChunkCache.java b/src/main/java/net/minestom/server/utils/chunk/ChunkCache.java index 673944453..022b8b48e 100644 --- a/src/main/java/net/minestom/server/utils/chunk/ChunkCache.java +++ b/src/main/java/net/minestom/server/utils/chunk/ChunkCache.java @@ -32,7 +32,8 @@ public final class ChunkCache implements Block.Getter { Chunk chunk = this.chunk; final int chunkX = getChunkCoordinate(x); final int chunkZ = getChunkCoordinate(z); - if (chunk == null || chunk.getChunkX() != chunkX || chunk.getChunkZ() != chunkZ) { + if (chunk == null || !chunk.isLoaded() || + chunk.getChunkX() != chunkX || chunk.getChunkZ() != chunkZ) { this.chunk = chunk = this.instance.getChunk(chunkX, chunkZ); } if (chunk != null) { diff --git a/src/test/java/net/minestom/server/instance/InstanceBlockIntegrationTest.java b/src/test/java/net/minestom/server/instance/InstanceBlockIntegrationTest.java index 50ca6a75f..2daf34500 100644 --- a/src/test/java/net/minestom/server/instance/InstanceBlockIntegrationTest.java +++ b/src/test/java/net/minestom/server/instance/InstanceBlockIntegrationTest.java @@ -31,4 +31,20 @@ public class InstanceBlockIntegrationTest { instance.loadChunk(1, 0).join(); assertEquals(Block.AIR, instance.getBlock(16, 50, 0)); } + + @Test + public void unloadCache(Env env) { + var instance = env.createFlatInstance(); + instance.loadChunk(0, 0).join(); + + instance.setBlock(0, 50, 0, Block.GRASS); + assertEquals(Block.GRASS, instance.getBlock(0, 50, 0)); + + instance.unloadChunk(0, 0); + assertThrows(NullPointerException.class, () -> instance.getBlock(0, 0, 0), + "No exception throw when getting a block in an unloaded chunk"); + + instance.loadChunk(0, 0).join(); + assertEquals(Block.AIR, instance.getBlock(0, 50, 0)); + } }