From da9633149184cac5ebcc9b53be410f7d09b10ad1 Mon Sep 17 00:00:00 2001 From: therealunull Date: Tue, 15 Dec 2020 15:24:06 -0500 Subject: [PATCH] upstream drawAfterWidgets --- build.gradle.kts | 2 +- .../code/instructions/InvokeInterface.java | 5 ++ gradle.properties | 2 +- .../openosrs-injector.gradle.kts | 6 +-- .../injector/injection/InjectData.java | 1 + .../injectors/raw/DrawAfterWidgets.java | 46 +++++++++++++++++-- .../net/runelite/api/hooks/Callbacks.java | 2 + .../net/runelite/client/callback/Hooks.java | 3 +- 8 files changed, 56 insertions(+), 11 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index d610b5df85..99776ab562 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -36,7 +36,7 @@ buildscript { dependencies { classpath("org.ajoberstar.grgit:grgit-core:4.1.0") classpath("com.github.ben-manes:gradle-versions-plugin:0.36.0") - classpath("com.openosrs:openosrs-injector:1.3.0") + classpath("com.openosrs:openosrs-injector:1.0.1") } } diff --git a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeInterface.java b/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeInterface.java index 6272cf7853..b2c4349fa4 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeInterface.java +++ b/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/InvokeInterface.java @@ -57,6 +57,11 @@ public class InvokeInterface extends Instruction implements InvokeInstruction super(instructions, type); } + public InvokeInterface(Instructions instructions, Method method) { + super(instructions, InstructionType.INVOKEINTERFACE); + this.method = method; + } + @Override public String toString() { diff --git a/gradle.properties b/gradle.properties index dbf57649ed..d34c6d562c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -org.gradle.caching=true +org.gradle.caching=false org.gradle.warning.mode=all org.gradle.parallel=true org.gradle.console=rich diff --git a/openosrs-injector/openosrs-injector.gradle.kts b/openosrs-injector/openosrs-injector.gradle.kts index c9c7a0e938..acb5a73f1e 100644 --- a/openosrs-injector/openosrs-injector.gradle.kts +++ b/openosrs-injector/openosrs-injector.gradle.kts @@ -18,7 +18,7 @@ plugins { val oprsver = "3.5.1" group = "com.openosrs" -version = "1.3.0" +version = "1.0.1" repositories { mavenCentral() @@ -38,9 +38,7 @@ dependencies { implementation("org.ow2.asm:asm-util:8.0.1") implementation("org.jetbrains:annotations:19.0.0") implementation("com.google.guava:guava:29.0-jre") - implementation("com.openosrs:deobfuscator:${oprsver}") { - isTransitive = false - } + implementation(project(":deobfuscator")) testCompileOnly("com.openosrs:injection-annotations:1.0") testImplementation("junit:junit:4.13") diff --git a/openosrs-injector/src/main/java/com/openosrs/injector/injection/InjectData.java b/openosrs-injector/src/main/java/com/openosrs/injector/injection/InjectData.java index 3f47bf12ef..8adfb205d3 100644 --- a/openosrs-injector/src/main/java/com/openosrs/injector/injection/InjectData.java +++ b/openosrs-injector/src/main/java/com/openosrs/injector/injection/InjectData.java @@ -28,6 +28,7 @@ import net.runelite.asm.signature.Signature; public abstract class InjectData { public static final String HOOKS = "net/runelite/client/callback/Hooks"; + public static final String CALLBACKS = "net/runelite/api/hooks/Callbacks"; @Getter private final ClassGroup vanilla; diff --git a/openosrs-injector/src/main/java/com/openosrs/injector/injectors/raw/DrawAfterWidgets.java b/openosrs-injector/src/main/java/com/openosrs/injector/injectors/raw/DrawAfterWidgets.java index 218b618320..864b5a59b0 100644 --- a/openosrs-injector/src/main/java/com/openosrs/injector/injectors/raw/DrawAfterWidgets.java +++ b/openosrs-injector/src/main/java/com/openosrs/injector/injectors/raw/DrawAfterWidgets.java @@ -33,22 +33,25 @@ package com.openosrs.injector.injectors.raw; import com.openosrs.injector.InjectException; import com.openosrs.injector.InjectUtil; import com.openosrs.injector.injection.InjectData; +import static com.openosrs.injector.injection.InjectData.CALLBACKS; import com.openosrs.injector.injectors.AbstractInjector; import java.util.HashSet; import java.util.ListIterator; import java.util.Set; import net.runelite.asm.ClassFile; +import net.runelite.asm.Field; import net.runelite.asm.Method; import net.runelite.asm.attributes.code.Instruction; import net.runelite.asm.attributes.code.Instructions; import net.runelite.asm.attributes.code.Label; import net.runelite.asm.attributes.code.instruction.types.JumpingInstruction; import net.runelite.asm.attributes.code.instruction.types.PushConstantInstruction; +import net.runelite.asm.attributes.code.instructions.GetField; import net.runelite.asm.attributes.code.instructions.GetStatic; import net.runelite.asm.attributes.code.instructions.IMul; +import net.runelite.asm.attributes.code.instructions.InvokeInterface; import net.runelite.asm.attributes.code.instructions.InvokeStatic; import net.runelite.asm.signature.Signature; -import static com.openosrs.injector.injection.InjectData.HOOKS; public class DrawAfterWidgets extends AbstractInjector { @@ -103,6 +106,8 @@ public class DrawAfterWidgets extends AbstractInjector boolean injected = false; + Field client = getVanillaStaticFieldFromDeob("client"); + Field callbacks = getObfuscatedField("callbacks"); Method noClip = InjectUtil.findMethod(inject, "Rasterizer2D_resetClip", "Rasterizer2D", null); // !!!!! if (noClip == null) @@ -235,16 +240,17 @@ public class DrawAfterWidgets extends AbstractInjector for (Label l : labelsToInjectAfter) { - InvokeStatic invoke = new InvokeStatic(instructions, + InvokeInterface invoke = new InvokeInterface(instructions, new net.runelite.asm.pool.Method( - new net.runelite.asm.pool.Class(HOOKS), + new net.runelite.asm.pool.Class(CALLBACKS), "drawAfterWidgets", new Signature("()V") ) ); instructions.addInstruction(instructions.getInstructions().indexOf(l) + 1, invoke); - + instructions.addInstruction(instructions.getInstructions().indexOf(l) + 1, new GetField(instructions, callbacks.getPoolField())); + instructions.addInstruction(instructions.getInstructions().indexOf(l) + 1, new GetStatic(instructions, client.getPoolField())); log.debug("[DEBUG] injectDrawAfterWidgets injected a call after " + l); injected = true; @@ -257,4 +263,36 @@ public class DrawAfterWidgets extends AbstractInjector throw new InjectException("injectDrawAfterWidgets failed to inject!"); } } + + public Field getVanillaStaticFieldFromDeob(String s) + { + for (ClassFile c : inject.getDeobfuscated()) + { + for (Field f : c.getFields()) + { + if (f.isStatic()) + if (f.getName().equals(s)) + { + return inject.toVanilla(f); + } + } + } + return null; + } + + public Field getObfuscatedField(String s) + { + for (ClassFile c : inject.getVanilla()) + { + for (Field f : c.getFields()) + { + if (!f.isStatic()) + if (f.getName().equals(s)) + { + return f; + } + } + } + return null; + } } diff --git a/runelite-api/src/main/java/net/runelite/api/hooks/Callbacks.java b/runelite-api/src/main/java/net/runelite/api/hooks/Callbacks.java index 8521576a65..51faedb49b 100644 --- a/runelite-api/src/main/java/net/runelite/api/hooks/Callbacks.java +++ b/runelite-api/src/main/java/net/runelite/api/hooks/Callbacks.java @@ -70,6 +70,8 @@ public interface Callbacks */ void drawAboveOverheads(); + void drawAfterWidgets(); + /** * Client top-most draw method, rendering over top of most of game interfaces. * diff --git a/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java b/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java index b46944ce17..1b92d18ac5 100644 --- a/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java +++ b/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java @@ -450,7 +450,8 @@ public class Hooks implements Callbacks } } - public static void drawAfterWidgets() + @Override + public void drawAfterWidgets() { MainBufferProvider bufferProvider = (MainBufferProvider) client.getBufferProvider(); Graphics2D graphics2d = getGraphics(bufferProvider);