|  | package ic2.api.recipe; | 
|  |  | 
|  | import java.util.Map; | 
|  |  | 
|  | import net.minecraft.item.ItemStack; | 
|  |  | 
|  | public interface ICannerBottleRecipeManager { | 
|  | /** | 
|  | * Adds a recipe to the machine. | 
|  | * | 
|  | * @param container Container to be filled | 
|  | * @param fill Item to fill into the container | 
|  | * @param output Filled container | 
|  | */ | 
|  | public void addRecipe(IRecipeInput container, IRecipeInput fill, ItemStack output); | 
|  |  | 
|  | /** | 
|  | * Gets the recipe output for the given input. | 
|  | * | 
|  | * @param container Container to be filled | 
|  | * @param fill Item to fill into the container | 
|  | * @param adjustInput modify the input according to the recipe's requirements | 
|  | * @param acceptTest allow either container or fill to be null to see if either of them is part of a recipe | 
|  | * @return Recipe output, or null if none | 
|  | */ | 
|  | public RecipeOutput getOutputFor(ItemStack container, ItemStack fill, boolean adjustInput, boolean acceptTest); | 
|  |  | 
|  | /** | 
|  | * Gets a list of recipes. | 
|  | * | 
|  | * You're a mad evil scientist if you ever modify this. | 
|  | * | 
|  | * @return List of recipes | 
|  | */ | 
|  | public Map<Input, RecipeOutput> getRecipes(); | 
|  |  | 
|  |  | 
|  | public static class Input { | 
|  | public Input(IRecipeInput container, IRecipeInput fill) { | 
|  | this.container = container; | 
|  | this.fill = fill; | 
|  | } | 
|  |  | 
|  | public boolean matches(ItemStack container, ItemStack fill) { | 
|  | return this.container.matches(container) && this.fill.matches(fill); | 
|  | } | 
|  |  | 
|  | public final IRecipeInput container; | 
|  | public final IRecipeInput fill; | 
|  | } | 
|  | } |