Fixed wrong reported slot in PlayerItemHeldEvent, fixed assert failures due to negative slot numbers in the hotbar

fixes some issues reported in #525
This commit is contained in:
Dylan K. Taylor 2017-05-29 16:33:48 +01:00
parent 8779259734
commit 38b8f14758

View File

@ -64,14 +64,22 @@ class PlayerInventory extends BaseInventory{
*/ */
public function equipItem(int $hotbarSlot, $inventorySlot = null) : bool{ public function equipItem(int $hotbarSlot, $inventorySlot = null) : bool{
if($inventorySlot === null){ if($inventorySlot === null){
$inventorySlot = $this->getHotbarSlotIndex($this->getHeldItemIndex()); $inventorySlot = $this->getHotbarSlotIndex($hotbarSlot);
} }
if($hotbarSlot < 0 or $hotbarSlot >= $this->getHotbarSize() or $inventorySlot < -1 or $inventorySlot >= $this->getSize()){ if($hotbarSlot < 0 or $hotbarSlot >= $this->getHotbarSize() or $inventorySlot < -1 or $inventorySlot >= $this->getSize()){
$this->sendContents($this->getHolder()); $this->sendContents($this->getHolder());
return false; return false;
} }
$this->getHolder()->getLevel()->getServer()->getPluginManager()->callEvent($ev = new PlayerItemHeldEvent($this->getHolder(), $this->getItem($inventorySlot), $inventorySlot, $hotbarSlot)); if($inventorySlot === -1){
$item = Item::get(Item::AIR, 0, 0);
}else{
$item = $this->getItem($inventorySlot);
}
$this->getHolder()->getLevel()->getServer()->getPluginManager()->callEvent($ev = new PlayerItemHeldEvent($this->getHolder(), $item, $inventorySlot, $hotbarSlot));
if($ev->isCancelled()){ if($ev->isCancelled()){
$this->sendContents($this->getHolder()); $this->sendContents($this->getHolder());
return false; return false;
@ -103,7 +111,12 @@ class PlayerInventory extends BaseInventory{
* @param int $inventorySlot * @param int $inventorySlot
*/ */
public function setHotbarSlotIndex($hotbarSlot, $inventorySlot){ public function setHotbarSlotIndex($hotbarSlot, $inventorySlot){
if($hotbarSlot >= 0 and $hotbarSlot < $this->getHotbarSize() and $inventorySlot >= -1 and $inventorySlot < $this->getSize()){ if($hotbarSlot < 0 or $hotbarSlot >= $this->getHotbarSize()){
throw new \InvalidArgumentException("Hotbar slot index \"$index\" is out of range");
}elseif($inventorySlot < -1 or $inventorySlot >= $this->getSize()){
throw new \InvalidArgumentException("Inventory slot index \"$index\" is out of range");
}
if($inventorySlot !== -1 and ($alreadyEquippedIndex = array_search($inventorySlot, $this->hotbar)) !== false){ if($inventorySlot !== -1 and ($alreadyEquippedIndex = array_search($inventorySlot, $this->hotbar)) !== false){
/* Swap the slots /* Swap the slots
* This assumes that the equipped slot can only be equipped in one other slot * This assumes that the equipped slot can only be equipped in one other slot
@ -112,8 +125,23 @@ class PlayerInventory extends BaseInventory{
*/ */
$this->hotbar[$alreadyEquippedIndex] = $this->hotbar[$hotbarSlot]; $this->hotbar[$alreadyEquippedIndex] = $this->hotbar[$hotbarSlot];
} }
$this->hotbar[$hotbarSlot] = $inventorySlot; $this->hotbar[$hotbarSlot] = $inventorySlot;
} }
/**
* Returns the item in the slot linked to the specified hotbar slot, or Air if the slot is not linked to any hotbar slot.
* @param int $hotbarSlotIndex
*
* @return Item
*/
public function getHotbarSlotItem(int $hotbarSlotIndex) : Item{
$inventorySlot = $this->getHotbarSlotIndex($hotbarSlotIndex);
if($inventorySlot !== -1){
return $this->getItem($inventorySlot);
}else{
return Item::get(Item::AIR, 0, 0);
}
} }
/** /**
@ -151,6 +179,8 @@ class PlayerInventory extends BaseInventory{
} }
$this->sendHeldItem($this->getHolder()->getViewers()); $this->sendHeldItem($this->getHolder()->getViewers());
}else{
throw new \InvalidArgumentException("Hotbar slot index \"$index\" is out of range");
} }
} }
@ -160,12 +190,7 @@ class PlayerInventory extends BaseInventory{
* @return Item * @return Item
*/ */
public function getItemInHand(){ public function getItemInHand(){
$item = $this->getItem($this->getHeldItemSlot()); return $this->getHotbarSlotItem($this->itemInHandIndex);
if($item instanceof Item){
return $item;
}else{
return Item::get(Item::AIR, 0, 0);
}
} }
/** /**