实体同步
除了常规网络消息外,还有多种系统用于同步实体数据。
原创说明图,依据 Forge 1.21.x 官方文档 绘制。
生成数据
一般而言,Mod 实体的生成由 Forge 单独处理。
注意:因此,仅继承原版实体类可能无法继承其全部行为。你可能需要自行实现某些原版行为。
可以通过实现下列接口,在 Forge 发送的生成数据包中加入额外数据。
IEntityAdditionalSpawnData
如果实体有客户端需要、但不会随时间变化的数据,可以通过此接口将其加入实体生成数据包。#writeSpawnData 和 #readSpawnData 控制如何将数据编码至网络缓冲区及从中解码。
动态数据
数据参数
这是原版将实体数据从服务端同步到客户端的主要系统,因此可参考许多原版示例。
首先,为需要同步的数据创建 EntityDataAccessor<T>。它应作为实体类中的 static final 字段保存,通过调用 SynchedEntityData#defineId 并传入实体类和该数据类型的序列化器获取。可用序列化器实现位于 EntityDataSerializers 类的静态常量中。
警告:只应在自己的实体类中为自己的实体创建数据参数。向你无法控制的实体添加参数可能导致网络传输使用的 ID 不同步,造成难以调试的崩溃。
然后重写 Entity#defineSynchedData,对每个数据参数调用 this.entityData.define(...),传入参数和初始值。务必先调用 super 方法!
之后可以通过实体的 entityData 实例获取和设置这些值,更改会自动同步到客户端。
原文:Entities。