findRandomLeavesSize($random); $checkRadius = 0; for($yy = 0; $yy < $this->totalHeight; ++$yy){ if($yy === $this->leavesSizeY){ $checkRadius = $this->leavesAbsoluteMaxRadius; } for($xx = -$checkRadius; $xx < ($checkRadius + 1); ++$xx){ for($zz = -$checkRadius; $zz < ($checkRadius + 1); ++$zz){ if(!isset($this->overridable[$level->level->getBlockID($pos->x + $xx, $pos->y + $yy, $pos->z + $zz)])){ return false; } } } } return true; } private function findRandomLeavesSize(Random $random){ $this->totalHeight += $random->nextRange(-1, 2); $this->leavesSizeY = 1 + $random->nextRange(0, 2); $this->leavesAbsoluteMaxRadius = 2 + $random->nextRange(0, 1); } public function placeObject(Level $level, Vector3 $pos, Random $random){ if($this->leavesSizeY === -1 or $this->leavesAbsoluteMaxRadius === -1){ $this->findRandomLeavesSize($random); } $level->setBlockRaw(new Vector3($pos->x, $pos->y - 1, $pos->z), new Dirt()); $leavesRadius = 0; $leavesMaxRadius = 1; $leavesBottomY = $this->totalHeight - $this->leavesSizeY; $firstMaxedRadius = false; for($leavesY = 0; $leavesY <= $leavesBottomY; ++$leavesY){ $yy = $this->totalHeight - $leavesY; for($xx = -$leavesRadius; $xx <= $leavesRadius; ++$xx){ for($zz = -$leavesRadius; $zz <= $leavesRadius; ++$zz){ if(abs($xx) != $leavesRadius or abs($zz) != $leavesRadius or $leavesRadius <= 0){ $level->setBlockRaw(new Vector3($pos->x + $xx, $pos->y + $yy, $pos->z + $zz), new Leaves($this->type)); } } } if($leavesRadius >= $leavesMaxRadius){ $leavesRadius = $firstMaxedRadius ? 1 : 0; $firstMaxedRadius = true; if(++$leavesMaxRadius > $this->leavesAbsoluteMaxRadius){ $leavesMaxRadius = $this->leavesAbsoluteMaxRadius; } }else{ ++$leavesRadius; } } $trunkHeightReducer = $random->nextRange(0, 3); for($yy = 0; $yy < ($this->totalHeight - $trunkHeightReducer); ++$yy){ $level->setBlockRaw(new Vector3($pos->x, $pos->y + $yy, $pos->z), new Wood($this->type)); } } }