diff --git a/src/main/java/com/recursive_pineapple/nuclear_horizons/Config.java b/src/main/java/com/recursive_pineapple/nuclear_horizons/Config.java index f857f74..931a2e0 100644 --- a/src/main/java/com/recursive_pineapple/nuclear_horizons/Config.java +++ b/src/main/java/com/recursive_pineapple/nuclear_horizons/Config.java @@ -6,7 +6,8 @@ public class Config { - public static int ROD_EU_MULTIPLIER = 1; + public static double ROD_EU_MULTIPLIER = 1; + public static double ROD_HU_MULTIPLIER = 1; public static double MOX_EU_COEFFICIENT = 4; public static void synchronizeConfiguration(File configFile) { diff --git a/src/main/java/com/recursive_pineapple/nuclear_horizons/reactors/blocks/ReactorChamber.java b/src/main/java/com/recursive_pineapple/nuclear_horizons/reactors/blocks/ReactorChamber.java index 947f2b7..14c9096 100644 --- a/src/main/java/com/recursive_pineapple/nuclear_horizons/reactors/blocks/ReactorChamber.java +++ b/src/main/java/com/recursive_pineapple/nuclear_horizons/reactors/blocks/ReactorChamber.java @@ -1,38 +1,35 @@ package com.recursive_pineapple.nuclear_horizons.reactors.blocks; +import com.gtnewhorizons.modularui.api.UIInfos; +import com.recursive_pineapple.nuclear_horizons.reactors.tile.TileReactorChamber; +import com.recursive_pineapple.nuclear_horizons.reactors.tile.TileReactorCore; import com.recursive_pineapple.nuclear_horizons.utils.DirectionUtil; import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; +import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -public class ReactorChamber extends Block { +public class ReactorChamber extends BlockContainer { - private IIcon icon; - public ReactorChamber() { super(Material.iron); setHardness(5.0f); setBlockName(BlockList.REACTOR_CHAMBER_NAME); setStepSound(soundTypeMetal); + setBlockTextureName("nuclear_horizons:reactor_chamber"); } @Override - public void registerBlockIcons(IIconRegister reg) { - this.icon = reg.registerIcon("nuclear_horizons:reactor_chamber"); - } - - @Override - public IIcon getIcon(int side, int meta) { - return icon; + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileReactorChamber(); } @Override @@ -42,6 +39,15 @@ public boolean canPlaceBlockAt(World worldIn, int x, int y, int z) { @Override public void onNeighborBlockChange(World worldIn, int x, int y, int z, Block neighbor) { + onBlocksChanged(worldIn, x, y, z); + } + + @Override + public void onBlockAdded(World worldIn, int x, int y, int z) { + onBlocksChanged(worldIn, x, y, z); + } + + private void onBlocksChanged(World worldIn, int x, int y, int z) { if(getAttachedReactors(worldIn, x, y, z) != 1) { worldIn.setBlock(x, y, z, Blocks.air); worldIn.spawnEntityInWorld(new EntityItem(worldIn, x + 0.5, y + 0.5, z + 0.5, new ItemStack(this, 1))); @@ -49,27 +55,34 @@ public void onNeighborBlockChange(World worldIn, int x, int y, int z, Block neig var worldclient = Minecraft.getMinecraft().theWorld; worldclient.playAuxSFX(2001, x, y, z, Block.getIdFromBlock(this) + (worldclient.getBlockMetadata(x, y, z) << 12)); + } else { + ((TileReactorChamber)worldIn.getTileEntity(x, y, z)).setReactor(null); + + for(var d : DirectionUtil.values()) { + if(d.getTileEntity(worldIn, x, y, z) instanceof TileReactorCore reactor) { + ((TileReactorChamber)worldIn.getTileEntity(x, y, z)).setReactor(reactor); + break; + } + } } } @Override public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, float subY, float subZ) { - for(var d : DirectionUtil.values()) { - if(d.getBlock(worldIn, x, y, z) == BlockList.REACTOR_CORE) { - return BlockList.REACTOR_CORE.onBlockActivated( - worldIn, - d.offsetX + x, d.offsetY + y, d.offsetZ + z, - player, - side, - 0f, 0f, 0f - ); + var reactor = ((TileReactorChamber)worldIn.getTileEntity(x, y, z)).getReactor(); + + if(reactor != null) { + if(!worldIn.isRemote) { + UIInfos.TILE_MODULAR_UI.open(player, worldIn, reactor.xCoord, reactor.yCoord, reactor.zCoord); } - } - return false; + return true; + } else { + return false; + } } - private int getAttachedReactors(World worldIn, int x, int y, int z) { + private static int getAttachedReactors(World worldIn, int x, int y, int z) { int reactorCount = 0; for(var d : DirectionUtil.values()) { diff --git a/src/main/java/com/recursive_pineapple/nuclear_horizons/reactors/components/adapters/FuelRodAdapter.java b/src/main/java/com/recursive_pineapple/nuclear_horizons/reactors/components/adapters/FuelRodAdapter.java index 842e643..2d13344 100644 --- a/src/main/java/com/recursive_pineapple/nuclear_horizons/reactors/components/adapters/FuelRodAdapter.java +++ b/src/main/java/com/recursive_pineapple/nuclear_horizons/reactors/components/adapters/FuelRodAdapter.java @@ -51,7 +51,7 @@ public void onHeatTick() { } int pulses = this.getPulseCount(); - int heat = (int) (fuelRod.getHeatMult(itemStack) * pulses * (pulses + 1)); + int heat = (int) (fuelRod.getHeatMult(itemStack) * pulses * (pulses + 1) * Config.ROD_HU_MULTIPLIER); if(fuelRod.isMox(itemStack) && reactor.isFluid() && (reactor.getHullHeat() / reactor.getMaxHullHeat()) >= 0.5) { heat *= 2; diff --git a/src/main/java/com/recursive_pineapple/nuclear_horizons/reactors/items/BasicFuelRodItem.java b/src/main/java/com/recursive_pineapple/nuclear_horizons/reactors/items/BasicFuelRodItem.java index 2209dca..ec01237 100644 --- a/src/main/java/com/recursive_pineapple/nuclear_horizons/reactors/items/BasicFuelRodItem.java +++ b/src/main/java/com/recursive_pineapple/nuclear_horizons/reactors/items/BasicFuelRodItem.java @@ -88,7 +88,7 @@ public void addInformation(ItemStack itemStack, EntityPlayer player, List 0; @@ -435,6 +438,8 @@ public void updateEntity() { if(this.tickCounter % REACTOR_STRUCTURE_CHECK_PERIOD == 0) { doStructureCheck(); } + + this.emitEnergy(); } } @@ -498,6 +503,88 @@ public void removeViewingPlayer(EntityPlayer player) { //#region Energy Logic + @Override + public byte getColorization() { + return -1; + } + + @Override + public byte setColorization(byte arg0) { + return -1; + } + + @Override + public long injectEnergyUnits(ForgeDirection arg0, long arg1, long arg2) { + return 0; + } + + @Override + public boolean inputEnergyFrom(ForgeDirection arg0) { + return false; + } + + @Override + public boolean outputsEnergyTo(ForgeDirection arg0) { + return true; + } + + private void emitEnergy() { + if(this.voltage == 0) this.voltage = 32; + + int availableAmps = this.storedEU / this.voltage; + + if(availableAmps > 0) { + long consumedAmps = emitEnergyToNetwork(this.voltage, availableAmps, this); + + for(var dir : DirectionUtil.values()) { + if((availableAmps - consumedAmps) <= 0) { + break; + } + + if(dir.getTileEntity(worldObj, xCoord, yCoord, zCoord) instanceof TileReactorChamber chamber) { + consumedAmps += emitEnergyToNetwork(this.voltage, availableAmps - consumedAmps, chamber); + } + } + + this.storedEU -= consumedAmps * this.voltage; + } + } + + private static long emitEnergyToNetwork(long voltage, long amperage, TileEntity emitter) { + long usedAmperes = 0; + + for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + if (usedAmperes > amperage) break; + + ForgeDirection oppositeSide = Objects.requireNonNull(side.getOpposite()); + TileEntity tTileEntity = emitter.getWorldObj().getTileEntity(emitter.xCoord + side.offsetX, emitter.yCoord + side.offsetY, emitter.zCoord + side.offsetZ); + if (tTileEntity instanceof PowerLogicHost host) { + + PowerLogic logic = host.getPowerLogic(oppositeSide); + if (logic == null || logic.isEnergyReceiver()) { + continue; + } + + usedAmperes += logic.injectEnergy(voltage, amperage - usedAmperes); + } else if (tTileEntity instanceof IEnergyConnected energyConnected) { + usedAmperes += energyConnected.injectEnergyUnits(oppositeSide, voltage, amperage - usedAmperes); + + } else if (tTileEntity instanceof ic2.api.energy.tile.IEnergySink sink) { + if (sink.acceptsEnergyFrom(emitter, oppositeSide)) { + while (amperage > usedAmperes && sink.getDemandedEnergy() > 0 + && sink.injectEnergy(oppositeSide, voltage, voltage) < voltage) usedAmperes++; + } + } else if (GregTech_API.mOutputRF && tTileEntity instanceof IEnergyReceiver receiver) { + final int rfOut = GT_Utility.safeInt(voltage * GregTech_API.mEUtoRF / 100); + if (receiver.receiveEnergy(oppositeSide, rfOut, true) == rfOut) { + receiver.receiveEnergy(oppositeSide, rfOut, false); + usedAmperes++; + } + } + } + return usedAmperes; + } + //#endregion //#region Inventory Logic @@ -643,8 +730,6 @@ private void doHeatTick() { } private void doEUTick() { - this.carryoverEU = this.storedEU; - this.storedEU = 0; this.addedEU = 0; for(int row = 0; row < ROW_COUNT; row++) { @@ -660,6 +745,10 @@ private void doEUTick() { reactorBlock.onEnergyTick(this); } + if(this.storedEU > this.maxStoredEU) { + this.storedEU = this.maxStoredEU; + } + int perTick = this.addedEU / 20; int voltageTier = (int) (Math.ceil(Math.log(perTick / 8) / Math.log(4))); @@ -817,6 +906,10 @@ private void doStructureCheck() { for(int relX = -2; relX < 3; relX++) { for(int relY = -2; relY < 3; relY++) { for(int relZ = -2; relZ < 3; relZ++) { + if(relX == 0 && relY == 0 && relZ == 0) { + continue; + } + int insideCubeCount = 0; if(isInsideCube(relX)) insideCubeCount++; @@ -855,6 +948,7 @@ private void doStructureCheck() { continue; } + // a face can be any IReactorBlock if(block.hasTileEntity(worldObj.getBlockMetadata(x, y, z))) { if(worldObj.getTileEntity(x, y, z) instanceof IReactorBlock reactorBlock) { reactorBlock.setReactor(this);