Controller Slave(从属控制器)
基本信息
| 属性 | 值 |
|---|---|
| 注册名 | StorageDrawers:controllerSlave |
| TileEntity | TileEntitySlave |
| 硬度 | 5.0 |
| 爆炸抗性 | BlockSlave 构造器只调用 setHardness(5f),从未调用 setResistance,也未覆写 getExplosionResistance;材质 Material.rock,具体数值取父类默认值(本仓库源码中无此数值) |
| 透明性 | 否 |
| 声音 | 石头 |
功能
从属控制器(Controller Slave)是抽屉网络的辅助方块,用于扩展主控制器的覆盖范围。本身不直接管理抽屉,而是将所辖范围内的抽屉通过主控制器统一管理。
工作原理
BlockSlave extends BlockContainer implements INetworked(BlockSlave.java:20),是网络洪泛填充的中继节点- 它不自己扫描周围方块。
TileEntityController.populateNodes遇到BlockSlave时只做getTileEntitySafe(...)初始化,然后继续向 6 个邻面扩展(TileEntityController.java:576) - 覆盖半径与 Controller 完全相同:切比雪夫距离 ≤
controller.range,默认 12(原文"5 格内"是错的) BlockSlave只贡献连通性,不贡献槽位:drawersCount只在block instanceof BlockDrawers时自增,Slave 被显式排除在maxDrawers计数之外- 不提供 GUI:
BlockSlave没有覆写onBlockActivated,源码中无openGui调用
槽位代理(原文"不直接管理槽位"表述不准确)
TileEntitySlave 实现了 IDrawerGroup / IPriorityGroup / ISmartGroup / ISidedInventory,并把自身代理到已绑定的 Controller:
getDrawerCount()→controller.getDrawerCount()(TileEntitySlave.java:213-218)getSizeInventory()→controller.getSizeInventory()(TileEntitySlave.java:131-136)- 两者都先经
controller.isValidSlave(selfCoord)校验:要求该坐标已在网络中(record.mark)且record.storage == null(即自身确实是个中继而非漏记的抽屉),否则一律返回0/1
也就是说,Slave 对外暴露整个 Controller 的槽位列表(供管道 / 自动化按 ISidedInventory 访问),只是自己不拥有存储。
覆盖范围
- 有效半径与 Controller 相同:切比雪夫距离 ≤
range,默认 12(ConfigManager.java:503) - 与主控制器范围重叠时不存在"优先级"——同一次 BFS 里两者都是普通节点,范围以每个 Controller 各自为原点计算
- 源码中不存在"每个网络最多 8 个 Slave"的限制。
TileEntitySlave只在 NBT 里存一个controllerCoord(bindController仅比对坐标),isValidSlave也只做布尔校验,全仓库没有任何 Slave 数量计数器 - 不存在"级联"层级:Slave 不是向父 Slave 注册,而是与 Controller 处在同一次 BFS 洪泛的同层。一个 Slave 后面再挂 Slave 只是把连通路径延长,总传播距离仍受根 Controller 的
range球形范围约束
摆放要求
- 必须通过一条由
INetworked方块构成的连通链接入 Controller,且整条链到根 Controller 的切比雪夫距离都不超过range(默认 12);否则isValidSlave返回false,getDrawerCount()恒为 0 - 典型用途:把主控制器球形范围之外的抽屉群"接进来",相当于延长连通路径
- 不可单独使用:没有 Controller 时
getController()为null,getDrawerCount()返回 0、getSizeInventory()返回 1,getStackInSlot等一律空转 - 材质
Material.rock,setHardness(5f),setStepSound(Block.soundTypeStone)(BlockSlave.java:28-35) BlockSlave未覆写canPlaceBlockAt/onBlockActivated,放置与交互均走方块默认行为
交互
| 触发 | 行为 |
|---|---|
| 左键 | 无特殊行为 |
| 右键 | 无特殊行为 |
数值
| 数值名 | 值 | 来源 |
|---|---|---|
| 挖掘难度 | 5.0 | BlockSlave.java:32 |
| 步进声音 | Block.soundTypeStone |
BlockSlave.java:34 |
| 有效传播半径 | 随根 Controller 的 range,默认 12 |
ConfigManager.java:503 |
| 每个网络最大 Slave 数 | 源码中无此限制(原文的 8 是编造的) | — |
| 代理槽位数 | 等于所绑定 Controller 的槽位数 | TileEntitySlave.java:213-218 |
与 Controller 的区别
| 特性 | Controller | Controller Slave |
|---|---|---|
| 网络核心 | 是(BFS 根节点) | 否(仅连通性中继) |
| GUI 功能 | 无(源码无 openGui) |
无 |
| 独立管理抽屉 | 是 | 否(自身 storage == null) |
| 需连接 Controller | 否 | 是(isValidSlave 校验) |
| 槽位管理 | drawerSize 由各抽屉累加,无固定上限 |
代理 Controller 的 getDrawerCount(),自身不持有 |
是否计入 maxDrawers |
否(自身非 BlockDrawers) |
否(BlockSlave 被显式排除) |
onBlockActivated |
有(钥匙切换 + 正面插入) | 未覆写,走默认行为 |
典型布局
原文这张 5×5 网格暗示"5 格半径",与源码不符。真实约束是以 Controller 为球心的切比雪夫距离 ≤ range(默认 12),且传播会穿过非 INetworked 方块沿连通链进行,因此布局是链式/网状而非固定网格:
[D][D][D][D][D][.] ... . = 非 INetworked 普通方块,可被连通链穿过
[D][S][S][S][S][D] S = Controller Slave(中继)
[D][S][C][S][D] C = Controller(根)
[D][S][S][S][S][D] D = Drawer(抽屉)
[D][D][D][D][D][.] ...
只要 [C]—[S]—[S]—[S] 这条链本身连通,链上的每个位置都会在同一次 BFS 中被访问,从而把球形范围内的抽屉纳入网络。Slave 越密并不改变范围上限,只改变连通性——真正决定覆盖的是 range 与连通路径本身。
所属多方块结构
- Drawer Network - 从属节点,扩展主控制器的覆盖范围,将检测到的抽屉纳入网络管理
相关条目
- Controller - 主控制器,网络的核心节点
- Drawer Network - 抽屉网络的整体架构说明
第三方集成
| 集成 Mod | 集成类型 | 功能 |
|---|---|---|
| Applied Energistics 2 | ME 网络 | 从属控制器参与 ME 网络 |
| Chisel | 变体注册 | 从属控制器变体的 Chisel 变体注册 |
| MineTweaker | 脚本集成 | OreDictionary 黑/白名单 |
| GTNH | 配方注册 | GTNH/dreamcraft 配方系统 |
| Backhand | 副手兼容 | 副手交互兼容性 |