From 0e9417963b7e6415fc49d3cdb97c9bb7ab9db866 Mon Sep 17 00:00:00 2001 From: Max Weber Date: Sun, 29 Jul 2018 15:35:34 -0600 Subject: [PATCH 1/3] runelite-client: Rename ClientThread::invokeLater to invoke And add a invokeLater that actually invokes later all of the time --- .../client/callback/ClientThread.java | 27 ++++++++++++++++--- .../runelite/client/chat/CommandManager.java | 4 +-- .../client/game/ChatboxInputManager.java | 4 +-- .../net/runelite/client/game/ItemManager.java | 2 +- .../runelite/client/game/SpriteManager.java | 2 +- .../attackstyles/AttackStylesPlugin.java | 2 +- .../client/plugins/cannon/CannonPlugin.java | 2 +- .../chatcommands/ChatKeyboardListener.java | 4 +-- .../demonicgorilla/DemonicGorillaPlugin.java | 2 +- .../InterfaceStylesPlugin.java | 6 ++--- .../npchighlight/NpcIndicatorsPlugin.java | 2 +- .../reportbutton/ReportButtonPlugin.java | 4 +-- .../client/plugins/slayer/SlayerPlugin.java | 4 +-- 13 files changed, 42 insertions(+), 23 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/callback/ClientThread.java b/runelite-client/src/main/java/net/runelite/client/callback/ClientThread.java index f17c8d774c..a1e3880a39 100644 --- a/runelite-client/src/main/java/net/runelite/client/callback/ClientThread.java +++ b/runelite-client/src/main/java/net/runelite/client/callback/ClientThread.java @@ -41,9 +41,9 @@ public class ClientThread @Inject private Client client; - public void invokeLater(Runnable r) + public void invoke(Runnable r) { - invokeLater(() -> + invoke(() -> { r.run(); return true; @@ -54,7 +54,7 @@ public class ClientThread * Will run r on the game thread, at a unspecified point in the future. * If r returns false, r will be ran again, at a later point */ - public void invokeLater(BooleanSupplier r) + public void invoke(BooleanSupplier r) { if (client.isClientThread()) { @@ -64,6 +64,25 @@ public class ClientThread } return; } + + invokeLater(r); + } + + /** + * Will run r on the game thread after this method returns + * If r returns false, r will be ran again, at a later point + */ + public void invokeLater(Runnable r) + { + invokeLater(() -> + { + r.run(); + return true; + }); + } + + public void invokeLater(BooleanSupplier r) + { invokes.add(r); } @@ -85,7 +104,7 @@ public class ClientThread } catch (Throwable e) { - log.warn("Exception in invokeLater", e); + log.warn("Exception in invoke", e); } if (remove) { diff --git a/runelite-client/src/main/java/net/runelite/client/chat/CommandManager.java b/runelite-client/src/main/java/net/runelite/client/chat/CommandManager.java index 9f687f1a9b..0dc624e6d1 100644 --- a/runelite-client/src/main/java/net/runelite/client/chat/CommandManager.java +++ b/runelite-client/src/main/java/net/runelite/client/chat/CommandManager.java @@ -141,7 +141,7 @@ public class CommandManager } resumed = true; - clientThread.invokeLater(() -> sendChatboxInput(chatType, typedText)); + clientThread.invoke(() -> sendChatboxInput(chatType, typedText)); } }; boolean stop = false; @@ -180,7 +180,7 @@ public class CommandManager } resumed = true; - clientThread.invokeLater(() -> sendPrivmsg(target, message)); + clientThread.invoke(() -> sendPrivmsg(target, message)); } }; diff --git a/runelite-client/src/main/java/net/runelite/client/game/ChatboxInputManager.java b/runelite-client/src/main/java/net/runelite/client/game/ChatboxInputManager.java index 3839d40a80..ce8dcc750b 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/ChatboxInputManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ChatboxInputManager.java @@ -82,7 +82,7 @@ public class ChatboxInputManager this.changed = changed; this.characterLimit = characterLimit; this.open = true; - clientThread.invokeLater(() -> client.runScript( + clientThread.invoke(() -> client.runScript( ScriptID.RUNELITE_CHATBOX_INPUT_INIT, text, defaul @@ -99,7 +99,7 @@ public class ChatboxInputManager return; } this.open = false; - clientThread.invokeLater(() -> client.runScript( + clientThread.invoke(() -> client.runScript( ScriptID.CLOSE_CHATBOX_INPUT, 1, 1 diff --git a/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java b/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java index e16c37e3b6..3832cea464 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java @@ -216,7 +216,7 @@ public class ItemManager private AsyncBufferedImage loadImage(int itemId, int quantity, boolean stackable) { AsyncBufferedImage img = new AsyncBufferedImage(36, 32, BufferedImage.TYPE_INT_ARGB); - clientThread.invokeLater(() -> + clientThread.invoke(() -> { if (client.getGameState().ordinal() < GameState.LOGIN_SCREEN.ordinal()) { diff --git a/runelite-client/src/main/java/net/runelite/client/game/SpriteManager.java b/runelite-client/src/main/java/net/runelite/client/game/SpriteManager.java index 3e80f188f8..e80818cc65 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/SpriteManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/SpriteManager.java @@ -87,7 +87,7 @@ public class SpriteManager return; } - clientThread.invokeLater(() -> + clientThread.invoke(() -> { BufferedImage img = getSprite(archive, file); if (img == null) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesPlugin.java index 0601f2703c..6ef10b4f8e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesPlugin.java @@ -99,7 +99,7 @@ public class AttackStylesPlugin extends Plugin if (client.getGameState() == GameState.LOGGED_IN) { - clientThread.invokeLater(this::start); + clientThread.invoke(this::start); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java index 08bc5a878a..4ff0ce1eb2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java @@ -152,7 +152,7 @@ public class CannonPlugin extends Plugin { if (cannonPlaced) { - clientThread.invokeLater(this::addCounter); + clientThread.invoke(this::addCounter); } } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatKeyboardListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatKeyboardListener.java index e28c88f4f1..3b6de082f4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatKeyboardListener.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatKeyboardListener.java @@ -82,11 +82,11 @@ public class ChatKeyboardListener implements KeyListener replacement = ""; } - clientThread.invokeLater(() -> client.setVar(VarClientStr.CHATBOX_TYPED_TEXT, replacement)); + clientThread.invoke(() -> client.setVar(VarClientStr.CHATBOX_TYPED_TEXT, replacement)); } break; case KeyEvent.VK_BACK_SPACE: - clientThread.invokeLater(() -> client.setVar(VarClientStr.CHATBOX_TYPED_TEXT, "")); + clientThread.invoke(() -> client.setVar(VarClientStr.CHATBOX_TYPED_TEXT, "")); break; } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/demonicgorilla/DemonicGorillaPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/demonicgorilla/DemonicGorillaPlugin.java index 9947b5c2be..99a4a1e614 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/demonicgorilla/DemonicGorillaPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/demonicgorilla/DemonicGorillaPlugin.java @@ -97,7 +97,7 @@ public class DemonicGorillaPlugin extends Plugin recentBoulders = new ArrayList<>(); pendingAttacks = new ArrayList<>(); memorizedPlayers = new HashMap<>(); - clientThread.invokeLater(this::reset); // Updates the list of gorillas and players + clientThread.invoke(this::reset); // Updates the list of gorillas and players } @Override diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java index fad212186a..62da02d02a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java @@ -80,7 +80,7 @@ public class InterfaceStylesPlugin extends Plugin @Override protected void startUp() throws Exception { - clientThread.invokeLater(() -> + clientThread.invoke(() -> { overrideSprites(); overrideWidgetSprites(); @@ -92,7 +92,7 @@ public class InterfaceStylesPlugin extends Plugin @Override protected void shutDown() throws Exception { - clientThread.invokeLater(() -> + clientThread.invoke(() -> { restoreWidgetDimensions(); removeGameframe(); @@ -104,7 +104,7 @@ public class InterfaceStylesPlugin extends Plugin { if (config.getGroup().equals("interfaceStyles")) { - clientThread.invokeLater(() -> + clientThread.invoke(() -> { removeGameframe(); overrideSprites(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java index b11fd9ce4f..08150c54a1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java @@ -188,7 +188,7 @@ public class NpcIndicatorsPlugin extends Plugin overlayManager.add(npcMinimapOverlay); keyManager.registerKeyListener(inputListener); highlights = getHighlights(); - clientThread.invokeLater(() -> + clientThread.invoke(() -> { skipNextSpawnCheck = true; rebuildAllNpcs(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/reportbutton/ReportButtonPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/reportbutton/ReportButtonPlugin.java index 98b848a63e..07bd7e5481 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/reportbutton/ReportButtonPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/reportbutton/ReportButtonPlugin.java @@ -80,13 +80,13 @@ public class ReportButtonPlugin extends Plugin @Override public void startUp() { - clientThread.invokeLater(this::updateReportButtonTime); + clientThread.invoke(this::updateReportButtonTime); } @Override public void shutDown() { - clientThread.invokeLater(() -> + clientThread.invoke(() -> { Widget reportButton = client.getWidget(WidgetInfo.CHATBOX_REPORT_TEXT); if (reportButton != null) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java index 05af021cd0..9db09ebd25 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java @@ -179,7 +179,7 @@ public class SlayerPlugin extends Plugin streak = config.streak(); setExpeditiousChargeCount(config.expeditious()); setSlaughterChargeCount(config.slaughter()); - clientThread.invokeLater(() -> setTask(config.taskName(), config.amount())); + clientThread.invoke(() -> setTask(config.taskName(), config.amount())); } } @@ -459,7 +459,7 @@ public class SlayerPlugin extends Plugin if (config.showInfobox()) { - clientThread.invokeLater(this::addCounter); + clientThread.invoke(this::addCounter); } else { From 6b045fbb9677f2332a99d61515f2dbcf18afe68d Mon Sep 17 00:00:00 2001 From: Max Weber Date: Sun, 29 Jul 2018 15:40:19 -0600 Subject: [PATCH 2/3] runelite-client: Always call done after changed in ChatboxInptutManager Also changed doesn't need to be called twice when escaping from the menu --- .../client/game/ChatboxInputManager.java | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/game/ChatboxInputManager.java b/runelite-client/src/main/java/net/runelite/client/game/ChatboxInputManager.java index ce8dcc750b..eabf6039a9 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/ChatboxInputManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ChatboxInputManager.java @@ -116,30 +116,23 @@ public class ChatboxInputManager int stringStackSize = client.getStringStackSize(); int typedKey = client.getIntStack()[--intStackSize]; String str = client.getStringStack()[--stringStackSize]; - int retval = 0; + boolean isDone = false; switch (typedKey) { case 27: // Escape str = ""; - if (changed != null) - { - changed.accept(str); - } // fallthrough case '\n': - if (done != null) - { - done.accept(str); - } this.open = false; - retval = 1; + isDone = true; break; case '\b': if (str.length() > 0) { str = str.substring(0, str.length() - 1); } + break; default: // If we wanted to do numbers only, we could add a limit here if (typedKey >= 32 && (str.length() < characterLimit)) @@ -153,8 +146,13 @@ public class ChatboxInputManager changed.accept(str); } + if (isDone && done != null) + { + done.accept(str); + } + client.getStringStack()[stringStackSize++] = str; - client.getIntStack()[intStackSize++] = retval; + client.getIntStack()[intStackSize++] = isDone ? 1 : 0; client.setIntStackSize(intStackSize); client.setStringStackSize(stringStackSize); } From af6d8b3bd3e6917bdbc9c174bfc46451b325eab2 Mon Sep 17 00:00:00 2001 From: Max Weber Date: Sun, 29 Jul 2018 15:42:55 -0600 Subject: [PATCH 3/3] fairyring: Always run scripts outside of chatbox input callbacks ChatboxInputManager callbacks are always from a ScriptCallbackEvent so other scripts cannot be ran because runScript is not reentrant --- .../plugins/fairyring/FairyRingPlugin.java | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fairyring/FairyRingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/fairyring/FairyRingPlugin.java index 5df2e08a23..5898d90fe4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fairyring/FairyRingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fairyring/FairyRingPlugin.java @@ -51,6 +51,7 @@ import net.runelite.api.events.WidgetLoaded; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetID; import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.game.ChatboxInputManager; import net.runelite.client.plugins.Plugin; @@ -83,9 +84,11 @@ public class FairyRingPlugin extends Plugin @Inject private ChatboxInputManager chatboxInputManager; + @Inject + private ClientThread clientThread; + private Widget searchBtn; private boolean chatboxOpenLastTick = false; - private boolean clearFilter = false; private Collection codes = null; @Data @@ -198,23 +201,18 @@ public class FairyRingPlugin extends Plugin { updateFilter(""); searchBtn.setAction(1, MENU_CLOSE); - chatboxInputManager.openInputWindow("Filter fairy rings", "", ChatboxInputManager.NO_LIMIT, this::updateFilter, s -> - { - // We can't run it right now because scripts can't run other scripts in their callbacks - clearFilter = true; - searchBtn.setAction(1, MENU_OPEN); - }); + chatboxInputManager.openInputWindow("Filter fairy rings", "", ChatboxInputManager.NO_LIMIT, + s -> clientThread.invokeLater(() -> updateFilter(s)), + s -> + { + clientThread.invokeLater(() -> updateFilter("")); + searchBtn.setAction(1, MENU_OPEN); + }); } @Subscribe public void onGameTick(GameTick t) { - if (clearFilter) - { - updateFilter(""); - clearFilter = false; - } - // This has to happen because the only widget that gets hidden is the tli one Widget fairyRingTeleportButton = client.getWidget(WidgetInfo.FAIRY_RING_TELEPORT_BUTTON); boolean fairyRingWidgetOpen = fairyRingTeleportButton != null && !fairyRingTeleportButton.isHidden();