From bf286206470ce5ef569551d778f91de35a38e7f0 Mon Sep 17 00:00:00 2001 From: Lucas Date: Mon, 17 Jun 2019 21:46:23 +0200 Subject: [PATCH] Add occluder raw injector --- .../java/net/runelite/injector/Inject.java | 3 + .../net/runelite/injector/raw/Occluder.java | 83 +++++++++++++++++++ .../net/runelite/injector/raw/RenderDraw.java | 2 +- 3 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 injector-plugin/src/main/java/net/runelite/injector/raw/Occluder.java diff --git a/injector-plugin/src/main/java/net/runelite/injector/Inject.java b/injector-plugin/src/main/java/net/runelite/injector/Inject.java index 3e24a55374..b228e55e5e 100644 --- a/injector-plugin/src/main/java/net/runelite/injector/Inject.java +++ b/injector-plugin/src/main/java/net/runelite/injector/Inject.java @@ -48,6 +48,7 @@ import net.runelite.deob.deobfuscators.arithmetic.DMath; import net.runelite.injector.raw.ClearColorBuffer; import net.runelite.injector.raw.DrawAfterWidgets; import net.runelite.injector.raw.DrawMenu; +import net.runelite.injector.raw.Occluder; import net.runelite.injector.raw.RasterizerHook; import net.runelite.injector.raw.RenderDraw; import net.runelite.injector.raw.ScriptVM; @@ -76,6 +77,7 @@ public class Inject private final ScriptVM scriptVM = new ScriptVM(this); private final ClearColorBuffer clearColorBuffer = new ClearColorBuffer(this); private final RenderDraw renderDraw = new RenderDraw(this); + private final Occluder occluder = new Occluder(this); // deobfuscated contains exports etc to apply to vanilla private final ClassGroup deobfuscated, vanilla; @@ -334,6 +336,7 @@ public class Inject clearColorBuffer.inject(); renderDraw.inject(); drawMenu.inject(); + occluder.inject(); } private java.lang.Class injectInterface(ClassFile cf, ClassFile other) diff --git a/injector-plugin/src/main/java/net/runelite/injector/raw/Occluder.java b/injector-plugin/src/main/java/net/runelite/injector/raw/Occluder.java new file mode 100644 index 0000000000..9dc2c716a7 --- /dev/null +++ b/injector-plugin/src/main/java/net/runelite/injector/raw/Occluder.java @@ -0,0 +1,83 @@ +package net.runelite.injector.raw; + +import com.google.common.base.Stopwatch; +import java.util.ListIterator; +import net.runelite.asm.Method; +import net.runelite.asm.attributes.Code; +import net.runelite.asm.attributes.code.Instruction; +import net.runelite.asm.attributes.code.Instructions; +import net.runelite.asm.attributes.code.instructions.BiPush; +import net.runelite.injector.Inject; +import net.runelite.injector.InjectUtil; +import net.runelite.injector.InjectionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Occluder +{ + private final Inject inject; + private static final Logger log = LoggerFactory.getLogger(Occluder.class); + private static final byte OLDVALUE = 25; + private static final byte NEWVALUE = 90; + + public Occluder(Inject inject) + { + this.inject = inject; + } + + public void inject() throws InjectionException + { + Stopwatch stopwatch = Stopwatch.createStarted(); + Method occlude = InjectUtil.findMethod(inject, "occlude"); + int replaced = 0; + + if (occlude == null) + { + throw new InjectionException("Occlude couldn't be found"); + } + + Code code = occlude.getCode(); + + if (code == null) + { + throw new InjectionException("Occlude code was null"); + } + + Instructions ins = code.getInstructions(); + + ListIterator it = ins.getInstructions().listIterator(); + + while (it.hasNext()) + { + Instruction i = it.next(); + + if (!(i instanceof BiPush)) + { + continue; + } + + boolean shouldChange = (byte) ((BiPush) i).getConstant() == OLDVALUE; + + if (!shouldChange) + { + continue; + } + + replaced++; + + Instruction biPush = new BiPush(ins, NEWVALUE); + + it.set(biPush); + } + + stopwatch.stop(); + + if (replaced != 10) + { + throw new InjectionException("Only found " + replaced + " 25's to replace in occlude instead of expected 10"); + } + + log.info("Changed {} values in occlude()", replaced); + log.info("occluder took {}", stopwatch.toString()); + } +} diff --git a/injector-plugin/src/main/java/net/runelite/injector/raw/RenderDraw.java b/injector-plugin/src/main/java/net/runelite/injector/raw/RenderDraw.java index bef73b133f..0d559df9ca 100644 --- a/injector-plugin/src/main/java/net/runelite/injector/raw/RenderDraw.java +++ b/injector-plugin/src/main/java/net/runelite/injector/raw/RenderDraw.java @@ -17,7 +17,7 @@ import org.slf4j.LoggerFactory; public class RenderDraw { - private static final Logger log = LoggerFactory.getLogger(ClearColorBuffer.class); + private static final Logger log = LoggerFactory.getLogger(RenderDraw.class); private static final net.runelite.asm.pool.Method renderDraw = new net.runelite.asm.pool.Method( new Class("net.runelite.client.callback.Hooks"), "renderDraw",