模块方块
基本信息
| 属性 | 值 |
|---|---|
| 类 | net.bdew.lib.multiblock.block.BlockModule[T <: TileModule] |
| 父类 | net.minecraft.block.Block |
| 混入 trait | HasTE[T] / ConnectedTextureBlock / BlockTooltip |
| 构造参数 | name、kind、material、TEClass、machines |
| 源码行 | multiblock/block/BlockModule.scala:26-34 |
功能
BlockModule 是多方块框架中可重复堆叠的功能模块方块基类。它的 kind 参数是该模块的类型标识 —— 配置段 Modules 与 Required 中的键即为 kind,因此同类模块方块可以在同一个结构中放置多个。
构造参数
| 参数 | 类型 | 作用 |
|---|---|---|
name |
String |
方块注册名 |
kind |
String |
模块种类标识,用于匹配 Modules / Required 配置项 |
material |
Material |
传给 Block 父类的材质 |
TEClass |
Class[T] |
绑定的 TileEntity 类(经 HasTE 混入后用于自动注册) |
machines |
MachineManagerMultiblock |
反查该模块可用于哪些控制器机器 |
连接判定
canConnect(BlockModule.scala:77-84)的实现刻意排除了「新结构互吸」的情况:只有当两个方块已经共享同一个 core 时才返回 true,否则两者都能判定对方可连接,从而在放置瞬间互相吸附成一个非法结构。判定条件为 me.connected.contains(target) 或 other.getCore == me.getCore,且 me.getCore.isDefined。
canPlaceBlockAt(BlockModule.scala:41-42)配合该规则:放置前用 Tools.findConnections(world, BlockRef(x, y, z), kind) 统计已连接的同 kind 模块,超过 1 个则拒绝。
连接纹理与图标
通过 ConnectedTextureBlock 混入获得自动连接纹理,edgeIcon 覆写为 resources.edge(BlockModule.scala:39-40),资源由 resources: ResourceProvider 抽象方法提供。
生命周期钩子
模块方块把全部结构性行为委托给 Tile:
| 方块方法 | 委托调用 | 源码行 |
|---|---|---|
onBlockPlacedBy |
getTE(...).tryConnect() |
BlockModule.scala:44-59 |
onNeighborBlockChange |
getTE(...).tryConnect() |
BlockModule.scala:55-70 |
breakBlock |
getTE(...).onBreak() 后调用父类 |
BlockModule.scala:65-74 |
数值
| 数值名 | 值 |
|---|---|
| 覆写的方块生命周期方法 | 4(canPlaceBlockAt / onBlockPlacedBy / onNeighborBlockChange / breakBlock) |
| 放置时允许的同 kind 连接数上限 | 1 |
| 混入的 trait 数 | 3 |
| 构造参数数 | 5 |
| 本模组提供的具体模块方块 | 0(BlockModule 为 abstract class) |
交互
BlockModule 是抽象类,不存在可直接放置的实例。其交互行为供下游模组继承后使用:
| 触发 | 行为 |
|---|---|
| 玩家手持模块方块放置 | 邻接同 kind 模块数 > 1 时拒绝放置 |
| 放置成功 / 相邻方块变化 | Tile 尝试 tryConnect() 并入结构;kind 相同的模块会优先聚合 |
| 玩家拆除模块方块 | Tile 执行 onBreak(),若结构因此不再满足 Required 则该机器转入 incomplete 状态 |
| 玩家查看方块 | 经 BlockTooltip 显示 bdlib.multiblock.tip.* 系列提示,说明该模块可安装到哪些机器中 |