lightLevel = $lightLevel; parent::__construct($idInfo, $name, $typeInfo); } protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->bool($this->hanging); } public function isHanging() : bool{ return $this->hanging; } /** @return $this */ public function setHanging(bool $hanging) : self{ $this->hanging = $hanging; return $this; } public function getLightLevel() : int{ return $this->lightLevel; } protected function recalculateCollisionBoxes() : array{ return [ AxisAlignedBB::one() ->trim(Facing::UP, $this->hanging ? 6 / 16 : 8 / 16) ->trim(Facing::DOWN, $this->hanging ? 2 / 16 : 0) ->squash(Axis::X, 5 / 16) ->squash(Axis::Z, 5 / 16) ]; } public function getSupportType(int $facing) : SupportType{ return SupportType::NONE; } public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ $downSupport = $this->canBeSupportedAt($blockReplace, Facing::DOWN); if(!$downSupport && !$this->canBeSupportedAt($blockReplace, Facing::UP)){ return false; } $this->hanging = $face === Facing::DOWN || !$downSupport; return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } public function onNearbyBlockChange() : void{ $face = $this->hanging ? Facing::UP : Facing::DOWN; if(!$this->canBeSupportedAt($this, $face)){ $this->position->getWorld()->useBreakOn($this->position); } } private function canBeSupportedAt(Block $block, int $face) : bool{ return $block->getAdjacentSupportType($face)->hasCenterSupport(); } }