dummy */ protected $connections = []; public function getThickness() : float{ return 0.25; } public function readStateFromWorld() : void{ parent::readStateFromWorld(); foreach(Facing::HORIZONTAL as $facing){ $block = $this->getSide($facing); if($block instanceof static or $block instanceof FenceGate or ($block->isSolid() and !$block->isTransparent())){ $this->connections[$facing] = true; }else{ unset($this->connections[$facing]); } } } protected function recalculateBoundingBox() : ?AxisAlignedBB{ $width = 0.5 - $this->getThickness() / 2; $bb = AxisAlignedBB::one() ->extend(Facing::UP, 0.5); foreach(Facing::HORIZONTAL as $facing){ if(!isset($this->connections[$facing])){ $bb->trim($facing, $width); } } return $bb; } protected function recalculateCollisionBoxes() : array{ $inset = 0.5 - $this->getThickness() / 2; /** @var AxisAlignedBB[] $bbs */ $bbs = []; $connectWest = isset($this->connections[Facing::WEST]); $connectEast = isset($this->connections[Facing::EAST]); if($connectWest or $connectEast){ //X axis (west/east) $bbs[] = AxisAlignedBB::one() ->squash(Facing::AXIS_Z, $inset) ->extend(Facing::UP, 0.5) ->trim(Facing::WEST, $connectWest ? 0 : $inset) ->trim(Facing::EAST, $connectEast ? 0 : $inset); } $connectNorth = isset($this->connections[Facing::NORTH]); $connectSouth = isset($this->connections[Facing::SOUTH]); if($connectNorth or $connectSouth){ //Z axis (north/south) $bbs[] = AxisAlignedBB::one() ->squash(Facing::AXIS_X, $inset) ->extend(Facing::UP, 0.5) ->trim(Facing::NORTH, $connectNorth ? 0 : $inset) ->trim(Facing::SOUTH, $connectSouth ? 0 : $inset); } if(empty($bbs)){ //centre post AABB (only needed if not connected on any axis - other BBs overlapping will do this if any connections are made) return [ AxisAlignedBB::one() ->extend(Facing::UP, 0.5) ->contract($inset, 0, $inset) ]; } return $bbs; } }