From 079e794339107e12d849dbcc7af873fed74344f8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 3 Feb 2021 17:05:01 +0000 Subject: [PATCH] Armor: fixed item disappearing when switching two of the same armour pieces Player->useHeldItem() assumes that if the old item == the new item, we want to set the item back into the inventory if it's modified in-place. Therefore, we don't modify the item in-place to bypass the problem. closes #4022 --- src/item/Armor.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/item/Armor.php b/src/item/Armor.php index 283898272..39ced43e3 100644 --- a/src/item/Armor.php +++ b/src/item/Armor.php @@ -123,11 +123,13 @@ class Armor extends Durable{ public function onClickAir(Player $player, Vector3 $directionVector) : ItemUseResult{ $existing = $player->getArmorInventory()->getItem($this->getArmorSlot()); - $player->getArmorInventory()->setItem($this->getArmorSlot(), $this->pop()); - if($this->getCount() === 0){ + $thisCopy = clone $this; + $new = $thisCopy->pop(); + $player->getArmorInventory()->setItem($this->getArmorSlot(), $new); + if($thisCopy->getCount() === 0){ $player->getInventory()->setItemInHand($existing); }else{ //if the stack size was bigger than 1 (usually won't happen, but might be caused by plugins - $player->getInventory()->setItemInHand($this); + $player->getInventory()->setItemInHand($thisCopy); $player->getInventory()->addItem($existing); } return ItemUseResult::SUCCESS();