Controller(抽屉控制器)
基本信息
| 属性 | 值 |
|---|---|
| 注册名 | StorageDrawers:controller |
| TileEntity | TileEntityController |
| 硬度 | 5.0 |
| 爆炸抗性 | 源码从未调用 setResistance,也未覆写 getExplosionResistance;材质为 Material.rock,具体数值取 Minecraft 父类默认值(本仓库源码中无此数值) |
| 透明性 | 否 |
| 声音 | 石头 |
功能
抽屉控制器是 StorageDrawers 抽屉网络的核心方块,用于发现、连接和管理周围的抽屉方块。
网络发现
网络发现不是"扫描周围 5 格"。TileEntityController.populateNodes 的真实算法是 BFS 洪泛填充(block/tile/TileEntityController.java:550-597):
- 以控制器自身为根节点入队,逐层展开
- 每次取出一个坐标,计算其与根节点的 切比雪夫距离(
max(|dx|,|dy|,|dz|))作为depth depth > range则跳过;range取自配置controller.range,默认 12(ConfigManager.java:503)- 该位置方块必须
instanceof INetworked(即BlockController/BlockSlave/BlockDrawers/BlockTrim及其子类) - 向 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()+markBlockForUpdateonPostBlockPlaced:服务端调用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 的真实判定顺序:
SecurityManager.hasAccess(profile, te)不通过 → 直接return false- 手持 4 把钥匙之一 → 切换对应网络属性并
return true(无视点击的面) - 其余情况要求
te.getDirection() == side,即必须点击控制器正面,否则return false - 正面点击 →
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 - 抽屉网络的核心节点,负责发现和管理网络中所有连接的抽屉方块
相关条目
- Controller Slave - 从属控制器,扩展主控制器的网络覆盖范围
- Drawer Network - 抽屉网络的整体架构说明
第三方集成
| 集成 Mod | 集成类型 | 功能 |
|---|---|---|
| Waila | 工具提示 | 显示抽屉网络标签和数量 |
| NEI | 配方/隐藏 | 物品显示和隐藏 |
| Applied Energistics 2 | ME 网络 | 连接控制器到 ME 存储网络 |
| Chisel | 变体注册 | 控制器变体的 Chisel 变体注册 |
| MineTweaker | 脚本集成 | OreDictionary 黑/白名单 |
| GTNH | 配方注册 | GTNH/dreamcraft 配方系统 |
| Backhand | 副手兼容 | 副手交互兼容性 |