跳转至

原文: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 的具体可用常量(如 BYTEINTBOOLEANSTRING 等),按原文直译,未额外补充,如需可后续增补示例。