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

(Исправлена опечатка и улучшено форматирование)
Строка 24: Строка 24:
 
<pre>IMPORT("StorageInterface");</pre>
 
<pre>IMPORT("StorageInterface");</pre>
  
 +
<div class="mw-parser-output">
 
== Интерфейсы хранилищ блоков ==
 
== Интерфейсы хранилищ блоков ==
  
Строка 29: Строка 30:
  
 
Интерфейс для хранилища добавляется с помощью метода&nbsp;''StorageInterface.createInterface(id блока, объект интерфейса)''&nbsp;и в общем виде выглядит так:
 
Интерфейс для хранилища добавляется с помощью метода&nbsp;''StorageInterface.createInterface(id блока, объект интерфейса)''&nbsp;и в общем виде выглядит так:
<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(luquid, 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(luquid, amount){ // функция извлечения жидкости<br/> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return this.tileEntity.liquidStorage.getLiquid(luquid, 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: 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
 
Добавление интерфейса для tile entity на примере железной печки из мода IndustrialCraft 2
<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": {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": {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">
+
<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>
 +
 
 
== Методы для передачи предметов и жидкостей ==
 
== Методы для передачи предметов и жидкостей ==
  

Версия 18:53, 21 февраля 2020

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

Загрузка

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

Импорт

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

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

IMPORT("StorageInterface");

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

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

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

StorageInterface.createInterface(id блока, {
    slots: {
        "slot1": {
            input: bool, // может ли слот принимать предметы
            output: bool, // может ли слот отдавать предметы
            isValid: function(item, side, tileEntity){ // может ли слот принять предмет item со стороны side
                return bool;
            },
            canOutput: function(item, side, tileEntity){ // можно ли извлечь предмет из слота (item - предмет в слоте)
                return bool;
            }
        },
        "slot2": {
            ...
        },
        ...
    },
    isValidInput: function(item, side, tileEntity){ // аналогична функции isValid слота, но действует на все слоты контейнера
        return true;
    },
    addItem: function(item, side, maxCount){ return int; }, // функция добавления предмета
    getItems: function(side){ return []; }, // кастомная функция получения предметов для извлечения
    
    // методы работы с хранилищем жидкости
    canReceiveLiquid: function(liquid, side){ return false; }, // может ли tile entity принять жидкость (liquid - название жидкости)
    canTransportLiquid: function(liquid, side){ return false; }, // может ли tile entity отдать жидкость (liquid - название жидкости)
    addLiquid: function(liquid, amount){ // функция добавление жидкости
        return this.tileEntity.liquidStorage.addLiquid(luquid, amount);
    }
    getLiquid: function(liquid, amount){ // функция извлечения жидкости
        return this.tileEntity.liquidStorage.getLiquid(luquid, amount);
    }
});

Здесь указаны все функции объекта интерфейса, которые можно задать этим методом. При их отсутствии добавляются функции по умолчанию, и для некоторых функций приведёт их код.

Добавление интерфейса для 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.
 
</div> </div>

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

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

</div>