001 package net.minecraftforge.oredict;
002
003 import java.util.ArrayList;
004 import java.util.Iterator;
005 import java.util.Map;
006 import java.util.Map.Entry;
007 import java.util.List;
008
009 import net.minecraft.block.Block;
010 import net.minecraft.item.crafting.CraftingManager;
011 import net.minecraft.item.crafting.IRecipe;
012 import net.minecraft.inventory.InventoryCrafting;
013 import net.minecraft.item.Item;
014 import net.minecraft.item.ItemStack;
015 import net.minecraft.item.crafting.ShapelessRecipes;
016 import net.minecraft.world.World;
017
018 public class ShapelessOreRecipe implements IRecipe
019 {
020 private ItemStack output = null;
021 private ArrayList input = new ArrayList();
022
023 public ShapelessOreRecipe(Block result, Object... recipe){ this(new ItemStack(result), recipe); }
024 public ShapelessOreRecipe(Item result, Object... recipe){ this(new ItemStack(result), recipe); }
025
026 public ShapelessOreRecipe(ItemStack result, Object... recipe)
027 {
028 output = result.copy();
029 for (Object in : recipe)
030 {
031 if (in instanceof ItemStack)
032 {
033 input.add(((ItemStack)in).copy());
034 }
035 else if (in instanceof Item)
036 {
037 input.add(new ItemStack((Item)in));
038 }
039 else if (in instanceof Block)
040 {
041 input.add(new ItemStack((Block)in));
042 }
043 else if (in instanceof String)
044 {
045 input.add(OreDictionary.getOres((String)in));
046 }
047 else
048 {
049 String ret = "Invalid shapeless ore recipe: ";
050 for (Object tmp : recipe)
051 {
052 ret += tmp + ", ";
053 }
054 ret += output;
055 throw new RuntimeException(ret);
056 }
057 }
058 }
059
060 ShapelessOreRecipe(ShapelessRecipes recipe, Map<ItemStack, String> replacements)
061 {
062 output = recipe.getRecipeOutput();
063
064 for(ItemStack ingred : ((List<ItemStack>)recipe.recipeItems))
065 {
066 Object finalObj = ingred;
067 for(Entry<ItemStack, String> replace : replacements.entrySet())
068 {
069 if(OreDictionary.itemMatches(replace.getKey(), ingred, false))
070 {
071 finalObj = OreDictionary.getOres(replace.getValue());
072 break;
073 }
074 }
075 input.add(finalObj);
076 }
077 }
078
079 @Override
080 public int getRecipeSize(){ return input.size(); }
081
082 @Override
083 public ItemStack getRecipeOutput(){ return output; }
084
085 @Override
086 public ItemStack getCraftingResult(InventoryCrafting var1){ return output.copy(); }
087
088 @Override
089 public boolean matches(InventoryCrafting var1, World world)
090 {
091 ArrayList required = new ArrayList(input);
092
093 for (int x = 0; x < var1.getSizeInventory(); x++)
094 {
095 ItemStack slot = var1.getStackInSlot(x);
096
097 if (slot != null)
098 {
099 boolean inRecipe = false;
100 Iterator req = required.iterator();
101
102 while (req.hasNext())
103 {
104 boolean match = false;
105
106 Object next = req.next();
107
108 if (next instanceof ItemStack)
109 {
110 match = checkItemEquals((ItemStack)next, slot);
111 }
112 else if (next instanceof ArrayList)
113 {
114 for (ItemStack item : (ArrayList<ItemStack>)next)
115 {
116 match = match || checkItemEquals(item, slot);
117 }
118 }
119
120 if (match)
121 {
122 inRecipe = true;
123 required.remove(next);
124 break;
125 }
126 }
127
128 if (!inRecipe)
129 {
130 return false;
131 }
132 }
133 }
134
135 return required.isEmpty();
136 }
137
138 private boolean checkItemEquals(ItemStack target, ItemStack input)
139 {
140 return (target.itemID == input.itemID && (target.getItemDamage() == -1 || target.getItemDamage() == input.getItemDamage()));
141 }
142 }