package cofh.lib.util;
import cofh.api.fluid.ITankContainerBucketable;
import cofh.lib.util.helpers.ItemHelper;
import cofh.lib.util.position.BlockPosition;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidContainerItem;
import net.minecraftforge.fluids.IFluidHandler;
import net.minecraftforge.fluids.IFluidTank;
public class UtilLiquidMover {
/**
* Attempts to fill tank with the player's current item.
* @param itcb the tank the liquid is going into
* @param player the player trying to fill the tank
* @return True if liquid was transferred to the tank.
*/
public static boolean manuallyFillTank(ITankContainerBucketable itcb, EntityPlayer player) {
ItemStack ci = player.inventory.getCurrentItem();
FluidStack liquid = FluidContainerRegistry.getFluidForFilledItem(ci);
if (liquid != null) {
Item item = ci.getItem();
if (itcb.fill(ForgeDirection.UNKNOWN, liquid, false) == liquid.amount) {
itcb.fill(ForgeDirection.UNKNOWN, liquid, true);
if (!player.capabilities.isCreativeMode) {
if (item.hasContainerItem(ci)) {
ItemStack drop = item.getContainerItem(ci);
if (drop != null && drop.isItemStackDamageable() && drop.getItemDamage() > drop.getMaxDamage())
drop = null;
ItemHelper.disposePlayerItem(ci, drop, player, true);
} else
player.inventory.setInventorySlotContents(player.inventory.currentItem, ItemHelper.consumeItem(ci, player));
if (!player.worldObj.isRemote) {
player.openContainer.detectAndSendChanges();
((EntityPlayerMP)player).sendContainerAndContentsToPlayer(player.openContainer, player.openContainer.getInventory());
}
}
return true;
}
} else if (ci != null && ci.getItem() instanceof IFluidContainerItem) {
Item item = ci.getItem();
IFluidContainerItem fluidContainer = (IFluidContainerItem)item;
liquid = fluidContainer.getFluid(ci);
if (itcb.fill(ForgeDirection.UNKNOWN, liquid, false) > 0) {
int amount = itcb.fill(ForgeDirection.UNKNOWN, liquid, true);
ItemStack drop = ci.splitStack(1);
ci.stackSize++;
fluidContainer.drain(drop, amount, true);
if (!player.capabilities.isCreativeMode) {
if (item.hasContainerItem(drop)) {
drop = item.getContainerItem(drop);
if (drop != null && drop.isItemStackDamageable() && drop.getItemDamage() > drop.getMaxDamage())
drop = null;
}
ItemHelper.disposePlayerItem(ci, drop, player, true);
if (!player.worldObj.isRemote) {
player.openContainer.detectAndSendChanges();
((EntityPlayerMP)player).sendContainerAndContentsToPlayer(player.openContainer, player.openContainer.getInventory());
}
}
return true;
}
}
return false;
}
/**
* Attempts to drain tank into the player's current item.
* @param itcb the tank the liquid is coming from
* @param player the player trying to take liquid from the tank
* @return True if liquid was transferred from the tank.
*/
public static boolean manuallyDrainTank(ITankContainerBucketable itcb, EntityPlayer player) {
ItemStack ci = player.inventory.getCurrentItem();
boolean isSmartContainer = false;
IFluidContainerItem fluidContainer;
if (ci != null && (FluidContainerRegistry.isEmptyContainer(ci) ||
(isSmartContainer = ci.getItem() instanceof IFluidContainerItem))) {
for (FluidTankInfo tank : itcb.getTankInfo(ForgeDirection.UNKNOWN)) {
FluidStack tankLiquid = tank.fluid;
if (tankLiquid == null || tankLiquid.amount == 0)
continue;
ItemStack filledBucket = null;
FluidStack bucketLiquid = null;
if (isSmartContainer) {
fluidContainer = (IFluidContainerItem)ci.getItem();
filledBucket = ci.copy();
filledBucket.stackSize = 1;
if (fluidContainer.fill(filledBucket, tankLiquid, false) > 0) {
int amount = fluidContainer.fill(filledBucket, tankLiquid, true);
bucketLiquid = new FluidStack(tankLiquid.fluidID, amount);
FluidStack l = itcb.drain(ForgeDirection.UNKNOWN, bucketLiquid, false);
if (l == null || l.amount < amount)
filledBucket = null;
} else
filledBucket = null;
} else {
filledBucket = FluidContainerRegistry.fillFluidContainer(tankLiquid, ci);
if (FluidContainerRegistry.isFilledContainer(filledBucket)) {
bucketLiquid = FluidContainerRegistry.getFluidForFilledItem(filledBucket);
FluidStack l = itcb.drain(ForgeDirection.UNKNOWN, bucketLiquid, false);
if (l == null || l.amount < bucketLiquid.amount)
filledBucket = null;
} else
filledBucket = null;
}
if (filledBucket != null) {
if (ItemHelper.disposePlayerItem(ci, filledBucket, player, true)) {
if (!player.worldObj.isRemote) {
player.openContainer.detectAndSendChanges();
((EntityPlayerMP)player).sendContainerAndContentsToPlayer(player.openContainer, player.openContainer.getInventory());
}
itcb.drain(ForgeDirection.UNKNOWN, bucketLiquid, true);
return true;
}
}
}
}
return false;
}
public static void pumpLiquid(IFluidTank iFluidTank, TileEntity from) {
if (iFluidTank != null && iFluidTank.getFluidAmount() > 0) {
FluidStack l = iFluidTank.getFluid().copy();
int amount = Math.min(l.amount, FluidContainerRegistry.BUCKET_VOLUME);
l.amount = amount;
for (BlockPosition adj : new BlockPosition(from).getAdjacent(true)) {
IFluidHandler tile = adj.getTileEntity(from.getWorldObj(), IFluidHandler.class);
if (tile != null) {
if (!tile.canFill(adj.orientation.getOpposite(), l.getFluid()))
continue;
int filled = tile.fill(adj.orientation.getOpposite(), l, true);
iFluidTank.drain(filled, true);
amount -= filled;
if (amount <= 0)
break;
}
}
}
}
}