StorageInterface

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

Загрузка

Версия Ссылка Список изменений Дата релиза
9 Скачать
  • Новые методы для интерфейсов хранилищ:
    - getContainerSlots()
    - getInputSlots(side)
    - getReceivingItemCount(item, side)
    - addItemToSlot(name, item, maxCount)
    - clearContainer()
  • Исправлен стандартный интерфейс TIleEntity
14.12.2020
8 Скачать
  • Поддержка мультиплеера
  • Добавлены стандартные интерфейсы для всех видов контейнеров
  • Добавлены методы для получение интерфейсов хранилищ
  • Добавлены методы для установки валидации предметов и макс стака слотов в ItemContainer
10.12.2020
7 -

- В описании слота в интерфейсе хранилища теперь можно указать стороны, через которые с ним можно взаимодействовать

10.06.2020
6 Скачать - Библиотека обновлена на InnerCore для Horizon: добавлена поддержка новых ванильных контейнеров. 18.04.2020
5 Скачать - Исправлена ошибка взаимодействия с tile entity без интерфейса хранилища в методе StorageInterface.transportLiquid 09.03.2020
4 Скачать
  • Улучшена работа с жидкостями
  • В интерфейс добавлено поле liquidStorage
05.03.2020
3 Скачать - Релиз библиотеки 02.02.2020
</div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div>

Импорт

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

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

IMPORT("StorageInterface");
 

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

Интерфейсы хранилищ объединяют в себе функции для работы с контейнерами и хранилищем жидкости и позволяют описать логику передачи предметов и жидкостей. В библиотеке есть стандартные интерфейсы для ванильных контейнеров и TileEntity, но вы можете зарегистрировать свой собственный для вашего TileEntity.

Регистрация интерфейса хранилища

StorageInterface.createInterface(id блока, прототип интерфейса).

Все параметры слотов и функции прототипа интерфейса опциональны.
Прототип интерфейса выглядит так:

StorageInterface.createInterface(id блока, {
    slots: {
        "slot1": {
            input: boolean, // может ли слот принимать предметы
            output: boolean, // может ли слот отдавать предметы
            // Сторона блока, через которую доступен слот.
            // Значение - число или одна из настроек: "horizontal", "verctical", "down", "up".
            side: int | string,
            // Максимальное количество предметов в слоте
            maxStack: int,
            // Может ли слот принять предмет item со стороны side
            isValid: function(item, side, tileEntity) {
                return boolean;
            },
            // Можно ли извлечь предмет из слота (item - предмет в слоте)
            canOutput: function(item, side, tileEntity) {
                return boolean;
            }
        },
        // Означает все слоты с индексами от 2 до 10 (slot2, slot3, ..., slot10).
        "slot^2-10": {
            ...
        },
        ...
    },
    // функции интерфейса
});


Функции интерфейса хранилища

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

Название Аргументы Описание
getSlot name Возвращает слот контейнера.
setSlot name, id, count, data, extra Устанавливает предмет в слот контейнера.
isValidInput item, side, tileEntity Аналогична функции isValid слота, но действует на все слоты контейнера. По умолчанию возвращает true.
addItem item, side, maxCount Функция добавления предмета. Возвращает количество добавленных предметов.
addItemToSlot name, item, maxCount Добавляет предмет в слот контейнера, maxCount - максимальное количество предмета, которое будет добавлено.

getReceivingItemCount

item, side Возвращает сколько предметов из стака контейнер может принять.

getContainerSlots

- Возвращает все слоты контейнера
getInputSlots side Возвращяет названия слотов входа, доступных со стороны side.
getOutputSlots side Возвращает названия слотов выхода, доступных со стороны side.
clearContainer - Очищает содержимое контейнера
canReceiveLiquid liquid, side Может ли TileEntity принять жидкость с именем liquid со стороны side. По умолчанию возвращает true если в liquidStorage установлен лимит для этой жидкости.
canTransportLiquid liquid, side Может ли TileEntity отдать жидкость с именем liquid со стороны side. По умолчанию возвращает true если в liquidStorage установлен лимит для этой жидкости.
addLiquid liquid, amount Функция добавление жидкости. По умолчанию работает с liquidStorage.
getLiquid liquid, amount Функция извлечения жидкости. По умолчанию работает с liquidStorage.
getLiquidStored storageName

