feat: biem boem bam

This commit is contained in:
Owain van Brakel
2021-09-25 23:07:03 +02:00
parent 8ab73ae307
commit 4938b84123
21 changed files with 589 additions and 26 deletions

View File

@@ -18,9 +18,11 @@ import com.openosrs.injector.injectors.RSApiInjector;
import com.openosrs.injector.injectors.raw.AddPlayerToMenu;
import com.openosrs.injector.injectors.raw.ClearColorBuffer;
import com.openosrs.injector.injectors.raw.DrawMenu;
import com.openosrs.injector.injectors.raw.GraphicsObject;
import com.openosrs.injector.injectors.raw.Occluder;
import com.openosrs.injector.injectors.raw.RasterizerAlpha;
import com.openosrs.injector.injectors.raw.RenderDraw;
import com.openosrs.injector.injectors.raw.RuneliteObject;
import com.openosrs.injector.injectors.raw.ScriptVM;
import com.openosrs.injector.rsapi.RSApi;
import com.openosrs.injector.transformers.InjectTransformer;
@@ -109,6 +111,8 @@ public class Injector extends InjectData implements InjectTaskHandler
inject(new CreateAnnotations(this));
inject(new RuneliteObject(this));
inject(new InterfaceInjector(this));
inject(new RasterizerAlpha(this));
@@ -138,6 +142,8 @@ public class Injector extends InjectData implements InjectTaskHandler
inject(new AddPlayerToMenu(this));
inject(new GraphicsObject(this));
validate(new InjectorValidator(this));
transform(new SourceChanger(this));

View File

@@ -7,7 +7,6 @@
*/
package com.openosrs.injector.injection;
import com.google.common.collect.ImmutableMap;
import com.openosrs.injector.InjectUtil;
import com.openosrs.injector.injectors.Injector;
import com.openosrs.injector.rsapi.RSApi;
@@ -45,7 +44,7 @@ public abstract class InjectData
/**
* Deobfuscated ClassFiles -> Vanilla ClassFiles
*/
public Map<ClassFile, ClassFile> toVanilla;
public final Map<ClassFile, ClassFile> toVanilla = new HashMap<>();
/**
* Strings -> Deobfuscated ClassFiles
@@ -53,14 +52,12 @@ public abstract class InjectData
* - Obfuscated name
* - RSApi implementing name
*/
private final Map<String, ClassFile> toDeob = new HashMap<>();
public final Map<String, ClassFile> toDeob = new HashMap<>();
public abstract void runChildInjector(Injector injector);
public void initToVanilla()
{
ImmutableMap.Builder<ClassFile, ClassFile> toVanillaB = ImmutableMap.builder();
for (final ClassFile deobClass : deobfuscated)
{
if (deobClass.getName().startsWith("net/runelite/") || deobClass.getName().startsWith("netscape"))
@@ -73,13 +70,14 @@ public abstract class InjectData
{
toDeob.put(obName, deobClass);
// Can't be null
final ClassFile obClass = this.vanilla.findClass(obName);
toVanillaB.put(deobClass, obClass);
if (obClass != null)
{
toVanilla.put(deobClass, obClass);
}
}
}
this.toVanilla = toVanillaB.build();
}
/**

View File

@@ -0,0 +1,56 @@
/*
* Copyright (c) 2021, Owain van Brakel <https://github.com/Owain94>
* All rights reserved.
*
* This code is licensed under GPL3, see the complete license in
* the LICENSE file in the root directory of this submodule.
*/
package com.openosrs.injector.injectors.raw;
import com.openosrs.injector.injection.InjectData;
import com.openosrs.injector.injectors.AbstractInjector;
import net.runelite.asm.ClassFile;
import net.runelite.asm.Method;
import net.runelite.asm.attributes.Code;
import net.runelite.asm.attributes.code.Instructions;
import net.runelite.asm.attributes.code.instructions.ALoad;
import net.runelite.asm.attributes.code.instructions.InvokeSpecial;
import net.runelite.asm.attributes.code.instructions.VReturn;
import net.runelite.asm.signature.Signature;
public class GraphicsObject extends AbstractInjector
{
public GraphicsObject(InjectData inject)
{
super(inject);
}
public void inject()
{
final ClassFile graphicsObjectVanilla = inject.toVanilla(
inject.getDeobfuscated()
.findClass("GraphicsObject")
);
final ClassFile renderableVanilla = inject.toVanilla(
inject.getDeobfuscated()
.findClass("Renderable")
);
graphicsObjectVanilla.clearFinal();
Method initGraphicsObject = new Method(graphicsObjectVanilla, "<init>", new Signature("()V"));
initGraphicsObject.setPublic();
final Code code = new Code(initGraphicsObject);
code.setMaxStack(1);
initGraphicsObject.setCode(code);
graphicsObjectVanilla.addMethod(initGraphicsObject);
Instructions ins = code.getInstructions();
ins.addInstruction(new ALoad(ins, 0));
ins.addInstruction(new InvokeSpecial(ins, new net.runelite.asm.pool.Method(renderableVanilla.getPoolClass(), "<init>", new Signature("()V"))));
ins.addInstruction(new VReturn(ins));
}
}

