public function populate(ChunkManager $level, $chunkX, $chunkZ, Random $random) { $this->level = $level; $amount = $random->nextRange(0, $this->randomAmount + 1) + $this->baseAmount; for ($i = 0; $i < $amount; ++$i) { $x = $random->nextRange($chunkX * 16, $chunkX * 16 + 15); $z = $random->nextRange($chunkZ * 16, $chunkZ * 16 + 15); $y = $this->getHighestWorkableBlock($x, $z); //echo "Fire to $x, $y, $z\n"; if ($y !== -1 and $this->canGroundFireStay($x, $y, $z)) { $this->level->setBlockIdAt($x, $y, $z, Block::FIRE); $this->level->updateBlockLight($x, $y, $z); } } }
private function flowIntoBlock($x, $y, $z, $newFlowDecay) { if ($this->level->getBlockIdAt($x, $y, $z) === Block::AIR) { $this->level->setBlockIdAt($x, $y, $z, Block::LAVA); $this->level->setBlockDataAt($x, $y, $z, $newFlowDecay); $this->level->updateBlockLight($x, $y, $z); $this->lavaSpread($x, $y, $z); } }
public function placeObject(ChunkManager $level, $x, $y, $z) { $clusterSize = (int) $this->type->clusterSize; $angle = $this->random->nextFloat() * M_PI; $offset = VectorMath::getDirection2D($angle)->multiply($clusterSize)->divide(8); $x1 = $x + 8 + $offset->x; $x2 = $x + 8 - $offset->x; $z1 = $z + 8 + $offset->y; $z2 = $z + 8 - $offset->y; $y1 = $y + $this->random->nextBoundedInt(3) + 2; $y2 = $y + $this->random->nextBoundedInt(3) + 2; for ($count = 0; $count <= $clusterSize; ++$count) { $seedX = $x1 + ($x2 - $x1) * $count / $clusterSize; $seedY = $y1 + ($y2 - $y1) * $count / $clusterSize; $seedZ = $z1 + ($z2 - $z1) * $count / $clusterSize; $size = ((sin($count * (M_PI / $clusterSize)) + 1) * $this->random->nextFloat() * $clusterSize / 16 + 1) / 2; $startX = (int) ($seedX - $size); $startY = (int) ($seedY - $size); $startZ = (int) ($seedZ - $size); $endX = (int) ($seedX + $size); $endY = (int) ($seedY + $size); $endZ = (int) ($seedZ + $size); //echo "ORE: $startX, $startY, $startZ,, $endX, $endY, $endZ\n"; for ($x = $startX; $x <= $endX; ++$x) { $sizeX = ($x + 0.5 - $seedX) / $size; $sizeX *= $sizeX; if ($sizeX < 1) { for ($y = $startY; $y <= $endY; ++$y) { $sizeY = ($y + 0.5 - $seedY) / $size; $sizeY *= $sizeY; if ($y > 0 and $sizeX + $sizeY < 1) { for ($z = $startZ; $z <= $endZ; ++$z) { $sizeZ = ($z + 0.5 - $seedZ) / $size; $sizeZ *= $sizeZ; if ($sizeX + $sizeY + $sizeZ < 1 and $level->getBlockIdAt($x, $y, $z) === 0) { $level->setBlockIdAt($x, $y, $z, $this->type->material->getId()); if ($this->type->material->getDamage() !== 0) { $level->setBlockDataAt($x, $y, $z, $this->type->material->getDamage()); } $level->updateBlockLight($x, $y, $z); //echo "Placed to $x, $y, $z\n"; } } } } } } } }
private function generateBranches(ChunkManager $level, int $x, int $y, int $z, array $groups) { foreach ($groups as $group) { $baseY = $group[1]; if ($baseY - $y >= $this->totalHeight * 0.2) { $base = new Vector3($x, $baseY, $z); $branch = new VectorIterator($level, $base, $group[0]); while ($branch->valid()) { $branch->next(); $pos = $branch->current(); $level->setBlockIdAt((int) $pos->x, (int) $pos->y, (int) $pos->z, Block::LOG); $level->updateBlockLight((int) $pos->x, (int) $pos->y, (int) $pos->z); } } } }