mirror of
https://github.com/neoStudiosLCE/neoLegacy.git
synced 2026-06-24 16:37:02 +00:00
Fix chunk unloading regression from upstream merge
Commit a24318ee changed drop() to immediately remove chunks from cache,
bypassing the deferred m_toDrop save/unload pipeline. This caused missing
chunks on dedicated servers, iterator invalidation in dropAll() and
ServerLevel::save(), and entity duplication (item frames) from chunks
being reloaded without their entities first being removed from the level.
- ServerChunkCache::drop(): restore m_toDrop queue instead of immediate
cache removal, so tick() can save/unload/move to unloadedCache safely
- MultiPlayerChunkCache::drop(): restore soft-unload (keep chunk in cache
with loaded=true) instead of nulling cache and hasData
- PlayerChunkMap::setRadius(): remove dropAll() call when reducing radius,
the per-chunk removal loop already handles out-of-range chunks
This commit is contained in:
parent
3a8106593f
commit
c264262b66
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue