001    package net.minecraftforge.liquids;
002    
003    import net.minecraft.block.Block;
004    import net.minecraft.item.Item;
005    import net.minecraft.item.ItemStack;
006    import net.minecraft.nbt.NBTTagCompound;
007    
008    /**
009     * ItemStack substitute for liquids
010     * @author SirSengir
011     */
012    public class LiquidStack
013    {
014        public int itemID;
015        public int amount;
016        public int itemMeta;
017    
018        private LiquidStack(){}
019    
020        public LiquidStack(int itemID,  int amount) { this(itemID,        amount, 0); }
021        public LiquidStack(Item item,   int amount) { this(item.itemID,   amount, 0); }
022        public LiquidStack(Block block, int amount) { this(block.blockID, amount, 0); }
023    
024        public LiquidStack(int itemID, int amount, int itemDamage)
025        {
026            this.itemID = itemID;
027            this.amount = amount;
028            this.itemMeta = itemDamage;
029        }
030    
031        public NBTTagCompound writeToNBT(NBTTagCompound nbt) 
032        {
033            nbt.setShort("Id", (short)itemID);
034            nbt.setInteger("Amount", amount);
035            nbt.setShort("Meta", (short)itemMeta);
036            return nbt;
037        }
038    
039        public void readFromNBT(NBTTagCompound nbt)
040        {
041            itemID = nbt.getShort("Id");
042            amount = nbt.getInteger("Amount");
043            itemMeta = nbt.getShort("Meta");
044        }
045    
046        /**
047         * @return A copy of this LiquidStack
048         */
049        public LiquidStack copy()
050        {
051            return new LiquidStack(itemID, amount, itemMeta);
052        }
053    
054        /**
055         * @param other
056         * @return true if this LiquidStack contains the same liquid as the one passed in.
057         */
058        public boolean isLiquidEqual(LiquidStack other)
059        {
060            return other != null && itemID == other.itemID && itemMeta == other.itemMeta;
061        }
062    
063        /**
064         * @param other
065         * @return true if this LiquidStack contains the other liquid (liquids are equal and amount >= other.amount).
066         */
067        public boolean containsLiquid(LiquidStack other)
068        {
069            return isLiquidEqual(other) && amount >= other.amount;
070        }
071    
072        /**
073         * @param other ItemStack containing liquids.
074         * @return true if this LiquidStack contains the same liquid as the one passed in.
075         */
076        public boolean isLiquidEqual(ItemStack other)
077        {
078            return other != null && itemID == other.itemID && itemMeta == other.getItemDamage();
079        }
080    
081        /**
082         * @return ItemStack representation of this LiquidStack
083         */
084        public ItemStack asItemStack()
085        {
086            return new ItemStack(itemID, 1, itemMeta);
087        }
088    
089        /**
090         * Reads a liquid stack from the passed nbttagcompound and returns it.
091         *
092         * @param nbt
093         * @return
094         */
095        public static LiquidStack loadLiquidStackFromNBT(NBTTagCompound nbt)
096        {
097            LiquidStack liquidstack = new LiquidStack();
098            liquidstack.readFromNBT(nbt);
099            return liquidstack.itemID == 0 ? null : liquidstack;
100        }
101    }