Версия Minecraft
1.7.10
API
Forge
174
3
8
Доброй ночи, форумчане. Есть такой вопрос, касательно API Ic2, а именно его энерго-сетей. Как я понял, чтобы мой TileEntity работал с EU, я должен реализовывать IEnergySink (для приёмников энергии) и IEnergySource (для провайдеров/генераторов) и постить спец. ивенты при загрузке тайла и выгрузке. По началу были вопросы, как мне сделать лимит на вход энергии/тик и также для выхода. Вроде бы это я смог разобрать:

Вход с лимитом:
    @Override
    public double getDemandedEnergy()
    {
        return Math.max(0, Math.min(this.getMaxEnergy() - this.getEnergy(), this.getMaxInput()));
    }

    @Override
    public double injectEnergy(ForgeDirection directionFrom, double amount, double voltage)
    {
        double received = Math.max(0, Math.min(amount, this.getDemandedEnergy()));
        this.addEnergy(received);
        return amount - received;
    }


Отдача с лимитом:
    @Override
    public double getOfferedEnergy()
    {
        return this.getEnergy() > 0 ? Math.min(this.getEnergy(), this.getMaxOutput()) : 0.0D;
    }

    @Override
    public void drawEnergy(double amount)
    {
        this.setEnergy(this.getEnergy() - amount);
    }

Но 2 вопроса я так и не смог решить:
1. Метод injectEnergy, вызываемый при получении энергии из энергосетей ic2 в мой тайл передаёт параметр "voltage". По началу я надеялся, что там будет "степень" напряжённости (например 1 - 16Eu/T, 2 - 64Eu/T, 3 - 256Eu/T и т.д. умножая на 4), однако сколько я не дебагал это - voltage всегда == amount. Как мне тогда узнать каково реальное напряжение на машину идёт? Просто хочу реализовать взрывы моих машин от большого напряжения (как в ic2 classic 1.5.2)
2. IEnergySink и IEnergySource имеют геттеры каких-то "уровней": getSinkTier() и getSourceTier(), однако какое бы я туда число не передал - никаких эффектов в игре не вижу я. Что туда передавать нужно!? API под 1.7.10 на github я не видел, только под более высокие версии - там уже интерфейсы чуть-чуть отличаются.

По этому решил спросить про эти вопросы здесь. Думаю, кто-то по любому хоть раз работал тут с Ic2 энергией и сможет мне помочь ответить на эти 2 вопроса. Заранее прошу, не надо писать, что Ic2 устарелое API - переходи на CoFH. Ибо на деле, я просто делаю в своём моде поддержку и RF и EU одновременно. Ic2 хоть и "старый", но очень мало серверов, где бы его не было. По этому за это помидорки не швырять. (Спасибо)
 
Решение
У тебя мех какой? Как хранилище или как генератор?
Есть и чисто потребители (дробилки и т.д.), есть хранилища на подобии MFSU, а есть и генераторы. Но думаю это не влияет на тему вопроса.


А касательно самой темы - 1 хороший человек подсказал, как вычислить "энергоуровень" механизма из MaxEnergyInput[Output] - EnergyNet.instance.getTierFromPower(this.getMaxInput()) и EnergyNet.instance.getTierFromPower(this.getMaxOutput()) Если кому интересно - вот аккаунт этого человека NePatau#2590 [Discord].

Соответственно решение получается примерно таким:

Приём энергии с лимитом:
    @Override
    public double getDemandedEnergy()...
51
6
9
Если я не ошибаюсь, то тебе не нужно самому определять максимальный выход энергии по тиру
И советую энергию хранить в каком-нибудь public double energy;
Java:
public double getOfferedEnergy() {
        if (this.energy >= (this.output + this.output_plus))
            return Math.min(this.energy, (this.output + this.output_plus));
        return 0.0D;
    }

    public void drawEnergy(double amount) {
        this.energy -= amount;
    }

    public double getDemandedEnergy() {
        return this.maxStorage - this.energy;
    }

    public double injectEnergy(ForgeDirection directionFrom, double amount, double voltage) {
        if (this.energy >= this.maxStorage)
            return amount;
        this.energy += amount;
        return 0.0D;
    }
 
174
3
8
Если я не ошибаюсь, то тебе не нужно самому определять максимальный выход энергии по тиру
И советую энергию хранить в каком-нибудь public double energy;
#getEnergy() и #setEnergy(double energy) и работают с приватной филдой (исключение - тессеракт, там оверрайдятся эти 2 метода). Что касается максимального входа/выхода энергии - мне это нужно специально и я добился своего кодом выше. Но что должны вернуть методы #getSinkTier() и #getSourceTier() ?
 
174
3
8
тир механизма, я всегда ставлю одинаковое число
Ну по названию метода ясно, что "тир". Но зачем он используется? И опять же зачем параметр напряжения в инжекте энергии, если он всегда == кол-ву энергии
 
51
6
9
SinkTier - минимальный тир который может "войти" в мех
SourceTier - тир который выдаёт сам механизм
Про напряжение без понятия, не использовал, возможно по какой-то формуле и можно получить напряжение, но хз
 
Последнее редактирование:
174
3
8
SinkTier - минимальный тир который может "войти" в мех
SourceTier - тир который выдаёт сам механизм
А вот прикол в чём, хоть Integer.MAX_VALUE поставь, хоть 0 - ничего не меняется. Скорость входа/выхода энергии такая же, машины не взрываются. Смысл этих методов? 0_0
 
174
3
8
У тебя мех какой? Как хранилище или как генератор?
Есть и чисто потребители (дробилки и т.д.), есть хранилища на подобии MFSU, а есть и генераторы. Но думаю это не влияет на тему вопроса.


А касательно самой темы - 1 хороший человек подсказал, как вычислить "энергоуровень" механизма из MaxEnergyInput[Output] - EnergyNet.instance.getTierFromPower(this.getMaxInput()) и EnergyNet.instance.getTierFromPower(this.getMaxOutput()) Если кому интересно - вот аккаунт этого человека NePatau#2590 [Discord].

Соответственно решение получается примерно таким:

Приём энергии с лимитом:
    @Override
    public double getDemandedEnergy()
    {
        return Math.max(0, Math.min(this.getMaxEnergy() - this.getEnergy(), this.getMaxInput()));
    }

    @Override
    public int getSinkTier()
    {
        return EnergyNet.instance.getTierFromPower(this.getMaxInput());
    }

    @Override
    public double injectEnergy(ForgeDirection directionFrom, double amount, double voltage)
    {
        double received = Math.max(0, Math.min(amount, this.getDemandedEnergy()));
        this.addEnergy(received);
        return amount - received;
    }

    @Override
    public boolean acceptsEnergyFrom(TileEntity emitter, ForgeDirection direction)
    {
        return true;
    }

Отдача энергии с лимитом:
    @Override
    public double getOfferedEnergy()
    {
        return this.getEnergy() > 0 ? Math.min(this.getEnergy(), this.getMaxOutput()) : 0.0D;
    }

    @Override
    public void drawEnergy(double amount)
    {
        this.setEnergy(this.getEnergy() - amount);
    }

    @Override
    public int getSourceTier()
    {
        return EnergyNet.instance.getTierFromPower(this.getMaxOutput());
    }

    @Override
    public boolean emitsEnergyTo(TileEntity receiver, ForgeDirection direction)
    {
        return true;
    }
 
Сверху