diff --git a/src/network/mcpe/convert/TypeConverter.php b/src/network/mcpe/convert/TypeConverter.php index b404588c3..3fd3a9003 100644 --- a/src/network/mcpe/convert/TypeConverter.php +++ b/src/network/mcpe/convert/TypeConverter.php @@ -180,12 +180,12 @@ class TypeConverter{ * @throws \UnexpectedValueException */ public function createInventoryAction(NetworkInventoryAction $action, Player $player) : ?InventoryAction{ - $old = TypeConverter::getInstance()->netItemStackToCore($action->oldItem); - $new = TypeConverter::getInstance()->netItemStackToCore($action->newItem); - if($old->equalsExact($new)){ + if($action->oldItem->equals($action->newItem)){ //filter out useless noise in 1.13 return null; } + $old = TypeConverter::getInstance()->netItemStackToCore($action->oldItem); + $new = TypeConverter::getInstance()->netItemStackToCore($action->newItem); switch($action->sourceType){ case NetworkInventoryAction::SOURCE_CONTAINER: if($action->windowId === ContainerIds::UI and $action->inventorySlot > 0){ diff --git a/src/network/mcpe/protocol/types/inventory/ItemStack.php b/src/network/mcpe/protocol/types/inventory/ItemStack.php index f43905a05..9233086f2 100644 --- a/src/network/mcpe/protocol/types/inventory/ItemStack.php +++ b/src/network/mcpe/protocol/types/inventory/ItemStack.php @@ -97,4 +97,17 @@ final class ItemStack{ public function getShieldBlockingTick() : ?int{ return $this->shieldBlockingTick; } + + public function equals(ItemStack $itemStack) : bool{ + return + $this->id === $itemStack->id && + $this->meta === $itemStack->meta && + $this->count === $itemStack->count && + $this->canPlaceOn === $itemStack->canPlaceOn && + $this->canDestroy === $itemStack->canDestroy && + $this->shieldBlockingTick === $itemStack->shieldBlockingTick && ( + $this->nbt === $itemStack->nbt || //this covers null === null and fast object identity + ($this->nbt !== null && $itemStack->nbt !== null && $this->nbt->equals($itemStack->nbt)) + ); + } }