    001package net.minecraftforge.liquids;
    002
    003import static cpw.mods.fml.relauncher.Side.CLIENT;
    004
    005import com.google.common.base.Objects;
    006
    007import cpw.mods.fml.relauncher.SideOnly;
    008import net.minecraft.block.Block;
    009import net.minecraft.block.BlockFluid;
    010import net.minecraft.client.renderer.texture.TextureManager;
    011import net.minecraft.item.Item;
    012import net.minecraft.item.ItemStack;
    013import net.minecraft.nbt.NBTTagCompound;
    014import net.minecraft.util.Icon;
    015
    016/**
    017 * ItemStack substitute for liquids
    018 * @author SirSengir
    019 */
    020public class LiquidStack
    021{
    022    public int itemID;
    023    public int amount;
    024    public int itemMeta;
    025
    026    private LiquidStack(){}
    027
    028    public LiquidStack(int itemID,  int amount) { this(itemID,        amount, 0); }
    029    public LiquidStack(Item item,   int amount) { this(item.itemID,   amount, 0); }
    030    public LiquidStack(Block block, int amount) { this(block.blockID, amount, 0); }
    031
    032    public LiquidStack(int itemID, int amount, int itemDamage)
    033    {
    034        this.itemID = itemID;
    035        this.amount = amount;
    036        this.itemMeta = itemDamage;
    037    }
    038
    039    public NBTTagCompound writeToNBT(NBTTagCompound nbt)
    040    {
    041        nbt.setShort("Id", (short)itemID);
    042        nbt.setInteger("Amount", amount);
    043        nbt.setShort("Meta", (short)itemMeta);
    044        return nbt;
    045    }
    046
    047    public void readFromNBT(NBTTagCompound nbt)
    048    {
    049        itemID = nbt.getShort("Id");
    050        amount = nbt.getInteger("Amount");
    051        itemMeta = nbt.getShort("Meta");
    052    }
    053
    054    /**
    055     * @return A copy of this LiquidStack
    056     */
    057    public LiquidStack copy()
    058    {
    059        return new LiquidStack(itemID, amount, itemMeta);
    060    }
    061
    062    /**
    063     * @param other
    064     * @return true if this LiquidStack contains the same liquid as the one passed in.
    065     */
    066    public boolean isLiquidEqual(LiquidStack other)
    067    {
    068        return other != null && itemID == other.itemID && itemMeta == other.itemMeta;
    069    }
    070
    071    /**
    072     * @param other
    073     * @return true if this LiquidStack contains the other liquid (liquids are equal and amount >= other.amount).
    074     */
    075    public boolean containsLiquid(LiquidStack other)
    076    {
    077        return isLiquidEqual(other) && amount >= other.amount;
    078    }
    079
    080    /**
    081     * @param other ItemStack containing liquids.
    082     * @return true if this LiquidStack contains the same liquid as the one passed in.
    083     */
    084    public boolean isLiquidEqual(ItemStack other)
    085    {
    086        if (other == null)
    087        {
    088            return false;
    089        }
    090
    091        if (itemID == other.itemID && itemMeta == other.getItemDamage())
    092        {
    093            return true;
    094        }
    095
    096        return isLiquidEqual(LiquidContainerRegistry.getLiquidForFilledItem(other));
    097    }
    098
    099    /**
    100     * @return ItemStack representation of this LiquidStack
    101     */
    102    public ItemStack asItemStack()
    103    {
    104        return new ItemStack(itemID, 1, itemMeta);
    105    }
    106
    107    /**
    108     * Reads a liquid stack from the passed nbttagcompound and returns it.
    109     *
    110     * @param nbt
    111     * @return the liquid stack
    112     */
    113    public static LiquidStack loadLiquidStackFromNBT(NBTTagCompound nbt)
    114    {
    115        LiquidStack liquidstack = new LiquidStack();
    116        liquidstack.readFromNBT(nbt);
    117        return liquidstack.itemID == 0 ? null : liquidstack;
    118    }
    119
    120    @SideOnly(CLIENT)
    121    private Icon renderingIcon;
    122
    123    @SideOnly(CLIENT)
    124    public Icon getRenderingIcon()
    125    {
    126        if (itemID == Block.waterStill.blockID)
    127        {
    128            return BlockFluid.func_94424_b("water");
    129        }
    130        else if (itemID == Block.lavaStill.blockID)
    131        {
    132            return BlockFluid.func_94424_b("lava");
    133        }
    134        return renderingIcon;
    135    }
    136
    137    @SideOnly(CLIENT)
    138    public void setRenderingIcon(Icon icon)
    139    {
    140        this.renderingIcon = icon;
    141    }
    142
    143    @Override
    144    public final int hashCode()
    145    {
    146        return Objects.hashCode(itemID, itemMeta);
    147    }
    148
    149    @Override
    150    public final boolean equals(Object ob)
    151    {
    152        return ob instanceof LiquidStack && Objects.equal(((LiquidStack)ob).itemID, itemID) && Objects.equal(((LiquidStack)ob).itemMeta, itemMeta);
    153    }
    154}