001    
002    package net.minecraftforge.liquids;
003    
004    import java.util.ArrayList;
005    import java.util.Arrays;
006    import java.util.HashMap;
007    import java.util.HashSet;
008    import java.util.List;
009    import java.util.Map;
010    import java.util.Set;
011    
012    import net.minecraft.block.Block;
013    import net.minecraft.item.Item;
014    import net.minecraft.item.ItemStack;
015    
016    public class LiquidContainerRegistry
017    {
018        public static final int BUCKET_VOLUME = 1000;
019        public static final ItemStack EMPTY_BUCKET = new ItemStack(Item.bucketEmpty);
020    
021        private static Map<List, LiquidContainerData> mapFilledItemFromLiquid = new HashMap();
022        private static Map<List, LiquidContainerData> mapLiquidFromFilledItem = new HashMap();
023        private static Set<List> setContainerValidation = new HashSet();
024        private static Set<List> setLiquidValidation = new HashSet();
025        private static ArrayList<LiquidContainerData> liquids = new ArrayList();
026    
027        /**
028         * Default registrations
029         */
030        static
031        {
032            registerLiquid(new LiquidContainerData(new LiquidStack(Block.waterStill, LiquidContainerRegistry.BUCKET_VOLUME), new ItemStack(Item.bucketWater), new ItemStack(Item.bucketEmpty)));
033            registerLiquid(new LiquidContainerData(new LiquidStack(Block.lavaStill, LiquidContainerRegistry.BUCKET_VOLUME),  new ItemStack(Item.bucketLava), new ItemStack(Item.bucketEmpty)));
034            registerLiquid(new LiquidContainerData(new LiquidStack(Block.waterStill, LiquidContainerRegistry.BUCKET_VOLUME), new ItemStack(Item.potion), new ItemStack(Item.glassBottle)));
035            // registerLiquid(new LiquidContainerData(new LiquidStack(Item.bucketMilk, LiquidContainerRegistry.BUCKET_VOLUME), new ItemStack(Item.bucketMilk), new ItemStack(Item.bucketEmpty)));
036        }
037    
038        /**
039         * To register a container with a non-bucket size, the LiquidContainerData entry simply needs to use a size other than LiquidManager.BUCKET_VOLUME
040         */
041        public static void registerLiquid(LiquidContainerData data)
042        {
043            mapFilledItemFromLiquid.put(Arrays.asList(data.container.itemID, data.container.getItemDamage(), data.stillLiquid.itemID, data.stillLiquid.itemMeta), data);
044            mapLiquidFromFilledItem.put(Arrays.asList(data.filled.itemID, data.filled.getItemDamage()), data);
045            setContainerValidation.add(Arrays.asList(data.container.itemID, data.container.getItemDamage()));
046            setLiquidValidation.add(Arrays.asList(data.stillLiquid.itemID, data.stillLiquid.itemMeta));
047    
048            liquids.add(data);
049        }
050    
051        public static LiquidStack getLiquidForFilledItem(ItemStack filledContainer)
052        {
053            if (filledContainer == null)
054            {
055                return null;
056            }
057    
058            LiquidContainerData ret = mapLiquidFromFilledItem.get(Arrays.asList(filledContainer.itemID, filledContainer.getItemDamage()));
059            return ret == null ? null : ret.stillLiquid.copy();
060        }
061    
062        public static ItemStack fillLiquidContainer(LiquidStack liquid, ItemStack emptyContainer)
063        {
064            if (emptyContainer == null || liquid == null)
065            {
066                return null;
067            }
068    
069            LiquidContainerData ret = mapFilledItemFromLiquid.get(Arrays.asList(emptyContainer.itemID, emptyContainer.getItemDamage(), liquid.itemID, liquid.itemMeta));
070    
071            if (ret != null && liquid.amount >= ret.stillLiquid.amount)
072            {
073                return ret.filled.copy();
074            }
075    
076            return null;
077        }
078    
079        public static boolean containsLiquid(ItemStack filledContainer, LiquidStack liquid)
080        {
081            if (filledContainer == null || liquid == null)
082            {
083                return false;
084            }
085    
086            LiquidContainerData ret = mapLiquidFromFilledItem.get(Arrays.asList(filledContainer.itemID, filledContainer.getItemDamage()));
087    
088            return ret != null && ret.stillLiquid.isLiquidEqual(liquid);
089        }
090    
091        public static boolean isBucket(ItemStack container)
092        {
093            if (container == null)
094            {
095                return false;
096            }
097    
098            if (container.isItemEqual(EMPTY_BUCKET))
099            {
100                return true;
101            }
102    
103            LiquidContainerData ret = mapLiquidFromFilledItem.get(Arrays.asList(container.itemID, container.getItemDamage()));
104            return ret != null && ret.container.isItemEqual(EMPTY_BUCKET);
105        }
106    
107        public static boolean isContainer(ItemStack container)
108        {
109            return isEmptyContainer(container) || isFilledContainer(container);
110        }
111    
112        public static boolean isEmptyContainer(ItemStack emptyContainer)
113        {
114            return emptyContainer != null && setContainerValidation.contains(Arrays.asList(emptyContainer.itemID, emptyContainer.getItemDamage()));
115        }
116    
117        public static boolean isFilledContainer(ItemStack filledContainer)
118        {
119            return filledContainer != null && getLiquidForFilledItem(filledContainer) != null;
120        }
121    
122        public static boolean isLiquid(ItemStack item)
123        {
124            return item != null && setLiquidValidation.contains(Arrays.asList(item.itemID, item.getItemDamage()));
125        }
126    
127        public static LiquidContainerData[] getRegisteredLiquidContainerData()
128        {
129            return liquids.toArray(new LiquidContainerData[liquids.size()]);
130        }
131    }