实体同步

实体同步

除了常规网络消息外,还有多种系统用于同步实体数据。

客户端需要且不随时间变化的数据随实体生成包发送;动态数据由 SynchedEntityData 从服务端自动同步至客户端。

原创说明图,依据 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。