diff --git a/ee3_common/com/pahimar/ee3/EquivalentExchange3.java b/ee3_common/com/pahimar/ee3/EquivalentExchange3.java index 81950217..2712e544 100644 --- a/ee3_common/com/pahimar/ee3/EquivalentExchange3.java +++ b/ee3_common/com/pahimar/ee3/EquivalentExchange3.java @@ -24,12 +24,12 @@ import com.pahimar.ee3.core.proxy.CommonProxy; import com.pahimar.ee3.core.util.LogHelper; import com.pahimar.ee3.core.util.VersionHelper; import com.pahimar.ee3.creativetab.CreativeTabEE3; +import com.pahimar.ee3.emc.DynEMC; import com.pahimar.ee3.item.ModItems; import com.pahimar.ee3.item.crafting.RecipesAlchemicalBagDyes; import com.pahimar.ee3.lib.Reference; import com.pahimar.ee3.lib.Strings; import com.pahimar.ee3.network.PacketHandler; -import com.pahimar.ee3.recipe.RecipesTransmutationStone; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.FingerprintWarning; @@ -151,7 +151,7 @@ public class EquivalentExchange3 { proxy.initRenderingAndTextures(); // Load the Transmutation Stone recipes - RecipesTransmutationStone.init(); + //RecipesTransmutationStone.init(); // Add in the ability to dye Alchemical Bags CraftingManager.getInstance().getRecipeList().add(new RecipesAlchemicalBagDyes()); @@ -167,6 +167,6 @@ public class EquivalentExchange3 { // Initialize the Addon Handler AddonHandler.init(); - //DynEMC.getInstance().toString(); + DynEMC.getInstance().toString(); } } diff --git a/ee3_common/com/pahimar/ee3/core/util/ItemUtil.java b/ee3_common/com/pahimar/ee3/core/util/ItemUtil.java index 13d3888b..bdc8e2a2 100644 --- a/ee3_common/com/pahimar/ee3/core/util/ItemUtil.java +++ b/ee3_common/com/pahimar/ee3/core/util/ItemUtil.java @@ -11,6 +11,7 @@ import net.minecraftforge.oredict.OreDictionary; import com.pahimar.ee3.item.ModItems; import com.pahimar.ee3.lib.Colours; +import com.pahimar.ee3.lib.ItemIds; import com.pahimar.ee3.lib.Strings; /** @@ -30,7 +31,13 @@ public class ItemUtil { StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append(String.format("itemID: %d, metaData: %d, stackSize: %d, itemName: %s, className: %s", itemStack.itemID, itemStack.getItemDamage(), itemStack.stackSize, itemStack.getItemName(), itemStack.getItem().getClass().toString())); + stringBuilder.append(String.format("itemID: %d, metaData: %d, stackSize: %d, ", itemStack.itemID, itemStack.getItemDamage(), itemStack.stackSize)); + + if (itemStack.hasTagCompound()) { + stringBuilder.append(String.format("nbtTagCompound: %s, ", itemStack.getTagCompound().toString())); + } + + stringBuilder.append(String.format("itemName: %s, className: %s ", itemStack.getItemName(), itemStack.getItem().getClass().toString())); return stringBuilder.toString(); } @@ -46,7 +53,7 @@ public class ItemUtil { * true if the two ItemStacks are equivalent, false otherwise */ public static boolean compare(ItemStack first, ItemStack second) { - + // Check to see if either argument is null if ((first != null) && (second != null)) { // Check the item IDs @@ -81,6 +88,11 @@ public class ItemUtil { } } + if (first.itemID == ItemIds.MINIUM_STONE && second.itemID == ItemIds.MINIUM_STONE) { + System.out.println("First: " + ItemUtil.toString(first)); + System.out.println("Second: " + ItemUtil.toString(second)); + System.out.println("False Default"); + } return false; } diff --git a/ee3_common/com/pahimar/ee3/core/util/OreStack.java b/ee3_common/com/pahimar/ee3/core/util/OreStack.java index 1d7e8d6b..9f6c2d8b 100644 --- a/ee3_common/com/pahimar/ee3/core/util/OreStack.java +++ b/ee3_common/com/pahimar/ee3/core/util/OreStack.java @@ -8,7 +8,7 @@ import net.minecraftforge.oredict.OreDictionary; public class OreStack implements Comparator { - private String oreName; + public String oreName; public int stackSize; public OreStack() { @@ -46,6 +46,18 @@ public class OreStack implements Comparator { public String toString() { return "" + stackSize + "xoreDictionary." + oreName; } + + @Override + public boolean equals(Object object) { + + if (!(object instanceof OreStack)) { + return false; + } + + OreStack oreStackObject = (OreStack) object; + + return ((stackSize == oreStackObject.stackSize) && (oreName.equals(oreStackObject.oreName))); + } @Override public int compare(OreStack oreStack1, OreStack oreStack2) { diff --git a/ee3_common/com/pahimar/ee3/core/util/RecipeHelper.java b/ee3_common/com/pahimar/ee3/core/util/RecipeHelper.java index 4c373761..59108aba 100644 --- a/ee3_common/com/pahimar/ee3/core/util/RecipeHelper.java +++ b/ee3_common/com/pahimar/ee3/core/util/RecipeHelper.java @@ -12,6 +12,9 @@ import net.minecraft.item.crafting.ShapedRecipes; import net.minecraft.item.crafting.ShapelessRecipes; import net.minecraftforge.oredict.ShapedOreRecipe; import net.minecraftforge.oredict.ShapelessOreRecipe; + +import com.pahimar.ee3.item.CustomStackWrapper; + import cpw.mods.fml.common.registry.GameRegistry; /** @@ -24,98 +27,133 @@ import cpw.mods.fml.common.registry.GameRegistry; * */ public class RecipeHelper { - + /** * Returns a list of elements that constitute the input in a crafting recipe * - * @param recipe - * The IRecipe being examined - * @return - * List of elements that constitute the input of the given IRecipe. Could be an ItemStack or an Arraylist + * @param recipe + * The IRecipe being examined + * @return List of elements that constitute the input of the given IRecipe. + * Could be an ItemStack or an Arraylist */ @SuppressWarnings({ "rawtypes", "unchecked" }) - public static ArrayList getRecipeInputs(IRecipe recipe) { - + public static ArrayList getRecipeInputs(IRecipe recipe) { + + ArrayList recipeInputs = new ArrayList(); + if (recipe instanceof ShapedRecipes) { - + ShapedRecipes shapedRecipe = (ShapedRecipes) recipe; - ArrayList recipeInputs = new ArrayList(); - + for (int i = 0; i < shapedRecipe.recipeItems.length; i++) { if (shapedRecipe.recipeItems[i] != null) { - ItemStack shapedRecipeStack = shapedRecipe.recipeItems[i]; - shapedRecipeStack.stackSize = 1; - - recipeInputs.add(shapedRecipeStack); + + ItemStack itemStack = shapedRecipe.recipeItems[i]; + itemStack.stackSize = 1; + + recipeInputs.add(new CustomStackWrapper(itemStack)); } } - + return ItemUtil.collateStacks(recipeInputs); } else if (recipe instanceof ShapelessRecipes) { ShapelessRecipes shapelessRecipe = (ShapelessRecipes) recipe; - - return ItemUtil.collateStacks(new ArrayList(shapelessRecipe.recipeItems)); + + for (Object object : shapelessRecipe.recipeItems) { + if (object instanceof ItemStack) { + + ItemStack itemStack = (ItemStack) object; + itemStack.stackSize = 1; + + recipeInputs.add(new CustomStackWrapper(itemStack)); + } + } } else if (recipe instanceof ShapedOreRecipe) { ShapedOreRecipe shapedOreRecipe = (ShapedOreRecipe) recipe; - ArrayList recipeInputs = new ArrayList(); - + for (int i = 0; i < shapedOreRecipe.getInput().length; i++) { + /* + * If the element is a list, then it is an OreStack + */ if (shapedOreRecipe.getInput()[i] instanceof ArrayList) { ArrayList shapedOreRecipeList = (ArrayList) shapedOreRecipe.getInput()[i]; - - if (shapedOreRecipeList.size() > 0) { - recipeInputs.add(new OreStack((ItemStack)shapedOreRecipeList.get(0))); + + if (!shapedOreRecipeList.isEmpty()) { + + OreStack oreStack = new OreStack((ItemStack) shapedOreRecipeList.get(0)); + oreStack.stackSize = 1; + + recipeInputs.add(new CustomStackWrapper(oreStack)); } } - else { - if (shapedOreRecipe.getInput()[i] != null) { - recipeInputs.add(shapedOreRecipe.getInput()[i]); - } + /* + * Else it is possibly an ItemStack + */ + else if (shapedOreRecipe.getInput()[i] instanceof ItemStack) { + + ItemStack itemStack = (ItemStack) shapedOreRecipe.getInput()[i]; + itemStack.stackSize = 1; + + recipeInputs.add(new CustomStackWrapper(itemStack)); } } - - return ItemUtil.collateStacks(recipeInputs); } else if (recipe instanceof ShapelessOreRecipe) { ShapelessOreRecipe shapelessOreRecipe = (ShapelessOreRecipe) recipe; - ArrayList recipeInputs = new ArrayList(); - - for (Object o : shapelessOreRecipe.getInput()) { - if (o instanceof ArrayList) { - ArrayList shapelessOreRecipeList = (ArrayList) o; - - if (shapelessOreRecipeList.size() > 0) { - recipeInputs.add(new OreStack((ItemStack) shapelessOreRecipeList.get(0))); + + for (Object object : shapelessOreRecipe.getInput()) { + if (object instanceof ArrayList) { + ArrayList shapelessOreRecipeList = (ArrayList) object; + + if (!shapelessOreRecipeList.isEmpty()) { + + OreStack oreStack = new OreStack((ItemStack) shapelessOreRecipeList.get(0)); + oreStack.stackSize = 1; + + recipeInputs.add(new CustomStackWrapper(oreStack)); } } - else { - if (o != null) { - recipeInputs.add(o); - } + else if (object instanceof ItemStack) { + ItemStack itemStack = (ItemStack) object; + itemStack.stackSize = 1; + + recipeInputs.add(new CustomStackWrapper(itemStack)); } } - - return ItemUtil.collateStacks(recipeInputs); } - return null; + return recipeInputs; } + @SuppressWarnings("unchecked") + public static ArrayList getCollatedRecipeInputs(IRecipe recipe) { + + return ItemUtil.collateStacks(getRecipeInputs(recipe)); + } + + public static ArrayList getReverseRecipes(CustomStackWrapper customStackWrapper) { + + return getReverseRecipes(customStackWrapper.getItemStack()); + } + @SuppressWarnings("unchecked") public static ArrayList getReverseRecipes(ItemStack itemStack) { - ArrayList craftingManagerRecipeList = new ArrayList(CraftingManager.getInstance().getRecipeList()); ArrayList reverseRecipeList = new ArrayList(); - for (IRecipe recipe : craftingManagerRecipeList) { - if (recipe.getRecipeOutput() != null) { - if (ItemUtil.compare(itemStack, recipe.getRecipeOutput())) { - reverseRecipeList.add(recipe); + if (itemStack != null) { + ArrayList craftingManagerRecipeList = new ArrayList(CraftingManager.getInstance().getRecipeList()); + + for (IRecipe recipe : craftingManagerRecipeList) { + if (recipe.getRecipeOutput() != null) { + if (ItemUtil.compare(itemStack, recipe.getRecipeOutput())) { + reverseRecipeList.add(recipe); + } } } } diff --git a/ee3_common/com/pahimar/ee3/emc/DynEMC.java b/ee3_common/com/pahimar/ee3/emc/DynEMC.java index ce9a7a49..3af87991 100644 --- a/ee3_common/com/pahimar/ee3/emc/DynEMC.java +++ b/ee3_common/com/pahimar/ee3/emc/DynEMC.java @@ -1,15 +1,14 @@ package com.pahimar.ee3.emc; import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; import java.util.List; -import java.util.Set; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; +import com.pahimar.ee3.core.util.OreStack; +import com.pahimar.ee3.emc.graph.WeightedDirectedGraph; import com.pahimar.ee3.item.CustomStackWrapper; public class DynEMC { @@ -17,18 +16,14 @@ public class DynEMC { private static DynEMC dynEMC = null; private ArrayList discoveredItems; - private HashMap emcMap; + private WeightedDirectedGraph graph; private DynEMC() { discoveredItems = new ArrayList(); - emcMap = new HashMap(); + graph = new WeightedDirectedGraph(); init(); - - for (String oreName : OreDictionary.getOreNames()) { - emcMap.put(new EquivalencyGroup(OreDictionary.getOres(oreName)), new EmcValue()); - } } public static DynEMC getInstance() { @@ -44,11 +39,27 @@ public class DynEMC { return discoveredItems; } - + private void init() { + populateItemList(); + } + + private void populateItemList() { ArrayList subItems = new ArrayList(); + /* + * Add all entries from the OreDictionary + */ + for (String oreName: OreDictionary.getOreNames()) { + + CustomStackWrapper customWrappedStack = new CustomStackWrapper(new OreStack(oreName)); + + if (!discoveredItems.contains(customWrappedStack)) { + discoveredItems.add(customWrappedStack); + } + } + /* * For every possible item (and sub item), add them to the discovered * items list @@ -81,7 +92,7 @@ public class DynEMC { } } } - + /** * Now that we have discovered as many items as possible, trim out the * items that are black listed @@ -99,13 +110,6 @@ public class DynEMC { StringBuilder stringBuilder = new StringBuilder(); - Set keySet = emcMap.keySet(); - Iterator iter = keySet.iterator(); - - while (iter.hasNext()) { - System.out.println(iter.next()); - } - return stringBuilder.toString(); } } diff --git a/ee3_common/com/pahimar/ee3/emc/graph/WeightedDirectedGraph.java b/ee3_common/com/pahimar/ee3/emc/graph/WeightedDirectedGraph.java index 663d465d..94d73196 100644 --- a/ee3_common/com/pahimar/ee3/emc/graph/WeightedDirectedGraph.java +++ b/ee3_common/com/pahimar/ee3/emc/graph/WeightedDirectedGraph.java @@ -11,6 +11,9 @@ import java.util.NoSuchElementException; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; +import java.util.logging.Level; + +import com.pahimar.ee3.core.util.LogHelper; public class WeightedDirectedGraph implements Iterable { @@ -44,6 +47,12 @@ public class WeightedDirectedGraph implements Iterable { public void addEdge(T from, T to, float weight) { if (!(graph.containsKey(from) && graph.containsKey(to))) { + if (!(graph.containsKey(from))) { + LogHelper.log(Level.SEVERE, "From node doesn't exist: " + from.toString()); + } + if (!(graph.containsKey(to))) { + LogHelper.log(Level.SEVERE, "To node doesn't exist: " + to.toString()); + } throw new NoSuchElementException("Missing nodes from graph"); } @@ -73,6 +82,14 @@ public class WeightedDirectedGraph implements Iterable { public boolean edgeExists(T from, T to, float weight) { if (!(graph.containsKey(from) && graph.containsKey(to))) { + if (!(graph.containsKey(from))) { + LogHelper.log(Level.SEVERE, "From node doesn't exist: " + from.toString()); + LogHelper.log(Level.SEVERE, "To node: " + to.toString()); + } + if (!(graph.containsKey(to))) { + LogHelper.log(Level.SEVERE, "To node doesn't exist: " + to.toString()); + LogHelper.log(Level.SEVERE, "From node: " + from.toString()); + } throw new NoSuchElementException("Missing nodes from graph"); } diff --git a/ee3_common/com/pahimar/ee3/item/CustomStackWrapper.java b/ee3_common/com/pahimar/ee3/item/CustomStackWrapper.java index 05a07a54..863e1057 100644 --- a/ee3_common/com/pahimar/ee3/item/CustomStackWrapper.java +++ b/ee3_common/com/pahimar/ee3/item/CustomStackWrapper.java @@ -1,22 +1,68 @@ package com.pahimar.ee3.item; import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; import com.pahimar.ee3.core.util.ItemUtil; +import com.pahimar.ee3.core.util.OreStack; public class CustomStackWrapper { - public ItemStack itemStack; + private ItemStack itemStack; + private OreStack oreStack; public CustomStackWrapper(ItemStack itemStack) { - + this.itemStack = itemStack; - + this.oreStack = null; + if (this.itemStack != null) { this.itemStack.stackSize = 1; } } + public CustomStackWrapper(OreStack oreStack) { + + this.itemStack = null; + this.oreStack = oreStack; + + if (this.oreStack != null) { + this.oreStack.stackSize = 1; + } + } + + public int getWrappedStackSize() { + + if (itemStack != null) { + return itemStack.stackSize; + } + else if (oreStack != null) { + return oreStack.stackSize; + } + + return -1; + } + + public void setWrappedStackSize(int stackSize) { + + if (itemStack != null) { + itemStack.stackSize = stackSize; + } + else if (oreStack != null) { + oreStack.stackSize = stackSize; + } + } + + public ItemStack getItemStack() { + + return itemStack; + } + + public OreStack getOreStack() { + + return oreStack; + } + @Override public boolean equals(Object object) { @@ -24,15 +70,47 @@ public class CustomStackWrapper { return false; } - CustomStackWrapper wrappedItemStack = (CustomStackWrapper) object; + CustomStackWrapper customWrappedStack = (CustomStackWrapper) object; - return ItemUtil.compare(this.itemStack, wrappedItemStack.itemStack); + if (itemStack != null) { + if (customWrappedStack.itemStack != null) { + return ItemUtil.compare(this.itemStack, customWrappedStack.itemStack); + } + else if (customWrappedStack.oreStack != null) { + for (ItemStack oreDictItemStack : OreDictionary.getOres(customWrappedStack.oreStack.oreName)) { + if (ItemUtil.compare(itemStack, oreDictItemStack)) { + return true; + } + } + } + } + else if (oreStack != null) { + if (customWrappedStack.itemStack != null) { + for (ItemStack oreDictItemStack : OreDictionary.getOres(oreStack.oreName)) { + if (ItemUtil.compare(customWrappedStack.itemStack, oreDictItemStack)) { + return true; + } + } + } + else if (customWrappedStack.oreStack != null) { + return oreStack.equals(customWrappedStack.oreStack); + } + } + + return false; } @Override public String toString() { - return itemStack.toString(); + if (itemStack != null) { + return ItemUtil.toString(itemStack); + } + else if (oreStack != null) { + return oreStack.toString(); + } + + return null; } @Override @@ -40,9 +118,23 @@ public class CustomStackWrapper { int hashCode = 1; - hashCode = 37 * hashCode + itemStack.itemID; - hashCode = 37 * hashCode + itemStack.getItemDamage(); - hashCode = 37 * hashCode + itemStack.stackSize; + if (itemStack != null) { + hashCode = 37 * hashCode + itemStack.itemID; + + if (itemStack.getItemDamage() == OreDictionary.WILDCARD_VALUE) { + hashCode = 37 * hashCode; + } + else { + hashCode = 37 * hashCode + itemStack.getItemDamage(); + } + + hashCode = 37 * hashCode + itemStack.stackSize; + hashCode = 37 * hashCode + itemStack.getItemName().hashCode(); + } + else if (oreStack != null) { + hashCode = 37 * hashCode + oreStack.stackSize; + hashCode = 37 * hashCode + oreStack.oreName.hashCode(); + } return hashCode; }