electrodynamics/atomic/src/main/scala/resonantinduction/atomic/process/TileChemicalExtractor.java

386 lines
11 KiB
Java

package resonantinduction.atomic.process;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.packet.Packet;
import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTank;
import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler;
import resonant.api.IRotatable;
import resonant.lib.network.Synced;
import resonantinduction.atomic.Atomic;
import resonantinduction.core.ResonantInduction;
import resonantinduction.core.Settings;
import universalelectricity.api.CompatibilityModule;
import universalelectricity.api.electricity.IVoltageInput;
import universalelectricity.api.energy.EnergyStorageHandler;
import cpw.mods.fml.common.network.PacketDispatcher;
import cpw.mods.fml.common.network.Player;
/** Chemical extractor TileEntity */
public class TileChemicalExtractor extends TileProcess implements ISidedInventory, IFluidHandler, IRotatable, IVoltageInput
{
public static final int TICK_TIME = 20 * 14;
public static final int EXTRACT_SPEED = 100;
public static final long ENERGY = 5000;
@Synced
public final FluidTank inputTank = new FluidTank(FluidContainerRegistry.BUCKET_VOLUME * 10);
@Synced
public final FluidTank outputTank = new FluidTank(FluidContainerRegistry.BUCKET_VOLUME * 10);
// How many ticks has this item been extracting for?
@Synced
public int time = 0;
public float rotation = 0;
public TileChemicalExtractor()
{
energy = new EnergyStorageHandler(ENERGY * 2);
maxSlots = 7;
inputSlot = 1;
outputSlot = 2;
tankInputFillSlot = 3;
tankInputDrainSlot = 4;
tankOutputFillSlot = 5;
tankOutputDrainSlot = 6;
}
@Override
public void updateEntity()
{
super.updateEntity();
if (time > 0)
{
rotation += 0.2f;
}
if (!worldObj.isRemote)
{
if (canUse())
{
discharge(getStackInSlot(0));
if (energy.checkExtract(ENERGY))
{
if (time == 0)
{
time = TICK_TIME;
}
if (time > 0)
{
time--;
if (time < 1)
{
if (!refineUranium())
{
if (!extractTritium())
{
extractDeuterium();
}
}
time = 0;
}
}
else
{
time = 0;
}
}
energy.extractEnergy(ENERGY, true);
}
else
{
time = 0;
}
if (ticks % 10 == 0)
{
for (EntityPlayer player : getPlayersUsing())
{
PacketDispatcher.sendPacketToPlayer(getDescriptionPacket(), (Player) player);
}
}
}
}
@Override
public Packet getDescriptionPacket()
{
return ResonantInduction.PACKET_ANNOTATION.getPacket(this);
}
public boolean canUse()
{
if (inputTank.getFluid() != null)
{
if (inputTank.getFluid().amount >= FluidContainerRegistry.BUCKET_VOLUME && Atomic.isItemStackUraniumOre(getStackInSlot(inputSlot)))
{
if (isItemValidForSlot(outputSlot, new ItemStack(Atomic.itemYellowCake)))
{
return true;
}
}
if (outputTank.getFluidAmount() < outputTank.getCapacity())
{
if (inputTank.getFluid().getFluid().getID() == Atomic.FLUID_DEUTERIUM.getID() && inputTank.getFluid().amount >= Settings.deutermiumPerTritium * EXTRACT_SPEED)
{
if (outputTank.getFluid() == null || Atomic.FLUIDSTACK_TRITIUM.equals(outputTank.getFluid()))
{
return true;
}
}
if (inputTank.getFluid().getFluid().getID() == FluidRegistry.WATER.getID() && inputTank.getFluid().amount >= Settings.waterPerDeutermium * EXTRACT_SPEED)
{
if (outputTank.getFluid() == null || Atomic.FLUIDSTACK_DEUTERIUM.equals(outputTank.getFluid()))
{
return true;
}
}
}
}
return false;
}
/** Turn one item from the furnace source stack into the appropriate smelted item in the furnace result stack. */
public boolean refineUranium()
{
if (canUse())
{
if (Atomic.isItemStackUraniumOre(getStackInSlot(inputSlot)))
{
inputTank.drain(FluidContainerRegistry.BUCKET_VOLUME, true);
incrStackSize(outputSlot, new ItemStack(Atomic.itemYellowCake, 3));
decrStackSize(inputSlot, 1);
return true;
}
}
return false;
}
public boolean extractDeuterium()
{
if (canUse())
{
FluidStack drain = inputTank.drain(Settings.waterPerDeutermium * EXTRACT_SPEED, false);
if (drain != null && drain.amount >= 1 && drain.getFluid().getID() == FluidRegistry.WATER.getID())
{
if (outputTank.fill(new FluidStack(Atomic.FLUIDSTACK_DEUTERIUM, EXTRACT_SPEED), true) >= EXTRACT_SPEED)
{
inputTank.drain(Settings.waterPerDeutermium * EXTRACT_SPEED, true);
return true;
}
}
}
return false;
}
public boolean extractTritium()
{
if (canUse())
{
int waterUsage = Settings.deutermiumPerTritium;
FluidStack drain = inputTank.drain(Settings.deutermiumPerTritium * EXTRACT_SPEED, false);
if (drain != null && drain.amount >= 1 && drain.getFluid().getID() == Atomic.FLUID_DEUTERIUM.getID())
{
if (outputTank.fill(new FluidStack(Atomic.FLUIDSTACK_TRITIUM, EXTRACT_SPEED), true) >= EXTRACT_SPEED)
{
inputTank.drain(Settings.deutermiumPerTritium * EXTRACT_SPEED, true);
return true;
}
}
}
return false;
}
/** Reads a tile entity from NBT. */
@Override
public void readFromNBT(NBTTagCompound nbt)
{
super.readFromNBT(nbt);
time = nbt.getInteger("time");
NBTTagCompound water = nbt.getCompoundTag("inputTank");
inputTank.setFluid(FluidStack.loadFluidStackFromNBT(water));
NBTTagCompound deuterium = nbt.getCompoundTag("outputTank");
outputTank.setFluid(FluidStack.loadFluidStackFromNBT(deuterium));
}
/** Writes a tile entity to NBT. */
@Override
public void writeToNBT(NBTTagCompound nbt)
{
super.writeToNBT(nbt);
nbt.setInteger("time", time);
if (inputTank.getFluid() != null)
{
NBTTagCompound compound = new NBTTagCompound();
inputTank.getFluid().writeToNBT(compound);
nbt.setTag("inputTank", compound);
}
if (outputTank.getFluid() != null)
{
NBTTagCompound compound = new NBTTagCompound();
outputTank.getFluid().writeToNBT(compound);
nbt.setTag("outputTank", compound);
}
}
/** Tank Methods */
@Override
public int fill(ForgeDirection from, FluidStack resource, boolean doFill)
{
if (resource != null && canFill(from, resource.getFluid()))
{
return inputTank.fill(resource, doFill);
}
return 0;
}
@Override
public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain)
{
return drain(from, resource.amount, doDrain);
}
@Override
public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain)
{
return outputTank.drain(maxDrain, doDrain);
}
@Override
public boolean canFill(ForgeDirection from, Fluid fluid)
{
return FluidRegistry.WATER.getID() == fluid.getID() || Atomic.FLUID_DEUTERIUM.getID() == fluid.getID();
}
@Override
public boolean canDrain(ForgeDirection from, Fluid fluid)
{
return outputTank.getFluid() != null && outputTank.getFluid().getFluid().getID() == fluid.getID();
}
@Override
public FluidTankInfo[] getTankInfo(ForgeDirection from)
{
return new FluidTankInfo[]
{ this.inputTank.getInfo(), this.outputTank.getInfo() };
}
@Override
public boolean isItemValidForSlot(int slotID, ItemStack itemStack)
{
// Water input for machine.
if (slotID == 0)
{
return CompatibilityModule.isHandler(itemStack.getItem());
}
if (slotID == 1)
{
return Atomic.isItemStackWaterCell(itemStack);
}
// Empty cell to be filled with deuterium or tritium.
if (slotID == 2)
{
return Atomic.isItemStackDeuteriumCell(itemStack) || Atomic.isItemStackTritiumCell(itemStack);
}
// Uranium to be extracted into yellowcake.
if (slotID == 3)
{
return Atomic.isItemStackEmptyCell(itemStack) || Atomic.isItemStackUraniumOre(itemStack) || Atomic.isItemStackDeuteriumCell(itemStack);
}
return false;
}
@Override
public int[] getAccessibleSlotsFromSide(int side)
{
return new int[]
{ 1, 2, 3 };
}
@Override
public boolean canInsertItem(int slotID, ItemStack itemStack, int side)
{
return this.isItemValidForSlot(slotID, itemStack);
}
@Override
public boolean canExtractItem(int slotID, ItemStack itemstack, int side)
{
return slotID == 2;
}
@Override
public long onExtractEnergy(ForgeDirection from, long extract, boolean doExtract)
{
return 0;
}
@Override
public long onReceiveEnergy(ForgeDirection from, long receive, boolean doReceive)
{
if (this.canUse())
{
return super.onReceiveEnergy(from, receive, doReceive);
}
else
{
return 0;
}
}
@Override
public long getVoltageInput(ForgeDirection from)
{
return 1000;
}
@Override
public void onWrongVoltage(ForgeDirection direction, long voltage)
{
}
@Override
public FluidTank getInputTank()
{
return inputTank;
}
@Override
public FluidTank getOutputTank()
{
return outputTank;
}
}