Строка 12: | Строка 12: | ||
#''EnergyNetBuilder'' - модуль построения энергосетей и взаимодействия с ними. | #''EnergyNetBuilder'' - модуль построения энергосетей и взаимодействия с ними. | ||
</div> <div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"> | </div> <div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"> | ||
+ | <div class="mw-parser-output"> | ||
== Создание нового типа энергии == | == Создание нового типа энергии == | ||
Строка 27: | Строка 28: | ||
**''value ''- лимит на размер пакета энергии (напряжение), который блок может проводить. При превышении максимального напряжения размер пакета уменьшается до лимита провода и вызывается overloadFunc. | **''value ''- лимит на размер пакета энергии (напряжение), который блок может проводить. При превышении максимального напряжения размер пакета уменьшается до лимита провода и вызывается overloadFunc. | ||
**''overloadFunc ''- функция, которая вызвывается при приёма пакета энергии с напряжением выше лимита провода. Необязательный аргумент, имеет вид: | **''overloadFunc ''- функция, которая вызвывается при приёма пакета энергии с напряжением выше лимита провода. Необязательный аргумент, имеет вид: | ||
− | |||
− | |||
<syntaxhighlight lang="JavaScript">function(maxVoltage){ | <syntaxhighlight lang="JavaScript">function(maxVoltage){ | ||
// this в этой функции возвращает объект энергосети, частью которой является провод. | // this в этой функции возвращает объект энергосети, частью которой является провод. | ||
Строка 42: | Строка 41: | ||
energyRF.registerWire(BlockID.RFconduct, 2000); | energyRF.registerWire(BlockID.RFconduct, 2000); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | </div> </div> <div class="mw-parser-output"><div class="mw-parser-output"> </div> </div> </div> | + | </div> </div> <div class="mw-parser-output"><div class="mw-parser-output"> </div> </div> </div> <div class="mw-parser-output"> </div> </div> |
− | <div class="mw-parser-output"> | + | |
== Механика передачи энергии == | == Механика передачи энергии == | ||
Данная библиотека для Inner Core представляет собой инструмент для быстрого создания новых типов энергии и имеет большой функционал для работы с ними.
IMPORT("EnergyNet");
EnergyTypeRegistry.assureEnergyType("name", value) - создает новый тип энергии и возвращает его, если такой тип энергии уже существует, новый создан не будет, а вернется уже существующий, таким образом если 2 мода создают один тип энергии, он будет общий.
Параметры:
Возвращает функция тип с данным именем (созданный или импортированый), который обладает следующими методами и значениями:
function(maxVoltage){
// this в этой функции возвращает объект энергосети, частью которой является провод.
}
Пример:
// в начале мода импортируем библиотеку (она должна находиться в 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 // сохраняемое значение, обозначающее запасенную энергию
},
isEnergySource: function() {
return true; // блок может отдавать энергию
}
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);