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;
}
}