Модуль хранения
alaindustrial:storage_module
Сводка
Модуль хранения — блок на 27 слотов, который умеет главное: срастаться с соседями. Поставьте два модуля вплотную — и это уже одно хранилище на 54 слота с общим окном. Три — 81. Четыре — 108, и это потолок.
Открывается щелчком по любому модулю: окно всегда показывает весь склад целиком, а не 27 слотов того блока, по которому щёлкнули.
Энергия не нужна, редстоун не нужен, форма произвольная — стенка, столб, буква Г. Единственное правило: модули должны касаться гранями, а не рёбрами и не углами.
Мини-пример: поставили модуль, забили — не хватило. Пристроили второй вплотную: открываете любой из двух, а внутри уже 54 слота одним списком.
Энергия
| Поле | Значение |
|---|---|
| Роль | нет |
| Буфер (EU/FE) | 0 |
| Макс. вход (EU/FE/такт) | н/п |
| Макс. выход (EU/FE/такт) | н/п |
| 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 кончался крашем).
Наполнение и выемка трубой закреплены переносом, а не наличием порта. TC-STOR-012 гоняет шестнадцать слитков сундук → труба → склад и обратно и отдельно сверяет, что «сухой прогон» ничего не двигает и обещает ровно столько, сколько потом переносит реальная операция — расхождение этих двух чисел и есть классический дюп (XNet #173).
Содержимое переживает перезагрузку. TC-STOR-013 гоняет модуль через NBT (тот же путь, что сохранение и загрузка чанка) и проверяет в том числе, что слоты не съезжают: намеренно пустой слот между двумя занятыми обязан остаться пустым.
Рецепты
Крафт — 4 железные пластины крестом вокруг ванильного сундука.
Рецепт намеренно дешёвый: наращивание объёма — расходник, а не веха прогрессии.
Прогрессия
Тир: none — энергии не требует, доступен сразу после первых пластин. Место в линейке хранения: железный сундук 36 → серебряный 45 → золотой 54 → электрумовый 81 → склад из модулей 108. Сундуки не обесцениваются: они дают весь объём одним блоком, склад требует четырёх. Дальше: сборочный автомат сможет брать сырьё прямо из такого склада.
Связанное
Золотой сундук — предыдущая ступень хранения Формы материалов — пластины для крафта Рамка-индикатор — образец защиты от невыгруженных чанков Сборочный автомат — будущий потребитель склада Предметная труба — наполняет склад снаружи
Крафт
Крафт на верстаке
▶
Модуль хранения
Используется в
Крафт на верстаке
▶
Сборочный автомат