实体
除了常规网络消息,Minecraft 还提供了多种系统来同步实体数据。
生成数据
Mojang 从 1.20.2 开始引入捆绑数据包(Bundle packet),用于将实体生成包一起发送。这让生成包可以携带更多数据,并提高这些数据的发送效率。
可以实现下面的接口,向 NeoForge 发送的生成包中加入额外数据。
IEntityWithComplexSpawn
如果实体有客户端需要、但不会随时间改变的数据,可以通过此接口将其加入实体生成包。#writeSpawnData 和 #readSpawnData 分别控制如何将数据编码到网络缓冲区,以及如何从中解码。
也可以重写 IEntityExtension#sendPairingData。该方法在向客户端发送实体初始数据时于服务器上调用,可用于把额外载荷放入与生成包相同的捆绑包中发送给客户端。
动态数据参数
这是原版将实体数据从服务器同步到客户端的主要系统,可以参考许多原版实现。
首先,为需要同步的数据创建 EntityDataAccessor<T>。它应作为实体类中的 static final 字段保存,通过调用 SynchedEntityData#defineId,传入实体类及该数据类型的序列化器获得。可用的序列化器实现以静态常量形式定义在 EntityDataSerializers 类中。
注意 只应在自己的实体类内部,为自己的实体创建数据参数。为不受自己控制的实体添加参数,可能导致网络上传输数据所用的 ID 不同步,进而产生难以调试的崩溃。
然后重写 Entity#defineSynchedData,为每个数据参数调用 SynchedEntityData.Builder#define,传入该参数及初始值。记得始终先调用 super 方法!
之后可通过实体的 entityData 实例获取和设置这些值。修改会自动同步到客户端。
来源: NeoForged/Documentation(1.21.1)。中文翻译依据提交
4a680cdd4d15。