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

 
(не показаны 4 промежуточные версии этого же участника)
Строка 2: Строка 2:
 
== Загрузка ==
 
== Загрузка ==
  
Последняя версия (v9) - [https://github.com/MineExplorer/IC_Libraries/releases/tag/energy-net-v9 скачать]<br/> Файлы:<br/> energy-net.js&nbsp;- сама библиотека<br/> energy-net.d.ts&nbsp;- заголовочный файл (API)
+
Последняя версия (v9) - [https://github.com/MineExplorer/IC_Libraries/releases/tag/energy-net-v9 скачать]<br/> Файлы:<br/> energy-net.js - сама библиотека<br/> energy-net.d.ts - заголовочный файл (API)
  
 
== Импорт ==
 
== Импорт ==
  
Для добавления библиотеки в мод ее файл ''(energy-net.js)''&nbsp;нужно добавить в папку&nbsp;''lib/'' в директории мода (если таковой нету, то ее нужно создать).Для импорта библиотеки в мод в заголовочном файле (или если он отсутствует в первом файле кода) следует добавить строку:
+
Для добавления библиотеки в мод ее файл ''(energy-net.js)'' нужно добавить в папку ''lib/'' в директории мода (если таковой нету, то ее нужно создать).Для импорта библиотеки в мод в заголовочном файле (или если он отсутствует в первом файле кода) следует добавить строку:
 
<syntaxhighlight lang="JavaScript">IMPORT("EnergyNet");
 
<syntaxhighlight lang="JavaScript">IMPORT("EnergyNet");
 
</syntaxhighlight>
 
</syntaxhighlight>
Строка 14: Строка 14:
 
#''EnergyTypeRegistry'' - модуль для регистрации новых типов энергии  
 
#''EnergyTypeRegistry'' - модуль для регистрации новых типов энергии  
 
#''EnergyTileRegistry'' - модуль для привязки типов энергии к TileEntity  
 
#''EnergyTileRegistry'' - модуль для привязки типов энергии к TileEntity  
#''EnergyGridBuilder'' - модуль построения энергосетей и взаимодействия с ними
+
#''EnergyGridBuilder'' - модуль построения энергосетей  
#''EnergyNet ''- модуль для хранения и получения энергосетей
+
#''EnergyNet'' - модуль, хранящий энергосети
#''EnergyNode ''- базовый класс энергоузла  
+
#''EnergyNode'' - базовый класс энергоузла  
#''EnergyGrid ''- класс узла блока-проводника  
+
#''EnergyGrid'' - класс узла блока-проводника  
  
 
== Механика передачи энергии ==
 
== Механика передачи энергии ==
  
Энергия может передаваться как по проводам, так и напрямую от генератора к соседним механизмам. Для этого строится граф (энергосеть), в которым механизмы и блоки-проводники являются узлами.&nbsp;Энергия передаётся пакетами от блока-источника по всем узлам, с которыми он соединён. Каждый пакет&nbsp;имеет определённое количество&nbsp;энергии и напряжение (количество энергии, которое в нём было изначально).
+
Энергия может передаваться как по проводам, так и напрямую от генератора к соседним механизмам. Для этого строится граф (энергосеть), в которым механизмы и блоки-проводники являются узлами. Энергия передаётся пакетами от блока-источника по всем узлам, с которыми он соединён. Каждый пакет имеет определённое количество энергии и напряжение (количество энергии, которое в нём было изначально).
  
 
В целях оптимизации провода одного типа, соединенные друг с другом, объединяются в один энергоузел, в то время как каждый блок-механизм имеет свой энергоузел.
 
В целях оптимизации провода одного типа, соединенные друг с другом, объединяются в один энергоузел, в то время как каждый блок-механизм имеет свой энергоузел.
Строка 38: Строка 38:
 
*<''energyType''>''.name'' - имя данного типа энергии.  
 
*<''energyType''>''.name'' - имя данного типа энергии.  
 
*<''energyType''>''.registerWire(id, value, energyGridClass?)'' – регистрирует провод с данным id. Параметры:  
 
*<''energyType''>''.registerWire(id, value, energyGridClass?)'' – регистрирует провод с данным id. Параметры:  
**''value ''-&nbsp;лимит на размер пакета энергии (напряжение), который блок&nbsp;может проводить. При превышении максимального напряжения размер пакета уменьшается до лимита провода и вызывается функция onOverload в классе провода.  
+
**''value'' - лимит на размер пакета энергии (напряжение), который блок может проводить. При превышении максимального напряжения размер пакета уменьшается до лимита провода и вызывается функция onOverload в классе провода.  
**''energyGridClass''&nbsp;- опционально, позволяет задать свой класс провода, который должен быть наследован от класса&nbsp;''EnergyGrid''.   
+
**''energyGridClass'' - опционально, позволяет задать свой класс провода, который должен быть наследован от класса ''EnergyGrid''.   
  
 
'''Пример:'''
 
'''Пример:'''
<syntaxhighlight lang="JavaScript">// в начале мода импортируем библиотеку (она должна находиться в lib/) importLib("energylib.js", "*");
+
<syntaxhighlight lang="JavaScript">// в начале мода импортируем библиотеку (см. выше)
  
 
// создаем тип энергии redstone flux
 
// создаем тип энергии redstone flux
Строка 52: Строка 52:
 
== Привязка типов энергии к TileEntity ==
 
== Привязка типов энергии к TileEntity ==
  
''EnergyTileRegistry.addEnergyTypeForId(blockId, energyType)'' - добавляет в tile entity&nbsp;объект класса&nbsp;[[EnergyNode|EnergyNode]], который&nbsp;может быть получен через ''this.energyNode''&nbsp;в функциях tile entity, а так же дополнительные события, которые позволяют ему работать с данным типом энергии. К одному tile entity можно привязать несколько разных типов энергии.<br/> <u>Параметры:</u>
+
''EnergyTileRegistry.addEnergyTypeForId(blockId, energyType)'' - добавляет в tile entity объект класса [[InnerCore/Libs/EnergyNet#Объект_EnergyNode|EnergyNode]], который может быть получен через ''this.energyNode'' в функциях tile entity, а так же дополнительные события, которые позволяют ему работать с данным типом энергии. К одному tile entity можно привязать несколько разных типов энергии.<br/> <u>Параметры:</u>
  
*''blockId&nbsp;''– id блока, на который был зарегистрирован нужный tile entity.  
+
*''blockId'' – id блока, на который был зарегистрирован нужный tile entity.  
 
*''energyType'' - тип энергии, который требуется к нему привязать.  
 
*''energyType'' - тип энергии, который требуется к нему привязать.  
  
 
Новые события:
 
Новые события:
  
*''energyTick: function(type, node) { /* … */ }'' - вызывается каждый тик для энергоузла&nbsp;tile entity.<br/> Параметры:  
+
*''energyTick: function(type, node) { /* … */ }'' - вызывается каждый тик для энергоузла tile entity.<br/> Параметры:  
 
**''type'' - название типа энергии, для которого вызвано это событие.  
 
**''type'' - название типа энергии, для которого вызвано это событие.  
**''node ''- энергоузел механизма, позволяет добавлять энергию   
+
**''node'' - энергоузел механизма, позволяет добавлять энергию   
 
*''energyReceive: function(type, amount, voltage) { /* … */ }'' – вызывается при приёме пакета энергии данным tile entity. Должна возвращать количество энергии, которое удалось добавить.<br/> Параметры:  
 
*''energyReceive: function(type, amount, voltage) { /* … */ }'' – вызывается при приёме пакета энергии данным tile entity. Должна возвращать количество энергии, которое удалось добавить.<br/> Параметры:  
 
**''type'' - название типа энергии  
 
**''type'' - название типа энергии  
 
**''amount'' – количество энергии  
 
**''amount'' – количество энергии  
 
**''voltage'' – напряжение энергии   
 
**''voltage'' – напряжение энергии   
*''canReceiveEnergy: function(side, type) {return boolean;}'' – определяет, может ли tile entity получать энергию данного типа и с каких сторон. Вызывается при попытке соединения tile entity к энергосети.&nbsp;По умолчанию возвращает ''true''.  
+
*''canReceiveEnergy: function(side, type) {return boolean;}'' – определяет, может ли tile entity получать энергию данного типа и с каких сторон. Вызывается при попытке соединения tile entity к энергосети. По умолчанию возвращает ''true''.  
 
*''canExtractEnergy: function(side, type) {return boolean;}'' – определяет, с каких сторон tile entity может выдавать энергию. По умолчанию возвращает ''true''.  
 
*''canExtractEnergy: function(side, type) {return boolean;}'' – определяет, с каких сторон tile entity может выдавать энергию. По умолчанию возвращает ''true''.  
*''isConductor': function(type) {return boolean;}'' – определяет, может ли tile entity проводить&nbsp;энергию&nbsp;данного типа.&nbsp;По умолчанию возвращает ''false''.  
+
*''isConductor': function(type) {return boolean;}'' – определяет, может ли tile entity проводить энергию данного типа. По умолчанию возвращает ''false''.  
  
 
== Объект EnergyNode ==
 
== Объект EnergyNode ==
Строка 75: Строка 75:
  
 
*''add(amount, voltage)'' - добавляет в сеть данное кол-во энергии ''(amount)'', возвращает, какое кол-во энергии добавить не удалось из-за переполнения (0, если вся энергия добавлена). Если значение ''voltage'' (напряжение) не указано, то оно будет равно ''amount''.  
 
*''add(amount, voltage)'' - добавляет в сеть данное кол-во энергии ''(amount)'', возвращает, какое кол-во энергии добавить не удалось из-за переполнения (0, если вся энергия добавлена). Если значение ''voltage'' (напряжение) не указано, то оно будет равно ''amount''.  
*''addCoords(x, y, z)&nbsp;''- добавляет блок на координатах x, y, z в список блоков энергоузла (позволяет, например, сделать проводящим энергию блоки обшивки в многоблочном механизме)  
+
*''addCoords(x, y, z)'' - добавляет блок на координатах x, y, z в список блоков энергоузла (позволяет, например, сделать проводящим энергию блоки обшивки в многоблочном механизме)  
*''removeCoords(x, y, z)''&nbsp;- удаляет блок из энергоузла  
+
*''removeCoords(x, y, z)'' - удаляет блок из энергоузла  
 
*''addConnection(node)'' - добавляет выходящее соединение с другим узлом  
 
*''addConnection(node)'' - добавляет выходящее соединение с другим узлом  
 
*''removeConnection(node) ''- удаляет соединение с узлом  
 
*''removeConnection(node) ''- удаляет соединение с узлом  
Строка 84: Строка 84:
 
== Работа с энергетическими сетями ==
 
== Работа с энергетическими сетями ==
  
''EnergyNet.getNodeOnCoords(blockSource, x, y, z)'' – возвращает узел на&nbsp;данных координатах, если он существует. Используется в IndustrialCraft для нанесения урона от оголённых проводов и для мультиметра.&nbsp;
+
''EnergyNet.getNodeOnCoords(blockSource, x, y, z)'' – возвращает узел на данных координатах, если он существует. Используется в IndustrialCraft для нанесения урона от оголённых проводов и для мультиметра.
  
 
== Примеры ==
 
== Примеры ==
  
 
=== Генератор ===
 
=== Генератор ===
 +
 +
&nbsp;
 
<syntaxhighlight lang="JavaScript">// Cоздадим блок с id "RFgenerator", который будет вырабатывать энергию.
 
<syntaxhighlight lang="JavaScript">// Cоздадим блок с id "RFgenerator", который будет вырабатывать энергию.
 
TileEntity.registerPrototype(BlockID.RFgenerator, {
 
TileEntity.registerPrototype(BlockID.RFgenerator, {
Строка 103: Строка 105:
  
 
=== Потребитель ===
 
=== Потребитель ===
 +
 +
&nbsp;
 
<syntaxhighlight lang="JavaScript">// Cоздадим блок с id "RFconsumer", который будет потреблять энергию для производства алмазов.
 
<syntaxhighlight lang="JavaScript">// Cоздадим блок с id "RFconsumer", который будет потреблять энергию для производства алмазов.
 
TileEntity.registerPrototype(BlockID.RFconsumer, {
 
TileEntity.registerPrototype(BlockID.RFconsumer, {
Строка 129: Строка 133:
 
=== Хранилище ===
 
=== Хранилище ===
  
Стороны приёма и отправки энергии для хранилища должны быть разделены. Иначе энергия между двумя&nbsp;связанных друг с другом механизмами могут бесконечно обмениваться энергией друг с другом, игнорируя другие tile enity.
+
Стороны приёма и отправки энергии для хранилища должны быть разделены. Иначе два хранилища будут бесконечно обмениваться энергией друг с другом, уменьшая количество энергии, отдаваемое другим tile enity.
 
<syntaxhighlight lang="JavaScript">//Cоздадим блок с id "RFstorage" и настроим его так, чтобы он отдавал энергию снизу, а принимал сбоку или сверху.
 
<syntaxhighlight lang="JavaScript">//Cоздадим блок с id "RFstorage" и настроим его так, чтобы он отдавал энергию снизу, а принимал сбоку или сверху.
 
TileEntity.registerPrototype(BlockID.RFstorage, {
 
TileEntity.registerPrototype(BlockID.RFstorage, {

Текущая версия на 02:27, 6 декабря 2021

Данная библиотека для Inner Core представляет собой инструмент для быстрого создания новых типов энергии и имеет большой функционал для работы с ними.

Загрузка[править]

Последняя версия (v9) - скачать
Файлы:
energy-net.js - сама библиотека
energy-net.d.ts - заголовочный файл (API)

Импорт[править]

Для добавления библиотеки в мод ее файл (energy-net.js) нужно добавить в папку lib/ в директории мода (если таковой нету, то ее нужно создать).Для импорта библиотеки в мод в заголовочном файле (или если он отсутствует в первом файле кода) следует добавить строку:

IMPORT("EnergyNet");

Модули и классы[править]

  1. EnergyTypeRegistry - модуль для регистрации новых типов энергии
  2. EnergyTileRegistry - модуль для привязки типов энергии к TileEntity
  3. EnergyGridBuilder - модуль построения энергосетей
  4. EnergyNet - модуль, хранящий энергосети
  5. EnergyNode - базовый класс энергоузла
  6. EnergyGrid - класс узла блока-проводника

Механика передачи энергии[править]

Энергия может передаваться как по проводам, так и напрямую от генератора к соседним механизмам. Для этого строится граф (энергосеть), в которым механизмы и блоки-проводники являются узлами. Энергия передаётся пакетами от блока-источника по всем узлам, с которыми он соединён. Каждый пакет имеет определённое количество энергии и напряжение (количество энергии, которое в нём было изначально).

В целях оптимизации провода одного типа, соединенные друг с другом, объединяются в один энергоузел, в то время как каждый блок-механизм имеет свой энергоузел.

Создание нового типа энергии[править]

EnergyTypeRegistry.assureEnergyType("name", value) - создает новый тип энергии и возвращает его, если такой тип энергии уже существует, новый создан не будет, а вернется уже существующий, таким образом если 2 мода создают один тип энергии, он будет общий.

Параметры:

  • name - уникальное название энергии, обычно используется сокращение ("Eu" - energy units, "RF" - redstone flux и т.п.)
  • value - сколько Eu (единиц энергии IndustrialCraft) содержится в 1 единице данного типа энергии, данное значение используется для конвертации из одного вида энергии в другой. Энергия Eu принята за эталон.

Возвращает функция тип с данным именем (созданный или импортированный), который обладает следующими методами и значениями:

  • <energyType>.name - имя данного типа энергии.
  • <energyType>.registerWire(id, value, energyGridClass?) – регистрирует провод с данным id. Параметры:
    • value - лимит на размер пакета энергии (напряжение), который блок может проводить. При превышении максимального напряжения размер пакета уменьшается до лимита провода и вызывается функция onOverload в классе провода.
    • energyGridClass - опционально, позволяет задать свой класс провода, который должен быть наследован от класса EnergyGrid.

Пример:

// в начале мода импортируем библиотеку (см. выше)

// создаем тип энергии redstone flux
var energyRF = EnergyTypeRegistry.assureEnergyType("RF", 0.25);
// регистрируем блок-проводник для данного типа энергии
energyRF.registerWire(BlockID.RFconduct, 2000);

Привязка типов энергии к TileEntity[править]

EnergyTileRegistry.addEnergyTypeForId(blockId, energyType) - добавляет в tile entity объект класса EnergyNode, который может быть получен через this.energyNode в функциях tile entity, а так же дополнительные события, которые позволяют ему работать с данным типом энергии. К одному tile entity можно привязать несколько разных типов энергии.
Параметры:

  • blockId – id блока, на который был зарегистрирован нужный tile entity.
  • energyType - тип энергии, который требуется к нему привязать.

Новые события:

  • energyTick: function(type, node) { /* … */ } - вызывается каждый тик для энергоузла tile entity.
    Параметры:
    • type - название типа энергии, для которого вызвано это событие.
    • node - энергоузел механизма, позволяет добавлять энергию
  • energyReceive: function(type, amount, voltage) { /* … */ } – вызывается при приёме пакета энергии данным tile entity. Должна возвращать количество энергии, которое удалось добавить.
    Параметры:
    • 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[править]

Данный объект представляет собой узел энергосети.
Основные методы:

  • add(amount, voltage) - добавляет в сеть данное кол-во энергии (amount), возвращает, какое кол-во энергии добавить не удалось из-за переполнения (0, если вся энергия добавлена). Если значение voltage (напряжение) не указано, то оно будет равно amount.
  • addCoords(x, y, z) - добавляет блок на координатах x, y, z в список блоков энергоузла (позволяет, например, сделать проводящим энергию блоки обшивки в многоблочном механизме)
  • removeCoords(x, y, z) - удаляет блок из энергоузла
  • addConnection(node) - добавляет выходящее соединение с другим узлом
  • removeConnection(node) - удаляет соединение с узлом
  • resetConnections() - удаляет все соединения с другими узлами
  • destroy() - удаляет энергоузел.

Работа с энергетическими сетями[править]

EnergyNet.getNodeOnCoords(blockSource, x, y, z) – возвращает узел на данных координатах, если он существует. Используется в IndustrialCraft для нанесения урона от оголённых проводов и для мультиметра.

Примеры[править]

Генератор[править]

 

// 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);

Потребитель[править]

 

// 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);

Хранилище[править]

Стороны приёма и отправки энергии для хранилища должны быть разделены. Иначе два хранилища будут бесконечно обмениваться энергией друг с другом, уменьшая количество энергии, отдаваемое другим tile enity.

//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);