More work on Fusion Reactor

This commit is contained in:
Ben Spiers 2014-07-15 00:13:20 +01:00
parent cb2188580e
commit bdde617489
10 changed files with 209 additions and 16 deletions

View file

@ -6,7 +6,7 @@ import net.minecraftforge.fluids.FluidTank;
public interface IFusionReactor
{
public void addTemperature(double energyAdded);
public void addTemperatureFromEnergyInput(double energyAdded);
public void simulate();
@ -19,4 +19,6 @@ public interface IFusionReactor
public GasTank getTritiumTank();
public GasTank getFuelTank();
public void formMultiblock();
}

View file

@ -120,6 +120,7 @@ import mekanism.common.tile.TileEntityEnrichmentChamber;
import mekanism.common.tile.TileEntityFactory;
import mekanism.common.tile.TileEntityFluidicPlenisher;
import mekanism.common.tile.TileEntityGasTank;
import mekanism.common.tile.TileEntityLaser;
import mekanism.common.tile.TileEntityLogisticalSorter;
import mekanism.common.tile.TileEntityMetallurgicInfuser;
import mekanism.common.tile.TileEntityObsidianTNT;
@ -147,6 +148,7 @@ import cpw.mods.fml.client.registry.ClientRegistry;
import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.network.simpleimpl.MessageContext;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@ -303,6 +305,8 @@ public class ClientProxy extends CommonProxy
ClientRegistry.registerTileEntity(TileEntityPRC.class, "PressurizedReactionChamber", new RenderPressurizedReactionChamber());
ClientRegistry.registerTileEntity(TileEntityPortableTank.class, "PortableTank", new RenderPortableTank());
ClientRegistry.registerTileEntity(TileEntityFluidicPlenisher.class, "FluidicPlenisher", new RenderFluidicPlenisher());
//TODO needs a model, I think.
GameRegistry.registerTileEntity(TileEntityLaser.class, "Laser");
}
@Override

View file

