多方块框架
基本信息
| 属性 | 值 |
|---|---|
| 核心 trait | net.bdew.lib.multiblock.MachineCore |
| 自绑定类型 | this: Machine[_ <: BlockController[_]] => |
| 方块类 | BlockController / BlockModule / BlockOutput |
| Tile 类 | TileController / TileModule / TileOutput |
| 网络通道 | bdew.multiblock(multiblock/network/NetHandler.scala) |
multiblock/ Scala 文件数 |
38 |
功能
multiblock/ 是 BD lib 中最大的子系统(38 个 .scala 文件),提供一套「控制器 + 模块」的多方块机器框架。与多数多方块模组不同,它的组装规则不是硬编码的形状匹配,而是由配置文件驱动的。
MachineCore 与配置段
MachineCore(multiblock/MachineCore.scala:16-19)是一个自绑定 trait,要求宿主同时是一个 Machine[_ <: BlockController[_]]。它在构造时通过 cfgSectionToMap 读取两个配置段:
| 配置段 | 含义 | 用途 |
|---|---|---|
Modules |
模块种类 → 允许的最大数量 | 限制每种模块最多能连几个 |
Required |
模块种类 → 必需数量 | 判定结构是否「搭建完成」 |
cfgSectionToMap(MachineCore.scala:22-33)把配置段中的 EntryDouble 值统一 .toInt 转换;若某项不是可转整数的值则直接 sys.error 报出「Invalid config value」并中止游戏。
方块与 Tile 分工
| 类 | 角色 |
|---|---|
BlockController |
机器的中央控制器方块,每个多方块结构有且仅有一个 |
BlockModule |
功能模块方块,可连接成组,提供加工/存储能力 |
BlockOutput |
输出面方块,用于把产物送入相邻机器 |
对应 Tile 为 TileController、TileModule、TileOutput,另有 TileControllerGui、RSControllableOutput。
模块的连接与拆除
BlockModule(multiblock/block/BlockModule.scala:26-34)继承 Block 并混入 HasTE[T]、ConnectedTextureBlock、BlockTooltip 三个 trait。它重写了四个方块生命周期方法,全部委托给 Tile:
canPlaceBlockAt— 放置前要求Tools.findConnections(...)找到的连接数 ≤ 1(即不能一次连成一片)onBlockPlacedBy/onNeighborBlockChange— 放置后与邻块变化时调用getTE(...).tryConnect()breakBlock— 拆除前调用getTE(...).onBreak()canConnect— 仅当两者已属于同一个 core 时才允许互连(me.getCore == other.getCore)
模块方块使用连接纹理(ConnectedTextureBlock)并取 resources.edge 作为边缘图标(BlockModule.scala:39-40),resources 由 ResourceProvider 抽象提供。
红石控制
输出面支持 4 种红石模式,由 MsgOutputCfgRSMode 封包配置。zh_CN.lang 中的对应文案为:
| 键 | 中文 | 英文 |
|---|---|---|
bdlib.rsmode.always |
一直启用 | Always ON |
bdlib.rsmode.never |
一直停用 | Disabled |
bdlib.rsmode.rs_on |
接收到红石信号时启用 | Enable on redstone |
bdlib.rsmode.rs_off |
接收到红石信号时停用 | Disable on redstone |
错误提示
zh_CN.lang 提供了 4 条多方块相关的错误提示键:bdlib.multiblock.disabled(停用)、bdlib.multiblock.incomplete(未搭建完成,提示至少需要安装一个)、bdlib.multiblock.notconnected(未连接有效机器)、bdlib.multiblock.toomanyoutputs(输出接口过多)。
数值
| 数值名 | 值 |
|---|---|
| 驱动组装规则的配置段 | 2(Modules / Required) |
| 方块基类 | 3(Controller / Module / Output) |
| Tile 基类 | 3(TileController / TileModule / TileOutput) |
| 红石模式数 | 4 |
| 模块放置时的最大连接数 | ≤ 1(BlockModule.canPlaceBlockAt) |
| 网络通道名 | bdew.multiblock |
| 本模组注册的多方块实例 | 0(框架不自带具体机器) |
交互
框架本身不提供可放置的方块。以下交互由使用该框架的下游模组机器提供,BD lib 负责其中的一致性逻辑:
| 触发 | 行为 |
|---|---|
| 玩家手持模块方块右键放置 | 若该位置会连成超过 1 个连接则拒绝放置 |
| 模块方块被放置或邻块变化 | Tile 执行 tryConnect(),尝试并入某个 core |
| 模块方块被破坏 | Tile 执行 onBreak(),解散所属结构 |
| 玩家右键输出面 | 打开输出面配置界面,可切换红石模式与输出槽(MsgOutputCfg / MsgOutputCfgSlot) |
| 结构模块数不足 | 提示 bdlib.multiblock.incomplete,该机器不工作 |
相关条目
- 模块方块 -
BlockModule的连接判定、连接纹理与拆除行为 - 注册框架 -
MachineManagerMultiblock如何收集并查询控制器 - 封包编解码 - 多方块配置封包如何序列化与反序列化
- DataSlot 数据槽框架 - 机器状态的存储与同步