原文:MinecraftForge/Documentation · 目标版本:Forge 1.20.1
实体(Entities)¶
除了常规的网络消息之外,还有其他各种系统可用于同步实体(Entity)数据。
生成数据(Spawn Data)¶
一般来说,模组实体的生成由 Forge 单独处理。
Note
这意味着仅仅继承一个原版实体类可能不会继承它的全部行为。某些原版行为可能需要你自己实现。
你可以通过实现以下接口,向 Forge 发送的生成数据包(spawn packet)中添加额外数据。
IEntityAdditionalSpawnData¶
如果你的实体拥有客户端需要、但不会随时间变化的数据,那么可以通过此接口将其添加到实体生成数据包中。#writeSpawnData 和 #readSpawnData 控制数据应如何编码到/解码自网络缓冲区(network buffer)。
动态数据(Dynamic Data)¶
数据参数(Data Parameters)¶
这是将实体数据从服务器同步到客户端的主要原版系统。因此,有大量原版示例可供参考。
首先,你需要为想要保持同步的数据准备一个 EntityDataAccessor<T>。它应作为实体类中的 static final 字段存储,通过调用 SynchedEntityData#defineId 并传入实体类和该数据类型对应的序列化器(serializer)来获得。可用的序列化器实现可以在 EntityDataSerializers 类中以静态常量的形式找到。
Warning
你应该__只__为自己的实体、_在该实体类内部_创建数据参数。 为你无法控制的实体添加参数可能导致用于通过网络发送该数据的 ID 失去同步,从而引发难以调试的崩溃。
然后覆写(override)Entity#defineSynchedData,并为你的每个数据参数调用 this.entityData.define(...),传入参数和要使用的初始值。记住一定要先调用 super 方法!
之后,你就可以通过实体的 entityData 实例获取和设置这些值了。所做的更改会自动同步到客户端。
待复核清单¶
- 1.20.1(Mojang 官方映射)中
SynchedEntityData#defineId(Class<T>, EntityDataSerializer<T>)、Entity#defineSynchedData()、entityData.define(...)均与原文一致,无需改动。 - 1.20.1 的
IEntityAdditionalSpawnData位于net.minecraftforge.entity包,接口方法为writeSpawnData(FriendlyByteBuf)/readSpawnData(FriendlyByteBuf),与原文一致。 - 原文未提及
EntityDataSerializers的具体可用常量(如BYTE、INT、BOOLEAN、STRING等),按原文直译,未额外补充,如需可后续增补示例。