mirror of
https://github.com/MightyPirates/OpenComputers.git
synced 2025-09-07 22:27:42 -04:00
Fixed NBT being ignored when agents picked up drops after breaking blocks, potentially merging stacks incorrectly. Closes #1526.
This commit is contained in:
parent
fe759d0462
commit
b9be02b71a
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user