From 9d74a3520fa9d47db27fed74dcdd462956dd90ec Mon Sep 17 00:00:00 2001 From: BlueAgent Date: Wed, 16 Mar 2022 01:45:23 +0800 Subject: [PATCH] Fix MC-176559 related to the Mending enchantment (#7606) --- .../common/extensions/IForgeItem.java | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minecraftforge/common/extensions/IForgeItem.java b/src/main/java/net/minecraftforge/common/extensions/IForgeItem.java index 668cd5deb4..fc1fc280a9 100644 --- a/src/main/java/net/minecraftforge/common/extensions/IForgeItem.java +++ b/src/main/java/net/minecraftforge/common/extensions/IForgeItem.java @@ -5,6 +5,8 @@ package net.minecraftforge.common.extensions; +import java.util.HashSet; +import java.util.Objects; import java.util.Set; import java.util.function.Consumer; @@ -545,8 +547,31 @@ public interface IForgeItem */ default boolean shouldCauseBlockBreakReset(ItemStack oldStack, ItemStack newStack) { - return !(newStack.getItem() == oldStack.getItem() && ItemStack.tagMatches(newStack, oldStack) - && (newStack.isDamageableItem() || newStack.getDamageValue() == oldStack.getDamageValue())); + // Fix MC-176559 mending resets mining progress / breaking animation + if (!newStack.is(oldStack.getItem())) + return true; + + if (!newStack.isDamageableItem() || !oldStack.isDamageableItem()) + return !ItemStack.tagMatches(newStack, oldStack); + + CompoundTag newTag = newStack.getTag(); + CompoundTag oldTag = oldStack.getTag(); + + if (newTag == null || oldTag == null) + return !(newTag == null && oldTag == null); + + Set newKeys = new HashSet<>(newTag.getAllKeys()); + Set oldKeys = new HashSet<>(oldTag.getAllKeys()); + + newKeys.remove(ItemStack.TAG_DAMAGE); + oldKeys.remove(ItemStack.TAG_DAMAGE); + + if (!newKeys.equals(oldKeys)) + return true; + + return !newKeys.stream().allMatch(key -> Objects.equals(newTag.get(key), oldTag.get(key))); + // return !(newStack.is(oldStack.getItem()) && ItemStack.tagMatches(newStack, oldStack) + // && (newStack.isDamageableItem() || newStack.getDamageValue() == oldStack.getDamageValue())); } /**