diff --git a/src/world/World.php b/src/world/World.php index 282767e76..d5bca0195 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -2145,12 +2145,13 @@ class World implements ChunkManager{ } } - public function generateChunkCallback(int $x, int $z, ?Chunk $chunk) : void{ + /** + * @param Chunk[] $adjacentChunks + * @phpstan-param array $adjacentChunks + */ + public function generateChunkCallback(int $x, int $z, Chunk $chunk, array $adjacentChunks) : void{ Timings::$generationCallback->startTiming(); if(isset($this->chunkPopulationRequestMap[$index = World::chunkHash($x, $z)]) && isset($this->activeChunkPopulationTasks[$index])){ - if($chunk === null){ - throw new AssumptionFailedError("Primary chunk should never be NULL"); - } for($xx = -1; $xx <= 1; ++$xx){ for($zz = -1; $zz <= 1; ++$zz){ $this->unlockChunk($x + $xx, $z + $zz); @@ -2159,6 +2160,12 @@ class World implements ChunkManager{ $oldChunk = $this->loadChunk($x, $z); $this->setChunk($x, $z, $chunk, false); + + foreach($adjacentChunks as $adjacentChunkHash => $adjacentChunk){ + World::getXZ($adjacentChunkHash, $xAdjacentChunk, $zAdjacentChunk); + $this->setChunk($xAdjacentChunk, $zAdjacentChunk, $adjacentChunk); + } + if(($oldChunk === null or !$oldChunk->isPopulated()) and $chunk->isPopulated()){ (new ChunkPopulateEvent($this, $x, $z, $chunk))->call(); @@ -2172,14 +2179,6 @@ class World implements ChunkManager{ $promise->resolve($chunk); $this->drainPopulationRequestQueue(); - }elseif($this->isChunkLocked($x, $z)){ - $this->unlockChunk($x, $z); - if($chunk !== null){ - $this->setChunk($x, $z, $chunk, false); - } - $this->drainPopulationRequestQueue(); - }elseif($chunk !== null){ - $this->setChunk($x, $z, $chunk, false); } Timings::$generationCallback->stopTiming(); } diff --git a/src/world/generator/PopulationTask.php b/src/world/generator/PopulationTask.php index 2cd68ebde..0237a8cc0 100644 --- a/src/world/generator/PopulationTask.php +++ b/src/world/generator/PopulationTask.php @@ -153,6 +153,7 @@ class PopulationTask extends AsyncTask{ FastChunkSerializer::deserializeTerrain($this->chunk) : throw new AssumptionFailedError("Center chunk should never be null"); + $adjacentChunks = []; for($i = 0; $i < 9; ++$i){ if($i === 4){ continue; @@ -162,12 +163,11 @@ class PopulationTask extends AsyncTask{ $xx = -1 + $i % 3; $zz = -1 + intdiv($i, 3); - $c = FastChunkSerializer::deserializeTerrain($c); - $world->generateChunkCallback($this->chunkX + $xx, $this->chunkZ + $zz, $c); + $adjacentChunks[World::chunkHash($this->chunkX + $xx, $this->chunkZ + $zz)] = FastChunkSerializer::deserializeTerrain($c); } } - $world->generateChunkCallback($this->chunkX, $this->chunkZ, $chunk); + $world->generateChunkCallback($this->chunkX, $this->chunkZ, $chunk, $adjacentChunks); } } }