Функция получения жидкости, хранящейся в tile entity. Позволяет возвращать разные жидкости для входа и выхода.
storageName - "input" для получения жидкости на вход и "output" для жидкости на выход.

getLiquidStorage storageName

Возвращает хранилище жидкости. По умолчанию возвращает liquidStorage из TileEntity. Позволяет использовать альтернативные хранилища жидкостей.
storageName - "input" для хранилища, принимающего жидкость, и "output" для отдающего.

 
В экземпляре интерфейса также есть следующие поля:
isNativeContainer - true если контейнер является ванильным, false если из TileEntity.
container - контейнер;
tileEntity - если создан для TileEntity.
 
Регистрация интерфейса для TileEntity на примере железной печки из мода IndustrialCraft 2
StorageInterface.createInterface(BlockID.ironFurnace, {
    slots: {
        "slotSource": {
            input: true,
            side: "up",
            isValid: function(item, side){
                return Recipes.getFurnaceRecipeResult(item.id, "iron");
            }
        },
        "slotFuel": {
            input: true,
            side: "horizontal",
            isValid: function(item, side){
                return Recipes.getFuelBurnDuration(item.id, item.data) > 0;
            }
        },
        "slotResult": {output: true}
    }
});

Методы для получения интерфесов хранилищ

  • StorageInterface.newStorage(container или tileEntity) - возвращает новый интерфейс хранилища для TileEntity или контейнера.
  • StorageInterface.getStorage(blockSource, x, y, z) - возвращает интерфейс хранилища для блока, являющегося контейнером.
  • StorageInterface.getLiquidStorage(blockSource, x, y, z) - возвращает интерфейс хранилища, если на указанных координатах находится TileEntity с хранилищем жидкости.
  • StorageInterface.getNeighbourStorage(blockSource, coords, side) - возвращает интерфейс хранилища для соседнего блока со стороны side.
  • StorageInterface.getNeighbourLiquidStorage(blockSource, coords, side) - возвращает интерфейс хранилища для соседнего блока со стороны side, если там находится TileEntity с хранилищем жидкости.

Остальные методы StorageInterface

Название Аргументы Описание
getNearestContainers coords, blockSource Возвращает соседние контейнеры относительно блока на координатах coords в виде объекта, где ключами являются стороны блока.
getNearestLiquidStorages coords, blockSource Работает аналогично предыдущему, но возвращает интерфейсы хранилищ для всех соседних TileEntity, имеющих хранилища жидкостей.
putItems items, containers Добавляет предметы из массива items в контейнеры из объекта, возвращаемого методом getNearestContainers.
putItemToContainer item, container, side, maxCount

Добавляет стак предметов в контейнер.
maxCount - максимальное количество предметов, которое может быть передано за раз (по умолчанию 64).

Возвращает количество переданных предметов.

extractItemsFromContainer inputСontainer , outputContainer, side, maxCount, oneStack

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

Возвращает количество переданных предметов.

extractItemsFromStorage inputStorage, outputStorage, side, maxCount, oneStack Аналогичен предыдущему, но принимает аргументами интерфейсы хранилищ.
transportLiquid liquid, maxAmount, outputStorage, inputStorage, outputSide

Передаёт жидкость из одного TileEntity в другой.
liquid - название жидкости
maxAmount - максимальное количество, которое будет передано
outputStorage - интерфейс хранилища или TileEntity, из которого будет передана жидкость
inputStorage - интерфейс хранилища, принимающего жидкость
outputSide - сторона блока, через которую передаётся жидкость.

Возвращает количество переданной жидкости.

extractLiquid liquid, maxAmount, inputStorage, outputStorage, inputSide

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

Возвращает количество переданной жидкости.

checkHoppers tileEntity Позволяет TileEntity взаимодействовать с воронками. Для этого должен вызываться в функции тика TileEntity .
addItemToSlot item, slot, maxCount

Добавляет стак предметов в слот. Изменяет только объект слота, для корректной работы требуется установить слот через container.setSlot.
maxCount - максимальное количество, которое будет передано в слот (по умолчанию 64).

Возвращает количество переданных предметов.