package net.minecraft.item.crafting;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
public class ShapedRecipes implements IRecipe
{
/** How many horizontal slots this recipe is wide. */
public final int recipeWidth;
/** How many vertical slots this recipe uses. */
public final int recipeHeight;
/** Is a array of ItemStack that composes the recipe. */
public final ItemStack[] recipeItems;
/** Is the ItemStack that you get when craft the recipe. */
private ItemStack recipeOutput;
/** Is the itemID of the output item that you get when craft the recipe. */
public final int recipeOutputItemID;
private boolean field_92049_f = false;
public ShapedRecipes(int par1, int par2, ItemStack[] par3ArrayOfItemStack, ItemStack par4ItemStack)
{
this.recipeOutputItemID = par4ItemStack.itemID;
this.recipeWidth = par1;
this.recipeHeight = par2;
this.recipeItems = par3ArrayOfItemStack;
this.recipeOutput = par4ItemStack;
}
public ItemStack getRecipeOutput()
{
return this.recipeOutput;
}
/**
* Used to check if a recipe matches current crafting inventory
*/
public boolean matches(InventoryCrafting par1InventoryCrafting, World par2World)
{
for (int var3 = 0; var3 <= 3 - this.recipeWidth; ++var3)
{
for (int var4 = 0; var4 <= 3 - this.recipeHeight; ++var4)
{
if (this.checkMatch(par1InventoryCrafting, var3, var4, true))
{
return true;
}
if (this.checkMatch(par1InventoryCrafting, var3, var4, false))
{
return true;
}
}
}
return false;
}
/**
* Checks if the region of a crafting inventory is match for the recipe.
*/
private boolean checkMatch(InventoryCrafting par1InventoryCrafting, int par2, int par3, boolean par4)
{
for (int var5 = 0; var5 < 3; ++var5)
{
for (int var6 = 0; var6 < 3; ++var6)
{
int var7 = var5 - par2;
int var8 = var6 - par3;
ItemStack var9 = null;
if (var7 >= 0 && var8 >= 0 && var7 < this.recipeWidth && var8 < this.recipeHeight)
{
if (par4)
{
var9 = this.recipeItems[this.recipeWidth - var7 - 1 + var8 * this.recipeWidth];
}
else
{
var9 = this.recipeItems[var7 + var8 * this.recipeWidth];
}
}
ItemStack var10 = par1InventoryCrafting.getStackInRowAndColumn(var5, var6);
if (var10 != null || var9 != null)
{
if (var10 == null && var9 != null || var10 != null && var9 == null)
{
return false;
}
if (var9.itemID != var10.itemID)
{
return false;
}
if (var9.getItemDamage() != -1 && var9.getItemDamage() != var10.getItemDamage())
{
return false;
}
}
}
}
return true;
}
/**
* Returns an Item that is the result of this recipe
*/
public ItemStack getCraftingResult(InventoryCrafting par1InventoryCrafting)
{
ItemStack var2 = this.getRecipeOutput().copy();
if (this.field_92049_f)
{
for (int var3 = 0; var3 < par1InventoryCrafting.getSizeInventory(); ++var3)
{
ItemStack var4 = par1InventoryCrafting.getStackInSlot(var3);
if (var4 != null && var4.hasTagCompound())
{
var2.setTagCompound((NBTTagCompound)var4.stackTagCompound.copy());
}
}
}
return var2;
}
/**
* Returns the size of the recipe area
*/
public int getRecipeSize()
{
return this.recipeWidth * this.recipeHeight;
}
public ShapedRecipes func_92048_c()
{
this.field_92049_f = true;
return this;
}
}