state = true; $this->levelId = $level->getId(); $this->chunk = $chunk->fastSerialize(); foreach($level->getAdjacentChunks($chunk->getX(), $chunk->getZ()) as $i => $c){ $this->{"chunk$i"} = $c !== null ? $c->fastSerialize() : null; } } public function onRun(){ $manager = $this->getFromThreadStore("generation.level{$this->levelId}.manager"); $generator = $this->getFromThreadStore("generation.level{$this->levelId}.generator"); if(!($manager instanceof SimpleChunkManager) or !($generator instanceof Generator)){ $this->state = false; return; } /** @var Chunk[] $chunks */ $chunks = []; $chunk = Chunk::fastDeserialize($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] = Chunk::fastDeserialize($ck); } } $manager->setChunk($chunk->getX(), $chunk->getZ(), $chunk); if(!$chunk->isGenerated()){ $generator->generateChunk($chunk->getX(), $chunk->getZ()); $chunk->setGenerated(); } foreach($chunks as $c){ if($c !== null){ $manager->setChunk($c->getX(), $c->getZ(), $c); if(!$c->isGenerated()){ $generator->generateChunk($c->getX(), $c->getZ()); $c = $manager->getChunk($c->getX(), $c->getZ()); $c->setGenerated(); } } } $generator->populateChunk($chunk->getX(), $chunk->getZ()); $chunk = $manager->getChunk($chunk->getX(), $chunk->getZ()); $chunk->recalculateHeightMap(); $chunk->populateSkyLight(); $chunk->setLightPopulated(); $chunk->setPopulated(); $this->chunk = $chunk->fastSerialize(); $manager->setChunk($chunk->getX(), $chunk->getZ(), null); foreach($chunks as $i => $c){ if($c !== null){ $c = $chunks[$i] = $manager->getChunk($c->getX(), $c->getZ()); if(!$c->hasChanged()){ $chunks[$i] = null; } }else{ //This way non-changed chunks are not set $chunks[$i] = null; } } $manager->cleanChunks(); for($i = 0; $i < 9; ++$i){ if($i === 4){ continue; } $this->{"chunk$i"} = $chunks[$i] !== null ? $chunks[$i]->fastSerialize() : null; } } public function onCompletion(Server $server){ $level = $server->getLevel($this->levelId); if($level !== null){ if(!$this->state){ $level->registerGeneratorToWorker($this->worker->getAsyncWorkerId()); } $chunk = Chunk::fastDeserialize($this->chunk); for($i = 0; $i < 9; ++$i){ if($i === 4){ continue; } $c = $this->{"chunk$i"}; if($c !== null){ $c = Chunk::fastDeserialize($c); $level->generateChunkCallback($c->getX(), $c->getZ(), $this->state ? $c : null); } } $level->generateChunkCallback($chunk->getX(), $chunk->getZ(), $this->state ? $chunk : null); } } }