From ce5e663a733d06efad274078febd998d91ad5374 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 29 May 2023 17:22:39 +0100 Subject: [PATCH] Assume chunks are dirty by default having them be clean by default makes no sense. It only makes sense for them to be clean if they were loaded directly from disk without any alterations. Default clean is a footgun. --- src/world/World.php | 8 +++++++- src/world/format/Chunk.php | 2 +- src/world/format/io/leveldb/LevelDB.php | 12 +----------- src/world/generator/PopulationTask.php | 2 -- 4 files changed, 9 insertions(+), 15 deletions(-) diff --git a/src/world/World.php b/src/world/World.php index 6942b732f..b6da5e95d 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -2717,7 +2717,13 @@ class World implements ChunkManager{ return null; } - $this->chunks[$chunkHash] = $loadedChunkData->getData()->getChunk(); + $chunk = $loadedChunkData->getData()->getChunk(); + if(!$loadedChunkData->isUpgraded()){ + $chunk->clearTerrainDirtyFlags(); + }else{ + $this->logger->debug("Chunk $x $z has been upgraded, will be saved at the next autosave opportunity"); + } + $this->chunks[$chunkHash] = $chunk; unset($this->blockCache[$chunkHash]); $this->initChunk($x, $z, $loadedChunkData->getData()); diff --git a/src/world/format/Chunk.php b/src/world/format/Chunk.php index 1a48205a5..fdf8089d2 100644 --- a/src/world/format/Chunk.php +++ b/src/world/format/Chunk.php @@ -44,7 +44,7 @@ class Chunk{ public const COORD_BIT_SIZE = SubChunk::COORD_BIT_SIZE; public const COORD_MASK = SubChunk::COORD_MASK; - private int $terrainDirtyFlags = 0; + private int $terrainDirtyFlags = ~0; protected ?bool $lightPopulated = false; protected bool $terrainPopulated = false; diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 17d0770b3..5f89800cc 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -695,18 +695,8 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ //TODO: tile ticks, biome states (?) - $chunk = new Chunk( - $subChunks, - $terrainPopulated - ); - - if($hasBeenUpgraded){ - $logger->debug("Flagging chunk as dirty due to upgraded data"); - $chunk->setTerrainDirty(); //trigger rewriting chunk to disk if it was converted from an older format - } - return new LoadedChunkData( - data: new ChunkData($chunk, $entities, $tiles), + data: new ChunkData(new Chunk($subChunks, $terrainPopulated), $entities, $tiles), upgraded: $hasBeenUpgraded, fixerFlags: LoadedChunkData::FIXER_FLAG_ALL //TODO: fill this by version rather than just setting all flags ); diff --git a/src/world/generator/PopulationTask.php b/src/world/generator/PopulationTask.php index e7e2b407c..7e077f141 100644 --- a/src/world/generator/PopulationTask.php +++ b/src/world/generator/PopulationTask.php @@ -117,8 +117,6 @@ class PopulationTask extends AsyncTask{ if($chunk === null){ throw new AssumptionFailedError("We just set this chunk, so it must exist"); } - $chunk->setTerrainDirtyFlag(Chunk::DIRTY_FLAG_BLOCKS, true); - $chunk->setTerrainDirtyFlag(Chunk::DIRTY_FLAG_BIOMES, true); } return $chunk; }