客户端-服务端同步

基本信息

属性 值
集成 trait net.bdew.lib.data.base.TileDataSlots
基础类 TileExtended + DataSlotContainer
封包类型 net.minecraft.network.play.server.S35PacketUpdateTileEntity
GUI 封包动作 ID ACT_GUI
自动触发标记 markBlockForUpdate / markBlockRangeForRenderUpdate / markTileEntityChunkModified

功能

TileDataSlots(data/base/TileDataSlots.scala:17)把 DataSlot 框架接入 Forge 1.7.10 的 TileEntity 更新机制。它在构造时一次性订阅四个内部事件,从而自动建立四条同步通路:

订阅事件 触发的同步 源码行
persistSave 以 UpdateKind.SAVE 序列化 TileDataSlots.scala:18
persistLoad 以 UpdateKind.SAVE 反序列化 TileDataSlots.scala:19
sendClientUpdate 以 UpdateKind.WORLD 序列化 TileDataSlots.scala:20
handleClientUpdate 以 UpdateKind.WORLD 反序列化 TileDataSlots.scala:21-32

变更通知的粒度控制

dataSlotChanged(TileDataSlots.scala:38-47)是槽位变化后的统一回调,按槽位的 updateKind 集合分别决定动作:

  • 含 GUI → 记录 lastChange = world.getTotalWorldTime(供 GUI 侧判断新鲜度)
  • 含 WORLD 且非客户端 → markBlockForUpdate(xCoord, yCoord, zCoord)
  • 含 SAVE → markTileEntityChunkModified(xCoord, yCoord, zCoord, this)

渲染更新

handleClientUpdate 中额外判断:若任一槽位的 updateKind 含 RENDER,则调用 getWorldObj.markBlockRangeForRenderUpdate 触发客户端重渲染(TileDataSlots.scala:22-32)。

GUI 封包

getDataSlotPacket(TileDataSlots.scala:49-53)以 UpdateKind.GUI 序列化进一个新建的 NBTTagCompound,包装为 S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, ACT_GUI, tag) 返回。对应的 extDataPacket(TileDataSlots.scala:55-59)在收到 ACT_GUI 动作时以同样方式反序列化。

数值

数值名 值
构造期自动订阅的事件数 4
UpdateKind 同步档位 4(WORLD / GUI / SAVE / RENDER)
dataSlotChanged 中按标记分派的分支数 3(GUI / WORLD / SAVE)
渲染更新范围 单个 TileEntity 所在坐标(markBlockRangeForRenderUpdate 传入同一组 x/y/z)

交互

本条目描述的是框架内部的同步通路,玩家不可直接触发。其可观察效果依附于使用该框架的具体机器:

触发 行为
服务端机器状态变化且槽位含 WORLD 客户端方块收到 S35PacketUpdateTileEntity 更新
玩家打开机器 GUI 客户端接收 ACT_GUI 封包,GUI 中的数值与服务器一致
槽位含 RENDER 客户端强制重渲染该方块(用于流体、连接纹理等外观变化)
世界保存 含 SAVE 的槽位随 TileEntity 落盘

相关条目