    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    }