package mekanism.generators.common.tile; import io.netty.buffer.ByteBuf; import java.util.ArrayList; import mekanism.api.MekanismConfig.generators; import mekanism.common.FluidSlot; import mekanism.common.MekanismItems; import mekanism.common.base.FluidHandlerWrapper; import mekanism.common.base.IFluidHandlerWrapper; import mekanism.common.base.ISustainedData; import mekanism.common.util.ChargeUtils; import mekanism.common.util.ItemDataUtils; import mekanism.common.util.MekanismUtils; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fml.common.FMLCommonHandler; public class TileEntityBioGenerator extends TileEntityGenerator implements IFluidHandlerWrapper, ISustainedData { /** The FluidSlot biofuel instance for this generator. */ public FluidSlot bioFuelSlot = new FluidSlot(24000, -1); public TileEntityBioGenerator() { super("bio", "BioGenerator", 160000, generators.bioGeneration*2); inventory = new ItemStack[2]; } @Override public void onUpdate() { super.onUpdate(); if(inventory[0] != null) { ChargeUtils.charge(1, this); FluidStack fluid = FluidUtil.getFluidContained(inventory[0]); if(fluid != null && FluidRegistry.isFluidRegistered("bioethanol")) { if(fluid.getFluid() == FluidRegistry.getFluid("bioethanol")) { IFluidHandler handler = FluidUtil.getFluidHandler(inventory[0]); FluidStack drained = handler.drain(bioFuelSlot.MAX_FLUID-bioFuelSlot.fluidStored, true); if(drained != null) { bioFuelSlot.fluidStored += drained.amount; if(inventory[0].stackSize == 0) { inventory[0] = null; } } } } else { int fuel = getFuel(inventory[0]); ItemStack prevStack = inventory[0].copy(); if(fuel > 0) { int fuelNeeded = bioFuelSlot.MAX_FLUID - bioFuelSlot.fluidStored; if(fuel <= fuelNeeded) { bioFuelSlot.fluidStored += fuel; if(inventory[0].getItem().getContainerItem(inventory[0]) != null) { inventory[0] = inventory[0].getItem().getContainerItem(inventory[0]); } else { inventory[0].stackSize--; } if(inventory[0].stackSize == 0) { inventory[0] = null; } } } } } if(canOperate()) { if(!worldObj.isRemote) { setActive(true); } bioFuelSlot.setFluid(bioFuelSlot.fluidStored - 1); setEnergy(electricityStored + generators.bioGeneration); } else { if(!worldObj.isRemote) { setActive(false); } } } @Override public boolean isItemValidForSlot(int slotID, ItemStack itemstack) { if(slotID == 0) { if(getFuel(itemstack ) > 0) { return true; } else { if(FluidRegistry.isFluidRegistered("bioethanol")) { if(FluidUtil.getFluidContained(itemstack) != null) { if(FluidUtil.getFluidContained(itemstack).getFluid() == FluidRegistry.getFluid("bioethanol")) { return true; } } } return false; } } else if(slotID == 1) { return ChargeUtils.canBeCharged(itemstack); } return true; } @Override public boolean canOperate() { return electricityStored < BASE_MAX_ENERGY && bioFuelSlot.fluidStored > 0 && MekanismUtils.canFunction(this); } @Override public void readFromNBT(NBTTagCompound nbtTags) { super.readFromNBT(nbtTags); bioFuelSlot.fluidStored = nbtTags.getInteger("bioFuelStored"); } @Override public NBTTagCompound writeToNBT(NBTTagCompound nbtTags) { super.writeToNBT(nbtTags); nbtTags.setInteger("bioFuelStored", bioFuelSlot.fluidStored); return nbtTags; } public int getFuel(ItemStack itemstack) { return itemstack.getItem() == MekanismItems.BioFuel ? 200 : 0; } /** * Gets the scaled fuel level for the GUI. * @param i - multiplier * @return */ public int getScaledFuelLevel(int i) { return bioFuelSlot.fluidStored*i / bioFuelSlot.MAX_FLUID; } @Override public int[] getSlotsForFace(EnumFacing side) { return side == MekanismUtils.getRight(facing) ? new int[] {1} : new int[] {0}; } @Override public boolean canSetFacing(int facing) { return facing != 0 && facing != 1; } @Override public void handlePacketData(ByteBuf dataStream) { super.handlePacketData(dataStream); if(FMLCommonHandler.instance().getEffectiveSide().isClient()) { bioFuelSlot.fluidStored = dataStream.readInt(); } } @Override public ArrayList getNetworkedData(ArrayList data) { super.getNetworkedData(data); data.add(bioFuelSlot.fluidStored); return data; } private static final String[] methods = new String[] {"getEnergy", "getOutput", "getMaxEnergy", "getEnergyNeeded", "getBioFuel", "getBioFuelNeeded"}; @Override public String[] getMethods() { return methods; } @Override public Object[] invoke(int method, Object[] arguments) throws Exception { switch(method) { case 0: return new Object[] {electricityStored}; case 1: return new Object[] {output}; case 2: return new Object[] {BASE_MAX_ENERGY}; case 3: return new Object[] {(BASE_MAX_ENERGY -electricityStored)}; case 4: return new Object[] {bioFuelSlot.fluidStored}; case 5: return new Object[] {bioFuelSlot.MAX_FLUID-bioFuelSlot.fluidStored}; default: throw new NoSuchMethodException(); } } @Override public int fill(EnumFacing from, FluidStack resource, boolean doFill) { if(FluidRegistry.isFluidRegistered("bioethanol") && from != facing) { if(resource.getFluid() == FluidRegistry.getFluid("bioethanol")) { int fuelTransfer = 0; int fuelNeeded = bioFuelSlot.MAX_FLUID - bioFuelSlot.fluidStored; int attemptTransfer = resource.amount; if(attemptTransfer <= fuelNeeded) { fuelTransfer = attemptTransfer; } else { fuelTransfer = fuelNeeded; } if(doFill) { bioFuelSlot.setFluid(bioFuelSlot.fluidStored + fuelTransfer); } return fuelTransfer; } } return 0; } @Override public FluidStack drain(EnumFacing from, int maxDrain, boolean doDrain) { return null; } @Override public FluidStack drain(EnumFacing from, FluidStack resource, boolean doDrain) { return null; } @Override public boolean canFill(EnumFacing from, Fluid fluid) { return FluidRegistry.isFluidRegistered("bioethanol") && fluid == FluidRegistry.getFluid("bioethanol"); } @Override public boolean canDrain(EnumFacing from, Fluid fluid) { return false; } @Override public FluidTankInfo[] getTankInfo(EnumFacing from) { return null; } @Override public void writeSustainedData(ItemStack itemStack) { ItemDataUtils.setInt(itemStack, "fluidStored", bioFuelSlot.fluidStored); } @Override public void readSustainedData(ItemStack itemStack) { bioFuelSlot.setFluid(ItemDataUtils.getInt(itemStack, "fluidStored")); } @Override public boolean hasCapability(Capability<?> capability, EnumFacing side) { return (side != facing && capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) || super.hasCapability(capability, side); } @Override public <T> T getCapability(Capability<T> capability, EnumFacing side) { if(side != facing && capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) { return (T)new FluidHandlerWrapper(this, side); } return super.getCapability(capability, side); } }