跳到正文
烈焰甘蔗Wiki

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 - 从属节点,扩展主控制器的覆盖范围,将检测到的抽屉纳入网络管理

相关条目

第三方集成

集成 Mod 集成类型 功能
Applied Energistics 2 ME 网络 从属控制器参与 ME 网络
Chisel 变体注册 从属控制器变体的 Chisel 变体注册
MineTweaker 脚本集成 OreDictionary 黑/白名单
GTNH 配方注册 GTNH/dreamcraft 配方系统
Backhand 副手兼容 副手交互兼容性
浏览全部模组