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 [2022/05/26 09:24] – Add a prompt to actively trigger BlockEntity synchronization moheng | zh_cn:tutorial:blockentity [2025/04/01 12:20] (current) – [方块实体刻] solidblock | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== 添加一个方块实体 ====== | + | ====== 添加方块实体 ====== |
===== 介绍 ===== | ===== 介绍 ===== | ||
+ | **方块实体**主要用于在方块内存储数据。创建之前,您需要一个[[blocks|方块]]。本教程将介绍 BlockEntity 类的创建及其注册。 | ||
- | BlockEntity主要用于在方块内存储数据。创建之前,您需要一个[[zh_cn: | + | ===== 创建方块实体 ===== |
- | ===== 创建一个方块实体 | + | 最简单的方块实体仅继承 '' |
- | 最简单的方块实体仅继承'' | + | < |
- | + | ||
- | <code java> | + | |
public class DemoBlockEntity extends BlockEntity { | public class DemoBlockEntity extends BlockEntity { | ||
public DemoBlockEntity(BlockPos pos, BlockState state) { | public DemoBlockEntity(BlockPos pos, BlockState state) { | ||
- | super(ExampleMod.DEMO_BLOCK_ENTITY, pos, state); | + | super(TutorialBlockEntityTypes.DEMO_BLOCK, pos, state); |
} | } | ||
} | } | ||
</ | </ | ||
- | 下面将向您展示如何创建'' | + | 请确保这个构造方法只接收这两个参数,否则我们后面写的方法引用 '' |
- | 您可以简单地向此准系统类添加变量,或实现诸如'' | + | 方块实体支持一系列方法以支持一些功能,例如与 NBT 之间的序列化和反序列化、提供物品栏等。本教程提供方块实体功能的最常见一些实现。 |
- | ===== 注册你的方块实体 ===== | + | ===== 注册方块和方块实体 ===== |
- | 一旦创建了'' | + | 一旦创建了 '' |
- | '' | + | '' |
- | <code java> | + | < |
- | public | + | public |
- | + | [...] | |
- | @Override | + | |
- | public void onInitialize() { | + | // 对于 1.21.2 之前的版本 |
- | | + | |
+ | |||
+ | // 对于 1.21.2 及之后的版本 | ||
+ | public static final DemoBlock DEMO_BLOCK = register(" | ||
+ | |||
+ | [...] | ||
} | } | ||
</ | </ | ||
- | ==== 将方块实体连接到方块 ==== | + | <code java TutorialBlockEntityTypes.java> |
+ | public class TutorialBlockEntityTypes { | ||
+ | public static <T extends BlockEntityType<?>> | ||
+ | return Registry.register(Registries.BLOCK_ENTITY_TYPE, | ||
+ | } | ||
- | 一旦创建并注册了'' | + | public static final BlockEntityType< |
+ | " | ||
+ | |||
+ | // 对于 1.21.2 之前的版本,请使用 BlockEntityType.Builder。 | ||
+ | FabricBlockEntityTypeBuilder.create(DemoBlockEntity:: | ||
+ | ); | ||
+ | |||
+ | public static void initialize() { | ||
+ | } | ||
+ | } | ||
- | <code java> | + | </ |
- | public class DemoBlock extends Block implements | + | |
- | + | 记得要在 '' | |
+ | < | ||
+ | public class ExampleMod | ||
[...] | [...] | ||
- | + | | |
@Override | @Override | ||
- | public | + | public |
- | | + | |
+ | |||
+ | TutorialBlockEntityTypes.initialize(); | ||
} | } | ||
} | } | ||
</ | </ | ||
- | ===== 序列化数据 ===== | + | 对于旧版本,如果无法访问 '' |
- | 如果要将任何数据存储在 | + | 这个方块实体类型定义了只有 |
- | '' | + | > **注意:**和其他方块一样,这个方块也需要方块模型和物品模型,可能也需要战利品表,关于如何创建请参见 [[blocks]]。对于战利品表,有[[blockentity_sync_itemstac|后续教程]]会提到如何改进战利品表表以包含方块实体数据。 |
- | <code java> | + | ==== 将方块实体连接到方块 ==== |
- | public class DemoBlockEntity extends BlockEntity { | + | |
- | // 储存数字的当前值 | + | 一旦创建并注册了 '' |
- | | + | |
- | | + | <code java DemoBlock.java> |
- | public | + | public class DemoBlock extends BlockWithEntity { |
- | super(ExampleMod.DEMO_BLOCK_ENTITY, | + | public |
+ | super(settings); | ||
} | } | ||
- | + | ||
- | // 序列化方块实体 | + | |
@Override | @Override | ||
- | | + | |
- | | + | |
+ | } | ||
- | // Save the current value of the number to the tag | + | @Override |
- | | + | public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { |
+ | | ||
} | } | ||
- | } | ||
- | </ | ||
- | 为了以后检索数据,您还需要覆盖 '' | + | |
- | + | | |
- | <code java> | + | |
- | // 取消序列化方块实体 | + | |
- | @Override | + | |
- | public void readNbt(NbtCompound tag) { | + | |
- | super.readNbt(tag); | + | |
- | | + | |
} | } | ||
</ | </ | ||
- | 一旦实现了 | + | 覆盖'' |
- | ===== 将服务器数据同步至客户端 ===== | ||
- | 数据通常是在服务器世界读取的。有时候你需要将所有或者部分数据同步到客户端,比如用于渲染。 | ||
- | |||
- | 对于 1.17.1 及以下版本,请实现 Fabric API 中的'' | ||
- | |||
- | 对于 1.18 及以上版本,请覆盖 '' | ||
- | <code java> | ||
- | @Nullable | ||
- | @Override | ||
- | public Packet< | ||
- | return BlockEntityUpdateS2CPacket.create(this); | ||
- | } | ||
- | |||
- | @Override | ||
- | public NbtCompound toInitialChunkDataNbt() { | ||
- | return createNbt(); | ||
- | } | ||
- | </ | ||
- | **警告**: 需要调用'' | ||
===== 方块实体刻 ===== | ===== 方块实体刻 ===== | ||
- | 1.17 添加了静态的刻,然后你就可以实现 '' | + | 刻是指方块在每一刻(每 |
在你的 '' | 在你的 '' | ||
- | <code java> | + | < |
public class DemoBlock extends BlockWithEntity { | public class DemoBlock extends BlockWithEntity { | ||
[...] | [...] | ||
- | @Override | + | |
- | public BlockRenderType getRenderType(BlockState state) { | + | |
- | // 由于继承了BlockWithEntity,这个默认为INVISIBLE,所以我们需要更改它! | + | |
- | return BlockRenderType.MODEL; | + | |
- | } | + | |
@Override | @Override | ||
public <T extends BlockEntity> | public <T extends BlockEntity> | ||
- | return | + | |
+ | | ||
} | } | ||
</ | </ | ||
- | 在你的 '' | + | |
- | <code java> | + | 在你的 '' |
- | public class DemoBlockEntity extends BlockEntity { | + | < |
- | | + | public class DemoBlockEntity extends BlockEntity |
- | | + | |
- | | + | |
- | public static void tick(World world, BlockPos pos, BlockState state, DemoBlockEntity | + | |
+ | public static void tick(World world, BlockPos pos, BlockState state, DemoBlockEntity | ||
[...] | [...] | ||
} | } | ||
Line 140: | Line 135: | ||
</ | </ | ||
- | ===== 概览 | + | ===== 下一步 |
+ | |||
+ | 现在,您应该拥有自己的 '' | ||
- | 现在,您应该拥有自己的 '' | + | 你也学习了如何为它添加课刻。下一步,可以尝试对方块实体进行一些复杂的操作,例如: |
+ | * [[blockentity_modify_data|修改方块实体数据]] | ||
+ | * [[inventory|作为物品栏在方块实体存储物品]] | ||
+ | * [[blockentityrenderers|使用方块实体渲染器动态渲染]] | ||
+ | * [[screenhandler|创建容器方块]] |
zh_cn/tutorial/blockentity.1653557052.txt.gz · Last modified: 2022/05/26 09:24 by moheng