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

Строка 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"><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"><div class="mw-parser-output"><div class="mw-parser-output">
 
Данная библиотека для Inner Core позволяет описать взаимодействие блоков с трубами, воронками и прочими предметами для транспортировки предметов и жидкостей с помощью&nbsp;интерфейсов хранилищ, а так же добавляет методы для извлечения и загрузки предметов и жидкостей.
 
Данная библиотека для Inner Core позволяет описать взаимодействие блоков с трубами, воронками и прочими предметами для транспортировки предметов и жидкостей с помощью&nbsp;интерфейсов хранилищ, а так же добавляет методы для извлечения и загрузки предметов и жидкостей.
 
<div class="mw-parser-output"><div class="mw-parser-output">
 
<div class="mw-parser-output"><div class="mw-parser-output">
Строка 12: Строка 12:
 
|-
 
|-
 
| '''4'''
 
| '''4'''
| [https://yadi.sk/d/ayrPIjyJdjX-HQ Скачать]
+
| [https://yadi.sk/d/1gBu4a-fEme-jA Скачать]
 
| style="width: 280px;" |  
 
| style="width: 280px;" |  
- Улучшена работа с жидкостями<br/> -&nbsp;extractItemsFromContainer теперь принимает первым аргументом контейнер, а не tileEntity
+
- Улучшена работа с жидкостями<br/> - В интерфейс добавлено поле liquidStorage
  
 
| style="width: 350px;" | 04.03.2020
 
| style="width: 350px;" | 04.03.2020
Строка 35: Строка 35:
 
На данный момент интерфейсы привязываются только к tile entity, но в будущем по умолчанию интерфейсы будут прописаны у контейнеров из Майнкрафта, прежде всего печки.
 
На данный момент интерфейсы привязываются только к tile entity, но в будущем по умолчанию интерфейсы будут прописаны у контейнеров из Майнкрафта, прежде всего печки.
  
Интерфейс для хранилища добавляется с помощью метода&nbsp;''StorageInterface.createInterface(id блока, объект интерфейса)''&nbsp;и в общем виде выглядит так:
+
Интерфейс для хранилища добавляется с помощью метода&nbsp;''StorageInterface.createInterface(id блока, объект интерфейса).''<br/> Регистрация слотов в интерфейсе выглядит так:
<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;getOutputSlots: function(side){ return []; }, // функция получения слотов&nbsp;для извлечения предметов<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.liquidStorage.addLiquid(liquid, amount);<br/> &nbsp;&nbsp; &nbsp;}<br/> &nbsp;&nbsp; &nbsp;getLiquid: function(liquid, amount){ // функция извлечения жидкости<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return this.liquidStorage.getLiquid(liquid, amount);<br/> &nbsp;&nbsp; &nbsp;}<br/> });</div>  
+
<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: true/false, // может ли слот принимать предметы<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;output: true/false, // может ли слот отдавать предметы<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 true/false;<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 true/false;<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/> });</div>
Здесь указаны все функции объекта интерфейса, которые можно задать этим методом. При их отсутствии добавляются функции по умолчанию, и для некоторых функций приведён&nbsp;их код.
+
<br/> Так же интерфейс хранилища обладает следующими функциями, которые могут быть перезаписаны в объекте интерфейса:
<div class="mw-parser-output">Интерфейс хранилища&nbsp;сохраняется в поле ''interface ''объекта&nbsp;tile entity. В экземпляре интерфейса есть следующие указатели:</div> <div class="mw-parser-output">''tileEntity ''- на tile entity, к которому он привязан;</div> <div class="mw-parser-output">''container ''- на контейнер tile entity;</div> <div class="mw-parser-output">''liquidStorage ''- на хранилище жидкости tileEntity.</div> <div class="mw-parser-output">&nbsp;</div> <div class="mw-parser-output">Добавление интерфейса для tile entity на примере железной печки из мода IndustrialCraft 2</div> <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> <div class="mw-parser-output"><div class="mw-parser-output">
+
 
 +
{| border="1" cellpadding="1" cellspacing="1"
 +
|-
 +
| Название
 +
| Аргументы
 +
| Описание
 +
|-
 +
| '''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''.&nbsp;По умолчанию возвращает false.
 +
|-
 +
| '''addLiquid'''
 +
| liquid, amount
 +
| Функция добавление жидкости. По умолчанию работает с liquidStorage.
 +
|-
 +
| '''getLiquid'''
 +
| liquid, amount
 +
| Функция извлечения жидкости.&nbsp;По умолчанию работает с liquidStorage.
 +
|-
 +
| '''getLiquidStored'''
 +
| storage, side
 +
| Функция получения жидкости, хранящейся в tile entity. В функциях StorageInterface аргумент ''storage&nbsp;''равен ''"input" ''если проверяется жидкость для добавления, и''"output"'' если для извлечения.
 +
|}
 +
<div class="mw-parser-output">&nbsp;</div> <div class="mw-parser-output">Интерфейс хранилища&nbsp;сохраняется в поле ''interface ''объекта&nbsp;tile entity. В экземпляре интерфейса есть следующие указатели:</div> <div class="mw-parser-output">''tileEntity ''- на tile entity, к которому он привязан;</div> <div class="mw-parser-output">''container ''- на контейнер tile entity;</div> <div class="mw-parser-output">''liquidStorage ''- на хранилище жидкости tileEntity.</div> <div class="mw-parser-output">&nbsp;</div> <div class="mw-parser-output">Добавление интерфейса для tile entity на примере железной печки из мода IndustrialCraft 2</div> <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> <div class="mw-parser-output"><div class="mw-parser-output">
 
== Методы для передачи предметов и жидкостей ==
 
== Методы для передачи предметов и жидкостей ==
  
Строка 93: Строка 132:
  
 
Данная библиотека совместима с модами, использующими старый стандарт описания слотов tile entity&nbsp;через функцию&nbsp;''getTransportSlots'', а так же&nbsp;добавляет эту функцию&nbsp;и функцию ''addTransportedItem ''для tile entity при создании его интерфейса.
 
Данная библиотека совместима с модами, использующими старый стандарт описания слотов tile entity&nbsp;через функцию&nbsp;''getTransportSlots'', а так же&nbsp;добавляет эту функцию&nbsp;и функцию ''addTransportedItem ''для tile entity при создании его интерфейса.
</div> </div> </div> </div> </div> </div> </div> </div> </div>
+
</div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div>

Версия 21:30, 5 марта 2020

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

Загрузка

Версия Ссылка Список изменений Дата релиза
4 Скачать

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

04.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.
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 inputContainer, container, side, maxCount, oneStack

Позволяет извлечь предмет из контейнера и добавить его в tile entity.
inputContainer - контейнер, в который будут добавлены предметы
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 при создании его интерфейса.