DataSlot 数据槽框架
基本信息
| 属性 | 值 |
|---|---|
| 基础类型 | net.bdew.lib.data.base.DataSlot(trait) |
| 容器 | net.bdew.lib.data.base.DataSlotContainer |
| Tile 集成 | net.bdew.lib.data.base.TileDataSlots |
| 同步方向枚举 | net.bdew.lib.data.base.UpdateKind |
| 具体槽位实现 | 12 个 + base 8 个 |
| NBT 存储格式 | NBTTagCompound,以槽位 name 为子标签键 |
功能
DataSlot 是 BD lib 处理「机器状态」的基础设施:一个槽位代表机器上的一个可序列化状态量(整数、浮点、物品栏、流体罐、方向、开关……),框架自动负责它的存档、客户端同步与 GUI 刷新。
槽位基类
DataSlot(data/base/DataSlot.scala:15)要求实现者提供 parent(所属容器)与 name(唯一名)两个抽象字段,并在构造时就把自身登记进容器(parent.dataSlots += (name -> this))。源码注释明确警告:这两个字段在构造函数中被访问,因此必须是构造参数或 lazy val,否则会崩溃。
默认同步目标为 Set(UpdateKind.GUI)(DataSlot.scala:31),可用 setUpdate(vals: _*) 覆盖。基类还提供两个带变更通知的包装器 execWithChangeNotify 与 execWithChangeConditional,执行后自动回调 parent.dataSlotChanged(this)。
UpdateKind
UpdateKind(data/base/UpdateKind.scala)是一个 Scala Enumeration,定义 4 个同步目标:
| 值 | 含义 |
|---|---|
WORLD |
需要通知客户端方块更新 |
GUI |
需要在打开 GUI 时同步 |
SAVE |
需要写入存档 |
RENDER |
需要触发客户端重渲染 |
提供的具体槽位
data/ 目录下共 12 个具体实现(不含 base):
| 槽位类 | 承载状态 |
|---|---|
DataSlotInt |
整数 |
DataSlotFloat |
浮点数 |
DataSlotDouble |
双精度浮点 |
DataSlotBoolean |
布尔开关 |
DataSlotString |
字符串 |
DataSlotOption |
枚举选项 |
DataSlotDirection |
六面方向 |
DataSlotFluidOption |
流体选项 |
DataSlotItemStack |
单个物品堆栈 |
DataSlotInventory |
物品栏 |
DataSlotTank |
流体罐 |
DataSlotGameProfile |
玩家 UUID / 游戏档案 |
DataSlotMovingAverage |
滑动平均(用于速率统计) |
data/base/ 下的 8 个文件提供分层基类:DataSlot、DataSlotContainer、DataSlotNumeric、DataSlotOrdered、DataSlotVal、TileDataSlots、ContainerDataSlots、UpdateKind。
数值
| 数值名 | 值 |
|---|---|
UpdateKind 成员数 |
4(WORLD / GUI / SAVE / RENDER) |
| DataSlot 默认 updateKind | Set(GUI) |
| 具体槽位实现数 | 12 |
| base 层文件数 | 8 |
data/ 目录 Scala 文件总数 |
21 |
交互
DataSlot 本身不产生玩家交互,它是其他机器 TileEntity 的内部组件。玩家能观察到的间接效果:
| 触发 | 行为 |
|---|---|
| 打开机器 GUI | 自动把标记了 GUI 的槽位写入 NBT 并以 S35PacketUpdateTileEntity(ACT_GUI)发给客户端 |
| 存档 | 标记 SAVE 的槽位随 TileEntity 落盘 |
| 槽位值变化 | 若含 SAVE 标记,调用 markTileEntityChunkModified 标记区块脏 |