package codechicken.nei.recipe; import codechicken.nei.NEIClientUtils; import codechicken.nei.NEIServerUtils; import codechicken.nei.PositionedStack; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.CraftingManager; import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.ShapelessRecipes; import net.minecraftforge.oredict.ShapelessOreRecipe; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class ShapelessRecipeHandler extends ShapedRecipeHandler { public int[][] stackorder = new int[][] { { 0, 0 }, { 1, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 1, 2 }, { 2, 0 }, { 2, 1 }, { 2, 2 } }; public class CachedShapelessRecipe extends CachedRecipe { public CachedShapelessRecipe() { ingredients = new ArrayList<PositionedStack>(); } public CachedShapelessRecipe(ItemStack output) { this(); setResult(output); } public CachedShapelessRecipe(Object[] input, ItemStack output) { this(Arrays.asList(input), output); } public CachedShapelessRecipe(List<?> input, ItemStack output) { this(output); setIngredients(input); } public void setIngredients(List<?> items) { ingredients.clear(); for (int ingred = 0; ingred < items.size(); ingred++) { PositionedStack stack = new PositionedStack(items.get(ingred), 25 + stackorder[ingred][0] * 18, 6 + stackorder[ingred][1] * 18); stack.setMaxSize(1); ingredients.add(stack); } } public void setResult(ItemStack output) { result = new PositionedStack(output, 119, 24); } @Override public List<PositionedStack> getIngredients() { return getCycledIngredients(cycleticks / 20, ingredients); } @Override public PositionedStack getResult() { return result; } public ArrayList<PositionedStack> ingredients; public PositionedStack result; } public String getRecipeName() { return NEIClientUtils.translate("recipe.shapeless"); } @Override public void loadCraftingRecipes(String outputId, Object... results) { if (outputId.equals("crafting") && getClass() == ShapelessRecipeHandler.class) { List<IRecipe> allrecipes = CraftingManager.getInstance().getRecipeList(); for (IRecipe irecipe : allrecipes) { CachedShapelessRecipe recipe = null; if (irecipe instanceof ShapelessRecipes) { recipe = shapelessRecipe((ShapelessRecipes) irecipe); } else if (irecipe instanceof ShapelessOreRecipe) { recipe = forgeShapelessRecipe((ShapelessOreRecipe) irecipe); } if (recipe == null) { continue; } arecipes.add(recipe); } } else { super.loadCraftingRecipes(outputId, results); } } @Override public void loadCraftingRecipes(ItemStack result) { List<IRecipe> allrecipes = CraftingManager.getInstance().getRecipeList(); for (IRecipe irecipe : allrecipes) { if (NEIServerUtils.areStacksSameTypeCrafting(irecipe.getRecipeOutput(), result)) { CachedShapelessRecipe recipe = null; if (irecipe instanceof ShapelessRecipes) { recipe = shapelessRecipe((ShapelessRecipes) irecipe); } else if (irecipe instanceof ShapelessOreRecipe) { recipe = forgeShapelessRecipe((ShapelessOreRecipe) irecipe); } if (recipe == null) { continue; } arecipes.add(recipe); } } } @Override public void loadUsageRecipes(ItemStack ingredient) { List<IRecipe> allrecipes = CraftingManager.getInstance().getRecipeList(); for (IRecipe irecipe : allrecipes) { CachedShapelessRecipe recipe = null; if (irecipe instanceof ShapelessRecipes) { recipe = shapelessRecipe((ShapelessRecipes) irecipe); } else if (irecipe instanceof ShapelessOreRecipe) { recipe = forgeShapelessRecipe((ShapelessOreRecipe) irecipe); } if (recipe == null) { continue; } if (recipe.contains(recipe.ingredients, ingredient)) { recipe.setIngredientPermutation(recipe.ingredients, ingredient); arecipes.add(recipe); } } } private CachedShapelessRecipe shapelessRecipe(ShapelessRecipes recipe) { if (recipe.recipeItems == null) //because some mod subclasses actually do this { return null; } return new CachedShapelessRecipe(recipe.recipeItems, recipe.getRecipeOutput()); } public CachedShapelessRecipe forgeShapelessRecipe(ShapelessOreRecipe recipe) { ArrayList<Object> items = recipe.getInput(); for (Object item : items) { if (item instanceof List && ((List<?>) item).isEmpty())//ore handler, no ores { return null; } } return new CachedShapelessRecipe(items, recipe.getRecipeOutput()); } @Override public boolean isRecipe2x2(int recipe) { return getIngredientStacks(recipe).size() <= 4; } }