diff --git a/Minecraft.Client/MultiPlayerChunkCache.cpp b/Minecraft.Client/MultiPlayerChunkCache.cpp index 03c47fcc..3db51cf3 100644 --- a/Minecraft.Client/MultiPlayerChunkCache.cpp +++ b/Minecraft.Client/MultiPlayerChunkCache.cpp @@ -150,15 +150,14 @@ void MultiPlayerChunkCache::drop(const int x, const int z) if (chunk != nullptr && !chunk->isEmpty()) { - // Unload chunk but keep tile entities + // Drop 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. + // Don't delete tile entities, as they won't get recreated unless they've got + // update packets. Tile entities are created on the client by the chunk rebuild. chunk->unload(false); - 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; + // Keep chunk in cache with structural data intact. + chunk->loaded = true; } } diff --git a/Minecraft.Client/PlayerChunkMap.cpp b/Minecraft.Client/PlayerChunkMap.cpp index ddf2bae2..d8d73f09 100644 --- a/Minecraft.Client/PlayerChunkMap.cpp +++ b/Minecraft.Client/PlayerChunkMap.cpp @@ -824,11 +824,6 @@ void PlayerChunkMap::setRadius(int newRadius) } } - if (newRadius < radius) - { - level->cache->dropAll(); - } - assert(radius <= MAX_VIEW_DISTANCE); assert(radius >= MIN_VIEW_DISTANCE); this->radius = newRadius; diff --git a/Minecraft.Client/ServerChunkCache.cpp b/Minecraft.Client/ServerChunkCache.cpp index 54312ffa..1fcaf384 100644 --- a/Minecraft.Client/ServerChunkCache.cpp +++ b/Minecraft.Client/ServerChunkCache.cpp @@ -91,11 +91,7 @@ void ServerChunkCache::drop(const int x, const int z) if (chunk != nullptr) { - const auto it = std::find(m_loadedChunkList.begin(), m_loadedChunkList.end(), chunk); - if (it != m_loadedChunkList.end()) m_loadedChunkList.erase(it); - - cache[idx] = nullptr; - chunk->loaded = false; + m_toDrop.push_back(chunk); } }