@@ -0,0 +1,3382 @@
+package net.acomputerdog.Blazeloader.api.recipe;%0A%0Aimport net.minecraft.inventory.InventoryCrafting;%0Aimport net.minecraft.item.ItemStack;%0Aimport net.minecraft.item.crafting.ShapedRecipes;%0Aimport net.minecraft.world.World;%0A%0Apublic class BShapedRecipe extends ShapedRecipes%0A%7B%0A    /** How many horizontal slots this recipe is wide. */%0A    private int recipeWidth;%0A%0A    /** How many vertical slots this recipe uses. */%0A    private int recipeHeight;%0A    %0A    %0A    private int craftingWidth = 3;%0A    private int craftingHeight = 3;%0A%0A    /** Is a array of ItemStack that composes the recipe. */%0A    protected ItemStack%5B%5D recipeItems;%0A%0A    public BShapedRecipe(int par1, int par2, ItemStack%5B%5D par3ArrayOfItemStack, ItemStack par4ItemStack)%0A    %7B%0A    %09super(par1, par2, par3ArrayOfItemStack, par4ItemStack);%0A        this.recipeWidth = par1;%0A        this.recipeHeight = par2;%0A        this.recipeItems = par3ArrayOfItemStack;%0A    %7D%0A    %0A    public void setCraftingSize(int width, int height) %7B%0A    %09craftingWidth = width;%0A    %09craftingHeight = height;%0A    %7D%0A%0A    /**%0A     * Used to check if a recipe matches current crafting inventory%0A     */%0A    public boolean matches(InventoryCrafting par1InventoryCrafting, World par2World)%0A    %7B%0A        for (int var3 = 0; var3 %3C= craftingWidth - this.recipeWidth; ++var3) %7B%0A            for (int var4 = 0; var4 %3C= craftingHeight - this.recipeHeight; ++var4) %7B%0A                if (this.checkMatch(par1InventoryCrafting, var3, var4, true))%0A                %7B%0A                    return true;%0A                %7D%0A%0A                if (this.checkMatch(par1InventoryCrafting, var3, var4, false))%0A                %7B%0A                    return true;%0A                %7D%0A            %7D%0A        %7D%0A%0A        return false;%0A    %7D%0A%0A    /**%0A     * Checks if the region of a crafting inventory is match for the recipe.%0A     */%0A    private boolean checkMatch(InventoryCrafting par1InventoryCrafting, int par2, int par3, boolean par4)%0A    %7B%0A        for (int var5 = 0; var5 %3C craftingWidth; ++var5)%0A        %7B%0A            for (int var6 = 0; var6 %3C craftingHeight; ++var6)%0A            %7B%0A                int var7 = var5 - par2;%0A                int var8 = var6 - par3;%0A                ItemStack var9 = null;%0A%0A                if (var7 %3E= 0 && var8 %3E= 0 && var7 %3C this.recipeWidth && var8 %3C this.recipeHeight)%0A                %7B%0A                    if (par4)%0A                    %7B%0A                        var9 = this.recipeItems%5Bthis.recipeWidth - var7 - 1 + var8 * this.recipeWidth%5D;%0A                    %7D%0A                    else%0A                    %7B%0A                        var9 = this.recipeItems%5Bvar7 + var8 * this.recipeWidth%5D;%0A                    %7D%0A                %7D%0A%0A                ItemStack var10 = par1InventoryCrafting.getStackInRowAndColumn(var5, var6);%0A%0A                if (var10 != null %7C%7C var9 != null)%0A                %7B%0A                    if (var10 == null && var9 != null %7C%7C var10 != null && var9 == null)%0A                    %7B%0A                        return false;%0A                    %7D%0A%0A                    if (var9 != var10)%0A                    %7B%0A                        return false;%0A                    %7D%0A%0A                    if (var9.getItemDamage() != 32767 && var9.getItemDamage() != var10.getItemDamage())%0A                    %7B%0A                        return false;%0A                    %7D%0A                %7D%0A            %7D%0A        %7D%0A%0A        return true;%0A    %7D%0A%7D%0A%0A

Create BShapedRecipe.java