Luohuayu / CatServer

高性能和高兼容性的1.12.2/1.16.5/1.18.2版本Forge+Bukkit+Spigot服务端 (A high performance and high compatibility 1.12.2/1.16.5/1.18.2 version Forge+Bukkit+Spigot server)
https://catmc.org
GNU Lesser General Public License v3.0
1.98k stars 211 forks source link

[1.18.2]更新ItemMeta的CUSTOM_TAGS 修复植物魔法采花袋NBT丢失的问题 #846

Closed CalenXwX closed 9 months ago

CalenXwX commented 9 months ago

又遇到了一个和之前拔刀剑那个很像的问题XwX 植物魔法的采花袋在背包里被移动后NBT会丢失()然后里面存的花就无了()

触发这个问题的部分StackTrace:

org.bukkit.craftbukkit.v1_18_R2.inventory.CraftMetaItem::getCustomTags(org.bukkit.craftbukkit.v1_18_R2.inventory.CraftMetaItem.java:282)
org.bukkit.craftbukkit.v1_18_R2.inventory.CraftMetaItem::<init>(org.bukkit.craftbukkit.v1_18_R2.inventory.CraftMetaItem.java:393)
org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack::getItemMeta(org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack.java:556)
org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack::asBukkitCopy(org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack.java:66)
net.minecraft.server.network.ServerGamePacketListenerImpl::m_5964_/handleSetCreativeModeSlot(patches/minecraft/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch:3610)

植物魔法的采花袋使用了和MC原版收纳袋(Bundle)相同的NBT标签「Items」,在CraftMetaItem的构造方法里

        Set<String> keys = tag.getAllKeys();
        for (String key : keys) {
            if (!getHandledTags().contains(key)) {
                unhandledTags.put(key, tag.get(key).copy());
            }
            // CatServer start - handle mod custom nbt
            else {
                if (getClass() == CraftMetaItem.class && getCustomTags().contains(key)) {
                    unhandledTags.put(key, tag.get(key));
                }
            }
            // CatServer end
        }

由于「Items」是原版存在的NBT标签,getHandledTags().contains(key)被判断为true,未执行Bukkit的保存标签代码;getCustomTags()获取的标签仍未包含「Items」,CatServer插入的保存标签代码再次被跳过,导致getCustomTags().contains(key)为false,「Items」没有被放入unhandledTags,然后袋子里存的花就无了……

看起来这里是从1.16.5迁移到1.18.2的时候漏掉了XwX 如图↓ Bukkit1.16.5的HANDLED_TAGS / CatServer1.16.5的CUSTOM_TAGS ↓ image Bukkit1.18.2的HANDLED_TAGS / CatServer1.18.2的CUSTOM_TAGS ↓ image CatServer1.16.5的CUSTOM_TAGS / CatServer1.18.2的CUSTOM_TAGS ↓ image

Kotori0629 commented 9 months ago

给你花花 细心喵

CalenXwX commented 9 months ago

给你花花 细心喵

欸嘿w