mirror of
https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git
synced 2026-01-25 10:32:49 +00:00
hopefully all fluid impls done outside of the rbmk stuff Also implemented copy pasting of molten metals, copying from anything that holds molten metal, and pasting into outlets for filters
290 lines
9.1 KiB
Java
290 lines
9.1 KiB
Java
package com.hbm.tileentity.machine;
|
|
|
|
import java.util.List;
|
|
|
|
import com.hbm.config.VersatileConfig;
|
|
import com.hbm.hazard.HazardRegistry;
|
|
import com.hbm.hazard.HazardSystem;
|
|
import com.hbm.interfaces.IFluidContainer;
|
|
import com.hbm.inventory.container.ContainerStorageDrum;
|
|
import com.hbm.inventory.fluid.FluidType;
|
|
import com.hbm.inventory.fluid.Fluids;
|
|
import com.hbm.inventory.fluid.tank.FluidTank;
|
|
import com.hbm.inventory.gui.GUIStorageDrum;
|
|
import com.hbm.items.ModItems;
|
|
import com.hbm.items.special.ItemWasteLong;
|
|
import com.hbm.items.special.ItemWasteShort;
|
|
import com.hbm.tileentity.IFluidCopiable;
|
|
import com.hbm.tileentity.IGUIProvider;
|
|
import com.hbm.tileentity.TileEntityMachineBase;
|
|
import com.hbm.util.ContaminationUtil;
|
|
import com.hbm.util.ContaminationUtil.ContaminationType;
|
|
import com.hbm.util.ContaminationUtil.HazardType;
|
|
|
|
import api.hbm.fluid.IFluidStandardSender;
|
|
import cpw.mods.fml.relauncher.Side;
|
|
import cpw.mods.fml.relauncher.SideOnly;
|
|
import net.minecraft.client.gui.GuiScreen;
|
|
import net.minecraft.entity.EntityLivingBase;
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.inventory.Container;
|
|
import net.minecraft.item.Item;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.util.AxisAlignedBB;
|
|
import net.minecraft.util.Vec3;
|
|
import net.minecraft.world.World;
|
|
|
|
public class TileEntityStorageDrum extends TileEntityMachineBase implements IFluidContainer, IFluidStandardSender, IGUIProvider, IFluidCopiable {
|
|
|
|
public FluidTank[] tanks;
|
|
private static final int[] slots_arr = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 };
|
|
public int age = 0;
|
|
|
|
public TileEntityStorageDrum() {
|
|
super(24);
|
|
tanks = new FluidTank[2];
|
|
tanks[0] = new FluidTank(Fluids.WASTEFLUID, 16000, 0);
|
|
tanks[1] = new FluidTank(Fluids.WASTEGAS, 16000, 1);
|
|
}
|
|
|
|
@Override
|
|
public String getName() {
|
|
return "container.storageDrum";
|
|
}
|
|
|
|
@Override
|
|
public void updateEntity() {
|
|
|
|
if(!worldObj.isRemote) {
|
|
|
|
float rad = 0;
|
|
|
|
int liquid = 0;
|
|
int gas = 0;
|
|
|
|
for(int i = 0; i < 24; i++) {
|
|
|
|
if(slots[i] != null) {
|
|
|
|
Item item = slots[i].getItem();
|
|
|
|
if(worldObj.getTotalWorldTime() % 20 == 0) {
|
|
rad += HazardSystem.getHazardLevelFromStack(slots[i], HazardRegistry.RADIATION);
|
|
}
|
|
|
|
int meta = slots[i].getItemDamage();
|
|
|
|
if(item == ModItems.nuclear_waste_long && worldObj.rand.nextInt(VersatileConfig.getLongDecayChance()) == 0) {
|
|
ItemWasteLong.WasteClass wasteClass = ItemWasteLong.WasteClass.values()[ItemWasteLong.rectify(meta)];
|
|
liquid += wasteClass.liquid;
|
|
gas += wasteClass.gas;
|
|
slots[i] = new ItemStack(ModItems.nuclear_waste_long_depleted, 1, meta);
|
|
}
|
|
|
|
if(item == ModItems.nuclear_waste_long_tiny && worldObj.rand.nextInt(VersatileConfig.getLongDecayChance() / 10) == 0) {
|
|
ItemWasteLong.WasteClass wasteClass = ItemWasteLong.WasteClass.values()[ItemWasteLong.rectify(meta)];
|
|
liquid += wasteClass.liquid / 10;
|
|
gas += wasteClass.gas / 10;
|
|
slots[i] = new ItemStack(ModItems.nuclear_waste_long_depleted_tiny, 1, meta);
|
|
}
|
|
|
|
if(item == ModItems.nuclear_waste_short && worldObj.rand.nextInt(VersatileConfig.getShortDecayChance()) == 0) {
|
|
ItemWasteShort.WasteClass wasteClass = ItemWasteShort.WasteClass.values()[ItemWasteLong.rectify(meta)];
|
|
liquid += wasteClass.liquid;
|
|
gas += wasteClass.gas;
|
|
slots[i] = new ItemStack(ModItems.nuclear_waste_short_depleted, 1, meta);
|
|
}
|
|
|
|
if(item == ModItems.nuclear_waste_short_tiny && worldObj.rand.nextInt(VersatileConfig.getShortDecayChance() / 10) == 0) {
|
|
ItemWasteShort.WasteClass wasteClass = ItemWasteShort.WasteClass.values()[ItemWasteLong.rectify(meta)];
|
|
liquid += wasteClass.liquid / 10;
|
|
gas += wasteClass.gas / 10;
|
|
slots[i] = new ItemStack(ModItems.nuclear_waste_short_depleted_tiny, 1, meta);
|
|
}
|
|
|
|
if(item == ModItems.ingot_au198 && worldObj.rand.nextInt(VersatileConfig.getShortDecayChance() / 20) == 0) {
|
|
slots[i] = new ItemStack(ModItems.ingot_mercury, 1, meta);
|
|
}
|
|
if(item == ModItems.nugget_au198 && worldObj.rand.nextInt(VersatileConfig.getShortDecayChance() / 100) == 0) {
|
|
slots[i] = new ItemStack(ModItems.nugget_mercury, 1, meta);
|
|
}
|
|
|
|
if(item == ModItems.ingot_pb209 && worldObj.rand.nextInt(VersatileConfig.getShortDecayChance() / 10) == 0) {
|
|
slots[i] = new ItemStack(ModItems.ingot_bismuth, 1, meta);
|
|
}
|
|
if(item == ModItems.nugget_pb209 && worldObj.rand.nextInt(VersatileConfig.getShortDecayChance() / 50) == 0) {
|
|
slots[i] = new ItemStack(ModItems.nugget_bismuth, 1, meta);
|
|
}
|
|
|
|
if(item == ModItems.powder_sr90 && worldObj.rand.nextInt(VersatileConfig.getShortDecayChance() / 10) == 0) {
|
|
slots[i] = new ItemStack(ModItems.powder_zirconium, 1, meta);
|
|
}
|
|
if(item == ModItems.nugget_sr90 && worldObj.rand.nextInt(VersatileConfig.getShortDecayChance() / 50) == 0) {
|
|
slots[i] = new ItemStack(ModItems.nugget_zirconium, 1, meta);
|
|
}
|
|
}
|
|
}
|
|
|
|
this.tanks[0].setFill(this.tanks[0].getFill() + liquid);
|
|
this.tanks[1].setFill(this.tanks[1].getFill() + gas);
|
|
|
|
for(int i = 0; i < 2; i++) {
|
|
|
|
int overflow = Math.max(this.tanks[i].getFill() - this.tanks[i].getMaxFill(), 0);
|
|
|
|
if(overflow > 0) {
|
|
this.tanks[i].setFill(this.tanks[i].getFill() - overflow);
|
|
this.tanks[i].getTankType().onFluidRelease(this, this.tanks[i], overflow);
|
|
}
|
|
}
|
|
|
|
age++;
|
|
|
|
if(age >= 20)
|
|
age -= 20;
|
|
|
|
this.sendFluidToAll(tanks[0], this);
|
|
this.sendFluidToAll(tanks[1], this);
|
|
|
|
tanks[0].updateTank(xCoord, yCoord, zCoord, worldObj.provider.dimensionId);
|
|
tanks[1].updateTank(xCoord, yCoord, zCoord, worldObj.provider.dimensionId);
|
|
|
|
if(rad > 0) {
|
|
radiate(worldObj, xCoord, yCoord, zCoord, rad);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void radiate(World world, int x, int y, int z, float rads) {
|
|
|
|
double range = 32D;
|
|
|
|
List<EntityLivingBase> entities = world.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(x + 0.5, y + 0.5, z + 0.5, x + 0.5, y + 0.5, z + 0.5).expand(range, range, range));
|
|
|
|
for(EntityLivingBase e : entities) {
|
|
|
|
Vec3 vec = Vec3.createVectorHelper(e.posX - (x + 0.5), (e.posY + e.getEyeHeight()) - (y + 0.5), e.posZ - (z + 0.5));
|
|
double len = vec.lengthVector();
|
|
vec = vec.normalize();
|
|
|
|
float res = 0;
|
|
|
|
for(int i = 1; i < len; i++) {
|
|
|
|
int ix = (int)Math.floor(x + 0.5 + vec.xCoord * i);
|
|
int iy = (int)Math.floor(y + 0.5 + vec.yCoord * i);
|
|
int iz = (int)Math.floor(z + 0.5 + vec.zCoord * i);
|
|
|
|
res += world.getBlock(ix, iy, iz).getExplosionResistance(null);
|
|
}
|
|
|
|
if(res < 1)
|
|
res = 1;
|
|
|
|
float eRads = rads;
|
|
eRads /= (float)res;
|
|
eRads /= (float)(len * len);
|
|
|
|
ContaminationUtil.contaminate(e, HazardType.RADIATION, ContaminationType.CREATIVE, eRads);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean isItemValidForSlot(int i, ItemStack itemStack) {
|
|
|
|
Item item = itemStack.getItem();
|
|
|
|
if(item == ModItems.nuclear_waste_long ||
|
|
item == ModItems.nuclear_waste_long_tiny ||
|
|
item == ModItems.nuclear_waste_short ||
|
|
item == ModItems.nuclear_waste_short_tiny ||
|
|
item == ModItems.ingot_au198)
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean canInsertItem(int i, ItemStack itemStack, int j) {
|
|
return this.isItemValidForSlot(i, itemStack);
|
|
}
|
|
|
|
@Override
|
|
public boolean canExtractItem(int i, ItemStack itemStack, int j) {
|
|
|
|
Item item = itemStack.getItem();
|
|
|
|
if(item == ModItems.nuclear_waste_long_depleted ||
|
|
item == ModItems.nuclear_waste_long_depleted_tiny ||
|
|
item == ModItems.nuclear_waste_short_depleted ||
|
|
item == ModItems.nuclear_waste_short_depleted_tiny ||
|
|
item == ModItems.ingot_mercury)
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public int getInventoryStackLimit() {
|
|
return 1;
|
|
}
|
|
|
|
@Override
|
|
public int[] getAccessibleSlotsFromSide(int side) {
|
|
return slots_arr;
|
|
}
|
|
|
|
@Override
|
|
public void setFillForSync(int fill, int index) {
|
|
if(index < 2 && tanks[index] != null)
|
|
tanks[index].setFill(fill);
|
|
}
|
|
|
|
@Override
|
|
public void setTypeForSync(FluidType type, int index) {
|
|
if(index < 2 && tanks[index] != null)
|
|
tanks[index].setTankType(type);
|
|
}
|
|
|
|
@Override
|
|
public void readFromNBT(NBTTagCompound nbt) {
|
|
super.readFromNBT(nbt);
|
|
this.tanks[0].readFromNBT(nbt, "liquid");
|
|
this.tanks[1].readFromNBT(nbt, "gas");
|
|
}
|
|
|
|
@Override
|
|
public void writeToNBT(NBTTagCompound nbt) {
|
|
super.writeToNBT(nbt);
|
|
this.tanks[0].writeToNBT(nbt, "liquid");
|
|
this.tanks[1].writeToNBT(nbt, "gas");
|
|
}
|
|
|
|
@Override
|
|
public FluidTank[] getSendingTanks() {
|
|
return new FluidTank[] { tanks[0], tanks[1] };
|
|
}
|
|
|
|
@Override
|
|
public FluidTank[] getAllTanks() {
|
|
return tanks;
|
|
}
|
|
|
|
@Override
|
|
public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) {
|
|
return new ContainerStorageDrum(player.inventory, this);
|
|
}
|
|
|
|
@Override
|
|
@SideOnly(Side.CLIENT)
|
|
public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) {
|
|
return new GUIStorageDrum(player.inventory, this);
|
|
}
|
|
|
|
@Override
|
|
public FluidTank getTankToPaste() {
|
|
return null;
|
|
}
|
|
}
|