From a7344a7773fabdbeb3dd469268c7c5ffa7fa1e9f Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Wed, 6 Nov 2019 17:37:21 +0100 Subject: [PATCH] Make RSApiInjector prioritize same-class methods/fields over static --- build.gradle.kts | 2 +- .../com/openosrs/injector/InjectUtil.java | 9 +++-- .../injector/injectors/RSApiInjector.java | 35 +++++++++++++++++-- 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 39febb0..11f598d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,7 +14,7 @@ plugins { } group = "com.openosrs" -version = "1.0.0" +version = "1.0.1" repositories { mavenCentral() diff --git a/src/main/java/com/openosrs/injector/InjectUtil.java b/src/main/java/com/openosrs/injector/InjectUtil.java index 07219ed..f8a7ad5 100644 --- a/src/main/java/com/openosrs/injector/InjectUtil.java +++ b/src/main/java/com/openosrs/injector/InjectUtil.java @@ -265,9 +265,14 @@ public interface InjectUtil throw new Injexception("Field " + name + " doesn't exist"); } - static ClassFile fromApiMethod(InjectData data, RSApiMethod apiMethod) + static ClassFile deobFromApiMethod(InjectData data, RSApiMethod apiMethod) { - return data.toVanilla(data.toDeob(apiMethod.getClazz().getName())); + return data.toDeob(apiMethod.getClazz().getName()); + } + + static ClassFile vanillaFromApiMethod(InjectData data, RSApiMethod apiMethod) + { + return data.toVanilla(deobFromApiMethod(data, apiMethod)); } static Signature apiToDeob(InjectData data, Signature api) diff --git a/src/main/java/com/openosrs/injector/injectors/RSApiInjector.java b/src/main/java/com/openosrs/injector/injectors/RSApiInjector.java index 968dc7b..b50f0d7 100644 --- a/src/main/java/com/openosrs/injector/injectors/RSApiInjector.java +++ b/src/main/java/com/openosrs/injector/injectors/RSApiInjector.java @@ -70,7 +70,7 @@ public class RSApiInjector extends AbstractInjector final RSApiClass implementingClass = inject.getRsApi().findClass(API_BASE + deobClass.getName()); injectFields(deobClass, implementingClass); - injectMethods(deobClass, implementingClass); // aka invokers + injectMethods(deobClass, implementingClass); } retryFailures(); @@ -101,6 +101,20 @@ public class RSApiInjector extends AbstractInjector continue; } + // Check if there's a field with the same exported name on the api target class itself, + // as that should come before random static fields. + if (deobField.isStatic()) + { + ClassFile deobApiTarget = InjectUtil.deobFromApiMethod(inject, apiMethod); + + if (deobApiTarget != deobClass && + deobApiTarget.findField(deobField.getName()) != null) + { + it.remove(); + continue; + } + } + final Signature sig = apiMethod.getSignature(); if (sig.isVoid()) @@ -161,6 +175,21 @@ public class RSApiInjector extends AbstractInjector while (it.hasNext()) { final RSApiMethod apiMethod = it.next(); + + // Check if there's a method with the same exported name on the api target class itself, + // as that should come before random static methods. + if (deobMethod.isStatic()) + { + ClassFile deobApiTarget = InjectUtil.deobFromApiMethod(inject, apiMethod); + + if (deobApiTarget != deobClass && + deobApiTarget.findMethod(deobMethod.getName()) != null) + { + it.remove(); + continue; + } + } + final Signature apiSig = apiMethod.getSignature(); if (apiMethod.isInjected() @@ -174,7 +203,7 @@ public class RSApiInjector extends AbstractInjector { final RSApiMethod apiMethod = matching.get(0); - final ClassFile targetClass = InjectUtil.fromApiMethod(inject, apiMethod); + final ClassFile targetClass = InjectUtil.vanillaFromApiMethod(inject, apiMethod); final Method vanillaMethod = inject.toVanilla(deobMethod); final String garbage = DeobAnnotations.getDecoder(deobMethod); log.debug("Injecting invoker {} for {} into {}", apiMethod.getMethod(), vanillaMethod.getPoolMethod(), targetClass.getPoolClass()); @@ -233,7 +262,7 @@ public class RSApiInjector extends AbstractInjector { for (RSApiMethod apiMethod : matched) { - final ClassFile targetClass = InjectUtil.fromApiMethod(inject, apiMethod); + final ClassFile targetClass = InjectUtil.vanillaFromApiMethod(inject, apiMethod); apiMethod.setInjected(true); if (apiMethod.getSignature().isVoid())