holder = $player; parent::__construct(36); } public function isHotbarSlot(int $slot) : bool{ return $slot >= 0 and $slot <= $this->getHotbarSize(); } /** * @throws \InvalidArgumentException */ private function throwIfNotHotbarSlot(int $slot) : void{ if(!$this->isHotbarSlot($slot)){ throw new \InvalidArgumentException("$slot is not a valid hotbar slot index (expected 0 - " . ($this->getHotbarSize() - 1) . ")"); } } /** * Returns the item in the specified hotbar slot. * * @throws \InvalidArgumentException if the hotbar slot index is out of range */ public function getHotbarSlotItem(int $hotbarSlot) : Item{ $this->throwIfNotHotbarSlot($hotbarSlot); return $this->getItem($hotbarSlot); } /** * Returns the hotbar slot number the holder is currently holding. */ public function getHeldItemIndex() : int{ return $this->itemInHandIndex; } /** * Sets which hotbar slot the player is currently loading. * * @param int $hotbarSlot 0-8 index of the hotbar slot to hold * @param bool $send Whether to send updates back to the inventory holder. This should usually be true for plugin calls. * It should only be false to prevent feedback loops of equipment packets between client and server. * * @throws \InvalidArgumentException if the hotbar slot is out of range */ public function setHeldItemIndex(int $hotbarSlot, bool $send = true) : void{ $this->throwIfNotHotbarSlot($hotbarSlot); $this->itemInHandIndex = $hotbarSlot; if($this->holder instanceof Player and $send){ $this->holder->getNetworkSession()->getInvManager()->syncSelectedHotbarSlot(); } foreach($this->holder->getViewers() as $viewer){ $viewer->getNetworkSession()->onMobEquipmentChange($this->holder); } } /** * Returns the currently-held item. */ public function getItemInHand() : Item{ return $this->getHotbarSlotItem($this->itemInHandIndex); } /** * Sets the item in the currently-held slot to the specified item. */ public function setItemInHand(Item $item) : void{ $this->setItem($this->getHeldItemIndex(), $item); foreach($this->holder->getViewers() as $viewer){ $viewer->getNetworkSession()->onMobEquipmentChange($this->holder); } } /** * Returns the number of slots in the hotbar. */ public function getHotbarSize() : int{ return 9; } /** * @return Human|Player */ public function getHolder(){ return $this->holder; } }