Fixed duping bug with imprinter again...

Well again i have fixed a few duping bugs with the imprinter. This time
though i have made it a bit harder for it to break down. However, the
issue could happen again with the current crafting system.
This commit is contained in:
Robert Seifert 2013-05-20 16:06:32 -04:00
parent cac5f0d12a
commit b0574b7f58
2 changed files with 45 additions and 32 deletions

View file

@ -10,7 +10,6 @@ import net.minecraft.item.crafting.CraftingManager;
import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.crafting.ShapedRecipes; import net.minecraft.item.crafting.ShapedRecipes;
import net.minecraft.item.crafting.ShapelessRecipes; import net.minecraft.item.crafting.ShapelessRecipes;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent; import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent;
@ -27,7 +26,7 @@ import dark.library.helpers.Pair;
*/ */
public class AutoCraftingManager public class AutoCraftingManager
{ {
boolean doDebug = true; final static boolean doDebug = true;
TileEntity craftingEntity; TileEntity craftingEntity;
IInventory craftingInv; IInventory craftingInv;
@ -144,7 +143,10 @@ public class AutoCraftingManager
for (int slot = 0; slot < slots.length; slot++) for (int slot = 0; slot < slots.length; slot++)
{ {
containingItems[slot] = inv.getStackInSlot(slots[slot]); if (inv.getStackInSlot(slots[slot]) != null)
{
containingItems[slot] = inv.getStackInSlot(slots[slot]).copy();
}
} }
return containingItems; return containingItems;
@ -164,14 +166,16 @@ public class AutoCraftingManager
this.printDebug("ResourceChecker", "Looking for items"); this.printDebug("ResourceChecker", "Looking for items");
for (int i = 0; i < recipeItems.length && this.doDebug; i++) for (int i = 0; i < recipeItems.length && this.doDebug; i++)
{ {
this.printDebug("ResourceChecker", "ResourceChecker: Looking for " + recipeItems.toString()); this.printDebug("ResourceChecker", "Looking for " + recipeItems.toString());
} }
/** /**
* The actual amount of resource required. Each ItemStack will only have stacksize of 1. * The actual amount of resource required. Each ItemStack will only have stacksize of 1.
*/ */
ArrayList<ItemStack> actualResources = new ArrayList<ItemStack>(); ArrayList<ItemStack> actualResources = new ArrayList<ItemStack>();
int itemMatch = 0; int itemMatch = 0;
int itemInList = 0; int itemInList = 0;
for (Object obj : recipeItems) for (Object obj : recipeItems)
{ {
itemInList++; itemInList++;
@ -179,11 +183,12 @@ public class AutoCraftingManager
{ {
ItemStack recipeItem = (ItemStack) obj; ItemStack recipeItem = (ItemStack) obj;
actualResources.add(recipeItem.copy()); actualResources.add(recipeItem.copy());
if (recipeItem != null) if (recipeItem != null)
{ {
this.printDebug("ResourceChecker", "Item0" + itemInList + " = " + recipeItem.toString()); this.printDebug("ResourceChecker", "Item0" + itemInList + " = " + recipeItem.toString());
int match = this.doesItemExist(recipeItem, containingItems); int match = this.doesItemExist(recipeItem, containingItems);
if (match != -2) if (match >= 0)
{ {
containingItems[match] = this.decrStackSize(containingItems[match], recipeItem.stackSize); containingItems[match] = this.decrStackSize(containingItems[match], recipeItem.stackSize);
this.printDebug("ResourceChecker", "Match found @" + match); this.printDebug("ResourceChecker", "Match found @" + match);
@ -211,8 +216,7 @@ public class AutoCraftingManager
if (recipeItem != null) if (recipeItem != null)
{ {
int match = this.doesItemExist(recipeItem, containingItems); int match = this.doesItemExist(recipeItem, containingItems);
this.printDebug("ResourceChecker", "Item0" + itemInList + " = " + recipeItem.toString()); if (match >= 0)
if (match != -2)
{ {
containingItems[match] = this.decrStackSize(containingItems[match], recipeItem.stackSize); containingItems[match] = this.decrStackSize(containingItems[match], recipeItem.stackSize);
this.printDebug("ResourceChecker", "Match found @" + match); this.printDebug("ResourceChecker", "Match found @" + match);
@ -226,11 +230,10 @@ public class AutoCraftingManager
else else
{ {
this.printDebug("ResourceChecker", "Item0" + itemInList + " = null"); this.printDebug("ResourceChecker", "Item0" + itemInList + " = null");
itemMatch++;
} }
} }
boolean resourcesFound = itemMatch >= actualResources.size(); boolean resourcesFound = itemMatch >= actualResources.size();
this.printDebug("ResourceChecker", "Found " + actualResources.size() + " Items and " + itemMatch + " slot matches"); this.printDebug("ResourceChecker", actualResources.size() + " items needed and " + itemMatch + " valid matches found");
this.printDebug("ResourceChecker", "has all resources been found? /n A: " + resourcesFound); this.printDebug("ResourceChecker", "has all resources been found? /n A: " + resourcesFound);
return resourcesFound ? actualResources : null; return resourcesFound ? actualResources : null;
} }
@ -254,19 +257,20 @@ public class AutoCraftingManager
{ {
if (stack != null) if (stack != null)
{ {
if (stack.stackSize <= amount) ItemStack itemStack = stack.copy();
if (itemStack.stackSize <= amount)
{ {
return null; return null;
} }
else else
{ {
stack = stack.splitStack(amount); itemStack.stackSize -= amount;
if (stack.stackSize == 0) if (itemStack.stackSize <= 0)
{ {
return null; return null;
} }
return stack; return itemStack;
} }
} }
else else
@ -297,7 +301,7 @@ public class AutoCraftingManager
if (checkStack != null) if (checkStack != null)
{ {
this.printDebug("ResourceChecker", " -----Item in slot0" + i + " = " + checkStack.toString()); this.printDebug("ResourceChecker", " -----Item in slot0" + i + " = " + checkStack.toString());
if (areStacksEqual(recipeItem, checkStack)) if (this.areStacksEqual(recipeItem, checkStack))
{ {
this.printDebug("ResourceChecker", "Found matching item " + checkStack.toString()); this.printDebug("ResourceChecker", "Found matching item " + checkStack.toString());
return i; return i;
@ -328,7 +332,11 @@ public class AutoCraftingManager
{ {
return recipeItem.itemID == checkStack.itemID; return recipeItem.itemID == checkStack.itemID;
} }
return recipeItem.isItemEqual(checkStack) || (recipeItem.itemID == checkStack.itemID && recipeItem.isItemStackDamageable() && !recipeItem.isItemDamaged()); if (recipeItem.isItemStackDamageable())
{
return !recipeItem.isItemDamaged() && recipeItem.itemID == checkStack.itemID;
}
return recipeItem.isItemEqual(checkStack);
} }
/** /**
@ -338,12 +346,13 @@ public class AutoCraftingManager
* @param ammount - amount to consume * @param ammount - amount to consume
* @return what is left of the itemStack if any * @return what is left of the itemStack if any
*/ */
public ItemStack consumeItem(ItemStack stack, int amount) public ItemStack consumeItem(ItemStack itemStack, int amount)
{ {
if (stack == null) if (itemStack == null)
{ {
return null; return null;
} }
ItemStack stack = itemStack.copy();
if (stack.getItem().hasContainerItem()) if (stack.getItem().hasContainerItem())
{ {
ItemStack containerStack = stack.getItem().getContainerItemStack(stack); ItemStack containerStack = stack.getItem().getContainerItemStack(stack);

View file

@ -51,6 +51,9 @@ public class TileEntityImprinter extends TileEntityAdvanced implements net.minec
public ItemStack[] imprinterMatrix = new ItemStack[3]; public ItemStack[] imprinterMatrix = new ItemStack[3];
public static final int[] imprinterSlots = { IMPRINTER_MATRIX_START, IMPRINTER_MATRIX_START + 1, IMPRINTER_MATRIX_START + 2 }; public static final int[] imprinterSlots = { IMPRINTER_MATRIX_START, IMPRINTER_MATRIX_START + 1, IMPRINTER_MATRIX_START + 2 };
int imprintInputSlot = 0;
int imprintOutputSlot = 1;
int craftingOutputSlot = 2;
/** /**
* The Imprinter inventory containing slots. * The Imprinter inventory containing slots.
@ -260,18 +263,18 @@ public class TileEntityImprinter extends TileEntityAdvanced implements net.minec
*/ */
this.isImprinting = false; this.isImprinting = false;
if (this.isMatrixEmpty() && this.imprinterMatrix[0] != null && this.imprinterMatrix[1] != null) if (this.isMatrixEmpty() && this.imprinterMatrix[imprintInputSlot] != null && this.imprinterMatrix[1] != null)
{ {
if (this.imprinterMatrix[0].getItem() instanceof ItemImprinter) if (this.imprinterMatrix[imprintInputSlot].getItem() instanceof ItemImprinter)
{ {
ItemStack outputStack = this.imprinterMatrix[0].copy(); ItemStack outputStack = this.imprinterMatrix[imprintInputSlot].copy();
outputStack.stackSize = 1; outputStack.stackSize = 1;
ArrayList<ItemStack> filters = ItemImprinter.getFilters(outputStack); ArrayList<ItemStack> filters = ItemImprinter.getFilters(outputStack);
boolean filteringItemExists = false; boolean filteringItemExists = false;
for (ItemStack filteredStack : filters) for (ItemStack filteredStack : filters)
{ {
if (filteredStack.isItemEqual(this.imprinterMatrix[1])) if (filteredStack.isItemEqual(this.imprinterMatrix[imprintOutputSlot]))
{ {
filters.remove(filteredStack); filters.remove(filteredStack);
filteringItemExists = true; filteringItemExists = true;
@ -281,18 +284,18 @@ public class TileEntityImprinter extends TileEntityAdvanced implements net.minec
if (!filteringItemExists) if (!filteringItemExists)
{ {
filters.add(this.imprinterMatrix[1]); filters.add(this.imprinterMatrix[imprintOutputSlot]);
} }
ItemImprinter.setFilters(outputStack, filters); ItemImprinter.setFilters(outputStack, filters);
this.imprinterMatrix[2] = outputStack; this.imprinterMatrix[craftingOutputSlot] = outputStack;
this.isImprinting = true; this.isImprinting = true;
} }
} }
if (!this.isImprinting) if (!this.isImprinting)
{ {
this.imprinterMatrix[2] = null; this.imprinterMatrix[craftingOutputSlot] = null;
/** /**
* Try to craft from crafting grid. If not possible, then craft from imprint. * Try to craft from crafting grid. If not possible, then craft from imprint.
@ -310,15 +313,16 @@ public class TileEntityImprinter extends TileEntityAdvanced implements net.minec
if (matrixOutput != null && this.craftingManager.getIdealRecipe(matrixOutput) != null) if (matrixOutput != null && this.craftingManager.getIdealRecipe(matrixOutput) != null)
{ {
this.imprinterMatrix[2] = matrixOutput; System.out.println("Using crafting grid");
this.imprinterMatrix[craftingOutputSlot] = matrixOutput;
didCraft = true; didCraft = true;
} }
} }
if (this.imprinterMatrix[0] != null && !didCraft) if (this.imprinterMatrix[imprintInputSlot] != null && !didCraft)
{ {
// System.out.println("Using imprint as grid"); System.out.println("Using imprint as grid");
if (this.imprinterMatrix[0].getItem() instanceof ItemImprinter) if (this.imprinterMatrix[imprintInputSlot].getItem() instanceof ItemImprinter)
{ {
ArrayList<ItemStack> filters = ItemImprinter.getFilters(this.imprinterMatrix[0]); ArrayList<ItemStack> filters = ItemImprinter.getFilters(this.imprinterMatrix[0]);
@ -338,7 +342,7 @@ public class TileEntityImprinter extends TileEntityAdvanced implements net.minec
ItemStack recipeOutput = idealRecipe.getKey(); ItemStack recipeOutput = idealRecipe.getKey();
if (recipeOutput != null & recipeOutput.stackSize > 0) if (recipeOutput != null & recipeOutput.stackSize > 0)
{ {
this.imprinterMatrix[2] = recipeOutput; this.imprinterMatrix[craftingOutputSlot] = recipeOutput;
didCraft = true; didCraft = true;
break; break;
} }
@ -350,7 +354,7 @@ public class TileEntityImprinter extends TileEntityAdvanced implements net.minec
if (!didCraft) if (!didCraft)
{ {
this.imprinterMatrix[2] = null; this.imprinterMatrix[craftingOutputSlot] = null;
} }
} }
} }
@ -633,6 +637,6 @@ public class TileEntityImprinter extends TileEntityAdvanced implements net.minec
@Override @Override
public int[] getCraftingInv() public int[] getCraftingInv()
{ {
return this.invSlots; return TileEntityImprinter.invSlots;
} }
} }