From 0c04804d1a4b753850a0cddd2bd5dcb663e8b06c Mon Sep 17 00:00:00 2001 From: Max Weber Date: Wed, 14 Mar 2018 03:59:18 -0600 Subject: [PATCH 1/6] ScriptEvent > ScriptCallbackEvent --- .../api/events/{ScriptEvent.java => ScriptCallbackEvent.java} | 2 +- .../net/runelite/client/plugins/banktags/BankTagsPlugin.java | 4 ++-- .../java/net/runelite/client/plugins/zoom/ZoomPlugin.java | 4 ++-- .../src/main/java/net/runelite/mixins/ScriptVMMixin.java | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) rename runelite-api/src/main/java/net/runelite/api/events/{ScriptEvent.java => ScriptCallbackEvent.java} (97%) diff --git a/runelite-api/src/main/java/net/runelite/api/events/ScriptEvent.java b/runelite-api/src/main/java/net/runelite/api/events/ScriptCallbackEvent.java similarity index 97% rename from runelite-api/src/main/java/net/runelite/api/events/ScriptEvent.java rename to runelite-api/src/main/java/net/runelite/api/events/ScriptCallbackEvent.java index db6887c25e..863e18d7fd 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/ScriptEvent.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ScriptCallbackEvent.java @@ -28,7 +28,7 @@ import lombok.Data; import net.runelite.api.Script; @Data -public class ScriptEvent +public class ScriptCallbackEvent { private Script script; private String eventName; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsPlugin.java index 2d505829a1..5bf86e1f86 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsPlugin.java @@ -38,7 +38,7 @@ import net.runelite.api.Item; import net.runelite.api.ItemContainer; import net.runelite.api.MenuAction; import net.runelite.api.events.MenuOptionClicked; -import net.runelite.api.events.ScriptEvent; +import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetConfig; import net.runelite.api.widgets.WidgetInfo; @@ -109,7 +109,7 @@ public class BankTagsPlugin extends Plugin } @Subscribe - public void onScriptEvent(ScriptEvent event) + public void onScriptEvent(ScriptCallbackEvent event) { String eventName = event.getEventName(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/zoom/ZoomPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/zoom/ZoomPlugin.java index 519ff7b02f..32e397ebb8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/zoom/ZoomPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zoom/ZoomPlugin.java @@ -31,7 +31,7 @@ import com.google.inject.Provides; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.events.ConfigChanged; -import net.runelite.api.events.ScriptEvent; +import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.client.config.ConfigManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -55,7 +55,7 @@ public class ZoomPlugin extends Plugin } @Subscribe - public void onScriptEvent(ScriptEvent event) + public void onScriptEvent(ScriptCallbackEvent event) { int[] intStack = client.getIntStack(); int intStackSize = client.getIntStackSize(); diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java index 5d8b7cfbec..d8cad4db5e 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java @@ -25,7 +25,7 @@ package net.runelite.mixins; import net.runelite.api.Client; -import net.runelite.api.events.ScriptEvent; +import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.api.mixins.Copy; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; @@ -64,7 +64,7 @@ public abstract class ScriptVMMixin implements RSClient String stringOp = client.getStringStack()[--stringStackSize]; client.setStringStackSize(stringStackSize); - ScriptEvent event = new ScriptEvent(); + ScriptCallbackEvent event = new ScriptCallbackEvent(); event.setScript(currentScript); event.setEventName(stringOp); Hooks.eventBus.post(event); From 6e80cff926e3531ba49011c62c537e75b92f0f47 Mon Sep 17 00:00:00 2001 From: Max Weber Date: Wed, 28 Mar 2018 00:42:20 -0600 Subject: [PATCH 2/6] Expose methods to execute scripts --- .../src/main/java/net/runelite/api/Client.java | 2 ++ .../java/net/runelite/mixins/ScriptVMMixin.java | 13 +++++++++++++ .../src/main/java/net/runelite/rs/api/RSClient.java | 6 ++++++ .../java/net/runelite/rs/api/RSScriptEvent.java | 7 +++++++ 4 files changed, 28 insertions(+) diff --git a/runelite-api/src/main/java/net/runelite/api/Client.java b/runelite-api/src/main/java/net/runelite/api/Client.java index 39d2a6eab0..c8651ab162 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -352,4 +352,6 @@ public interface Client extends GameEngine World createWorld(); SpritePixels drawInstanceMap(int z); + + void runScript(int id, Object... args); } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java index d8cad4db5e..71bbac481a 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java @@ -91,4 +91,17 @@ public abstract class ScriptVMMixin implements RSClient currentScript = null; } } + + @Inject + @Override + public void runScript(int id, Object... args) + { + assert isClientThread(); + Object[] cargs = new Object[args.length + 1]; + cargs[0] = id; + System.arraycopy(args, 0, cargs, 1, args.length); + RSScriptEvent se = createScriptEvent(); + se.setArguments(cargs); + runScript(se, 200000); + } } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java index 5f88ffce59..9df2b26268 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java @@ -550,4 +550,10 @@ public interface RSClient extends RSGameEngine, Client @Import("drawObject") void drawObject(int z, int x, int y, int randomColor1, int randomColor2); + + @Construct + RSScriptEvent createScriptEvent(); + + @Import("runScript") + void runScript(RSScriptEvent ev, int ex); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSScriptEvent.java b/runescape-api/src/main/java/net/runelite/rs/api/RSScriptEvent.java index 91ecb4df76..f9edbdd985 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSScriptEvent.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSScriptEvent.java @@ -24,6 +24,13 @@ */ package net.runelite.rs.api; +import net.runelite.mapping.Import; + public interface RSScriptEvent { + @Import("objs") + Object[] getArguments(); + + @Import("objs") + void setArguments(Object[] args); } From 103c3b87deac72960f106bb15130aa28b09d380b Mon Sep 17 00:00:00 2001 From: Max Weber Date: Wed, 28 Mar 2018 04:34:17 -0600 Subject: [PATCH 3/6] cache: Allow scripts to start with comments --- .../main/antlr4/net/runelite/cache/script/assembler/rs2asm.g4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cache/src/main/antlr4/net/runelite/cache/script/assembler/rs2asm.g4 b/cache/src/main/antlr4/net/runelite/cache/script/assembler/rs2asm.g4 index 4fdbb4e199..1c22be6713 100644 --- a/cache/src/main/antlr4/net/runelite/cache/script/assembler/rs2asm.g4 +++ b/cache/src/main/antlr4/net/runelite/cache/script/assembler/rs2asm.g4 @@ -24,7 +24,7 @@ */ grammar rs2asm; -prog: (header NEWLINE+)* (line NEWLINE+)+ ; +prog: NEWLINE* (header NEWLINE+)* (line NEWLINE+)+ ; header: id | int_stack_count | string_stack_count | int_var_count | string_var_count ; From 38f59146d58692053816c4ebe09ee923b6d96a33 Mon Sep 17 00:00:00 2001 From: Max Weber Date: Wed, 28 Mar 2018 04:35:42 -0600 Subject: [PATCH 4/6] Mixins: Give scripts a log.debug callback --- .../net/runelite/mixins/ScriptVMMixin.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java index 71bbac481a..d7a794607f 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java @@ -24,6 +24,8 @@ */ package net.runelite.mixins; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import net.runelite.api.Client; import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.api.mixins.Copy; @@ -64,6 +66,38 @@ public abstract class ScriptVMMixin implements RSClient String stringOp = client.getStringStack()[--stringStackSize]; client.setStringStackSize(stringStackSize); + if ("debug".equals(stringOp)) + { + int intStackSize = client.getIntStackSize(); + + String fmt = client.getStringStack()[--stringStackSize]; + StringBuffer out = new StringBuffer(); + Matcher m = Pattern.compile("%(.)").matcher(fmt); + for (; m.find(); ) + { + m.appendReplacement(out, ""); + switch (m.group(1).charAt(0)) + { + case 'i': + case 'd': + out.append(client.getIntStack()[--intStackSize]); + break; + case 's': + out.append(client.getStringStack()[--stringStackSize]); + break; + default: + out.append(m.group(0)).append("=unknown"); + } + } + m.appendTail(out); + + Hooks.log.debug(out.toString()); + + client.setStringStackSize(stringStackSize); + client.setIntStackSize(intStackSize); + return true; + } + ScriptCallbackEvent event = new ScriptCallbackEvent(); event.setScript(currentScript); event.setEventName(stringOp); From aa02da45c037e21cc26ad6cde24fb2361b50e2ba Mon Sep 17 00:00:00 2001 From: Max Weber Date: Wed, 28 Mar 2018 04:36:48 -0600 Subject: [PATCH 5/6] Allow assembly and loading of new scripts --- .../runelite/mixins/RSIndexDataBaseMixin.java | 29 ++++++++++++++++--- .../net/runelite/script/AssembleMojo.java | 17 ++++++----- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSIndexDataBaseMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSIndexDataBaseMixin.java index e4c953bd12..99140e4999 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSIndexDataBaseMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSIndexDataBaseMixin.java @@ -64,17 +64,38 @@ public abstract class RSIndexDataBaseMixin implements RSIndexDataBase return rsData; } - HashCode rsDataHash = Hashing.sha256().hashBytes(rsData); - - String rsHash = BaseEncoding.base16().encode(rsDataHash.asBytes()); - InputStream in2 = getClass().getResourceAsStream("/runelite/" + indexData.getIndex() + "/" + archiveId + ".hash"); + if (rsData == null) + { + if (in2 != null) + { + log.warn("Hash file for non existing archive {}/{}", indexData.getIndex(), archiveId); + return null; + } + + log.debug("Adding archive {}/{}", indexData.getIndex(), archiveId); + + try + { + return ByteStreams.toByteArray(in); + } + catch (IOException ex) + { + log.warn("error loading archive replacement", ex); + } + + return null; + } if (in2 == null) { log.warn("Missing hash file for {}/{}", indexData.getIndex(), archiveId); return rsData; } + HashCode rsDataHash = Hashing.sha256().hashBytes(rsData); + + String rsHash = BaseEncoding.base16().encode(rsDataHash.asBytes()); + try { String replaceHash = CharStreams.toString(new InputStreamReader(in2)); diff --git a/runelite-script-assembler-plugin/src/main/java/net/runelite/script/AssembleMojo.java b/runelite-script-assembler-plugin/src/main/java/net/runelite/script/AssembleMojo.java index 9ee058d690..09863ca3c1 100644 --- a/runelite-script-assembler-plugin/src/main/java/net/runelite/script/AssembleMojo.java +++ b/runelite-script-assembler-plugin/src/main/java/net/runelite/script/AssembleMojo.java @@ -73,12 +73,6 @@ public class AssembleMojo extends AbstractMojo try (FileInputStream fin = new FileInputStream(scriptFile)) { - File hashFile = new File(scriptDirectory, Files.getNameWithoutExtension(scriptFile.getName()) + ".hash"); - if (!hashFile.exists()) - { - throw new MojoExecutionException("Unable to find hash file for " + scriptFile); - } - ScriptDefinition script = assembler.assemble(fin); byte[] packedScript = saver.save(script); @@ -86,7 +80,16 @@ public class AssembleMojo extends AbstractMojo Files.write(packedScript, targetFile); // Copy hash file - Files.copy(hashFile, new File(scriptOut, Integer.toString(script.getId()) + ".hash")); + + File hashFile = new File(scriptDirectory, Files.getNameWithoutExtension(scriptFile.getName()) + ".hash"); + if (hashFile.exists()) + { + Files.copy(hashFile, new File(scriptOut, Integer.toString(script.getId()) + ".hash")); + } + else if (script.getId() < 10000) // Scripts >=10000 are RuneLite scripts, so they shouldn't have a .hash + { + throw new MojoExecutionException("Unable to find hash file for " + scriptFile); + } ++count; } From 44c740f21e0668bf0ea1fa829d32a182ab09c6ed Mon Sep 17 00:00:00 2001 From: Max Weber Date: Wed, 28 Mar 2018 17:20:16 -0600 Subject: [PATCH 6/6] 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