package mekanism.common.content.boiler;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import mekanism.api.Coord4D;
import mekanism.api.IHeatTransfer;
import mekanism.api.MekanismConfig.general;
import mekanism.api.util.UnitDisplayUtils.TemperatureUnit;
import mekanism.common.content.tank.SynchronizedTankData.ValveData;
import mekanism.common.multiblock.SynchronizedData;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.fluids.FluidStack;
public class SynchronizedBoilerData extends SynchronizedData<SynchronizedBoilerData> implements IHeatTransfer
{
public static Map<String, Boolean> clientHotMap = new HashMap<String, Boolean>();
public static double CASING_INSULATION_COEFFICIENT = 1;
public static double CASING_INVERSE_CONDUCTION_COEFFICIENT = 1;
public static double BASE_BOIL_TEMP = 100-(TemperatureUnit.AMBIENT.zeroOffset-TemperatureUnit.CELSIUS.zeroOffset);
public FluidStack waterStored;
public FluidStack prevWater;
public FluidStack steamStored;
public FluidStack prevSteam;
public double lastEnvironmentLoss;
public int lastBoilRate;
public int lastMaxBoil;
public boolean clientHot;
public double temperature;
public double heatToAbsorb;
public double heatCapacity = 1000;
public int superheatingElements;
public int waterVolume;
public int steamVolume;
public ItemStack[] inventory = new ItemStack[2];
public Coord4D upperRenderLocation;
public Set<ValveData> valves = new HashSet<ValveData>();
/**
* @return how much heat energy is needed to convert one unit of water into steam
*/
public static double getHeatEnthalpy()
{
return general.maxEnergyPerSteam/general.energyPerHeat;
}
public double getHeatAvailable()
{
double heatAvailable = (temperature-BASE_BOIL_TEMP)*locations.size();
return Math.min(heatAvailable, superheatingElements*general.superheatingHeatTransfer);
}
public boolean needsRenderUpdate()
{
if((waterStored == null && prevWater != null) || (waterStored != null && prevWater == null))
{
return true;
}
if(waterStored != null && prevWater != null)
{
if((waterStored.getFluid() != prevWater.getFluid()) || (waterStored.amount != prevWater.amount))
{
return true;
}
}
if((steamStored == null && prevSteam != null) || (steamStored != null && prevSteam == null))
{
return true;
}
if(steamStored != null && prevSteam != null)
{
if((steamStored.getFluid() != prevSteam.getFluid()) || (steamStored.amount != prevSteam.amount))
{
return true;
}
}
return false;
}
@Override
public ItemStack[] getInventory()
{
return inventory;
}
@Override
public double getTemp()
{
return temperature;
}
@Override
public double getInverseConductionCoefficient()
{
return CASING_INVERSE_CONDUCTION_COEFFICIENT*locations.size();
}
@Override
public double getInsulationCoefficient(EnumFacing side)
{
return CASING_INSULATION_COEFFICIENT*locations.size();
}
@Override
public void transferHeatTo(double heat)
{
heatToAbsorb += heat;
}
@Override
public double[] simulateHeat()
{
double invConduction = IHeatTransfer.AIR_INVERSE_COEFFICIENT + (CASING_INSULATION_COEFFICIENT + CASING_INVERSE_CONDUCTION_COEFFICIENT)*locations.size();
double heatToTransfer = temperature / invConduction;
transferHeatTo(-heatToTransfer);
return new double[] {0, heatToTransfer};
}
@Override
public double applyTemperatureChange()
{
temperature += heatToAbsorb / locations.size();
heatToAbsorb = 0;
return temperature;
}
@Override
public boolean canConnectHeat(EnumFacing side)
{
return false;
}
@Override
public IHeatTransfer getAdjacent(EnumFacing side)
{
return null;
}
}