private function getLeafGroupPoints(ChunkManager $level, $x, $y, $z)
{
$amount = $this->leafAmount * $this->totalHeight / 13;
$groupsPerLayer = (int) (1.382 + $amount * $amount);
if ($groupsPerLayer == 0) {
$groupsPerLayer = 1;
}
$trunkTopY = $y + $this->trunkHeight;
$groups = [];
$groupY = $y + $this->totalHeight - $this->leafDistanceLimit;
$groups[] = [new Vector3($x, $groupY, $z), $trunkTopY];
for ($currentLayer = (int) ($this->totalHeight - $this->leafDistanceLimit); $currentLayer >= 0; $currentLayer--) {
$layerSize = $this->getRoughLayerSize($currentLayer);
if ($layerSize < 0) {
$groupY--;
continue;
}
for ($count = 0; $count < $groupsPerLayer; $count++) {
$scale = $this->widthScale * $layerSize * ($this->random->nextFloat() + 0.328);
$randomOffset = Vector2::createRandomDirection($this->random)->multiply($scale);
$groupX = (int) ($randomOffset->getX() + $x + 0.5);
$groupZ = (int) ($randomOffset->getY() + $z + 0.5);
$group = new Vector3($groupX, $groupY, $groupZ);
if ($this->getAvailableBlockSpace($level, $group, $group->add(0, $this->leafDistanceLimit, 0)) != -1) {
continue;
}
$xOff = (int) ($x - $groupX);
$zOff = (int) ($z - $groupZ);
$horizontalDistanceToTrunk = sqrt($xOff * $xOff + $zOff * $zOff);
$verticalDistanceToTrunk = $horizontalDistanceToTrunk * $this->branchSlope;
$yDiff = (int) ($groupY - $verticalDistanceToTrunk);
if ($yDiff > $trunkTopY) {
$base = $trunkTopY;
} else {
$base = $yDiff;
}
if ($this->getAvailableBlockSpace($level, new Vector3($x, $base, $z), $group) == -1) {
$groups[] = [$group, $base];
}
}
$groupY--;
}
return $groups;
}