    001    package net.minecraft.src;
    002
    003    import java.util.ArrayList;
    004    import java.util.Collections;
    005    import java.util.HashMap;
    006    import java.util.Iterator;
    007    import java.util.List;
    008
    009    public class CraftingManager
    010    {
    011        /** The static instance of this class */
    012        private static final CraftingManager instance = new CraftingManager();
    013
    014        /** A list of all the recipes added */
    015        private List recipes = new ArrayList();
    016
    017        /**
    018         * Returns the static instance of this class
    019         */
    020        public static final CraftingManager getInstance()
    021        {
    022            return instance;
    023        }
    024
    025        private CraftingManager()
    026        {
    027            (new RecipesTools()).addRecipes(this);
    028            (new RecipesWeapons()).addRecipes(this);
    029            (new RecipesIngots()).addRecipes(this);
    030            (new RecipesFood()).addRecipes(this);
    031            (new RecipesCrafting()).addRecipes(this);
    032            (new RecipesArmor()).addRecipes(this);
    033            (new RecipesDyes()).addRecipes(this);
    034            this.recipes.add(new RecipesArmorDyes());
    035            this.recipes.add(new RecipesMapCloning());
    036            this.recipes.add(new RecipesMapExtending());
    037            this.addRecipe(new ItemStack(Item.paper, 3), new Object[] {"###", '#', Item.reed});
    038            this.addShapelessRecipe(new ItemStack(Item.book, 1), new Object[] {Item.paper, Item.paper, Item.paper, Item.leather});
    039            this.addShapelessRecipe(new ItemStack(Item.writableBook, 1), new Object[] {Item.book, new ItemStack(Item.dyePowder, 1, 0), Item.feather});
    040            this.addRecipe(new ItemStack(Block.fence, 2), new Object[] {"###", "###", '#', Item.stick});
    041            this.addRecipe(new ItemStack(Block.cobblestoneWall, 6, 0), new Object[] {"###", "###", '#', Block.cobblestone});
    042            this.addRecipe(new ItemStack(Block.cobblestoneWall, 6, 1), new Object[] {"###", "###", '#', Block.cobblestoneMossy});
    043            this.addRecipe(new ItemStack(Block.netherFence, 6), new Object[] {"###", "###", '#', Block.netherBrick});
    044            this.addRecipe(new ItemStack(Block.fenceGate, 1), new Object[] {"#W#", "#W#", '#', Item.stick, 'W', Block.planks});
    045            this.addRecipe(new ItemStack(Block.jukebox, 1), new Object[] {"###", "#X#", "###", '#', Block.planks, 'X', Item.diamond});
    046            this.addRecipe(new ItemStack(Block.music, 1), new Object[] {"###", "#X#", "###", '#', Block.planks, 'X', Item.redstone});
    047            this.addRecipe(new ItemStack(Block.bookShelf, 1), new Object[] {"###", "XXX", "###", '#', Block.planks, 'X', Item.book});
    048            this.addRecipe(new ItemStack(Block.blockSnow, 1), new Object[] {"##", "##", '#', Item.snowball});
    049            this.addRecipe(new ItemStack(Block.blockClay, 1), new Object[] {"##", "##", '#', Item.clay});
    050            this.addRecipe(new ItemStack(Block.brick, 1), new Object[] {"##", "##", '#', Item.brick});
    051            this.addRecipe(new ItemStack(Block.glowStone, 1), new Object[] {"##", "##", '#', Item.lightStoneDust});
    052            this.addRecipe(new ItemStack(Block.cloth, 1), new Object[] {"##", "##", '#', Item.silk});
    053            this.addRecipe(new ItemStack(Block.tnt, 1), new Object[] {"X#X", "#X#", "X#X", 'X', Item.gunpowder, '#', Block.sand});
    054            this.addRecipe(new ItemStack(Block.stoneSingleSlab, 6, 3), new Object[] {"###", '#', Block.cobblestone});
    055            this.addRecipe(new ItemStack(Block.stoneSingleSlab, 6, 0), new Object[] {"###", '#', Block.stone});
    056            this.addRecipe(new ItemStack(Block.stoneSingleSlab, 6, 1), new Object[] {"###", '#', Block.sandStone});
    057            this.addRecipe(new ItemStack(Block.stoneSingleSlab, 6, 4), new Object[] {"###", '#', Block.brick});
    058            this.addRecipe(new ItemStack(Block.stoneSingleSlab, 6, 5), new Object[] {"###", '#', Block.stoneBrick});
    059            this.addRecipe(new ItemStack(Block.woodSingleSlab, 6, 0), new Object[] {"###", '#', new ItemStack(Block.planks, 1, 0)});
    060            this.addRecipe(new ItemStack(Block.woodSingleSlab, 6, 2), new Object[] {"###", '#', new ItemStack(Block.planks, 1, 2)});
    061            this.addRecipe(new ItemStack(Block.woodSingleSlab, 6, 1), new Object[] {"###", '#', new ItemStack(Block.planks, 1, 1)});
    062            this.addRecipe(new ItemStack(Block.woodSingleSlab, 6, 3), new Object[] {"###", '#', new ItemStack(Block.planks, 1, 3)});
    063            this.addRecipe(new ItemStack(Block.ladder, 3), new Object[] {"# #", "###", "# #", '#', Item.stick});
    064            this.addRecipe(new ItemStack(Item.doorWood, 1), new Object[] {"##", "##", "##", '#', Block.planks});
    065            this.addRecipe(new ItemStack(Block.trapdoor, 2), new Object[] {"###", "###", '#', Block.planks});
    066            this.addRecipe(new ItemStack(Item.doorSteel, 1), new Object[] {"##", "##", "##", '#', Item.ingotIron});
    067            this.addRecipe(new ItemStack(Item.sign, 3), new Object[] {"###", "###", " X ", '#', Block.planks, 'X', Item.stick});
    068            this.addRecipe(new ItemStack(Item.cake, 1), new Object[] {"AAA", "BEB", "CCC", 'A', Item.bucketMilk, 'B', Item.sugar, 'C', Item.wheat, 'E', Item.egg});
    069            this.addRecipe(new ItemStack(Item.sugar, 1), new Object[] {"#", '#', Item.reed});
    070            this.addRecipe(new ItemStack(Block.planks, 4, 0), new Object[] {"#", '#', new ItemStack(Block.wood, 1, 0)});
    071            this.addRecipe(new ItemStack(Block.planks, 4, 1), new Object[] {"#", '#', new ItemStack(Block.wood, 1, 1)});
    072            this.addRecipe(new ItemStack(Block.planks, 4, 2), new Object[] {"#", '#', new ItemStack(Block.wood, 1, 2)});
    073            this.addRecipe(new ItemStack(Block.planks, 4, 3), new Object[] {"#", '#', new ItemStack(Block.wood, 1, 3)});
    074            this.addRecipe(new ItemStack(Item.stick, 4), new Object[] {"#", "#", '#', Block.planks});
    075            this.addRecipe(new ItemStack(Block.torchWood, 4), new Object[] {"X", "#", 'X', Item.coal, '#', Item.stick});
    076            this.addRecipe(new ItemStack(Block.torchWood, 4), new Object[] {"X", "#", 'X', new ItemStack(Item.coal, 1, 1), '#', Item.stick});
    077            this.addRecipe(new ItemStack(Item.bowlEmpty, 4), new Object[] {"# #", " # ", '#', Block.planks});
    078            this.addRecipe(new ItemStack(Item.glassBottle, 3), new Object[] {"# #", " # ", '#', Block.glass});
    079            this.addRecipe(new ItemStack(Block.rail, 16), new Object[] {"X X", "X#X", "X X", 'X', Item.ingotIron, '#', Item.stick});
    080            this.addRecipe(new ItemStack(Block.railPowered, 6), new Object[] {"X X", "X#X", "XRX", 'X', Item.ingotGold, 'R', Item.redstone, '#', Item.stick});
    081            this.addRecipe(new ItemStack(Block.railDetector, 6), new Object[] {"X X", "X#X", "XRX", 'X', Item.ingotIron, 'R', Item.redstone, '#', Block.pressurePlateStone});
    082            this.addRecipe(new ItemStack(Item.minecartEmpty, 1), new Object[] {"# #", "###", '#', Item.ingotIron});
    083            this.addRecipe(new ItemStack(Item.cauldron, 1), new Object[] {"# #", "# #", "###", '#', Item.ingotIron});
    084            this.addRecipe(new ItemStack(Item.brewingStand, 1), new Object[] {" B ", "###", '#', Block.cobblestone, 'B', Item.blazeRod});
    085            this.addRecipe(new ItemStack(Block.pumpkinLantern, 1), new Object[] {"A", "B", 'A', Block.pumpkin, 'B', Block.torchWood});
    086            this.addRecipe(new ItemStack(Item.minecartCrate, 1), new Object[] {"A", "B", 'A', Block.chest, 'B', Item.minecartEmpty});
    087            this.addRecipe(new ItemStack(Item.minecartPowered, 1), new Object[] {"A", "B", 'A', Block.stoneOvenIdle, 'B', Item.minecartEmpty});
    088            this.addRecipe(new ItemStack(Item.boat, 1), new Object[] {"# #", "###", '#', Block.planks});
    089            this.addRecipe(new ItemStack(Item.bucketEmpty, 1), new Object[] {"# #", " # ", '#', Item.ingotIron});
    090            this.addRecipe(new ItemStack(Item.flowerPot, 1), new Object[] {"# #", " # ", '#', Item.brick});
    091            this.addRecipe(new ItemStack(Item.flintAndSteel, 1), new Object[] {"A ", " B", 'A', Item.ingotIron, 'B', Item.flint});
    092            this.addRecipe(new ItemStack(Item.bread, 1), new Object[] {"###", '#', Item.wheat});
    093            this.addRecipe(new ItemStack(Block.stairCompactPlanks, 4), new Object[] {"#  ", "## ", "###", '#', new ItemStack(Block.planks, 1, 0)});
    094            this.addRecipe(new ItemStack(Block.stairsWoodBirch, 4), new Object[] {"#  ", "## ", "###", '#', new ItemStack(Block.planks, 1, 2)});
    095            this.addRecipe(new ItemStack(Block.stairsWoodSpruce, 4), new Object[] {"#  ", "## ", "###", '#', new ItemStack(Block.planks, 1, 1)});
    096            this.addRecipe(new ItemStack(Block.stairsWoodJungle, 4), new Object[] {"#  ", "## ", "###", '#', new ItemStack(Block.planks, 1, 3)});
    097            this.addRecipe(new ItemStack(Item.fishingRod, 1), new Object[] {"  #", " #X", "# X", '#', Item.stick, 'X', Item.silk});
    098            this.addRecipe(new ItemStack(Item.carrotOnAStick, 1), new Object[] {"# ", " X", '#', Item.fishingRod, 'X', Item.carrot});
    099            this.addRecipe(new ItemStack(Block.stairCompactCobblestone, 4), new Object[] {"#  ", "## ", "###", '#', Block.cobblestone});
    100            this.addRecipe(new ItemStack(Block.stairsBrick, 4), new Object[] {"#  ", "## ", "###", '#', Block.brick});
    101            this.addRecipe(new ItemStack(Block.stairsStoneBrickSmooth, 4), new Object[] {"#  ", "## ", "###", '#', Block.stoneBrick});
    102            this.addRecipe(new ItemStack(Block.stairsNetherBrick, 4), new Object[] {"#  ", "## ", "###", '#', Block.netherBrick});
    103            this.addRecipe(new ItemStack(Block.stairsSandStone, 4), new Object[] {"#  ", "## ", "###", '#', Block.sandStone});
    104            this.addRecipe(new ItemStack(Item.painting, 1), new Object[] {"###", "#X#", "###", '#', Item.stick, 'X', Block.cloth});
    105            this.addRecipe(new ItemStack(Item.itemFrame, 1), new Object[] {"###", "#X#", "###", '#', Item.stick, 'X', Item.leather});
    106            this.addRecipe(new ItemStack(Item.appleGold, 1, 0), new Object[] {"###", "#X#", "###", '#', Item.goldNugget, 'X', Item.appleRed});
    107            this.addRecipe(new ItemStack(Item.appleGold, 1, 1), new Object[] {"###", "#X#", "###", '#', Block.blockGold, 'X', Item.appleRed});
    108            this.addRecipe(new ItemStack(Item.goldenCarrot, 1, 0), new Object[] {"###", "#X#", "###", '#', Item.goldNugget, 'X', Item.carrot});
    109            this.addRecipe(new ItemStack(Block.lever, 1), new Object[] {"X", "#", '#', Block.cobblestone, 'X', Item.stick});
    110            this.addRecipe(new ItemStack(Block.tripWireSource, 2), new Object[] {"I", "S", "#", '#', Block.planks, 'S', Item.stick, 'I', Item.ingotIron});
    111            this.addRecipe(new ItemStack(Block.torchRedstoneActive, 1), new Object[] {"X", "#", '#', Item.stick, 'X', Item.redstone});
    112            this.addRecipe(new ItemStack(Item.redstoneRepeater, 1), new Object[] {"#X#", "III", '#', Block.torchRedstoneActive, 'X', Item.redstone, 'I', Block.stone});
    113            this.addRecipe(new ItemStack(Item.pocketSundial, 1), new Object[] {" # ", "#X#", " # ", '#', Item.ingotGold, 'X', Item.redstone});
    114            this.addRecipe(new ItemStack(Item.compass, 1), new Object[] {" # ", "#X#", " # ", '#', Item.ingotIron, 'X', Item.redstone});
    115            this.addRecipe(new ItemStack(Item.emptyMap, 1), new Object[] {"###", "#X#", "###", '#', Item.paper, 'X', Item.compass});
    116            this.addRecipe(new ItemStack(Block.stoneButton, 1), new Object[] {"#", '#', Block.stone});
    117            this.addRecipe(new ItemStack(Block.woodenButton, 1), new Object[] {"#", '#', Block.planks});
    118            this.addRecipe(new ItemStack(Block.pressurePlateStone, 1), new Object[] {"##", '#', Block.stone});
    119            this.addRecipe(new ItemStack(Block.pressurePlatePlanks, 1), new Object[] {"##", '#', Block.planks});
    120            this.addRecipe(new ItemStack(Block.dispenser, 1), new Object[] {"###", "#X#", "#R#", '#', Block.cobblestone, 'X', Item.bow, 'R', Item.redstone});
    121            this.addRecipe(new ItemStack(Block.pistonBase, 1), new Object[] {"TTT", "#X#", "#R#", '#', Block.cobblestone, 'X', Item.ingotIron, 'R', Item.redstone, 'T', Block.planks});
    122            this.addRecipe(new ItemStack(Block.pistonStickyBase, 1), new Object[] {"S", "P", 'S', Item.slimeBall, 'P', Block.pistonBase});
    123            this.addRecipe(new ItemStack(Item.bed, 1), new Object[] {"###", "XXX", '#', Block.cloth, 'X', Block.planks});
    124            this.addRecipe(new ItemStack(Block.enchantmentTable, 1), new Object[] {" B ", "D#D", "###", '#', Block.obsidian, 'B', Item.book, 'D', Item.diamond});
    125            this.addRecipe(new ItemStack(Block.anvil, 1), new Object[] {"III", " i ", "iii", 'I', Block.blockSteel, 'i', Item.ingotIron});
    126            this.addShapelessRecipe(new ItemStack(Item.eyeOfEnder, 1), new Object[] {Item.enderPearl, Item.blazePowder});
    127            this.addShapelessRecipe(new ItemStack(Item.fireballCharge, 3), new Object[] {Item.gunpowder, Item.blazePowder, Item.coal});
    128            this.addShapelessRecipe(new ItemStack(Item.fireballCharge, 3), new Object[] {Item.gunpowder, Item.blazePowder, new ItemStack(Item.coal, 1, 1)});
    129            Collections.sort(this.recipes, new RecipeSorter(this));
    130            System.out.println(this.recipes.size() + " recipes");
    131        }
    132
    133        /**
    134         * Adds a recipe. See spreadsheet on first page for details.
    135         */
    136        public void addRecipe(ItemStack par1ItemStack, Object ... par2ArrayOfObj)
    137        {
    138            String var3 = "";
    139            int var4 = 0;
    140            int var5 = 0;
    141            int var6 = 0;
    142            int var9;
    143
    144            if (par2ArrayOfObj[var4] instanceof String[])
    145            {
    146                String[] var7 = (String[])((String[])par2ArrayOfObj[var4++]);
    147                String[] var8 = var7;
    148                var9 = var7.length;
    149
    150                for (int var10 = 0; var10 < var9; ++var10)
    151                {
    152                    String var11 = var8[var10];
    153                    ++var6;
    154                    var5 = var11.length();
    155                    var3 = var3 + var11;
    156                }
    157            }
    158            else
    159            {
    160                while (par2ArrayOfObj[var4] instanceof String)
    161                {
    162                    String var13 = (String)par2ArrayOfObj[var4++];
    163                    ++var6;
    164                    var5 = var13.length();
    165                    var3 = var3 + var13;
    166                }
    167            }
    168
    169            HashMap var14;
    170
    171            for (var14 = new HashMap(); var4 < par2ArrayOfObj.length; var4 += 2)
    172            {
    173                Character var16 = (Character)par2ArrayOfObj[var4];
    174                ItemStack var17 = null;
    175
    176                if (par2ArrayOfObj[var4 + 1] instanceof Item)
    177                {
    178                    var17 = new ItemStack((Item)par2ArrayOfObj[var4 + 1]);
    179                }
    180                else if (par2ArrayOfObj[var4 + 1] instanceof Block)
    181                {
    182                    var17 = new ItemStack((Block)par2ArrayOfObj[var4 + 1], 1, -1);
    183                }
    184                else if (par2ArrayOfObj[var4 + 1] instanceof ItemStack)
    185                {
    186                    var17 = (ItemStack)par2ArrayOfObj[var4 + 1];
    187                }
    188
    189                var14.put(var16, var17);
    190            }
    191
    192            ItemStack[] var15 = new ItemStack[var5 * var6];
    193
    194            for (var9 = 0; var9 < var5 * var6; ++var9)
    195            {
    196                char var18 = var3.charAt(var9);
    197
    198                if (var14.containsKey(Character.valueOf(var18)))
    199                {
    200                    var15[var9] = ((ItemStack)var14.get(Character.valueOf(var18))).copy();
    201                }
    202                else
    203                {
    204                    var15[var9] = null;
    205                }
    206            }
    207
    208            this.recipes.add(new ShapedRecipes(var5, var6, var15, par1ItemStack));
    209        }
    210
    211        public void addShapelessRecipe(ItemStack par1ItemStack, Object ... par2ArrayOfObj)
    212        {
    213            ArrayList var3 = new ArrayList();
    214            Object[] var4 = par2ArrayOfObj;
    215            int var5 = par2ArrayOfObj.length;
    216
    217            for (int var6 = 0; var6 < var5; ++var6)
    218            {
    219                Object var7 = var4[var6];
    220
    221                if (var7 instanceof ItemStack)
    222                {
    223                    var3.add(((ItemStack)var7).copy());
    224                }
    225                else if (var7 instanceof Item)
    226                {
    227                    var3.add(new ItemStack((Item)var7));
    228                }
    229                else
    230                {
    231                    if (!(var7 instanceof Block))
    232                    {
    233                        throw new RuntimeException("Invalid shapeless recipy!");
    234                    }
    235
    236                    var3.add(new ItemStack((Block)var7));
    237                }
    238            }
    239
    240            this.recipes.add(new ShapelessRecipes(par1ItemStack, var3));
    241        }
    242
    243        public ItemStack findMatchingRecipe(InventoryCrafting par1InventoryCrafting, World par2World)
    244        {
    245            int var3 = 0;
    246            ItemStack var4 = null;
    247            ItemStack var5 = null;
    248
    249            for (int var6 = 0; var6 < par1InventoryCrafting.getSizeInventory(); ++var6)
    250            {
    251                ItemStack var7 = par1InventoryCrafting.getStackInSlot(var6);
    252
    253                if (var7 != null)
    254                {
    255                    if (var3 == 0)
    256                    {
    257                        var4 = var7;
    258                    }
    259
    260                    if (var3 == 1)
    261                    {
    262                        var5 = var7;
    263                    }
    264
    265                    ++var3;
    266                }
    267            }
    268
    269            if (var3 == 2 && var4.itemID == var5.itemID && var4.stackSize == 1 && var5.stackSize == 1 && Item.itemsList[var4.itemID].isRepairable())
    270            {
    271                Item var13 = Item.itemsList[var4.itemID];
    272                int var14 = var13.getMaxDamage() - var4.getItemDamageForDisplay();
    273                int var8 = var13.getMaxDamage() - var5.getItemDamageForDisplay();
    274                int var9 = var14 + var8 + var13.getMaxDamage() * 5 / 100;
    275                int var10 = var13.getMaxDamage() - var9;
    276
    277                if (var10 < 0)
    278                {
    279                    var10 = 0;
    280                }
    281
    282                return new ItemStack(var4.itemID, 1, var10);
    283            }
    284            else
    285            {
    286                Iterator var11 = this.recipes.iterator();
    287                IRecipe var12;
    288
    289                do
    290                {
    291                    if (!var11.hasNext())
    292                    {
    293                        return null;
    294                    }
    295
    296                    var12 = (IRecipe)var11.next();
    297                }
    298                while (!var12.matches(par1InventoryCrafting, par2World));
    299
    300                return var12.getCraftingResult(par1InventoryCrafting);
    301            }
    302        }
    303
    304        /**
    305         * returns the List<> of all recipes
    306         */
    307        public List getRecipeList()
    308        {
    309            return this.recipes;
    310        }
    311    }