package mods.eln.simplenode.energyconverter;
import mods.eln.Eln;
import mods.eln.misc.Direction;
import mods.eln.misc.LRDU;
import mods.eln.node.simple.SimpleNode;
import mods.eln.sim.ElectricalLoad;
import mods.eln.sim.IProcess;
import mods.eln.sim.ThermalLoad;
import mods.eln.sim.nbt.NbtElectricalLoad;
import mods.eln.sim.nbt.NbtResistor;
import mods.eln.sim.process.destruct.VoltageStateWatchDog;
import mods.eln.sim.process.destruct.WorldExplosion;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTTagCompound;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
public class EnergyConverterElnToOtherNode extends SimpleNode {
EnergyConverterElnToOtherDescriptor descriptor;
NbtElectricalLoad load = new NbtElectricalLoad("load");
NbtResistor powerInResistor = new NbtResistor("powerInResistor", load, null);
ElectricalProcess electricalProcess = new ElectricalProcess();
VoltageStateWatchDog watchdog = new VoltageStateWatchDog();
public double energyBuffer = 0;
public double energyBufferMax;
public double inStdVoltage;
public double inPowerMax;
//public double otherOutMax = 32;
public double inPowerFactor = 0.5;
public static final byte setInPowerFactor = 1;
@Override
protected void setDescriptorKey(String key) {
super.setDescriptorKey(key);
descriptor = (EnergyConverterElnToOtherDescriptor) getDescriptor();
}
@Override
public int getSideConnectionMask(Direction directionA, LRDU lrduA) {
if (directionA == getFront()) return maskElectricalPower;
return 0;
}
@Override
public ThermalLoad getThermalLoad(Direction directionA, LRDU lrduA) {
return null;
}
@Override
public ElectricalLoad getElectricalLoad(Direction directionB, LRDU lrduB) {
return load;
}
@Override
public void initialize() {
electricalLoadList.add(load);
electricalComponentList.add(powerInResistor);
electricalProcessList.add(electricalProcess);
slowProcessList.add(watchdog);
Eln.applySmallRs(load);
load.setAsPrivate();
descriptor.applyTo(this);
WorldExplosion exp = new WorldExplosion(this).machineExplosion();
watchdog.set(load).setUNominal(inStdVoltage).set(exp);
connect();
}
class ElectricalProcess implements IProcess {
double timeout = 0;
@Override
public void process(double time) {
energyBuffer += powerInResistor.getP() * time;
timeout -= time;
if (timeout < 0) {
timeout = 0.05;
double energyMiss = energyBufferMax - energyBuffer;
if (energyMiss <= 0) {
powerInResistor.highImpedance();
} else {
double factor = Math.min(1, energyMiss / energyBufferMax * 2);
if (factor < 0.005) factor = 0;
double inP = factor * inPowerMax * inPowerFactor;
powerInResistor.setR(inStdVoltage * inStdVoltage / inP);
}
}
}
}
public double getOtherModEnergyBuffer(double conversionRatio) {
return energyBuffer * conversionRatio;
}
public void drawEnergy(double otherModEnergy, double conversionRatio) {
energyBuffer -= otherModEnergy / conversionRatio;
}
public double getOtherModOutMax(double otherOutMax, double conversionRatio) {
return Math.min(getOtherModEnergyBuffer(conversionRatio), otherOutMax);
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setDouble("energyBuffer", energyBuffer);
nbt.setDouble("inPowerFactor", inPowerFactor);
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
energyBuffer = nbt.getDouble("energyBuffer");
inPowerFactor = nbt.getDouble("inPowerFactor");
}
@Override
public boolean hasGui(Direction side) {
return true;
}
@Override
public void publishSerialize(DataOutputStream stream) {
super.publishSerialize(stream);
try {
stream.writeFloat((float) inPowerFactor);
stream.writeFloat((float) inPowerMax);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void networkUnserialize(DataInputStream stream, EntityPlayerMP player) {
try {
switch (stream.readByte()) {
case setInPowerFactor:
inPowerFactor = stream.readFloat();
needPublish();
break;
default:
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public String getNodeUuid() {
return getNodeUuidStatic();
}
public static String getNodeUuidStatic() {
return "ElnToOther";
}
}