package zmaster587.advancedRocketry.tile.oxygen;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.util.AxisAlignedBB;
import net.minecraftforge.common.util.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.IFluidContainerItem;
import zmaster587.advancedRocketry.api.AdvancedRocketryFluids;
import zmaster587.advancedRocketry.armor.ItemSpaceArmor;
import zmaster587.libVulpes.api.IModularArmor;
import zmaster587.libVulpes.gui.CommonResources;
import zmaster587.libVulpes.inventory.modules.IModularInventory;
import zmaster587.libVulpes.inventory.modules.ModuleBase;
import zmaster587.libVulpes.inventory.modules.ModuleImage;
import zmaster587.libVulpes.inventory.modules.ModuleLiquidIndicator;
import zmaster587.libVulpes.inventory.modules.ModulePower;
import zmaster587.libVulpes.inventory.modules.ModuleSlotArray;
import zmaster587.libVulpes.tile.TileInventoriedRFConsumerTank;
import zmaster587.libVulpes.util.IconResource;
public class TileOxygenCharger extends TileInventoriedRFConsumerTank implements IModularInventory {
public TileOxygenCharger() {
super(0, 2, 16000);
}
@Override
public int[] getAccessibleSlotsFromSide(int slots) {
return new int[] {};
}
@Override
public boolean isItemValidForSlot(int slot, ItemStack stack) {
return false;
}
@Override
public int fill(ForgeDirection from, FluidStack resource, boolean doFill) {
if(resource.getFluidID() == AdvancedRocketryFluids.fluidOxygen.getID() ||
resource.getFluidID() == AdvancedRocketryFluids.fluidHydrogen.getID())
return super.fill(from, resource, doFill);
return 0;
}
@Override
public boolean canFill(ForgeDirection from, Fluid fluid) {
return fluid.getID() == FluidRegistry.getFluidID(AdvancedRocketryFluids.fluidOxygen) || fluid.getID() == FluidRegistry.getFluidID(AdvancedRocketryFluids.fluidHydrogen);
}
@Override
public int getPowerPerOperation() {
return 0;
}
@Override
public boolean canPerformFunction() {
if(!worldObj.isRemote) {
for( Object player : this.worldObj.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(this.xCoord, this.yCoord, this.zCoord, this.xCoord + 1, this.yCoord + 2, this.zCoord + 1))) {
ItemStack stack = ((EntityPlayer)player).getEquipmentInSlot(3);
//Check for O2 fill
if(stack != null && stack.getItem() instanceof ItemSpaceArmor) {
FluidStack fluidStack = this.drain(ForgeDirection.UNKNOWN, 1, false);
if(((ItemSpaceArmor)stack.getItem()).getAirRemaining(stack) < ((ItemSpaceArmor)stack.getItem()).getMaxAir() &&
fluidStack != null && fluidStack.getFluid().getID() == AdvancedRocketryFluids.fluidOxygen.getID() && fluidStack.amount > 0) {
this.drain(ForgeDirection.UNKNOWN, 1, true);
((ItemSpaceArmor)stack.getItem()).increment(stack, 100);
return true;
}
}
//Check for H2 fill (possibly merge with O2 fill
if(stack != null && stack.getItem() instanceof IModularArmor) {
IInventory inv = ((IModularArmor)stack.getItem()).loadModuleInventory(stack);
FluidStack fluidStack = this.drain(ForgeDirection.UNKNOWN, 100, false);
if(fluidStack != null) {
for(int i = 0; i < inv.getSizeInventory(); i++) {
ItemStack module = inv.getStackInSlot(i);
if(module != null && module.getItem() instanceof IFluidContainerItem) {
int amtFilled = ((IFluidContainerItem)module.getItem()).fill(module, fluidStack, true);
if(amtFilled == 100) {
this.drain(ForgeDirection.UNKNOWN, 100, true);
((IModularArmor)stack.getItem()).saveModuleInventory(stack, inv);
return true;
}
}
}
}
}
return false;
}
}
return false;
}
@Override
public void performFunction() {
}
@Override
public List<ModuleBase> getModules(int ID, EntityPlayer player) {
ArrayList<ModuleBase> modules = new ArrayList<ModuleBase>();
modules.add(new ModuleSlotArray(50, 21, this, 0, 1));
modules.add(new ModuleSlotArray(50, 57, this, 1, 2));
if(worldObj.isRemote)
modules.add(new ModuleImage(49, 38, new IconResource(194, 0, 18, 18, CommonResources.genericBackground)));
//modules.add(new ModulePower(18, 20, this));
modules.add(new ModuleLiquidIndicator(32, 20, this));
//modules.add(toggleSwitch = new ModuleToggleSwitch(160, 5, 0, "", this, TextureResources.buttonToggleImage, 11, 26, getMachineEnabled()));
//TODO add itemStack slots for liqiuid
return modules;
}
@Override
public String getModularInventoryName() {
return "tile.oxygenCharger.name";
}
@Override
public boolean canInteractWithContainer(EntityPlayer entity) {
return true;
}
@Override
public void setInventorySlotContents(int slot, ItemStack stack) {
super.setInventorySlotContents(slot, stack);
while(useBucket(0, getStackInSlot(0)));
}
//Yes i was lazy
//TODO: make better
private boolean useBucket( int slot, ItemStack stack) {
if(FluidContainerRegistry.isFilledContainer(stack)) {
if(slot == 0 && tank.getFluidAmount() + FluidContainerRegistry.getContainerCapacity(stack) <= tank.getCapacity()) {
ItemStack emptyContainer = FluidContainerRegistry.drainFluidContainer(stack);
if(emptyContainer != null && getStackInSlot(1) == null || (emptyContainer.isItemEqual(getStackInSlot(1)) && getStackInSlot(1).stackSize < getStackInSlot(1).getMaxStackSize())) {
tank.fill(FluidContainerRegistry.getFluidForFilledItem(stack), true);
if(getStackInSlot(1) == null)
inventory.setInventorySlotContents(1, emptyContainer);
else
getStackInSlot(1).stackSize++;
decrStackSize(0, 1);
return true;
}
}
}
else if(FluidContainerRegistry.isContainer(stack)) {
if(slot == 0 && tank.getFluidAmount() >= FluidContainerRegistry.BUCKET_VOLUME) {
ItemStack fullContainer = FluidContainerRegistry.fillFluidContainer(tank.drain(FluidContainerRegistry.BUCKET_VOLUME, false), stack);
if(fullContainer != null && (getStackInSlot(1) == null || (fullContainer.isItemEqual(getStackInSlot(1)) && getStackInSlot(1).stackSize < getStackInSlot(1).getMaxStackSize())) ) {
tank.drain(FluidContainerRegistry.BUCKET_VOLUME, true);
if(getStackInSlot(1) == null)
inventory.setInventorySlotContents(1, fullContainer);
else
getStackInSlot(1).stackSize++;
decrStackSize(0, 1);
return true;
}
}
}
else if(stack != null && stack.getItem() instanceof IFluidContainerItem) {
IFluidContainerItem fluidItem = ((IFluidContainerItem)stack.getItem());
FluidStack fluidStack;
stack = stack.copy();
stack.stackSize = 1;
//Drain the tank into the item
if(fluidItem.getFluid(stack) == null && tank.getFluid() != null) {
int amt = fluidItem.fill(stack, tank.getFluid(), true);
//If the container is full move it down and try again for a new one
if(amt != 0 && fluidItem.getCapacity(stack) == fluidItem.getFluid(stack).amount) {
if(getStackInSlot(1) == null) {
inventory.setInventorySlotContents(1, stack);
}
else if(ItemStack.areItemStackTagsEqual(getStackInSlot(1), stack) && getStackInSlot(1).getItem().equals(stack.getItem()) && getStackInSlot(1).getItemDamage() == stack.getItemDamage() && stack.getItem().getItemStackLimit(stack) < getStackInSlot(1).stackSize) {
getStackInSlot(1).stackSize++;
}
else
return false;
tank.drain(amt, true);
decrStackSize(0, 1);
return true;
}
}
else {
fluidStack = fluidItem.drain(stack, tank.getCapacity() - tank.getFluidAmount(), false);
int amountDrained = tank.fill(fluidStack, true);
fluidItem.drain(stack, amountDrained, true);
if (fluidItem.getFluid(stack) == null || fluidItem.getFluid(stack).amount == 0) {
if(getStackInSlot(1) == null) {
inventory.setInventorySlotContents(1, stack);
}
else if(ItemStack.areItemStackTagsEqual(getStackInSlot(1), stack) && getStackInSlot(1).getItem().equals(stack.getItem()) && getStackInSlot(1).getItemDamage() == stack.getItemDamage() && stack.getItem().getItemStackLimit(stack) < getStackInSlot(1).stackSize) {
getStackInSlot(1).stackSize++;
}
else
return false;
decrStackSize(0, 1);
return true;
}
}
}
return false;
}
}