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