revert scriptvmmixin changes for pre/post fired

This commit is contained in:
ThatGamerBlue
2020-06-17 16:52:32 +01:00
committed by Lucwousin
parent 160d14f5e3
commit 9b06cbb192

View File

@@ -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<Integer> 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<Integer> 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();
}
}