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.95k stars 204 forks source link

[1.18.2] 拔刀剑鼠标点击物品后NBT丢失ShareTag的TranslationKey,物品被重置成白装 #832

Closed i493052739 closed 7 months ago

i493052739 commented 8 months ago

运行环境

Minecraft版本(1.12.2/1.16.5/1.18.2): 1.18.2 构建版本(从/version指令获取): 6c3f596 相关模组/插件: SlashBlade-1.18.2-0.0.9.jar,Mar 16, 2023 最新版 https://www.curseforge.com/minecraft/mc-mods/slashblade/files/4440150

描述这个BUG 无 log 无报错,只是 NBT 会丢失 K_3EJP@CJL5GBL7Z JW7M}H

如上图↑,在背包中鼠标左键点击拔刀剑后,红框内的 NBT 信息会变空(如图的下半部分)

此时玩家的拔刀剑就会直接变为初始的白装

经测试,在原版单机中模组正常,服务端中删除其余mod及插件后依然会丢失NBT

导致的问题

玩家的拔刀剑就会直接变为初始的白装

复现方法

左键反复点击背包内的拔刀剑,3次以内就会丢失NBT

i493052739 commented 8 months ago

尝试写插件将bug前的未丢失的 translationKey 备份出来单独存一个 NBT 字段然后等出 BUG 后通过 listener 和 NBT API 回写到 NBT 里去修正,结果发现无论是同步添加回NBT还是异步添加回NBT都会被重置为 null,而且仅限于这一个字段会有这个问题,其他NBT字段均正常读写

image

如上图,备份出数据存成 backupData1 字段,然后尝试回写到 ShareTag 的 TranslationKey 中,失败,但 TranslationKey1 成功。

尝试了同步调用: itemStack.setItemMeta(nbtItem.getItem().getItemMeta()); 尝试了异步调用: Bukkit.getScheduler().runTaskLater(this.plugin, () -> updateItemStackMeta(itemStack, nbtItem), 60);

ShareTag 的 TranslationKey 均会被重置成null

i493052739 commented 8 months ago

测试发现一个规律,玩家在第一次获取某个物品时(造成的点击事件)不会丢失shareTag,但第二次之后就会在点击物品时立即丢失