EnergyLib

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

Подключение

Для добавления библиотеки в мод ее файл (energylib.js) нужно добавить в директорию lib/ в директории мода (если таковой нету, то ее нужно создать).

Для импорта библиотеки в мод в заголовочном файле (или если он остутвует в первом файле кода) следует добавить строку importLib("energylib.js", "*") .

Модули

  1. EnergyLibCore - модуль для технической работы с библиотекой, осуществляет доступ к объекту ее конфигурации.
  2. EnergyTypeRegistry - модуль для регистрации новых типов энергии.
  3. EnergyTileRegistry - модуль для привязки типов энергии к Tile Entity.

Создание новых типов энергии

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

Параметры:

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

value - сколько Eu (единиц энергии industrial craft) содержится в 1 единице данного типа энергии, данное значение используется для конвертации из одного вида энергии в другой. Энергия Eu принята за эталон.

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

  • <energyType>.name - имя данного типа энергии.
  • <energyType>.getWireSpecialType() - возвращает специальный тип блока, который будет являться проводником данного типа энергии.

Пример:

// в начале мода импортируем библиотеку (она должна находиться в lib/)
importLib("energylib.js", "*");

// создаем тип энергии redstone flux var energyRedstoneFlux = EnergyTypeRegistry.assureEnergyType("RF", 0.25);
// создаем блок-проводник для данного типа энергии
IDRegistry.genBlockID("RFconduct");
Block.createBlock("RFconduct", [
{name: "RF Conduct", texture: [["rf_conduct", 0]], inCreative: true} // текстура images/terrain-atlas/rf_conduct_0.png должна находиться в ресурсах мода  ], energyRestroneFlux.getWireSpecialType()); 

 

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

Для того, чтобы привязать тип энергии к tile entity используется метод

EnergyTileRegistry.addEnergyTypeForId(tileEntityId, energyType) - добавляет tile entity  с данным id дополнительные события, которые позволяют ему работать с данным типом энергии. К одному tile entity можно привязать несколько разных типов энергии.

Параметры:

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

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

energyTick: function(type, src) { /* … */ } - вызывается каждый тик для каждого типа энергии, привязанного к данному tile entity. Параметры:

  • type - название типа энергии, для которого вызвано это событие
  • src - объект типа energy source для работы с энергией, о нем речь пойдет позже.

energyReceive: function(type, src) { /* … */ } - аналогична energyTick, но вызывается только если в сети есть энергия.

isGenerator: function() {return true;} - данный метод нужно только если tile entity в основном генерирует энергию, а не забирает ее (является генератором), нужна для более точного расчёта.

Механика энергии

Несколько tile entity поддерживающих одинаковый тип энергии и соединенные нужным проводником объединяются в энергетическую сеть. Tile entity имеют возможность забирать энергию из сети и передавать ее туда, при этом вся переданная энергия распределяется равномерно по потребителям.

Объект EnergySource

Данный объект является интерфейсом для работы с энергией в сети, который передается в события для работы с энергией (src).

Методы:

  • src.add(amount) - добавляет в сеть данное кол-во энергии (amount), возвращает, какое кол-во энергии добавить не удалось из-за переполнения (0, если вся энергия добавлена). Обычно данный метод используется в генераторах.  
  • src.get(amount) - забирает из сети данное кол-во энергии (amount), возвращает, какое кол-во энергии удалось забрать.
  • src.getAll(amount) - аналогичен методу get, но игнорирует равномерное распределение по всем tile entity в сети, в большинстве случаев лучше использовать get.
  • src.free() - возвращает, сколько в сети есть свободного места для энергии.
  • src.amount() - возвращает, сколько энергии есть в сети.

src.storage(receive, retreive) - данный метод является функцией хранилищ энергии. Как параметры принимает то, сколько энергии он максимально может принять (reveive) и сколько максимально может отдать (retreive) за данный тик. Возвращает изменение энергии (отрицательное, если энергия была отдана, положительное, если принята).  

Пример 1 - генератор:

// требуется создать блок с id "RFgenerator"
TileEntity.registerPrototype(BlockID.RFgenerator, {
    isGenerator: function() {
        return true;
    },

    energyTick: function(type, src) {
        src.add(10); // генерирует 10 RF за тик
    }
});

// привяжем к этому tile entity наш тип энергии
EnergyTileRegistry.addEnergyTypeForId(BlockID.RFgenerator, energyRedstoneFlux);

 

 

Пример 2 - потребитель:

// требуется создать блок с id "RFconsumer"
TileEntity.registerPrototype(BlockID.RFconsumer, {
    energyTick: function(type, src) {
        var energy = Math.floor(src.get(10)); // получить от 0 до 10 энергии, Math.floor используется в данном случае для устранения ошибки вычислений, в большинстве случаев это не нужно
        for (var i = 0; i < energy; i++) { // чем больше энергии, тем больше частиц
            Particles.addParticle(this.x + Math.random(), this.y + 1, this.z +
                    Math.random(), 6, 0, .07, 0); // создать частицу над блоком
        }
    }
});

// привяжем к этому tile entity наш тип энергии
EnergyTileRegistry.addEnergyTypeForId(BlockID.RFconsumer, energyRedstoneFlux);

 При соединении 2х этих блоков проводом, созданным ранее один из них будет испускать частицы, если потребителей будет несколько, а генератор один, то частиц на каждом по отдельности будет меньше, а суммарно столько же.

Пример 3 - хранилище:

// требуется создать блок с id "RFstorage"
TileEntity.registerPrototype(BlockID.RFstorage, {
    defaultValues: {
        energy: 0 // сохраняемое значение, обозначающее запасенную энергию
    },

    energyTick: function(type, src) {
        this.data.energy += src.storage(Math.min(20, 1000 - this.data.energy), Math.min(20, this.data.energy)); // вызовем функцию хранилища: передаем не более 20 энергии в тик, при этом отдаем так, чтобы энергии не стало меньше 0, а принимаем так, чтобы не было больше 1000
    }
});

// привяжем к этому tile entity наш тип энергии
EnergyTileRegistry.addEnergyTypeForId(BlockID.RFstorage, energyRedstoneFlux);

Для проверки хранилища, можно сначала подзаряжать его от генератора, а потом отключать генератор и подключать потребитель, который будет работать от него ограниченное время.