cc96840aa8
Updated to properly calculate the amount of free space in the tank before checking that against the amount of the resource.
158 lines
4.2 KiB
Java
158 lines
4.2 KiB
Java
package net.minecraftforge.fluids;
|
|
|
|
import net.minecraft.item.Item;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
|
|
/**
|
|
* Reference implementation of {@link IFluidContainerItem}. Use/extend this or implement your own.
|
|
*
|
|
* @author King Lemming
|
|
*
|
|
*/
|
|
public class ItemFluidContainer extends Item implements IFluidContainerItem
|
|
{
|
|
protected int capacity;
|
|
|
|
public ItemFluidContainer(int itemID)
|
|
{
|
|
super(itemID);
|
|
}
|
|
|
|
public ItemFluidContainer(int itemID, int capacity)
|
|
{
|
|
super(itemID);
|
|
this.capacity = capacity;
|
|
}
|
|
|
|
public ItemFluidContainer setCapacity(int capacity)
|
|
{
|
|
this.capacity = capacity;
|
|
return this;
|
|
}
|
|
|
|
/* IFluidContainerItem */
|
|
@Override
|
|
public FluidStack getFluid(ItemStack container)
|
|
{
|
|
if (container.stackTagCompound == null || !container.stackTagCompound.hasKey("Fluid"))
|
|
{
|
|
return null;
|
|
}
|
|
return FluidStack.loadFluidStackFromNBT(container.stackTagCompound.getCompoundTag("Fluid"));
|
|
}
|
|
|
|
@Override
|
|
public int getCapacity(ItemStack container)
|
|
{
|
|
return capacity;
|
|
}
|
|
|
|
@Override
|
|
public int fill(ItemStack container, FluidStack resource, boolean doFill)
|
|
{
|
|
if (resource == null)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if (!doFill)
|
|
{
|
|
if (container.stackTagCompound == null || !container.stackTagCompound.hasKey("Fluid"))
|
|
{
|
|
return Math.min(capacity, resource.amount);
|
|
}
|
|
|
|
FluidStack stack = FluidStack.loadFluidStackFromNBT(container.stackTagCompound.getCompoundTag("Fluid"));
|
|
|
|
if (stack == null)
|
|
{
|
|
return Math.min(capacity, resource.amount);
|
|
}
|
|
|
|
if (!stack.isFluidEqual(resource))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
return Math.min(capacity - stack.amount, resource.amount);
|
|
}
|
|
|
|
if (container.stackTagCompound == null)
|
|
{
|
|
container.stackTagCompound = new NBTTagCompound();
|
|
}
|
|
|
|
if (!container.stackTagCompound.hasKey("Fluid"))
|
|
{
|
|
NBTTagCompound fluidTag = resource.writeToNBT(new NBTTagCompound());
|
|
|
|
if (capacity < resource.amount)
|
|
{
|
|
fluidTag.setInteger("Amount", capacity);
|
|
container.stackTagCompound.setTag("Fluid", fluidTag);
|
|
return capacity;
|
|
}
|
|
|
|
container.stackTagCompound.setTag("Fluid", fluidTag);
|
|
return resource.amount;
|
|
}
|
|
|
|
NBTTagCompound fluidTag = container.stackTagCompound.getCompoundTag("Fluid");
|
|
FluidStack stack = FluidStack.loadFluidStackFromNBT(fluidTag);
|
|
|
|
if (!stack.isFluidEqual(resource))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
int filled = capacity - stack.amount;
|
|
if (resource.amount < filled)
|
|
{
|
|
stack.amount += resource.amount;
|
|
filled = resource.amount;
|
|
}
|
|
else
|
|
{
|
|
stack.amount = capacity;
|
|
}
|
|
|
|
container.stackTagCompound.setTag("Fluid", stack.writeToNBT(fluidTag));
|
|
return filled;
|
|
}
|
|
|
|
@Override
|
|
public FluidStack drain(ItemStack container, int maxDrain, boolean doDrain)
|
|
{
|
|
if (container.stackTagCompound == null || !container.stackTagCompound.hasKey("Fluid"))
|
|
{
|
|
return null;
|
|
}
|
|
|
|
FluidStack stack = FluidStack.loadFluidStackFromNBT(container.stackTagCompound.getCompoundTag("Fluid"));
|
|
if (stack == null)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
stack.amount = Math.min(stack.amount, maxDrain);
|
|
if (doDrain)
|
|
{
|
|
if (maxDrain >= capacity)
|
|
{
|
|
container.stackTagCompound.removeTag("Fluid");
|
|
|
|
if (container.stackTagCompound.hasNoTags())
|
|
{
|
|
container.stackTagCompound = null;
|
|
}
|
|
return stack;
|
|
}
|
|
|
|
NBTTagCompound fluidTag = container.stackTagCompound.getCompoundTag("Fluid");
|
|
fluidTag.setInteger("Amount", fluidTag.getInteger("Amount") - maxDrain);
|
|
container.stackTagCompound.setTag("Fluid", fluidTag);
|
|
}
|
|
return stack;
|
|
}
|
|
}
|