From b9be02b71af3b9b7bff2ed0085d99b40d14cd5e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 15 Nov 2015 20:59:42 +0100 Subject: [PATCH] Fixed NBT being ignored when agents picked up drops after breaking blocks, potentially merging stacks incorrectly. Closes #1526. --- .../li/cil/oc/server/agent/Inventory.scala | 59 ++----------------- 1 file changed, 4 insertions(+), 55 deletions(-) diff --git a/src/main/scala/li/cil/oc/server/agent/Inventory.scala b/src/main/scala/li/cil/oc/server/agent/Inventory.scala index d3677b64c..055b9fc26 100644 --- a/src/main/scala/li/cil/oc/server/agent/Inventory.scala +++ b/src/main/scala/li/cil/oc/server/agent/Inventory.scala @@ -1,6 +1,7 @@ package li.cil.oc.server.agent import li.cil.oc.api.internal +import li.cil.oc.util.InventoryUtils import net.minecraft.block.Block import net.minecraft.entity.player.EntityPlayer import net.minecraft.entity.player.InventoryPlayer @@ -8,8 +9,6 @@ import net.minecraft.item.Item import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagList -import scala.util.control.Breaks._ - class Inventory(val agent: internal.Agent) extends InventoryPlayer(null) { def selectedItemStack = agent.mainInventory.getStackInSlot(agent.selectedSlot) @@ -22,11 +21,6 @@ class Inventory(val agent: internal.Agent) extends InventoryPlayer(null) { else inventorySlots.find(getStackInSlot(_) == null).getOrElse(-1) } - def getFirstEmptyStackAccepting(stack: ItemStack) = { - if (selectedItemStack == null && isItemValidForSlot(agent.selectedSlot, stack)) agent.selectedSlot - else inventorySlots.find(slot => getStackInSlot(slot) == null && isItemValidForSlot(slot, stack)).getOrElse(-1) - } - override def func_146030_a(p_146030_1_ : Item, p_146030_2_ : Int, p_146030_3_ : Boolean, p_146030_4_ : Boolean) = setCurrentItem(p_146030_1_, p_146030_2_, p_146030_3_, p_146030_4_) def setCurrentItem(item: Item, itemDamage: Int, checkDamage: Boolean, create: Boolean) {} @@ -60,54 +54,9 @@ class Inventory(val agent: internal.Agent) extends InventoryPlayer(null) { } override def addItemStackToInventory(stack: ItemStack) = { - if (stack == null || stack.stackSize == 0) false - else if (stack.isItemDamaged || (stack.stackSize == 1 && stack.getMaxStackSize == 1)) { - val slot = getFirstEmptyStackAccepting(stack) - if (slot >= 0) { - setInventorySlotContents(slot, stack.splitStack(1)) - true - } - else false - } - else { - val originalSize = stack.stackSize - breakable { - while (stack.stackSize > 0) { - if (stack.getMaxStackSize == 1) { - val slot = getFirstEmptyStackAccepting(stack) - if (slot >= 0) { - setInventorySlotContents(slot, stack.splitStack(1)) - } - else break() - } - else { - val slot = - if (selectedItemStack == null) agent.selectedSlot - else inventorySlots.find(slot => { - val existing = getStackInSlot(slot) - existing != null && existing.isItemEqual(stack) && - (!existing.getHasSubtypes || (existing.getItemDamage == stack.getItemDamage && ItemStack.areItemStackTagsEqual(existing, stack))) && - (existing.stackSize < math.min(existing.getMaxStackSize, getInventoryStackLimit)) - }).getOrElse(getFirstEmptyStackAccepting(stack)) - if (slot >= 0) { - if (getStackInSlot(slot) == null) { - val amount = math.min(stack.stackSize, math.min(getInventoryStackLimit, stack.getMaxStackSize)) - setInventorySlotContents(slot, stack.splitStack(amount)) - } - else { - val existing = getStackInSlot(slot) - val space = math.min(getInventoryStackLimit, existing.getMaxStackSize) - existing.stackSize - val amount = math.min(stack.stackSize, space) - existing.stackSize += amount - stack.stackSize -= amount - } - } - else break() - } - } - } - stack.stackSize < originalSize - } + val indices = 0 until getSizeInventory + val slots = indices.drop(agent.selectedSlot) ++ indices.take(agent.selectedSlot) + InventoryUtils.insertIntoInventory(stack, this, slots = Option(slots)) } override def func_146025_b(block: Block) = canHarvestBlock(block)