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 }