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 0299da0472..08b48cdc0d 100644 --- a/runelite-api/src/main/java/net/runelite/api/ScriptID.java +++ b/runelite-api/src/main/java/net/runelite/api/ScriptID.java @@ -26,6 +26,30 @@ package net.runelite.api; public final class ScriptID { + /** + * Sends a chat message + * + */ public static final int CHATBOX_INPUT = 96; + + /** + * Closes the chatbox input + * + */ + public static final int CLOSE_CHATBOX_INPUT = 299; + + /** + * Initializes the chatbox input to use RuneLite callbacks + * + */ public static final int RUNELITE_CHATBOX_INPUT_INIT = 10001; } 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 bb907e1cbf..3839d40a80 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 @@ -29,6 +29,7 @@ import com.google.common.eventbus.Subscribe; import com.google.inject.Inject; import com.google.inject.Singleton; import java.util.function.Consumer; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.ScriptID; @@ -39,13 +40,17 @@ import net.runelite.client.callback.ClientThread; @Slf4j public class ChatboxInputManager { - private static final int NO_LIMIT = Integer.MAX_VALUE; + public static final int NO_LIMIT = Integer.MAX_VALUE; private final Client client; private final ClientThread clientThread; private Consumer done; + private Consumer changed; private int characterLimit = NO_LIMIT; + @Getter + private boolean open = false; + @Inject public ChatboxInputManager(Client client, ClientThread clientThread, EventBus eventBus) { @@ -67,9 +72,16 @@ public class ChatboxInputManager } public void openInputWindow(String text, String defaul, int characterLimit, Consumer done) + { + openInputWindow(text, defaul, characterLimit, null, done); + } + + public void openInputWindow(String text, String defaul, int characterLimit, Consumer changed, Consumer done) { this.done = done; + this.changed = changed; this.characterLimit = characterLimit; + this.open = true; clientThread.invokeLater(() -> client.runScript( ScriptID.RUNELITE_CHATBOX_INPUT_INIT, text, @@ -77,6 +89,23 @@ public class ChatboxInputManager )); } + /** + * Closes the RuneScape-style chatbox input + */ + public void closeInputWindow() + { + if (!this.open) + { + return; + } + this.open = false; + clientThread.invokeLater(() -> client.runScript( + ScriptID.CLOSE_CHATBOX_INPUT, + 1, + 1 + )); + } + @Subscribe public void scriptCallback(ScriptCallbackEvent ev) { @@ -93,9 +122,17 @@ public class ChatboxInputManager { case 27: // Escape str = ""; + if (changed != null) + { + changed.accept(str); + } // fallthrough case '\n': - done.accept(str); + if (done != null) + { + done.accept(str); + } + this.open = false; retval = 1; break; case '\b': @@ -111,6 +148,11 @@ public class ChatboxInputManager } } + if (changed != null) + { + changed.accept(str); + } + client.getStringStack()[stringStackSize++] = str; client.getIntStack()[intStackSize++] = retval; client.setIntStackSize(intStackSize);