package mods.eln.transparentnode.electricalfurnace;
import mods.eln.generic.GenericItemUsingDamage;
import mods.eln.item.ThermalIsolatorElement;
import mods.eln.node.transparent.TransparentNodeElementInventory;
import mods.eln.sim.IProcess;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.FurnaceRecipes;
public class ElectricalFurnaceProcess implements IProcess {
ElectricalFurnaceElement furnace;
TransparentNodeElementInventory inventory;
public static final double energyNeededPerSmelt = 1000;
ItemStack itemStackInOld = null;
boolean smeltInProcess = false;
double energyNeeded = 0;
double energyCounter = 0;
public ElectricalFurnaceProcess(ElectricalFurnaceElement furnace) {
this.furnace = furnace;
this.inventory = (TransparentNodeElementInventory) furnace.getInventory();
}
@Override
public void process(double time) {
ItemStack itemStack = inventory.getStackInSlot(furnace.thermalIsolatorSlotId);
if (itemStack == null) {
furnace.descriptor.refreshTo(furnace.thermalLoad, 1);
} else {
ThermalIsolatorElement element = ((GenericItemUsingDamage<ThermalIsolatorElement>) itemStack.getItem()).getDescriptor(itemStack);
furnace.descriptor.refreshTo(furnace.thermalLoad, element.conductionFactor);
}
ItemStack itemStackIn = inventory.getStackInSlot(ElectricalFurnaceElement.inSlotId);
ItemStack itemStackOut = inventory.getStackInSlot(ElectricalFurnaceElement.outSlotId);
if (itemStackInOld != itemStackIn || (!smeltCan()) || !smeltInProcess) {
smeltInit();
itemStackInOld = itemStackIn;
}
if (smeltInProcess) {
energyCounter += getPower() * time;
if (energyCounter > energyNeeded) {
energyCounter -= energyNeeded;
smeltItem();
smeltInit();
}
}
if (!smeltInProcess) {
furnace.smeltResistor.highImpedance();
} else {
double T = Math.abs(furnace.thermalLoad.Tc) + 1;
double P = furnace.descriptor.PfT.getValue(T);
furnace.smeltResistor.setR(T / P);
}
if (furnace.autoShutDown) {
if (smeltInProcess) {
furnace.setPowerOn(true);
} else {
furnace.setPowerOn(false);
}
}
int i = 0;
i++;
//Utils.println("FT : " + furnace.thermalLoad.Tc);
}
double getPower() {
return furnace.smeltResistor.getP();
}
public void smeltInit() {
smeltInProcess = smeltCan();
if (!smeltInProcess) {
smeltInProcess = false;
energyNeeded = 1.0;
energyCounter = 0.0;
} else {
smeltInProcess = true;
energyNeeded = energyNeededPerSmelt;
energyCounter = 0.0;
}
}
/**
* Returns true if the furnace can smelt an item, i.e. has a source item, destination stack isn't full, etc.
*/
private boolean smeltCan() {
if (inventory.getStackInSlot(ElectricalFurnaceElement.inSlotId) == null) {
return false;
} else {
ItemStack var1 = getSmeltResult();
if (var1 == null) return false;
if (inventory.getStackInSlot(ElectricalFurnaceElement.outSlotId) == null) return true;
if (!inventory.getStackInSlot(ElectricalFurnaceElement.outSlotId).isItemEqual(var1)) return false;
int result = inventory.getStackInSlot(ElectricalFurnaceElement.outSlotId).stackSize + var1.stackSize;
//energyNeeded = 1000.0;
return (result <= inventory.getInventoryStackLimit() && result <= var1.getMaxStackSize());
}
}
public ItemStack getSmeltResult() {
return FurnaceRecipes.smelting().getSmeltingResult(inventory.getStackInSlot(ElectricalFurnaceElement.inSlotId));
}
/**
* Turn one item from the furnace source stack into the appropriate smelted item in the furnace result stack
*/
public void smeltItem() {
if (this.smeltCan()) {
ItemStack var1 = getSmeltResult();
if (inventory.getStackInSlot(ElectricalFurnaceElement.outSlotId) == null) {
inventory.setInventorySlotContents(1, var1.copy());
} else if (inventory.getStackInSlot(ElectricalFurnaceElement.outSlotId).isItemEqual(var1)) {
inventory.decrStackSize(ElectricalFurnaceElement.outSlotId, -var1.stackSize);
}
/*--this.furnaceItemStacks[0].stackSize;
if (this.furnaceItemStacks[0].stackSize <= 0) {
this.furnaceItemStacks[0] = null;
}*/
inventory.decrStackSize(ElectricalFurnaceElement.inSlotId, 1);
}
}
public double processState() {
if (!smeltInProcess) return 0.0;
double state = energyCounter / energyNeeded;
if (state > 1.0) state = 1.0;
return state;
}
public double processStatePerSecond() {
if (!smeltInProcess) return 0;
double power = getPower() + 0.1;
double ret = power / (energyNeeded);
return ret;
}
}