001    package net.minecraft.item.crafting;
002    
003    import java.util.ArrayList;
004    import java.util.Iterator;
005    import java.util.List;
006    import net.minecraft.inventory.InventoryCrafting;
007    import net.minecraft.item.ItemStack;
008    import net.minecraft.world.World;
009    
010    public class ShapelessRecipes implements IRecipe
011    {
012        /** Is the ItemStack that you get when craft the recipe. */
013        private final ItemStack recipeOutput;
014    
015        /** Is a List of ItemStack that composes the recipe. */
016        public final List recipeItems;
017    
018        public ShapelessRecipes(ItemStack par1ItemStack, List par2List)
019        {
020            this.recipeOutput = par1ItemStack;
021            this.recipeItems = par2List;
022        }
023    
024        public ItemStack getRecipeOutput()
025        {
026            return this.recipeOutput;
027        }
028    
029        /**
030         * Used to check if a recipe matches current crafting inventory
031         */
032        public boolean matches(InventoryCrafting par1InventoryCrafting, World par2World)
033        {
034            ArrayList var3 = new ArrayList(this.recipeItems);
035    
036            for (int var4 = 0; var4 < 3; ++var4)
037            {
038                for (int var5 = 0; var5 < 3; ++var5)
039                {
040                    ItemStack var6 = par1InventoryCrafting.getStackInRowAndColumn(var5, var4);
041    
042                    if (var6 != null)
043                    {
044                        boolean var7 = false;
045                        Iterator var8 = var3.iterator();
046    
047                        while (var8.hasNext())
048                        {
049                            ItemStack var9 = (ItemStack)var8.next();
050    
051                            if (var6.itemID == var9.itemID && (var9.getItemDamage() == -1 || var6.getItemDamage() == var9.getItemDamage()))
052                            {
053                                var7 = true;
054                                var3.remove(var9);
055                                break;
056                            }
057                        }
058    
059                        if (!var7)
060                        {
061                            return false;
062                        }
063                    }
064                }
065            }
066    
067            return var3.isEmpty();
068        }
069    
070        /**
071         * Returns an Item that is the result of this recipe
072         */
073        public ItemStack getCraftingResult(InventoryCrafting par1InventoryCrafting)
074        {
075            return this.recipeOutput.copy();
076        }
077    
078        /**
079         * Returns the size of the recipe area
080         */
081        public int getRecipeSize()
082        {
083            return this.recipeItems.size();
084        }
085    }