From b021641efe2769a2b7f0eccf1fcdbbb0772c983d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Tue, 31 Mar 2015 00:30:07 +0200 Subject: [PATCH] Allow filtering items when querying lists from AE2 networks, closes #856. `me_controller.getCraftables` and `me_controller.getItemsInNetwork` now take an optional table argument. This table is a filter applied to the result. Its format is the same as item stack representations. For example, a full filter could be: ``` { damage = 0, maxDamage = 0, size = 12, maxSize = 64, hasTag = false, name = "minecraft:stick, label = "Stick" } ``` --- .../integration/appeng/DriverController.scala | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/main/scala/li/cil/oc/integration/appeng/DriverController.scala b/src/main/scala/li/cil/oc/integration/appeng/DriverController.scala index 3b60ab7f0..95908d166 100644 --- a/src/main/scala/li/cil/oc/integration/appeng/DriverController.scala +++ b/src/main/scala/li/cil/oc/integration/appeng/DriverController.scala @@ -25,6 +25,7 @@ import li.cil.oc.integration.ManagedTileEntityEnvironment import li.cil.oc.util.ExtendedNBT._ import li.cil.oc.util.ResultWrapper._ import net.minecraft.block.Block +import net.minecraft.item.Item import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound import net.minecraft.tileentity.TileEntity @@ -78,10 +79,13 @@ object DriverController extends DriverTileEntity with EnvironmentAware { "coprocessors" -> cpu.getCoProcessors, "busy" -> cpu.isBusy))) - @Callback(doc = "function():table -- Get a list of known item recipes. These can be used to issue crafting requests.") + @Callback(doc = "function([filter:table]):table -- Get a list of known item recipes. These can be used to issue crafting requests.") def getCraftables(context: Context, args: Arguments): Array[AnyRef] = { + val filter = args.optTable(0, Map.empty[AnyRef, AnyRef]).collect { + case (key: String, value: AnyRef) => (key, value) + } result(tileEntity.getProxy.getStorage.getItemInventory.getStorageList. - filter(_.isCraftable).map(stack => { + filter(_.isCraftable).filter(stack => matches(stack, filter)).map(stack => { val patterns = tileEntity.getProxy.getCrafting.getCraftingFor(stack, null, 0, tileEntity.getWorldObj) val result = patterns.find(pattern => pattern.getOutputs.exists(_.isSameType(stack))) match { case Some(pattern) => pattern.getOutputs.find(_.isSameType(stack)).get @@ -91,9 +95,13 @@ object DriverController extends DriverTileEntity with EnvironmentAware { }).toArray) } - @Callback(doc = "function():table -- Get a list of the stored items in the network.") - def getItemsInNetwork(context: Context, args: Arguments): Array[AnyRef] = - result(tileEntity.getProxy.getStorage.getItemInventory.getStorageList.map(_.getItemStack).toArray) + @Callback(doc = "function([filter:table]):table -- Get a list of the stored items in the network.") + def getItemsInNetwork(context: Context, args: Arguments): Array[AnyRef] = { + val filter = args.optTable(0, Map.empty[AnyRef, AnyRef]).collect { + case (key: String, value: AnyRef) => (key, value) + } + result(tileEntity.getProxy.getStorage.getItemInventory.getStorageList.filter(stack => matches(stack, filter)).map(_.getItemStack).toArray) + } @Callback(doc = "function():table -- Get a list of the stored fluids in the network.") def getFluidsInNetwork(context: Context, args: Arguments): Array[AnyRef] = @@ -118,6 +126,17 @@ object DriverController extends DriverTileEntity with EnvironmentAware { @Callback(doc = "function():number -- Get the stored power in the network. ") def getStoredPower(context: Context, args: Arguments): Array[AnyRef] = result(tileEntity.getProxy.getEnergy.getStoredPower) + + private def matches(stack: IAEItemStack, filter: scala.collection.mutable.Map[String, AnyRef]) = { + stack != null && + filter.get("damage").forall(_.equals(stack.getItemDamage.toDouble)) && + filter.get("maxDamage").forall(_.equals(stack.getItemStack.getMaxDamage.toDouble)) && + filter.get("size").forall(_.equals(stack.getStackSize.toDouble)) && + filter.get("maxSize").forall(_.equals(stack.getItemStack.getMaxStackSize.toDouble)) && + filter.get("hasTag").forall(_.equals(stack.hasTagCompound)) && + filter.get("name").forall(_.equals(Item.itemRegistry.getNameForObject(stack.getItem))) && + filter.get("label").forall(_.equals(stack.getItemStack.getDisplayName)) + } } class Craftable(var controller: AETile, var stack: IAEItemStack) extends AbstractValue with ICraftingRequester {