From 51c94fc91c322446825bfe207255952494b3f6e7 Mon Sep 17 00:00:00 2001 From: Yanang Pearce Date: Fri, 5 Aug 2022 22:37:43 +0800 Subject: [PATCH] Fix specific tags not deserialized in CraftMetaItem (#671) (#679) --- .../common/mixin/bukkit/CraftMetaItemMixin.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftMetaItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftMetaItemMixin.java index 13bd6a0e..57bee4bf 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftMetaItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftMetaItemMixin.java @@ -12,6 +12,7 @@ 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 org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @@ -30,6 +31,7 @@ public class CraftMetaItemMixin implements ItemMetaBridge { // @formatter:off @Shadow(remap = false) @Final private Map unhandledTags; + @Shadow(remap = false) private CompoundTag internalTag; // @formatter:on private static final Set EXTEND_TAGS = ImmutableSet.of( @@ -65,6 +67,21 @@ public class CraftMetaItemMixin implements ItemMetaBridge { return tag == null ? new CompoundTag() : tag; } + @Redirect(method = "(Ljava/util/Map;)V", at = @At(value = "INVOKE", target = "Ljava/util/Set;contains(Ljava/lang/Object;)Z")) + private boolean arclight$forceDeserializeInternalTags(Set handledTags, Object key) { + if ((Object) this instanceof CraftMetaItem) { + // For mod items or vanilla items that usually don't depend on nbt tags, + // force internal tags to be deserialized into item nbt to avoid their vanilla tags being ignored by Bukkit. + // e.g. apotheosis:potion_charm{"Potion": ""} or minecraft:bread{"Potion": ""} + return false; + } + else { + // For items that has corresponding ItemMeta representation in Bukkit, + // keep their behavior unchanged. + return handledTags.contains((String) key); + } + } + private CompoundTag forgeCaps; @Override