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