    001    package net.minecraft.item.crafting;
    002
    003    import net.minecraft.inventory.InventoryCrafting;
    004    import net.minecraft.item.ItemStack;
    005    import net.minecraft.world.World;
    006
    007    public class ShapedRecipes implements IRecipe
    008    {
    009        /** How many horizontal slots this recipe is wide. */
    010        public final int recipeWidth;
    011
    012        /** How many vertical slots this recipe uses. */
    013        public final int recipeHeight;
    014
    015        /** Is a array of ItemStack that composes the recipe. */
    016        public final ItemStack[] recipeItems;
    017
    018        /** Is the ItemStack that you get when craft the recipe. */
    019        private ItemStack recipeOutput;
    020
    021        /** Is the itemID of the output item that you get when craft the recipe. */
    022        public final int recipeOutputItemID;
    023
    024        public ShapedRecipes(int par1, int par2, ItemStack[] par3ArrayOfItemStack, ItemStack par4ItemStack)
    025        {
    026            this.recipeOutputItemID = par4ItemStack.itemID;
    027            this.recipeWidth = par1;
    028            this.recipeHeight = par2;
    029            this.recipeItems = par3ArrayOfItemStack;
    030            this.recipeOutput = par4ItemStack;
    031        }
    032
    033        public ItemStack getRecipeOutput()
    034        {
    035            return this.recipeOutput;
    036        }
    037
    038        /**
    039         * Used to check if a recipe matches current crafting inventory
    040         */
    041        public boolean matches(InventoryCrafting par1InventoryCrafting, World par2World)
    042        {
    043            for (int var3 = 0; var3 <= 3 - this.recipeWidth; ++var3)
    044            {
    045                for (int var4 = 0; var4 <= 3 - this.recipeHeight; ++var4)
    046                {
    047                    if (this.checkMatch(par1InventoryCrafting, var3, var4, true))
    048                    {
    049                        return true;
    050                    }
    051
    052                    if (this.checkMatch(par1InventoryCrafting, var3, var4, false))
    053                    {
    054                        return true;
    055                    }
    056                }
    057            }
    058
    059            return false;
    060        }
    061
    062        /**
    063         * Checks if the region of a crafting inventory is match for the recipe.
    064         */
    065        private boolean checkMatch(InventoryCrafting par1InventoryCrafting, int par2, int par3, boolean par4)
    066        {
    067            for (int var5 = 0; var5 < 3; ++var5)
    068            {
    069                for (int var6 = 0; var6 < 3; ++var6)
    070                {
    071                    int var7 = var5 - par2;
    072                    int var8 = var6 - par3;
    073                    ItemStack var9 = null;
    074
    075                    if (var7 >= 0 && var8 >= 0 && var7 < this.recipeWidth && var8 < this.recipeHeight)
    076                    {
    077                        if (par4)
    078                        {
    079                            var9 = this.recipeItems[this.recipeWidth - var7 - 1 + var8 * this.recipeWidth];
    080                        }
    081                        else
    082                        {
    083                            var9 = this.recipeItems[var7 + var8 * this.recipeWidth];
    084                        }
    085                    }
    086
    087                    ItemStack var10 = par1InventoryCrafting.getStackInRowAndColumn(var5, var6);
    088
    089                    if (var10 != null || var9 != null)
    090                    {
    091                        if (var10 == null && var9 != null || var10 != null && var9 == null)
    092                        {
    093                            return false;
    094                        }
    095
    096                        if (var9.itemID != var10.itemID)
    097                        {
    098                            return false;
    099                        }
    100
    101                        if (var9.getItemDamage() != -1 && var9.getItemDamage() != var10.getItemDamage())
    102                        {
    103                            return false;
    104                        }
    105                    }
    106                }
    107            }
    108
    109            return true;
    110        }
    111
    112        /**
    113         * Returns an Item that is the result of this recipe
    114         */
    115        public ItemStack getCraftingResult(InventoryCrafting par1InventoryCrafting)
    116        {
    117            return this.getRecipeOutput().copy();
    118        }
    119
    120        /**
    121         * Returns the size of the recipe area
    122         */
    123        public int getRecipeSize()
    124        {
    125            return this.recipeWidth * this.recipeHeight;
    126        }
    127    }