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.src.Block;
013    import net.minecraft.src.Item;
014    import net.minecraft.src.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            registerLiquid(new LiquidContainerData(new LiquidStack(Block.waterStill, LiquidContainerRegistry.BUCKET_VOLUME), new ItemStack(Item.bucketWater), new ItemStack(Item.bucketEmpty)));
032            registerLiquid(new LiquidContainerData(new LiquidStack(Block.lavaStill, LiquidContainerRegistry.BUCKET_VOLUME),  new ItemStack(Item.bucketLava), new ItemStack(Item.bucketEmpty)));
033            registerLiquid(new LiquidContainerData(new LiquidStack(Block.waterStill, LiquidContainerRegistry.BUCKET_VOLUME), new ItemStack(Item.potion), new ItemStack(Item.glassBottle)));
034            // registerLiquid(new LiquidContainerData(new LiquidStack(Item.bucketMilk, LiquidContainerRegistry.BUCKET_VOLUME), new ItemStack(Item.bucketMilk), new ItemStack(Item.bucketEmpty)));
035        }
036    
037        /**
038         * To register a container with a non-bucket size, the LiquidContainerData entry simply needs to use a size other than LiquidManager.BUCKET_VOLUME
039         */
040        public static void registerLiquid(LiquidContainerData data) {
041    
042            mapFilledItemFromLiquid.put(Arrays.asList(data.container.itemID, data.container.getItemDamage(), data.stillLiquid.itemID, data.stillLiquid.itemMeta), data);
043            mapLiquidFromFilledItem.put(Arrays.asList(data.filled.itemID, data.filled.getItemDamage()), data);
044            setContainerValidation.add(Arrays.asList(data.container.itemID, data.container.getItemDamage()));
045            setLiquidValidation.add(Arrays.asList(data.stillLiquid.itemID, data.stillLiquid.itemMeta));
046    
047            liquids.add(data);
048        }
049    
050        public static LiquidStack getLiquidForFilledItem(ItemStack filledContainer) {
051    
052            if (filledContainer == null) {
053                return null;
054            }
055            LiquidContainerData ret = mapLiquidFromFilledItem.get(Arrays.asList(filledContainer.itemID, filledContainer.getItemDamage()));
056            if (ret != null) {
057                return ret.stillLiquid.copy();
058            }
059            return null;
060        }
061    
062        public static ItemStack fillLiquidContainer(LiquidStack liquid, ItemStack emptyContainer) {
063    
064            if (emptyContainer == null || liquid == null) {
065                return emptyContainer;
066            }
067            LiquidContainerData ret = mapFilledItemFromLiquid.get(Arrays.asList(emptyContainer.itemID, emptyContainer.getItemDamage(), liquid.itemID, liquid.itemMeta));
068            if (ret != null) {
069                if (liquid.amount >= ret.stillLiquid.amount) {
070                    return ret.filled.copy();
071                }
072            }
073            return emptyContainer;
074        }
075    
076        public static boolean containsLiquid(ItemStack filledContainer, LiquidStack liquid) {
077    
078            if (filledContainer == null || liquid == null) {
079                return false;
080            }
081            LiquidContainerData ret = mapLiquidFromFilledItem.get(Arrays.asList(filledContainer.itemID, filledContainer.getItemDamage()));
082            if (ret != null) {
083                return ret.stillLiquid.isLiquidEqual(liquid);
084            }
085            return false;
086        }
087    
088        public static boolean isBucket(ItemStack container) {
089    
090            if (container == null) {
091                return false;
092            }
093    
094            if (container.isItemEqual(EMPTY_BUCKET)) {
095                return true;
096            }
097    
098            LiquidContainerData ret = mapLiquidFromFilledItem.get(Arrays.asList(container.itemID, container.getItemDamage()));
099            if (ret != null) {
100                return ret.container.isItemEqual(EMPTY_BUCKET);
101            }
102            return false;
103        }
104    
105        public static boolean isContainer(ItemStack container) {
106    
107            return isEmptyContainer(container) || isFilledContainer(container);
108        }
109    
110        public static boolean isEmptyContainer(ItemStack emptyContainer) {
111    
112            if (emptyContainer == null) {
113                return false;
114            }
115            return setContainerValidation.contains(Arrays.asList(emptyContainer.itemID, emptyContainer.getItemDamage()));
116        }
117    
118        public static boolean isFilledContainer(ItemStack filledContainer) {
119    
120            if (filledContainer == null) {
121                return false;
122            }
123            return getLiquidForFilledItem(filledContainer) != null;
124        }
125    
126        public static boolean isLiquid(ItemStack item) {
127    
128            if (item == null) {
129                return false;
130            }
131            return setLiquidValidation.contains(Arrays.asList(item.itemID, item.getItemDamage()));
132        }
133    
134        public static LiquidContainerData[] getRegisteredLiquidContainerData() {
135    
136            return liquids.toArray(new LiquidContainerData[0]);
137        }
138    }