出于某种原因,当通过 Bukkit API(又名
ItemMeta#setDisplayName()
)使用自定义 ChatColors 设置项目的名称/传说,然后检查其 NBT 时,它会使用冗余格式(如 italic: false
、obfusicated: false
、...)来格式化 NBT。
当将项目与相同项目进行比较但没有这些额外标签时,虽然项目相同,但它们不匹配,因为 NBT 不相似,因为冗余格式,这会产生问题。
网上查了一下,发现这可能和Spigot如何序列化和反序列化颜色有关。 https://hub.spigotmc.org/jira/browse/SPIGOT-5063 不过,Pitrex111 发布的解决方案似乎并没有解决这个问题。
然后我发现 Adventure 库有一种方法可以直接修改 NBT,而不是通过
ItemMeta.setDisplayName()
这可能会解决问题,因为 Adventure API 在解析颜色代码时不会添加额外的格式,尽管我不想使用这个除非我真的必须这样做,否则请接近。
还有其他选择吗?
有多种方法可以比较某些项目。
ItemStack#isSimilar
来比较 2 个项目。在内部,spigot 将比较 2 个序列化项目,因此两者都将具有所有冗余内容。
通过比较类型、数量、物品元等来检查自己...这需要时间,不建议这样做。在某些情况下可能会更好。
冒险是一个很好的解决方案,主要是如果您使用纸质服务器。长期以来所有的纸质服务器都在使用Adventure。您可以检查它们是否相等,还可以将两者序列化并进行比较,如下所示:
// convert both
String itemNameA = LegacyComponentSerializer.legacySection().serialize(itemA);
String itemNameB = LegacyComponentSerializer.legacySection().serialize(itemB);
// now compare
itemNameA.equals(itemNameB);