electrodynamics/atomic/src/main/scala/resonantinduction/atomic/fission/ItemFissileFuel.java

100 lines
3.5 KiB
Java

package resonantinduction.atomic.fission;
import java.util.List;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.fluids.FluidStack;
import resonant.api.IReactor;
import resonant.api.IReactorComponent;
import resonantinduction.atomic.Atomic;
import resonantinduction.core.Settings;
import universalelectricity.api.vector.Vector3;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
/** Fissile fuel rod */
public class ItemFissileFuel extends ItemRadioactive implements IReactorComponent
{
public static final int DECAY = 2500;
/** Temperature at which the fuel rod will begin to re-enrich itself. */
public static final int BREEDING_TEMP = 1200;
/** The energy in one KG of uranium is: 72PJ, 100TJ in one cell of uranium. */
public static final long ENERGY = 100000000000L;
/** Approximately 20,000,000J per tick. 400 MW. */
public static final long ENERGY_PER_TICK = ENERGY / 50000;
public ItemFissileFuel(int itemID)
{
super(itemID);
this.setMaxStackSize(1);
this.setMaxDamage(DECAY);
this.setNoRepair();
}
@Override
public void onReact(ItemStack itemStack, IReactor reactor)
{
TileEntity tileEntity = (TileEntity) reactor;
World worldObj = tileEntity.worldObj;
int reactors = 0;
for (int i = 0; i < 6; i++)
{
Vector3 checkPos = new Vector3(tileEntity).translate(ForgeDirection.getOrientation(i));
TileEntity tile = checkPos.getTileEntity(worldObj);
// Check that the other reactors not only exist but also are running.
if (tile instanceof IReactor && ((IReactor) tile).getTemperature() > BREEDING_TEMP)
{
reactors++;
}
}
// Only three reactor cells are required to begin the uranium breeding process instead of four.
if (reactors >= 3)
{
// Begin the process of re-enriching the uranium rod but not consistently.
if (worldObj.rand.nextInt(1000) <= 100 && reactor.getTemperature() > BREEDING_TEMP)
{
// Cells can regain a random amount of health per tick.
int healAmt = worldObj.rand.nextInt(5);
itemStack.setItemDamage(Math.max(itemStack.getItemDamage() - healAmt, 0));
// System.out.println("[Atomic Science] [Reactor Cell] Breeding " + String.valueOf(healAmt) + " back into fissle rod. " + String.valueOf(itemStack.getItemDamage()) + " / " + String.valueOf(itemStack.getMaxDamage()));
}
}
else
{
reactor.heat(ENERGY_PER_TICK);
if (reactor.world().getWorldTime() % 20 == 0)
{
itemStack.setItemDamage(Math.min(itemStack.getItemDamage() + 1, itemStack.getMaxDamage()));
}
// Create toxic waste.
if (Settings.allowToxicWaste && worldObj.rand.nextFloat() > 0.5)
{
FluidStack fluid = Atomic.FLUIDSTACK_TOXIC_WASTE.copy();
fluid.amount = 1;
reactor.fill(ForgeDirection.UNKNOWN, fluid, true);
}
}
}
@Override
@SideOnly(Side.CLIENT)
public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List)
{
par3List.add(new ItemStack(par1, 1, 0));
par3List.add(new ItemStack(par1, 1, getMaxDamage() - 1));
}
}