Persistent Data(Persistent Data)

预计阅读时间: 4 分钟

什么是持久数据以及如何使用它

persistentData 是玩家、世界和服务器上可用的 NBT 复合标签对象。

它对于简单的持久数据存储非常有用。

在 1.21+ 版本中,Persistent Data 不使用 beans!

以下是 persistentData 的示例:

1.21.1+

PlayerEvents.loggedIn(event => {
	const pData = event.player.persistentData
	if (!pData.getBoolean('firstJoin')) {
		pData.putBoolean('firstJoin', true)
		// 只在首次加入时执行某些操作,这里我们给玩家一些钻石和一把剑
		event.player.give('29x diamond')
		event.player.give('minecraft:diamond_sword[damage=2]')
	}
})

1.20.4

PlayerEvents.loggedIn(event => {
  const pData = event.player.persistentData
  if (!pData.firstJoin) {
    pData.firstJoin = true
    // 只在首次加入时执行某些操作,这里我们给玩家一些钻石和一把剑
    event.player.give('29x diamond')
    event.player.give('minecraft:diamond_sword[damage=2]')
  }
})

1.20.1 - 1.19.2

PlayerEvents.loggedIn(event => {
	const pData = event.player.persistentData
	if (!pData.firstJoin) {
		pData.firstJoin = true
		// 只在首次加入时执行某些操作,这里我们给玩家一些钻石和一把剑
		event.player.give('29x diamond')
		event.player.give(Item.of('minecraft:diamond_sword', '{Damage:2}'))
	}
})

NBT Compound 方法

这些是可在像 persistentData 这样的 NBT 复合标签上使用的方法。

在下面的代码片段中,compound 将指代复合标签。

通用键访问

  • compound.put(name, tag)

    • name: 要放入的键名。
    • tag: 要插入的 NBT 标签。普通数字和字符串也可以插入,会自动包装成 NBT 标签。请注意,JS 数字是双精度浮点数!
    • 这等同于 compound[name] = tag bean。
  • compound.get(name)

    • name: 要获取的键名。
    • 返回值: 存储在该键处的 NBT 标签。
    • 这等同于 const tag = compound[name] bean。

类型化键访问

数据类型设置方法获取方法
Booleancompound.putBoolean(name, value)compound.getBoolean(name)
Bytecompound.putByte(name, value)compound.getByte(name)
Byte arraycompound['putByteArray(java.lang.String,byte[])'](name, value)compound.getByteArray(name)
Doublecompound.putDouble(name, value)compound.getDouble(name)
Floatcompound.putFloat(name, value)compound.getFloat(name)
Integercompound.putInt(name, value)compound.getInt(name)
Integer arraycompound['putIntArray(java.lang.String,int[])'](name, value)compound.getIntArray(name)
Longcompound.putLong(name, value)compound.getLong(name)
Long arraycompound['putLongArray(java.lang.String,long[])'](name, value)compound.getLongArray(name)
Shortcompound.putShort(name, value)compound.getShort(name)
Stringcompound.putString(name, value)compound.getString(name)
UUIDcompound.putUUID(name, value)compound.getUUID(name)
  • name: 要获取/放入的键名。
  • value: 适当类型的值。如果需要,会进行类型转换。
  • 获取方法返回适当的值类型。

如果尝试读取与实际存储在该键处的类型不同的类型,如果可能,返回值将被转换为适当的类型。

  • 成功的转换:

    • UUID 可以转换为恰好包含 4 个元素的整数数组,反之亦然。
    • 数字类型可以相互转换。
  • 失败的转换:

    • 将数字类型转换为字符串将导致空字符串。
    • 将字符串转换为数字类型将导致 0。
    • 在数字数组之间转换将导致空数组。
    • 将任何其他类型转换为 UUID 将导致抛出异常。

其他有用的方法

  • compound.getAllKeys()

    • 返回值: 复合标签中所有键名的集合。
  • compound.remove(name)

    • name: 要从标签中移除的键名。
    • 返回值: NBT 复合标签的字符串表示。
  • compound.getAsString()

  • compound.toString()

    • 返回值: NBT 复合标签的字符串表示。
  • compound.merge(otherCompound)

    • otherCompound: 另一个 NBT 复合标签。
    • 返回值: 将两个复合标签合并后的复合标签。
  • compound.copy()

    • 返回值: 复合标签的浅克隆。
  • compound.isEmpty()

    • 返回值: 如果复合标签为空则返回 true,否则返回 false
    • 也可作为 bean 使用: compound.empty
  • compound.size()

    • 返回值: 复合标签中的键数。
  • compound.sizeInBytes()

    • 返回值: 复合标签的字节大小。