@ -74,7 +74,7 @@ public class MekanismRenderer
GasRegistry.getGas("hydrogen").setIcon(event.map.registerIcon("mekanism:LiquidHydrogen"));
GasRegistry.getGas("oxygen").setIcon(event.map.registerIcon("mekanism:LiquidOxygen"));
GasRegistry.getGas("water").setIcon(event.map.registerIcon("mekanism:WaterVapor"));
GasRegistry.getGas("chlorine").setIcon(event.map.registerIcon("mekanism:Chlorine"));
GasRegistry.getGas("chlorine").setIcon(event.map.registerIcon("mekanism:LiquidChlorine"));
GasRegistry.getGas("sulfurDioxideGas").setIcon(event.map.registerIcon("mekanism:LiquidSulfurDioxide"));
GasRegistry.getGas("sulfurTrioxideGas").setIcon(event.map.registerIcon("mekanism:LiquidSulfurTrioxide"));
GasRegistry.getGas("sulfuricAcid").setIcon(event.map.registerIcon("mekanism:LiquidSulfuricAcid"));
@ -84,7 +84,12 @@ public class MekanismRenderer
GasRegistry.getGas("ethene").setIcon(event.map.registerIcon("mekanism:Ethene"));
GasRegistry.getGas("brine").setIcon(event.map.registerIcon("mekanism:LiquidBrine"));
GasRegistry.getGas("sodium").setIcon(event.map.registerIcon("mekanism:LiquidSodium"));
GasRegistry.getGas("deuterium").setIcon(event.map.registerIcon("mekanism:LiquidDeuterium"));
GasRegistry.getGas("tritium").setIcon(event.map.registerIcon("mekanism:LiquidTritium"));
GasRegistry.getGas("fusionFuelDD").setIcon(event.map.registerIcon("mekanism:LiquidDD"));
GasRegistry.getGas("fusionFuelDT").setIcon(event.map.registerIcon("mekanism:liquidDT"));
GasRegistry.getGas("steam").setIcon(event.map.registerIcon("mekanism:LiquidSteam"));
for(Gas gas : GasRegistry.getRegisteredGasses())
{
if(gas instanceof OreGas)

View file

@ -64,6 +64,7 @@ import mekanism.common.tile.TileEntityEnrichmentChamber;
import mekanism.common.tile.TileEntityFactory;
import mekanism.common.tile.TileEntityFluidicPlenisher;
import mekanism.common.tile.TileEntityGasTank;
import mekanism.common.tile.TileEntityLaser;
import mekanism.common.tile.TileEntityLogisticalSorter;
import mekanism.common.tile.TileEntityMetallurgicInfuser;
import mekanism.common.tile.TileEntityObsidianTNT;
@ -136,6 +137,7 @@ public class CommonProxy
GameRegistry.registerTileEntity(TileEntityPRC.class, "PressurizedReactionChamber");
GameRegistry.registerTileEntity(TileEntityPortableTank.class, "PortableTank");
GameRegistry.registerTileEntity(TileEntityFluidicPlenisher.class, "FluidicPlenisher");
GameRegistry.registerTileEntity(TileEntityLaser.class, "Laser");
}
/**

View file

@ -105,6 +105,7 @@ import mekanism.common.tile.TileEntityBoundingBlock;
import mekanism.common.tile.TileEntityCardboardBox;
import mekanism.common.tile.TileEntityElectricBlock;
import mekanism.common.tile.TileEntityEnergizedSmelter;
import mekanism.common.tile.TileEntityLaser;
import mekanism.common.tile.TileEntitySalinationTank;
import mekanism.common.tile.TileEntitySalinationValve;
import mekanism.common.transporter.TransporterManager;
@ -1335,6 +1336,11 @@ public class Mekanism
GasRegistry.register(new Gas("ethene").registerFluid());
GasRegistry.register(new Gas("sodium").registerFluid());
GasRegistry.register(new Gas("brine").registerFluid());
GasRegistry.register(new Gas("deuterium")).registerFluid();
GasRegistry.register(new Gas("tritium")).registerFluid();
GasRegistry.register(new Gas("fusionFuelDD")).registerFluid();
GasRegistry.register(new Gas("fusionFuelDT")).registerFluid();
GasRegistry.register(new Gas("steam")).registerFluid();
for(Resource resource : Resource.values())
{

View file

@ -180,19 +180,14 @@ public class BlockMachine extends BlockContainer implements ISpecialBounds, IPer
}
else if(this == Mekanism.MachineBlock2)
{
icons[2][0] = register.registerIcon("mekanism:ChemicalInjectionChamberFrontOff");
icons[2][1] = register.registerIcon("mekanism:ChemicalInjectionChamberFrontOn");
icons[2][2] = register.registerIcon("mekanism:SteelCasing");
icons[3][0] = register.registerIcon("mekanism:ChemicalInjectionChamberFrontOff");
icons[3][1] = register.registerIcon("mekanism:ChemicalInjectionChamberFrontOn");
icons[3][2] = register.registerIcon("mekanism:SteelCasing");
icons[5][0] = register.registerIcon("mekanism:PrecisionSawmillFrontOff");
icons[5][1] = register.registerIcon("mekanism:PrecisionSawmillFrontOn");
icons[5][2] = register.registerIcon("mekanism:SteelCasing");
icons[9][0] = register.registerIcon("mekanism:SteelBlock");
icons[9][1] = register.registerIcon("mekanism:SeismicVibrator");
icons[13][0] = register.registerIcon("Mekanism:SteelCasing");
icons[13][1] = register.registerIcon("Mekanism:Laser");
icons[13][0] = register.registerIcon("mekanism:SteelCasing");
icons[13][1] = register.registerIcon("mekanism:Laser");
}
}

View file

@ -6,17 +6,25 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
import mekanism.api.Coord4D;
import mekanism.api.gas.GasRegistry;
import mekanism.api.gas.GasStack;
import mekanism.api.gas.GasTank;
import mekanism.api.lasers.ILaserReceptor;
import mekanism.api.reactor.IFusionReactor;
import mekanism.api.reactor.INeutronCapture;
import mekanism.api.reactor.IReactorBlock;
import mekanism.common.Mekanism;
import mekanism.generators.common.tile.reactor.TileEntityReactorController;
import net.minecraft.block.Block;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.FluidTank;
import static java.lang.Math.exp;
import static java.lang.Math.min;
import static java.lang.Math.max;
@ -43,9 +51,9 @@ public class FusionReactor implements IFusionReactor
public static double burnRatio = 1;
public static double tempPerFuel = 5*10^6;
public int injectionRate;
public int injectionRate = 0;
public static double coolingCoefficient = 0.2;
public static double coolingCoefficient = 0.1;
public static double waterRatio = 10^-14;
public static double inverseHeatCapacity = 1;
@ -53,8 +61,15 @@ public class FusionReactor implements IFusionReactor
public boolean burning = false;
public boolean hasHohlraum = false;
public boolean formed = false;
public FusionReactor(TileEntityReactorController c)
{
controller = c;
}
@Override
public void addTemperature(double energyAdded)
public void addTemperatureFromEnergyInput(double energyAdded)
{
temperature += energyAdded * inverseHeatCapacity;
}
@ -78,6 +93,8 @@ public class FusionReactor implements IFusionReactor
}
boilWater();
ambientLoss();
if(temperature > 0)
Mekanism.logger.info("Reactor temperature: " + (int)temperature);
}
public void vaporiseHohlraum()
@ -128,6 +145,10 @@ public class FusionReactor implements IFusionReactor
public void ambientLoss()
{
temperature -= coolingCoefficient*temperature;
if(temperature < 1E-6)
{
temperature = 0;
}
}
@Override
@ -159,4 +180,130 @@ public class FusionReactor implements IFusionReactor
{
return fuelTank;
}
public void formMultiblock()
{
Coord4D controllerPosition = Coord4D.get(controller);
Coord4D centreOfReactor = controllerPosition.getFromSide(ForgeDirection.DOWN, 2);
Mekanism.logger.info("Centre at " + centreOfReactor.toString());
if(!createFrame(centreOfReactor))
{
for(IReactorBlock block: reactorBlocks)
{
block.setReactor(null);
}
reactorBlocks.clear();
return;
}
Mekanism.logger.info("Frame valid");
if(!addSides(centreOfReactor))
{
for(IReactorBlock block: reactorBlocks)
{
block.setReactor(null);
}
reactorBlocks.clear();
neutronCaptors.clear();
return;
}
Mekanism.logger.info("Side Blocks Valid");
if(!centreIsClear(centreOfReactor))
{
for(IReactorBlock block: reactorBlocks)
{
block.setReactor(null);
}
reactorBlocks.clear();
neutronCaptors.clear();
return;
}
Mekanism.logger.info("Centre is clear");
formed = true;
}
public boolean createFrame(Coord4D centre)
{
int[][] positions = new int[][] {
{+2, +2, +0}, {+2, +1, +1}, {+2, +0, +2}, {+2, -1, +1}, {+2, -2, +0}, {+2, -1, -1}, {+2, +0, -2}, {+2, +1, -1},
{+1, +2, +1}, {+1, +1, +2}, {+1, -1, +2}, {+1, -2, +1}, {+1, -2, -1}, {+1, -1, -2}, {+1, +1, -2}, {+1, +2, -1},
{+0, +2, +2}, {+0, -2, +2}, {+0, -2, -2}, {+0, +2, -2},
{-1, +2, +1}, {-1, +1, +2}, {-1, -1, +2}, {-1, -2, +1}, {-1, -2, -1}, {-1, -1, -2}, {-1, +1, -2}, {-1, +2, -1},
{-2, +2, +0}, {-2, +1, +1}, {-2, +0, +2}, {-2, -1, +1}, {-2, -2, +0}, {-2, -1, -1}, {-2, +0, -2}, {-2, +1, -1},
};
for(int[] coords : positions)
{
TileEntity tile = centre.clone().translate(coords[0], coords[1], coords[2]).getTileEntity(controller.getWorldObj());
if(tile instanceof IReactorBlock && ((IReactorBlock)tile).isFrame())
{
reactorBlocks.add((IReactorBlock)tile);
((IReactorBlock)tile).setReactor(this);
}
else {
return false;
}
}
return true;
}
public boolean addSides(Coord4D centre)
{
int[][] positions = new int[][] {
{+2, +0, +0}, {+2, +1, +0}, {+2, +0, +1}, {+2, -1, +0}, {+2, +0, -1}, //EAST
{-2, +0, +0}, {-2, +1, +0}, {-2, +0, +1}, {-2, -1, +0}, {-2, +0, -1}, //WEST
{+0, +2, +0}, {+1, +2, +0}, {+0, +2, +1}, {-1, +2, +0}, {+0, +2, -1}, //TOP
{+0, -2, +0}, {+1, -2, +0}, {+0, -2, +1}, {-1, -2, +0}, {+0, -2, -1}, //BOTTOM
{+0, +0, +2}, {+1, +0, +2}, {+0, +1, +2}, {-1, +0, +2}, {+0, -1, +2}, //SOUTH
{+0, +0, +2}, {+1, +0, +2}, {+0, +1, +2}, {-1, +0, +2}, {+0, -1, +2}, //NORTH
};
for(int[] coords : positions)
{
TileEntity tile = centre.clone().translate(coords[0], coords[1], coords[2]).getTileEntity(controller.getWorldObj());
if(tile instanceof ILaserReceptor && !(coords[1] == 0 && (coords[0] == 0 || coords[2] == 0)))
{
return false;
}
if(tile instanceof IReactorBlock)
{
reactorBlocks.add((IReactorBlock)tile);
((IReactorBlock)tile).setReactor(this);
if(tile instanceof INeutronCapture)
{
neutronCaptors.add((INeutronCapture)tile);
}
}
else {
return false;
}
}
return true;
}
public boolean centreIsClear(Coord4D centre)
{
for(int x = -1; x <= 1; x++)
{
for(int y = -1; x <= 1; x++)
{
for(int z = -1; x <= 1; x++)
{
Block tile = centre.clone().translate(x, y, z).getBlock(controller.getWorldObj());
if(!tile.isAir(controller.getWorldObj(), x, y, z))
{
return false;
}
}
}
}
return true;
}
}

View file

@ -129,6 +129,17 @@ public class BlockReactor extends BlockContainer
return i;
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer entityplayer, int facing, float playerX, float playerY, float playerZ)
{
TileEntity tile = world.getTileEntity(x, y, z);
if(tile instanceof TileEntityReactorController)
{
((TileEntityReactorController)tile).formMultiblock();
}
return true;
}
@Override
@SideOnly(Side.CLIENT)
public void getSubBlocks(Item i, CreativeTabs creativetabs, List list)

View file

@ -1,5 +1,8 @@
package mekanism.generators.common.tile.reactor;
import mekanism.common.Mekanism;
import mekanism.generators.common.FusionReactor;
public class TileEntityReactorController extends TileEntityReactorBlock
{
@Override
@ -11,4 +14,23 @@ public class TileEntityReactorController extends TileEntityReactorBlock
public void radiateNeutrons(int neutrons)
{
}
public void formMultiblock()
{
if(getReactor() == null)
{
setReactor(new FusionReactor(this));
}
Mekanism.logger.info("Attempting to form multiblock");
getReactor().formMultiblock();
}
@Override
public void updateEntity()
{
if(getReactor() != null && !worldObj.isRemote)
{
getReactor().simulate();
}
}
}

View file

@ -7,8 +7,6 @@ import net.minecraftforge.common.util.ForgeDirection;
public class TileEntityReactorLaserFocusMatrix extends TileEntityReactorBlock implements ILaserReceptor
{
public IFusionReactor fusionReactor;
@Override
public boolean isFrame()
{
@ -18,7 +16,8 @@ public class TileEntityReactorLaserFocusMatrix extends TileEntityReactorBlock im
@Override
public void receiveLaserEnergy(double energy, ForgeDirection side)
{
fusionReactor.addTemperature(energy);
if(getReactor() != null)
getReactor().addTemperatureFromEnergyInput(energy);
}
@Override