From 5b5ee5b5a69e15aa085a34bd88aa7df09fe706a4 Mon Sep 17 00:00:00 2001 From: ThatGamerBlue Date: Sat, 3 Aug 2019 23:11:59 +0100 Subject: [PATCH] gradle: partially revert #1166 (#1250) --- build.gradle | 2 +- injected-client/build.gradle | 22 ++++++++++-- .../src/main/java/Placeholder.java | 34 +++++++++++++++++++ .../java/net/runelite/injector/Injector.java | 11 +++++- runelite-client/build.gradle | 4 +-- .../net/runelite/client/rs/ClientLoader.java | 29 +++++++++++++++- 6 files changed, 93 insertions(+), 9 deletions(-) create mode 100644 injected-client/src/main/java/Placeholder.java diff --git a/build.gradle b/build.gradle index db223a370f..3ccf2b7c9d 100644 --- a/build.gradle +++ b/build.gradle @@ -40,7 +40,7 @@ allprojects { gitDirty = localGitDirty rootPath = rootDir.toString().replace('\\', '/') - injectedClassesPath = rootPath + "/injected-client/build/libs/injected-client-" + version + ".jar" + injectedClassesPath = rootPath + "/injector-plugin/out/injected-client/" } } diff --git a/injected-client/build.gradle b/injected-client/build.gradle index a1ef30df3d..05acc139a6 100644 --- a/injected-client/build.gradle +++ b/injected-client/build.gradle @@ -24,8 +24,24 @@ */ description = 'Injected Client' -task injector(){ - // I kinda want to make the entire injector work here but seems like more work - dependsOn ':injector-plugin:compileJava' +compileJava { + dependsOn ':injector-plugin:assemble' +} + +compileJava.outputs.upToDateWhen { false } + +compileJava.doLast() { + copy { + File f = file("build/classes/java/main") + f.deleteDir() + f.mkdirs() + from ("${injectedClassesPath}") + into ("build/classes/java/main") + } +} + +classes.doLast() { + File f = file("build/classes/java/main/Placeholder.class") + f.delete() } diff --git a/injected-client/src/main/java/Placeholder.java b/injected-client/src/main/java/Placeholder.java new file mode 100644 index 0000000000..8486c0fc90 --- /dev/null +++ b/injected-client/src/main/java/Placeholder.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2019 ThatGamerBlue + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @author ThatGamerBlue + * + * This file exists to force gradle to execute the compileJava task + * so we can hijack it and run the injector-plugin + */ +public class Placeholder +{ +} \ No newline at end of file diff --git a/injector-plugin/src/main/java/net/runelite/injector/Injector.java b/injector-plugin/src/main/java/net/runelite/injector/Injector.java index 9409b02075..4543ed5b46 100644 --- a/injector-plugin/src/main/java/net/runelite/injector/Injector.java +++ b/injector-plugin/src/main/java/net/runelite/injector/Injector.java @@ -26,6 +26,9 @@ package net.runelite.injector; import java.io.File; import java.io.IOException; + +import com.google.common.io.Files; +import net.runelite.asm.ClassFile; import net.runelite.asm.ClassGroup; import net.runelite.deob.util.JarUtil; @@ -69,7 +72,13 @@ public class Injector private void save(File out) throws IOException { - JarUtil.saveJar(vanilla, out); + out.mkdirs(); + for (ClassFile cf : vanilla.getClasses()) + { + File f = new File(out, cf.getClassName() + ".class"); + byte[] data = JarUtil.writeClass(vanilla, cf); + Files.write(data, f); + } } diff --git a/runelite-client/build.gradle b/runelite-client/build.gradle index cbb3710f75..fc03e951ec 100644 --- a/runelite-client/build.gradle +++ b/runelite-client/build.gradle @@ -48,7 +48,7 @@ dependencies { runtime group: 'org.jogamp.gluegen', name: 'gluegen-rt', version: '2.3.2', classifier: 'natives-linux-amd64' runtime group: 'org.jogamp.gluegen', name: 'gluegen-rt', version: '2.3.2', classifier: 'natives-linux-i586' runtime project(':runescape-api') - runtimeOnly files("${injectedClassesPath}") + runtime project(':injected-client') testImplementation group: 'junit', name: 'junit', version: '4.12' testImplementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.26' testImplementation group: 'org.hamcrest', name: 'hamcrest-library', version: '2.1' @@ -92,8 +92,6 @@ jar { } shadowJar { - dependsOn ':injected-client:injector' - archiveClassifier.set("shaded") exclude("net/runelite/injector/**") diff --git a/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java b/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java index ac1499ab3c..851c4ec4c4 100644 --- a/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java +++ b/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java @@ -26,6 +26,7 @@ */ package net.runelite.client.rs; +import java.io.InputStream; import java.net.URLClassLoader; import java.applet.Applet; import java.io.IOException; @@ -33,6 +34,8 @@ import java.net.URL; import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; + +import com.google.common.io.ByteStreams; import lombok.extern.slf4j.Slf4j; import net.runelite.client.RuneLite; @@ -91,7 +94,31 @@ public class ClientLoader private static Applet loadRLPlus(final RSConfig config) throws ClassNotFoundException, InstantiationException, IllegalAccessException { - final Class clientClass = ClientLoader.class.getClassLoader().loadClass(config.getInitialClass()); + ClassLoader rsClassLoader = new ClassLoader(ClientLoader.class.getClassLoader()) + { + @Override + protected Class findClass(String name) throws ClassNotFoundException + { + String path = name.replace('.', '/').concat(".class"); + InputStream inputStream = ClientLoader.class.getResourceAsStream(path); + if (inputStream == null) + { + throw new ClassNotFoundException(name + " " + path); + } + byte[] data; + try + { + data = ByteStreams.toByteArray(inputStream); + } + catch (IOException e) + { + e.printStackTrace(); + throw new RuntimeException("Failed to load class: " + name + " " + path); + } + return defineClass(name, data, 0, data.length); + } + }; + Class clientClass = rsClassLoader.loadClass("client"); return loadFromClass(config, clientClass); }