DisplayEntity 是一种“自定义展示实体”框架,适合在世界中渲染自定义模型/几何,并支持服务端同步到客户端。
- 服务端:维护实体数据并同步(
DisplayEntityManager负责发送包)。 - 客户端:渲染
DisplayEntity.render(...)。
DisplayEntity 自带位置、旋转、缩放与生命周期管理。
@CooAutoRegister
class MyDisplayEntity(pos: Vec3, world: Level?) : DisplayEntity(pos, world) {
@CodecField var lookDir = Vec3(0.0, 1.0, 0.0)
override fun render(
view: Matrix4f,
proj: Matrix4f,
modelMatrixStack: PoseStack,
buffer: MultiBufferSource,
delta: Float,
camera: Camera
) {
// 自定义渲染逻辑
}
override fun getCodec(): StreamCodec<FriendlyByteBuf, DisplayEntity> {
return DisplayEntityHelper.generateCodec(this)
}
}使用 @CodecField 标记字段即可自动同步:
- 字段必须
var且类型已在CodecHelper注册 - 需要
(Vec3, Level?)或无参构造
@CooAutoRegister 会被自动扫描注册,无需手动调用扫描函数。Fabric 只需:
CooAPIScanner.registerPacket("your.mod.package")DisplayEntity 默认会自动管理旋转(manageRotation = true)。
- 如果你在
render()内自己做旋转,请设置manageRotation = false,避免重复旋转。 renderCenterOffset()控制旋转中心。transformOffset()控制整体偏移。
spawn(world, pos):服务端生成并同步。tick():默认更新prevPos/prevYaw/prevPitch/prevRoll。remove():设置valid = false,客户端会移除。
- 若需要“面向目标”,可在
tick()中调用lookAt(direction)。 DisplayEntityManager会自动每 tick 同步服务端实例到客户端。