diff --git a/MineTweaker3-API/src/main/java/minetweaker/MineTweakerImplementationAPI.java b/MineTweaker3-API/src/main/java/minetweaker/MineTweakerImplementationAPI.java index c341a38..2ef4e27 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/MineTweakerImplementationAPI.java +++ b/MineTweaker3-API/src/main/java/minetweaker/MineTweakerImplementationAPI.java @@ -33,6 +33,7 @@ import minetweaker.api.mods.IMod; import minetweaker.api.oredict.IOreDict; import minetweaker.api.oredict.IOreDictEntry; import minetweaker.api.player.IPlayer; +import minetweaker.api.recipes.ICraftingRecipe; import minetweaker.api.recipes.IFurnaceManager; import minetweaker.api.recipes.IRecipeManager; import minetweaker.api.server.ICommandFunction; @@ -180,6 +181,56 @@ public class MineTweakerImplementationAPI { } })); + minetweakerCommands.put("recipes", new MineTweakerCommand( + "recipes", + new String[] { + "/minetweaker recipes", + " Lists all crafting recipes in the game", + "/minetweaker recipes hand", + " Lists all crafting recipes for the item in your hand", + " Also copies the recipes to clipboard" + }, new ICommandFunction() { + @Override + public void execute(String[] arguments, IPlayer player) + { + if (arguments.length == 0) { + if (player != null) { + player.sendChat("Generating recipe list, this could take a while..."); + } + + MineTweakerAPI.logCommand("Recipes:"); + for (ICraftingRecipe recipe : MineTweakerAPI.recipes.getAll()) { + MineTweakerAPI.logCommand(recipe.toCommandString()); + } + + if (player != null) { + player.sendChat("Recipe list generated; see minetweaker.log in your minecraft dir"); + } + } else if (arguments[0].equals("hand") && player != null) { + IItemStack item = player.getCurrentItem(); + + List recipes = MineTweakerAPI.recipes.getRecipesFor(item.anyAmount()); + if (recipes.isEmpty()) { + player.sendChat("No crafting recipes found for that item"); + } else { + StringBuilder recipesString = new StringBuilder(); + + for (ICraftingRecipe recipe : recipes) { + MineTweakerAPI.logCommand(recipe.toCommandString()); + player.sendChat(recipe.toCommandString()); + recipesString.append(recipe.toCommandString()).append("\n"); + } + + copyToClipboard(recipesString.toString()); + } + } else { + if (player != null) { + player.sendChat("Invalid arguments for recipes command"); + } + } + } + })); + minetweakerCommands.put("inventory", new MineTweakerCommand( "inventory", new String[] { @@ -201,7 +252,9 @@ public class MineTweakerImplementationAPI { "hand", new String[] { "/minetweaker hand", - " Outputs the name of the item in your hand" + " Outputs the name of the item in your hand", + " Also copies the name to clipboard and prints", + " oredict entries" }, new ICommandFunction() { @Override public void execute(String[] arguments, IPlayer player) { diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/item/IItemStack.java b/MineTweaker3-API/src/main/java/minetweaker/api/item/IItemStack.java index 0a5934a..c295408 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/api/item/IItemStack.java +++ b/MineTweaker3-API/src/main/java/minetweaker/api/item/IItemStack.java @@ -157,6 +157,14 @@ public interface IItemStack extends IIngredient { @ZenMethod public IItemStack withAmount(int amount); + /** + * Creates an item stack with wildcard stack size. + * + * @return new, modified item stack + */ + @ZenMethod + public IItemStack anyAmount(); + /** * Creates an item stack with the given nbt tag. Ignores existing tags. * diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/logger/FileLogger.java b/MineTweaker3-API/src/main/java/minetweaker/api/logger/FileLogger.java index 58753a4..b9770fb 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/api/logger/FileLogger.java +++ b/MineTweaker3-API/src/main/java/minetweaker/api/logger/FileLogger.java @@ -38,7 +38,7 @@ public class FileLogger implements ILogger { @Override public void logCommand(String message) { try { - writer.write("COMMAND: " + message + "\n"); + writer.write(message + "\n"); writer.flush(); } catch (IOException ex) { throw new RuntimeException(ex); diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/recipes/ICraftingRecipe.java b/MineTweaker3-API/src/main/java/minetweaker/api/recipes/ICraftingRecipe.java index abe9997..b579c65 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/api/recipes/ICraftingRecipe.java +++ b/MineTweaker3-API/src/main/java/minetweaker/api/recipes/ICraftingRecipe.java @@ -23,4 +23,6 @@ public interface ICraftingRecipe { public boolean hasTransformers(); public void applyTransformers(ICraftingInventory inventory, IPlayer byPlayer); + + public String toCommandString(); } diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/recipes/IRecipeManager.java b/MineTweaker3-API/src/main/java/minetweaker/api/recipes/IRecipeManager.java index 4172701..b2fb32a 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/api/recipes/IRecipeManager.java +++ b/MineTweaker3-API/src/main/java/minetweaker/api/recipes/IRecipeManager.java @@ -1,9 +1,11 @@ package minetweaker.api.recipes; +import java.util.List; import minetweaker.api.item.IIngredient; import minetweaker.api.item.IItemStack; import stanhebben.zenscript.annotations.ZenClass; import stanhebben.zenscript.annotations.Optional; +import stanhebben.zenscript.annotations.ZenGetter; import stanhebben.zenscript.annotations.ZenMethod; /** @@ -14,6 +16,23 @@ import stanhebben.zenscript.annotations.ZenMethod; */ @ZenClass("minetweaker.recipes.IRecipeManager") public interface IRecipeManager { + /** + * Returns all crafting recipes. + * + * @return all crafting recipes + */ + @ZenGetter("all") + public List getAll(); + + /** + * Returns all crafting recipes resulting in the given ingredient. + * + * @param ingredient ingredient to find + * @return crafting recipes for the given item(s) + */ + @ZenMethod + public List getRecipesFor(IIngredient ingredient); + /** * Removes all crafting recipes crafting the specified item. * diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/recipes/ShapedRecipe.java b/MineTweaker3-API/src/main/java/minetweaker/api/recipes/ShapedRecipe.java index 2f65d88..7a18115 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/api/recipes/ShapedRecipe.java +++ b/MineTweaker3-API/src/main/java/minetweaker/api/recipes/ShapedRecipe.java @@ -217,6 +217,39 @@ public class ShapedRecipe implements ICraftingRecipe { } } + @Override + public String toCommandString() { + StringBuilder result = new StringBuilder(); + result.append("recipes.addShaped("); + result.append(output); + result.append(", ["); + + IIngredient[][] ingredientsArray = new IIngredient[height][width]; + for (int i = 0; i < ingredients.length; i++) { + ingredientsArray[posy[i]][posx[i]] = ingredients[i]; + } + + for (int i = 0; i < ingredientsArray.length; i++) { + if (i > 0) { + result.append(", "); + } + + result.append("["); + + for (int j = 0; j < ingredientsArray[i].length; j++) { + if (j > 0) + result.append(", "); + + result.append(ingredientsArray[i][j]); + } + + result.append("]"); + } + + result.append("]);"); + return result.toString(); + } + private IItemStack doRecipe( ICraftingInventory inventory, IItemStack[] stacks, diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/recipes/ShapelessRecipe.java b/MineTweaker3-API/src/main/java/minetweaker/api/recipes/ShapelessRecipe.java index 88c8522..6de1c27 100644 --- a/MineTweaker3-API/src/main/java/minetweaker/api/recipes/ShapelessRecipe.java +++ b/MineTweaker3-API/src/main/java/minetweaker/api/recipes/ShapelessRecipe.java @@ -80,6 +80,26 @@ public class ShapelessRecipe implements ICraftingRecipe { } } + @Override + public String toCommandString() { + StringBuilder result = new StringBuilder(); + + result.append("recipes.addShapeless("); + result.append(output); + result.append(", ["); + + for (int i = 0; i < ingredients.length; i++) { + if (i > 0) + result.append(", "); + + result.append(ingredients[i]); + } + + result.append("]);"); + + return result.toString(); + } + /** * Reorders ingredients to match the given shapeless recipe. * diff --git a/MineTweaker3-API/src/main/java/minetweaker/api/recipes/UnknownRecipe.java b/MineTweaker3-API/src/main/java/minetweaker/api/recipes/UnknownRecipe.java new file mode 100644 index 0000000..dfe818c --- /dev/null +++ b/MineTweaker3-API/src/main/java/minetweaker/api/recipes/UnknownRecipe.java @@ -0,0 +1,47 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package minetweaker.api.recipes; + +import minetweaker.api.item.IItemStack; +import minetweaker.api.player.IPlayer; + +/** + * + * @author Stan + */ +public class UnknownRecipe implements ICraftingRecipe { + private final IItemStack output; + + public UnknownRecipe(IItemStack output) { + this.output = output; + } + + @Override + public boolean matches(ICraftingInventory inventory) { + return false; + } + + @Override + public IItemStack getCraftingResult(ICraftingInventory inventory) { + return output; + } + + @Override + public boolean hasTransformers() { + return false; + } + + @Override + public void applyTransformers(ICraftingInventory inventory, IPlayer byPlayer) { + + } + + @Override + public String toCommandString() { + return "// unknown recipe type for " + output; + } +} diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/api/minecraft/MineTweakerMC.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/api/minecraft/MineTweakerMC.java index c58cf01..9b18a09 100644 --- a/MineTweaker3-MC164-Main/src/main/java/minetweaker/api/minecraft/MineTweakerMC.java +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/api/minecraft/MineTweakerMC.java @@ -1,5 +1,6 @@ package minetweaker.api.minecraft; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -415,6 +416,20 @@ public class MineTweakerMC { return result; } + + private static final HashMap oreDictArrays = new HashMap(); + public static IOreDictEntry getOreDictEntryFromArray(List array) { + if (!oreDictArrays.containsKey(array)) { + for (String ore : OreDictionary.getOreNames()) { + if (OreDictionary.getOres(ore) == array) { + oreDictArrays.put(array, MineTweakerAPI.oreDict.get(ore)); + } + } + } + + return oreDictArrays.get(array); + } + /** * Converts a Minecraft ingredient to a MineTweaker ingredient. * @@ -422,12 +437,22 @@ public class MineTweakerMC { * @return minetweaker ingredient */ public static IIngredient getIIngredient(Object ingredient) { - if (ingredient instanceof String) { + if (ingredient == null) { + return null; + } else if (ingredient instanceof String) { return MineTweakerAPI.oreDict.get((String) ingredient); } else if (ingredient instanceof Item) { return getIItemStack(new ItemStack((Item) ingredient, 1, 0)); } else if (ingredient instanceof ItemStack) { return getIItemStack((ItemStack) ingredient); + } else if (ingredient instanceof List) { + IOreDictEntry entry = getOreDictEntryFromArray((List) ingredient); + + if (entry == null) { + throw new IllegalArgumentException("No matching oredict entry: " + ingredient); + } + + return entry; } else { throw new IllegalArgumentException("Not a valid ingredient: " + ingredient); } diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/MineTweakerMod.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/MineTweakerMod.java index 0d09262..ac1c9b2 100644 --- a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/MineTweakerMod.java +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/MineTweakerMod.java @@ -57,7 +57,7 @@ import net.minecraftforge.common.MinecraftForge; * * @author Stan Hebben */ -@Mod(modid = MineTweakerMod.MODID, version = "${version}") +@Mod(modid = MineTweakerMod.MODID, version = "3.0.9") @NetworkMod(clientSideRequired = true, serverSideRequired = true, channels = {MCPacketHandler.CHANNEL_SERVERSCRIPT, MCPacketHandler.CHANNEL_OPENBROWSER}, packetHandler = MCPacketHandler.class) public class MineTweakerMod { public static final String MODID = "MineTweaker3"; diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/item/MCItemStack.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/item/MCItemStack.java index b14819c..aa070b9 100644 --- a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/item/MCItemStack.java +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/item/MCItemStack.java @@ -67,6 +67,13 @@ public class MCItemStack implements IItemStack { items = Collections.singletonList(this); this.tag = tag; } + + private MCItemStack(ItemStack itemStack, IData tag, boolean wildcardSize) { + stack = itemStack; + items = Collections.singletonList(this); + this.tag = tag; + this.wildcardSize = wildcardSize; + } @Override public IItemDefinition getDefinition() { @@ -146,6 +153,13 @@ public class MCItemStack implements IItemStack { result.stackTagCompound = stack.stackTagCompound; return new MCItemStack(result, tag); } + + @Override + public IItemStack anyAmount() { + ItemStack result = new ItemStack(stack.getItem(), 1, stack.getItemDamage()); + result.stackTagCompound = stack.stackTagCompound; + return new MCItemStack(result, tag, true); + } @Override public IItemStack withTag(IData tag) { @@ -224,6 +238,9 @@ public class MCItemStack implements IItemStack { @Override public boolean matches(IItemStack item) { + if (item == null) + return false; + ItemStack internal = getItemStack(item); if (internal == null) { throw new RuntimeException("Invalid item: " + item); @@ -238,6 +255,9 @@ public class MCItemStack implements IItemStack { @Override public boolean contains(IIngredient ingredient) { + if (ingredient == null) + return false; + List iitems = ingredient.getItems(); if (iitems == null || iitems.size() != 1) return false; return matches(iitems.get(0)); diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/oredict/MCOreDictEntry.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/oredict/MCOreDictEntry.java index 1373d84..be86529 100644 --- a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/oredict/MCOreDictEntry.java +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/oredict/MCOreDictEntry.java @@ -187,6 +187,11 @@ public class MCOreDictEntry implements IOreDictEntry { // ### Object implementation ### // ############################# + @Override + public String toString() { + return ""; + } + @Override public int hashCode() { return id; diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/MCRecipeManager.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/MCRecipeManager.java index dfd5563..5ee8ac3 100644 --- a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/MCRecipeManager.java +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/MCRecipeManager.java @@ -9,6 +9,7 @@ import minetweaker.MineTweakerAPI; import minetweaker.mc164.util.MineTweakerHacks; import minetweaker.api.item.IIngredient; import minetweaker.api.item.IItemStack; +import minetweaker.api.minecraft.MineTweakerMC; import static minetweaker.api.minecraft.MineTweakerMC.getIItemStack; import static minetweaker.api.minecraft.MineTweakerMC.getItemStack; import static minetweaker.api.minecraft.MineTweakerMC.getOreDict; @@ -54,6 +55,32 @@ public class MCRecipeManager implements IRecipeManager { } } + @Override + public List getRecipesFor(IIngredient ingredient) { + List results = new ArrayList(); + + for (IRecipe recipe : recipes) { + if (ingredient.matches(MineTweakerMC.getIItemStack(recipe.getRecipeOutput()))) { + ICraftingRecipe converted = RecipeConverter.toCraftingRecipe(recipe); + results.add(converted); + } + } + + return results; + } + + @Override + public List getAll() { + List results = new ArrayList(); + + for (IRecipe recipe : recipes) { + ICraftingRecipe converted = RecipeConverter.toCraftingRecipe(recipe); + results.add(converted); + } + + return results; + } + @Override public int remove(IIngredient output) { List toRemove = new ArrayList(); diff --git a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/RecipeConverter.java b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/RecipeConverter.java index d3ec2d3..aeb85db 100644 --- a/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/RecipeConverter.java +++ b/MineTweaker3-MC164-Main/src/main/java/minetweaker/mc164/recipes/RecipeConverter.java @@ -10,10 +10,21 @@ import minetweaker.api.recipes.ShapedRecipe; import minetweaker.api.recipes.ShapelessRecipe; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemStack; +import minetweaker.api.minecraft.MineTweakerMC; import static minetweaker.api.minecraft.MineTweakerMC.getItemStack; +import minetweaker.api.recipes.ICraftingRecipe; +import minetweaker.api.recipes.UnknownRecipe; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.ShapedRecipes; +import net.minecraft.item.crafting.ShapelessRecipes; +import net.minecraftforge.oredict.ShapedOreRecipe; +import net.minecraftforge.oredict.ShapelessOreRecipe; /** * @@ -121,4 +132,55 @@ public class RecipeConverter { return new ShapedRecipeAdvanced(recipe); } } + + public static ICraftingRecipe toCraftingRecipe(IRecipe recipe) { + IItemStack output = MineTweakerMC.getIItemStack(recipe.getRecipeOutput()); + + if (recipe instanceof ShapelessRecipes) { + ShapelessRecipes shapeless = (ShapelessRecipes) recipe; + + IIngredient[] ingredients = new IIngredient[shapeless.recipeItems.size()]; + for (int i = 0; i < ingredients.length; i++) { + ingredients[i] = MineTweakerMC.getIIngredient(shapeless.recipeItems.get(i)); + } + + return new ShapelessRecipe(output, ingredients, null); + } else if (recipe instanceof ShapedRecipes) { + ShapedRecipes shaped = (ShapedRecipes) recipe; + + IIngredient[][] ingredients = new IIngredient[shaped.recipeHeight][shaped.recipeWidth]; + for (int i = 0; i < shaped.recipeHeight; i++) { + for (int j = 0; j < shaped.recipeWidth; j++) { + ingredients[i][j] = MineTweakerMC.getIItemStack(shaped.recipeItems[i * shaped.recipeWidth + j]); + } + } + + return new ShapedRecipe(output, ingredients, null, false); + } else if (recipe instanceof ShapedOreRecipe) { + ShapedOreRecipe shaped = (ShapedOreRecipe) recipe; + + int width = (int) Math.sqrt(recipe.getRecipeSize()); + int height = recipe.getRecipeSize() / width; + + IIngredient[][] recipeIngredients = new IIngredient[height][width]; + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + recipeIngredients[i][j] = MineTweakerMC.getIIngredient(shaped.getInput()[i * width + j]); + } + } + + return new ShapedRecipe(output, recipeIngredients, null, false); + } else if (recipe instanceof ShapelessOreRecipe) { + ShapelessOreRecipe shapeless = (ShapelessOreRecipe) recipe; + + IIngredient[] ingredients = new IIngredient[shapeless.getRecipeSize()]; + for (int i = 0; i < ingredients.length; i++) { + ingredients[i] = MineTweakerMC.getIIngredient(shapeless.getInput().get(i)); + } + + return new ShapelessRecipe(output, ingredients, null); + } else { + return new UnknownRecipe(output); + } + } } diff --git a/MineTweaker3-MC164-Mod-Buildcraft/src/main/java/minetweaker/mods/buildcraft/AssemblyTable.java b/MineTweaker3-MC164-Mod-Buildcraft/src/main/java/minetweaker/mods/buildcraft/AssemblyTable.java index 3921f36..8ca3070 100644 --- a/MineTweaker3-MC164-Mod-Buildcraft/src/main/java/minetweaker/mods/buildcraft/AssemblyTable.java +++ b/MineTweaker3-MC164-Mod-Buildcraft/src/main/java/minetweaker/mods/buildcraft/AssemblyTable.java @@ -65,8 +65,6 @@ public class AssemblyTable { if (ingredients == null) return true; - System.out.println("Assembly Table Recipe " + Arrays.deepToString(recipe.input)); - int matchedIngredients = 0; boolean[] matched = new boolean[ingredients.length]; checkIngredient: for (int i = 0; i < recipe.input.length; i++) { diff --git a/MineTweaker3-MC1710-Main/src/main/java/minetweaker/api/minecraft/MineTweakerMC.java b/MineTweaker3-MC1710-Main/src/main/java/minetweaker/api/minecraft/MineTweakerMC.java index 0040735..9c22807 100644 --- a/MineTweaker3-MC1710-Main/src/main/java/minetweaker/api/minecraft/MineTweakerMC.java +++ b/MineTweaker3-MC1710-Main/src/main/java/minetweaker/api/minecraft/MineTweakerMC.java @@ -137,24 +137,6 @@ public class MineTweakerMC { return new MCItemStack(new ItemStack(item, 1, OreDictionary.WILDCARD_VALUE)); } - /** - * Converts a Minecraft ingredient to a MineTweaker ingredient. - * - * @param ingredient minecraft ingredient - * @return minetweaker ingredient - */ - public static IIngredient getIIngredient(Object ingredient) { - if (ingredient instanceof String) { - return MineTweakerAPI.oreDict.get((String) ingredient); - } else if (ingredient instanceof Item) { - return getIItemStack(new ItemStack((Item) ingredient, 1, 0)); - } else if (ingredient instanceof ItemStack) { - return getIItemStack((ItemStack) ingredient); - } else { - throw new IllegalArgumentException("Not a valid ingredient: " + ingredient); - } - } - public static ItemStack[] getExamples(IIngredient ingredient) { List examples = ingredient.getItems(); ItemStack[] result = new ItemStack[examples.size()]; @@ -427,4 +409,45 @@ public class MineTweakerMC { return (FluidStack) stack.getInternal(); } + + private static final HashMap oreDictArrays = new HashMap(); + public static IOreDictEntry getOreDictEntryFromArray(List array) { + if (!oreDictArrays.containsKey(array)) { + for (String ore : OreDictionary.getOreNames()) { + if (OreDictionary.getOres(ore) == array) { + oreDictArrays.put(array, MineTweakerAPI.oreDict.get(ore)); + } + } + } + + return oreDictArrays.get(array); + } + + /** + * Converts a Minecraft ingredient to a MineTweaker ingredient. + * + * @param ingredient minecraft ingredient + * @return minetweaker ingredient + */ + public static IIngredient getIIngredient(Object ingredient) { + if (ingredient == null) { + return null; + } else if (ingredient instanceof String) { + return MineTweakerAPI.oreDict.get((String) ingredient); + } else if (ingredient instanceof Item) { + return getIItemStack(new ItemStack((Item) ingredient, 1, 0)); + } else if (ingredient instanceof ItemStack) { + return getIItemStack((ItemStack) ingredient); + } else if (ingredient instanceof List) { + IOreDictEntry entry = getOreDictEntryFromArray((List) ingredient); + + if (entry == null) { + throw new IllegalArgumentException("No matching oredict entry: " + ingredient); + } + + return entry; + } else { + throw new IllegalArgumentException("Not a valid ingredient: " + ingredient); + } + } } diff --git a/MineTweaker3-MC1710-Main/src/main/java/minetweaker/mc1710/item/MCItemStack.java b/MineTweaker3-MC1710-Main/src/main/java/minetweaker/mc1710/item/MCItemStack.java index a9df9ed..a5ac720 100644 --- a/MineTweaker3-MC1710-Main/src/main/java/minetweaker/mc1710/item/MCItemStack.java +++ b/MineTweaker3-MC1710-Main/src/main/java/minetweaker/mc1710/item/MCItemStack.java @@ -68,6 +68,13 @@ public class MCItemStack implements IItemStack { items = Collections.singletonList(this); this.tag = tag; } + + private MCItemStack(ItemStack itemStack, IData tag, boolean wildcardSize) { + stack = itemStack; + items = Collections.singletonList(this); + this.tag = tag; + this.wildcardSize = wildcardSize; + } @Override public IItemDefinition getDefinition() { @@ -142,6 +149,13 @@ public class MCItemStack implements IItemStack { return new MCItemStack(result, tag); } } + + @Override + public IItemStack anyAmount() { + ItemStack result = new ItemStack(stack.getItem(), 1, stack.getItemDamage()); + result.stackTagCompound = stack.stackTagCompound; + return new MCItemStack(result, tag, true); + } @Override public IItemStack withAmount(int amount) { diff --git a/MineTweaker3-MC1710-Main/src/main/java/minetweaker/mc1710/oredict/MCOreDictEntry.java b/MineTweaker3-MC1710-Main/src/main/java/minetweaker/mc1710/oredict/MCOreDictEntry.java index 3f17d3b..bba5028 100644 --- a/MineTweaker3-MC1710-Main/src/main/java/minetweaker/mc1710/oredict/MCOreDictEntry.java +++ b/MineTweaker3-MC1710-Main/src/main/java/minetweaker/mc1710/oredict/MCOreDictEntry.java @@ -188,6 +188,11 @@ public class MCOreDictEntry implements IOreDictEntry { // ### Object implementation ### // ############################# + @Override + public String toString() { + return ""; + } + @Override public int hashCode() { return id; diff --git a/MineTweaker3-MC1710-Main/src/main/java/minetweaker/mc1710/recipes/MCRecipeManager.java b/MineTweaker3-MC1710-Main/src/main/java/minetweaker/mc1710/recipes/MCRecipeManager.java index 5740ab3..9632953 100644 --- a/MineTweaker3-MC1710-Main/src/main/java/minetweaker/mc1710/recipes/MCRecipeManager.java +++ b/MineTweaker3-MC1710-Main/src/main/java/minetweaker/mc1710/recipes/MCRecipeManager.java @@ -9,6 +9,7 @@ import minetweaker.MineTweakerAPI; import minetweaker.mc1710.util.MineTweakerHacks; import minetweaker.api.item.IIngredient; import minetweaker.api.item.IItemStack; +import minetweaker.api.minecraft.MineTweakerMC; import static minetweaker.api.minecraft.MineTweakerMC.getIItemStack; import static minetweaker.api.minecraft.MineTweakerMC.getItemStack; import static minetweaker.api.minecraft.MineTweakerMC.getOreDict; @@ -54,6 +55,32 @@ public class MCRecipeManager implements IRecipeManager { } } + @Override + public List getRecipesFor(IIngredient ingredient) { + List results = new ArrayList(); + + for (IRecipe recipe : recipes) { + if (ingredient.matches(MineTweakerMC.getIItemStack(recipe.getRecipeOutput()))) { + ICraftingRecipe converted = RecipeConverter.toCraftingRecipe(recipe); + results.add(converted); + } + } + + return results; + } + + @Override + public List getAll() { + List results = new ArrayList(); + + for (IRecipe recipe : recipes) { + ICraftingRecipe converted = RecipeConverter.toCraftingRecipe(recipe); + results.add(converted); + } + + return results; + } + @Override public int remove(IIngredient output) { List toRemove = new ArrayList(); diff --git a/MineTweaker3-MC1710-Main/src/main/java/minetweaker/mc1710/recipes/RecipeConverter.java b/MineTweaker3-MC1710-Main/src/main/java/minetweaker/mc1710/recipes/RecipeConverter.java index eb5706c..5023e06 100644 --- a/MineTweaker3-MC1710-Main/src/main/java/minetweaker/mc1710/recipes/RecipeConverter.java +++ b/MineTweaker3-MC1710-Main/src/main/java/minetweaker/mc1710/recipes/RecipeConverter.java @@ -11,9 +11,17 @@ import minetweaker.api.recipes.ShapelessRecipe; import java.util.ArrayList; import java.util.Arrays; import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemStack; +import minetweaker.api.minecraft.MineTweakerMC; import static minetweaker.api.minecraft.MineTweakerMC.getItemStack; +import minetweaker.api.recipes.ICraftingRecipe; +import minetweaker.api.recipes.UnknownRecipe; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.ShapedRecipes; +import net.minecraft.item.crafting.ShapelessRecipes; +import net.minecraftforge.oredict.ShapedOreRecipe; +import net.minecraftforge.oredict.ShapelessOreRecipe; /** * @@ -118,4 +126,55 @@ public class RecipeConverter { return new ShapedRecipeAdvanced(recipe); } } + + public static ICraftingRecipe toCraftingRecipe(IRecipe recipe) { + IItemStack output = MineTweakerMC.getIItemStack(recipe.getRecipeOutput()); + + if (recipe instanceof ShapelessRecipes) { + ShapelessRecipes shapeless = (ShapelessRecipes) recipe; + + IIngredient[] ingredients = new IIngredient[shapeless.recipeItems.size()]; + for (int i = 0; i < ingredients.length; i++) { + ingredients[i] = MineTweakerMC.getIIngredient(shapeless.recipeItems.get(i)); + } + + return new ShapelessRecipe(output, ingredients, null); + } else if (recipe instanceof ShapedRecipes) { + ShapedRecipes shaped = (ShapedRecipes) recipe; + + IIngredient[][] ingredients = new IIngredient[shaped.recipeHeight][shaped.recipeWidth]; + for (int i = 0; i < shaped.recipeHeight; i++) { + for (int j = 0; j < shaped.recipeWidth; j++) { + ingredients[i][j] = MineTweakerMC.getIItemStack(shaped.recipeItems[i * shaped.recipeWidth + j]); + } + } + + return new ShapedRecipe(output, ingredients, null, false); + } else if (recipe instanceof ShapedOreRecipe) { + ShapedOreRecipe shaped = (ShapedOreRecipe) recipe; + + int width = (int) Math.sqrt(recipe.getRecipeSize()); + int height = recipe.getRecipeSize() / width; + + IIngredient[][] recipeIngredients = new IIngredient[height][width]; + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + recipeIngredients[i][j] = MineTweakerMC.getIIngredient(shaped.getInput()[i * width + j]); + } + } + + return new ShapedRecipe(output, recipeIngredients, null, false); + } else if (recipe instanceof ShapelessOreRecipe) { + ShapelessOreRecipe shapeless = (ShapelessOreRecipe) recipe; + + IIngredient[] ingredients = new IIngredient[shapeless.getRecipeSize()]; + for (int i = 0; i < ingredients.length; i++) { + ingredients[i] = MineTweakerMC.getIIngredient(shapeless.getInput().get(i)); + } + + return new ShapelessRecipe(output, ingredients, null); + } else { + return new UnknownRecipe(output); + } + } } diff --git a/MineTweaker3-MC172-Main/src/main/java/minetweaker/api/minecraft/MineTweakerMC.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/api/minecraft/MineTweakerMC.java index 83ac691..14a40d4 100644 --- a/MineTweaker3-MC172-Main/src/main/java/minetweaker/api/minecraft/MineTweakerMC.java +++ b/MineTweaker3-MC172-Main/src/main/java/minetweaker/api/minecraft/MineTweakerMC.java @@ -398,24 +398,6 @@ public class MineTweakerMC { return (FluidStack) stack.getInternal(); } - /** - * Converts a Minecraft ingredient to a MineTweaker ingredient. - * - * @param ingredient minecraft ingredient - * @return minetweaker ingredient - */ - public static IIngredient getIIngredient(Object ingredient) { - if (ingredient instanceof String) { - return MineTweakerAPI.oreDict.get((String) ingredient); - } else if (ingredient instanceof Item) { - return getIItemStack(new ItemStack((Item) ingredient, 1, 0)); - } else if (ingredient instanceof ItemStack) { - return getIItemStack((ItemStack) ingredient); - } else { - throw new IllegalArgumentException("Not a valid ingredient: " + ingredient); - } - } - public static ItemStack[] getExamples(IIngredient ingredient) { List examples = ingredient.getItems(); ItemStack[] result = new ItemStack[examples.size()]; @@ -424,4 +406,45 @@ public class MineTweakerMC { } return result; } + + private static final HashMap oreDictArrays = new HashMap(); + public static IOreDictEntry getOreDictEntryFromArray(List array) { + if (!oreDictArrays.containsKey(array)) { + for (String ore : OreDictionary.getOreNames()) { + if (OreDictionary.getOres(ore) == array) { + oreDictArrays.put(array, MineTweakerAPI.oreDict.get(ore)); + } + } + } + + return oreDictArrays.get(array); + } + + /** + * Converts a Minecraft ingredient to a MineTweaker ingredient. + * + * @param ingredient minecraft ingredient + * @return minetweaker ingredient + */ + public static IIngredient getIIngredient(Object ingredient) { + if (ingredient == null) { + return null; + } else if (ingredient instanceof String) { + return MineTweakerAPI.oreDict.get((String) ingredient); + } else if (ingredient instanceof Item) { + return getIItemStack(new ItemStack((Item) ingredient, 1, 0)); + } else if (ingredient instanceof ItemStack) { + return getIItemStack((ItemStack) ingredient); + } else if (ingredient instanceof List) { + IOreDictEntry entry = getOreDictEntryFromArray((List) ingredient); + + if (entry == null) { + throw new IllegalArgumentException("No matching oredict entry: " + ingredient); + } + + return entry; + } else { + throw new IllegalArgumentException("Not a valid ingredient: " + ingredient); + } + } } diff --git a/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/item/MCItemStack.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/item/MCItemStack.java index 75726c5..bc4c44a 100644 --- a/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/item/MCItemStack.java +++ b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/item/MCItemStack.java @@ -68,6 +68,13 @@ public class MCItemStack implements IItemStack { items = Collections.singletonList(this); this.tag = tag; } + + private MCItemStack(ItemStack itemStack, IData tag, boolean wildcardSize) { + stack = itemStack; + items = Collections.singletonList(this); + this.tag = tag; + this.wildcardSize = wildcardSize; + } @Override public IItemDefinition getDefinition() { @@ -149,6 +156,13 @@ public class MCItemStack implements IItemStack { result.stackTagCompound = stack.stackTagCompound; return new MCItemStack(result, tag); } + + @Override + public IItemStack anyAmount() { + ItemStack result = new ItemStack(stack.getItem(), 1, stack.getItemDamage()); + result.stackTagCompound = stack.stackTagCompound; + return new MCItemStack(result, tag, true); + } @Override public IItemStack withTag(IData tag) { diff --git a/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/oredict/MCOreDictEntry.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/oredict/MCOreDictEntry.java index b6f6baf..b10b7d4 100644 --- a/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/oredict/MCOreDictEntry.java +++ b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/oredict/MCOreDictEntry.java @@ -188,6 +188,11 @@ public class MCOreDictEntry implements IOreDictEntry { // ### Object implementation ### // ############################# + @Override + public String toString() { + return ""; + } + @Override public int hashCode() { return id; diff --git a/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/MCRecipeManager.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/MCRecipeManager.java index 6623a2b..883f2ec 100644 --- a/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/MCRecipeManager.java +++ b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/MCRecipeManager.java @@ -9,6 +9,7 @@ import minetweaker.MineTweakerAPI; import minetweaker.mc172.util.MineTweakerHacks; import minetweaker.api.item.IIngredient; import minetweaker.api.item.IItemStack; +import minetweaker.api.minecraft.MineTweakerMC; import static minetweaker.api.minecraft.MineTweakerMC.getIItemStack; import static minetweaker.api.minecraft.MineTweakerMC.getItemStack; import static minetweaker.api.minecraft.MineTweakerMC.getOreDict; @@ -54,6 +55,32 @@ public class MCRecipeManager implements IRecipeManager { } } + @Override + public List getRecipesFor(IIngredient ingredient) { + List results = new ArrayList(); + + for (IRecipe recipe : recipes) { + if (ingredient.matches(MineTweakerMC.getIItemStack(recipe.getRecipeOutput()))) { + ICraftingRecipe converted = RecipeConverter.toCraftingRecipe(recipe); + results.add(converted); + } + } + + return results; + } + + @Override + public List getAll() { + List results = new ArrayList(); + + for (IRecipe recipe : recipes) { + ICraftingRecipe converted = RecipeConverter.toCraftingRecipe(recipe); + results.add(converted); + } + + return results; + } + @Override public int remove(IIngredient output) { List toRemove = new ArrayList(); diff --git a/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/RecipeConverter.java b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/RecipeConverter.java index 9790534..14ec11d 100644 --- a/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/RecipeConverter.java +++ b/MineTweaker3-MC172-Main/src/main/java/minetweaker/mc172/recipes/RecipeConverter.java @@ -11,9 +11,17 @@ import minetweaker.api.recipes.ShapelessRecipe; import java.util.ArrayList; import java.util.Arrays; import minetweaker.api.item.IIngredient; +import minetweaker.api.item.IItemStack; +import minetweaker.api.minecraft.MineTweakerMC; import static minetweaker.api.minecraft.MineTweakerMC.getItemStack; +import minetweaker.api.recipes.ICraftingRecipe; +import minetweaker.api.recipes.UnknownRecipe; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.ShapedRecipes; +import net.minecraft.item.crafting.ShapelessRecipes; +import net.minecraftforge.oredict.ShapedOreRecipe; +import net.minecraftforge.oredict.ShapelessOreRecipe; /** * @@ -118,4 +126,55 @@ public class RecipeConverter { return new ShapedRecipeAdvanced(recipe); } } + + public static ICraftingRecipe toCraftingRecipe(IRecipe recipe) { + IItemStack output = MineTweakerMC.getIItemStack(recipe.getRecipeOutput()); + + if (recipe instanceof ShapelessRecipes) { + ShapelessRecipes shapeless = (ShapelessRecipes) recipe; + + IIngredient[] ingredients = new IIngredient[shapeless.recipeItems.size()]; + for (int i = 0; i < ingredients.length; i++) { + ingredients[i] = MineTweakerMC.getIIngredient(shapeless.recipeItems.get(i)); + } + + return new ShapelessRecipe(output, ingredients, null); + } else if (recipe instanceof ShapedRecipes) { + ShapedRecipes shaped = (ShapedRecipes) recipe; + + IIngredient[][] ingredients = new IIngredient[shaped.recipeHeight][shaped.recipeWidth]; + for (int i = 0; i < shaped.recipeHeight; i++) { + for (int j = 0; j < shaped.recipeWidth; j++) { + ingredients[i][j] = MineTweakerMC.getIItemStack(shaped.recipeItems[i * shaped.recipeWidth + j]); + } + } + + return new ShapedRecipe(output, ingredients, null, false); + } else if (recipe instanceof ShapedOreRecipe) { + ShapedOreRecipe shaped = (ShapedOreRecipe) recipe; + + int width = (int) Math.sqrt(recipe.getRecipeSize()); + int height = recipe.getRecipeSize() / width; + + IIngredient[][] recipeIngredients = new IIngredient[height][width]; + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + recipeIngredients[i][j] = MineTweakerMC.getIIngredient(shaped.getInput()[i * width + j]); + } + } + + return new ShapedRecipe(output, recipeIngredients, null, false); + } else if (recipe instanceof ShapelessOreRecipe) { + ShapelessOreRecipe shapeless = (ShapelessOreRecipe) recipe; + + IIngredient[] ingredients = new IIngredient[shapeless.getRecipeSize()]; + for (int i = 0; i < ingredients.length; i++) { + ingredients[i] = MineTweakerMC.getIIngredient(shapeless.getInput().get(i)); + } + + return new ShapelessRecipe(output, ingredients, null); + } else { + return new UnknownRecipe(output); + } + } }