holder = $holder; } public function getEnderInventory() : PlayerEnderInventory{ return $this->inventory; } public function getViewerCount() : int{ $enderChest = $this->getHolder()->getWorld()->getTile($this->getHolder()); if(!$enderChest instanceof EnderChest){ return 0; } return $enderChest->getViewerCount(); } protected function getOpenSound() : Sound{ return new EnderChestOpenSound(); } protected function getCloseSound() : Sound{ return new EnderChestCloseSound(); } protected function animateBlock(bool $isOpen) : void{ $holder = $this->getHolder(); //event ID is always 1 for a chest $holder->getWorld()->broadcastPacketToViewers($holder, BlockEventPacket::create(BlockPosition::fromVector3($holder), 1, $isOpen ? 1 : 0)); } public function onClose(Player $who) : void{ $this->animatedBlockInventoryTrait_onClose($who); $enderChest = $this->getHolder()->getWorld()->getTile($this->getHolder()); if($enderChest instanceof EnderChest){ $enderChest->setViewerCount($enderChest->getViewerCount() - 1); } } }