diff --git a/src/main/scala/li/cil/oc/server/agent/Player.scala b/src/main/scala/li/cil/oc/server/agent/Player.scala index 100760bc0..796d50597 100644 --- a/src/main/scala/li/cil/oc/server/agent/Player.scala +++ b/src/main/scala/li/cil/oc/server/agent/Player.scala @@ -187,11 +187,11 @@ class Player(val agent: internal.Agent) extends FakePlayer(agent.world.asInstanc private def collectDroppedItems(itemsBefore: Iterable[EntityItem]) { val itemsAfter = adjacentItems val itemsDropped = itemsAfter -- itemsBefore - for (drop <- itemsDropped) { - - drop.delayBeforeCanPickup = 0 - drop.onCollideWithPlayer(this) - drop.setDead() + if (itemsDropped.nonEmpty) { + for (drop <- itemsDropped) { + drop.delayBeforeCanPickup = 0 + drop.onCollideWithPlayer(this) + } } } diff --git a/src/main/scala/li/cil/oc/server/component/Agent.scala b/src/main/scala/li/cil/oc/server/component/Agent.scala index 88be38d19..658fb27bd 100644 --- a/src/main/scala/li/cil/oc/server/component/Agent.scala +++ b/src/main/scala/li/cil/oc/server/component/Agent.scala @@ -288,11 +288,20 @@ trait Agent extends traits.WorldControl with traits.InventoryControl with traits entity.captureDrops = true } + protected def endConsumeDrops(player: Player, entity: Entity) { entity.captureDrops = false - for (drop <- entity.capturedDrops) { - val stack = drop.getEntityItem - InventoryUtils.addToPlayerInventory(stack, player) + // this inventory size check is a HACK to preserve old behavior that a agent can suck items out + // of the capturedDrops. Ideally, we'd only pick up items off the ground. We could clear the + // capturedDrops when Player.attackTargetEntityWithCurrentItem() is called + // But this felt slightly less hacky, slightly + if (player.inventory.getSizeInventory > 0) { + for (drop <- entity.capturedDrops) { + if (!drop.isDead) { + val stack = drop.getEntityItem + InventoryUtils.addToPlayerInventory(stack, player, spawnInWorld = false) + } + } } entity.capturedDrops.clear() } diff --git a/src/main/scala/li/cil/oc/util/InventoryUtils.scala b/src/main/scala/li/cil/oc/util/InventoryUtils.scala index 6089f221e..fd1c2d9b3 100644 --- a/src/main/scala/li/cil/oc/util/InventoryUtils.scala +++ b/src/main/scala/li/cil/oc/util/InventoryUtils.scala @@ -369,7 +369,7 @@ object InventoryUtils { /** * Try inserting an item stack into a player inventory. If that fails, drop it into the world. */ - def addToPlayerInventory(stack: ItemStack, player: EntityPlayer): Unit = { + def addToPlayerInventory(stack: ItemStack, player: EntityPlayer, spawnInWorld: Boolean = true): Unit = { if (stack != null) { if (player.inventory.addItemStackToInventory(stack)) { player.inventory.markDirty() @@ -377,7 +377,7 @@ object InventoryUtils { player.openContainer.detectAndSendChanges() } } - if (stack.stackSize > 0) { + if (stack.stackSize > 0 && spawnInWorld) { player.dropPlayerItemWithRandomChoice(stack, false) } }