project(injector): Make it possible to use rsc-api in rsc

This commit is contained in:
Owain van Brakel
2022-05-12 01:50:21 +02:00
parent 8ed22caad4
commit 28dcc47ac8
2 changed files with 29 additions and 7 deletions

View File

@@ -10,8 +10,10 @@ package com.openosrs.injector.injectors.raw;
import com.openosrs.injector.InjectUtil; import com.openosrs.injector.InjectUtil;
import com.openosrs.injector.injection.InjectData; import com.openosrs.injector.injection.InjectData;
import com.openosrs.injector.injectors.AbstractInjector; import com.openosrs.injector.injectors.AbstractInjector;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.ListIterator; import java.util.ListIterator;
import java.util.Set;
import net.runelite.asm.ClassFile; import net.runelite.asm.ClassFile;
import net.runelite.asm.Field; import net.runelite.asm.Field;
import net.runelite.asm.Method; import net.runelite.asm.Method;
@@ -43,6 +45,9 @@ public class CopyRuneLiteClasses extends AbstractInjector
"RuneLiteObject" "RuneLiteObject"
); );
private final Set<Type> shadowFields = new HashSet<>();
public CopyRuneLiteClasses(InjectData inject) public CopyRuneLiteClasses(InjectData inject)
{ {
super(inject); super(inject);
@@ -52,6 +57,8 @@ public class CopyRuneLiteClasses extends AbstractInjector
{ {
for (String className : RUNELITE_OBJECTS) for (String className : RUNELITE_OBJECTS)
{ {
shadowFields.clear();
ClassFile runeliteObjectVanilla = inject.vanilla.findClass(className); ClassFile runeliteObjectVanilla = inject.vanilla.findClass(className);
final ClassFile runeLiteDeob = inject.getDeobfuscated() final ClassFile runeLiteDeob = inject.getDeobfuscated()
@@ -85,18 +92,23 @@ public class CopyRuneLiteClasses extends AbstractInjector
runeliteObjectVanilla.getInterfaces().addInterface(interfaze); runeliteObjectVanilla.getInterfaces().addInterface(interfaze);
} }
for (Field field : runeLiteDeob.getFields())
{
field.setType(InjectUtil.deobToVanilla(inject, field.getType()));
runeliteObjectVanilla.addField(field);
}
for (Method method : runeLiteDeob.getMethods()) for (Method method : runeLiteDeob.getMethods())
{ {
transformMethod(method); transformMethod(method);
runeliteObjectVanilla.addMethod(method); runeliteObjectVanilla.addMethod(method);
} }
for (Field field : runeLiteDeob.getFields())
{
if (shadowFields.contains(field.getType()))
{
continue;
}
field.setType(InjectUtil.deobToVanilla(inject, field.getType()));
runeliteObjectVanilla.addField(field);
}
inject.vanilla.addClass(runeliteObjectVanilla); inject.vanilla.addClass(runeliteObjectVanilla);
} }
} }
@@ -165,7 +177,16 @@ public class CopyRuneLiteClasses extends AbstractInjector
net.runelite.asm.pool.Field field = ((GetStatic) i).getField(); net.runelite.asm.pool.Field field = ((GetStatic) i).getField();
Field vanilla = findField(field); Field vanilla = findField(field);
if (vanilla != null) if (method.getClassFile().getName().equals(field.getClazz().getName()) && field.getType().toString().contains("Lnet/runelite/rs/api/RS"))
{
shadowFields.add(field.getType());
String fieldName = field.getType().toString().replace("Lnet/runelite/rs/api/RS", "").replace(";", "");
final Field deobTargetField = InjectUtil.findStaticField(inject, fieldName.substring(0, 1).toLowerCase() + fieldName.substring(1), null, InjectUtil.apiToDeob(inject, field.getType()));
iterator.set(new GetStatic(ins, inject.toVanilla(deobTargetField)));
}
else if (vanilla != null)
{ {
iterator.set(new GetStatic(ins, vanilla)); iterator.set(new GetStatic(ins, vanilla));
} }

View File

@@ -27,6 +27,7 @@ group = "com.openosrs.rs"
description = "RuneScape Client" description = "RuneScape Client"
dependencies { dependencies {
api(project(":runescape-api"))
api(project(":runelite-api")) api(project(":runelite-api"))
implementation(project(":injection-annotations")) implementation(project(":injection-annotations"))