From 28dcc47ac8ec9ebfa30d9c46242551ba3bfd68ad Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Thu, 12 May 2022 01:50:21 +0200 Subject: [PATCH] project(injector): Make it possible to use rsc-api in rsc --- .../injectors/raw/CopyRuneLiteClasses.java | 35 +++++++++++++++---- runescape-client/runescape-client.gradle.kts | 1 + 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/injector/src/main/java/com/openosrs/injector/injectors/raw/CopyRuneLiteClasses.java b/injector/src/main/java/com/openosrs/injector/injectors/raw/CopyRuneLiteClasses.java index 49cd7ffe03..a96f018f0f 100644 --- a/injector/src/main/java/com/openosrs/injector/injectors/raw/CopyRuneLiteClasses.java +++ b/injector/src/main/java/com/openosrs/injector/injectors/raw/CopyRuneLiteClasses.java @@ -10,8 +10,10 @@ package com.openosrs.injector.injectors.raw; import com.openosrs.injector.InjectUtil; import com.openosrs.injector.injection.InjectData; import com.openosrs.injector.injectors.AbstractInjector; +import java.util.HashSet; import java.util.List; import java.util.ListIterator; +import java.util.Set; import net.runelite.asm.ClassFile; import net.runelite.asm.Field; import net.runelite.asm.Method; @@ -43,6 +45,9 @@ public class CopyRuneLiteClasses extends AbstractInjector "RuneLiteObject" ); + + private final Set shadowFields = new HashSet<>(); + public CopyRuneLiteClasses(InjectData inject) { super(inject); @@ -52,6 +57,8 @@ public class CopyRuneLiteClasses extends AbstractInjector { for (String className : RUNELITE_OBJECTS) { + shadowFields.clear(); + ClassFile runeliteObjectVanilla = inject.vanilla.findClass(className); final ClassFile runeLiteDeob = inject.getDeobfuscated() @@ -85,18 +92,23 @@ public class CopyRuneLiteClasses extends AbstractInjector runeliteObjectVanilla.getInterfaces().addInterface(interfaze); } - for (Field field : runeLiteDeob.getFields()) - { - field.setType(InjectUtil.deobToVanilla(inject, field.getType())); - runeliteObjectVanilla.addField(field); - } - for (Method method : runeLiteDeob.getMethods()) { transformMethod(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); } } @@ -165,7 +177,16 @@ public class CopyRuneLiteClasses extends AbstractInjector net.runelite.asm.pool.Field field = ((GetStatic) i).getField(); 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)); } diff --git a/runescape-client/runescape-client.gradle.kts b/runescape-client/runescape-client.gradle.kts index 5c177ff7b5..933ba6d6b7 100644 --- a/runescape-client/runescape-client.gradle.kts +++ b/runescape-client/runescape-client.gradle.kts @@ -27,6 +27,7 @@ group = "com.openosrs.rs" description = "RuneScape Client" dependencies { + api(project(":runescape-api")) api(project(":runelite-api")) implementation(project(":injection-annotations"))