From bdde617489451651dc0a7e487f4b4597260eea2b Mon Sep 17 00:00:00 2001 From: Ben Spiers Date: Tue, 15 Jul 2014 00:13:20 +0100 Subject: [PATCH] More work on Fusion Reactor --- .../mekanism/api/reactor/IFusionReactor.java | 4 +- .../java/mekanism/client/ClientProxy.java | 4 + .../client/render/MekanismRenderer.java | 9 +- .../java/mekanism/common/CommonProxy.java | 2 + src/main/java/mekanism/common/Mekanism.java | 6 + .../mekanism/common/block/BlockMachine.java | 9 +- .../generators/common/FusionReactor.java | 153 +++++++++++++++++- .../generators/common/block/BlockReactor.java | 11 ++ .../reactor/TileEntityReactorController.java | 22 +++ .../TileEntityReactorLaserFocusMatrix.java | 5 +- 10 files changed, 209 insertions(+), 16 deletions(-) diff --git a/src/main/java/mekanism/api/reactor/IFusionReactor.java b/src/main/java/mekanism/api/reactor/IFusionReactor.java index 6172c6075..16d8125a3 100644 --- a/src/main/java/mekanism/api/reactor/IFusionReactor.java +++ b/src/main/java/mekanism/api/reactor/IFusionReactor.java @@ -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(); } diff --git a/src/main/java/mekanism/client/ClientProxy.java b/src/main/java/mekanism/client/ClientProxy.java index c80848efa..987c4f0d3 100644 --- a/src/main/java/mekanism/client/ClientProxy.java +++ b/src/main/java/mekanism/client/ClientProxy.java @@ -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 diff --git a/src/main/java/mekanism/client/render/MekanismRenderer.java b/src/main/java/mekanism/client/render/MekanismRenderer.java index e02bd410b..c82a99d1b 100644 --- a/src/main/java/mekanism/client/render/MekanismRenderer.java +++ b/src/main/java/mekanism/client/render/MekanismRenderer.java @@ -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) diff --git a/src/main/java/mekanism/common/CommonProxy.java b/src/main/java/mekanism/common/CommonProxy.java index d740ce3ac..731062624 100644 --- a/src/main/java/mekanism/common/CommonProxy.java +++ b/src/main/java/mekanism/common/CommonProxy.java @@ -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"); } /** diff --git a/src/main/java/mekanism/common/Mekanism.java b/src/main/java/mekanism/common/Mekanism.java index 958dd3bd3..52232833b 100644 --- a/src/main/java/mekanism/common/Mekanism.java +++ b/src/main/java/mekanism/common/Mekanism.java @@ -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()) { diff --git a/src/main/java/mekanism/common/block/BlockMachine.java b/src/main/java/mekanism/common/block/BlockMachine.java index 36091f6b8..b18ae4fc5 100644 --- a/src/main/java/mekanism/common/block/BlockMachine.java +++ b/src/main/java/mekanism/common/block/BlockMachine.java @@ -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"); } } diff --git a/src/main/java/mekanism/generators/common/FusionReactor.java b/src/main/java/mekanism/generators/common/FusionReactor.java index 7af256891..860b9adda 100644 --- a/src/main/java/mekanism/generators/common/FusionReactor.java +++ b/src/main/java/mekanism/generators/common/FusionReactor.java @@ -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; + } } diff --git a/src/main/java/mekanism/generators/common/block/BlockReactor.java b/src/main/java/mekanism/generators/common/block/BlockReactor.java index 71b486c7f..c8c768f65 100644 --- a/src/main/java/mekanism/generators/common/block/BlockReactor.java +++ b/src/main/java/mekanism/generators/common/block/BlockReactor.java @@ -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) diff --git a/src/main/java/mekanism/generators/common/tile/reactor/TileEntityReactorController.java b/src/main/java/mekanism/generators/common/tile/reactor/TileEntityReactorController.java index 32a98236a..c2419188a 100644 --- a/src/main/java/mekanism/generators/common/tile/reactor/TileEntityReactorController.java +++ b/src/main/java/mekanism/generators/common/tile/reactor/TileEntityReactorController.java @@ -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(); + } + } } diff --git a/src/main/java/mekanism/generators/common/tile/reactor/TileEntityReactorLaserFocusMatrix.java b/src/main/java/mekanism/generators/common/tile/reactor/TileEntityReactorLaserFocusMatrix.java index 61404a41c..8fd162d35 100644 --- a/src/main/java/mekanism/generators/common/tile/reactor/TileEntityReactorLaserFocusMatrix.java +++ b/src/main/java/mekanism/generators/common/tile/reactor/TileEntityReactorLaserFocusMatrix.java @@ -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