View File

@@ -0,0 +1,103 @@
/*
* Copyright (c) 2021, Owain van Brakel <https://github.com/Owain94>
* All rights reserved.
*
* This code is licensed under GPL3, see the complete license in
* the LICENSE file in the root directory of this submodule.
*/
package com.openosrs.injector.injectors.raw;
import com.openosrs.injector.injection.InjectData;
import com.openosrs.injector.injectors.AbstractInjector;
import java.util.List;
import net.runelite.asm.ClassFile;
import net.runelite.asm.Method;
import net.runelite.asm.attributes.Code;
import net.runelite.asm.attributes.code.Instruction;
import net.runelite.asm.attributes.code.InstructionType;
import net.runelite.asm.attributes.code.Instructions;
import net.runelite.asm.attributes.code.instructions.ALoad;
import net.runelite.asm.attributes.code.instructions.Dup;
import net.runelite.asm.attributes.code.instructions.InvokeSpecial;
import net.runelite.asm.attributes.code.instructions.New;
import net.runelite.asm.attributes.code.instructions.Return;
import net.runelite.asm.attributes.code.instructions.VReturn;
import net.runelite.asm.signature.Signature;
import org.objectweb.asm.Opcodes;
public class RuneliteObject extends AbstractInjector
{
private static final String RUNELITE_OBJECT = "RuneLiteObject";
public RuneliteObject(InjectData inject)
{
super(inject);
}
public void inject()
{
ClassFile runeliteObjectVanilla = inject.vanilla.findClass(RUNELITE_OBJECT);
final ClassFile graphicsObjectVanilla = inject.toVanilla(
inject.getDeobfuscated()
.findClass("GraphicsObject")
);
graphicsObjectVanilla.clearFinal();
final ClassFile clientVanilla = inject.toVanilla(
inject.getDeobfuscated()
.findClass("Client")
);
final ClassFile runeLiteObjectDeob = inject.getDeobfuscated()
.findClass(RUNELITE_OBJECT);
if (runeliteObjectVanilla == null)
{
runeliteObjectVanilla = new ClassFile(inject.vanilla);
runeliteObjectVanilla.setName(RUNELITE_OBJECT);
runeliteObjectVanilla.setParentClass(graphicsObjectVanilla.getPoolClass());
runeliteObjectVanilla.setAccess(Opcodes.ACC_PUBLIC);
runeliteObjectVanilla.setVersion(Opcodes.V1_8);
inject.vanilla.addClass(runeliteObjectVanilla);
inject.toVanilla.put(runeLiteObjectDeob, runeliteObjectVanilla);
}
{
Method initRuneliteObject = new Method(runeliteObjectVanilla, "<init>", new Signature("()V"));
initRuneliteObject.setPublic();
final Code code = new Code(initRuneliteObject);
code.setMaxStack(1);
initRuneliteObject.setCode(code);
runeliteObjectVanilla.addMethod(initRuneliteObject);
final Instructions instructions = code.getInstructions();
final List<Instruction> ins = instructions.getInstructions();
ins.add(new ALoad(instructions, 0));
ins.add(new InvokeSpecial(instructions, new net.runelite.asm.pool.Method(graphicsObjectVanilla.getPoolClass(), "<init>", new Signature("()V"))));
ins.add(new VReturn(instructions));
}
{
Method copy = new Method(clientVanilla, "createRuneLiteObject", new Signature("()Lnet/runelite/api/RuneLiteObject;"));
copy.setPublic();
final Code code = new Code(copy);
code.setMaxStack(2);
copy.setCode(code);
clientVanilla.addMethod(copy);
final Instructions instructions = code.getInstructions();
final List<Instruction> ins = instructions.getInstructions();
ins.add(new New(instructions, runeliteObjectVanilla.getPoolClass()));
ins.add(new Dup(instructions));
ins.add(new InvokeSpecial(instructions, new net.runelite.asm.pool.Method(runeliteObjectVanilla.getPoolClass(), "<init>", new Signature("()V"))));
ins.add(new Return(instructions, InstructionType.ARETURN));
}
}
}