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 }