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