From 22cee79ab96aca085ccfacc7afc529e1eebf366f Mon Sep 17 00:00:00 2001
From: trimbe <19672127+trimbe@users.noreply.github.com>
Date: Sat, 3 Aug 2019 20:59:03 -0400
Subject: [PATCH] bank plugin: improve responsiveness of bank searches
The client will normally layout the bank during a search only once every 40 client ticks, causing slow response times after the search input is updated. Instead, hook the search refresh script that is called every client tick, and if the bank hasn't been laid out on the current tick, and the search input has changed, lay it out early.
---
.../main/java/net/runelite/api/ScriptID.java | 9 ++++++
.../client/plugins/bank/BankPlugin.java | 23 +++++++++++++
.../plugins/banktags/tabs/BankSearch.java | 32 +++++++++++--------
3 files changed, 50 insertions(+), 14 deletions(-)
diff --git a/runelite-api/src/main/java/net/runelite/api/ScriptID.java b/runelite-api/src/main/java/net/runelite/api/ScriptID.java
index 8d7898e3e7..5cc976e3d2 100644
--- a/runelite-api/src/main/java/net/runelite/api/ScriptID.java
+++ b/runelite-api/src/main/java/net/runelite/api/ScriptID.java
@@ -271,4 +271,13 @@ public final class ScriptID
*/
@ScriptArguments(integer = 7)
public static final int IGNORE_UPDATE = 630;
+
+ /**
+ * Called in an onTimer, determines whether to layout the bank during a search
+ *
+ * - int (WidgetID) * 16, various widgets making up the bank interface
+ *
+ */
+ @ScriptArguments(integer = 16)
+ public static final int BANKMAIN_SEARCH_REFRESH = 283;
}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java
index dafa61f630..e9040d1f47 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java
@@ -45,11 +45,14 @@ import net.runelite.api.ItemComposition;
import net.runelite.api.ItemContainer;
import net.runelite.api.ItemID;
import net.runelite.api.MenuEntry;
+import net.runelite.api.ScriptID;
+import net.runelite.api.VarClientStr;
import net.runelite.api.Varbits;
import net.runelite.api.events.ItemContainerChanged;
import net.runelite.api.events.MenuEntryAdded;
import net.runelite.api.events.MenuShouldLeftClick;
import net.runelite.api.events.ScriptCallbackEvent;
+import net.runelite.api.events.ScriptPostFired;
import net.runelite.api.events.WidgetLoaded;
import net.runelite.api.widgets.Widget;
import net.runelite.api.widgets.WidgetID;
@@ -115,6 +118,7 @@ public class BankPlugin extends Plugin
private boolean forceRightClickFlag;
private Multiset itemQuantities; // bank item quantities for bank value search
+ private String searchString;
@Provides
BankConfig getConfig(ConfigManager configManager)
@@ -128,6 +132,7 @@ public class BankPlugin extends Plugin
clientThread.invokeLater(() -> bankSearch.reset(false));
forceRightClickFlag = false;
itemQuantities = null;
+ searchString = null;
}
@Subscribe
@@ -209,6 +214,24 @@ public class BankPlugin extends Plugin
updateSeedVaultTotal();
}
+ @Subscribe
+ public void onScriptPostFired(ScriptPostFired event)
+ {
+ if (event.getScriptId() != ScriptID.BANKMAIN_SEARCH_REFRESH)
+ {
+ return;
+ }
+
+ // vanilla only lays out the bank every 40 client ticks, so if the search input has changed,
+ // and the bank wasn't laid out this tick, lay it out early
+ final String inputText = client.getVar(VarClientStr.INPUT_TEXT);
+ if (searchString != inputText && client.getGameCycle() % 40 != 0)
+ {
+ clientThread.invokeLater(bankSearch::layoutBank);
+ searchString = inputText;
+ }
+ }
+
@Subscribe
public void onItemContainerChanged(ItemContainerChanged event)
{
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java
index 10a1ed2004..34cd7e8244 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java
@@ -54,19 +54,6 @@ public class BankSearch
{
clientThread.invoke(() ->
{
- Widget bankContainer = client.getWidget(WidgetInfo.BANK_ITEM_CONTAINER);
- if (bankContainer == null || bankContainer.isHidden())
- {
- return;
- }
-
- Object[] scriptArgs = bankContainer.getOnInvTransmitListener();
-
- if (scriptArgs == null)
- {
- return;
- }
-
// This ensures that any chatbox input (e.g from search) will not remain visible when
// selecting/changing tab
if (closeInput)
@@ -77,10 +64,27 @@ public class BankSearch
client.setVar(VarClientInt.INPUT_TYPE, inputType.getType());
client.setVar(VarClientStr.INPUT_TEXT, search);
- client.runScript(scriptArgs);
+ layoutBank();
});
}
+ public void layoutBank()
+ {
+ Widget bankContainer = client.getWidget(WidgetInfo.BANK_ITEM_CONTAINER);
+ if (bankContainer == null || bankContainer.isHidden())
+ {
+ return;
+ }
+
+ Object[] scriptArgs = bankContainer.getOnInvTransmitListener();
+ if (scriptArgs == null)
+ {
+ return;
+ }
+
+ client.runScript(scriptArgs);
+ }
+
public void reset(boolean closeChat)
{
search(InputType.NONE, "", closeChat);