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 }