From 931bbb3d8c30faf48b026e751ddcf910ebe71a6a Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Mon, 2 Sep 2024 20:21:12 -0500 Subject: [PATCH] oh my fucking god --- .../handler/neutron/PileNeutronHandler.java | 118 +++++++++++++++++- .../handler/neutron/RBMKNeutronHandler.java | 6 +- .../machine/pile/TileEntityPileBase.java | 115 +++++------------ .../pile/TileEntityPileBreedingFuel.java | 2 +- .../machine/pile/TileEntityPileFuel.java | 2 +- .../machine/pile/TileEntityPileSource.java | 2 +- 6 files changed, 158 insertions(+), 87 deletions(-) diff --git a/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java index 9d9d88558..48377590e 100644 --- a/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java +++ b/src/main/java/com/hbm/handler/neutron/PileNeutronHandler.java @@ -1,6 +1,16 @@ package com.hbm.handler.neutron; +import api.hbm.block.IPileNeutronReceiver; +import com.hbm.blocks.ModBlocks; import com.hbm.tileentity.machine.pile.TileEntityPileBase; +import com.hbm.tileentity.machine.rbmk.TileEntityRBMKBase; +import com.hbm.util.ContaminationUtil; +import com.hbm.util.fauxpointtwelve.BlockPos; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.Vec3; import net.minecraft.world.World; import java.util.ArrayList; @@ -9,14 +19,110 @@ import java.util.Map; public class PileNeutronHandler { + public static int range = 5; + public static class PileNeutronNode extends NeutronNode { public PileNeutronNode(TileEntityPileBase tile) { - super(tile, NeutronStream.NeutronType.RBMK); + super(tile, NeutronStream.NeutronType.PILE); } } + public static PileNeutronNode makeNode(TileEntityPileBase tile) { + BlockPos pos = new BlockPos(tile); + if (NeutronNodeWorld.nodeCache.containsKey(pos)) + return (PileNeutronNode) NeutronNodeWorld.getNode(pos); + return new PileNeutronNode(tile); + } + + private static TileEntity blockPosToTE(World worldObj, BlockPos pos) { + return worldObj.getTileEntity(pos.getX(), pos.getY(), pos.getZ()); + } + + public static class PileNeutronStream extends NeutronStream { + + public PileNeutronStream(NeutronNode origin, Vec3 vector) { + super(origin, vector); + } + + public PileNeutronStream(NeutronNode origin, Vec3 vector, double flux) { + super(origin, vector, flux, 0D, NeutronType.PILE); + } + + @Override + public void runStreamInteraction(World worldObj) { + + //Random rand = origin.tile.getWorldObj().rand; + //Vec3 vec = Vec3.createVectorHelper(1, 0, 0); + //vec.rotateAroundZ((float)(rand.nextDouble() * Math.PI * 2D)); + //vec.rotateAroundY((float)(rand.nextDouble() * Math.PI * 2D)); + //vec.rotateAroundX((float)(rand.nextDouble() * Math.PI * 2D)); + + TileEntityPileBase originTE = (TileEntityPileBase) origin.tile; + BlockPos pos = new BlockPos(originTE); + + for(float i = 1; i <= range; i += 0.5F) { + + BlockPos node = new BlockPos( + (int)Math.floor(pos.getX() + 0.5 + vector.xCoord * i), + (int)Math.floor(pos.getY() + 0.5 + vector.yCoord * i), + (int)Math.floor(pos.getZ() + 0.5 + vector.zCoord * i) + ); + + TileEntity tile; + + if (NeutronNodeWorld.nodeCache.containsKey(node)) + tile = NeutronNodeWorld.nodeCache.get(node).tile; + else { + tile = blockPosToTE(worldObj, node); + if (tile == null) + return; // Doesn't exist anymore! + if (tile instanceof TileEntityPileBase) + NeutronNodeWorld.addNode(new PileNeutronNode((TileEntityPileBase) tile)); + } + + TileEntityPileBase te = (TileEntityPileBase) tile; + Block block = te.getBlockType(); + + + // Return when a boron block is hit + if(block == ModBlocks.block_boron) + return; + + else if(block == ModBlocks.concrete || + block == ModBlocks.concrete_smooth || + block == ModBlocks.concrete_asbestos || + block == ModBlocks.concrete_colored || + block == ModBlocks.brick_concrete) + fluxQuantity *= 0.25; + + int meta = te.getBlockMetadata(); + + if(block == ModBlocks.block_graphite_rod && (meta & 8) == 0) + return; + + if(te instanceof IPileNeutronReceiver) { + + IPileNeutronReceiver rec = (IPileNeutronReceiver) te; + rec.receiveNeutrons((int) fluxQuantity); + + if(block != ModBlocks.block_graphite_detector || (meta & 8) == 0) + return; + } + + int x = (int) (node.getX() + 0.5); + int y = (int) (node.getY() + 0.5); + int z = (int) (node.getZ() + 0.5); + List entities = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(x, y, z, x, y, z)); + + if(entities != null) + for(EntityLivingBase e : entities) + ContaminationUtil.contaminate(e, ContaminationUtil.HazardType.RADIATION, ContaminationUtil.ContaminationType.CREATIVE, (float) (fluxQuantity / 4D)); + } + } + } + // The big one!! Runs all interactions for neutrons. public static void runAllInteractions() { @@ -40,5 +146,15 @@ public class PileNeutronHandler { } world.getValue().removeAllStreams(); } + + for (Map.Entry world : NeutronNodeWorld.streamWorlds.entrySet()) { + + for (NeutronStream stream : world.getValue().streams) { + if (stream.type == NeutronStream.NeutronType.PILE) + stream.runStreamInteraction(world.getKey()); + } + world.getValue().removeAllStreamsOfType(NeutronStream.NeutronType.PILE); + } + } } diff --git a/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java b/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java index 88fab103a..d02c17629 100644 --- a/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java +++ b/src/main/java/com/hbm/handler/neutron/RBMKNeutronHandler.java @@ -410,8 +410,10 @@ public class RBMKNeutronHandler { ticks = 0; List toRemove = new ArrayList<>(); for(NeutronNode cachedNode : NeutronNodeWorld.nodeCache.values()) { - RBMKNeutronNode node = (RBMKNeutronNode) cachedNode; - toRemove.addAll(node.checkNode()); + if (cachedNode.type == NeutronStream.NeutronType.RBMK) { + RBMKNeutronNode node = (RBMKNeutronNode) cachedNode; + toRemove.addAll(node.checkNode()); + } } for(BlockPos pos : toRemove) diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBase.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBase.java index 8c06fd658..b4745b170 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBase.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBase.java @@ -1,96 +1,49 @@ package com.hbm.tileentity.machine.pile; -import java.util.List; -import java.util.Random; +import com.hbm.handler.neutron.NeutronNodeWorld; +import com.hbm.handler.neutron.PileNeutronHandler; +import com.hbm.handler.neutron.PileNeutronHandler.PileNeutronStream; +import com.hbm.handler.neutron.PileNeutronHandler.PileNeutronNode; -import com.hbm.blocks.ModBlocks; -import com.hbm.util.ContaminationUtil; -import com.hbm.util.ContaminationUtil.ContaminationType; -import com.hbm.util.ContaminationUtil.HazardType; - -import api.hbm.block.IPileNeutronReceiver; -import net.minecraft.block.Block; -import net.minecraft.entity.EntityLivingBase; +import com.hbm.util.fauxpointtwelve.BlockPos; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.Vec3; public abstract class TileEntityPileBase extends TileEntity { @Override public abstract void updateEntity(); - - protected void castRay(int flux, int range) { - Random rand = worldObj.rand; - Vec3 vec = Vec3.createVectorHelper(1, 0, 0); - vec.rotateAroundZ((float)(rand.nextDouble() * Math.PI * 2D)); - vec.rotateAroundY((float)(rand.nextDouble() * Math.PI * 2D)); - vec.rotateAroundX((float)(rand.nextDouble() * Math.PI * 2D)); - - int prevX = xCoord; - int prevY = yCoord; - int prevZ = zCoord; - - for(float i = 1; i <= range; i += 0.5F) { - int x = (int)Math.floor(xCoord + 0.5 + vec.xCoord * i); - int y = (int)Math.floor(yCoord + 0.5 + vec.yCoord * i); - int z = (int)Math.floor(zCoord + 0.5 + vec.zCoord * i); - - if(x == prevX && y == prevY && z == prevZ) - continue; + @Override + public void invalidate() { + super.invalidate(); - prevX = x; - prevY = y; - prevZ = z; - - /*if(i == range || i == 1) { - NBTTagCompound data2 = new NBTTagCompound(); - data2.setString("type", "vanillaExt"); - data2.setString("mode", i == range ? "greendust" : - i == 1 ? "reddust" : "bluedust"); - data2.setDouble("posX", xCoord + 0.5 + vec.xCoord * i); - data2.setDouble("posY", yCoord + 0.5 + vec.yCoord * i); - data2.setDouble("posZ", zCoord + 0.5 + vec.zCoord * i); - MainRegistry.proxy.effectNT(data2); - }*/ - - Block b = worldObj.getBlock(x, y, z); - - if(b == ModBlocks.concrete || b == ModBlocks.concrete_smooth || b == ModBlocks.concrete_asbestos || b == ModBlocks.concrete_colored || b == ModBlocks.brick_concrete) - flux *= 0.25; - - if(b == ModBlocks.block_boron) - return; - - int meta = worldObj.getBlockMetadata(x, y, z); - - if(b == ModBlocks.block_graphite_rod && (meta & 8) == 0) - return; - - TileEntity te = worldObj.getTileEntity(x, y, z); - - if(te instanceof IPileNeutronReceiver) { - - //this part throttles neutron efficiency for reactions that are way too close, efficiency reaches 100% after 1.5 meters - //This entire time, this multiplier has been using the max distance, not the actual one, meaning efficency has always been 100% - //float mult = Math.min((float)i / 1.5F, 1F); - //int n = (int)(flux * mult); - - IPileNeutronReceiver rec = (IPileNeutronReceiver) te; - rec.receiveNeutrons(flux); - - if(b != ModBlocks.block_graphite_detector || (meta & 8) == 0) - return; - } - - List entities = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(x + 0.5, y + 0.5, z + 0.5, x + 0.5, y + 0.5, z + 0.5)); - - if(entities != null) - for(EntityLivingBase e : entities) { - - ContaminationUtil.contaminate(e, HazardType.RADIATION, ContaminationType.CREATIVE, flux / 4F); - } + NeutronNodeWorld.removeNode(new BlockPos(this)); + } + + protected void castRay(int flux) { + + BlockPos pos = new BlockPos(this); + + if (flux == 0) { + // simple way to remove the node from the cache when no flux is going into it! + NeutronNodeWorld.removeNode(pos); + return; } + + PileNeutronNode node = (PileNeutronNode) NeutronNodeWorld.getNode(pos); + + if(node == null) { + node = PileNeutronHandler.makeNode(this); + NeutronNodeWorld.addNode(node); + } + + Vec3 neutronVector = Vec3.createVectorHelper(1, 0, 0); + + neutronVector.rotateAroundX((float)(Math.PI * 2D * worldObj.rand.nextDouble())); + neutronVector.rotateAroundY((float)(Math.PI * 2D * worldObj.rand.nextDouble())); + neutronVector.rotateAroundZ((float)(Math.PI * 2D * worldObj.rand.nextDouble())); + + new PileNeutronStream(node, neutronVector, flux); } } diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBreedingFuel.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBreedingFuel.java index 1bbe94acb..c1f775e0e 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBreedingFuel.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileBreedingFuel.java @@ -35,7 +35,7 @@ public class TileEntityPileBreedingFuel extends TileEntityPileBase implements IP return; for(int i = 0; i < 2; i++) - this.castRay(1, 5); + this.castRay(1); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java index 288faa0ea..aedcb0082 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileFuel.java @@ -71,7 +71,7 @@ public class TileEntityPileFuel extends TileEntityPileBase implements IPileNeutr this.heat += reaction; for(int i = 0; i < 12; i++) - this.castRay((int) Math.max(reaction * 0.25, 1), 5); + this.castRay((int) Math.max(reaction * 0.25, 1)); return lastProgress; } diff --git a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileSource.java b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileSource.java index c297f9dfb..6b38b7875 100644 --- a/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileSource.java +++ b/src/main/java/com/hbm/tileentity/machine/pile/TileEntityPileSource.java @@ -12,7 +12,7 @@ public class TileEntityPileSource extends TileEntityPileBase { int n = this.getBlockType() == ModBlocks.block_graphite_source ? 1 : 2; for(int i = 0; i < 12; i++) { - this.castRay(n, 5); + this.castRay(n); } } }