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

 
(не показано 14 промежуточных версий 4 участников)
Строка 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">
+
Данная библиотека для Inner Core представляет собой инструмент для быстрого создания новых типов энергии и имеет большой функционал для работы с ними.  
Данная библиотека для Inner Core представляет собой инструмент для быстрого создания новых типов энергии и имеет большой функционал для работы с ними.
+
== Загрузка ==
<div class="mw-parser-output"><div class="mw-parser-output">
+
 
 +
Последняя версия (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">Для добавления библиотеки в мод ее файл ''([https://github.com/MineExplorer/IndustrialCraft_2/blob/master/IndustrialCraft²/lib/energy-net.js energy-net.js])'' нужно добавить в директорию ''lib/'' в директории мода (если таковой нету, то ее нужно создать).</div> <div class="mw-parser-output">Для импорта библиотеки в мод в заголовочном файле (или если он остутвует в первом файле кода) следует добавить строку:</div> <div class="mw-parser-output"><syntaxhighlight lang="JavaScript">IMPORT("EnergyNet");
+
 
 +
Для добавления библиотеки в мод ее файл ''(energy-net.js)'' нужно добавить в папку ''lib/'' в директории мода (если таковой нету, то ее нужно создать).Для импорта библиотеки в мод в заголовочном файле (или если он отсутствует в первом файле кода) следует добавить строку:
 +
<syntaxhighlight lang="JavaScript">IMPORT("EnergyNet");
 
</syntaxhighlight>
 
</syntaxhighlight>
</div> </div> </div>
 
== Модули ==
 
  
#''EnergyTypeRegistry'' - модуль для регистрации новых типов энергии.
+
== Модули и классы ==
#''EnergyTileRegistry'' - модуль для привязки типов энергии к TileEntity.&nbsp;
+
 
#''EnergyNetBuilder'' - модуль построения энергосетей и взаимодействия с ними.
+
#''EnergyTypeRegistry'' - модуль для регистрации новых типов энергии  
</div> <div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output">
+
#''EnergyTileRegistry'' - модуль для привязки типов энергии к TileEntity  
 +
#''EnergyGridBuilder'' - модуль построения энергосетей  
 +
#''EnergyNet'' - модуль, хранящий энергосети
 +
#''EnergyNode'' - базовый класс энергоузла
 +
#''EnergyGrid'' - класс узла блока-проводника
 +
 
 +
== Механика передачи энергии ==
 +
 
 +
Энергия может передаваться как по проводам, так и напрямую от генератора к соседним механизмам. Для этого строится граф (энергосеть), в которым механизмы и блоки-проводники являются узлами. Энергия передаётся пакетами от блока-источника по всем узлам, с которыми он соединён. Каждый пакет имеет определённое количество энергии и напряжение (количество энергии, которое в нём было изначально).
 +
 
 +
В целях оптимизации провода одного типа, соединенные друг с другом, объединяются в один энергоузел, в то время как каждый блок-механизм имеет свой энергоузел.
 +
 
 
== Создание нового типа энергии ==
 
== Создание нового типа энергии ==
  
Строка 21: Строка 34:
 
*''value'' - сколько ''Eu'' (единиц энергии ''IndustrialCraft'') содержится в 1 единице данного типа энергии, данное значение используется для конвертации из одного вида энергии в другой. ''Энергия Eu принята за эталон.''  
 
*''value'' - сколько ''Eu'' (единиц энергии ''IndustrialCraft'') содержится в 1 единице данного типа энергии, данное значение используется для конвертации из одного вида энергии в другой. ''Энергия Eu принята за эталон.''  
  
Возвращает функция тип с данным именем (созданный или импортированый), который обладает следующими методами и значениями:
+
Возвращает функция тип с данным именем (созданный или импортированный), который обладает следующими методами и значениями:
  
 
*<''energyType''>''.name'' - имя данного типа энергии.  
 
*<''energyType''>''.name'' - имя данного типа энергии.  
*<''energyType''>''.registerWire(id, value, overloadFunc)'' – регистрирует провод с данным id. Параметры:  
+
*<''energyType''>''.registerWire(id, value, energyGridClass?)'' – регистрирует провод с данным id. Параметры:  
**''value ''-&nbsp;лимит на размер пакета энергии (напряжение), который блок&nbsp;может проводить. При превышении максимального напряжения размер пакета уменьшается до лимита провода и вызывается overloadFunc.  
+
**''value'' - лимит на размер пакета энергии (напряжение), который блок может проводить. При превышении максимального напряжения размер пакета уменьшается до лимита провода и вызывается функция onOverload в классе провода.  
**''overloadFunc ''- функция, которая вызвывается&nbsp;при приёма пакета энергии с напряжением выше лимита провода. Необязательный аргумент, имеет вид:    
+
**''energyGridClass'' - опционально, позволяет задать свой класс провода, который должен быть наследован от класса ''EnergyGrid''.   
 
 
&nbsp;
 
<syntaxhighlight lang="JavaScript">function(maxVoltage){
 
// this в этой функции возвращает объект энергосети, частью которой является провод.
 
}
 
</syntaxhighlight>
 
  
 
'''Пример:'''
 
'''Пример:'''
<syntaxhighlight lang="JavaScript">// в начале мода импортируем библиотеку (она должна находиться в lib/) importLib("energylib.js", "*");
+
<syntaxhighlight lang="JavaScript">// в начале мода импортируем библиотеку (см. выше)
  
 
// создаем тип энергии redstone flux
 
// создаем тип энергии redstone flux
Строка 42: Строка 49:
 
energyRF.registerWire(BlockID.RFconduct, 2000);
 
energyRF.registerWire(BlockID.RFconduct, 2000);
 
</syntaxhighlight>
 
</syntaxhighlight>
</div> </div> <div class="mw-parser-output"><div class="mw-parser-output">&nbsp;</div> </div> </div>
 
== Механика передачи энергии ==
 
  
Энергия может передаваться как по проводам, так и напрямую от генератора к соседним механизмам. Для этого подобные механизмы объдиняются в энергосети. Энергосети - это программные объекты, которые передают энергию к подключенным к ним механизмам или другим энергосетям. Энергия передаётся пакетами с определённым количеством энергии и напряжением.
 
 
Энергосети формируются следующим образом:<br/> Для каждого блока генератора создаётся своя энергосеть, соединяющая его с подключенными к нему машинами-потребителями и энергосетями проводов. Энергосети проводов объединяют блоки с одним ид и соединяются с другими сетями того же типа энергии и машинами-потребителями энергии. Такая система позволяет разбивать провода по размеру пакета энергии, который они могут передать. Напряжение пакета энергии по умолчанию равно размеру пакеты, но может быть установлено при добавлении пакета, что позволяет передавать по проводам пакеты размером больше их лимита.
 
</div> <div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output">
 
 
== Привязка типов энергии к TileEntity ==
 
== Привязка типов энергии к TileEntity ==
  
''EnergyTileRegistry.addEnergyTypeForId(tileEntityId, energyType)'' - добавляет tile entity с данным id дополнительные события, которые позволяют ему работать с данным типом энергии. К одному 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>
  
*''tileEntityId'' – id блока, на который был зарегистрирован нужный tile entity.  
+
*''blockId'' – id блока, на который был зарегистрирован нужный tile entity.  
 
*''energyType'' - тип энергии, который требуется к нему привязать.  
 
*''energyType'' - тип энергии, который требуется к нему привязать.  
  
 
Новые события:
 
Новые события:
  
*''energyTick: function(type, src) { /* … */ }'' - вызывается каждый тик после функции tick для каждой энергосети, привязанной к данному tile entity.<br/> Параметры:  
+
*''energyTick: function(type, node) { /* … */ }'' - вызывается каждый тик для энергоузла tile entity.<br/> Параметры:  
 
**''type'' - название типа энергии, для которого вызвано это событие.  
 
**''type'' - название типа энергии, для которого вызвано это событие.  
**src - объект типа [[InnerCore/Libs/EnergyNet#Объект_EnergySource|EnergySource]] для добавления энергии    
+
**''node'' - энергоузел механизма, позволяет добавлять энергию    
 
*''energyReceive: function(type, amount, voltage) { /* … */ }'' – вызывается при приёме пакета энергии данным tile entity. Должна возвращать количество энергии, которое удалось добавить.<br/> Параметры:  
 
*''energyReceive: function(type, amount, voltage) { /* … */ }'' – вызывается при приёме пакета энергии данным tile entity. Должна возвращать количество энергии, которое удалось добавить.<br/> Параметры:  
 
**''type'' - название типа энергии  
 
**''type'' - название типа энергии  
 
**''amount'' – количество энергии  
 
**''amount'' – количество энергии  
 
**''voltage'' – напряжение энергии   
 
**''voltage'' – напряжение энергии   
*''isEnergySource: function(type) {return true;}'' – определяет, может ли tile entity вырабатывать энергию данного типа. Если да, то для него строится энергосеть.  
+
*''canReceiveEnergy: function(side, type) {return boolean;}'' – определяет, может ли tile entity получать энергию данного типа и с каких сторон. Вызывается при попытке соединения tile entity к энергосети. По умолчанию возвращает ''true''.  
*''canReceiveEnergy: function(side, type) {return true/false;}'' – определяет, может ли tile entity получать энергию даного типа и с каких сторон. Вызывается при попытке соединения tile entity к энергосети.  
+
*''canExtractEnergy: function(side, type) {return boolean;}'' – определяет, с каких сторон tile entity может выдавать энергию. По умолчанию возвращает ''true''.  
*''canExtractEnergy: function(side, type) {return true/false;}'' – определяет, с каких сторон tile entity может выдавать энергию.  
+
*''isConductor': function(type) {return boolean;}'' – определяет, может ли tile entity проводить энергию данного типа. По умолчанию возвращает ''false''.  
</div>
 
== Объект EnergySource ==
 
  
Данный объект является интерфейсом для добавления энергии в сеть, который передается в события для работы с энергией (src).<br/> <u>Методы:</u>
+
== Объект EnergyNode ==
  
*''src.add(amount, voltage)'' - добавляет в сеть данное кол-во энергии ''(amount)'', возвращает, какое кол-во энергии добавить не удалось из-за переполнения (0, если вся энергия добавлена). Если значение ''voltage'' (напряжение) не указано, то оно будет равно ''amount''.
+
Данный объект представляет собой узел энергосети.<br/> <u>Основные методы:</u>
*''src.addAll(amount, voltage)'' - аналогичен методу ''add'', но ничего не возвращает и работает быстрее, потому что добавляет энергию в буфер сети, позволяя объединять в один пакет множество пакетов, созданных генераторами.
 
</div> <div class="mw-parser-output"><div class="mw-parser-output">
 
== Работа с энегергетическими сетями ==
 
  
Большая часть методов модуля EnergyNetBuilder технические и используются только внутри библиотеки.Однако некоторые из них могут быть полезны и в модах:
+
*''add(amount, voltage)'' - добавляет в сеть данное кол-во энергии ''(amount)'', возвращает, какое кол-во энергии добавить не удалось из-за переполнения (0, если вся энергия добавлена). Если значение ''voltage'' (напряжение) не указано, то оно будет равно ''amount''.  
 +
*''addCoords(x, y, z)'' - добавляет блок на координатах x, y, z в список блоков энергоузла (позволяет, например, сделать проводящим энергию блоки обшивки в многоблочном механизме)
 +
*''removeCoords(x, y, z)'' - удаляет блок из энергоузла
 +
*''addConnection(node)'' - добавляет выходящее соединение с другим узлом
 +
*''removeConnection(node) ''- удаляет соединение с узлом
 +
*''resetConnections()'' - удаляет все соединения с другими узлами
 +
*''destroy()'' - удаляет энергоузел.
  
''EnergyNetBuilder.rebuildTileNet(объект tile entity)'' – удаляет все энергосети механизма и перестраивает все его соединения с другими сетями. Необходимо вызвать при изменении сторон, через которые tile entity может получать или передавать энергию.
+
== Работа с энергетическими сетями ==
 +
 
 +
''EnergyNet.getNodeOnCoords(blockSource, x, y, z)'' – возвращает узел на данных координатах, если он существует. Используется в IndustrialCraft для нанесения урона от оголённых проводов и для мультиметра.
  
''EnergyNetBuilder.getNetOnCoords(x, y, z)'' – возвращает сеть, если на данных координатах есть её провод. Используется в IndustrialCraft для нанесения урона от оголённых проводов и для мультиметра.
 
''EnergyNetBuilder.getNetByBlock(x, y, z, wireId)'' – возвращает сеть, если блок на данных координатах имеет ид, указанное в параметре wireId.</div> <div class="mw-parser-output">&nbsp;</div> </div>
 
 
== Примеры ==
 
== Примеры ==
  
Строка 89: Строка 91:
  
 
&nbsp;
 
&nbsp;
<syntaxhighlight lang="JavaScript">// Cоздадим блок с id "RFgenerator", который будет выробатывать энергию.
+
<syntaxhighlight lang="JavaScript">// Cоздадим блок с id "RFgenerator", который будет вырабатывать энергию.
 
TileEntity.registerPrototype(BlockID.RFgenerator, {
 
TileEntity.registerPrototype(BlockID.RFgenerator, {
    isEnergySource: function() {
 
        return true; // может генерировать энергию
 
    },
 
 
    canReceiveEnergy: function(){
 
    canReceiveEnergy: function(){
 
        return false; // не может получать энергию
 
        return false; // не может получать энергию
 
    },
 
    },
 
    energyTick: function(type, src) {
 
    energyTick: function(type, src) {
        src.addAll(10); // генерирует 10 RF за тик. Так как сразу отдаёт всю энергию, используется более быстрый метод.
+
        src.add(10); // генерирует 10 RF за тик.
 
    }
 
    }
 
});
 
});
Строка 104: Строка 103:
 
// привяжем к этому tile entity наш тип энергии
 
// привяжем к этому tile entity наш тип энергии
 
EnergyTileRegistry.addEnergyTypeForId(BlockID.RFgenerator, energyRF);</syntaxhighlight>
 
EnergyTileRegistry.addEnergyTypeForId(BlockID.RFgenerator, energyRF);</syntaxhighlight>
<div class="mw-parser-output">
+
 
 
=== Потребитель ===
 
=== Потребитель ===
  
Строка 112: Строка 111:
 
    defaultValues: {
 
    defaultValues: {
 
        progress: 0 // сохраняемое значение прогресса работы
 
        progress: 0 // сохраняемое значение прогресса работы
 +
    },
 +
    canExtractEnergy: function(side, type) {
 +
        return false; // не может отдавать энергию
 
    },
 
    },
 
    energyReceive: function(type, amount, voltage) {
 
    energyReceive: function(type, amount, voltage) {
Строка 126: Строка 128:
  
 
// привяжем к этому tile entity наш тип энергии
 
// привяжем к этому tile entity наш тип энергии
EnergyTileRegistry.addEnergyTypeForId(BlockID.RFconsumer, energyRF);</syntaxhighlight>
+
EnergyTileRegistry.addEnergyTypeForId(BlockID.RFconsumer, energyRF);
<div class="mw-parser-output">&nbsp;</div> </div> <div class="mw-parser-output">
+
</syntaxhighlight>
 +
 
 
=== Хранилище ===
 
=== Хранилище ===
  
Стороны приёма и отправки энергии для хранилища должны быть разделены. Иначе энергия между двумя&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, {
Строка 136: Строка 139:
 
        energy: 0 // сохраняемое значение, обозначающее запасенную энергию
 
        energy: 0 // сохраняемое значение, обозначающее запасенную энергию
 
    },
 
    },
    isEnergySource: function() {
 
        return true; // блок может отдавать энергию
 
    }
 
 
    canReceiveEnergy: function(side, type) {
 
    canReceiveEnergy: function(side, type) {
 
        return side != 0; // side != 0 выведет true, если сторона любая, кроме нижней.
 
        return side != 0; // side != 0 выведет true, если сторона любая, кроме нижней.
Строка 149: Строка 149:
 
    },
 
    },
 
    energyReceive: function(type, amount, voltage) {
 
    energyReceive: function(type, amount, voltage) {
        amount = Math.min(amount, 1000); // устанавлимаем максимальное количество энергии, которое может принять механизм равным 1000.
+
        amount = Math.min(amount, 1000); // устанавливаем максимальное количество энергии, которое может принять механизм равным 1000.
 
        var add = Math.min(amount, this.getCapacity() - this.data.energy); // уменьшаем количество энергии, так, чтобы хранилище не переполнялось;
 
        var add = Math.min(amount, this.getCapacity() - this.data.energy); // уменьшаем количество энергии, так, чтобы хранилище не переполнялось;
 
        this.data.energy += add; // добавляем энергию в хранилище
 
        this.data.energy += add; // добавляем энергию в хранилище
Строка 162: Строка 162:
 
// привяжем к этому tile entity наш тип энергии
 
// привяжем к этому tile entity наш тип энергии
 
EnergyTileRegistry.addEnergyTypeForId(BlockID.RFstorage, energyRF);</syntaxhighlight>
 
EnergyTileRegistry.addEnergyTypeForId(BlockID.RFstorage, energyRF);</syntaxhighlight>
</div> </div> </div> </div> </div> </div> </div> </div> </div></div></div>
 

Текущая версия на 03: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);