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. */
private final int recipeWidth;
/** How many vertical slots this recipe uses. */
private final int recipeHeight;
/** Is a array of ItemStack that composes the recipe. */
private final ItemStack[] recipeItems;
/** Is the ItemStack that you get when craft the recipe. */
private final ItemStack recipeOutput;
private boolean field_92101_f;
private static final String __OBFID = "CL_00000093";
public ShapedRecipes(int p_i1917_1_, int p_i1917_2_, ItemStack[] p_i1917_3_, ItemStack p_i1917_4_)
{
this.recipeWidth = p_i1917_1_;
this.recipeHeight = p_i1917_2_;
this.recipeItems = p_i1917_3_;
this.recipeOutput = p_i1917_4_;
}
public ItemStack getRecipeOutput()
{
return this.recipeOutput;
}
public ItemStack[] func_179532_b(InventoryCrafting p_179532_1_)
{
ItemStack[] var2 = new ItemStack[p_179532_1_.getSizeInventory()];
for (int var3 = 0; var3 < var2.length; ++var3)
{
ItemStack var4 = p_179532_1_.getStackInSlot(var3);
if (var4 != null && var4.getItem().hasContainerItem())
{
var2[var3] = new ItemStack(var4.getItem().getContainerItem());
}
}
return var2;
}
/**
* Used to check if a recipe matches current crafting inventory
*/
public boolean matches(InventoryCrafting p_77569_1_, World worldIn)
{
for (int var3 = 0; var3 <= 3 - this.recipeWidth; ++var3)
{
for (int var4 = 0; var4 <= 3 - this.recipeHeight; ++var4)
{
if (this.checkMatch(p_77569_1_, var3, var4, true))
{
return true;
}
if (this.checkMatch(p_77569_1_, var3, var4, false))
{
return true;
}
}
}
return false;
}
/**
* Checks if the region of a crafting inventory is match for the recipe.
*/
private boolean checkMatch(InventoryCrafting p_77573_1_, int p_77573_2_, int p_77573_3_, boolean p_77573_4_)
{
for (int var5 = 0; var5 < 3; ++var5)
{
for (int var6 = 0; var6 < 3; ++var6)
{
int var7 = var5 - p_77573_2_;
int var8 = var6 - p_77573_3_;
ItemStack var9 = null;
if (var7 >= 0 && var8 >= 0 && var7 < this.recipeWidth && var8 < this.recipeHeight)
{
if (p_77573_4_)
{
var9 = this.recipeItems[this.recipeWidth - var7 - 1 + var8 * this.recipeWidth];
}
else
{
var9 = this.recipeItems[var7 + var8 * this.recipeWidth];
}
}
ItemStack var10 = p_77573_1_.getStackInRowAndColumn(var5, var6);
if (var10 != null || var9 != null)
{
if (var10 == null && var9 != null || var10 != null && var9 == null)
{
return false;
}
if (var9.getItem() != var10.getItem())
{
return false;
}
if (var9.getMetadata() != 32767 && var9.getMetadata() != var10.getMetadata())
{
return false;
}
}
}
}
return true;
}
/**
* Returns an Item that is the result of this recipe
*/
public ItemStack getCraftingResult(InventoryCrafting p_77572_1_)
{
ItemStack var2 = this.getRecipeOutput().copy();
if (this.field_92101_f)
{
for (int var3 = 0; var3 < p_77572_1_.getSizeInventory(); ++var3)
{
ItemStack var4 = p_77572_1_.getStackInSlot(var3);
if (var4 != null && var4.hasTagCompound())
{
var2.setTagCompound((NBTTagCompound)var4.getTagCompound().copy());
}
}
}
return var2;
}
/**
* Returns the size of the recipe area
*/
public int getRecipeSize()
{
return this.recipeWidth * this.recipeHeight;
}
public ShapedRecipes func_92100_c()
{
this.field_92101_f = true;
return this;
}
}