From a0393127f5f81e4c6a7609e20bacd1f353f7b5f5 Mon Sep 17 00:00:00 2001 From: Yurii Shnitkovskyi Date: Wed, 13 Sep 2023 21:08:57 +0300 Subject: [PATCH] AE2: feat: Added a faster method to filter items from ME network --- .../integration/appeng/NetworkControl.scala | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/scala/li/cil/oc/integration/appeng/NetworkControl.scala b/src/main/scala/li/cil/oc/integration/appeng/NetworkControl.scala index b797510c5..4f4b61f03 100644 --- a/src/main/scala/li/cil/oc/integration/appeng/NetworkControl.scala +++ b/src/main/scala/li/cil/oc/integration/appeng/NetworkControl.scala @@ -31,6 +31,7 @@ import li.cil.oc.util.DatabaseAccess import li.cil.oc.util.ExtendedArguments._ import li.cil.oc.util.ExtendedNBT._ import li.cil.oc.util.ResultWrapper._ +import net.minecraft.item.Item import net.minecraft.nbt.NBTTagCompound import net.minecraft.tileentity.TileEntity import net.minecraftforge.common.DimensionManager @@ -92,6 +93,24 @@ trait NetworkControl[AETile >: Null <: TileEntity with IGridProxyable with IActi .toArray) } + @Callback(doc = "function(filter:table):table -- Get a list of the stored items in the network matching the filter. Filter is an Array of Item IDs") + def getItemsInNetworkById(context: Context, args: Arguments): Array[AnyRef] = { + val table = args.checkTable(0) + + val itemFilterSet = mutable.LinkedHashSet.empty[Item] + for (i <- 0 until table.size()) { + table.get(i + 1) match { + case itemNumberId: Number => itemFilterSet += Item.itemRegistry.getObjectById(itemNumberId.intValue()).asInstanceOf[Item] + case itemStringId: String => itemFilterSet += Item.itemRegistry.getObject(itemStringId).asInstanceOf[Item] + case other: Any => throw new IllegalArgumentException(s"bad argument in filter table at index ${i + 1} (number or string expected)") + } + } + result(allItems + .filter(item => itemFilterSet.contains(item.getItem)) + .map(item => convert(item, tile)) + .toArray) + } + @Callback(doc = "function():userdata -- Get an iterator object for the list of the items in the network.") def allItems(context: Context, args: Arguments): Array[AnyRef] = { result(new NetworkContents(tile))