Fixed NBT being ignored when agents picked up drops after breaking blocks, potentially merging stacks incorrectly. Closes #1526.

This commit is contained in:
Florian Nücke 2015-11-15 20:59:42 +01:00
parent fe759d0462
commit b9be02b71a

View File

@ -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)