001    package net.minecraftforge.liquids;
002    
003    import java.util.HashMap;
004    import java.util.Map;
005    
006    import net.minecraft.item.ItemStack;
007    import net.minecraftforge.common.MinecraftForge;
008    import net.minecraftforge.event.Event;
009    import net.minecraftforge.oredict.OreDictionary.OreRegisterEvent;
010    
011    import com.google.common.collect.ImmutableMap;
012    
013    /**
014     * When creating liquids you should register them with this class.
015     *
016     * @author CovertJaguar <railcraft.wikispaces.com>
017     */
018    public abstract class LiquidDictionary
019    {
020    
021        private static Map<String, LiquidStack> liquids = new HashMap<String, LiquidStack>();
022    
023        /**
024         * When creating liquids you should call this function.
025         *
026         * Upon passing it a name and liquid item it will return either
027         * a preexisting implementation of that liquid or the liquid passed in.
028         *
029         *
030         * @param name the name of the liquid
031         * @param liquid the liquid to use if one doesn't exist
032         * @return
033         */
034        public static LiquidStack getOrCreateLiquid(String name, LiquidStack liquid)
035        {
036            LiquidStack existing = liquids.get(name);
037            if(existing != null) {
038                return existing.copy();
039            }
040            liquids.put(name, liquid.copy());
041            MinecraftForge.EVENT_BUS.post(new LiquidRegisterEvent(name, liquid));
042            return liquid;
043        }
044    
045        /**
046         * Returns the liquid matching the name,
047         * if such a liquid exists.
048         *
049         * Can return null.
050         *
051         * @param name the name of the liquid
052         * @param amount the amout of liquid
053         * @return
054         */
055        public static LiquidStack getLiquid(String name, int amount)
056        {
057            LiquidStack liquid = liquids.get(name);
058            if(liquid == null)
059                return null;
060    
061            liquid = liquid.copy();
062            liquid.amount = amount;
063            return liquid;
064        }
065    
066        /**
067         * Get an immutable list of the liquids defined
068         *
069         * @return the defined liquids
070         */
071        public static Map<String, LiquidStack> getLiquids()
072        {
073            return ImmutableMap.copyOf(liquids);
074        }
075        /**
076         * Fired when a new liquid is created
077         *
078         * @author cpw
079         *
080         */
081        public static class LiquidRegisterEvent extends Event
082        {
083            public final String Name;
084            public final LiquidStack Liquid;
085    
086            public LiquidRegisterEvent(String name, LiquidStack liquid)
087            {
088                this.Name = name;
089                this.Liquid = liquid.copy();
090            }
091        }
092    }