zh_cn:tutorial:blockentity
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
zh_cn:tutorial:blockentity [2024/08/27 02:14] – solidblock | zh_cn:tutorial:blockentity [2025/04/01 12:20] (current) – [方块实体刻] solidblock | ||
---|---|---|---|
Line 30: | Line 30: | ||
[...] | [...] | ||
| | ||
- | public static final DemoBlock DEMO_BLOCK = register(" | + | |
+ | // public static final DemoBlock DEMO_BLOCK = register(" | ||
+ | |||
+ | // 对于 1.21.2 及之后的版本 | ||
+ | public static final DemoBlock DEMO_BLOCK = register(" | ||
| | ||
[...] | [...] | ||
Line 44: | Line 48: | ||
public static final BlockEntityType< | public static final BlockEntityType< | ||
" | " | ||
- | BlockEntityType.Builder.create(DemoBlockEntity:: | + | |
+ | // 对于 1.21.2 之前的版本,请使用 | ||
+ | FabricBlockEntityTypeBuilder.create(DemoBlockEntity:: | ||
); | ); | ||
| | ||
Line 69: | Line 75: | ||
对于旧版本,如果无法访问 '' | 对于旧版本,如果无法访问 '' | ||
- | 这个方块实体类型定义了只有 '' | + | 这个方块实体类型定义了只有 '' |
> **注意:**和其他方块一样,这个方块也需要方块模型和物品模型,可能也需要战利品表,关于如何创建请参见 [[blocks]]。对于战利品表,有[[blockentity_sync_itemstac|后续教程]]会提到如何改进战利品表表以包含方块实体数据。 | > **注意:**和其他方块一样,这个方块也需要方块模型和物品模型,可能也需要战利品表,关于如何创建请参见 [[blocks]]。对于战利品表,有[[blockentity_sync_itemstac|后续教程]]会提到如何改进战利品表表以包含方块实体数据。 | ||
Line 101: | Line 107: | ||
覆盖'' | 覆盖'' | ||
- | |||
- | ===== 序列化数据 ===== | ||
- | |||
- | 如果您想在 '' | ||
- | |||
- | '' | ||
- | |||
- | 知道了这一点,下面的示例演示了如何将 '' | ||
- | |||
- | <code java> | ||
- | public class DemoBlockEntity extends BlockEntity { | ||
- | |||
- | // 储存数字的当前值 | ||
- | private int number = 7; | ||
- | |||
- | public DemoBlockEntity(BlockPos pos, BlockState state) { | ||
- | super(ExampleMod.DEMO_BLOCK_ENTITY, | ||
- | } | ||
- | |||
- | // 序列化方块实体 | ||
- | @Override | ||
- | public void writeNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup wrapper) { | ||
- | // 将数字的当前值保存到 nbt | ||
- | nbt.putInt(" | ||
- | |||
- | super.writeNbt(nbt, | ||
- | } | ||
- | } | ||
- | </ | ||
- | |||
- | 为了以后读取数据,您还需要覆盖 '' | ||
- | |||
- | <code java> | ||
- | // 反序列化方块实体 | ||
- | @Override | ||
- | public void readNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup wrapper) { | ||
- | super.readNbt(nbt, | ||
- | | ||
- | number = nbt.getInt(" | ||
- | } | ||
- | </ | ||
- | |||
- | 一旦实现了 '' | ||
- | |||
- | ===== 将服务器数据同步至客户端 ===== | ||
- | 数据通常是在服务器世界读取的。大多数数据都是客户端不需要知道的,例如客户端并不需要知道箱子和熔炉里面有什么,除非打开它。但对于某些方块实体,例如告示牌和旗帜,你需要将所有或者部分数据告知客户端,比如用于渲染。 | ||
- | |||
- | 对于 1.17.1 及以下版本,请实现 Fabric API 中的 '' | ||
- | |||
- | 对于 1.18 及以上版本,请覆盖 '' | ||
- | <code java> | ||
- | @Nullable | ||
- | @Override | ||
- | public Packet< | ||
- | return BlockEntityUpdateS2CPacket.create(this); | ||
- | } | ||
- | |||
- | @Override | ||
- | public NbtCompound toInitialChunkDataNbt() { | ||
- | return createNbt(); | ||
- | } | ||
- | </ | ||
- | **警告**: 需要调用 '' | ||
===== 方块实体刻 ===== | ===== 方块实体刻 ===== | ||
Line 182: | Line 125: | ||
在你的 '' | 在你的 '' | ||
<code java DemoBlockEntity.java> | <code java DemoBlockEntity.java> | ||
- | public class DemoBlockEntity extends BlockEntity { | + | public class DemoBlockEntity extends BlockEntity |
[...] | [...] | ||
| | ||
- | public static void tick(World world, BlockPos pos, BlockState state, DemoBlockEntity | + | |
+ | | ||
[...] | [...] | ||
} | } |
zh_cn/tutorial/blockentity.1724724881.txt.gz · Last modified: 2024/08/27 02:14 by solidblock