StorageInterface — различия между версиями

(не показано 37 промежуточных версий 7 участников)
Строка 1: Строка 1:
<div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output">
+
<div class="mw-parser-output">Данная библиотека для Inner Core позволяет описать взаимодействие блоков с трубами, воронками и прочими предметами для транспортировки предметов и жидкостей с помощью&nbsp;интерфейсов хранилищ, а так же добавляет методы для извлечения и загрузки предметов и жидкостей. <div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output">
Данная библиотека для Inner Core позволяет описать взаимодействие блоков с трубами, воронками и прочими предметами для транспортировки предметов и жидкостей с помощью&nbsp;интерфейсов хранилищ, а так же добавляет методы для извлечения и загрузки предметов и жидкостей.
 
 
 
 
== Загрузка ==
 
== Загрузка ==
  
Строка 7: Строка 5:
 
|-
 
|-
 
| Версия
 
| Версия
| Ссылка
+
| style="width: 36px;" | Ссылка
| Список изменений
+
| style="width: 393px;" | Список изменений
| Дата релиза
+
| style="width: 250px;" | Дата релиза
 +
|-
 +
| '''11'''
 +
| style="width: 36px;" | [https://github.com/MineExplorer/IC_Libraries/releases/tag/storage-interface-v11 Скачать]
 +
| style="width: 393px;" |
 +
*Библиотека поддерживает&nbsp;предметы с отрицательными ид
 +
*В интерфейс хранилища добавлены следующие поля:<br/> -&nbsp;liquidUnitRatio<br/> -&nbsp;getInputTank(side)<br/> -&nbsp;getOutputTank(side)<br/> -&nbsp;receiveLiquid(liquidStorage, liquid, amount)<br/> -&nbsp;extractLiquid(liquidStorage, liquid, amount)<br/> И удалены поля: addLiquid. getLiquid, getLiquidStored, getLiquidStorage
 +
 
 +
| style="width: 250px;" | 01.04.2021
 +
|-
 +
| '''10'''
 +
| style="width: 36px;" | [https://github.com/MineExplorer/IC_Libraries/releases/tag/storage-interface-v10 Скачать]
 +
| style="width: 393px;" |
 +
*Метод newStorage переименован в getInterface
 +
*Исправлен стак предметов при использовании функций валидации и макс. стака в ItemContainer из библиотеки
 +
 
 +
| style="width: 250px;" | 09.01.2021
 +
|-
 +
| '''9'''
 +
| style="width: 36px;" | [https://github.com/MineExplorer/IC_Libraries/releases/tag/storage-interface-v9 Скачать]
 +
| style="width: 393px;" |
 +
*Новые методы для интерфейсов хранилищ:<br/> - getContainerSlots()<br/> -&nbsp;getInputSlots(side)<br/> -&nbsp;getReceivingItemCount(item, side)<br/> -&nbsp;addItemToSlot(name, item, maxCount)<br/> -&nbsp;clearContainer()
 +
*Исправлен стандартный интерфейс TIleEntity
 +
 
 +
| style="width: 250px;" | 14.12.2020
 +
|-
 +
| '''8'''
 +
| style="width: 36px;" | [https://github.com/MineExplorer/IC_Libraries/releases/tag/storage-interface-v8 Скачать]
 +
| style="width: 393px;" |
 +
*Поддержка мультиплеера
 +
*Добавлены стандартные интерфейсы для всех видов контейнеров
 +
*Добавлены методы для получение интерфейсов хранилищ
 +
*Добавлены методы для установки валидации предметов и макс стака&nbsp;слотов в ItemContainer
 +
 
 +
| style="width: 250px;" | 10.12.2020
 +
|-
 +
| '''7'''
 +
| style="text-align: center; width: 36px;" | -
 +
| style="width: 393px;" |
 +
- В описании слота в интерфейсе хранилища теперь можно указать стороны, через которые с ним можно взаимодействовать
 +
 
 +
| style="width: 250px;" | 10.06.2020
 +
|-
 +
| '''6'''
 +
| style="width: 36px;" | [https://yadi.sk/d/TITakdpdsjIGug Скачать]
 +
| style="width: 393px;" | - Библиотека обновлена на InnerCore для Horizon: добавлена поддержка новых ванильных контейнеров.
 +
| style="width: 250px;" | 18.04.2020
 +
|-
 +
| '''5'''
 +
| style="width: 36px;" | [https://yadi.sk/d/Om5TRGdlhylfQA Скачать]
 +
| style="width: 393px;" | - Исправлена ошибка взаимодействия с tile entity без интерфейса хранилища в методе StorageInterface.transportLiquid
 +
| style="width: 250px;" | 09.03.2020
 +
|-
 +
| '''4'''
 +
| style="width: 36px;" | [https://yadi.sk/d/1gBu4a-fEme-jA Скачать]
 +
| style="width: 393px;" |
 +
*Улучшена работа с жидкостями
 +
*В интерфейс добавлено поле liquidStorage
 +
 
 +
| style="width: 250px;" | 05.03.2020
 
|-
 
|-
 
| '''3'''
 
| '''3'''
| [https://drive.google.com/file/d/1Hsp2nLIER0wF-ZzDvdsy1btxWFhnebv1/view?usp=sharing Скачать]
+
| style="width: 36px;" | [https://drive.google.com/file/d/1Hsp2nLIER0wF-ZzDvdsy1btxWFhnebv1/view?usp=sharing Скачать]
| релиз библиотеки
+
| style="width: 393px;" | - Релиз библиотеки
| 02.02.2020
+
| style="width: 250px;" | 02.02.2020
 
|}
 
|}
 
+
</div> <div class="mw-parser-output">&nbsp;</div> </div> </div> </div> </div>
 
== Импорт ==
 
== Импорт ==
  
Для добавления библиотеки в мод ее файл ''([https://github.com/MineExplorer/IndustrialCraft_2/blob/master/IndustrialCraft²/lib/StorageInterface.js StorageInterface.js])'' нужно добавить в директорию ''lib/'' в директории мода (если таковой нету, то ее нужно создать).
+
Для добавления библиотеки в мод ее файл ''([https://github.com/MineExplorer/IC_Libraries/blob/master/library/StorageInterface.js StorageInterface.js])'' нужно добавить в директорию ''lib/'' в директории мода (если таковой нету, то ее нужно создать).
  
Для импорта библиотеки в мод в заголовочном файле (или если он остутвует в первом файле кода) следует добавить строку:
+
Для импорта библиотеки в мод в заголовочном файле (или если он отсутствует в первом файле кода) следует добавить строку:
<pre>IMPORT("StorageInterface");</pre>
+
<pre>IMPORT("StorageInterface");
 +
</pre>
  
<div class="mw-parser-output">
 
 
== Интерфейсы хранилищ блоков ==
 
== Интерфейсы хранилищ блоков ==
  
На данный момент интерфейсы привязываются только к tile entity, но в будущем по умолчанию интерфейсы будут прописаны у контейнеров из Майнкрафта, прежде всего печки.
+
Интерфейсы хранилищ объединяют в себе функции для работы с контейнерами и хранилищем жидкости и позволяют описать логику передачи предметов и жидкостей. В библиотеке есть стандартные интерфейсы для ванильных контейнеров и TileEntity, но вы можете зарегистрировать свой собственный для вашего TileEntity.
 +
<div class="mw-parser-output"><div class="mw-parser-output">
 +
=== Регистрация интерфейса&nbsp;хранилища ===
  
Интерфейс для хранилища добавляется с помощью метода&nbsp;''StorageInterface.createInterface(id блока, объект интерфейса)''&nbsp;и в общем виде выглядит так:
+
''StorageInterface.createInterface(id блока, прототип интерфейса).''
<div style="background:#eeeeee;border:1px solid #cccccc;padding:5px 10px;">StorageInterface.createInterface(id блока, {<br/> &nbsp;&nbsp;&nbsp;&nbsp;slots: {<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"slot1": {<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;input: bool, // может ли слот принимать предметы<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;output: bool, // может ли слот отдавать предметы<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;isValid: function(item, side, tileEntity){ // может ли слот принять предмет item со стороны side<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return bool;<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;},<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;canOutput: function(item, side, tileEntity){ // можно ли извлечь предмет из слота (item - предмет в слоте)<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return bool;<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;},<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"slot2": {<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;...<br/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;...<br/> &nbsp;&nbsp;&nbsp;&nbsp;},<br/> &nbsp;&nbsp; &nbsp;isValidInput: function(item, side, tileEntity){ // аналогична функции isValid слота, но действует на все слоты контейнера<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return true;<br/> &nbsp;&nbsp; &nbsp;},<br/> &nbsp;&nbsp; &nbsp;addItem: function(item, side, maxCount){&nbsp;return int; }, // функция добавления предмета<br/> &nbsp;&nbsp; &nbsp;getItems: function(side){ return []; }, // кастомная функция получения предметов для извлечения<br/> &nbsp;&nbsp; &nbsp;<br/> &nbsp;&nbsp; &nbsp;// методы работы с хранилищем жидкости<br/> &nbsp;&nbsp; &nbsp;canReceiveLiquid: function(liquid, side){ return false; }, // может ли tile entity принять жидкость (liquid - название жидкости)<br/> &nbsp;&nbsp; &nbsp;canTransportLiquid: function(liquid, side){ return false; }, // может ли tile entity отдать жидкость (liquid - название жидкости)<br/> &nbsp;&nbsp; &nbsp;addLiquid: function(liquid, amount){&nbsp;// функция добавление жидкости<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return this.tileEntity.liquidStorage.addLiquid(luquid, amount);<br/> &nbsp;&nbsp; &nbsp;}<br/> &nbsp;&nbsp; &nbsp;getLiquid: function(liquid, amount){ // функция извлечения жидкости<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return this.tileEntity.liquidStorage.getLiquid(luquid, amount);<br/> &nbsp;&nbsp; &nbsp;}<br/> });</div>
 
Здесь указаны все функции объекта интерфейса, которые можно задать этим методом. При их отсутствии добавляются функции по умолчанию, и для некоторых функций приведёт их код.
 
  
Добавление интерфейса для tile entity на примере железной печки из мода IndustrialCraft 2
+
Все параметры слотов и функции прототипа интерфейса опциональны.<br/> Прототип интерфейса выглядит так:
<div style="background:#eeeeee;border:1px solid #cccccc;padding:5px 10px;">StorageInterface.createInterface(BlockID.ironFurnace, {<br/> &nbsp;&nbsp; &nbsp;slots: {<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;"slotSource": {<br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; input: true,<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;isValid: function(item, side){<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return side&nbsp;!= 0 && Recipes.getFurnaceRecipeResult(item.id, "iron");<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;},<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;"slotFuel": {<br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;input: true,&nbsp;<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;isValid: function(item, side){<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return side&nbsp;!= 1 && Recipes.getFuelBurnDuration(item.id, item.data) > 0;<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;},<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;"slotResult": {output: true}<br/> &nbsp;&nbsp; &nbsp;}<br/> });</div> <div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output">&nbsp;</div> </div> </div> </div> </div> </div> </div> </div>
+
<syntaxhighlight lang="JavaScript">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;
 +
            }
 +
        },
 +
        // Все слоты с именем slot и индексами от 2 до 10 (slot2, ..., slot10).
 +
        "slot^2-10": {
 +
            ...
 +
        },
 +
        ...
 +
    },
 +
   liquidUnitRatio: 1, // количество вёдер жидкости в базовом юните жидкости
 +
   // функции интерфейса
 +
});</syntaxhighlight>
 +
</div> </div>
 +
=== <br/> Функции интерфейса хранилища ===
  
== Методы для передачи предметов и жидкостей ==
+
Интерфейс хранилища обладает следующими функциями. Вы можете заменить их на свои в прототипе интерфейса при регистрации.
  
 
{| border="1" cellpadding="1" cellspacing="1"
 
{| border="1" cellpadding="1" cellspacing="1"
Строка 44: Строка 130:
 
| Описание
 
| Описание
 
|-
 
|-
| '''getNearestContainers'''
+
| '''getSlot'''
| coords, side, sideExcluded
+
| name
| Возвращает соседние с блоком на координатах ''coords ''контейнеры в виде массива. Если указан параметр ''side'', то вернёт контейнер с этой стороны. Если ''sideExcluded ''равен ''true'', то наоборот, все контейнеры кроме контейнера с указанной стороны.
+
| Возвращает слот контейнера.
 +
|-
 +
| '''setSlot'''
 +
| name, id, count, data, extra
 +
| Устанавливает предмет в слот контейнера.
 
|-
 
|-
| '''getNearestLiquidStorages'''
+
| '''isValidInput'''
| coords, side, sideExcluded
+
| item, side, tileEntity
| Аналогична предыдущей, но возвращает все соседние tile entity, имеющие хранилища жидкостей.
+
| Аналогична функции isValid слота, но действует на все слоты контейнера. По умолчанию возвращает true.
 
|-
 
|-
| '''putItems'''
+
| '''addItem'''
| items, containers
+
| item, side, maxCount
| Добавляет предметы из массива items в контейнеры из массива containers. Удобно использовать в связке с методом&nbsp;''getNearestContainers'''''.'''
+
| Функция добавления предмета. Возвращает количество добавленных предметов.
 
|-
 
|-
| '''putItemToContainer'''
+
| '''addItemToSlot'''
| item, container, side, maxCount
+
| name, item, maxCount
| Метод более низкого уровня, на котором основана работа предыдущего метода. Добавляет стак предметов в контейнер, но позволяет также указать максимальное количество предметов, которое может быть передано за раз.
+
| Добавляет предмет в слот контейнера, maxCount - максимальное количество предмета, которое будет добавлено.
 +
|-
 +
|
 +
'''getReceivingItemCount'''
 +
 
 +
| item, side
 +
| Возвращает сколько предметов из стака контейнер может принять.
 
|-
 
|-
| '''extractItemsFromContainer'''
 
| inputTile, container, side, maxCount, oneStack
 
 
|  
 
|  
Позволяет извлечь предмет из контейнера и добавить его в tile entity.<br/> '''inputTile '''- tile entity, в который будут добавлены предметы<br/> '''container '''- контейнер, из которого будут извлечены предметы<br/> '''maxCount '''- сколько предметов извлечь [опционально]<br/> '''oneStack '''- если true, то будет извлечён только один стак предметов.
+
'''getContainerSlots'''
  
 +
| -
 +
| Возвращает все слоты контейнера
 +
|-
 +
| '''getInputSlots'''
 +
| side
 +
| Возвращяет названия слотов входа,&nbsp;доступных со стороны ''side''.
 +
|-
 +
| '''getOutputSlots'''
 +
| side
 +
| Возвращает названия слотов выхода,&nbsp;доступных со стороны ''side''.
 +
|-
 +
| '''clearContainer'''
 +
| -
 +
| Очищает содержимое контейнера
 
|-
 
|-
| '''transportLiquid'''
+
| '''canReceiveLiquid'''
| liquid, maxAmount, outputTile, inputTile, outputSide
+
| liquid, side
 +
| Может ли&nbsp;TileEntity принять жидкость с именем ''liquid ''со стороны ''side''. По умолчанию возвращает true если в liquidStorage установлен лимит для этой жидкости.
 +
|-
 +
| '''canTransportLiquid'''
 +
| liquid, side
 +
| Может ли TileEntity отдать жидкость с именем ''liquid ''со стороны ''side''.&nbsp;По умолчанию возвращает true.
 +
|-
 +
| '''receiveLiquid'''
 +
| liquidStorage, liquid, amount
 
|  
 
|  
Передаёт жидкость из одного tile entity в другой.<br/> '''liquid&nbsp;'''- название жидкости<br/> '''maxAmount&nbsp;'''- максимальное количество, которое будет передано<br/> '''outputTile&nbsp;'''- tile entity, из которого будет передана жидкость<br/> '''inputTile&nbsp;'''- tile entity, в который будет передана жидкость<br/> '''outputSide&nbsp;'''- сторона, через которую передаётся жидкость
+
Функция добавление жидкости в хранилище.<br/> '''liquidStorage'''&nbsp;- хранилище, принимающее жидкость<br/> '''liquid '''- название жидкости<br/> '''amount '''- количество жидкости
  
 
|-
 
|-
 
| '''extractLiquid'''
 
| '''extractLiquid'''
| liquid, maxAmount, inputTile, outputTile, inputSide
+
| liquidStorage, liquid, amount
 +
| Функция извлечения жидкости из хранилища.
 +
|-
 +
| '''getInputTank'''
 +
| side
 
|  
 
|  
Похож на предыдущий, но позволяет извлечь жидкость из tile entity<br/> '''liquid '''- в отличие от предыдущего метода жидкость может быть не указана, тогда извлечёт жидкость, которая хранится в&nbsp;''outputTile''.<br/> '''inputSide '''- сторона, в&nbsp;которую будет поступать жидкость
+
Возвращает входное&nbsp;хранилище жидкости TileEntity. По умолчанию возвращает&nbsp;liquidStorage.<br/> '''side&nbsp;'''- сторона с которой будет производиться работа
  
 
|-
 
|-
| '''checkHoppers'''
+
| '''getOutputTank'''
| tileEntity
+
| side
| Позволяет tile entity взаимодействовать с воронками. Для этого должна выполняться в функции тика tile entity. Требует интерфейса хранилища у tile entity для работы.
+
|  
 +
Возвращает выходное хранилище жидкости TileEntity.&nbsp;По умолчанию возвращает&nbsp;liquidStorage.<br/> '''side&nbsp;'''- сторона с которой будет производиться работа
 +
 
 +
|}
 +
<div class="mw-parser-output"><br/> В экземпляре интерфейса также есть следующие поля:</div> <div class="mw-parser-output">''isNativeContainer ''- true если контейнер является ванильным, false если&nbsp;из TileEntity.</div> <div class="mw-parser-output">''container ''- контейнер;<br/> ''tileEntity ''- если создан для TileEntity.</div> <div class="mw-parser-output">&nbsp;</div> <div class="mw-parser-output">Регистрация интерфейса для TileEntity&nbsp;на примере железной печки из мода IndustrialCraft 2</div> <syntaxhighlight lang="JavaScript">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}
 +
    }
 +
});</syntaxhighlight>
 +
<div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output">
 +
=== Методы для получения&nbsp;интерфесов хранилищ ===
 +
 
 +
*'''StorageInterface.getInterface('''''container ''или ''tileEntity''''')''' - возвращает интерфейс хранилища для TileEntity или контейнера.
 +
*'''StorageInterface.getStorage('''''blockSource, x, y, z''''')''' - возвращает интерфейс хранилища для контейнера на координатах
 +
*'''StorageInterface.getLiquidStorage('''''blockSource, x, y, z''''')''' - возвращает интерфейс для TileEntity,&nbsp;хранящего жидкости,&nbsp;по&nbsp;координатам.
 +
*'''StorageInterface.getNeighbourStorage('''''blockSource, coords, side''''')''' - возвращает интерфейс хранилища для соседнего блока со стороны side.
 +
*'''StorageInterface.getNeighbourLiquidStorage('''''blockSource, coords, side''''')''' - возвращает интерфейс для соседнего TileEntity, хранящего жидкости,&nbsp;со стороны side
 +
</div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div>
 +
== Остальные методы StorageInterface ==
 +
 
 +
{| border="1" cellpadding="1" cellspacing="1"
 +
|-
 +
| style="width: 178px;" | Название
 +
| style="width: 114px;" | Аргументы
 +
| style="width: 458px;" | Описание
 +
|-
 +
| style="width: 178px;" | '''getNearestContainers'''
 +
| style="width: 114px;" | coords, blockSource
 +
| style="width: 458px;" | Возвращает соседние контейнеры относительно блока на координатах ''coords ''в виде объекта, где ключами являются стороны блока.
 +
|-
 +
| style="width: 178px;" | '''getNearestLiquidStorages'''
 +
| style="width: 114px;" | coords, blockSource
 +
| style="width: 458px;" | Работает аналогично предыдущему, но возвращает интерфейсы хранилищ для всех соседних TileEntity, имеющих хранилища жидкостей.
 +
|-
 +
| style="width: 178px;" | '''putItems'''
 +
| style="width: 114px;" | items, containers
 +
| style="width: 458px;" | Добавляет предметы из массива items в контейнеры из объекта, возвращаемого методом&nbsp;''getNearestContainers'''''.'''
 
|-
 
|-
| '''addItemToSlot'''
+
| style="width: 178px;" | '''putItemToContainer'''
| item, slot, count
+
| style="width: 114px;" | item, container, side, maxCount
| Внутренний метод библиотеки для добавления предмета в слот. При использовании на нативном контейнере нужно также установить слот, используя&nbsp;''container.setSlot.''
+
| style="width: 458px;" |
 +
Добавляет стак предметов в контейнер.<br/> '''maxCount '''- максимальное количество предметов, которое может быть передано за раз&nbsp;(по умолчанию 64).
 +
 
 +
Возвращает количество переданных предметов.
 +
 
 +
|-
 +
| style="width: 178px;" | '''extractItemsFromContainer'''
 +
| style="width: 114px;" | inputСontainer , outputContainer, side, maxCount, oneStack
 +
| style="width: 458px;" |
 +
Позволяет извлечь предмет из контейнера и добавить его в tile entity или контейнер.<br/> '''inputStorage&nbsp;'''- TileEntity или контейнер, в который будут добавлены предметы<br/> '''outputContainer '''- контейнер, из которого будут извлечены предметы<br/> '''maxCount '''- сколько предметов может быть извлечено (по умолчанию не ограничено)<br/> '''oneStack '''- если true, то извлечёт&nbsp;только один стак предметов.
 +
 
 +
Возвращает количество переданных предметов.
 +
 
 +
|-
 +
| style="width: 178px;" | '''extractItemsFromStorage'''
 +
| style="width: 114px;" | inputStorage, outputStorage, side, maxCount, oneStack
 +
| style="width: 458px;" | Аналогичен предыдущему, но принимает аргументами интерфейсы хранилищ.
 +
|-
 +
| style="width: 178px;" | '''transportLiquid'''
 +
| style="width: 114px;" | liquid, maxAmount, outputStorage, inputStorage, outputSide
 +
| style="width: 458px;" |
 +
Передаёт жидкость из одного TileEntity в другой.<br/> '''liquid&nbsp;'''- название жидкости<br/> '''maxAmount&nbsp;'''- максимальное количество, которое будет передано<br/> '''outputStorage&nbsp;'''- интерфейс хранилища или TileEntity, из которого будет передана жидкость<br/> '''inputStorage&nbsp;'''- интерфейс хранилища, принимающего жидкость<br/> '''outputSide&nbsp;'''- сторона блока, через которую передаётся жидкость.
 +
 
 +
Возвращает количество переданной жидкости.
 +
 
 +
|-
 +
| style="width: 178px;" | '''extractLiquid'''
 +
| style="width: 114px;" | liquid, maxAmount, inputStorage, outputStorage, inputSide
 +
| style="width: 458px;" |
 +
Похож на предыдущий, но позволяет извлечь жидкость из TileEntity<br/> '''liquid '''- название жидкости. Если не указано, то извлечёт любую жидкость&nbsp;из&nbsp;''outputStorage'',&nbsp;если она может быть принята в&nbsp;''inputStorage.''<br/> '''inputStorage&nbsp;'''- интерфейс хранилища или TileEntity,&nbsp;принимающий жидкость<br/> '''outputStorage&nbsp;'''- интерфейс хранилища, из которого будет извлечена жидкость<br/> '''inputSide '''- сторона блока, которая будет принимать жидкость.
 +
 
 +
Возвращает количество переданной жидкости.
 +
 
 +
|-
 +
| style="width: 178px;" | '''checkHoppers'''
 +
| style="width: 114px;" | tileEntity
 +
| style="width: 458px;" | Позволяет TileEntity взаимодействовать с воронками. Для этого должен вызываться в функции тика TileEntity .
 +
|-
 +
| style="width: 178px;" | '''addItemToSlot'''
 +
| style="width: 114px;" | item, slot, maxCount
 +
| style="width: 458px;" |
 +
Добавляет стак предметов&nbsp;в слот. Изменяет только объект слота, для корректной работы требуется установить слот через&nbsp;''container.setSlot.''<br/> '''maxCount '''- максимальное количество, которое будет передано в слот&nbsp;(по умолчанию 64).
 +
 
 +
Возвращает количество переданных предметов.
 +
 
 
|}
 
|}
<div class="mw-parser-output">&nbsp;</div> </div> </div> </div> </div> </div> </div> </div>
 
<div class="mw-parser-output">
 
<div class="mw-parser-output">
 
<div class="mw-parser-output">
 
== Обратная совместимость ==
 
 
Данная библиотека совместима с модами, использующими старый стандарт описания слотов tile entity&nbsp;через функцию&nbsp;''getTransportSlots'', а так же&nbsp;добавляет эту функцию&nbsp;и функцию ''addTransportedItem ''для tile entity при создании его интерфейса.
 
 
</div>
 
</div>

Версия 20:00, 8 апреля 2021

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

Загрузка

Версия Ссылка Список изменений Дата релиза
11 Скачать
  • Библиотека поддерживает предметы с отрицательными ид
  • В интерфейс хранилища добавлены следующие поля:
    - liquidUnitRatio
    - getInputTank(side)
    - getOutputTank(side)
    - receiveLiquid(liquidStorage, liquid, amount)
    - extractLiquid(liquidStorage, liquid, amount)
    И удалены поля: addLiquid. getLiquid, getLiquidStored, getLiquidStorage
01.04.2021
10 Скачать
  • Метод newStorage переименован в getInterface
  • Исправлен стак предметов при использовании функций валидации и макс. стака в ItemContainer из библиотеки
09.01.2021
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
 

Импорт

Для добавления библиотеки в мод ее файл (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;
            }
        },
        // Все слоты с именем slot и индексами от 2 до 10 (slot2, ..., slot10).
        "slot^2-10": {
            ...
        },
        ...
    },
    liquidUnitRatio: 1, // количество вёдер жидкости в базовом юните жидкости
    // функции интерфейса
});


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

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

Название Аргументы Описание
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.
receiveLiquid liquidStorage, liquid, amount

Функция добавление жидкости в хранилище.
liquidStorage - хранилище, принимающее жидкость
liquid - название жидкости
amount - количество жидкости

extractLiquid liquidStorage, liquid, amount Функция извлечения жидкости из хранилища.
getInputTank side

Возвращает входное хранилище жидкости TileEntity. По умолчанию возвращает liquidStorage.
side - сторона с которой будет производиться работа

getOutputTank side

Возвращает выходное хранилище жидкости TileEntity. По умолчанию возвращает liquidStorage.
side - сторона с которой будет производиться работа


В экземпляре интерфейса также есть следующие поля:
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.getInterface(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) - возвращает интерфейс для соседнего TileEntity, хранящего жидкости, со стороны side

Остальные методы 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).

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