diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/ItemStackMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/ItemStackMixin.java index 49430885..47f61717 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/ItemStackMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/ItemStackMixin.java @@ -2,6 +2,7 @@ package io.izzel.arclight.common.mixin.core.world.item; import io.izzel.arclight.common.bridge.core.entity.player.ServerPlayerEntityBridge; import io.izzel.arclight.common.bridge.core.item.ItemStackBridge; +import io.izzel.arclight.i18n.ArclightConfig; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.RandomSource; @@ -25,8 +26,10 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.Objects; import java.util.function.Consumer; @Mixin(ItemStack.class) @@ -98,4 +101,20 @@ public abstract class ItemStackMixin extends CapabilityProvider imple this.item = item; this.delegate = ForgeRegistries.ITEMS.getDelegateOrThrow(item); } + + @Redirect(method = "isSameItemSameTags", at = @At(value = "INVOKE", remap = false, target = "Ljava/util/Objects;equals(Ljava/lang/Object;Ljava/lang/Object;)Z")) + private static boolean arclight$lenientItemMatch(Object a, Object b) { + if (ArclightConfig.spec().getCompat().isLenientItemTagMatch()) { + var tagA = (CompoundTag) a; + var tagB = (CompoundTag) b; + if (tagB != null) { + var tmp = tagA; + tagA = tagB; + tagB = tmp; + } + return tagA == null || (tagA.isEmpty() ? (tagB == null || tagB.isEmpty()) : tagA.equals(tagB)); + } else { + return Objects.equals(a, b); + } + } } diff --git a/i18n-config/src/main/java/io/izzel/arclight/i18n/conf/CompatSpec.java b/i18n-config/src/main/java/io/izzel/arclight/i18n/conf/CompatSpec.java index 2c8f0143..b8ea6c36 100644 --- a/i18n-config/src/main/java/io/izzel/arclight/i18n/conf/CompatSpec.java +++ b/i18n-config/src/main/java/io/izzel/arclight/i18n/conf/CompatSpec.java @@ -29,6 +29,9 @@ public class CompatSpec { @Setting("valid-username-regex") private String validUsernameRegex; + @Setting("lenient-item-tag-match") + private boolean lenientItemTagMatch; + public Map getMaterials() { return materials; } @@ -64,4 +67,8 @@ public class CompatSpec { public String getValidUsernameRegex() { return validUsernameRegex; } + + public boolean isLenientItemTagMatch() { + return lenientItemTagMatch; + } } diff --git a/i18n-config/src/main/resources/META-INF/arclight.conf b/i18n-config/src/main/resources/META-INF/arclight.conf index 92f64a94..8b1e9460 100644 --- a/i18n-config/src/main/resources/META-INF/arclight.conf +++ b/i18n-config/src/main/resources/META-INF/arclight.conf @@ -19,6 +19,7 @@ compatibility { ] forward-permission = true valid-username-regex = "" + lenient-item-tag-match = true } async-catcher { dump = true diff --git a/i18n-config/src/main/resources/META-INF/i18n/en_us.conf b/i18n-config/src/main/resources/META-INF/i18n/en_us.conf index 3fc8c80c..d49f98d7 100644 --- a/i18n-config/src/main/resources/META-INF/i18n/en_us.conf +++ b/i18n-config/src/main/resources/META-INF/i18n/en_us.conf @@ -129,5 +129,8 @@ comments { "Following allows any username to login:" "valid-username-regex = \".+\"" ] + lenient-item-tag-match.comment = [ + "Allows items with an empty nbt tag stack on no tag items" + ] } } diff --git a/i18n-config/src/main/resources/META-INF/i18n/zh_cn.conf b/i18n-config/src/main/resources/META-INF/i18n/zh_cn.conf index d9593eab..b9782139 100644 --- a/i18n-config/src/main/resources/META-INF/i18n/zh_cn.conf +++ b/i18n-config/src/main/resources/META-INF/i18n/zh_cn.conf @@ -133,5 +133,8 @@ comments { "如果允许任何用户名可以使用" "valid-username-regex = \".+\"" ] + lenient-item-tag-match.comment = [ + "允许空 NBT 标签的物品和没有 NBT 标签的物品堆叠" + ] } }