跳到正文
烈焰甘蔗Wiki

Controller(抽屉控制器)

基本信息

属性 值
注册名 StorageDrawers:controller
TileEntity TileEntityController
硬度 5.0
爆炸抗性 源码从未调用 setResistance,也未覆写 getExplosionResistance;材质为 Material.rock,具体数值取 Minecraft 父类默认值(本仓库源码中无此数值)
透明性 否
声音 石头

功能

抽屉控制器是 StorageDrawers 抽屉网络的核心方块,用于发现、连接和管理周围的抽屉方块。

网络发现

网络发现不是"扫描周围 5 格"。TileEntityController.populateNodes 的真实算法是 BFS 洪泛填充(block/tile/TileEntityController.java:550-597):

  1. 以控制器自身为根节点入队,逐层展开
  2. 每次取出一个坐标,计算其与根节点的 切比雪夫距离(max(|dx|,|dy|,|dz|))作为 depth
  3. depth > range 则跳过;range 取自配置 controller.range,默认 12(ConfigManager.java:503)
  4. 该位置方块必须 instanceof INetworked(即 BlockController / BlockSlave / BlockDrawers / BlockTrim 及其子类)
  5. 向 6 个正交邻面继续扩展,直到队列为空

因此覆盖范围是以控制器为球心的球形区域,且会穿过中间的非抽屉方块沿连通路径继续传播——只要有一条由 INetworked 方块构成的连通链,整条链都在网络内。

  • 容量上限:配置项 controller.maxDrawers,默认 2048(ConfigManager.java:505)。该计数统计的是 BlockDrawers 方块个数(if (block instanceof BlockDrawers && ++drawersCount > maxDrawers) break;),不是槽位数;BlockSlave 不计入
  • 槽位总数由各抽屉方块自身的 drawerCount 累加得出(drawerSize += record.drawerStorageSize),源码中没有 16 槽 / 160 槽之类的固定上限
  • 多个控制器各自独立成网,源码中没有"10 个控制器"或跨控制器合并的机制

状态与标签显示

  • 支持显示所连接抽屉的物品图标、名称和数量
  • 物品图标和数量随实际存储情况实时更新
  • 遮蔽 / 数量显示由 TileEntityController.toggleShroud / toggleQuantify 逐网络切换,源码中不存在 KeyBinding 注册,切换只能靠钥匙物品右键

交互行为

四把钥匙的判定在 BlockController.onBlockActivated 中按 item.getItem() 精确比较(非 instanceof),且在方向判定之前先 return true,面向哪一面都生效:

  • 遮蔽钥匙(shroudKey)→ te.toggleShroud(profile)
  • 升级锁(upgradeLock)→ te.toggleLock(EnumSet.allOf(LockAttribute.class), LockAttribute.LOCK_POPULATED, profile),即全量锁定属性 + 锁定"非空"
  • 个人钥匙(personalKey)→ 按 metadata 取 getSecurityProviderKey 查 securityRegistry,再 te.toggleProtection(profile, provider)
  • 数量钥匙(quantifyKey)→ te.toggleQuantify(profile)

控制器本身不接受升级物品:源码只判定上述 4 把钥匙,其余情况一律落到方向判定分支。

放置行为

  • onBlockPlacedBy:物品有自定义显示名时 setInventoryName(...);随后在客户端侧 invalidate() + markBlockForUpdate
  • onPostBlockPlaced:服务端调用 te.updateCache() 建立网络缓存(原文把两个回调的服务端/客户端写反了)
  • updateTick:setTickRandomly(true),服务端每 tickRate=100 tick 重建一次缓存并 scheduleBlockUpdate 续期
  • rotateBlock(ForgeDirection axis):六面方向(tile.setDirection(axis.ordinal())),并把面内 rotation 归零。原文"根据 Forge 方向旋转"易被误解为四方位;实际是 6 个离散朝向 × 0/90/180/270 面内旋转

摆放要求

  • 可放置于任意固体方块表面
  • 最佳放置位置为抽屉组的中心位置,以便覆盖周围5格范围
  • 建议配合 Controller Slave 扩展覆盖范围

交互

控制器没有任何 GUI:BlockController.onBlockActivated 中不存在 player.openGui(...) 调用。原文"左键打开控制器 GUI 查看所有抽屉"是虚构的。

onBlockActivated 的真实判定顺序:

  1. SecurityManager.hasAccess(profile, te) 不通过 → 直接 return false
  2. 手持 4 把钥匙之一 → 切换对应网络属性并 return true(无视点击的面)
  3. 其余情况要求 te.getDirection() == side,即必须点击控制器正面,否则 return false
  4. 正面点击 → te.interactPutItemsIntoInventory(player)
触发 行为
任意键,点击非正面(side != getDirection()) return false,无任何效果(没有 GUI 弹出)
任意键,点击正面,手中无物 走 interactPutItemsIntoInventory:手持为空故本轮插入 0 个;若 10 tick 内由同一玩家再次点击,则改为倾倒整个背包(遍历 0..player.inventory.getSizeInventory())
任意键,点击正面,手中持物 把手持整叠插入网络(insertItems,按 enumerateDrawersForInsertion 分配,受 IProtectable 权限过滤)
右键(遮蔽钥匙) 切换整个网络的遮蔽(隐藏/显示所有标签)
右键(升级锁) 切换全网络锁定:所有 LockAttribute + LOCK_POPULATED
右键(个人钥匙) 切换整个网络的个人保护(按 metadata 解析安全提供者)
右键(数量钥匙) 切换整个网络的数量显示
右键(升级物品 / 胶带 / 任意其他物品) 无钥匙效果,落到正面判定分支后按普通物品插入处理

数值

数值名 值 来源
挖掘难度 5.0(setHardness(5f)) BlockController.java:51
步进声音 Block.soundTypeStone BlockController.java:53
Tick间隔 100 tick(tickRate) BlockController.java:36-38
光线透明度 255(完全不透明) BlockController.java:54
发光强度 0(源码从未调用 setLightLevel,取父类默认 0) —
扫描半径 range 默认 12(配置 controller.range) ConfigManager.java:503
抽屉方块数上限 maxDrawers 默认 2048(配置 controller.maxDrawers,统计 BlockDrawers 块数) ConfigManager.java:505
方向数 6(setDirection(x) { direction = x % 6; }) TileEntityController.java:171-173
面内旋转 4 向(rotation = ((x % 4) + 4) % 4) TileEntityController.java:179-181
双击倾倒判定窗口 10 tick,同一玩家 UUID TileEntityController.java:185
槽位总数 无固定值,由纳入网络的各抽屉方块 drawerCount 累加 TileEntityController.java:544

原文"每个控制器最大槽位数 16""最多约160个槽位"在源码中没有任何依据,属于编造数值。

渲染特性

  • renderAsNormalBlock = false:不作为完整方块渲染
  • isOpaqueCube = false:不遮挡邻近方块的光照
  • 使用 neighborBrightness 特殊渲染,根据相邻方块亮度调整自身亮度

所属多方块结构

  • Drawer Network - 抽屉网络的核心节点,负责发现和管理网络中所有连接的抽屉方块

相关条目

第三方集成

集成 Mod 集成类型 功能
Waila 工具提示 显示抽屉网络标签和数量
NEI 配方/隐藏 物品显示和隐藏
Applied Energistics 2 ME 网络 连接控制器到 ME 存储网络
Chisel 变体注册 控制器变体的 Chisel 变体注册
MineTweaker 脚本集成 OreDictionary 黑/白名单
GTNH 配方注册 GTNH/dreamcraft 配方系统
Backhand 副手兼容 副手交互兼容性
浏览全部模组