diff --git a/Locator/build.gradle b/1Locator/build.gradle similarity index 100% rename from Locator/build.gradle rename to 1Locator/build.gradle diff --git a/Locator/src/main/java/me/xfl03/morecrashinfo/fml/JarRemapper.java b/1Locator/src/main/java/me/xfl03/morecrashinfo/fml/JarRemapper.java similarity index 100% rename from Locator/src/main/java/me/xfl03/morecrashinfo/fml/JarRemapper.java rename to 1Locator/src/main/java/me/xfl03/morecrashinfo/fml/JarRemapper.java diff --git a/Locator/src/main/java/me/xfl03/morecrashinfo/fml/ModLocator.java b/1Locator/src/main/java/me/xfl03/morecrashinfo/fml/ModLocator.java similarity index 100% rename from Locator/src/main/java/me/xfl03/morecrashinfo/fml/ModLocator.java rename to 1Locator/src/main/java/me/xfl03/morecrashinfo/fml/ModLocator.java diff --git a/Locator/src/main/java/me/xfl03/morecrashinfo/fml/VersionUtil.java b/1Locator/src/main/java/me/xfl03/morecrashinfo/fml/VersionUtil.java similarity index 100% rename from Locator/src/main/java/me/xfl03/morecrashinfo/fml/VersionUtil.java rename to 1Locator/src/main/java/me/xfl03/morecrashinfo/fml/VersionUtil.java diff --git a/Locator/src/main/resources/META-INF/services/net.minecraftforge.fml.loading.moddiscovery.IModLocator b/1Locator/src/main/resources/META-INF/services/net.minecraftforge.fml.loading.moddiscovery.IModLocator similarity index 100% rename from Locator/src/main/resources/META-INF/services/net.minecraftforge.fml.loading.moddiscovery.IModLocator rename to 1Locator/src/main/resources/META-INF/services/net.minecraftforge.fml.loading.moddiscovery.IModLocator diff --git a/Locator/src/main/resources/META-INF/services/net.minecraftforge.forgespi.locating.IModLocator b/1Locator/src/main/resources/META-INF/services/net.minecraftforge.forgespi.locating.IModLocator similarity index 100% rename from Locator/src/main/resources/META-INF/services/net.minecraftforge.forgespi.locating.IModLocator rename to 1Locator/src/main/resources/META-INF/services/net.minecraftforge.forgespi.locating.IModLocator diff --git a/LocatorLoader/build.gradle b/2Loader/build.gradle similarity index 92% rename from LocatorLoader/build.gradle rename to 2Loader/build.gradle index 3f5fe49..10ca4a1 100644 --- a/LocatorLoader/build.gradle +++ b/2Loader/build.gradle @@ -40,14 +40,14 @@ dependencies { implementation("org.ow2.asm:asm:9.3") implementation("org.ow2.asm:asm-tree:9.3") implementation("org.ow2.asm:asm-commons:9.3") - implementation "cpw.mods:modlauncher:8.1.3" + implementation "cpw.mods:modlauncher:10.0.8" implementation "cpw.mods:securejarhandler:2.1.6" implementation 'org.jetbrains:annotations:23.1.0' implementation "org.apache.logging.log4j:log4j-api:2.19.0" } jar { - from('../Locator/build/libs/') { + from('../1Locator/build/libs/') { include '*.jar' } from('../build/libs/') { diff --git a/LocatorLoader/src/main/java/me/xfl03/morecrashinfo/modlauncher/ClasspathHelper.java b/2Loader/src/main/java/me/xfl03/morecrashinfo/modlauncher/ClasspathHelper.java similarity index 100% rename from LocatorLoader/src/main/java/me/xfl03/morecrashinfo/modlauncher/ClasspathHelper.java rename to 2Loader/src/main/java/me/xfl03/morecrashinfo/modlauncher/ClasspathHelper.java diff --git a/LocatorLoader/src/main/java/me/xfl03/morecrashinfo/modlauncher/CrashReportExtenderTransformer.java b/2Loader/src/main/java/me/xfl03/morecrashinfo/modlauncher/CrashReportExtenderTransformer.java similarity index 100% rename from LocatorLoader/src/main/java/me/xfl03/morecrashinfo/modlauncher/CrashReportExtenderTransformer.java rename to 2Loader/src/main/java/me/xfl03/morecrashinfo/modlauncher/CrashReportExtenderTransformer.java diff --git a/LocatorLoader/src/main/java/me/xfl03/morecrashinfo/modlauncher/JarRemapper.java b/2Loader/src/main/java/me/xfl03/morecrashinfo/modlauncher/JarRemapper.java similarity index 100% rename from LocatorLoader/src/main/java/me/xfl03/morecrashinfo/modlauncher/JarRemapper.java rename to 2Loader/src/main/java/me/xfl03/morecrashinfo/modlauncher/JarRemapper.java diff --git a/LocatorLoader/src/main/java/me/xfl03/morecrashinfo/modlauncher/ModLocator.java b/2Loader/src/main/java/me/xfl03/morecrashinfo/modlauncher/ModLocator.java similarity index 100% rename from LocatorLoader/src/main/java/me/xfl03/morecrashinfo/modlauncher/ModLocator.java rename to 2Loader/src/main/java/me/xfl03/morecrashinfo/modlauncher/ModLocator.java diff --git a/LocatorLoader/src/main/java/me/xfl03/morecrashinfo/modlauncher/TransformerService.java b/2Loader/src/main/java/me/xfl03/morecrashinfo/modlauncher/TransformerService.java similarity index 97% rename from LocatorLoader/src/main/java/me/xfl03/morecrashinfo/modlauncher/TransformerService.java rename to 2Loader/src/main/java/me/xfl03/morecrashinfo/modlauncher/TransformerService.java index 0916905..2dc9343 100644 --- a/LocatorLoader/src/main/java/me/xfl03/morecrashinfo/modlauncher/TransformerService.java +++ b/2Loader/src/main/java/me/xfl03/morecrashinfo/modlauncher/TransformerService.java @@ -88,7 +88,9 @@ public void initialize(IEnvironment environment) { return Collections.singletonList(new CrashReportExtenderTransformer()); } - public void beginScanning(IEnvironment environment) { + //ModLauncher 8 + //it will be renamed to beginScanning in Gradle Build + public void beginScanningLegacy(IEnvironment environment) { } private Path modPath; diff --git a/LocatorLoader/src/main/java/me/xfl03/morecrashinfo/modlauncher/VersionUtil.java b/2Loader/src/main/java/me/xfl03/morecrashinfo/modlauncher/VersionUtil.java similarity index 100% rename from LocatorLoader/src/main/java/me/xfl03/morecrashinfo/modlauncher/VersionUtil.java rename to 2Loader/src/main/java/me/xfl03/morecrashinfo/modlauncher/VersionUtil.java diff --git a/LocatorLoader/src/main/resources/META-INF/services/cpw.mods.modlauncher.api.ITransformationService b/2Loader/src/main/resources/META-INF/services/cpw.mods.modlauncher.api.ITransformationService similarity index 100% rename from LocatorLoader/src/main/resources/META-INF/services/cpw.mods.modlauncher.api.ITransformationService rename to 2Loader/src/main/resources/META-INF/services/cpw.mods.modlauncher.api.ITransformationService diff --git a/LocatorLoader/src/main/resources/META-INF/services/unused.net.minecraftforge.forgespi.locating.IModLocator b/2Loader/src/main/resources/META-INF/services/unused.net.minecraftforge.forgespi.locating.IModLocator similarity index 100% rename from LocatorLoader/src/main/resources/META-INF/services/unused.net.minecraftforge.forgespi.locating.IModLocator rename to 2Loader/src/main/resources/META-INF/services/unused.net.minecraftforge.forgespi.locating.IModLocator diff --git a/README.md b/README.md index 6e1fa3a..77cd59b 100644 --- a/README.md +++ b/README.md @@ -73,8 +73,13 @@ This mod implemented a powerful ASM-based remapping and custom jar detection fea Please use Java 17+ in development or building environment. +### Loading +**Build(Gradle `Task`) -> Loader(ModLauncher `ITransformerService`) -> Locator(ForgeSPI `IModLocator`) -> Base(Forge `Mod`)** + +In every `->`(3 times), our mod use ASM to operate bytecode in class file. + ### Build ```shell -./gradlew build +./gradlew clean build remap ``` -Mod file is located at `LocatorLoader/build/libs`. \ No newline at end of file +Mod file is located at `build/libs/MoreCrashInfo-x.x.x.jar`. \ No newline at end of file diff --git a/build.gradle b/build.gradle index 07dbc10..c1535d7 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,7 @@ plugins { id 'eclipse' id 'maven-publish' id 'net.minecraftforge.gradle' version '5.1.+' + id 'morecrashinfo' } version = "2.3.0" diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle new file mode 100644 index 0000000..43e5b78 --- /dev/null +++ b/buildSrc/build.gradle @@ -0,0 +1,18 @@ +plugins { + id 'java' +} + +repositories { + mavenCentral() +} + +configurations.configureEach { + transitive = false +} + +dependencies { + gradleApi() + implementation("org.ow2.asm:asm:9.3") + implementation("org.ow2.asm:asm-tree:9.3") + implementation("org.ow2.asm:asm-commons:9.3") +} \ No newline at end of file diff --git a/buildSrc/src/main/java/me/xfl03/morecrashinfo/gradle/GradlePlugin.java b/buildSrc/src/main/java/me/xfl03/morecrashinfo/gradle/GradlePlugin.java new file mode 100644 index 0000000..9a9fa8d --- /dev/null +++ b/buildSrc/src/main/java/me/xfl03/morecrashinfo/gradle/GradlePlugin.java @@ -0,0 +1,17 @@ +package me.xfl03.morecrashinfo.gradle; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; + +public class GradlePlugin implements Plugin { + @Override + public void apply(Project project) { + //Is not root project + if (!project.getRootProject().equals(project)) { + return; + } + + //Only apply to root project + project.getTasks().create("remap", RemapTask.class, task -> task.rootProject = project.getRootProject()); + } +} diff --git a/buildSrc/src/main/java/me/xfl03/morecrashinfo/gradle/JarRemapper.java b/buildSrc/src/main/java/me/xfl03/morecrashinfo/gradle/JarRemapper.java new file mode 100644 index 0000000..94935a7 --- /dev/null +++ b/buildSrc/src/main/java/me/xfl03/morecrashinfo/gradle/JarRemapper.java @@ -0,0 +1,69 @@ +package me.xfl03.morecrashinfo.gradle; + +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.commons.ClassRemapper; +import org.objectweb.asm.commons.Remapper; +import org.objectweb.asm.commons.SimpleRemapper; +import org.objectweb.asm.tree.ClassNode; + +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; +import java.util.zip.ZipOutputStream; + +public class JarRemapper { + private final Remapper remapper; + + public JarRemapper() { + Map mapping = new HashMap<>(); + mapping.put("me/xfl03/morecrashinfo/modlauncher/TransformerService.beginScanningLegacy(Lcpw/mods/modlauncher/api/IEnvironment;)V", "beginScanning"); + remapper = new SimpleRemapper(mapping); + } + + public byte[] process(InputStream is) throws Exception { + ClassReader cr = new ClassReader(is); + ClassNode cn = new ClassNode(); + ClassRemapper cv = new ClassRemapper(cn, remapper); + cr.accept(cv, 0); + ClassWriter cw = new ClassWriter(0); + cn.accept(cw); + System.out.printf("Remapped %s\n", cn.name); + return cw.toByteArray(); + } + + public void processJar(Path inFile, Path outFile) { + try (ZipFile zf = new ZipFile(inFile.toFile())) { + ZipOutputStream zos = new ZipOutputStream(Files.newOutputStream(outFile)); + for (Enumeration e = zf.entries(); e.hasMoreElements(); ) { + ZipEntry ze = e.nextElement(); + String name = ze.getName(); + zos.putNextEntry(new ZipEntry(name)); + InputStream is = zf.getInputStream(ze); + if (name.endsWith(".class")) { + //Remap class file + zos.write(process(is)); + } else { + //Copy other file + byte[] cache = new byte[1024]; + int len; + while ((len = is.read(cache)) > 0) { + zos.write(cache, 0, len); + } + } + zos.closeEntry(); + } + zos.close(); + System.out.printf("Remapped %s to %s\n", inFile, outFile); + } catch (Exception e) { + System.err.printf("Error remapping jar %s to %s\n", inFile, outFile); + e.printStackTrace(); + } + } + +} diff --git a/buildSrc/src/main/java/me/xfl03/morecrashinfo/gradle/RemapTask.java b/buildSrc/src/main/java/me/xfl03/morecrashinfo/gradle/RemapTask.java new file mode 100644 index 0000000..5b7460a --- /dev/null +++ b/buildSrc/src/main/java/me/xfl03/morecrashinfo/gradle/RemapTask.java @@ -0,0 +1,29 @@ +package me.xfl03.morecrashinfo.gradle; + +import org.gradle.api.DefaultTask; +import org.gradle.api.Project; +import org.gradle.api.tasks.TaskAction; + +import java.io.File; +import java.util.Arrays; + +public class RemapTask extends DefaultTask { + public Project rootProject; + public JarRemapper remapper = new JarRemapper(); + + @TaskAction + public void run() { + File loaderLibs = rootProject.file("2Loader/build/libs"); + File[] files = loaderLibs.listFiles(); + if (files == null) { + System.err.println("Cannot find build libs."); + return; + } + Arrays.stream(files).forEach(this::remap); + } + + private void remap(File inFile) { + File rootLibs = rootProject.file("build/libs"); + remapper.processJar(inFile.toPath(), rootLibs.toPath().resolve(inFile.getName())); + } +} diff --git a/buildSrc/src/main/resources/META-INF/gradle-plugins/morecrashinfo.properties b/buildSrc/src/main/resources/META-INF/gradle-plugins/morecrashinfo.properties new file mode 100644 index 0000000..affcfa2 --- /dev/null +++ b/buildSrc/src/main/resources/META-INF/gradle-plugins/morecrashinfo.properties @@ -0,0 +1 @@ +implementation-class=me.xfl03.morecrashinfo.gradle.GradlePlugin \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 0b92596..9700b0c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -5,5 +5,5 @@ pluginManagement { } } //include "CrashMaker" -include "Locator" -include "LocatorLoader" \ No newline at end of file +include "1Locator" +include "2Loader" \ No newline at end of file