/*
* Copyright (c) CovertJaguar, 2015 http://railcraft.info
*
* This code is the property of CovertJaguar
* and may only be used with explicit written
* permission unless otherwise specified on the
* license page at http://railcraft.info/wiki/info:license.
*/
package mods.railcraft.common.fluids;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.IFluidContainerItem;
/**
* Created by CovertJaguar on 4/2/2015.
*/
public class FluidItemHelper {
/**
* Fill a liquid container.
*
* @return The modified container and the amount of Fluid filled.
*/
public static FillReturn fillContainer(ItemStack container, FluidStack fluidStack) {
if (container == null)
return new FillReturn(null, 0);
container = container.copy();
if (fluidStack == null)
return new FillReturn(container, 0);
if (container.getItem() instanceof IFluidContainerItem) {
container.stackSize = 1;
IFluidContainerItem fluidCon = (IFluidContainerItem) container.getItem();
return new FillReturn(container, fluidCon.fill(container, fluidStack, true));
}
ItemStack filledCon = FluidContainerRegistry.fillFluidContainer(fluidStack, container);
if (filledCon != null)
return new FillReturn(filledCon, FluidContainerRegistry.getFluidForFilledItem(filledCon).amount);
return new FillReturn(container, 0);
}
public static FillReturn fillContainer(ItemStack stackToFill, Fluid fluid) {
return fillContainer(stackToFill, new FluidStack(fluid, Integer.MAX_VALUE));
}
/**
* Drain a liquid container.
*
* @return The modified container and any fluid drained.
*/
public static DrainReturn drainContainer(ItemStack container, int maxDrain) {
if (container == null)
return new DrainReturn(null, null, false);
container = container.copy();
if (container.getItem() instanceof IFluidContainerItem) {
Item item = container.getItem();
container.stackSize = 1;
IFluidContainerItem fluidCon = (IFluidContainerItem) item;
FluidStack drained = fluidCon.drain(container, maxDrain, true);
ItemStack returnStack;
if (container.getItem().hasContainerItem(container)) {
returnStack = container.getItem().getContainerItem(container);
} else {
returnStack = container;
}
return new DrainReturn(returnStack, drained, false);
}
if (FluidContainerRegistry.isFilledContainer(container)) {
ItemStack emptyCon = container.getItem().getContainerItem(container);
return new DrainReturn(emptyCon, FluidContainerRegistry.getFluidForFilledItem(container), true);
}
return new DrainReturn(container, null, false);
}
public static boolean isBucket(ItemStack stack) {
return FluidContainerRegistry.isBucket(stack);
}
public static boolean isContainer(ItemStack stack) {
if (stack == null) return false;
if (stack.getItem() instanceof IFluidContainerItem) {
return ((IFluidContainerItem) stack.getItem()).getCapacity(stack) > 0;
}
return FluidContainerRegistry.isContainer(stack);
}
public static boolean isFilledContainer(ItemStack stack) {
if (stack == null) return false;
if (stack.getItem() instanceof IFluidContainerItem) {
IFluidContainerItem fluidCon = (IFluidContainerItem) stack.getItem();
return fluidCon.getFluid(stack) != null && fluidCon.getFluid(stack).amount > 0;
}
return FluidContainerRegistry.isFilledContainer(stack);
}
public static boolean isFullContainer(ItemStack stack) {
if (stack == null) return false;
if (stack.getItem() instanceof IFluidContainerItem) {
IFluidContainerItem fluidCon = (IFluidContainerItem) stack.getItem();
int capacity = fluidCon.getCapacity(stack);
FluidStack fluidStack = fluidCon.getFluid(stack);
return capacity > 0 && fluidStack != null && fluidStack.amount >= capacity;
}
return FluidContainerRegistry.isFilledContainer(stack);
}
public static boolean isEmptyContainer(ItemStack stack) {
if (stack == null) return false;
if (stack.getItem() instanceof IFluidContainerItem) {
IFluidContainerItem fluidCon = (IFluidContainerItem) stack.getItem();
FluidStack fluidStack = fluidCon.getFluid(stack);
return fluidCon.getCapacity(stack) > 0 && (fluidStack == null || fluidStack.amount <= 0);
}
return FluidContainerRegistry.isEmptyContainer(stack);
}
public static boolean isRoomInContainer(ItemStack stack) {
if (stack == null) return false;
if (stack.getItem() instanceof IFluidContainerItem) {
IFluidContainerItem fluidCon = (IFluidContainerItem) stack.getItem();
FluidStack fluidStack = fluidCon.getFluid(stack);
int capacity = fluidCon.getCapacity(stack);
return capacity > 0 && (fluidStack == null || fluidStack.amount < capacity);
}
return FluidContainerRegistry.isEmptyContainer(stack);
}
public static boolean isRoomInContainer(ItemStack stack, Fluid fluid) {
if (stack == null) return false;
if (stack.getItem() instanceof IFluidContainerItem) {
IFluidContainerItem fluidCon = (IFluidContainerItem) stack.getItem();
return fluidCon.fill(stack, new FluidStack(fluid, 1), false) > 0;
}
return FluidContainerRegistry.isEmptyContainer(stack);
}
public static int getRoomInContainer(ItemStack stack, Fluid fluid) {
if (stack == null) return 0;
if (stack.getItem() instanceof IFluidContainerItem) {
IFluidContainerItem fluidCon = (IFluidContainerItem) stack.getItem();
return fluidCon.fill(stack, new FluidStack(fluid, Integer.MAX_VALUE), false);
}
ItemStack filled = FluidContainerRegistry.fillFluidContainer(new FluidStack(fluid, Integer.MAX_VALUE), stack);
if (filled != null) {
FluidStack filledFluid = getFluidStackInContainer(filled);
return filledFluid != null ? filledFluid.amount : 0;
}
return 0;
}
public static boolean containsFluid(ItemStack stack, Fluid fluid) {
if (stack == null || fluid == null) return false;
if (stack.getItem() instanceof IFluidContainerItem) {
IFluidContainerItem fluidCon = (IFluidContainerItem) stack.getItem();
return Fluids.areEqual(fluid, fluidCon.getFluid(stack));
}
return FluidContainerRegistry.containsFluid(stack, new FluidStack(fluid, 1));
}
public static boolean containsFluid(ItemStack stack, FluidStack fluidStack) {
if (stack == null || fluidStack == null) return false;
if (stack.getItem() instanceof IFluidContainerItem) {
IFluidContainerItem fluidCon = (IFluidContainerItem) stack.getItem();
FluidStack conFluidStack = fluidCon.getFluid(stack);
return conFluidStack != null && conFluidStack.containsFluid(fluidStack);
}
return FluidContainerRegistry.containsFluid(stack, fluidStack);
}
public static FluidStack getFluidStackInContainer(ItemStack stack) {
if (stack == null) return null;
if (stack.getItem() instanceof IFluidContainerItem) {
IFluidContainerItem fluidCon = (IFluidContainerItem) stack.getItem();
return fluidCon.getFluid(stack);
}
return FluidContainerRegistry.getFluidForFilledItem(stack);
}
public static Fluid getFluidInContainer(ItemStack stack) {
if (stack == null) return null;
if (stack.getItem() instanceof IFluidContainerItem) {
IFluidContainerItem fluidCon = (IFluidContainerItem) stack.getItem();
FluidStack conFluidStack = fluidCon.getFluid(stack);
return conFluidStack == null ? null : conFluidStack.getFluid();
}
FluidStack fluidStack = FluidContainerRegistry.getFluidForFilledItem(stack);
return fluidStack != null ? fluidStack.getFluid() : null;
}
public static class FillReturn {
public final ItemStack container;
public final int amount;
public FillReturn(ItemStack con, int amount) {
this.container = con;
this.amount = amount;
}
}
public static class DrainReturn {
public final ItemStack container;
public final FluidStack fluidDrained;
public final boolean isAtomic;
public DrainReturn(ItemStack con, FluidStack fluidDrained, boolean isAtomic) {
this.container = con;
this.fluidDrained = fluidDrained;
this.isAtomic = isAtomic;
}
}
}