aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/MultiPlayerChunkCache.cpp
diff options
context:
space:
mode:
authorModMaker101 <119018978+ModMaker101@users.noreply.github.com>2026-03-25 00:25:18 -0400
committerGitHub <noreply@github.com>2026-03-24 23:25:18 -0500
commita24318eedc44af2f5967c4727b7ebf578b8e233a (patch)
tree90edf89155728ed68f2192109b7b542ef526f26e /Minecraft.Client/MultiPlayerChunkCache.cpp
parent993052409a2ff6c997aea77f8f8fe143d08f5993 (diff)
Memory leak fix: Make chunks unload properly (#1406)main
* Fix chunk unload and cleanup logic, fixes #1347 * Applying formatting to code I edited 😝
Diffstat (limited to 'Minecraft.Client/MultiPlayerChunkCache.cpp')
-rw-r--r--Minecraft.Client/MultiPlayerChunkCache.cpp25
1 files changed, 16 insertions, 9 deletions
diff --git a/Minecraft.Client/MultiPlayerChunkCache.cpp b/Minecraft.Client/MultiPlayerChunkCache.cpp
index 62361ce3..03c47fcc 100644
--- a/Minecraft.Client/MultiPlayerChunkCache.cpp
+++ b/Minecraft.Client/MultiPlayerChunkCache.cpp
@@ -139,19 +139,26 @@ bool MultiPlayerChunkCache::reallyHasChunk(int x, int z)
return hasData[idx];
}
-void MultiPlayerChunkCache::drop(int x, int z)
+void MultiPlayerChunkCache::drop(const int x, const int z)
{
- // 4J Stu - We do want to drop any entities in the chunks, especially for the case when a player is dead as they will
- // not get the RemoveEntity packet if an entity is removed.
- LevelChunk *chunk = getChunk(x, z);
- if (!chunk->isEmpty())
+ const int ix = x + XZOFFSET;
+ const int iz = z + XZOFFSET;
+ if ((ix < 0) || (ix >= XZSIZE)) return;
+ if ((iz < 0) || (iz >= XZSIZE)) return;
+ const int idx = ix * XZSIZE + iz;
+ LevelChunk* chunk = cache[idx];
+
+ if (chunk != nullptr && !chunk->isEmpty())
{
- // Added parameter here specifies that we don't want to delete tile entities, as they won't get recreated unless they've got update packets
- // The tile entities are in general only created on the client by virtue of the chunk rebuild
+ // Unload chunk but keep tile entities
chunk->unload(false);
- // 4J - We just want to clear out the entities in the chunk, but everything else should be valid
- chunk->loaded = true;
+ const auto it = std::find(loadedChunkList.begin(), loadedChunkList.end(), chunk);
+ if (it != loadedChunkList.end()) loadedChunkList.erase(it);
+
+ cache[idx] = nullptr;
+ hasData[idx] = false;
+ chunk->loaded = false;
}
}