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:
parent
cac5f0d12a
commit
b0574b7f58
2 changed files with 45 additions and 32 deletions
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue