state = true; $this->worldId = $world->getId(); $this->chunkX = $chunkX; $this->chunkZ = $chunkZ; $this->chunk = $chunk !== null ? FastChunkSerializer::serializeWithoutLight($chunk) : null; foreach($world->getAdjacentChunks($chunkX, $chunkZ) as $i => $c){ $this->{"chunk$i"} = $c !== null ? FastChunkSerializer::serializeWithoutLight($c) : null; } $this->storeLocal(self::TLS_KEY_WORLD, $world); } public function onRun() : void{ $context = ThreadLocalGeneratorContext::fetch($this->worldId); if($context === null){ $this->state = false; return; } $generator = $context->getGenerator(); $manager = new SimpleChunkManager($context->getWorldHeight()); /** @var Chunk[] $chunks */ $chunks = []; $chunk = $this->chunk !== null ? FastChunkSerializer::deserialize($this->chunk) : null; for($i = 0; $i < 9; ++$i){ if($i === 4){ continue; } $ck = $this->{"chunk$i"}; if($ck === null){ $chunks[$i] = null; }else{ $chunks[$i] = FastChunkSerializer::deserialize($ck); } } $manager->setChunk($this->chunkX, $this->chunkZ, $chunk); if($chunk === null){ $generator->generateChunk($manager, $this->chunkX, $this->chunkZ); $chunk = $manager->getChunk($this->chunkX, $this->chunkZ); $chunk->setDirtyFlag(Chunk::DIRTY_FLAG_TERRAIN, true); $chunk->setDirtyFlag(Chunk::DIRTY_FLAG_BIOMES, true); } foreach($chunks as $i => $c){ $cX = (-1 + $i % 3) + $this->chunkX; $cZ = (-1 + intdiv($i, 3)) + $this->chunkZ; $manager->setChunk($cX, $cZ, $c); if($c === null){ $generator->generateChunk($manager, $cX, $cZ); $chunks[$i] = $manager->getChunk($cX, $cZ); $chunks[$i]->setDirtyFlag(Chunk::DIRTY_FLAG_TERRAIN, true); $chunks[$i]->setDirtyFlag(Chunk::DIRTY_FLAG_BIOMES, true); } } $generator->populateChunk($manager, $this->chunkX, $this->chunkZ); $chunk = $manager->getChunk($this->chunkX, $this->chunkZ); $chunk->setPopulated(); $this->chunk = FastChunkSerializer::serializeWithoutLight($chunk); foreach($chunks as $i => $c){ $this->{"chunk$i"} = $c->isDirty() ? FastChunkSerializer::serializeWithoutLight($c) : null; } } 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 = $this->chunk !== null ? FastChunkSerializer::deserialize($this->chunk) : null; for($i = 0; $i < 9; ++$i){ if($i === 4){ continue; } $c = $this->{"chunk$i"}; if($c !== null){ $xx = -1 + $i % 3; $zz = -1 + intdiv($i, 3); $c = FastChunkSerializer::deserialize($c); $world->generateChunkCallback($this->chunkX + $xx, $this->chunkZ + $zz, $this->state ? $c : null); } } $world->generateChunkCallback($this->chunkX, $this->chunkZ, $this->state ? $chunk : null); } } }