133 lines
4 KiB
Java
133 lines
4 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 - resource.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;
|
||
|
}
|
||
|
|
||
|
}
|