From 44c740f21e0668bf0ea1fa829d32a182ab09c6ed Mon Sep 17 00:00:00 2001 From: Max Weber Date: Wed, 28 Mar 2018 17:20:16 -0600 Subject: [PATCH] Add ChatboxInputManager to provide a RuneScape styled input box --- .../main/java/net/runelite/api/ScriptID.java | 30 +++++ .../client/game/ChatboxInputManager.java | 112 ++++++++++++++++++ .../scripts/ChatboxInputHandler.rs2asm | 67 +++++++++++ .../scripts/ChatboxInputInit.rs2asm | 82 +++++++++++++ 4 files changed, 291 insertions(+) create mode 100644 runelite-api/src/main/java/net/runelite/api/ScriptID.java create mode 100644 runelite-client/src/main/java/net/runelite/client/game/ChatboxInputManager.java create mode 100644 runelite-scripts/scripts/ChatboxInputHandler.rs2asm create mode 100644 runelite-scripts/scripts/ChatboxInputInit.rs2asm diff --git a/runelite-api/src/main/java/net/runelite/api/ScriptID.java b/runelite-api/src/main/java/net/runelite/api/ScriptID.java new file mode 100644 index 0000000000..315ac456b3 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/ScriptID.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018 Abex + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.api; + +public final class ScriptID +{ + 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 new file mode 100644 index 0000000000..8b84748be2 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/game/ChatboxInputManager.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018 Abex + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.game; + +import com.google.common.eventbus.EventBus; +import com.google.common.eventbus.Subscribe; +import com.google.inject.Inject; +import com.google.inject.Singleton; +import java.util.function.Consumer; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.ScriptID; +import net.runelite.api.events.ScriptCallbackEvent; +import net.runelite.client.callback.ClientThread; + +@Singleton +@Slf4j +public class ChatboxInputManager +{ + private final Client client; + private final ClientThread clientThread; + + private Consumer done; + + @Inject + public ChatboxInputManager(Client client, ClientThread clientThread, EventBus eventBus) + { + this.client = client; + this.clientThread = clientThread; + eventBus.register(this); + } + + /** + * Opens a RuneScape-style chatbox input + * + * @param text Text to show at the top of the window + * @param defaul Default text in the editable field + * @param done Callback when the text box has been exited, called with "" on esc + */ + public void openInputWindow(String text, String defaul, Consumer done) + { + this.done = done; + clientThread.invokeLater(() -> client.runScript( + ScriptID.RUNELITE_CHATBOX_INPUT_INIT, + text, + defaul + )); + } + + @Subscribe + public void scriptCallback(ScriptCallbackEvent ev) + { + // This replaces script 74 and most of 112 + if ("chatboxInputHandler".equals(ev.getEventName())) + { + int intStackSize = client.getIntStackSize(); + int stringStackSize = client.getStringStackSize(); + int typedKey = client.getIntStack()[--intStackSize]; + String str = client.getStringStack()[--stringStackSize]; + int retval = 0; + + switch (typedKey) + { + case 27: // Escape + str = ""; + // fallthrough + case '\n': + done.accept(str); + retval = 1; + break; + case '\b': + if (str.length() > 0) + { + str = str.substring(0, str.length() - 1); + } + default: + // If we wanted to do numbers only, we could add a limit here + if (typedKey >= 32) + { + str += Character.toString((char) typedKey); + } + } + + client.getStringStack()[stringStackSize++] = str; + client.getIntStack()[intStackSize++] = retval; + client.setIntStackSize(intStackSize); + client.setStringStackSize(stringStackSize); + } + } +} diff --git a/runelite-scripts/scripts/ChatboxInputHandler.rs2asm b/runelite-scripts/scripts/ChatboxInputHandler.rs2asm new file mode 100644 index 0000000000..f8003ab439 --- /dev/null +++ b/runelite-scripts/scripts/ChatboxInputHandler.rs2asm @@ -0,0 +1,67 @@ +; Copyright (c) 2018 Abex +; All rights reserved. +; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions are met: +; +; 1. Redistributions of source code must retain the above copyright notice, this +; list of conditions and the following disclaimer. +; 2. Redistributions in binary form must reproduce the above copyright notice, +; this list of conditions and the following disclaimer in the documentation +; and/or other materials provided with the distribution. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +; ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +;; +; Keylistener for ChatboxInputInit +; +; Script 112 Normal keylistener +; +; @param int pressedKey +; @param int typedKey +;; + +.id 10002 +.int_stack_count 1 +.string_stack_count 1 +.int_var_count 2 +.string_var_count 1 + +; Discard zero presses + iload 0 + load_int 0 + if_icmpeq LABEL1 + +; Call runelite + iload 0 + get_varc_string 22 + load_string "chatboxInputHandler" + runelite_callback + istore 0 + put_varc_string 22 + +; Check return value + iload 0 + load_int 1 + if_icmpne LABEL0 + +; Close the dialog + load_int 1 + load_int 1 + invoke 299 + +; Update UI +LABEL0: + load_string "" + invoke 222 +LABEL1: + return diff --git a/runelite-scripts/scripts/ChatboxInputInit.rs2asm b/runelite-scripts/scripts/ChatboxInputInit.rs2asm new file mode 100644 index 0000000000..7fc9c5b12d --- /dev/null +++ b/runelite-scripts/scripts/ChatboxInputInit.rs2asm @@ -0,0 +1,82 @@ +; Copyright (c) 2018 Abex +; All rights reserved. +; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions are met: +; +; 1. Redistributions of source code must retain the above copyright notice, this +; list of conditions and the following disclaimer. +; 2. Redistributions in binary form must reproduce the above copyright notice, +; this list of conditions and the following disclaimer in the documentation +; and/or other materials provided with the distribution. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +; ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +;; +; Creates a chatbox text input +; +; @param String Prompt text +; @param String Default value +; +; Script 752 GE input panel +; Script 103-111 various input panels +; Script 74 validates input +; script 112 key callback +;; + +.id 10001 +.int_stack_count 0 +.string_stack_count 2 +.int_var_count 0 +.string_var_count 2 + +; Hide the chat pane + invoke 677 + +; Set current value + sload 1 + put_varc_string 22 + +; Set text + sload 0 + load_int 10616867 ; 162:35 + widget_put_text_widget + +; Init the widgets + load_string "" + invoke 222 + +; Register the key listener + load_int 10002 + load_int -2147483639 ; typedKey + load_string "i" + load_int 10616868 + widget_put_key_listener_widget + +; Restore the chatbox on exit + load_int 299 + load_int 1 + load_int 1 + load_string "ii" + load_int 10616868 + widget_put_dialog_abort_listener_widget + +; 70% sure this opens the keyboard on mobile + invoke 1972 + load_int 1 + if_icmpeq LABEL25 + jump LABEL26 +LABEL25: + invoke 1983 +LABEL26: + + return