实体
除了常规的网络消息之外,Forge还提供了各种其他系统来处理同步实体数据。
生成数据
一般来说,由模组编写的实体的生成是由Forge单独处理的。
!!! 注意 这意味着简单地继承一个原版实体类可能不会继承它的所有行为。你可能需要自己实施某些原版行为。
你可以通过实现以下接口向Forge发送的生成数据包添加额外的数据。
IEntityAdditionalSpawnData
如果你的实体具有客户端所需的数据,但不会随时间变化,则可以使用此接口将其添加到实体生成数据包中。#writeSpawnData
和#readSpawnData
控制如何将数据编码到网络缓冲区/从网络缓冲区解码数据。
动态数据
数据参数
这是用于将实体数据从服务端同步到客户端的主要原版系统。因此,可以参考一些原版的例子。
首先,对于要保持同步的数据,你需要一个EntityDataAccessor<T>
。这应该存储为你的实体类中的static final
字段,通过调用SynchedEntityData#defineId
并传递实体类和该类型数据的序列化器来获得。可用的序列化器实现可以在EntityDataSerializers
类中的静态常量找到。
!!! 警告 你应该 只 在相应实体的类 中为自己的实体创建数据参数。 向并非你所控制的实体添加参数可能会导致用于通过网络发送数据的ID不同步,从而导致难以调试的崩溃。
然后,重写Entity#defineSynchedData
并为每个数据参数调用this.entityData.define(...)
,传递参数和要使用的初始值。请记住始终首先调用super
方法!
然后,你可以通过实体的entityData
实例获取并设置这些值。所做的更改将自动同步到客户端。