mirror of
https://github.com/MightyPirates/OpenComputers.git
synced 2025-09-09 15:25:56 -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
|
package li.cil.oc.server.agent
|
||||||
|
|
||||||
import li.cil.oc.api.internal
|
import li.cil.oc.api.internal
|
||||||
|
import li.cil.oc.util.InventoryUtils
|
||||||
import net.minecraft.block.Block
|
import net.minecraft.block.Block
|
||||||
import net.minecraft.entity.player.EntityPlayer
|
import net.minecraft.entity.player.EntityPlayer
|
||||||
import net.minecraft.entity.player.InventoryPlayer
|
import net.minecraft.entity.player.InventoryPlayer
|
||||||
@ -8,8 +9,6 @@ import net.minecraft.item.Item
|
|||||||
import net.minecraft.item.ItemStack
|
import net.minecraft.item.ItemStack
|
||||||
import net.minecraft.nbt.NBTTagList
|
import net.minecraft.nbt.NBTTagList
|
||||||
|
|
||||||
import scala.util.control.Breaks._
|
|
||||||
|
|
||||||
class Inventory(val agent: internal.Agent) extends InventoryPlayer(null) {
|
class Inventory(val agent: internal.Agent) extends InventoryPlayer(null) {
|
||||||
def selectedItemStack = agent.mainInventory.getStackInSlot(agent.selectedSlot)
|
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)
|
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_)
|
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) {}
|
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) = {
|
override def addItemStackToInventory(stack: ItemStack) = {
|
||||||
if (stack == null || stack.stackSize == 0) false
|
val indices = 0 until getSizeInventory
|
||||||
else if (stack.isItemDamaged || (stack.stackSize == 1 && stack.getMaxStackSize == 1)) {
|
val slots = indices.drop(agent.selectedSlot) ++ indices.take(agent.selectedSlot)
|
||||||
val slot = getFirstEmptyStackAccepting(stack)
|
InventoryUtils.insertIntoInventory(stack, this, slots = Option(slots))
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override def func_146025_b(block: Block) = canHarvestBlock(block)
|
override def func_146025_b(block: Block) = canHarvestBlock(block)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user