м (удалён ненужный код) |
|||
Строка 1: | Строка 1: | ||
− | + | Данная библиотека для Inner Core представляет собой инструмент для быстрого создания новых типов энергии и имеет большой функционал для работы с ними. | |
− | Данная библиотека для 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) | Последняя версия (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)'' нужно добавить в папку ''lib/'' в директории мода (если таковой нету, то ее нужно создать).Для импорта библиотеки в мод в заголовочном файле (или если он отсутствует в первом файле кода) следует добавить строку: | ||
+ | <syntaxhighlight lang="JavaScript">IMPORT("EnergyNet"); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | ||
== Модули и классы == | == Модули и классы == | ||
Строка 18: | Строка 18: | ||
#''EnergyNode ''- базовый класс энергоузла | #''EnergyNode ''- базовый класс энергоузла | ||
#''EnergyGrid ''- класс узла блока-проводника | #''EnergyGrid ''- класс узла блока-проводника | ||
− | + | ||
== Механика передачи энергии == | == Механика передачи энергии == | ||
Строка 34: | Строка 34: | ||
*''value'' - сколько ''Eu'' (единиц энергии ''IndustrialCraft'') содержится в 1 единице данного типа энергии, данное значение используется для конвертации из одного вида энергии в другой. ''Энергия Eu принята за эталон.'' | *''value'' - сколько ''Eu'' (единиц энергии ''IndustrialCraft'') содержится в 1 единице данного типа энергии, данное значение используется для конвертации из одного вида энергии в другой. ''Энергия Eu принята за эталон.'' | ||
− | Возвращает функция тип с данным именем (созданный или | + | Возвращает функция тип с данным именем (созданный или импортированный), который обладает следующими методами и значениями: |
*<''energyType''>''.name'' - имя данного типа энергии. | *<''energyType''>''.name'' - имя данного типа энергии. | ||
Строка 49: | Строка 49: | ||
energyRF.registerWire(BlockID.RFconduct, 2000); | energyRF.registerWire(BlockID.RFconduct, 2000); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | ||
== Привязка типов энергии к TileEntity == | == Привязка типов энергии к TileEntity == | ||
Строка 67: | Строка 67: | ||
**''voltage'' – напряжение энергии | **''voltage'' – напряжение энергии | ||
*''isEnergySource: function(type) {return true;}'' – определяет, может ли tile entity вырабатывать энергию данного типа. Если да, то для него строится энергосеть. | *''isEnergySource: function(type) {return true;}'' – определяет, может ли tile entity вырабатывать энергию данного типа. Если да, то для него строится энергосеть. | ||
− | *''canReceiveEnergy: function(side, type) {return true/false;}'' – определяет, может ли tile entity получать энергию | + | *''canReceiveEnergy: function(side, type) {return true/false;}'' – определяет, может ли tile entity получать энергию данного типа и с каких сторон. Вызывается при попытке соединения tile entity к энергосети. |
*''canExtractEnergy: function(side, type) {return true/false;}'' – определяет, с каких сторон tile entity может выдавать энергию. | *''canExtractEnergy: function(side, type) {return true/false;}'' – определяет, с каких сторон tile entity может выдавать энергию. | ||
− | + | ||
== Объект EnergySource == | == Объект EnergySource == | ||
Строка 76: | Строка 76: | ||
*''src.add(amount, voltage)'' - добавляет в сеть данное кол-во энергии ''(amount)'', возвращает, какое кол-во энергии добавить не удалось из-за переполнения (0, если вся энергия добавлена). Если значение ''voltage'' (напряжение) не указано, то оно будет равно ''amount''. | *''src.add(amount, voltage)'' - добавляет в сеть данное кол-во энергии ''(amount)'', возвращает, какое кол-во энергии добавить не удалось из-за переполнения (0, если вся энергия добавлена). Если значение ''voltage'' (напряжение) не указано, то оно будет равно ''amount''. | ||
*''src.addAll(amount, voltage)'' - аналогичен методу ''add'', но ничего не возвращает и работает быстрее, потому что добавляет энергию в буфер сети, позволяя объединять в один пакет множество пакетов, созданных генераторами. | *''src.addAll(amount, voltage)'' - аналогичен методу ''add'', но ничего не возвращает и работает быстрее, потому что добавляет энергию в буфер сети, позволяя объединять в один пакет множество пакетов, созданных генераторами. | ||
− | + | ||
− | == Работа с | + | == Работа с энергетическими сетями == |
Большая часть методов из модуля EnergyNetBuilder технические и используются только внутри библиотеки. Однако некоторые из них могут быть полезны и в модах: | Большая часть методов из модуля EnergyNetBuilder технические и используются только внутри библиотеки. Однако некоторые из них могут быть полезны и в модах: | ||
Строка 83: | Строка 83: | ||
''EnergyNetBuilder.rebuildTileNet(объект tile entity)'' – удаляет все энергосети механизма и перестраивает все его соединения с другими сетями. Необходимо вызвать при изменении сторон, через которые tile entity может получать или передавать энергию. | ''EnergyNetBuilder.rebuildTileNet(объект tile entity)'' – удаляет все энергосети механизма и перестраивает все его соединения с другими сетями. Необходимо вызвать при изменении сторон, через которые tile entity может получать или передавать энергию. | ||
− | ''EnergyNetBuilder.getNetOnCoords(x, y, z)'' – возвращает сеть, если на данных координатах есть её провод. Используется в IndustrialCraft для нанесения урона от оголённых проводов и для мультиметра. | + | ''EnergyNetBuilder.getNetOnCoords(x, y, z)'' – возвращает сеть, если на данных координатах есть её провод. Используется в IndustrialCraft для нанесения урона от оголённых проводов и для мультиметра. ''EnergyNetBuilder.getNetByBlock(x, y, z, wireId)'' – возвращает сеть, если блок на данных координатах имеет ид, указанное в параметре wireId. |
− | ''EnergyNetBuilder.getNetByBlock(x, y, z, wireId)'' – возвращает сеть, если блок на данных координатах имеет ид, указанное в параметре wireId. | + | |
== Примеры == | == Примеры == | ||
Строка 90: | Строка 90: | ||
| | ||
− | <syntaxhighlight lang="JavaScript">// Cоздадим блок с id "RFgenerator", который будет | + | <syntaxhighlight lang="JavaScript">// Cоздадим блок с id "RFgenerator", который будет вырабатывать энергию. |
TileEntity.registerPrototype(BlockID.RFgenerator, { | TileEntity.registerPrototype(BlockID.RFgenerator, { | ||
isEnergySource: function() { | isEnergySource: function() { | ||
Строка 105: | Строка 105: | ||
// привяжем к этому tile entity наш тип энергии | // привяжем к этому tile entity наш тип энергии | ||
EnergyTileRegistry.addEnergyTypeForId(BlockID.RFgenerator, energyRF);</syntaxhighlight> | EnergyTileRegistry.addEnergyTypeForId(BlockID.RFgenerator, energyRF);</syntaxhighlight> | ||
− | + | ||
=== Потребитель === | === Потребитель === | ||
Строка 129: | Строка 129: | ||
EnergyTileRegistry.addEnergyTypeForId(BlockID.RFconsumer, energyRF); | EnergyTileRegistry.addEnergyTypeForId(BlockID.RFconsumer, energyRF); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | ||
=== Хранилище === | === Хранилище === | ||
Строка 148: | Строка 148: | ||
}, | }, | ||
energyReceive: function(type, amount, voltage) { | energyReceive: function(type, amount, voltage) { | ||
− | amount = Math.min(amount, 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; // добавляем энергию в хранилище | ||
Строка 161: | Строка 161: | ||
// привяжем к этому tile entity наш тип энергии | // привяжем к этому tile entity наш тип энергии | ||
EnergyTileRegistry.addEnergyTypeForId(BlockID.RFstorage, energyRF);</syntaxhighlight> | EnergyTileRegistry.addEnergyTypeForId(BlockID.RFstorage, energyRF);</syntaxhighlight> | ||
− |
Данная библиотека для Inner Core представляет собой инструмент для быстрого создания новых типов энергии и имеет большой функционал для работы с ними.
Последняя версия (v9) - скачать
Файлы:
energy-net.js - сама библиотека
energy-net.d.ts - заголовочный файл (API)
Для добавления библиотеки в мод ее файл (energy-net.js) нужно добавить в папку lib/ в директории мода (если таковой нету, то ее нужно создать).Для импорта библиотеки в мод в заголовочном файле (или если он отсутствует в первом файле кода) следует добавить строку:
IMPORT("EnergyNet");
Энергия может передаваться как по проводам, так и напрямую от генератора к соседним механизмам. Для этого строится граф (энергосеть), в которым механизмы и блоки-проводники являются узлами. Энергия передаётся пакетами от блока-источника по всем узлам, с которыми он соединён. Каждый пакет имеет определённое количество энергии и напряжение (количество энергии, которое в нём было изначально).
В целях оптимизации провода одного типа, соединенные друг с другом, объединяются в один энергоузел, в то время как каждый блок-механизм имеет свой энергоузел.
EnergyTypeRegistry.assureEnergyType("name", value) - создает новый тип энергии и возвращает его, если такой тип энергии уже существует, новый создан не будет, а вернется уже существующий, таким образом если 2 мода создают один тип энергии, он будет общий.
Параметры:
Возвращает функция тип с данным именем (созданный или импортированный), который обладает следующими методами и значениями:
Пример:
// в начале мода импортируем библиотеку (она должна находиться в lib/) importLib("energylib.js", "*");
// создаем тип энергии redstone flux
var energyRF = EnergyTypeRegistry.assureEnergyType("RF", 0.25);
// регистрируем блок-проводник для данного типа энергии
energyRF.registerWire(BlockID.RFconduct, 2000);
EnergyTileRegistry.addEnergyTypeForId(tileEntityId, energyType) - добавляет tile entity с данным id дополнительные события, которые позволяют ему работать с данным типом энергии. К одному tile entity можно привязать несколько разных типов энергии.
Параметры:
Новые события:
Данный объект является интерфейсом для добавления энергии в сеть, который передается в события для работы с энергией (src).
Методы:
Большая часть методов из модуля EnergyNetBuilder технические и используются только внутри библиотеки. Однако некоторые из них могут быть полезны и в модах:
EnergyNetBuilder.rebuildTileNet(объект tile entity) – удаляет все энергосети механизма и перестраивает все его соединения с другими сетями. Необходимо вызвать при изменении сторон, через которые tile entity может получать или передавать энергию.
EnergyNetBuilder.getNetOnCoords(x, y, z) – возвращает сеть, если на данных координатах есть её провод. Используется в IndustrialCraft для нанесения урона от оголённых проводов и для мультиметра. EnergyNetBuilder.getNetByBlock(x, y, z, wireId) – возвращает сеть, если блок на данных координатах имеет ид, указанное в параметре wireId.
// Cоздадим блок с id "RFgenerator", который будет вырабатывать энергию.
TileEntity.registerPrototype(BlockID.RFgenerator, {
isEnergySource: function() {
return true; // может генерировать энергию
},
canReceiveEnergy: function(){
return false; // не может получать энергию
},
energyTick: function(type, src) {
src.addAll(10); // генерирует 10 RF за тик. Так как сразу отдаёт всю энергию, используется более быстрый метод.
}
});
// привяжем к этому tile entity наш тип энергии
EnergyTileRegistry.addEnergyTypeForId(BlockID.RFgenerator, energyRF);
// Cоздадим блок с id "RFconsumer", который будет потреблять энергию для производства алмазов.
TileEntity.registerPrototype(BlockID.RFconsumer, {
defaultValues: {
progress: 0 // сохраняемое значение прогресса работы
},
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);