Move standard simulation method into a Utils class.

This commit is contained in:
Ben Spiers 2014-12-22 19:38:03 +00:00
parent ab2a7cb6c7
commit 8a4aaff44a
4 changed files with 64 additions and 47 deletions

View file

@ -23,4 +23,6 @@ public interface IHeatTransfer
public double applyTemperatureChange(); public double applyTemperatureChange();
public boolean canConnectHeat(ForgeDirection side); public boolean canConnectHeat(ForgeDirection side);
public IHeatTransfer getAdjacent(ForgeDirection side);
} }

View file

@ -8,6 +8,7 @@ import mekanism.api.transmitters.IGridTransmitter;
import mekanism.api.transmitters.TransmissionType; import mekanism.api.transmitters.TransmissionType;
import mekanism.client.render.RenderPartTransmitter; import mekanism.client.render.RenderPartTransmitter;
import mekanism.common.HeatNetwork; import mekanism.common.HeatNetwork;
import mekanism.common.util.HeatUtils;
import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
@ -109,31 +110,7 @@ public class PartHeatTransmitter extends PartTransmitter<HeatNetwork> implements
@Override @Override
public double[] simulateHeat() public double[] simulateHeat()
{ {
double heatTransferred[] = new double[]{0,0}; return HeatUtils.simulate(this, Coord4D.get(tile()), world());
Coord4D pos = Coord4D.get(tile());
for(ForgeDirection side : ForgeDirection.VALID_DIRECTIONS)
{
if(connectionMapContainsSide(getAllCurrentConnections(), side))
{
TileEntity tileEntity = pos.getFromSide(side).getTileEntity(world());
if(tileEntity instanceof IHeatTransfer)
{
IHeatTransfer sink = (IHeatTransfer)tileEntity;
double invConduction = sink.getInverseConductionCoefficient() + getInverseConductionCoefficient();
double heatToTransfer = getTemp() / invConduction;
transferHeatTo(-heatToTransfer);
sink.transferHeatTo(heatToTransfer);
if(!(sink instanceof IGridTransmitter))
heatTransferred[0] += heatToTransfer;
continue;
}
}
//Transfer to air otherwise
double heatToTransfer = getTemp() / (IHeatTransfer.AIR_INVERSE_COEFFICIENT+getInsulationCoefficient(side)+getInverseConductionCoefficient());
transferHeatTo(-heatToTransfer);
heatTransferred[1] += heatToTransfer;
}
return heatTransferred;
} }
@Override @Override
@ -155,6 +132,20 @@ public class PartHeatTransmitter extends PartTransmitter<HeatNetwork> implements
return true; return true;
} }
@Override
public IHeatTransfer getAdjacent(ForgeDirection side)
{
if(connectionMapContainsSide(getAllCurrentConnections(), side))
{
TileEntity adj = Coord4D.get(tile()).getFromSide(side).getTileEntity(world());
if(adj instanceof IHeatTransfer)
{
return (IHeatTransfer)adj;
}
}
return null;
}
public static void registerIcons(IIconRegister register) public static void registerIcons(IIconRegister register)
{ {
heatIcons.registerCenterIcons(register, new String[] {"HeatTransmitter"}); heatIcons.registerCenterIcons(register, new String[] {"HeatTransmitter"});

View file

@ -1,5 +1,35 @@
package mekanism.common.util; package mekanism.common.util;
import mekanism.api.Coord4D;
import mekanism.api.IHeatTransfer;
import mekanism.api.transmitters.IGridTransmitter;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public class HeatUtils public class HeatUtils
{ {
public static double[] simulate(IHeatTransfer source, Coord4D pos, World world)
{
double heatTransferred[] = new double[]{0,0};
for(ForgeDirection side : ForgeDirection.VALID_DIRECTIONS)
{
IHeatTransfer sink = source.getAdjacent(side);
if(sink != null)
{
double invConduction = sink.getInverseConductionCoefficient() + source.getInverseConductionCoefficient();
double heatToTransfer = source.getTemp() / invConduction;
source.transferHeatTo(-heatToTransfer);
sink.transferHeatTo(heatToTransfer);
if(!(sink instanceof IGridTransmitter))
heatTransferred[0] += heatToTransfer;
continue;
}
//Transfer to air otherwise
double heatToTransfer = source.getTemp() / (IHeatTransfer.AIR_INVERSE_COEFFICIENT+source.getInsulationCoefficient(side)+source.getInverseConductionCoefficient());
source.transferHeatTo(-heatToTransfer);
heatTransferred[1] += heatToTransfer;
}
return heatTransferred;
}
} }

View file

@ -10,6 +10,7 @@ import mekanism.common.Mekanism;
import mekanism.common.base.ISustainedData; import mekanism.common.base.ISustainedData;
import mekanism.common.util.ChargeUtils; import mekanism.common.util.ChargeUtils;
import mekanism.common.util.FluidContainerUtils; import mekanism.common.util.FluidContainerUtils;
import mekanism.common.util.HeatUtils;
import mekanism.common.util.MekanismUtils; import mekanism.common.util.MekanismUtils;
import mekanism.common.util.PipeUtils; import mekanism.common.util.PipeUtils;
@ -404,31 +405,10 @@ public class TileEntityHeatGenerator extends TileEntityGenerator implements IFlu
@Override @Override
public double[] simulateHeat() public double[] simulateHeat()
{ {
double heatTransferred[] = new double[]{0,0};
Coord4D pos = Coord4D.get(this);
for(ForgeDirection side : ForgeDirection.VALID_DIRECTIONS)
{
TileEntity tileEntity = pos.getFromSide(side).getTileEntity(getWorldObj());
if(canConnectHeat(side) && tileEntity instanceof IHeatTransfer)
{
IHeatTransfer sink = (IHeatTransfer)tileEntity;
double invConduction = sink.getInverseConductionCoefficient() + getInverseConductionCoefficient();
double heatToTransfer = getTemp() / invConduction;
transferHeatTo(-heatToTransfer);
sink.transferHeatTo(heatToTransfer);
if(!(sink instanceof IGridTransmitter))
heatTransferred[0] += heatToTransfer;
continue;
}
//Transfer to air otherwise
double heatToTransfer = getTemp() / (IHeatTransfer.AIR_INVERSE_COEFFICIENT+getInverseConductionCoefficient());
transferHeatTo(-heatToTransfer);
heatTransferred[1] += heatToTransfer;
}
double workDone = getTemp()*thermalEfficiency; double workDone = getTemp()*thermalEfficiency;
transferHeatTo(-workDone); transferHeatTo(-workDone);
setEnergy(getEnergy() + workDone); setEnergy(getEnergy() + workDone);
return heatTransferred; return HeatUtils.simulate(this, Coord4D.get(this), worldObj);
} }
@Override @Override
@ -444,4 +424,18 @@ public class TileEntityHeatGenerator extends TileEntityGenerator implements IFlu
{ {
return side == ForgeDirection.DOWN; return side == ForgeDirection.DOWN;
} }
@Override
public IHeatTransfer getAdjacent(ForgeDirection side)
{
if(side == ForgeDirection.DOWN)
{
TileEntity adj = Coord4D.get(this).getFromSide(side).getTileEntity(worldObj);
if(adj instanceof IHeatTransfer)
{
return (IHeatTransfer)adj;
}
}
return null;
}
} }