Drawer Network(抽屉网络)
基本信息
| 属性 | 值 | 来源 |
|---|---|---|
| 类型 | 连通性网络(不是固定尺寸多方块结构) | — |
| 控制器(根节点) | StorageDrawers:controller(BlockController + TileEntityController) |
ModBlocks.java:66,99 |
| 必需方块 | 仅 Controller 本身 | — |
| 中继方块 | StorageDrawers:controllerSlave(BlockSlave)—— 只提供连通性,不贡献槽位 |
TileEntityController.java:575-577 |
| 存储方块 | fullDrawers1/2/4、halfDrawers2/4、compDrawers、fullCustom1/2/4、halfCustom2/4 |
ModBlocks.java:60-76 |
| 非槽位成员 | trim / trimCustom——实现 INetworked 但无 TileEntity,槽位贡献 0 |
TileEntityController.updateRecordInfo else 分支 |
| 成员资格判定 | 该坐标方块必须 instanceof INetworked |
TileEntityController.java:567 |
结构要求
这不是"几×几×几"的刚性多方块——没有任何尺寸校验、没有 validateStructure、没有脚手架放置。真实约束只有两条:
- 传播半径:从 Controller 起点算,每跳的切比雪夫距离
depth = max(|dx|,|dy|,|dz|)必须≤ range,range取自配置controller.range,默认 12(ConfigManager.java:503) - 连通性:范围只是上限,实际能否纳入取决于是否存在一条完全由
INetworked方块构成的正交连通链。中间可以隔着普通方块,BFS 会穿过它们
- 最小规模:1 个 Controller(可管理 0 个抽屉,此时网络为空)
- 无"最大规模"硬性上限;实际受
controller.maxDrawers约束 - 多个 Controller 各自独立成网,不会互相合并,也不存在"10 个控制器"这类总上限
形成机制
BlockController构造时setTickRandomly(true);updateTick每tickRate=100 tick 在服务端调用te.updateCache()重建整张网络表onPostBlockPlaced放置后立即updateCache()- 无需手动注册或激活——放置即生效,破坏后 100 tick 内自动从网络中移除
- Slave 无需"放在 Controller 旁边"这一单独规则:它和抽屉一样靠 BFS 连通性被纳入,位置只需在网络路径上
功能
- 统一管理网络内所有抽屉的存取与标签显示
- 无 GUI:
BlockController.onBlockActivated中不存在player.openGui(...);原条目"玩家可通过 Controller GUI 查看所有连接的抽屉"是虚构的 - 侧向访问:
TileEntityController implements ISidedInventory(autoSides默认{0,1,2,3,4,5}即六面全开) - 钥匙系统:支持锁定(Lock)、遮蔽(Shroud)、量化(Quantify)、个人所有权(Personal),均由钥匙物品右键切换,无 KeyBinding
- 双击速倾:点击正面后 10 tick 内同一玩家再点,改为倾倒整个背包(
TileEntityController.java:185-208)
数值
| 数值 | 值 | 来源 |
|---|---|---|
| 每 Controller 最大抽屉方块数 | 2048(配置 controller.maxDrawers) |
ConfigManager.java:505 |
| 每 Controller 最大槽位数 | 无固定值 = 纳入网络的各 BlockDrawers 自身 drawerCount 之和 |
TileEntityController.java:544 |
扫描半径 range |
12(配置 controller.range,切比雪夫距离) |
ConfigManager.java:503 |
| 最大 Controller 数量 / 最大总槽位 160 | 源码中无此概念(原文编造) | — |
| 缓存刷新间隔 | 100 tick | BlockController.java:36-38 |
| 双击倾倒窗口 | 10 tick | TileEntityController.java:185 |
| 自动向侧面输出 | 6 面全开(autoSides = {0,1,2,3,4,5}) |
TileEntityController.java:145 |
| 侧向输入 / 侧向输出 | 均可通过 enableSidedInput / enableSidedOutput 关闭(默认均 true) |
ConfigManager.java:375-378 |
⚠️ 订正(严重):原文"每 Controller 最大槽位 16""最大 Controller 数量 10""最大总槽位 160""扫描半径约 5 格"四个数值在源码中全部找不到依据。真实值是
range=12、maxDrawers=2048(且 2048 统计的是方块数不是槽位数),Controller 数量无上限。
限制
- Controller 之间不自动同步,各成独立网络(原文此项正确)
- Slave 不增加槽位数量、不计入
maxDrawers,仅提供连通路径(原文此项正确) - 只能纳入在
range球形范围内、且存在INetworked连通链的方块 - Trim 参与连通但槽位贡献为 0
- 距离按切比雪夫距离计算,因此"上方 12 格 + 水平 12 格"的方块同样在范围内
参与方块
控制器
- Controller - 网络根节点 / BFS 起点
中继
- Controller Slave - 只提供连通性,不贡献槽位
存储方块(贡献槽位)
- Full Drawers 1x1 - 1 槽
- Full Drawers 2x2 - 2 槽
- Full Drawers 4x4 - 4 槽
- Half Drawers 2x1 - 2 槽(半深)
- Half Drawers 4x2 - 4 槽(半深)
- Comp Drawers - 3 槽(压缩存储)
- Custom Drawers - 5 个变体,1/2/4 槽
仅连通性(槽位贡献 0)
- Trim - 装饰条,无 TileEntity
- Trim Custom - 有
TileEntityTrim但非IDrawerGroup,同样不贡献槽位