From db7cee6f224c25da9d6ddf7f674f3bf18fdbdc29 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 11 Oct 2022 22:06:03 +0100 Subject: [PATCH] Player: check if the item meaningfully changed before discarding it in creative fixes #5220 --- src/player/Player.php | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/player/Player.php b/src/player/Player.php index 126951811c..74616b23ff 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -1473,15 +1473,27 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ */ private function returnItemsFromAction(Item $oldHeldItem, Item $newHeldItem, array $extraReturnedItems) : void{ $heldItemChanged = false; - if($this->hasFiniteResources()){ - if(!$newHeldItem->equalsExact($oldHeldItem) && $oldHeldItem->equalsExact($this->inventory->getItemInHand())){ + + if(!$newHeldItem->equalsExact($oldHeldItem) && $oldHeldItem->equalsExact($this->inventory->getItemInHand())){ + //determine if the item was changed in some meaningful way, or just damaged/changed count + //if it was really changed we always need to set it, whether we have finite resources or not + $newReplica = clone $oldHeldItem; + $newReplica->setCount($newHeldItem->getCount()); + if($newReplica instanceof Durable && $newHeldItem instanceof Durable){ + $newReplica->setDamage($newHeldItem->getDamage()); + } + $damagedOrDeducted = $newReplica->equalsExact($newHeldItem); + + if(!$damagedOrDeducted || $this->hasFiniteResources()){ if($newHeldItem instanceof Durable && $newHeldItem->isBroken()){ $this->broadcastSound(new ItemBreakSound()); } $this->inventory->setItemInHand($newHeldItem); $heldItemChanged = true; } - }else{ + } + + if(!$heldItemChanged){ $newHeldItem = $oldHeldItem; }