客户端-服务端同步
基本信息
| 属性 | 值 |
|---|---|
| 集成 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 落盘 |
相关条目
- DataSlot 数据槽框架 - 槽位基类、12 种具体实现与
UpdateKind枚举 - 多方块框架 - 使用该同步机制的控制器 TileEntity