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