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 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.client.render.RenderPartTransmitter;
import mekanism.common.HeatNetwork;
import mekanism.common.util.HeatUtils;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.player.EntityPlayer;
@ -109,31 +110,7 @@ public class PartHeatTransmitter extends PartTransmitter<HeatNetwork> implements
@Override
public double[] simulateHeat()
{
double heatTransferred[] = new double[]{0,0};
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;
return HeatUtils.simulate(this, Coord4D.get(tile()), world());
}
@Override
@ -155,6 +132,20 @@ public class PartHeatTransmitter extends PartTransmitter<HeatNetwork> implements
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)
{
heatIcons.registerCenterIcons(register, new String[] {"HeatTransmitter"});

View file

@ -1,5 +1,35 @@
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 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.util.ChargeUtils;
import mekanism.common.util.FluidContainerUtils;
import mekanism.common.util.HeatUtils;
import mekanism.common.util.MekanismUtils;
import mekanism.common.util.PipeUtils;
@ -404,31 +405,10 @@ public class TileEntityHeatGenerator extends TileEntityGenerator implements IFlu
@Override
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;
transferHeatTo(-workDone);
setEnergy(getEnergy() + workDone);
return heatTransferred;
return HeatUtils.simulate(this, Coord4D.get(this), worldObj);
}
@Override
@ -444,4 +424,18 @@ public class TileEntityHeatGenerator extends TileEntityGenerator implements IFlu
{
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;
}
}