It seems the Heat Transfer equations I'm using are a bit stiff.
Adjust some paramaters some to improve how well we deal with this.
This commit is contained in:
parent
aa91fa87a6
commit
b8b49db104
8 changed files with 152 additions and 54 deletions
|
@ -33,6 +33,7 @@ import mekanism.common.Tier.FactoryTier;
|
|||
import mekanism.common.base.IFactory.RecipeType;
|
||||
import mekanism.common.base.IModule;
|
||||
import mekanism.common.content.boiler.BoilerCache;
|
||||
import mekanism.common.content.boiler.BoilerManager;
|
||||
import mekanism.common.content.boiler.SynchronizedBoilerData;
|
||||
import mekanism.common.content.matrix.MatrixCache;
|
||||
import mekanism.common.content.matrix.SynchronizedMatrixData;
|
||||
|
@ -162,7 +163,7 @@ public class Mekanism
|
|||
public static MultiblockManager<SynchronizedTankData> tankManager = new MultiblockManager<SynchronizedTankData>("dynamicTank", TankCache.class);
|
||||
public static MultiblockManager<SynchronizedMatrixData> matrixManager = new MultiblockManager<SynchronizedMatrixData>("energizedInductionMatrix", MatrixCache.class);
|
||||
public static MultiblockManager<SynchronizedTurbineData> turbineManager = new MultiblockManager<SynchronizedTurbineData>("industrialTurbine", TurbineCache.class);
|
||||
public static MultiblockManager<SynchronizedBoilerData> boilerManager = new MultiblockManager<SynchronizedBoilerData>("thermoelectricBoiler", BoilerCache.class);
|
||||
public static MultiblockManager<SynchronizedBoilerData> boilerManager = new BoilerManager("thermoelectricBoiler");
|
||||
|
||||
/** Mekanism creative tab */
|
||||
public static CreativeTabMekanism tabMekanism = new CreativeTabMekanism();
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package mekanism.common.content.boiler;
|
||||
|
||||
import mekanism.api.Coord4D;
|
||||
import mekanism.common.content.tank.SynchronizedTankData;
|
||||
import mekanism.common.multiblock.MultiblockCache;
|
||||
import mekanism.common.util.FluidContainerUtils.ContainerEditMode;
|
||||
|
@ -7,9 +8,12 @@ import mekanism.common.util.FluidContainerUtils.ContainerEditMode;
|
|||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTTagList;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraftforge.common.util.Constants.NBT;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
public class BoilerCache extends MultiblockCache<SynchronizedBoilerData>
|
||||
{
|
||||
public ItemStack[] inventory = new ItemStack[2];
|
||||
|
|
|
@ -0,0 +1,96 @@
|
|||
package mekanism.common.content.boiler;
|
||||
|
||||
import mekanism.api.Coord4D;
|
||||
import mekanism.common.multiblock.MultiblockCache;
|
||||
import mekanism.common.multiblock.MultiblockManager;
|
||||
import mekanism.common.tile.TileEntityBoiler;
|
||||
import mekanism.common.tile.TileEntityMultiblock;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Created by ben on 09/01/15.
|
||||
*/
|
||||
public class BoilerManager extends MultiblockManager<SynchronizedBoilerData>
|
||||
{
|
||||
public BoilerManager(String s)
|
||||
{
|
||||
super(s, BoilerCache.class);
|
||||
}
|
||||
|
||||
public void tickSelf(World world)
|
||||
{
|
||||
ArrayList<Integer> idsToKill = new ArrayList<Integer>();
|
||||
HashMap<Integer, HashSet<Coord4D>> tilesToKill = new HashMap<Integer, HashSet<Coord4D>>();
|
||||
|
||||
for(Map.Entry<Integer, MultiblockCache<SynchronizedBoilerData>> entry : inventories.entrySet())
|
||||
{
|
||||
int inventoryID = entry.getKey();
|
||||
|
||||
HashSet<TileEntityBoiler> boilers = new HashSet<TileEntityBoiler>();
|
||||
|
||||
for(Coord4D obj : entry.getValue().locations)
|
||||
{
|
||||
if(obj.dimensionId == world.provider.dimensionId && obj.exists(world))
|
||||
{
|
||||
TileEntity tileEntity = obj.getTileEntity(world);
|
||||
|
||||
if(!(tileEntity instanceof TileEntityMultiblock) || ((TileEntityMultiblock)tileEntity).getManager() != this || (getStructureId(((TileEntityMultiblock<?>)tileEntity)) != -1 && getStructureId(((TileEntityMultiblock)tileEntity)) != inventoryID))
|
||||
{
|
||||
if(!tilesToKill.containsKey(inventoryID))
|
||||
{
|
||||
tilesToKill.put(inventoryID, new HashSet<Coord4D>());
|
||||
}
|
||||
|
||||
tilesToKill.get(inventoryID).add(obj);
|
||||
}
|
||||
else if(tileEntity instanceof TileEntityBoiler)
|
||||
{
|
||||
((TileEntityBoiler)tileEntity).simulateHeat();
|
||||
boilers.add((TileEntityBoiler) tileEntity);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!boilers.isEmpty())
|
||||
{
|
||||
SynchronizedBoilerData data = boilers.iterator().next().getSynchronizedData();
|
||||
|
||||
if(data != null)
|
||||
{
|
||||
boilers.iterator().next().getSynchronizedData().applyTemperatureChange();
|
||||
}
|
||||
|
||||
for (TileEntityBoiler boiler : boilers)
|
||||
{
|
||||
boiler.applyTemperatureChange();
|
||||
}
|
||||
}
|
||||
|
||||
if(entry.getValue().locations.isEmpty())
|
||||
{
|
||||
idsToKill.add(inventoryID);
|
||||
}
|
||||
}
|
||||
|
||||
for(Map.Entry<Integer, HashSet<Coord4D>> entry : tilesToKill.entrySet())
|
||||
{
|
||||
for(Coord4D obj : entry.getValue())
|
||||
{
|
||||
inventories.get(entry.getKey()).locations.remove(obj);
|
||||
dataHandler.markDirty();
|
||||
}
|
||||
}
|
||||
|
||||
for(int inventoryID : idsToKill)
|
||||
{
|
||||
inventories.remove(inventoryID);
|
||||
dataHandler.markDirty();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -104,7 +104,7 @@ public class BoilerUpdateProtocol extends UpdateProtocol<SynchronizedBoilerData>
|
|||
data.location = obj;
|
||||
data.side = getSide(obj, origX+xmin, origX+xmax, origY+ymin, origY+ymax, origZ+zmin, origZ+zmax);
|
||||
|
||||
((SynchronizedBoilerData)structure).valves.add(data);
|
||||
structure.valves.add(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,7 +23,7 @@ public class SynchronizedBoilerData extends SynchronizedData<SynchronizedBoilerD
|
|||
|
||||
public double heatToAbsorb;
|
||||
|
||||
public double heatCapacity = 100;
|
||||
public double heatCapacity = 0.000001;
|
||||
|
||||
public double enthalpyOfVaporization = 10;
|
||||
|
||||
|
@ -48,7 +48,7 @@ public class SynchronizedBoilerData extends SynchronizedData<SynchronizedBoilerD
|
|||
@Override
|
||||
public double getInverseConductionCoefficient()
|
||||
{
|
||||
return 100;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -76,7 +76,7 @@ public class SynchronizedBoilerData extends SynchronizedData<SynchronizedBoilerD
|
|||
if(temperature < 100 + IHeatTransfer.AMBIENT_TEMP)
|
||||
{
|
||||
double temperatureDeficit = 100 + IHeatTransfer.AMBIENT_TEMP - temperature;
|
||||
double heatNeeded = temperatureDeficit * volume * heatCapacity * 16;
|
||||
double heatNeeded = temperatureDeficit * volume * heatCapacity * 16000;
|
||||
double heatProvided = Math.min(heatToAbsorb, heatNeeded);
|
||||
heatToAbsorb -= heatProvided;
|
||||
temperature += heatProvided / (volume * heatCapacity * 16);
|
||||
|
@ -97,7 +97,7 @@ public class SynchronizedBoilerData extends SynchronizedData<SynchronizedBoilerD
|
|||
|
||||
heatToAbsorb -= amountToBoil * enthalpyOfVaporization;
|
||||
}
|
||||
heatToAbsorb *= 0.2;
|
||||
heatToAbsorb *= 0.8;
|
||||
return temperature;
|
||||
}
|
||||
|
||||
|
|
|
@ -9,7 +9,6 @@ import mekanism.common.MekanismBlocks;
|
|||
import mekanism.common.content.tank.SynchronizedTankData.ValveData;
|
||||
import mekanism.common.multiblock.MultiblockCache;
|
||||
import mekanism.common.multiblock.MultiblockManager;
|
||||
import mekanism.common.multiblock.SynchronizedData;
|
||||
import mekanism.common.multiblock.UpdateProtocol;
|
||||
import mekanism.common.tile.TileEntityDynamicTank;
|
||||
import mekanism.common.tile.TileEntityDynamicValve;
|
||||
|
@ -74,14 +73,14 @@ public class TankUpdateProtocol extends UpdateProtocol<SynchronizedTankData>
|
|||
@Override
|
||||
protected void onFormed()
|
||||
{
|
||||
if(((SynchronizedTankData)structureFound).fluidStored != null)
|
||||
if(structureFound.fluidStored != null)
|
||||
{
|
||||
((SynchronizedTankData)structureFound).fluidStored.amount = Math.min(((SynchronizedTankData)structureFound).fluidStored.amount, structureFound.volume*FLUID_PER_TANK);
|
||||
structureFound.fluidStored.amount = Math.min(structureFound.fluidStored.amount, structureFound.volume*FLUID_PER_TANK);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStructureCreated(SynchronizedData<SynchronizedTankData> structure, int origX, int origY, int origZ, int xmin, int xmax, int ymin, int ymax, int zmin, int zmax)
|
||||
protected void onStructureCreated(SynchronizedTankData structure, int origX, int origY, int origZ, int xmin, int xmax, int ymin, int ymax, int zmin, int zmax)
|
||||
{
|
||||
for(Coord4D obj : structure.locations)
|
||||
{
|
||||
|
@ -91,7 +90,7 @@ public class TankUpdateProtocol extends UpdateProtocol<SynchronizedTankData>
|
|||
data.location = obj;
|
||||
data.side = getSide(obj, origX+xmin, origX+xmax, origY+ymin, origY+ymax, origZ+zmin, origZ+zmax);
|
||||
|
||||
((SynchronizedTankData)structure).valves.add(data);
|
||||
structure.valves.add(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -141,52 +141,57 @@ public class MultiblockManager<T extends SynchronizedData<T>>
|
|||
|
||||
for(MultiblockManager manager : managers)
|
||||
{
|
||||
ArrayList<Integer> idsToKill = new ArrayList<Integer>();
|
||||
HashMap<Integer, HashSet<Coord4D>> tilesToKill = new HashMap<Integer, HashSet<Coord4D>>();
|
||||
|
||||
for(Map.Entry<Integer, MultiblockCache> entry : ((Map<Integer, MultiblockCache>)manager.inventories).entrySet())
|
||||
manager.tickSelf(world);
|
||||
}
|
||||
}
|
||||
|
||||
public void tickSelf(World world)
|
||||
{
|
||||
ArrayList<Integer> idsToKill = new ArrayList<Integer>();
|
||||
HashMap<Integer, HashSet<Coord4D>> tilesToKill = new HashMap<Integer, HashSet<Coord4D>>();
|
||||
|
||||
for(Map.Entry<Integer, MultiblockCache<T>> entry : inventories.entrySet())
|
||||
{
|
||||
int inventoryID = entry.getKey();
|
||||
|
||||
for(Coord4D obj : entry.getValue().locations)
|
||||
{
|
||||
int inventoryID = entry.getKey();
|
||||
|
||||
for(Coord4D obj : (Set<Coord4D>)entry.getValue().locations)
|
||||
if(obj.dimensionId == world.provider.dimensionId && obj.exists(world))
|
||||
{
|
||||
if(obj.dimensionId == world.provider.dimensionId && obj.exists(world))
|
||||
TileEntity tileEntity = obj.getTileEntity(world);
|
||||
|
||||
if(!(tileEntity instanceof TileEntityMultiblock) || ((TileEntityMultiblock)tileEntity).getManager() != this || (getStructureId(((TileEntityMultiblock<?>)tileEntity)) != -1 && getStructureId(((TileEntityMultiblock)tileEntity)) != inventoryID))
|
||||
{
|
||||
TileEntity tileEntity = obj.getTileEntity(world);
|
||||
|
||||
if(!(tileEntity instanceof TileEntityMultiblock) || ((TileEntityMultiblock)tileEntity).getManager() != manager || (getStructureId(((TileEntityMultiblock<?>)tileEntity)) != -1 && getStructureId(((TileEntityMultiblock)tileEntity)) != inventoryID))
|
||||
if(!tilesToKill.containsKey(inventoryID))
|
||||
{
|
||||
if(!tilesToKill.containsKey(inventoryID))
|
||||
{
|
||||
tilesToKill.put(inventoryID, new HashSet<Coord4D>());
|
||||
}
|
||||
|
||||
tilesToKill.get(inventoryID).add(obj);
|
||||
tilesToKill.put(inventoryID, new HashSet<Coord4D>());
|
||||
}
|
||||
|
||||
tilesToKill.get(inventoryID).add(obj);
|
||||
}
|
||||
}
|
||||
|
||||
if(entry.getValue().locations.isEmpty())
|
||||
{
|
||||
idsToKill.add(inventoryID);
|
||||
}
|
||||
}
|
||||
|
||||
for(Map.Entry<Integer, HashSet<Coord4D>> entry : tilesToKill.entrySet())
|
||||
|
||||
if(entry.getValue().locations.isEmpty())
|
||||
{
|
||||
for(Coord4D obj : entry.getValue())
|
||||
{
|
||||
((Map<Integer, MultiblockCache>)manager.inventories).get(entry.getKey()).locations.remove(obj);
|
||||
manager.dataHandler.markDirty();
|
||||
}
|
||||
idsToKill.add(inventoryID);
|
||||
}
|
||||
|
||||
for(int inventoryID : idsToKill)
|
||||
}
|
||||
|
||||
for(Map.Entry<Integer, HashSet<Coord4D>> entry : tilesToKill.entrySet())
|
||||
{
|
||||
for(Coord4D obj : entry.getValue())
|
||||
{
|
||||
manager.inventories.remove(inventoryID);
|
||||
manager.dataHandler.markDirty();
|
||||
inventories.get(entry.getKey()).locations.remove(obj);
|
||||
dataHandler.markDirty();
|
||||
}
|
||||
}
|
||||
|
||||
for(int inventoryID : idsToKill)
|
||||
{
|
||||
inventories.remove(inventoryID);
|
||||
dataHandler.markDirty();
|
||||
}
|
||||
}
|
||||
|
||||
public static int getStructureId(TileEntityMultiblock<?> tile)
|
||||
|
|
|
@ -43,7 +43,7 @@ public class TileEntityBoiler extends TileEntityMultiblock<SynchronizedBoilerDat
|
|||
|
||||
public double temperature;
|
||||
public double heatToAbsorb;
|
||||
public double invHeatCapacity = 10;
|
||||
public double invHeatCapacity = 5;
|
||||
|
||||
public TileEntityBoiler()
|
||||
{
|
||||
|
@ -110,13 +110,6 @@ public class TileEntityBoiler extends TileEntityMultiblock<SynchronizedBoilerDat
|
|||
{
|
||||
manageInventory();
|
||||
}
|
||||
|
||||
simulateHeat();
|
||||
applyTemperatureChange();
|
||||
if(structure != null)
|
||||
{
|
||||
structure.applyTemperatureChange();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -461,13 +454,13 @@ public class TileEntityBoiler extends TileEntityMultiblock<SynchronizedBoilerDat
|
|||
@Override
|
||||
public double getInverseConductionCoefficient()
|
||||
{
|
||||
return 10;
|
||||
return 50;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getInsulationCoefficient(ForgeDirection side)
|
||||
{
|
||||
return 10;
|
||||
return 50;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
Loading…
Reference in a new issue