From 9b06cbb192942601510629a4591c4660a6243764 Mon Sep 17 00:00:00 2001 From: ThatGamerBlue Date: Wed, 17 Jun 2020 16:52:32 +0100 Subject: [PATCH 1/3] revert scriptvmmixin changes for pre/post fired --- .../net/runelite/mixins/ScriptVMMixin.java | 85 +------------------ 1 file changed, 1 insertion(+), 84 deletions(-) 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 20b713e16b..636bd5d027 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java @@ -25,17 +25,11 @@ */ package net.runelite.mixins; -import java.util.ArrayList; -import java.util.Stack; import java.util.regex.Matcher; import java.util.regex.Pattern; import net.runelite.api.Client; -import static net.runelite.api.Opcodes.INVOKE; -import static net.runelite.api.Opcodes.RETURN; import static net.runelite.api.Opcodes.RUNELITE_EXECUTE; import net.runelite.api.events.ScriptCallbackEvent; -import net.runelite.api.events.ScriptPostFired; -import net.runelite.api.events.ScriptPreFired; import net.runelite.api.mixins.Copy; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; @@ -60,21 +54,10 @@ public abstract class ScriptVMMixin implements RSClient @Inject private static int currentScriptPC; - @Inject - private static ScriptPostFired deferredEvent = null; - - @Inject - private static Stack scriptIds = new Stack<>(); - // Call is injected into runScript by the ScriptVM raw injector @Inject static boolean vmExecuteOpcode(int opcode) { - if (deferredEvent != null) - { - client.getCallbacks().post(ScriptPostFired.class, deferredEvent); - deferredEvent = null; - } if (opcode == RUNELITE_EXECUTE) { assert currentScript.getInstructions()[currentScriptPC] == RUNELITE_EXECUTE; @@ -121,21 +104,6 @@ public abstract class ScriptVMMixin implements RSClient client.getCallbacks().post(ScriptCallbackEvent.class, event); return true; } - else if (opcode == INVOKE) - { - int id = currentScript.getIntOperands()[currentScriptPC]; - scriptIds.push(id); - ScriptPreFired event = new ScriptPreFired(id); - event.setScriptEvent(null); - client.getCallbacks().post(ScriptPreFired.class, event); - } - else if (opcode == RETURN) - { - if (scriptIds.size() > 1) // let the runScript method handle the final script - { - deferredEvent = new ScriptPostFired(scriptIds.pop()); // fire the event when we've left the script - } - } return false; } @@ -153,16 +121,9 @@ public abstract class ScriptVMMixin implements RSClient { try { - ScriptPreFired preFired = new ScriptPreFired(-1); - preFired.setScriptEvent(event); - client.getCallbacks().post(ScriptPreFired.class, preFired); - ((JavaScriptCallback) arguments[0]).run(event); - - ScriptPostFired postFired = new ScriptPostFired(-1); - client.getCallbacks().post(ScriptPostFired.class, postFired); } - catch (Exception e) // wont catch assertions + catch (Exception e) { client.getLogger().error("Error in JavaScriptCallback", e); } @@ -171,34 +132,11 @@ public abstract class ScriptVMMixin implements RSClient { try { - try - { - scriptIds.push((Integer) event.getArguments()[0]); // this is safe because it will always be the script id - - ScriptPreFired preFired = new ScriptPreFired(scriptIds.peek()); // peek doesn't remove the top item - preFired.setScriptEvent(event); - client.getCallbacks().post(ScriptPreFired.class, preFired); - } - catch (ClassCastException ignored) - { - } - rs$runScript(event, maxExecutionTime); - - if (!scriptIds.empty()) - { - ScriptPostFired postFired = new ScriptPostFired(scriptIds.pop()); // hopefully the stack should be dry at this point - assert scriptIds.empty() : "Script ID stack should be empty! Contains: " + getAllScriptIds(); - client.getCallbacks().post(ScriptPostFired.class, postFired); - } } finally { currentScript = null; - while (!scriptIds.empty()) - { - scriptIds.pop(); // make sure the stack is empty, something disastrous happened - } } } } @@ -214,25 +152,4 @@ public abstract class ScriptVMMixin implements RSClient se.setArguments(args); runScript(se, 5000000); } - - @Inject - private static String getAllScriptIds() - { - ArrayList ids = new ArrayList<>(scriptIds); - StringBuilder sb = new StringBuilder(); - boolean first = true; - for (Object item : ids) - { - if (first) - { - first = false; - } - else - { - sb.append(", "); - } - sb.append(item); - } - return sb.toString(); - } } \ No newline at end of file From c314b42744e4eba6740f8ef7a5ff7b51b33adc72 Mon Sep 17 00:00:00 2001 From: ThatGamerBlue Date: Thu, 18 Jun 2020 13:36:44 +0100 Subject: [PATCH 2/3] scriptvmmixin: change event firing order --- .../runelite/api/events/ScriptPreFired.java | 8 +- .../net/runelite/mixins/ScriptVMMixin.java | 107 +++++++++++------- 2 files changed, 67 insertions(+), 48 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/events/ScriptPreFired.java b/runelite-api/src/main/java/net/runelite/api/events/ScriptPreFired.java index a338145e4f..55c58ac4a3 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/ScriptPreFired.java +++ b/runelite-api/src/main/java/net/runelite/api/events/ScriptPreFired.java @@ -24,22 +24,22 @@ */ package net.runelite.api.events; -import lombok.Data; +import lombok.Value; import net.runelite.api.ScriptEvent; /** * An event that is fired before the designated script is ran */ -@Data +@Value public class ScriptPreFired implements Event { /** * The script id of the invoked script */ - private final int scriptId; + int scriptId; /** * The input of the script invoke, this will be null unless it is the root script */ - private ScriptEvent scriptEvent; + ScriptEvent scriptEvent; } 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 636bd5d027..08b559a8c8 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java @@ -28,8 +28,9 @@ package net.runelite.mixins; import java.util.regex.Matcher; import java.util.regex.Pattern; import net.runelite.api.Client; -import static net.runelite.api.Opcodes.RUNELITE_EXECUTE; import net.runelite.api.events.ScriptCallbackEvent; +import net.runelite.api.events.ScriptPostFired; +import net.runelite.api.events.ScriptPreFired; import net.runelite.api.mixins.Copy; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; @@ -39,6 +40,7 @@ import net.runelite.api.widgets.JavaScriptCallback; import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSScript; import net.runelite.rs.api.RSScriptEvent; +import static net.runelite.api.Opcodes.*; @Mixin(RSClient.class) public abstract class ScriptVMMixin implements RSClient @@ -46,7 +48,6 @@ public abstract class ScriptVMMixin implements RSClient @Shadow("client") private static Client client; - // This field is set by the ScriptVM raw injector @Inject private static RSScript currentScript; @@ -54,55 +55,70 @@ public abstract class ScriptVMMixin implements RSClient @Inject private static int currentScriptPC; + // Call is injected by the raw injector + @Inject + static void setCurrentScript(RSScript script) + { + currentScript = script; + } + // Call is injected into runScript by the ScriptVM raw injector @Inject static boolean vmExecuteOpcode(int opcode) { - if (opcode == RUNELITE_EXECUTE) + switch (opcode) { - assert currentScript.getInstructions()[currentScriptPC] == RUNELITE_EXECUTE; - - int stringStackSize = client.getStringStackSize(); - 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); - - client.getLogger().debug(out.toString()); + case RUNELITE_EXECUTE: + assert currentScript.getInstructions()[currentScriptPC] == RUNELITE_EXECUTE; + int stringStackSize = client.getStringStackSize(); + String stringOp = client.getStringStack()[--stringStackSize]; client.setStringStackSize(stringStackSize); - client.setIntStackSize(intStackSize); - return true; - } - ScriptCallbackEvent event = new ScriptCallbackEvent(); - event.setScript(currentScript); - event.setEventName(stringOp); - client.getCallbacks().post(ScriptCallbackEvent.class, event); - return true; + if ("debug".equals(stringOp)) + { + int intStackSize = client.getIntStackSize(); + + String fmt = client.getStringStack()[--stringStackSize]; + StringBuffer out = new StringBuffer(); + Matcher m = Pattern.compile("%(.)").matcher(fmt); + while (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); + + client.getLogger().debug(out.toString()); + + client.setStringStackSize(stringStackSize); + client.setIntStackSize(intStackSize); + return true; + } + + ScriptCallbackEvent event = new ScriptCallbackEvent(); + event.setScript(currentScript); + event.setEventName(stringOp); + client.getCallbacks().post(ScriptCallbackEvent.class, event); + return true; + case INVOKE: + int scriptId = currentScript.getIntOperands()[currentScriptPC]; + client.getCallbacks().post(ScriptPreFired.class, new ScriptPreFired(scriptId, null)); + return false; + case RETURN: + client.getCallbacks().post(ScriptPostFired.class, new ScriptPostFired((int) currentScript.getHash())); + return false; } return false; } @@ -117,7 +133,8 @@ public abstract class ScriptVMMixin implements RSClient static void rl$runScript(RSScriptEvent event, int maxExecutionTime) { Object[] arguments = event.getArguments(); - if (arguments != null && arguments.length > 0 && arguments[0] instanceof JavaScriptCallback) + assert arguments != null && arguments.length > 0; + if (arguments[0] instanceof JavaScriptCallback) { try { @@ -132,6 +149,8 @@ public abstract class ScriptVMMixin implements RSClient { try { + final ScriptPreFired pre = new ScriptPreFired((int) arguments[0], event); + client.getCallbacks().post(ScriptPreFired.class, pre); rs$runScript(event, maxExecutionTime); } finally From 934fad63b551533c2f528a25022f59b6e559cc4b Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Sun, 28 Jun 2020 17:02:21 +0200 Subject: [PATCH 3/3] add maven repo and increment injector dep version --- build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index e0f2a98d5b..d883b23595 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -29,13 +29,13 @@ import org.ajoberstar.grgit.Grgit buildscript { repositories { gradlePluginPortal() - mavenLocal() + maven(url = "https://repo.openosrs.com/repository/maven/") maven(url = "https://raw.githubusercontent.com/open-osrs/hosting/master") } dependencies { classpath("org.ajoberstar.grgit:grgit-core:4.0.2") classpath("com.github.ben-manes:gradle-versions-plugin:0.28.0") - classpath("com.openosrs:injector-plugin:1.1.3") + classpath("com.openosrs:injector-plugin:1.1.4") } }