Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
− | Данная библиотека для Inner Core представляет собой инструмент для быстрого создания новых типов энергии и имеет большой функционал для работы с ними. | + | <div class="mw-parser-output"> |
− | == Загрузка ==
| + | Данная библиотека для Inner Core представляет собой инструмент для быстрого создания новых типов энергии и имеет большой функционал для работы с ними. |
− | | |
− | Последняя версия (v9) - [https://github.com/MineExplorer/IC_Libraries/releases/tag/energy-net-v9 скачать]<br/> Файлы:<br/> energy-net.js - сама библиотека<br/> energy-net.d.ts - заголовочный файл (API)
| |
| | | |
| == Импорт == | | == Импорт == |
| + | <div class="mw-parser-output">Для добавления библиотеки в мод ее файл ''(energy-net.js)'' нужно добавить в директорию ''lib/'' в директории мода (если таковой нету, то ее нужно создать).</div> <div class="mw-parser-output">Для импорта библиотеки в мод в заголовочном файле (или если он остутвует в первом файле кода) следует добавить строку:</div> <div class="mw-parser-output"><syntaxhighlight lang="JavaScript">IMPORT("EnergyNet");</syntaxhighlight> |
| | | |
− | Для добавления библиотеки в мод ее файл ''(energy-net.js)'' нужно добавить в папку ''lib/'' в директории мода (если таковой нету, то ее нужно создать).Для импорта библиотеки в мод в заголовочном файле (или если он отсутствует в первом файле кода) следует добавить строку:
| + | <div class="mw-parser-output"> |
− | <syntaxhighlight lang="JavaScript">IMPORT("EnergyNet"); | + | == Модули == |
− | </syntaxhighlight>
| |
− | | |
− | == Модули и классы == | |
− | | |
− | #''EnergyTypeRegistry'' - модуль для регистрации новых типов энергии
| |
− | #''EnergyTileRegistry'' - модуль для привязки типов энергии к TileEntity
| |
− | #''EnergyGridBuilder'' - модуль построения энергосетей
| |
− | #''EnergyNet'' - модуль, хранящий энергосети
| |
− | #''EnergyNode'' - базовый класс энергоузла
| |
− | #''EnergyGrid'' - класс узла блока-проводника
| |
− | | |
− | == Механика передачи энергии ==
| |
− | | |
− | Энергия может передаваться как по проводам, так и напрямую от генератора к соседним механизмам. Для этого строится граф (энергосеть), в которым механизмы и блоки-проводники являются узлами. Энергия передаётся пакетами от блока-источника по всем узлам, с которыми он соединён. Каждый пакет имеет определённое количество энергии и напряжение (количество энергии, которое в нём было изначально).
| |
| | | |
− | В целях оптимизации провода одного типа, соединенные друг с другом, объединяются в один энергоузел, в то время как каждый блок-механизм имеет свой энергоузел.
| + | #''EnergyTypeRegistry'' - модуль для регистрации новых типов энергии. |
| + | #''EnergyTileRegistry'' - модуль для привязки типов энергии к TileEntity. |
| + | #''EnergyNetBuilder'' - модуль построения энергосетей и взаимодействия с ними. |
| + | </div> |
| | | |
| + | <div class="mw-parser-output"><div class="mw-parser-output"> |
| == Создание нового типа энергии == | | == Создание нового типа энергии == |
| | | |
Строка 34: |
Строка 23: |
| *''value'' - сколько ''Eu'' (единиц энергии ''IndustrialCraft'') содержится в 1 единице данного типа энергии, данное значение используется для конвертации из одного вида энергии в другой. ''Энергия Eu принята за эталон.'' | | *''value'' - сколько ''Eu'' (единиц энергии ''IndustrialCraft'') содержится в 1 единице данного типа энергии, данное значение используется для конвертации из одного вида энергии в другой. ''Энергия Eu принята за эталон.'' |
| | | |
− | Возвращает функция тип с данным именем (созданный или импортированный), который обладает следующими методами и значениями: | + | Возвращает функция тип с данным именем (созданный или импортированый), который обладает следующими методами и значениями: |
| | | |
| *<''energyType''>''.name'' - имя данного типа энергии. | | *<''energyType''>''.name'' - имя данного типа энергии. |
− | *<''energyType''>''.registerWire(id, value, energyGridClass?)'' – регистрирует провод с данным id. Параметры: | + | *<''energyType''>''.registerWire(id, value)'' – регистрирует провод с данным ид и устанавливает для него лимит по приёму энергии, записанный в параметре value. |
− | **''value'' - лимит на размер пакета энергии (напряжение), который блок может проводить. При превышении максимального напряжения размер пакета уменьшается до лимита провода и вызывается функция onOverload в классе провода.
| + | *<''energyType''>''.onNetOverload'' – функция, вызывающаяся при превышение лимита энергии в проводе. Для продвинутых разработчиков |
− | **''energyGridClass'' - опционально, позволяет задать свой класс провода, который должен быть наследован от класса ''EnergyGrid''. | |
| | | |
| '''Пример:''' | | '''Пример:''' |
− | <syntaxhighlight lang="JavaScript">// в начале мода импортируем библиотеку (см. выше) | + | <syntaxhighlight lang="JavaScript">// в начале мода импортируем библиотеку (она должна находиться в lib/) importLib("energylib.js", "*"); |
| | | |
| // создаем тип энергии redstone flux | | // создаем тип энергии redstone flux |
Строка 49: |
Строка 37: |
| energyRF.registerWire(BlockID.RFconduct, 2000); | | energyRF.registerWire(BlockID.RFconduct, 2000); |
| </syntaxhighlight> | | </syntaxhighlight> |
| + | </div> </div> |
| | | |
− | == Привязка типов энергии к TileEntity == | + | <div class="mw-parser-output"> |
| + | <div class="mw-parser-output"> |
| + | == Механика передачи энергии == |
| | | |
− | ''EnergyTileRegistry.addEnergyTypeForId(blockId, energyType)'' - добавляет в tile entity объект класса [[InnerCore/Libs/EnergyNet#Объект_EnergyNode|EnergyNode]], который может быть получен через ''this.energyNode'' в функциях tile entity, а так же дополнительные события, которые позволяют ему работать с данным типом энергии. К одному tile entity можно привязать несколько разных типов энергии.<br/> <u>Параметры:</u>
| + | Энергия может передаваться как по проводам, так и напрямую от генератора к соседним механизмам. Для этого подобные механизмы объдиняются в энергосети. Энергосети - это программные объекты, которые передают энергию к подключенным к ним механизмам или другим энергосетям. Энергия передаётся пакетами с определённым количеством энергии и напряжением. |
| | | |
− | *''blockId'' – id блока, на который был зарегистрирован нужный tile entity.
| + | Энергосети формируются следующим образом:<br/> Для каждого блока генератора создаётся своя энергосеть, соединяющая его с подключенными к нему машинами-потребителями и энергосетями проводов. Энергосети проводов объединяют блоки с одним ид и соединяются с другими сетями того же типа энергии и машинами-потребителями энергии. Такая система позволяет разбивать провода по размеру пакета энергии, который они могут передать. Напряжение пакета энергии - это параметр, позволяющий объединять множество пакетов меньшего размера в один и передать его как будто бы с размером меньшего пакета. |
− | *''energyType'' - тип энергии, который требуется к нему привязать.
| + | </div> |
| | | |
− | Новые события:
| + | == Привязка типов энергии к TileEntity == |
− | | |
− | *''energyTick: function(type, node) { /* … */ }'' - вызывается каждый тик для энергоузла tile entity.<br/> Параметры:
| |
− | **''type'' - название типа энергии, для которого вызвано это событие.
| |
− | **''node'' - энергоузел механизма, позволяет добавлять энергию
| |
− | *''energyReceive: function(type, amount, voltage) { /* … */ }'' – вызывается при приёме пакета энергии данным tile entity. Должна возвращать количество энергии, которое удалось добавить.<br/> Параметры:
| |
− | **''type'' - название типа энергии
| |
− | **''amount'' – количество энергии
| |
− | **''voltage'' – напряжение энергии
| |
− | *''canReceiveEnergy: function(side, type) {return boolean;}'' – определяет, может ли tile entity получать энергию данного типа и с каких сторон. Вызывается при попытке соединения tile entity к энергосети. По умолчанию возвращает ''true''.
| |
− | *''canExtractEnergy: function(side, type) {return boolean;}'' – определяет, с каких сторон tile entity может выдавать энергию. По умолчанию возвращает ''true''.
| |
− | *''isConductor': function(type) {return boolean;}'' – определяет, может ли tile entity проводить энергию данного типа. По умолчанию возвращает ''false''.
| |
− | | |
− | == Объект EnergyNode ==
| |
− | | |
− | Данный объект представляет собой узел энергосети.<br/> <u>Основные методы:</u>
| |
| | | |
− | *''add(amount, voltage)'' - добавляет в сеть данное кол-во энергии ''(amount)'', возвращает, какое кол-во энергии добавить не удалось из-за переполнения (0, если вся энергия добавлена). Если значение ''voltage'' (напряжение) не указано, то оно будет равно ''amount''.
| + | == Объект EnergySource == |
− | *''addCoords(x, y, z)'' - добавляет блок на координатах x, y, z в список блоков энергоузла (позволяет, например, сделать проводящим энергию блоки обшивки в многоблочном механизме)
| |
− | *''removeCoords(x, y, z)'' - удаляет блок из энергоузла
| |
− | *''addConnection(node)'' - добавляет выходящее соединение с другим узлом
| |
− | *''removeConnection(node) ''- удаляет соединение с узлом
| |
− | *''resetConnections()'' - удаляет все соединения с другими узлами
| |
− | *''destroy()'' - удаляет энергоузел.
| |
| | | |
− | == Работа с энергетическими сетями == | + | == Работа с энгергитическими сетями == |
− | | |
− | ''EnergyNet.getNodeOnCoords(blockSource, x, y, z)'' – возвращает узел на данных координатах, если он существует. Используется в IndustrialCraft для нанесения урона от оголённых проводов и для мультиметра.
| |
| | | |
| == Примеры == | | == Примеры == |
− | | + | </div> </div> |
− | === Генератор ===
| |
− | | |
− |
| |
− | <syntaxhighlight lang="JavaScript">// Cоздадим блок с id "RFgenerator", который будет вырабатывать энергию.
| |
− | TileEntity.registerPrototype(BlockID.RFgenerator, {
| |
− | canReceiveEnergy: function(){
| |
− | return false; // не может получать энергию
| |
− | },
| |
− | energyTick: function(type, src) {
| |
− | src.add(10); // генерирует 10 RF за тик.
| |
− | }
| |
− | });
| |
− | | |
− | // привяжем к этому tile entity наш тип энергии
| |
− | EnergyTileRegistry.addEnergyTypeForId(BlockID.RFgenerator, energyRF);</syntaxhighlight>
| |
− | | |
− | === Потребитель ===
| |
− | | |
− |
| |
− | <syntaxhighlight lang="JavaScript">// Cоздадим блок с id "RFconsumer", который будет потреблять энергию для производства алмазов.
| |
− | TileEntity.registerPrototype(BlockID.RFconsumer, {
| |
− | defaultValues: {
| |
− | progress: 0 // сохраняемое значение прогресса работы
| |
− | },
| |
− | canExtractEnergy: function(side, type) {
| |
− | return false; // не может отдавать энергию
| |
− | },
| |
− | energyReceive: function(type, amount, voltage) {
| |
− | this.data.progress += amount; // увеличиваем прогресс производства алмаза.
| |
− | return amount; // и возвращаем сколько забрали энергии
| |
− | },
| |
− | tick: function(){
| |
− | if(this.data.progress >= 10000){
| |
− | this.data.progress = 0;
| |
− | World.drop(this.x, this.y +1, this.z, 264, 1); // дропнуть алмаз на координатах tile entity.
| |
− | }
| |
− | }
| |
− | });
| |
− | | |
− | // привяжем к этому tile entity наш тип энергии
| |
− | EnergyTileRegistry.addEnergyTypeForId(BlockID.RFconsumer, energyRF);
| |
− | </syntaxhighlight> | |
− | | |
− | === Хранилище ===
| |
− | | |
− | Стороны приёма и отправки энергии для хранилища должны быть разделены. Иначе два хранилища будут бесконечно обмениваться энергией друг с другом, уменьшая количество энергии, отдаваемое другим tile enity.
| |
− | <syntaxhighlight lang="JavaScript">//Cоздадим блок с id "RFstorage" и настроим его так, чтобы он отдавал энергию снизу, а принимал сбоку или сверху.
| |
− | TileEntity.registerPrototype(BlockID.RFstorage, {
| |
− | defaultValues: {
| |
− | energy: 0 // сохраняемое значение, обозначающее запасенную энергию
| |
− | },
| |
− | canReceiveEnergy: function(side, type) {
| |
− | return side != 0; // side != 0 выведет true, если сторона любая, кроме нижней.
| |
− | } ,
| |
− | canExtractEnergy: function(side, type) {
| |
− | return side == 0; // выведет true при подключении блока для выхода энергии с нижней стороны.
| |
− | },
| |
− | getCapacity: function(){
| |
− | return 2e6; // установим лимит хранилища энергии в 2 миллиона (2e6 - это способ записи числа 2000000)
| |
− | },
| |
− | energyReceive: function(type, amount, voltage) {
| |
− | amount = Math.min(amount, 1000); // устанавливаем максимальное количество энергии, которое может принять механизм равным 1000.
| |
− | var add = Math.min(amount, this.getCapacity() - this.data.energy); // уменьшаем количество энергии, так, чтобы хранилище не переполнялось;
| |
− | this.data.energy += add; // добавляем энергию в хранилище
| |
− | return add; // и возвращаем сколько забрали энергии
| |
− | },
| |
− | energyTick: function(type, src){
| |
− | var output = Math.min(1000, this.data.energy); // определяем, сколько энергии блок может отдать
| |
− | this.data.energy += src.add(output) - output; // прибавляем к хранилищу количество энергии, которое осталось после отправки пакета, и вычитаем сколько отправляли.
| |
− | },
| |
− | });
| |
− | | |
− | // привяжем к этому tile entity наш тип энергии
| |
− | EnergyTileRegistry.addEnergyTypeForId(BlockID.RFstorage, energyRF);</syntaxhighlight>
| |