diff --git a/build.gradle.kts b/build.gradle.kts index 11f598d..3c702cc 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,7 +14,7 @@ plugins { } group = "com.openosrs" -version = "1.0.1" +version = "1.0.2" repositories { mavenCentral() diff --git a/src/main/java/com/openosrs/injector/Injection.java b/src/main/java/com/openosrs/injector/Injection.java index 4068a41..652ea2c 100644 --- a/src/main/java/com/openosrs/injector/Injection.java +++ b/src/main/java/com/openosrs/injector/Injection.java @@ -16,6 +16,7 @@ import com.openosrs.injector.injectors.MixinInjector; import com.openosrs.injector.injectors.RSApiInjector; import com.openosrs.injector.injectors.raw.ClearColorBuffer; import com.openosrs.injector.injectors.raw.DrawAfterWidgets; +import com.openosrs.injector.injectors.raw.DrawMenu; import com.openosrs.injector.injectors.raw.HidePlayerAttacks; import com.openosrs.injector.injectors.raw.Occluder; import com.openosrs.injector.injectors.raw.RasterizerAlpha; @@ -72,7 +73,7 @@ public class Injection extends InjectData implements InjectTaskHandler inject(new Occluder(this)); - // inject(new DrawMenu(this)); + inject(new DrawMenu(this)); inject(new HidePlayerAttacks(this)); diff --git a/src/main/java/com/openosrs/injector/injectors/raw/DrawMenu.java b/src/main/java/com/openosrs/injector/injectors/raw/DrawMenu.java index d2ee63c..5db6cc2 100644 --- a/src/main/java/com/openosrs/injector/injectors/raw/DrawMenu.java +++ b/src/main/java/com/openosrs/injector/injectors/raw/DrawMenu.java @@ -5,198 +5,127 @@ * This code is licensed under GPL3, see the complete license in * the LICENSE file in the root directory of this source tree. */ -//package com.openosrs.injector.injectors.raw; +package com.openosrs.injector.injectors.raw; -//import com.openosrs.injector.InjectUtil; -//import com.openosrs.injector.Injexception; -//import com.openosrs.injector.injection.InjectData; -//import static com.openosrs.injector.injection.InjectData.HOOKS; -//import com.openosrs.injector.injectors.AbstractInjector; -//import java.util.List; -//import java.util.ListIterator; -//import net.runelite.asm.ClassFile; -//import net.runelite.asm.ClassGroup; -//import net.runelite.asm.Method; -//import net.runelite.asm.Type; -//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.GetStatic; -//import net.runelite.asm.attributes.code.instructions.IStore; -//import net.runelite.asm.attributes.code.instructions.IfEq; -//import net.runelite.asm.attributes.code.instructions.IfNe; -//import net.runelite.asm.attributes.code.instructions.InvokeStatic; -//import net.runelite.asm.execution.Execution; -//import net.runelite.asm.execution.InstructionContext; -//import net.runelite.asm.pool.Class; -//import net.runelite.asm.pool.Field; -//import net.runelite.asm.signature.Signature; +import com.openosrs.injector.InjectUtil; +import com.openosrs.injector.Injexception; +import com.openosrs.injector.injection.InjectData; +import static com.openosrs.injector.injection.InjectData.HOOKS; +import com.openosrs.injector.injectors.AbstractInjector; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; +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.instructions.GetStatic; +import net.runelite.asm.attributes.code.instructions.IfEq; +import net.runelite.asm.attributes.code.instructions.IfNe; +import net.runelite.asm.attributes.code.instructions.InvokeStatic; +import net.runelite.asm.execution.Execution; +import net.runelite.asm.execution.InstructionContext; +import net.runelite.asm.execution.MethodContext; +import net.runelite.asm.pool.Class; +import net.runelite.asm.pool.Field; +import net.runelite.asm.signature.Signature; -//public class DrawMenu extends AbstractInjector -//{ - //private static final net.runelite.asm.pool.Method HOOK = new net.runelite.asm.pool.Method( - //new Class(HOOKS), - //"drawMenu", - //new Signature("()Z") - //); - //private static final int MENU_COLOR = 0x5d5447; +public class DrawMenu extends AbstractInjector +{ + private static final net.runelite.asm.pool.Method DRAWMENU = new net.runelite.asm.pool.Method( + new Class(HOOKS), + "drawMenu", + new Signature("()Z") + ); - //public DrawMenu(InjectData inject) - //{ - //super(inject); - //} + public DrawMenu(InjectData inject) + { + super(inject); + } - //public void inject() throws Injexception - //{ - ///* - //* Label Getstatic client.isMenuOpen - //* Ifne -> Label Drawmenu - //* Jump -> Label Drawtext - //* - //* Label drawtext - //* Ldc xxx - //* Getstatic client. something with viewport size? - //* Imul - //* Iconst_m1 - //* Ifne -> Label after draw menu <- info we need - //* Getstatic / LDC (same getstatic and LDC before) - //* Getstatic / LDC - //*/ - //final ClassFile deobClient = inject.getDeobfuscated().findClass("Client"); - //final ClassGroup vanilla = inject.getVanilla(); + public void inject() throws Injexception + { + /* + * The drawMenu method can be inlined, so we need this raw injector to find where to inject. + * + * Originally I wanted to make sure we don't skip the method where client gets told not to draw + * the widgets behind the menu. This would be useless though, as the client redraws the widgets + * no matter what. It would also be such a insignificant performance boost it doesn't seem worth + * the extra headache to me. + * + * --- what the code looks like completely uninlined --- + * if (!isMenuOpen) { + * if (viewportX != -1) { + * drawTopLeftText(viewportX, viewportY); + * } + * } else { + * drawMenu(); + * } + * + * if (gameDrawingMode == 3) { + * ... + * -------- + */ - //final Field isMenuOpen = inject.toVanilla(deobClient.findField("isMenuOpen")).getPoolField(); - //final Method drawLoggedIn = inject.toVanilla(deobClient.findMethod("drawLoggedIn")); + final Method drawLoggedIn = InjectUtil.findMethod(inject, "drawLoggedIn", "Client", null, true, false); + final Field gameDrawMode = InjectUtil.findField(inject, "gameDrawingMode", "Client").getPoolField(); + final Field isMenuOpen = InjectUtil.findField(inject, "isMenuOpen", "Client").getPoolField(); - //final Instructions inst = drawLoggedIn.getCode().getInstructions(); + final Execution execution = new Execution(inject.getVanilla()); + execution.noInvoke = true; + execution.addMethod(drawLoggedIn); - //boolean foundCol = false, foundEnd = false; - //int injIdx = -1; - //final ListIterator it = inst.listIterator(); - //while (it.hasNext()) - //{ - //Instruction i = it.next(); - //if (!foundCol && - //(i instanceof PushConstantInstruction) && - //((PushConstantInstruction) i).getConstant().equals(MENU_COLOR)) - //{ - //foundCol = true; - //injIdx = it.nextIndex(); - //} - //else if (!foundEnd && - //(i instanceof PushConstantInstruction) && - //((PushConstantInstruction) i).getConstant().equals(0)) - //{ - //i = it.next(); - //if (!(i instanceof IStore)) - //{ - //continue; - //} + AtomicReference mcRef = new AtomicReference<>(null); - //int varIdx = ((IStore) i).getVariableIndex(); - //i = it.next(); + execution.addMethodContextVisitor(mcRef::set); + execution.run(); - //if (!(i instanceof JumpingInstruction)) - //{ - //continue; - //} + Instruction injectInvokeAfter = null; + Label labelToJumpTo = null; - //List