    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        if (liquid == null)
    038        {
    039            throw new NullPointerException("You cannot register a null LiquidStack");
    040        }
    041        LiquidStack existing = liquids.get(name);
    042        if(existing != null) {
    043            return existing.copy();
    044        }
    045        liquids.put(name, liquid.copy());
    046
    047        MinecraftForge.EVENT_BUS.post(new LiquidRegisterEvent(name, liquid));
    048        return liquid;
    049    }
    050
    051    /**
    052     * Returns the liquid matching the name,
    053     * if such a liquid exists.
    054     *
    055     * Can return null.
    056     *
    057     * @param name the name of the liquid
    058     * @param amount the amout of liquid
    059     * @return a liquidstack for the requested liquid
    060     */
    061    public static LiquidStack getLiquid(String name, int amount)
    062    {
    063        LiquidStack liquid = liquids.get(name);
    064        if(liquid == null)
    065            return null;
    066
    067        liquid = liquid.copy();
    068        liquid.amount = amount;
    069        return liquid;
    070    }
    071
    072    public static LiquidStack getCanonicalLiquid(String name)
    073    {
    074        return liquids.get(name);
    075    }
    076    /**
    077     * Get an immutable list of the liquids defined
    078     *
    079     * @return the defined liquids
    080     */
    081    public static Map<String, LiquidStack> getLiquids()
    082    {
    083        return ImmutableMap.copyOf(liquids);
    084    }
    085    /**
    086     * Fired when a new liquid is created
    087     *
    088     */
    089    public static class LiquidRegisterEvent extends Event
    090    {
    091        public final String Name;
    092        public final LiquidStack Liquid;
    093
    094        public LiquidRegisterEvent(String name, LiquidStack liquid)
    095        {
    096            this.Name = name;
    097            this.Liquid = liquid.copy();
    098        }
    099    }
    100
    101    static
    102    {
    103        getOrCreateLiquid("Water", new LiquidStack(Block.waterStill, LiquidContainerRegistry.BUCKET_VOLUME));
    104        getOrCreateLiquid("Lava", new LiquidStack(Block.lavaStill, LiquidContainerRegistry.BUCKET_VOLUME));
    105    }
    106
    107    public static String findLiquidName(LiquidStack reference)
    108    {
    109        if (reference != null)
    110        {
    111            return liquids.inverse().get(reference);
    112        }
    113        else
    114        {
    115            return null;
    116        }
    117    }
    118
    119    public static LiquidStack getCanonicalLiquid(LiquidStack liquidStack)
    120    {
    121        return liquids.get(liquids.inverse().get(liquidStack));
    122    }
    123}