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