diff --git a/injector/src/main/java/com/openosrs/injector/injection/InjectData.java b/injector/src/main/java/com/openosrs/injector/injection/InjectData.java index 8bccb1e5f9..aaef4150c3 100644 --- a/injector/src/main/java/com/openosrs/injector/injection/InjectData.java +++ b/injector/src/main/java/com/openosrs/injector/injection/InjectData.java @@ -30,7 +30,6 @@ import net.runelite.asm.signature.Signature; @NoArgsConstructor 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 diff --git a/injector/src/main/java/com/openosrs/injector/injectors/raw/ClearColorBuffer.java b/injector/src/main/java/com/openosrs/injector/injectors/raw/ClearColorBuffer.java index 6f81ecd8c8..c64499decc 100644 --- a/injector/src/main/java/com/openosrs/injector/injectors/raw/ClearColorBuffer.java +++ b/injector/src/main/java/com/openosrs/injector/injectors/raw/ClearColorBuffer.java @@ -22,17 +22,9 @@ import net.runelite.asm.execution.Execution; import net.runelite.asm.execution.InstructionContext; import net.runelite.asm.execution.MethodContext; import net.runelite.asm.execution.StackContext; -import net.runelite.asm.signature.Signature; -import static com.openosrs.injector.injection.InjectData.HOOKS; public class ClearColorBuffer extends AbstractInjector { - private static final net.runelite.asm.pool.Method CLEARBUFFER = new net.runelite.asm.pool.Method( - new net.runelite.asm.pool.Class(HOOKS), - "clearColorBuffer", - new Signature("(IIIII)V") - ); - public ClearColorBuffer(InjectData inject) { super(inject); @@ -40,11 +32,13 @@ public class ClearColorBuffer extends AbstractInjector public void inject() { + /* * This class stops the client from basically painting everything black before the scene is drawn */ final Execution exec = new Execution(inject.getVanilla()); + final net.runelite.asm.pool.Method clearBuffer = inject.getVanilla().findClass("client").findMethod("clearColorBuffer").getPoolMethod(); final net.runelite.asm.pool.Method fillRectPool = InjectUtil.findMethod(inject, "Rasterizer2D_fillRectangle", "Rasterizer2D", null).getPoolMethod(); final Method drawEntities = InjectUtil.findMethod(inject, "drawEntities"); // XXX: should prob be called drawViewport? @@ -83,7 +77,7 @@ public class ClearColorBuffer extends AbstractInjector } Instructions ins = instr.getInstructions(); - ins.replace(instr, new InvokeStatic(ins, CLEARBUFFER)); + ins.replace(instr, new InvokeStatic(ins, clearBuffer)); log.debug("[DEBUG] Injected drawRectangle at {}", methodContext.getMethod().getPoolMethod()); } } diff --git a/injector/src/main/java/com/openosrs/injector/injectors/raw/DrawMenu.java b/injector/src/main/java/com/openosrs/injector/injectors/raw/DrawMenu.java index 8208405f16..bdb004db91 100644 --- a/injector/src/main/java/com/openosrs/injector/injectors/raw/DrawMenu.java +++ b/injector/src/main/java/com/openosrs/injector/injectors/raw/DrawMenu.java @@ -24,19 +24,10 @@ 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; -import static com.openosrs.injector.injection.InjectData.HOOKS; 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); @@ -66,6 +57,7 @@ public class DrawMenu extends AbstractInjector * -------- */ + final net.runelite.asm.pool.Method drawMenu = inject.getVanilla().findClass("client").findMethod("drawMenu").getPoolMethod(); 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(); @@ -135,7 +127,7 @@ public class DrawMenu extends AbstractInjector final Instructions instrs = mc.getMethod().getCode().getInstructions(); int idx = instrs.getInstructions().indexOf(injectInvokeAfter); - instrs.addInstruction(++idx, new InvokeStatic(instrs, DRAWMENU)); + instrs.addInstruction(++idx, new InvokeStatic(instrs, drawMenu)); instrs.addInstruction(++idx, new IfNe(instrs, labelToJumpTo)); log.info("[INFO] DrawMenu injected a method call at index {} in method {}. With a comparison jumping to {}", idx, drawLoggedIn, labelToJumpTo); diff --git a/injector/src/main/java/com/openosrs/injector/injectors/raw/RenderDraw.java b/injector/src/main/java/com/openosrs/injector/injectors/raw/RenderDraw.java index a36feabad8..79c9abee1e 100644 --- a/injector/src/main/java/com/openosrs/injector/injectors/raw/RenderDraw.java +++ b/injector/src/main/java/com/openosrs/injector/injectors/raw/RenderDraw.java @@ -17,17 +17,9 @@ import net.runelite.asm.attributes.code.Instruction; import net.runelite.asm.attributes.code.Instructions; import net.runelite.asm.attributes.code.instructions.InvokeStatic; import net.runelite.asm.attributes.code.instructions.InvokeVirtual; -import net.runelite.asm.pool.Class; -import net.runelite.asm.signature.Signature; -import static com.openosrs.injector.injection.InjectData.HOOKS; public class RenderDraw extends AbstractInjector { - private static final net.runelite.asm.pool.Method RENDERDRAW = new net.runelite.asm.pool.Method( - new Class(HOOKS), - "renderDraw", - new Signature("(Lnet/runelite/api/Renderable;IIIIIIIIJ)V") - ); private static final int EXPECTED = 21; public RenderDraw(InjectData inject) @@ -38,6 +30,8 @@ public class RenderDraw extends AbstractInjector @Override public void inject() { + final net.runelite.asm.pool.Method renderDraw = inject.toVanilla(inject.getDeobfuscated().findClass("Scene")).findMethod("renderDraw").getPoolMethod(); + int replaced = 0; /* @@ -56,7 +50,7 @@ public class RenderDraw extends AbstractInjector { if (((InvokeVirtual) i).getMethod().equals(draw)) { - iterator.set(new InvokeStatic(ins, RENDERDRAW)); + iterator.set(new InvokeStatic(ins, renderDraw)); log.debug("[DEBUG] Replaced method call at {}", i); ++replaced; } 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 6eca66d2c3..17187e2bdf 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 @@ -41,21 +41,18 @@ import java.util.List; import javax.inject.Inject; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; -import net.runelite.api.BufferProvider; import net.runelite.api.Client; import net.runelite.api.MainBufferProvider; import net.runelite.api.RenderOverview; import net.runelite.api.Renderable; import net.runelite.api.Skill; import net.runelite.api.WorldMapManager; -import net.runelite.api.events.BeforeMenuRender; import net.runelite.api.events.BeforeRender; import net.runelite.api.events.FakeXpDrop; import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameTick; import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.api.hooks.Callbacks; -import net.runelite.api.hooks.DrawCallbacks; import net.runelite.api.widgets.Widget; import static net.runelite.api.widgets.WidgetInfo.WORLD_MAP_VIEW; import net.runelite.api.widgets.WidgetItem; @@ -124,6 +121,7 @@ public class Hooks implements Callbacks /** * Get the Graphics2D for the MainBufferProvider image * This caches the Graphics2D instance so it can be reused + * * @param mainBufferProvider * @return */ @@ -422,6 +420,7 @@ public class Hooks implements Callbacks /** * Copy an image + * * @param src * @return */ @@ -568,45 +567,6 @@ public class Hooks implements Callbacks renderableDrawListeners.remove(listener); } - public static void clearColorBuffer(int x, int y, int width, int height, int color) - { - BufferProvider bp = client.getBufferProvider(); - int canvasWidth = bp.getWidth(); - int[] pixels = bp.getPixels(); - - int pixelPos = y * canvasWidth + x; - int pixelJump = canvasWidth - width; - - for (int cy = y; cy < y + height; cy++) - { - for (int cx = x; cx < x + width; cx++) - { - pixels[pixelPos++] = 0; - } - pixelPos += pixelJump; - } - } - - public static void renderDraw(Renderable renderable, int orientation, int pitchSin, int pitchCos, int yawSin, int yawCos, int x, int y, int z, long hash) - { - DrawCallbacks drawCallbacks = client.getDrawCallbacks(); - if (drawCallbacks != null) - { - drawCallbacks.draw(renderable, orientation, pitchSin, pitchCos, yawSin, yawCos, x, y, z, hash); - } - else - { - renderable.draw(orientation, pitchSin, pitchCos, yawSin, yawCos, x, y, z, hash); - } - } - - public static boolean drawMenu() - { - BeforeMenuRender event = new BeforeMenuRender(); - client.getCallbacks().post(event); - return event.isConsumed(); - } - @Override public boolean draw(Renderable renderable, boolean drawingUi) { diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java index 860a361a1a..e88b2bab9c 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -94,6 +94,7 @@ import net.runelite.api.clan.ClanRank; import net.runelite.api.clan.ClanSettings; import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.BeforeMenuRender; import net.runelite.api.events.CanvasSizeChanged; import net.runelite.api.events.ChatMessage; import net.runelite.api.events.ClanChannelChanged; @@ -3099,5 +3100,13 @@ public abstract class RSClientMixin implements RSClient RSNPC[] var2 = this.getCachedNPCs(); return var1 >= 0 && var1 < var2.length ? var2[var1] : null; } + + @Inject + public static boolean drawMenu() + { + BeforeMenuRender event = new BeforeMenuRender(); + client.getCallbacks().post(event); + return event.isConsumed(); + } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSRasterizer2DMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSRasterizer2DMixin.java index a3c984f34e..42761b5edc 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSRasterizer2DMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSRasterizer2DMixin.java @@ -1,5 +1,6 @@ package net.runelite.mixins; +import net.runelite.api.BufferProvider; import net.runelite.api.mixins.Copy; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; @@ -207,4 +208,24 @@ public abstract class RSRasterizer2DMixin implements RSClient } } } + + @Inject + public static void clearColorBuffer(int x, int y, int width, int height, int color) + { + BufferProvider bp = client.getBufferProvider(); + int canvasWidth = bp.getWidth(); + int[] pixels = bp.getPixels(); + + int pixelPos = y * canvasWidth + x; + int pixelJump = canvasWidth - width; + + for (int cy = y; cy < y + height; cy++) + { + for (int cx = x; cx < x + width; cx++) + { + pixels[pixelPos++] = 0; + } + pixelPos += pixelJump; + } + } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java index da8e663105..d54c7f73cb 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java @@ -33,6 +33,7 @@ import static net.runelite.api.Constants.ROOF_FLAG_POSITION; import net.runelite.api.DecorativeObject; import net.runelite.api.GroundObject; import net.runelite.api.Perspective; +import net.runelite.api.Renderable; import net.runelite.api.SceneTileModel; import net.runelite.api.SceneTilePaint; import net.runelite.api.Tile; @@ -1288,4 +1289,18 @@ public abstract class RSSceneMixin implements RSScene } } } + + @Inject + public static void renderDraw(Renderable renderable, int orientation, int pitchSin, int pitchCos, int yawSin, int yawCos, int x, int y, int z, long hash) + { + DrawCallbacks drawCallbacks = client.getDrawCallbacks(); + if (drawCallbacks != null) + { + drawCallbacks.draw(renderable, orientation, pitchSin, pitchCos, yawSin, yawCos, x, y, z, hash); + } + else + { + renderable.draw(orientation, pitchSin, pitchCos, yawSin, yawCos, x, y, z, hash); + } + } } \ No newline at end of file