对 Spigot 的 NamespacedKey 和 PersistentDataContainer 进行分析
NamespacedKey 是什么?
从Spigot的JavaDoc中引用,NamespacedKey将被简写为NK,PersistentDataContainer将被简写为PDC。
表示由两个部分组成的基于字符串的键 – 命名空间和键。命名空间只能包含小写字母、数字、句点、下划线和连字符。
键只能包含小写字母、数字、句点、下划线、连字符和正斜杠。
使用PDC时需要的关键。
这是Linux容器的基本技术,与Namespace大致相同。
当你在构造函数中传入一个与插件实例和其他字符串不重复的字符串时,你可以获取用于访问各种实体、方块、世界等中的PDC(Persistent Data Container)信息的”钥匙”。
鍵生成的實例
NamespacedKey key = new NamespacedKey(instance, "test-value");
假设 instance 是插件本身的实例。
在上述例子中,插件名称表示容器的名称,test-value表示容器内详细地址。通过将它们作为密钥存储在NK中,并针对PDC使用,可以访问存储的信息。
用Java的Map来比喻的话,插件名相当于变量名,test-value则对应于key名称。
PersistentDataContainer 是什么?
PDC 是一个容器,用于存储 Minecraft 中几乎所有物品(包括物品、方块、实体、世界等)的值。
在之前的NK解释中,我用Java的Map作了一个比喻。但是,如果NK对应的是变量名和键名,那么PDC就对应着Map的实例本身。
只是与Map不同,默认情况下对value的选择受到了类型限制。
默认情况下,如果创建一个继承PersistentDataType类的类,并加上一些前置条件,那么就可以给不能默认接受的类型赋值。
以下是默认可以存储的值的类型。
-
BOOLEAN (真偽値)
BYTE
BYTE_ARRAY (バイト配列)
DOUBLE
FLOAT
INTEGER
INTEGER_ARRAY (整数配列)
LONG
LONG_ARRAY (整数配列)
SHORT
TAG_CONTAINER
TAG_CONTAINER_ARRAY (タグ配列)
TAG_CONTAINER / TAG_CONTAINER_ARRAY代表着PDC,可以在PDC内部储存PDC。
使用方式
接口:通过实现 PersistentDataHolder 接口,并使用 getPersistentDataContainer 方法,可以获取 PersistentDataContainer。
由于经常使用的ItemStack并非PersistentDataHolder的实现类,因此需要先获取ItemMeta,然后才能使用getPersistentDataContainer。
以下是一个针对密钥生成和使用的示例。
NamespacedKey nk = new NamespacedKey(instance, "test-value");
ItemStack item = new ItemStack(Material.STONE);
ItemMeta meta = item.getItemMeta();
meta.getPersistentDataContainer().set(nk,PersistentDataType.STRING,"This is a stone.");
item.setItemMeta(meta);
在上面的例子中,我们创建了一个石头的 ItemStack,并将字符串”This is a stone.”储存在创建的实例的PDC中的”plugin-name:test-value”中。
要从这个ItemStack的test-value中提取字符串,可以使用以下代码。
PersistentDataContainer container = item.getItemMeta().getPersistentDataContainer();
if (container.has(key, PersistentDataType.STRING) {
String value = container.get(key, PersistentDataType.STRING);
}
在提取PDC的值时,我们应该先确认容器中由NK指示的命名空间中是否存在该值。
用来做什么?
当您想要区分自定义物品和普通物品时,或者当您想要使用它作为NBT的替代品时,我认为会产生这种感觉。
ItemStack legendarySword = new Itemstack(Material.IRON_SWORD);
ItemStack normalSword = new ItemStack(Material.IRON_SWORD);
NamespacedKey key = new NamespacedKey(instance, "tag");
ItemMeta meta = legendarySword.getItemMeta();
PersistentDataContainer container = meta.getPersistentDataContainer();
container.set(key, PersistentDataType.STRING, "LEGENDARY");
legendarySword.setItemMeta(meta);
List<ItemStack> items = Arrays.asList(legendarySword, normalSword);
for (ItemStack item : items) {
if (item.has(key, PersistentDataType.STRING) System.out.println("This is a legendarySword!");
else System.out.println("This is a normalSword.");
}
// 実行結果
//
// This is a legendarySword!
// This is a normalSword.
请提供更多上下文信息以便更好地理解您需要的内容,然后我将尽力为您提供翻译。
纸质MC / 持续性数据容器 (PDC)
纸质MC / 持续性数据容器 (PDC)
YouTube / Spigot 插件开发 – 第58期 – 持久化数据存储 (KodySimpson)
Spigot JavaDoc / 接口 PersistentDataContainer
Spigot JavaDoc / 持久存储数据接口
Spigot JavaDoc / 持久化数据类型接口