WorldProvider subsystem no longer depends on Chunk

Instead, it provides the data needed to construct the chunk, which doesn't require the provider to be aware of anywhere near as much logic.
This commit is contained in:
Dylan K. Taylor
2023-05-29 17:44:00 +01:00
parent d57954dff0
commit a49842278a
8 changed files with 39 additions and 32 deletions

View File

@ -1400,10 +1400,11 @@ class World implements ChunkManager{
foreach($this->chunks as $chunkHash => $chunk){
self::getXZ($chunkHash, $chunkX, $chunkZ);
$this->provider->saveChunk($chunkX, $chunkZ, new ChunkData(
$chunk,
$chunk->getSubChunks(),
$chunk->isPopulated(),
array_map(fn(Entity $e) => $e->saveNBT(), array_filter($this->getChunkEntities($chunkX, $chunkZ), fn(Entity $e) => $e->canSaveWithChunk())),
array_map(fn(Tile $t) => $t->saveNBT(), $chunk->getTiles()),
));
), $chunk->getTerrainDirtyFlags());
$chunk->clearTerrainDirtyFlags();
}
}finally{
@ -2717,7 +2718,8 @@ class World implements ChunkManager{
return null;
}
$chunk = $loadedChunkData->getData()->getChunk();
$chunkData = $loadedChunkData->getData();
$chunk = new Chunk($chunkData->getSubChunks(), $chunkData->isPopulated());
if(!$loadedChunkData->isUpgraded()){
$chunk->clearTerrainDirtyFlags();
}else{
@ -2726,7 +2728,7 @@ class World implements ChunkManager{
$this->chunks[$chunkHash] = $chunk;
unset($this->blockCache[$chunkHash]);
$this->initChunk($x, $z, $loadedChunkData->getData());
$this->initChunk($x, $z, $chunkData);
(new ChunkLoadEvent($this, $x, $z, $this->chunks[$chunkHash], false))->call();
@ -2853,10 +2855,11 @@ class World implements ChunkManager{
$this->timings->syncChunkSave->startTiming();
try{
$this->provider->saveChunk($x, $z, new ChunkData(
$chunk,
$chunk->getSubChunks(),
$chunk->isPopulated(),
array_map(fn(Entity $e) => $e->saveNBT(), array_filter($this->getChunkEntities($x, $z), fn(Entity $e) => $e->canSaveWithChunk())),
array_map(fn(Tile $t) => $t->saveNBT(), $chunk->getTiles()),
));
), $chunk->getTerrainDirtyFlags());
}finally{
$this->timings->syncChunkSave->stopTiming();
}