From b136e2ab7fea2ca332e8c57a90db22427a631f80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Mon, 2 Feb 2015 18:05:50 +0100 Subject: [PATCH] Added `inventory_controller.compareToDatabase`, closes #861. --- .../component/traits/InventoryAnalytics.scala | 19 +++++++++++++++---- .../component/traits/InventoryAware.scala | 3 ++- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/main/scala/li/cil/oc/server/component/traits/InventoryAnalytics.scala b/src/main/scala/li/cil/oc/server/component/traits/InventoryAnalytics.scala index 2bd5e1c25..ced66d1cc 100644 --- a/src/main/scala/li/cil/oc/server/component/traits/InventoryAnalytics.scala +++ b/src/main/scala/li/cil/oc/server/component/traits/InventoryAnalytics.scala @@ -7,7 +7,6 @@ import li.cil.oc.api.machine.Context import li.cil.oc.server.component.result import li.cil.oc.util.DatabaseAccess import li.cil.oc.util.ExtendedArguments._ -import net.minecraft.item.ItemStack trait InventoryAnalytics extends InventoryAware with NetworkAware { @Callback(doc = """function([slot:number]):table -- Get a description of the stack in the specified slot or the selected slot.""") @@ -21,12 +20,24 @@ trait InventoryAnalytics extends InventoryAware with NetworkAware { def storeInternal(context: Context, args: Arguments): Array[AnyRef] = { val localSlot = args.checkSlot(inventory, 0) val dbAddress = args.checkString(1) - def store(stack: ItemStack) = DatabaseAccess.withDatabase(node, dbAddress, database => { + val localStack = inventory.getStackInSlot(localSlot) + DatabaseAccess.withDatabase(node, dbAddress, database => { val dbSlot = args.checkSlot(database.data, 2) val nonEmpty = database.data.getStackInSlot(dbSlot) != null - database.data.setInventorySlotContents(dbSlot, stack.copy()) + database.data.setInventorySlotContents(dbSlot, localStack.copy()) result(nonEmpty) }) - store(inventory.getStackInSlot(localSlot)) + } + + @Callback(doc = """function(slot:number, dbAddress:string, dbSlot:number):boolean -- Compare an item in the specified slot with one in the database with the specified address.""") + def compareToDatabase(context: Context, args: Arguments): Array[AnyRef] = { + val localSlot = args.checkSlot(inventory, 0) + val dbAddress = args.checkString(1) + val localStack = inventory.getStackInSlot(localSlot) + DatabaseAccess.withDatabase(node, dbAddress, database => { + val dbSlot = args.checkSlot(database.data, 2) + val dbStack = database.data.getStackInSlot(dbSlot) + result(haveSameItemType(localStack, dbStack)) + }) } } diff --git a/src/main/scala/li/cil/oc/server/component/traits/InventoryAware.scala b/src/main/scala/li/cil/oc/server/component/traits/InventoryAware.scala index 2342fb1d7..5bc635ea2 100644 --- a/src/main/scala/li/cil/oc/server/component/traits/InventoryAware.scala +++ b/src/main/scala/li/cil/oc/server/component/traits/InventoryAware.scala @@ -23,6 +23,7 @@ trait InventoryAware { protected def stackInSlot(slot: Int) = Option(inventory.getStackInSlot(slot)) protected def haveSameItemType(stackA: ItemStack, stackB: ItemStack) = - stackA.getItem == stackB.getItem && + stackA != null && stackB != null && + stackA.getItem == stackB.getItem && (!stackA.getHasSubtypes || stackA.getItemDamage == stackB.getItemDamage) }