物品名称和知识/序列化

问题描述 投票:0回答:1

出于某种原因,当通过 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 在解析颜色代码时不会添加额外的格式,尽管我不想使用这个除非我真的必须这样做,否则请接近。

还有其他选择吗?

serialization deserialization bukkit items spigot
1个回答
0
投票

有多种方法可以比较某些项目。

  1. 使用

    ItemStack#isSimilar
    来比较 2 个项目。在内部,spigot 将比较 2 个序列化项目,因此两者都将具有所有冗余内容。

  2. 通过比较类型、数量、物品元等来检查自己...这需要时间,不建议这样做。在某些情况下可能会更好。

  3. 冒险是一个很好的解决方案,主要是如果您使用纸质服务器。长期以来所有的纸质服务器都在使用Adventure。您可以检查它们是否相等,还可以将两者序列化并进行比较,如下所示:

// convert both
String itemNameA = LegacyComponentSerializer.legacySection().serialize​(itemA);
String itemNameB = LegacyComponentSerializer.legacySection().serialize​(itemB);
// now compare
itemNameA.equals(itemNameB);

Javadoc

© www.soinside.com 2019 - 2024. All rights reserved.