package de.ellpeck.actuallyadditions.mod.util.crafting; import de.ellpeck.actuallyadditions.api.misc.IDisableableItem; import de.ellpeck.actuallyadditions.mod.ActuallyAdditions; import de.ellpeck.actuallyadditions.mod.RegistryHandler; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.Ingredient; import net.minecraft.item.crafting.ShapedRecipes; import net.minecraft.item.crafting.ShapelessRecipes; import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.crafting.CraftingHelper; import net.minecraftforge.common.crafting.CraftingHelper.ShapedPrimer; import net.minecraftforge.oredict.OreIngredient; import java.util.List; //This class created by Shadows_of_Fire //MIT License public final class RecipeHelper { private static int j = 0; private static final String MODID = ActuallyAdditions.MODID; private static final String MODNAME = ActuallyAdditions.NAME; public static final List RECIPE_LIST = RegistryHandler.RECIPES_TO_REGISTER; /* * This adds the recipe to the list of crafting recipes. Since who cares about names, it adds it as recipesX, where X is the current recipe you are adding. */ public static void addRecipe(int j, IRecipe rec) { addRecipe("recipes" + j, rec); } /* * This adds the recipe to the list of crafting recipes. Cares about names. */ public static void addRecipe(String name, IRecipe rec) { Item i = rec.getRecipeOutput().getItem(); if (i instanceof IDisableableItem && ((IDisableableItem) i).isDisabled()) rec = new BlankRecipe(); if (rec.getRegistryName() == null) { RECIPE_LIST.add(rec.setRegistryName(new ResourceLocation(MODID, name))); } else { RECIPE_LIST.add(rec); } RecipeHandler.lastRecipe = rec; } /* * This adds a shaped recipe to the list of crafting recipes, using the forge format. */ public static void addOldShaped(ItemStack output, Object... input) { ShapedPrimer primer = CraftingHelper.parseShaped(input); addRecipe(j++, new ShapedRecipes(new ResourceLocation(MODID, "recipes" + j).toString(), primer.width, primer.height, primer.input, output)); } /* * This adds a shaped recipe to the list of crafting recipes, using the forge format, with a custom group. */ public static void addOldShaped(String group, ItemStack output, Object... input) { ShapedPrimer primer = CraftingHelper.parseShaped(input); addRecipe(j++, new ShapedRecipes(new ResourceLocation(MODID, group).toString(), primer.width, primer.height, primer.input, output)); } /* * This adds a shaped recipe to the list of crafting recipes, using the forge format, with a custom group. */ public static void addOldShaped(String name, String group, ItemStack output, Object... input) { ShapedPrimer primer = CraftingHelper.parseShaped(input); addRecipe(j++, new ShapedRecipes(new ResourceLocation(MODID, group).toString(), primer.width, primer.height, primer.input, output).setRegistryName(MODID, name)); } /* * This adds a shapeless recipe to the list of crafting recipes, using the forge format. */ public static void addOldShapeless(ItemStack output, Object... input) { addRecipe(j++, new ShapelessRecipes(new ResourceLocation(MODID, "recipes" + j).toString(), output, createInput(input))); } /* * This adds a shapeless recipe to the list of crafting recipes, using the forge format, with a custom group. */ public static void addOldShapeless(String group, ItemStack output, Object... input) { addRecipe(j++, new ShapelessRecipes(new ResourceLocation(MODID, group).toString(), output, createInput(input))); } public static void addOldShapeless(String name, String group, ItemStack output, Object... input) { addRecipe(j++, new ShapelessRecipes(new ResourceLocation(MODID, group).toString(), output, createInput(input)).setRegistryName(MODID, name)); } /* * Adds a shapeless recipe with X output using an array of inputs. Use Strings for OreDictionary support. This array is not ordered. */ public static void addShapeless(ItemStack output, Object... inputs) { addRecipe(j++, new ShapelessRecipes(MODID + ":" + j, output, createInput(inputs))); } public static void addShapeless(Item output, Object... inputs) { addShapeless(new ItemStack(output), inputs); } public static void addShapeless(Block output, Object... inputs) { addShapeless(new ItemStack(output), inputs); } /* * Adds a shapeless recipe with X output using an array of inputs. Use Strings for OreDictionary support. This array is not ordered. This has a custom group. */ public static void addShapeless(String group, ItemStack output, Object... inputs) { addRecipe(j++, new ShapelessRecipes(MODID + ":" + group, output, createInput(inputs))); } public static void addShapeless(String group, Item output, Object... inputs) { addShapeless(group, new ItemStack(output), inputs); } public static void addShapeless(String group, Block output, Object... inputs) { addShapeless(group, new ItemStack(output), inputs); } /* * Adds a shapeless recipe with X output on a crafting grid that is W x H, using an array of inputs. Use null for nothing, use Strings for OreDictionary support, this array must have a length of width * height. * This array is ordered, and items must follow from left to right, top to bottom of the crafting grid. */ public static void addShaped(ItemStack output, int width, int height, Object... input) { addRecipe(j++, genShaped(output, width, height, input)); } public static void addShaped(Item output, int width, int height, Object... input) { addShaped(new ItemStack(output), width, height, input); } public static void addShaped(Block output, int width, int height, Object... input) { addShaped(new ItemStack(output), width, height, input); } /* * Adds a shapeless recipe with X output on a crafting grid that is W x H, using an array of inputs. Use null for nothing, use Strings for OreDictionary support, this array must have a length of width * height. * This array is ordered, and items must follow from left to right, top to bottom of the crafting grid. This has a custom group. */ public static void addShaped(String group, ItemStack output, int width, int height, Object... input) { addRecipe(j++, genShaped(MODID + ":" + group, output, width, height, input)); } public static void addShaped(String group, Item output, int width, int height, Object... input) { addShaped(group, new ItemStack(output), width, height, input); } public static void addShaped(String group, Block output, int width, int height, Object... input) { addShaped(group, new ItemStack(output), width, height, input); } public static ShapedRecipes genShaped(ItemStack output, int l, int w, Object[] input) { if (input[0] instanceof Object[]) { input = (Object[]) input[0]; } if (l * w != input.length) { throw new UnsupportedOperationException("Attempted to add invalid shaped recipe. Complain to the author of " + MODNAME); } NonNullList inputL = NonNullList.create(); for (int i = 0; i < input.length; i++) { Object k = input[i]; if (k instanceof String) { inputL.add(i, new OreIngredient((String) k)); } else if (k instanceof ItemStack && !((ItemStack) k).isEmpty()) { inputL.add(i, Ingredient.fromStacks((ItemStack) k)); } else if (k instanceof Item) { inputL.add(i, Ingredient.fromStacks(new ItemStack((Item) k))); } else if (k instanceof Block) { inputL.add(i, Ingredient.fromStacks(new ItemStack((Block) k))); } else { inputL.add(i, Ingredient.EMPTY); } } return new ShapedRecipes(MODID + ":" + j, l, w, inputL, output); } public static ShapedRecipes genShaped(String group, ItemStack output, int l, int w, Object[] input) { if (input[0] instanceof List) { input = ((List) input[0]).toArray(); } else if (input[0] instanceof Object[]) { input = (Object[]) input[0]; } if (l * w != input.length) { throw new UnsupportedOperationException("Attempted to add invalid shaped recipe. Complain to the author of " + MODNAME); } NonNullList inputL = NonNullList.create(); for (int i = 0; i < input.length; i++) { Object k = input[i]; if (k instanceof String) { inputL.add(i, new OreIngredient((String) k)); } else if (k instanceof ItemStack && !((ItemStack) k).isEmpty()) { inputL.add(i, Ingredient.fromStacks((ItemStack) k)); } else if (k instanceof Item) { inputL.add(i, Ingredient.fromStacks(new ItemStack((Item) k))); } else if (k instanceof Block) { inputL.add(i, Ingredient.fromStacks(new ItemStack((Block) k))); } else if (k instanceof Ingredient) { inputL.add(i, (Ingredient) k); } else { inputL.add(i, Ingredient.EMPTY); } } return new ShapedRecipes(group, l, w, inputL, output); } public static NonNullList createInput(Object[] input) { if (input[0] instanceof List) { input = ((List) input[0]).toArray(); } else if (input[0] instanceof Object[]) { input = (Object[]) input[0]; } NonNullList inputL = NonNullList.create(); for (int i = 0; i < input.length; i++) { Object k = input[i]; if (k instanceof String) { inputL.add(i, new OreIngredient((String) k)); } else if (k instanceof ItemStack) { inputL.add(i, Ingredient.fromStacks((ItemStack) k)); } else if (k instanceof Item) { inputL.add(i, Ingredient.fromStacks(new ItemStack((Item) k))); } else if (k instanceof Block) { inputL.add(i, Ingredient.fromStacks(new ItemStack((Block) k))); } else if (k instanceof Ingredient) { inputL.add(i, (Ingredient) k); } else { throw new UnsupportedOperationException("Attempted to add invalid shapeless recipe. Complain to the author of " + MODNAME); } } return inputL; } }