package mods.eln.sixnode.powercapacitorsix; import mods.eln.Eln; import mods.eln.i18n.I18N; import mods.eln.misc.Direction; import mods.eln.misc.LRDU; import mods.eln.misc.Utils; import mods.eln.node.NodeBase; import mods.eln.node.six.SixNode; import mods.eln.node.six.SixNodeDescriptor; import mods.eln.node.six.SixNodeElement; import mods.eln.node.six.SixNodeElementInventory; import mods.eln.sim.ElectricalLoad; import mods.eln.sim.IProcess; import mods.eln.sim.ThermalLoad; import mods.eln.sim.mna.component.Capacitor; import mods.eln.sim.mna.component.Resistor; import mods.eln.sim.nbt.NbtElectricalLoad; import mods.eln.sim.process.destruct.BipoleVoltageWatchdog; import mods.eln.sim.process.destruct.WorldExplosion; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; import net.minecraft.nbt.NBTTagCompound; import javax.annotation.Nullable; import java.util.HashMap; import java.util.Map; public class PowerCapacitorSixElement extends SixNodeElement { PowerCapacitorSixDescriptor descriptor; NbtElectricalLoad positiveLoad = new NbtElectricalLoad("positiveLoad"); NbtElectricalLoad negativeLoad = new NbtElectricalLoad("negativeLoad"); Capacitor capacitor = new Capacitor(positiveLoad, negativeLoad); Resistor dischargeResistor = new Resistor(positiveLoad, negativeLoad); PunkProcess punkProcess = new PunkProcess(); BipoleVoltageWatchdog watchdog = new BipoleVoltageWatchdog().set(capacitor); double stdDischargeResistor; boolean fromNbt = false; SixNodeElementInventory inventory = new SixNodeElementInventory(2, 64, this); public PowerCapacitorSixElement(SixNode SixNode, Direction side, SixNodeDescriptor descriptor) { super(SixNode, side, descriptor); this.descriptor = (PowerCapacitorSixDescriptor) descriptor; electricalLoadList.add(positiveLoad); electricalLoadList.add(negativeLoad); electricalComponentList.add(capacitor); electricalComponentList.add(dischargeResistor); electricalProcessList.add(punkProcess); slowProcessList.add(watchdog); watchdog.set(new WorldExplosion(this).machineExplosion()); positiveLoad.setAsMustBeFarFromInterSystem(); } class PunkProcess implements IProcess { double eLeft = 0; double eLegaliseResistor; @Override public void process(double time) { if (eLeft <= 0) { eLeft = 0; dischargeResistor.setR(stdDischargeResistor); } else { eLeft -= dischargeResistor.getP() * time; dischargeResistor.setR(eLegaliseResistor); } } } @Override public ElectricalLoad getElectricalLoad(LRDU lrdu) { if (lrdu == front.right()) return positiveLoad; if (lrdu == front.left()) return negativeLoad; return null; } @Override public ThermalLoad getThermalLoad(LRDU lrdu) { return null; } @Override public int getConnectionMask(LRDU lrdu) { if (lrdu == front.right()) return NodeBase.maskElectricalPower; if (lrdu == front.left()) return NodeBase.maskElectricalPower; return 0; } @Override public String multiMeterString() { return Utils.plotVolt("U", Math.abs(capacitor.getU())) + Utils.plotAmpere("I", capacitor.getCurrent()); } @Nullable @Override public Map<String, String> getWaila() { Map<String, String> info = new HashMap<String, String>(); info.put(I18N.tr("Capacity"), Utils.plotValue(capacitor.getC(), "F")); info.put(I18N.tr("Charge"), Utils.plotEnergy("", capacitor.getE())); if (Eln.wailaEasyMode) { info.put(I18N.tr("Voltage drop"), Utils.plotVolt("", Math.abs(capacitor.getU()))); info.put(I18N.tr("Current"), Utils.plotAmpere("", Math.abs(capacitor.getCurrent()))); } return info; } @Override public String thermoMeterString() { return null; } @Override public void initialize() { Eln.applySmallRs(positiveLoad); Eln.applySmallRs(negativeLoad); setupPhysical(); } @Override public void inventoryChanged() { super.inventoryChanged(); setupPhysical(); } public void setupPhysical() { double eOld = capacitor.getE(); capacitor.setC(descriptor.getCValue(inventory)); stdDischargeResistor = descriptor.dischargeTao / capacitor.getC(); watchdog.setUNominal(descriptor.getUNominalValue(inventory)); punkProcess.eLegaliseResistor = Math.pow(descriptor.getUNominalValue(inventory), 2) / 400; if (fromNbt) { dischargeResistor.setR(stdDischargeResistor); fromNbt = false; } else { double deltaE = capacitor.getE() - eOld; punkProcess.eLeft += deltaE; if (deltaE < 0) { dischargeResistor.setR(stdDischargeResistor); } else { dischargeResistor.setR(punkProcess.eLegaliseResistor); } } } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setDouble("punkELeft", punkProcess.eLeft); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); punkProcess.eLeft = nbt.getDouble("punkELeft"); if (Double.isNaN(punkProcess.eLeft)) punkProcess.eLeft = 0; fromNbt = true; } public void networkSerialize(java.io.DataOutputStream stream) { super.networkSerialize(stream); /* * try { * * * } catch (IOException e) { * * e.printStackTrace(); } */ } @Override public IInventory getInventory() { return inventory; } @Override public boolean hasGui() { return true; } @Override public Container newContainer(Direction side, EntityPlayer player) { return new PowerCapacitorSixContainer(player, inventory); } }