From 90d62a17d24686c4a8dd024fdf1ac1d0efdad5f1 Mon Sep 17 00:00:00 2001 From: payonel Date: Sat, 22 Sep 2018 21:45:22 -0700 Subject: [PATCH] merge master-MC1.10 to master-MC1.11 --- .../scala/li/cil/oc/server/component/Trade.scala | 6 +++--- .../scala/li/cil/oc/util/InventoryUtils.scala | 15 ++++++++------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/scala/li/cil/oc/server/component/Trade.scala b/src/main/scala/li/cil/oc/server/component/Trade.scala index e20b14287..1cdc74f16 100644 --- a/src/main/scala/li/cil/oc/server/component/Trade.scala +++ b/src/main/scala/li/cil/oc/server/component/Trade.scala @@ -74,7 +74,7 @@ class Trade(val info: TradeInfo) extends AbstractValue { val secondInputStack = if (recipe.hasSecondItemToBuy) Option(recipe.getSecondItemToBuy) else None def containsAccumulativeItemStack(stack: ItemStack) = - InventoryUtils.extractFromInventory(stack, inventory, null, simulate = true).getCount == 0 + InventoryUtils.extractFromInventory(stack, inventory, null, simulate = true, exact = false).getCount == 0 def hasRoomForItemStack(stack: ItemStack) = { val remainder = stack.copy() InventoryUtils.insertIntoInventory(remainder, InventoryUtils.asItemHandler(inventory), remainder.getCount, simulate = true) @@ -87,8 +87,8 @@ class Trade(val info: TradeInfo) extends AbstractValue { val outputStack = recipe.getItemToSell.copy() if (hasRoomForItemStack(outputStack)) { // We established that out inventory allows to perform the trade, now actually do the trade. - InventoryUtils.extractFromInventory(firstInputStack, InventoryUtils.asItemHandler(inventory)) - secondInputStack.map(InventoryUtils.extractFromInventory(_, InventoryUtils.asItemHandler(inventory))) + InventoryUtils.extractFromInventory(firstInputStack, InventoryUtils.asItemHandler(inventory), exact = false) + secondInputStack.map(InventoryUtils.extractFromInventory(_, InventoryUtils.asItemHandler(inventory), exact = false)) InventoryUtils.insertIntoInventory(outputStack, InventoryUtils.asItemHandler(inventory), outputStack.getCount) // Tell the merchant we used the recipe, so MC can disable it and/or enable more recipes. diff --git a/src/main/scala/li/cil/oc/util/InventoryUtils.scala b/src/main/scala/li/cil/oc/util/InventoryUtils.scala index cc0e82065..dd6a870d1 100644 --- a/src/main/scala/li/cil/oc/util/InventoryUtils.scala +++ b/src/main/scala/li/cil/oc/util/InventoryUtils.scala @@ -225,19 +225,20 @@ object InventoryUtils { *

* This will try to remove items of the same type as the specified item stack * up to the number of the stack's size for all slots in the specified inventory. + * If exact is true, the items colated will also match meta data *

* This uses the extractFromInventorySlot method, and therefore * handles special cases such as sided inventories and stack size limits. */ - def extractFromInventory(stack: ItemStack, inventory: IItemHandler, simulate: Boolean = false): ItemStack = { + def extractFromInventory(stack: ItemStack, inventory: IItemHandler, simulate: Boolean = false, exact: Boolean = true): ItemStack = { val remaining = stack.copy() for (slot <- 0 until inventory.getSlots if remaining.getCount > 0) { - extractFromInventorySlot(stack => { - if (haveSameItemType(remaining, stack, checkNBT = true)) { - val transferred = stack.getCount min remaining.getCount + extractFromInventorySlot(stackInInv => { + if (stackInInv != null && remaining.getItem == stackInInv.getItem && (!exact || haveSameItemType(remaining, stackInInv, checkNBT = true))) { + val transferred = stackInInv.getCount min remaining.getCount remaining.shrink(transferred) if (!simulate) { - stack.shrink(transferred) + stackInInv.shrink(transferred) } } }, inventory, slot, limit = remaining.getCount) @@ -245,8 +246,8 @@ object InventoryUtils { remaining } - def extractFromInventory(stack: ItemStack, inventory: IInventory, side: EnumFacing, simulate: Boolean): ItemStack = - extractFromInventory(stack, asItemHandler(inventory, side), simulate) + def extractFromInventory(stack: ItemStack, inventory: IInventory, side: EnumFacing, simulate: Boolean, exact: Boolean): ItemStack = + extractFromInventory(stack, asItemHandler(inventory, side), simulate, exact) /** * Utility method for calling insertIntoInventory on an inventory