diff --git a/README.md b/README.md index fa05161..e889e4e 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,19 @@ # PalaLauncher4Linux -A live patcher for Paladium Games launcher to allow launching games on Linux \ No newline at end of file +A live patcher for Paladium Games launcher to allow launching games on Linux + +## Compiling + +Compiling should be easy and done automatically on any IDE that uses `pom.xml` files. +In my case, I use Pulsar (Atom's continuation) with its `ide-java` package and it works well. + +Just don't forget to compile for Java 8 for better compatibility with the launcher. + +## Packaging + +This is pretty straightforward, just make a `.jar` file with the contents of the `target/classes` folder and add the contents of a [Javassist .jar](https://github.com/jboss-javassist/javassist/releases) into the .jar previously made. + +## Using + +Simple, just add `-javaagent:path/to/the/built.jar` before `.jar` when you start the launcher located in the `~/paladium-games` folder. +Also be sure to use Java 8 for better compatibility. diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..bdf539c --- /dev/null +++ b/pom.xml @@ -0,0 +1,35 @@ + + + 4.0.0 + + net.x3f200c.pala4linux.launcherpatch + PalaLauncher4Linux + 0.0.1 + jar + + + 1.7 + 1.7 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + true + + + + + + + org.javassist + javassist + 3.29.2-GA + + + diff --git a/src/main/java/net/x3f200c/pala4linux/launcherpatch/LauncherPatch.java b/src/main/java/net/x3f200c/pala4linux/launcherpatch/LauncherPatch.java new file mode 100644 index 0000000..08ee9f4 --- /dev/null +++ b/src/main/java/net/x3f200c/pala4linux/launcherpatch/LauncherPatch.java @@ -0,0 +1,37 @@ +package net.x3f200c.pala4linux.launcherpatch; + +import java.lang.instrument.Instrumentation; +import java.lang.instrument.UnmodifiableClassException; +import java.lang.Class; +import java.lang.String; +import net.x3f200c.pala4linux.launcherpatch.LauncherPatcher; + +public class LauncherPatch { + public static void premain(String agentArgs, Instrumentation inst) { + patch(inst); + } + public static void agentmain(String agentArgs, Instrumentation inst) { + patch(inst); + } + public static void patch(Instrumentation inst) { + Class routeHandlerClass = null; + ClassLoader routeHandlerClassLoader = null; + + try { + routeHandlerClass = Class.forName("fr.paladium.router.route.common.CommonRoute"); + routeHandlerClassLoader = routeHandlerClass.getClassLoader(); + } catch(ClassNotFoundException e) { + + } + + LauncherPatcher dt = new LauncherPatcher(routeHandlerClass.getName(), routeHandlerClassLoader); + + inst.addTransformer(dt, true); + + try { + inst.retransformClasses(routeHandlerClass); + } catch(UnmodifiableClassException e) { + + } + } +} diff --git a/src/main/java/net/x3f200c/pala4linux/launcherpatch/LauncherPatcher.java b/src/main/java/net/x3f200c/pala4linux/launcherpatch/LauncherPatcher.java new file mode 100644 index 0000000..1c025c7 --- /dev/null +++ b/src/main/java/net/x3f200c/pala4linux/launcherpatch/LauncherPatcher.java @@ -0,0 +1,45 @@ +package net.x3f200c.pala4linux.launcherpatch; + +import java.lang.instrument.ClassFileTransformer; +import java.io.IOException; +import java.security.ProtectionDomain; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtMethod; +import javassist.NotFoundException; +import javassist.CannotCompileException; + +class LauncherPatcher implements ClassFileTransformer { + private final String targetClassName; + + public LauncherPatcher(String className, ClassLoader classLoader) { + this.targetClassName = className; + } + + @Override + public byte[] transform(ClassLoader loader, String className, Class redefinedClass, ProtectionDomain protectionDomain, byte[] classBuffer) { + byte[] bytecode = classBuffer; + + String finalTargetClassName = this.targetClassName.replaceAll("\\.", "/"); + if (!className.equals(finalTargetClassName)) { + return bytecode; + } + + if (className.equals(finalTargetClassName)) { + try { + ClassPool cp = ClassPool.getDefault(); + CtClass crClass = cp.get("fr.paladium.router.route.common.CommonRoute"); + CtMethod osGetterMethod = crClass.getDeclaredMethod("handleGetOS"); + + osGetterMethod.setBody("{ return fr.paladium.router.handler.CefRouteHandler.create().success(\"os\", \"windows\"); }"); + + bytecode = crClass.toBytecode(); + crClass.detach(); + } catch(NotFoundException | CannotCompileException | IOException e) { + + } + } + + return bytecode; + } +} diff --git a/src/main/resources/META-INF/MANIFEST.MF b/src/main/resources/META-INF/MANIFEST.MF new file mode 100644 index 0000000..86738a6 --- /dev/null +++ b/src/main/resources/META-INF/MANIFEST.MF @@ -0,0 +1,4 @@ +Agent-Class: net.x3f200c.pala4linux.launcherpatch.LauncherPatch +Can-Redefine-Classes: true +Can-Retransform-Classes: true +Premain-Class: net.x3f200c.pala4linux.launcherpatch.LauncherPatch