state = true; $this->worldId = $world->getId(); $this->chunk = FastChunkSerializer::serialize($chunk); foreach($world->getAdjacentChunks($chunk->getX(), $chunk->getZ()) as $i => $c){ $this->{"chunk$i"} = $c !== null ? FastChunkSerializer::serialize($c) : null; } $this->storeLocal(self::TLS_KEY_WORLD, $world); } public function onRun() : void{ $manager = $this->worker->getFromThreadStore("generation.world{$this->worldId}.manager"); $generator = $this->worker->getFromThreadStore("generation.world{$this->worldId}.generator"); if(!($manager instanceof GeneratorChunkManager) or !($generator instanceof Generator)){ $this->state = false; return; } /** @var Chunk[] $chunks */ $chunks = []; $chunk = FastChunkSerializer::deserialize($this->chunk); for($i = 0; $i < 9; ++$i){ if($i === 4){ continue; } $xx = -1 + $i % 3; $zz = -1 + (int) ($i / 3); $ck = $this->{"chunk$i"}; if($ck === null){ $chunks[$i] = new Chunk($chunk->getX() + $xx, $chunk->getZ() + $zz); }else{ $chunks[$i] = FastChunkSerializer::deserialize($ck); } } $manager->setChunk($chunk->getX(), $chunk->getZ(), $chunk); if(!$chunk->isGenerated()){ $generator->generateChunk($chunk->getX(), $chunk->getZ()); $chunk = $manager->getChunk($chunk->getX(), $chunk->getZ()); $chunk->setGenerated(); } foreach($chunks as $i => $c){ $manager->setChunk($c->getX(), $c->getZ(), $c); if(!$c->isGenerated()){ $generator->generateChunk($c->getX(), $c->getZ()); $chunks[$i] = $manager->getChunk($c->getX(), $c->getZ()); $chunks[$i]->setGenerated(); } } $generator->populateChunk($chunk->getX(), $chunk->getZ()); $chunk = $manager->getChunk($chunk->getX(), $chunk->getZ()); $chunk->setPopulated(); $blockFactory = BlockFactory::getInstance(); $chunk->recalculateHeightMap($blockFactory->blocksDirectSkyLight); $chunk->populateSkyLight($blockFactory->lightFilter); $chunk->setLightPopulated(); $this->chunk = FastChunkSerializer::serialize($chunk); foreach($chunks as $i => $c){ $this->{"chunk$i"} = $c->isDirty() ? FastChunkSerializer::serialize($c) : null; } $manager->cleanChunks(); } public function onCompletion() : void{ /** @var World $world */ $world = $this->fetchLocal(self::TLS_KEY_WORLD); if(!$world->isClosed()){ if(!$this->state){ $world->registerGeneratorToWorker($this->worker->getAsyncWorkerId()); } $chunk = FastChunkSerializer::deserialize($this->chunk); for($i = 0; $i < 9; ++$i){ if($i === 4){ continue; } $c = $this->{"chunk$i"}; if($c !== null){ $c = FastChunkSerializer::deserialize($c); $world->generateChunkCallback($c->getX(), $c->getZ(), $this->state ? $c : null); } } $world->generateChunkCallback($chunk->getX(), $chunk->getZ(), $this->state ? $chunk : null); } } }