pocketmine\level\generator\PopulationTask::onRun PHP Method

onRun() public method

public onRun ( )
    public function onRun()
    {
        /** @var SimpleChunkManager $manager */
        $manager = $this->getFromThreadStore("generation.level{$this->levelId}.manager");
        /** @var Generator $generator */
        $generator = $this->getFromThreadStore("generation.level{$this->levelId}.generator");
        if ($manager === null or $generator === null) {
            $this->state = false;
            return;
        }
        /** @var FullChunk[] $chunks */
        $chunks = [];
        /** @var FullChunk $chunkC */
        $chunkC = $this->chunkClass;
        $chunk = $chunkC::fromFastBinary($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] = $chunkC::getEmptyChunk($chunk->getX() + $xx, $chunk->getZ() + $zz);
            } else {
                $chunks[$i] = $chunkC::fromFastBinary($ck);
            }
        }
        if ($chunk === null) {
            //TODO error
            return;
        }
        $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->toFastBinary();
        $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]->toFastBinary() : null;
        }
    }