package mods.eln.transparentnode.electricalmachine;
import mods.eln.Eln;
import mods.eln.i18n.I18N;
import mods.eln.item.MachineBoosterDescriptor;
import mods.eln.misc.Direction;
import mods.eln.misc.LRDU;
import mods.eln.misc.Utils;
import mods.eln.node.AutoAcceptInventoryProxy;
import mods.eln.node.NodeBase;
import mods.eln.node.NodePeriodicPublishProcess;
import mods.eln.node.transparent.TransparentNode;
import mods.eln.node.transparent.TransparentNodeDescriptor;
import mods.eln.node.transparent.TransparentNodeElement;
import mods.eln.node.transparent.TransparentNodeElementInventory;
import mods.eln.sim.ElectricalLoad;
import mods.eln.sim.ElectricalStackMachineProcess;
import mods.eln.sim.ElectricalStackMachineProcess.ElectricalStackMachineProcessObserver;
import mods.eln.sim.ThermalLoad;
import mods.eln.sim.mna.component.Resistor;
import mods.eln.sim.nbt.NbtElectricalLoad;
import mods.eln.sim.process.destruct.VoltageStateWatchDog;
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.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class ElectricalMachineElement extends TransparentNodeElement implements ElectricalStackMachineProcessObserver {
private final TransparentNodeElementInventory inventory;
AutoAcceptInventoryProxy booterAccepter;
private final NbtElectricalLoad electricalLoad = new NbtElectricalLoad("electricalLoad");
final Resistor electricalResistor = new Resistor(electricalLoad, null);
private final ElectricalStackMachineProcess slowRefreshProcess;
private final ElectricalMachineSlowProcess slowProcess = new ElectricalMachineSlowProcess(this);
private boolean powerOn = false;
final ElectricalMachineDescriptor descriptor;
public int inSlotId = 0;
public final int outSlotId = 0;
private int boosterSlotId = 1;
private final VoltageStateWatchDog voltageWatchdog = new VoltageStateWatchDog();
public ElectricalMachineElement(TransparentNode transparentNode, TransparentNodeDescriptor descriptor) {
super(transparentNode, descriptor);
this.descriptor = (ElectricalMachineDescriptor) descriptor;
inSlotId += this.descriptor.outStackCount;
boosterSlotId += this.descriptor.outStackCount;
inventory = new ElectricalMachineInventory(2 + this.descriptor.outStackCount, 64, this);
booterAccepter = new AutoAcceptInventoryProxy(inventory)
.acceptIfIncrement(this.descriptor.outStackCount + 1, 5, MachineBoosterDescriptor.class);
slowRefreshProcess = new ElectricalStackMachineProcess(
inventory, inSlotId, outSlotId, this.descriptor.outStackCount,
electricalResistor, Double.POSITIVE_INFINITY, this.descriptor.recipe);
electricalLoadList.add(electricalLoad);
electricalComponentList.add(electricalResistor);
slowProcessList.add(slowRefreshProcess);
slowProcessList.add(slowProcess);
slowRefreshProcess.setObserver(this);
slowProcessList.add(new NodePeriodicPublishProcess(transparentNode, 2, 1));
WorldExplosion exp = new WorldExplosion(this).machineExplosion();
slowProcessList.add(voltageWatchdog.set(electricalLoad).setUNominal(this.descriptor.nominalU).set(exp));
}
@Override
public IInventory getInventory() {
return inventory;
}
@Override
public boolean hasGui() {
return true;
}
@Override
public Container newContainer(Direction side, EntityPlayer player) {
return new ElectricalMachineContainer(this.node, player, inventory, descriptor);
}
@Override
public ElectricalLoad getElectricalLoad(Direction side, LRDU lrdu) {
return electricalLoad;
}
@Override
public ThermalLoad getThermalLoad(Direction side, LRDU lrdu) {
return null;
}
@Override
public int getConnectionMask(Direction side, LRDU lrdu) {
if (lrdu != LRDU.Down) return 0;
if (!descriptor.powerLrdu(side, front)) return 0;
return NodeBase.maskElectricalPower;
}
@Override
public String multiMeterString(Direction side) {
return Utils.plotUIP(electricalLoad.getU(), electricalLoad.getCurrent());
}
@Override
public String thermoMeterString(Direction side) {
return null;//Utils.plotCelsius("T", thermalLoad.Tc);
}
@Override
public void initialize() {
inventoryChange(getInventory());
connect();
}
@Override
public void inventoryChange(IInventory inventory) {
super.inventoryChange(inventory);
setPhysicalValue();
needPublish();
}
private void setPhysicalValue() {
ItemStack stack;
int boosterCount = 0;
stack = getInventory().getStackInSlot(boosterSlotId);
if (stack != null) {
boosterCount = stack.stackSize;
}
double speedUp = Math.pow(descriptor.boosterSpeedUp, boosterCount);
slowRefreshProcess.setEfficiency(Math.pow(descriptor.boosterEfficiency, boosterCount));
slowRefreshProcess.setSpeedUp(speedUp);
descriptor.applyTo(electricalLoad);
descriptor.applyTo(slowRefreshProcess);
}
@Override
public boolean onBlockActivated(EntityPlayer entityPlayer, Direction side, float vx, float vy, float vz) {
return booterAccepter.take(entityPlayer.getCurrentEquippedItem(), this, false, true);
}
public void networkSerialize(java.io.DataOutputStream stream) {
super.networkSerialize(stream);
double fPower = electricalResistor.getP() / descriptor.nominalP;
if (electricalResistor.getP() < 11) fPower = 0.0;
if (fPower > 1.9) fPower = 1.9;
try {
stream.writeByte((int) (fPower * 64));
serialiseItemStack(stream, inventory.getStackInSlot(inSlotId));
serialiseItemStack(stream, inventory.getStackInSlot(outSlotId));
stream.writeFloat((float) slowRefreshProcess.processState());
stream.writeFloat((float) slowRefreshProcess.processStatePerSecond());
node.lrduCubeMask.getTranslate(front.down()).serialize(stream);
stream.writeFloat((float) (electricalLoad.getU() / descriptor.nominalU));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setBoolean("powerOn", powerOn);
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
powerOn = nbt.getBoolean("powerOn");
}
@Override
public void done(ElectricalStackMachineProcess who) {
needPublish();
if (descriptor.endSound != null)
play(descriptor.endSound);
}
@Override
public Map<String, String> getWaila() {
Map<String, String> info = new HashMap<String, String>();
info.put(I18N.tr("Power consumption"), Utils.plotPower("", slowRefreshProcess.getPower()));
info.put(I18N.tr("Voltage"), Utils.plotVolt("", electricalLoad.getU()));
if (Eln.wailaEasyMode) {
info.put(I18N.tr("Power provided"), Utils.plotPower("", electricalLoad.getI() * electricalLoad.getU()));
}
return info;
}
}