多方块框架

基本信息

属性 值
核心 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,该机器不工作

相关条目