package mekanism.common.content.boiler; import java.util.HashSet; import java.util.Set; import mekanism.api.Coord4D; import mekanism.api.IHeatTransfer; import mekanism.common.multiblock.SynchronizedData; import mekanism.common.util.FluidContainerUtils.ContainerEditMode; import net.minecraft.item.ItemStack; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; public class SynchronizedBoilerData extends SynchronizedData<SynchronizedBoilerData> implements IHeatTransfer { public FluidStack waterStored; public FluidStack steamStored; public double temperature; public double heatToAbsorb; public double heatCapacity = 0.000001; public double enthalpyOfVaporization = 10; public ContainerEditMode editMode = ContainerEditMode.BOTH; public ItemStack[] inventory = new ItemStack[2]; public Set<ValveData> valves = new HashSet<ValveData>(); @Override public ItemStack[] getInventory() { return inventory; } @Override public double getTemp() { return temperature; } @Override public double getInverseConductionCoefficient() { return 1; } @Override public double getInsulationCoefficient(ForgeDirection side) { return 100; } @Override public void transferHeatTo(double heat) { heatToAbsorb = heat; } @Override public double[] simulateHeat() { return new double[0]; } @Override public double applyTemperatureChange() { if(temperature < 100 + IHeatTransfer.AMBIENT_TEMP) { double temperatureDeficit = 100 + IHeatTransfer.AMBIENT_TEMP - temperature; double heatNeeded = temperatureDeficit * volume * heatCapacity * 16000; double heatProvided = Math.min(heatToAbsorb, heatNeeded); heatToAbsorb -= heatProvided; temperature += heatProvided / (volume * heatCapacity * 16); } if(temperature >= 100 + IHeatTransfer.AMBIENT_TEMP && waterStored != null) { int amountToBoil = (int)Math.floor(heatToAbsorb / enthalpyOfVaporization); amountToBoil = Math.min(amountToBoil, waterStored.amount); waterStored.amount -= amountToBoil; if(steamStored == null) { steamStored = new FluidStack(FluidRegistry.getFluid("steam"), amountToBoil); } else { steamStored.amount += amountToBoil; } heatToAbsorb -= amountToBoil * enthalpyOfVaporization; } heatToAbsorb *= 0.8; return temperature; } @Override public boolean canConnectHeat(ForgeDirection side) { return false; } @Override public IHeatTransfer getAdjacent(ForgeDirection side) { return null; } public static class ValveData { public ForgeDirection side; public Coord4D location; public boolean serverFluid; @Override public int hashCode() { int code = 1; code = 31 * code + side.ordinal(); code = 31 * code + location.hashCode(); return code; } @Override public boolean equals(Object obj) { return obj instanceof ValveData && ((ValveData)obj).side == side && ((ValveData)obj).location.equals(location); } } }