存储模块
alaindustrial:storage_module
概览
存储模块——一个 27 格方块,它最擅长的是:与邻居合并。把两个模块紧挨着放——就成了 一个 54 格的一体仓库,共用一个窗口。三个——81。四个——108,这就是上限。
点击任意模块即可打开:窗口始终显示整个仓库,而不是你点击的那个方块的 27 格。
不需要能量,不需要红石,形状随意——墙、柱、L 形都行。唯一规则:模块之间必须以面 相接,而不是以棱或角。
示例: 放了一个模块,塞满了——不够。紧挨着再搭一个:打开两个中的任意一个,里面 已经是 54 格作为一个列表。
能量
| 字段 | 数值 |
|---|---|
| 角色 | 无 |
| 缓存(EU/FE) | 0 |
| 最大输入(EU/FE/刻) | n/a |
| 最大输出(EU/FE/刻) | n/a |
| EU/FE/刻 | 0 |
模块不参与能源网络:不传导 EU/FE,也不连接电缆。
物品栏
| 槽位 | 接受 | 数量 |
|---|---|---|
| 模块仓库 | 任何物品 | 27(3 行 × 9) |
物品物理上存放在被放入的那个模块里。 没有公共的「主」物品栏:仓库窗口是同时查看所有 模块物品栏的视图,而不是独立的存储。由此衍生出其余一切行为:破坏时掉落什么、卸载区块时 发生什么。
整体仓库如何累加
| 相邻模块数 | 仓库格数 | 总行数 | 可见行数 | 滚动 |
|---|---|---|---|---|
| 1 | 27 | 3 | 3 | 无 |
| 2 | 54 | 6 | 6 | 无(滚动条不激活) |
| 3 | 81 | 9 | 6 | 3 行 |
| 4 | 108 | 12 | 6 | 6 行 |
| 5 个或更多 | 108(上限) | 12 | 6 | 6 行 |
槽位和行数没有变——改变的只是窗口:它最多显示六行,其余通过右侧的滚动条呈现。为什么 是六——正好是原版大型箱子(游戏自带的最高容器窗口)的高度,到处都能放得下。
合并规则
当模块以面紧邻仓库的另一个模块时,它加入仓库。以棱或角相接不算——这样可以在紧贴的 情况下建成两个独立的仓库。 每次打开窗口时集合重新计算:遍历从你点击的模块开始。什么都不记忆,因此安装和拆除模块 不需要任何重建。 如果结构中模块超过四个,按遍历顺序的前四个会加入仓库。点击同一结构的不同模块可能得到 不同的四个——窗口会显示已连接多少模块,因此可见。
界面
两种窗口尺寸:单个模块的 3 行(176×166)和 任何更大仓库的 6 行(195×220)。 滚动条——网格右侧,面板宽度为此增加了 19 px。鼠标滚轮、拖动滑块和点击轨道都有效。 两个模块的仓库没什么可滚的,滚动条以不激活的色调绘制,而不是消失:时有时无的元素 比明显禁用的元素更难读。 Shift 点击也会把物品放入屏幕上看不见的行。 这不是小事:原版 shift 点击按菜单槽位 工作,而窗口正好有六行,因此「显而易见」的实现会默默停在仓库中间,一半还空着时就报 「已满」。 没有搜索——108 格还不足以需要它。
什么被同步。 ContainerData 中的两个数字:仓库总行数和窗口当前所在行。前者让客户端 绘制滚动条,后者让客户端放置滑块;两者都由服务器决定。滚动本身走原版的 , 按钮编号就是所需顶行;服务器会夹紧它,因此「显示第 500 行」的数据包不会读到仓库之外。
为什么是视图而不是槽位搬家。 Slot.x/Slot.y 是 public final,菜单槽位列表属于网络 契约:ClientboundContainerSetSlot 中的索引就是其中的位置,在活动菜单下重新组装列表会让 客户端失去同步。原版中唯一可滚动的展示(创造物品栏)也是这样做的:槽位不动,动的是容器 在它们背后负责的内容。
方块属性
| 字段 | 数值 |
|---|---|
| 形状 | 完整 16³ 立方体 |
| 硬度 | 3.0 |
| 爆炸抗性 | 6.0 |
| 工具 | 镐 |
| 带 NBT 掉落 | false——内容不保存在物品中 |
外观:仓库看起来像一个柜子
模块是带三个抽屉的钢制柜子:每个抽屉对应它为窗口添加的一行九格。顶部和底部不是抽屉, 而是带嵌入式服务面板的机身板。
相邻模块也会在外观上合并。两个模块相接的那个面上,框架消失:抽屉的正面跨过接缝延伸, 顶板融合成一个台面,框架只留在仓库的外围。2×2 的墙看起来像一个六抽屉柜,四个一排看起来 像一个长柜。
合并的外观恰好意味着仓库是一体的。 一旦结构中的模块超过四个,框架会立即全部回来, 结构再次看起来像一组独立柜子。这不是装饰,而是诚实的信号:在这种结构中仓库取决于点击 哪个模块(见「合并规则」),没有任何接缝能承诺两个方块是一个存储。移除多余的模块—— 合并外观就会回来。
以棱或角相接既不合并机制也不合并外观:两个仓库可以紧贴放置,视觉上仍然是分开的。
它是怎么画出来的。 合并被内置到方块模型本身,而不是叠加在上面。每个面被切成互不重叠 的矩形——每条棱一条,盖子的四个角像素和中间——每个矩形只绘制一次:要么取自带框架的 材质,要么取自「开放的」材质。没有任何东西向外偏移,也没有任何东西叠加在另一物上,因此 接缝既不会被单独的平面照亮,也不会产生台阶。第一版是在立方体上叠加偏移 0.1 方块的补丁, 玩家会在台面上看到沿接缝的凸起条,以及补丁结束处的短黑线。
盖子上的框架角同时属于两条棱,因此只有在两者都有邻居时才会被移除。不能把它交给一条 棱:「南北」接缝会在西部和东部框架上挖出两个像素的洞。
Blockstate 和 21 个模型是生成的(python tools/gen_storage_module_models.py),只能通过 生成器修改。--check 检查(在 和 pre-commit 中)将文件与生成器比对,并单独 证明无缝:每个面的每个像素只绘制一次,没有任何元素超出方块体积,而由模型组装的墙和台面 逐像素地与仅用带框架材质构建的「一个大柜子」参考一致。
破坏模块时只掉落其自身内容。 相邻模块不受影响:它们的物品就在它们那里,从未搬家。
破坏结构中间的模块只是把它撕裂成几部分——每部分成为独立的仓库。断开模块中的物品不会 掉落:它们留在原位,当连通性恢复时会再次出现在公共窗口中。
破坏紧邻仓库的组装机本身只会把其自身内容——蓝图队列和输出区—— 返还给玩家,而不动模块(TC-ASM-026 按精确数字计算掉落物,因此损失和双重掉落都可见)。 拆解仓库时的容量计数器会降到零,不会变成负数(TC-STOR-010——[Functional Storage] (https://github.com/AllTheMods/ATM-10/issues/2271) 的负计数器以崩溃告终)。
管道的填充和抽取由转移加固,而非端口的存在。 TC-STOR-012 让十六个锭在 箱子 → 管道 → 仓库之间往返,并单独验证「干跑」(simulate)不移动任何东西,且承诺的数量恰好等于实际 操作随后转移的数量——这两个数字的差异就是经典的复制(XNet #173)。
内容经受得住重启。 TC-STOR-013 让模块经过 NBT(与区块保存和加载相同的路径),并检查 槽位不会错位:两个占用槽位之间故意留出的空槽必须保持为空。
配方
合成:——原版箱子周围十字形摆 4 个 铁板。
配方刻意便宜:扩容是消耗品,而不是进度的里程碑。
进阶
等级:无——不需要能量,在最初的板材之后即可使用。 在存储系列中的位置:铁箱子 36 → 银箱子 45 → 金箱子 54 → 琥珀金箱子 81 → 模块仓库 108。箱子没有被贬值:它们以单个方块 提供全部容量,仓库需要四个。 之后:组装机将能直接从此类仓库取料。
相关内容
金箱子——上一级存储 材料形态——合成用的板材 库存显示物品展示框——未加载区块防护的范例 组装机——仓库的未来消费者 物品管道——从外部填充仓库
合成
有序合成
▶
存储模块
用于
有序合成
▶
组装机