StorageInterface

Данная библиотека для Inner Core позволяет описать взаимодействие блоков с трубами, воронками и прочими предметами для транспортировки предметов и жидкостей с помощью интерфейсов хранилищ, а так же добавляет методы для извлечения и загрузки предметов и жидкостей.

Загрузка

Версия Ссылка Список изменений Дата релиза
6 Скачать - Библиотека обновлена на InnerCore для Horizon: добавлена поддержка новых ванильных контейнеров. 18.04.2020
5 Скачать - Исправлена ошибка взаимодействия с tile entity без интерфейса хранилища в методе StorageInterface.transportLiquid 09.03.2020
4 Скачать

- Улучшена работа с жидкостями
- В интерфейс добавлено поле liquidStorage

05.03.2020
3 Скачать релиз библиотеки 02.02.2020

Импорт

Для добавления библиотеки в мод ее файл (StorageInterface.js) нужно добавить в директорию lib/ в директории мода (если таковой нету, то ее нужно создать).

Для импорта библиотеки в мод в заголовочном файле (или если он остутвует в первом файле кода) следует добавить строку:

IMPORT("StorageInterface");

Интерфейсы хранилищ блоков

На данный момент интерфейсы привязываются только к tile entity, но в будущем по умолчанию интерфейсы будут прописаны у контейнеров из Майнкрафта, прежде всего печки.

Интерфейс для хранилища добавляется с помощью метода StorageInterface.createInterface(id блока, объект интерфейса).
Регистрация слотов в интерфейсе выглядит так:

StorageInterface.createInterface(id блока, {
    slots: {
        "slot1": {
            input: true/false, // может ли слот принимать предметы
            output: true/false, // может ли слот отдавать предметы
            isValid: function(item, side, tileEntity){ // может ли слот принять предмет item со стороны side
                return true/false;
            },
            canOutput: function(item, side, tileEntity){ // можно ли извлечь предмет из слота (item - предмет в слоте)
                return true/false;
            }
        },
        "slot2": {
            ...
        },
        ...
    }
});


Так же интерфейс хранилища обладает следующими функциями, которые могут быть перезаписаны в объекте интерфейса:

Название Аргументы Описание
isValidInput item, side, tileEntity Аналогична функции isValid слота, но действует на все слоты контейнера. По умолчанию возвращает true.
addItem item, side, maxCount Функция добавления предмета, может быть перезаписана. Возвращает количество добавленных предметов.
getOutputSlots side Возвращяет слоты выхода, с которыми возможна работа с определённой стороны.
canReceiveLiquid liquid, side Может ли tile entity принять жидкость с именем liquid со стороны side. По умолчанию возвращает false.
canTransportLiquid liquid, side Может ли tile entity отдать жидкость с именем liquid со стороны side. По умолчанию возвращает false.
addLiquid liquid, amount Функция добавление жидкости. По умолчанию работает с liquidStorage.
getLiquid liquid, amount Функция извлечения жидкости. По умолчанию работает с liquidStorage. В функциях StorageInterface для передачи жидкости сначала извлекается весь возможный объём жидкости, а потом функция вызывается повторно с отрицательным amount для возвращения жидкости, которую не удалось передать.
getLiquidStored storage, side Функция получения жидкости, хранящейся в tile entity. В функциях StorageInterface аргумент storage равен "input" если проверяется жидкость для добавления, и"output" если для извлечения.
 
Интерфейс хранилища сохраняется в поле interface объекта tile entity. В экземпляре интерфейса есть следующие указатели:
tileEntity - на tile entity, к которому он привязан;
container - на контейнер tile entity;
liquidStorage - на хранилище жидкости tileEntity.
 
Добавление интерфейса для tile entity на примере железной печки из мода IndustrialCraft 2
StorageInterface.createInterface(BlockID.ironFurnace, {
    slots: {
        "slotSource": {
            input: true,
            isValid: function(item, side){
                return side != 0 && Recipes.getFurnaceRecipeResult(item.id, "iron");
            }
        },
        "slotFuel": {
            input: true, 
            isValid: function(item, side){
                return side != 1 && Recipes.getFuelBurnDuration(item.id, item.data) > 0;
            }
        },
        "slotResult": {output: true}
    }
});
 

Методы для передачи предметов и жидкостей

Название Аргументы Описание
getNearestContainers coords, side, sideExcluded Возвращает соседние с блоком на координатах coords контейнеры в виде массива. Если указан параметр side, то вернёт контейнер с этой стороны. Если sideExcluded равен true, то наоборот, все контейнеры кроме контейнера с указанной стороны.
getNearestLiquidStorages coords, side, sideExcluded Аналогична предыдущей, но возвращает все соседние tile entity, имеющие хранилища жидкостей.
putItems items, containers Добавляет предметы из массива items в контейнеры из массива containers. Удобно использовать в связке с методом getNearestContainers.
putItemToContainer item, container, side, maxCount Метод более низкого уровня, на котором основана работа предыдущего метода. Добавляет стак предметов в контейнер, но позволяет также указать максимальное количество предметов, которое может быть передано за раз.
extractItemsFromContainer inputTile, container, side, maxCount, oneStack

Позволяет извлечь предмет из контейнера и добавить его в tile entity.
inputTile - tile entity, в который будут добавлены предметы
container - контейнер, из которого будут извлечены предметы
maxCount - сколько предметов может быть извлечено (по умолчанию не ограничено)
oneStack - если true, то будет извлечён только один стак предметов.

transportLiquid liquid, maxAmount, outputTile, inputTile, outputSide

Передаёт жидкость из одного tile entity в другой.
liquid - название жидкости
maxAmount - максимальное количество, которое будет передано
outputTile - tile entity, из которого будет передана жидкость
inputTile - tile entity, в который будет передана жидкость
outputSide - сторона, через которую передаётся жидкость

extractLiquid liquid, maxAmount, inputTile, outputTile, inputSide

Похож на предыдущий, но позволяет извлечь жидкость из tile entity
liquid - в отличие от предыдущего метода жидкость может быть не указана, тогда извлечёт жидкость, которая хранится в outputTile.
inputSide - сторона, в которую будет поступать жидкость

checkHoppers tileEntity Позволяет tile entity взаимодействовать с воронками. Для этого должна выполняться в функции тика tile entity. Требует интерфейса хранилища у tile entity для работы.
addItemToSlot item, slot, count Внутренний метод библиотеки для добавления предмета в слот. При использовании на нативном контейнере нужно также установить слот, используя container.setSlot.
 

Обратная совместимость

Данная библиотека совместима с модами, использующими старый стандарт описания слотов tile entity через функцию getTransportSlots, а так же добавляет эту функцию и функцию addTransportedItem для tile entity при создании его интерфейса.