User Tools

Site Tools


zh_cn:tutorial:blockentity_modify_data

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
zh_cn:tutorial:blockentity_modify_data [2025/04/01 12:30] – update solidblockzh_cn:tutorial:blockentity_modify_data [2025/04/01 12:48] (current) – [关于 NbtCompound 的注意事项] solidblock
Line 3: Line 3:
 在之前的教程,我们创建了[[blockentity|方块实体]],但是这些方块实体太无聊了,没有任何数据。所以我们尝试给它添加一些数据,并定义了序列化和反序列化数据的方块。 在之前的教程,我们创建了[[blockentity|方块实体]],但是这些方块实体太无聊了,没有任何数据。所以我们尝试给它添加一些数据,并定义了序列化和反序列化数据的方块。
  
 +===== 关于 NbtCompound 的注意事项 =====
 +
 +自从 1.21.5 开始,''NbtCompound'' 的相关方法被更改了。各 getter 方法返回的都是 ''Optional'' 对象,除非再指定一个参数以表示该项不存在时的默认值。例如:
 +
 +<code java>
 +// 没有指定默认值,将返回 Optional
 +Optional<Integer> value = nbt.getInt("value"); // 注意不是 OptionalInt
 +
 +// 指定默认值,当对应字段不存在时返回这个默认值
 +int value = nbt.getInt("value", 1000);
 +</code>
 +
 +对于集合类型,如复合标签和列表,可以返回一个空的对象作为默认值,例如:
 +<code java>
 +// 没有指定默认值,将返回 Optional
 +Optional<NbtCompound> config = nbt.getCompound("config");
 +
 +// 当对应字段不存在时,返回空复合标签
 +NbtCompound config = nbt.getCompoundOrEmpty("config");
 +</code>
 +
 +而在 1.21.5 之前,默认都会返回零值或者空白,如果需要指定默认值需要先自行用 ''contains'' 方法进行判断,例如:
 +<code java>
 +// 当对应字段不存在时返回 0。
 +int value = nbt.getInt("value");
 +
 +// 当对应字段不存在时返回空复合标签。
 +NbtCompound config = nbt.getCompound("config");
 +</code>
 +
 +此外,自从 1.21.5 开始,整个 NBT 复合标签以及里面的字段,可以直接使用 [[codec]] 进行解码,例如:
 +<code java>
 +NbtCompound nbt = new NbtCompound();
 +nbt.put("Id", Identifier.CODEC, Identifier.of("tutorial", "example_id"));
 +Optional<Identifier> id = nbt.get("Id", Identifier.CODEC);
 +</code>
 +
 +<code java>
 +NbtCompound nbt = new NbtCompound();
 +// 需要使用 RegistryOps,因为物品堆在编码解码时需要访问注册表内容
 +nbt.copyFromCodec(ItemStack.MAP_CODEC, wrapperLookup.getOps(NbtOps.INSTANCE), new ItemStack(Items.WHEAT));
 +Optional<ItemStack> stack = nbt.decode(ItemStack.MAP_CODEC, wrapperLookup.getOps(NbtOps.INSTANCE));
 +</code>
 +
 +此外,从 1.21.5 开始,列表支持混合不同类型的元素,而在之前的版本中,混入不同类型的元素会导致报错。
 +
 +关于 NBT 变化的更多信息,请参见 [[https://fabricmc.net/2025/03/24/1215.html|Fabric for Minecraft 1.21.5]]。
 ===== 序列化数据 ===== ===== 序列化数据 =====
  
zh_cn/tutorial/blockentity_modify_data.1743510619.txt.gz · Last modified: 2025/04/01 12:30 by solidblock