package crazypants.enderio.machine; import java.util.List; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; import crazypants.enderio.machine.recipe.RecipeBonusType; /** * A MachineRecipe implementation must be stateless, always returning the same * values given the same parameters. The 'in progress' recipe for a machine is * stored to and retrieved from a machines TileEntity soley based on its UID. * * @author cp * */ public interface IMachineRecipe { /** * Returns the globally unique ID for the recipe. * * @return */ String getUid(); /** * The amount total number of MJ required to craft the recipe based on the * inputs. The amount returned should be for a single 'cycle' of the recipe. * For examples, if the inputs would allow the recipe to completed 10 times, * this method should only return the amount of energy used for a single * cycle. * * @param inputs * @return */ int getEnergyRequired(MachineRecipeInput... inputs); /** * Returns the how bonus should be handled for this input **/ RecipeBonusType getBonusType(MachineRecipeInput... inputs); /** * Only returns true if output can be generated using these inputs. If * partially complete inputs are provided (for example only one of two * required inputs are present) the method should return false. * * @param inputs * @return */ public boolean isRecipe(MachineRecipeInput... inputs); /** * Returns the output from a single 'cycle' of the recipe (even if the inputs * would allow the recipe to be crafted several times). * * This method must not return null. If no output is generated an empty array * should be returned. * * @param randomChance * a random number to be used as a seed for determining whether '% * chance' outputs are returned. This value is in the range 0-1. * @param inputs * @return */ ResultStack[] getCompletedResult(float randomChance, MachineRecipeInput... inputs); /** * Returns the experience a user gains when this recipe has generated the * specified output. If the output is the result of several recipe cycles, the * accumulated total of experience gained for all cycles should be returned. * * @param output * @return */ float getExperienceForOutput(ItemStack output); /** * Should return true if the specified parameter is can be used in this * recipe. * * @param input * @return */ boolean isValidInput(MachineRecipeInput input); /** * The name of the machine this recipe can be crafted by. * * @return */ String getMachineName(); /** * Returns the quantity of inputs consumed by a single cycle of the recipe. * * @param inputs * @return */ List<MachineRecipeInput> getQuantitiesConsumed(MachineRecipeInput[] inputs); public static class ResultStack { public final ItemStack item; public final FluidStack fluid; public ResultStack(ItemStack item, FluidStack fluid) { this.item = item; this.fluid = fluid; } public ResultStack(ItemStack item) { this.item = item; this.fluid = null; } public ResultStack(FluidStack fluid) { this.item = null; this.fluid = fluid; } } }