package joshie.harvest.cooking.recipe;
import joshie.harvest.api.cooking.Ingredient;
import joshie.harvest.api.cooking.IngredientStack;
import joshie.harvest.api.cooking.Recipe;
import joshie.harvest.api.cooking.Utensil;
import joshie.harvest.cooking.CookingAPI;
import joshie.harvest.cooking.HFCooking;
import joshie.harvest.cooking.item.ItemMeal.Meal;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import static joshie.harvest.core.lib.HFModInfo.MODID;
public class RecipeHelper {
private static Recipe addRecipe(String mealname, Utensil utensil, float hungerModifier, float modifier, int eatTimer, Ingredient... ingredients) {
//Time to calculate hunger and saturation from the base ingredients
int hunger = 0;
float saturation = 0F;
for (Ingredient ingredient: ingredients) {
int internalHunger = ingredient.getHunger();
if (internalHunger == 0) {
float internalSaturation = 0F;
for (Ingredient test : ingredient.getEquivalents()) {
if (internalHunger == 0 || (test.getSellValue() != 0) && test.getHunger() < internalHunger) {
internalHunger = test.getHunger();
internalSaturation = test.getSaturation();
}
}
hunger += internalHunger;
saturation += internalSaturation;
} else {
hunger += ingredient.getHunger();
saturation += ingredient.getSaturation();
}
}
hunger = (int)Math.min(20, Math.max(1, hunger * hungerModifier));
saturation = Math.min(1F, Math.max(0.2F, saturation * modifier));
//Add the recipe
ResourceLocation resource = new ResourceLocation(MODID, mealname);
Recipe recipe = new RecipeHF(resource, utensil, hunger, saturation, toIngredientStacks(ingredients)).setEatTimer(eatTimer);
//TODO: Remove in 0.7+
recipe.setRegistryName(resource);
//TODO: Remove in 0.7+
CookingAPI.REGISTRY.register(recipe);
return recipe;
}
private static Recipe addRecipe(String name, ItemStack result, Utensil utensil, Ingredient... ingredients) {
ResourceLocation resource = new ResourceLocation(MODID, name);
Recipe recipe = new RecipeVanilla(resource, result, utensil, toIngredientStacks(ingredients));
//TODO: Remove in 0.7+
recipe.setRegistryName(resource);
//TODO: Remove in 0.7+
CookingAPI.REGISTRY.register(recipe);
return recipe;
}
public static IngredientStack[] toIngredientStacks(Ingredient[] ingredients) {
IngredientStack[] stacks = new IngredientStack[ingredients.length];
for (int i = 0; i < ingredients.length; i++) {
stacks[i] = new IngredientStack(ingredients[i], 1);
}
return stacks;
}
private static Recipe addRecipe(String mealname, Utensil utensil, float hungerModifier, float modifier, boolean drink, Ingredient... ingredients) {
int timer = drink ? 24: (int) Math.max(24, Math.ceil(24 * modifier));
Recipe ret = addRecipe(mealname, utensil, hungerModifier, modifier, timer, ingredients);
if(drink) ret.setIsDrink();
return ret;
}
public static Recipe addFryingPanRecipe(Meal meal, float hungerModifier, float modifier, Ingredient... ingredients) {
return addRecipe(meal.getName(), HFCooking.FRYING_PAN, hungerModifier, modifier, false, ingredients);
}
@SuppressWarnings("unused")
public static void addFryingPanRecipe(String mealname, ItemStack result, Ingredient... ingredients) {
addRecipe(mealname, result, HFCooking.FRYING_PAN, ingredients);
}
public static Recipe addMixerRecipe(Meal meal, boolean isDrink, float hungerModifier, float modifier, Ingredient... ingredients) {
return addRecipe(meal.getName(), HFCooking.MIXER, hungerModifier, modifier, isDrink, ingredients);
}
public static Recipe addMixerRecipe(Meal meal, float hungerModifier, float modifier, Ingredient... ingredients) {
return addRecipe(meal.getName(), HFCooking.MIXER, hungerModifier, modifier, true, ingredients);
}
public static Recipe addMixerRecipe(String mealname, ItemStack result, Ingredient... ingredients) {
return addRecipe(mealname, result, HFCooking.MIXER, ingredients);
}
public static Recipe addNoUtensilRecipe(Meal meal, float hungerModifier, float modifier, Ingredient... ingredients) {
return addRecipe(meal.getName(), HFCooking.COUNTER, hungerModifier, modifier, false, ingredients);
}
public static Recipe addNoUtensilRecipe(String mealname, ItemStack result, Ingredient... ingredients) {
return addRecipe(mealname, result, HFCooking.COUNTER, ingredients);
}
public static Recipe addPotRecipe(Meal meal, boolean isDrink, float hungerModifier, float modifier, Ingredient... ingredients) {
return addRecipe(meal.getName(), HFCooking.POT, hungerModifier, modifier, isDrink, ingredients);
}
public static Recipe addPotRecipe(Meal meal, float hungerModifier, float modifier, Ingredient... ingredients) {
return addRecipe(meal.getName(), HFCooking.POT, hungerModifier, modifier, false, ingredients);
}
public static Recipe addPotRecipe(String mealname, ItemStack result, Ingredient... ingredients) {
return addRecipe(mealname, result, HFCooking.POT, ingredients);
}
public static Recipe addOvenRecipe(Meal meal, float hungerModifier, float modifier, Ingredient... ingredients) {
return addRecipe(meal.getName(), HFCooking.OVEN, hungerModifier, modifier, false, ingredients);
}
public static Recipe addOvenRecipe(String mealname, ItemStack result, Ingredient... ingredients) {
return addRecipe(mealname, result, HFCooking.OVEN, ingredients);
}
}