mirror of
https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git
synced 2026-01-25 10:32:49 +00:00
119 lines
3.6 KiB
Java
119 lines
3.6 KiB
Java
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.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.List;
|
|
|
|
public class PileNeutronHandler {
|
|
|
|
public static int range = 5;
|
|
|
|
public static class PileNeutronNode extends NeutronNode {
|
|
|
|
public PileNeutronNode(TileEntityPileBase tile) {
|
|
super(tile, NeutronStream.NeutronType.PILE);
|
|
}
|
|
|
|
}
|
|
|
|
public static PileNeutronNode makeNode(TileEntityPileBase tile) {
|
|
BlockPos pos = new BlockPos(tile);
|
|
PileNeutronNode node = (PileNeutronNode) NeutronNodeWorld.getNode(tile.getWorldObj(), pos);
|
|
return node != null ? node : 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, double flux) {
|
|
super(origin, vector, flux, 0D, NeutronType.PILE);
|
|
}
|
|
|
|
@SuppressWarnings("unchecked")
|
|
@Override
|
|
public void runStreamInteraction(World worldObj) {
|
|
|
|
TileEntityPileBase originTE = (TileEntityPileBase) origin.tile;
|
|
BlockPos pos = new BlockPos(originTE);
|
|
|
|
for(float i = 1; i <= range; i += 0.5F) {
|
|
|
|
BlockPos nodePos = 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)
|
|
);
|
|
|
|
if(nodePos.equals(pos))
|
|
continue; // don't interact with itself!
|
|
|
|
pos.mutate(nodePos.getX(), nodePos.getY(), nodePos.getZ());
|
|
|
|
TileEntity tile;
|
|
|
|
NeutronNode node = NeutronNodeWorld.getNode(worldObj, nodePos);
|
|
if(node != null && node instanceof PileNeutronNode) {
|
|
tile = node.tile;
|
|
} else {
|
|
tile = blockPosToTE(worldObj, nodePos);
|
|
if(tile == null) return;
|
|
|
|
if(tile instanceof TileEntityPileBase) {
|
|
NeutronNodeWorld.addNode(worldObj, new PileNeutronNode((TileEntityPileBase) tile));
|
|
}
|
|
}
|
|
|
|
Block block = tile.getBlockType();
|
|
int meta = tile.getBlockMetadata();
|
|
if(!(tile instanceof TileEntityPileBase)) {
|
|
|
|
// 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;
|
|
|
|
if(block == ModBlocks.block_graphite_rod && (meta & 8) == 0)
|
|
return;
|
|
}
|
|
|
|
if(tile instanceof IPileNeutronReceiver) {
|
|
|
|
IPileNeutronReceiver rec = (IPileNeutronReceiver) tile;
|
|
rec.receiveNeutrons((int) Math.floor(fluxQuantity));
|
|
|
|
if(block != ModBlocks.block_graphite_detector || (meta & 8) == 0)
|
|
return;
|
|
}
|
|
|
|
int x = (int) (nodePos.getX() + 0.5);
|
|
int y = (int) (nodePos.getY() + 0.5);
|
|
int z = (int) (nodePos.getZ() + 0.5);
|
|
List<EntityLivingBase> 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));
|
|
}
|
|
}
|
|
}
|
|
}
|