    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            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 null;
    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 null;
    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    }