269 lines
5.6 KiB
Java
269 lines
5.6 KiB
Java
package net.einsteinsci.betterbeginnings.register.recipe;
|
|
|
|
import net.einsteinsci.betterbeginnings.inventory.InventoryWorkbenchAdditionalMaterials;
|
|
import net.minecraft.inventory.InventoryCrafting;
|
|
import net.minecraft.item.Item;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.world.World;
|
|
|
|
public class AdvancedRecipe
|
|
{
|
|
/**
|
|
* 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 OreRecipeElement[] recipeItems;
|
|
/**
|
|
* Is the ItemStack that you get when craft the recipe.
|
|
*/
|
|
private ItemStack recipeOutput;
|
|
|
|
// additional materials in the side slots
|
|
private OreRecipeElement[] addedMaterials;
|
|
|
|
// ...something...
|
|
private boolean strangeFlag;
|
|
|
|
public AdvancedRecipe(int width, int height, OreRecipeElement[] items, ItemStack output,
|
|
OreRecipeElement[] materials)
|
|
{
|
|
recipeWidth = width;
|
|
recipeHeight = height;
|
|
recipeItems = items;
|
|
recipeOutput = output;
|
|
addedMaterials = materials;
|
|
}
|
|
|
|
// @Override
|
|
public boolean matches(InventoryCrafting invCrafting, InventoryWorkbenchAdditionalMaterials materials,
|
|
World world)
|
|
{
|
|
for (int i = 0; i <= 3 - recipeWidth; ++i)
|
|
{
|
|
for (int j = 0; j <= 3 - recipeHeight; ++j)
|
|
{
|
|
if (checkMatch(invCrafting, materials, i, j, true))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
if (checkMatch(invCrafting, materials, i, j, false))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// Not sure what that fourth flag is...
|
|
private boolean checkMatch(InventoryCrafting crafting, InventoryWorkbenchAdditionalMaterials materials, int width,
|
|
int height, boolean flag4)
|
|
{
|
|
for (int k = 0; k < 3; ++k)
|
|
{
|
|
for (int l = 0; l < 3; ++l)
|
|
{
|
|
int i1 = k - width;
|
|
int j1 = l - height;
|
|
OreRecipeElement neededCraftingStack = null;
|
|
|
|
if (i1 >= 0 && j1 >= 0 && i1 < recipeWidth && j1 < recipeHeight)
|
|
{
|
|
if (flag4)
|
|
{
|
|
neededCraftingStack = recipeItems[recipeWidth - i1 - 1 + j1 * recipeWidth];
|
|
}
|
|
else
|
|
{
|
|
neededCraftingStack = recipeItems[i1 + j1 * recipeWidth];
|
|
}
|
|
}
|
|
|
|
ItemStack craftingStackInQuestion = crafting.getStackInRowAndColumn(k, l);
|
|
|
|
if (craftingStackInQuestion != null || neededCraftingStack != null)
|
|
{
|
|
if (craftingStackInQuestion == null && neededCraftingStack != null ||
|
|
craftingStackInQuestion != null && neededCraftingStack == null)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (!neededCraftingStack.matches(craftingStackInQuestion))
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
for (OreRecipeElement requiredMatStack : addedMaterials)
|
|
{
|
|
boolean foundIt = false;
|
|
for (int i2 = 0; i2 < materials.getSizeInventory(); ++i2)
|
|
{
|
|
ItemStack testedMatStack = materials.getStackInSlot(i2);
|
|
if (testedMatStack != null)
|
|
{
|
|
foundIt = requiredMatStack.matchesCheckSize(testedMatStack);
|
|
}
|
|
|
|
if (foundIt)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!foundIt)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public boolean matchesMostly(InventoryCrafting invCrafting, World world)
|
|
{
|
|
for (int i = 0; i <= 3 - recipeWidth; ++i)
|
|
{
|
|
for (int j = 0; j <= 3 - recipeHeight; ++j)
|
|
{
|
|
if (checkMatchMostly(invCrafting, i, j, true))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
if (checkMatchMostly(invCrafting, i, j, false))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public boolean checkMatchMostly(InventoryCrafting crafting, int width, int height, boolean flag4)
|
|
{
|
|
for (int k = 0; k < 3; ++k)
|
|
{
|
|
for (int l = 0; l < 3; ++l)
|
|
{
|
|
int i1 = k - width;
|
|
int j1 = l - height;
|
|
OreRecipeElement neededCraftingStack = null;
|
|
|
|
if (i1 >= 0 && j1 >= 0 && i1 < recipeWidth && j1 < recipeHeight)
|
|
{
|
|
if (flag4)
|
|
{
|
|
neededCraftingStack = recipeItems[recipeWidth - i1 - 1 + j1 * recipeWidth];
|
|
}
|
|
else
|
|
{
|
|
neededCraftingStack = recipeItems[i1 + j1 * recipeWidth];
|
|
}
|
|
}
|
|
|
|
ItemStack craftingStackInQuestion = crafting.getStackInRowAndColumn(k, l);
|
|
|
|
if (craftingStackInQuestion != null || neededCraftingStack != null)
|
|
{
|
|
// If one is null but not the other
|
|
if (craftingStackInQuestion == null || neededCraftingStack == null)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (!neededCraftingStack.matches(craftingStackInQuestion))
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public int getNeededMaterialCount(Item material)
|
|
{
|
|
for (OreRecipeElement stack : addedMaterials)
|
|
{
|
|
if (stack.matches(new ItemStack(material)))
|
|
{
|
|
return stack.stackSize;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
public OreRecipeElement[] getNeededMaterials()
|
|
{
|
|
return addedMaterials;
|
|
}
|
|
|
|
// @Override
|
|
public ItemStack getCraftingResult(InventoryCrafting crafting)
|
|
{
|
|
ItemStack itemstack = getRecipeOutput().copy();
|
|
|
|
if (strangeFlag)
|
|
{
|
|
for (int i = 0; i < crafting.getSizeInventory(); ++i)
|
|
{
|
|
ItemStack itemstack1 = crafting.getStackInSlot(i);
|
|
|
|
if (itemstack1 != null && itemstack1.hasTagCompound())
|
|
{
|
|
itemstack.setTagCompound((NBTTagCompound)itemstack1.getTagCompound().copy());
|
|
}
|
|
}
|
|
}
|
|
|
|
return itemstack;
|
|
}
|
|
|
|
// @Override
|
|
public ItemStack getRecipeOutput()
|
|
{
|
|
return recipeOutput;
|
|
}
|
|
|
|
// @Override
|
|
public int getRecipeSize()
|
|
{
|
|
return recipeWidth * recipeHeight;
|
|
}
|
|
|
|
public AdvancedRecipe func_92100_c()
|
|
{
|
|
strangeFlag = true;
|
|
return this;
|
|
}
|
|
|
|
public boolean hasMaterial(ItemStack stack)
|
|
{
|
|
for (OreRecipeElement s : addedMaterials)
|
|
{
|
|
if (s.matches(stack))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
}
|