diff --git a/src/common/me/nallar/patched/storage/ThreadedChunkProvider.java b/src/common/me/nallar/patched/storage/ThreadedChunkProvider.java index d27e857f..573d539e 100644 --- a/src/common/me/nallar/patched/storage/ThreadedChunkProvider.java +++ b/src/common/me/nallar/patched/storage/ThreadedChunkProvider.java @@ -154,7 +154,7 @@ public void tick() { chunkCoordIntPair.chunkXPos = x; chunkCoordIntPair.chunkZPos = z; Chunk chunk = (Chunk) chunks.getValueByKey(key); - if (chunk == null || chunk.partiallyUnloaded) { + if (chunk == null || chunk.partiallyUnloaded || !chunk.queuedUnload) { continue; } if (persistentChunks.containsKey(chunkCoordIntPair) || unloadingChunks.containsItem(key) || playerManager.getOrCreateChunkWatcher(x, z, false) != null || !fireBukkitUnloadEvent(chunk)) { @@ -322,6 +322,17 @@ public boolean unloadChunk(int x, int z) { return unloadStage0.add(hash); } + @Override + @Declare + public void unloadChunkForce(long hash) { + if (unloadStage0.add(hash)) { + Chunk chunk = (Chunk) chunks.getValueByKey(hash); + if (chunk != null) { + chunk.queuedUnload = true; + } + } + } + @Override public void unloadChunksIfNotNearSpawn(int x, int z) { unloadChunk(x, z); @@ -386,7 +397,9 @@ public final Chunk provideChunk(int x, int z) { @Override public final Chunk loadChunk(int x, int z) { - return getChunkAt(x, z, true, false, null); + Chunk chunk = getChunkAt(x, z, true, false, null); + chunk.queuedUnload = false; + return chunk; } @Override diff --git a/src/common/me/nallar/tickthreading/minecraft/ChunkGarbageCollector.java b/src/common/me/nallar/tickthreading/minecraft/ChunkGarbageCollector.java index 6726f68a..ecef0fbc 100644 --- a/src/common/me/nallar/tickthreading/minecraft/ChunkGarbageCollector.java +++ b/src/common/me/nallar/tickthreading/minecraft/ChunkGarbageCollector.java @@ -44,10 +44,10 @@ public static void garbageCollect(WorldServer worldServer) { chunksToUnload.remove(ChunkCoordIntPair.chunkXZ2Int(chunkCoordIntPair.chunkXPos, chunkCoordIntPair.chunkZPos)); } - Set chunksToUnload_ = chunkProvider.getChunksToUnloadSet(); - synchronized (chunksToUnload_) { - chunksToUnload_.addAll(chunksToUnload); + for (long chunk : chunksToUnload) { + chunkProvider.unloadChunkForce(chunk); } + profiler.endSection(); } }