getPosition(); $tile = $position->getWorld()->getTile($position); if($tile instanceof InventoryHolder){ return count($tile->getInventory()->getViewers()); } return 0; } abstract protected function getOpenSound() : Sound; abstract protected function getCloseSound() : Sound; abstract protected function playAnimationVisual(Position $position, bool $isOpen) : void; protected function playAnimationSound(Position $position, bool $isOpen) : void{ $position->getWorld()->addSound($position->add(0.5, 0.5, 0.5), $isOpen ? $this->getOpenSound() : $this->getCloseSound()); } abstract protected function getPosition() : Position; protected function doAnimationEffects(bool $isOpen) : void{ $position = $this->getPosition(); $this->playAnimationVisual($position, $isOpen); $this->playAnimationSound($position, $isOpen); } public function onViewerAdded() : void{ if($this->getViewerCount() === 1){ $this->doAnimationEffects(true); } } public function onViewerRemoved() : void{ if($this->getViewerCount() === 1){ $this->doAnimationEffects(false); } } }