From 7341575237b5ac40abc2c2755b7440b11bcc3424 Mon Sep 17 00:00:00 2001 From: TheCodedOne Date: Fri, 11 May 2018 21:57:42 +0100 Subject: [PATCH 01/54] Rename to OpenGradle --- README.md | 8 ++++---- build.gradle | 4 ++-- gradle.properties | 6 +++--- src/main/java/net/fabricmc/loom/AbstractPlugin.java | 5 +---- src/main/java/net/fabricmc/loom/LoomGradlePlugin.java | 2 +- 5 files changed, 11 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 518ef91..1a28f51 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# fabric-loom -Gradle plugin for Fabric +# OpenGradle +Gradle plugin for OpenModLoader -Usage: `gradlew setupFabric idea` -(Prefix with `./` on macOS and Linux) +Usage: `gradlew setup idea` +(Use `./gradle` on macOS and Linux) diff --git a/build.gradle b/build.gradle index 2c7e385..f3b8ab5 100644 --- a/build.gradle +++ b/build.gradle @@ -13,8 +13,8 @@ targetCompatibility = 1.8 apply from: 'https://github.com/FabricMC/fabric-docs/raw/master/gradle/maven.gradle' apply from: 'https://github.com/FabricMC/fabric-docs/raw/master/gradle/license.gradle' -group = 'net.fabricmc' -archivesBaseName = project.name.toLowerCase() +group = 'com.openmodloader' +archivesBaseName = project.name version = '0.0.7-SNAPSHOT' repositories { diff --git a/gradle.properties b/gradle.properties index 7cf5344..036af22 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ -name = fabric-loom -description = The Gradle plugin for Fabric -url = https://github.com/FabricMC/fabric-loom +name = OpenGradle +description = The Gradle plugin for OpenModLoader +url = https://github.com/OpenModLoader/OpenGradle diff --git a/src/main/java/net/fabricmc/loom/AbstractPlugin.java b/src/main/java/net/fabricmc/loom/AbstractPlugin.java index 1ded748..5699e46 100644 --- a/src/main/java/net/fabricmc/loom/AbstractPlugin.java +++ b/src/main/java/net/fabricmc/loom/AbstractPlugin.java @@ -39,7 +39,6 @@ import org.gradle.api.artifacts.repositories.MavenArtifactRepository; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.JavaPluginConvention; import org.gradle.api.tasks.SourceSet; -import org.gradle.api.tasks.compile.JavaCompile; import org.gradle.api.tasks.javadoc.Javadoc; import org.gradle.plugins.ide.eclipse.model.EclipseModel; import org.gradle.plugins.ide.idea.model.IdeaModel; @@ -48,8 +47,6 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; -import java.util.Map; -import java.util.Set; public class AbstractPlugin implements Plugin { protected Project project; @@ -229,7 +226,7 @@ public class AbstractPlugin implements Plugin { }); project.afterEvaluate(project12 -> { - project12.getTasks().getByName("idea").dependsOn(project12.getTasks().getByName("cleanIdea")).dependsOn(project12.getTasks().getByName("setupFabric")).dependsOn(project12.getTasks().getByName("extractNatives")); + project12.getTasks().getByName("idea").dependsOn(project12.getTasks().getByName("cleanIdea")).dependsOn(project12.getTasks().getByName("setup")).dependsOn(project12.getTasks().getByName("extractNatives")); project12.getTasks().getByName("idea").finalizedBy(project12.getTasks().getByName("genIdeaWorkspace")); }); diff --git a/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java b/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java index 93cc8a4..c5c521f 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java +++ b/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java @@ -37,7 +37,7 @@ public class LoomGradlePlugin extends AbstractPlugin { makeTask("mergeJars", MergeJarsTask.class).dependsOn("download"); makeTask("mapJars", MapJarsTask.class).dependsOn("mergeJars"); makeTask("processMods", ProcessModsTask.class).dependsOn("mapJars"); - makeTask("setupFabric", DefaultTask.class).dependsOn("processMods"); + makeTask("setup", DefaultTask.class).dependsOn("processMods"); makeTask("extractNatives", ExtractNativesTask.class).dependsOn("download"); makeTask("genIdeaWorkspace", GenIdeaProjectTask.class).dependsOn("idea"); From 56e50461cbd9b6ae0b3b900b41908a780bad8101 Mon Sep 17 00:00:00 2001 From: TheCodedOne Date: Fri, 11 May 2018 22:10:17 +0100 Subject: [PATCH 02/54] Fix compile error with procyon --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index f3b8ab5..08cae16 100644 --- a/build.gradle +++ b/build.gradle @@ -24,8 +24,8 @@ repositories { url = 'http://maven.fabricmc.net/' } maven { - name "RX14 Repository" - url 'http://mvn.rx14.co.uk/local/' + name "Modmuss" + url 'http://maven.modmuss50.me/' } maven { name = 'Mojang' From abf17b01d7bb4fddfa107a01e117cd7097b8331c Mon Sep 17 00:00:00 2001 From: TheCodedOne Date: Fri, 11 May 2018 22:57:32 +0100 Subject: [PATCH 03/54] Fix environment setup --- .../openmodloader/gradle/OpenGradlePlugin.java} | 5 +++-- src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java | 4 ++-- src/main/java/net/fabricmc/loom/task/RunClientTask.java | 2 +- src/main/java/net/fabricmc/loom/task/RunServerTask.java | 2 +- .../gradle-plugins/com.openmodloader.gradle.properties | 1 + .../META-INF/gradle-plugins/net.fabricmc.loom.properties | 1 - 6 files changed, 8 insertions(+), 7 deletions(-) rename src/main/java/{net/fabricmc/loom/LoomGradlePlugin.java => com/openmodloader/gradle/OpenGradlePlugin.java} (94%) create mode 100644 src/main/resources/META-INF/gradle-plugins/com.openmodloader.gradle.properties delete mode 100644 src/main/resources/META-INF/gradle-plugins/net.fabricmc.loom.properties diff --git a/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java b/src/main/java/com/openmodloader/gradle/OpenGradlePlugin.java similarity index 94% rename from src/main/java/net/fabricmc/loom/LoomGradlePlugin.java rename to src/main/java/com/openmodloader/gradle/OpenGradlePlugin.java index c5c521f..69e73b8 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java +++ b/src/main/java/com/openmodloader/gradle/OpenGradlePlugin.java @@ -22,13 +22,14 @@ * SOFTWARE. */ -package net.fabricmc.loom; +package com.openmodloader.gradle; +import net.fabricmc.loom.AbstractPlugin; import net.fabricmc.loom.task.*; import org.gradle.api.DefaultTask; import org.gradle.api.Project; -public class LoomGradlePlugin extends AbstractPlugin { +public class OpenGradlePlugin extends AbstractPlugin { @Override public void apply(Project target) { super.apply(target); diff --git a/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java b/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java index 4fa5955..08b8dbd 100644 --- a/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java @@ -140,7 +140,7 @@ public class GenIdeaProjectTask extends DefaultTask { ideaClient.configName = "Minecraft Client"; ideaClient.runDir = "file://$PROJECT_DIR$/" + extension.runDir; ideaClient.vmArgs = "-Djava.library.path=" + Constants.MINECRAFT_NATIVES.get(extension).getAbsolutePath() + " -Dfabric.development=true"; - ideaClient.programArgs = "--tweakClass net.fabricmc.base.launch.FabricClientTweaker --assetIndex " + version.assetIndex.id + " --assetsDir " + new File(extension.getFabricUserCache(), "assets-" + extension.version).getAbsolutePath(); + ideaClient.programArgs = "--tweakClass com.openmodloader.loader.launch.OpenClientTweaker --assetIndex " + version.assetIndex.id + " --assetsDir " + new File(extension.getFabricUserCache(), "assets-" + extension.version).getAbsolutePath(); runManager.appendChild(ideaClient.genRuns(runManager)); @@ -150,7 +150,7 @@ public class GenIdeaProjectTask extends DefaultTask { ideaServer.configName = "Minecraft Server"; ideaServer.runDir = "file://$PROJECT_DIR$/" + extension.runDir; ideaServer.vmArgs = "-Dfabric.development=true"; - ideaServer.programArgs = "--tweakClass net.fabricmc.base.launch.FabricServerTweaker"; + ideaServer.programArgs = "--tweakClass com.openmodloader.loader.launch.OpenServerTweaker"; runManager.appendChild(ideaServer.genRuns(runManager)); diff --git a/src/main/java/net/fabricmc/loom/task/RunClientTask.java b/src/main/java/net/fabricmc/loom/task/RunClientTask.java index 4f71979..5993be8 100644 --- a/src/main/java/net/fabricmc/loom/task/RunClientTask.java +++ b/src/main/java/net/fabricmc/loom/task/RunClientTask.java @@ -68,7 +68,7 @@ public class RunClientTask extends JavaExec { libs.add(Constants.MINECRAFT_FINAL_JAR.get(extension).getAbsolutePath()); classpath(libs); - args("--tweakClass", "net.fabricmc.base.launch.FabricClientTweaker", "--assetIndex", version.assetIndex.id, "--assetsDir", new File(extension.getFabricUserCache(), "assets-" + extension.version).getAbsolutePath()); + args("--tweakClass", "com.openmodloader.loader.launch.OpenClientTweaker", "--assetIndex", version.assetIndex.id, "--assetsDir", new File(extension.getFabricUserCache(), "assets-" + extension.version).getAbsolutePath()); setWorkingDir(new File(getProject().getRootDir(), "run")); diff --git a/src/main/java/net/fabricmc/loom/task/RunServerTask.java b/src/main/java/net/fabricmc/loom/task/RunServerTask.java index 43bbf5f..115a5f4 100644 --- a/src/main/java/net/fabricmc/loom/task/RunServerTask.java +++ b/src/main/java/net/fabricmc/loom/task/RunServerTask.java @@ -65,7 +65,7 @@ public class RunServerTask extends JavaExec { libs.add(Constants.MINECRAFT_FINAL_JAR.get(extension).getAbsolutePath()); classpath(libs); - args("--tweakClass", "net.fabricmc.base.launch.FabricServerTweaker"); + args("--tweakClass", "com.openmodloader.loader.launch.OpenServerTweaker"); setWorkingDir(new File(getProject().getRootDir(), "run")); diff --git a/src/main/resources/META-INF/gradle-plugins/com.openmodloader.gradle.properties b/src/main/resources/META-INF/gradle-plugins/com.openmodloader.gradle.properties new file mode 100644 index 0000000..ae280f1 --- /dev/null +++ b/src/main/resources/META-INF/gradle-plugins/com.openmodloader.gradle.properties @@ -0,0 +1 @@ +implementation-class=com.openmodloader.gradle.OpenGradlePlugin \ No newline at end of file diff --git a/src/main/resources/META-INF/gradle-plugins/net.fabricmc.loom.properties b/src/main/resources/META-INF/gradle-plugins/net.fabricmc.loom.properties deleted file mode 100644 index dffb4b5..0000000 --- a/src/main/resources/META-INF/gradle-plugins/net.fabricmc.loom.properties +++ /dev/null @@ -1 +0,0 @@ -implementation-class=net.fabricmc.loom.LoomGradlePlugin \ No newline at end of file From bd7dfab919536ffa90e24adbc6c9b9581e200c13 Mon Sep 17 00:00:00 2001 From: TheCodedOne Date: Sun, 13 May 2018 02:43:40 +0100 Subject: [PATCH 04/54] Move user cache --- .../java/net/fabricmc/loom/AbstractPlugin.java | 2 +- .../net/fabricmc/loom/LoomGradleExtension.java | 4 ++-- .../net/fabricmc/loom/task/DownloadTask.java | 2 +- .../fabricmc/loom/task/GenIdeaProjectTask.java | 2 +- .../net/fabricmc/loom/task/RunClientTask.java | 2 +- .../java/net/fabricmc/loom/util/Constants.java | 18 +++++++++--------- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/AbstractPlugin.java b/src/main/java/net/fabricmc/loom/AbstractPlugin.java index 5699e46..c792af0 100644 --- a/src/main/java/net/fabricmc/loom/AbstractPlugin.java +++ b/src/main/java/net/fabricmc/loom/AbstractPlugin.java @@ -161,7 +161,7 @@ public class AbstractPlugin implements Plugin { LoomGradleExtension extension = project1.getExtensions().getByType(LoomGradleExtension.class); project1.getRepositories().flatDir(flatDirectoryArtifactRepository -> { - flatDirectoryArtifactRepository.dir(extension.getFabricUserCache()); + flatDirectoryArtifactRepository.dir(extension.getUserCache()); flatDirectoryArtifactRepository.setName("UserCacheFiles"); }); diff --git a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java index 957cc35..3b02508 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java +++ b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java @@ -49,8 +49,8 @@ public class LoomGradleExtension { return fabricVersion != null && !fabricVersion.isEmpty(); } - public File getFabricUserCache() { - File userCache = new File(project.getGradle().getGradleUserHomeDir(), "caches" + File.separator + "loom"); + public File getUserCache() { + File userCache = new File(project.getGradle().getGradleUserHomeDir(), "caches" + File.separator + "opengradle"); if (!userCache.exists()) { userCache.mkdirs(); } diff --git a/src/main/java/net/fabricmc/loom/task/DownloadTask.java b/src/main/java/net/fabricmc/loom/task/DownloadTask.java index e73b0e7..5c7d73a 100644 --- a/src/main/java/net/fabricmc/loom/task/DownloadTask.java +++ b/src/main/java/net/fabricmc/loom/task/DownloadTask.java @@ -143,7 +143,7 @@ public class DownloadTask extends DefaultTask { Version.AssetIndex assetIndex = version.assetIndex; - File assets = new File(extension.getFabricUserCache(), "assets-" + extension.version); + File assets = new File(extension.getUserCache(), "assets-" + extension.version); if (!assets.exists()) { assets.mkdirs(); } diff --git a/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java b/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java index 08b8dbd..2521bf3 100644 --- a/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java @@ -140,7 +140,7 @@ public class GenIdeaProjectTask extends DefaultTask { ideaClient.configName = "Minecraft Client"; ideaClient.runDir = "file://$PROJECT_DIR$/" + extension.runDir; ideaClient.vmArgs = "-Djava.library.path=" + Constants.MINECRAFT_NATIVES.get(extension).getAbsolutePath() + " -Dfabric.development=true"; - ideaClient.programArgs = "--tweakClass com.openmodloader.loader.launch.OpenClientTweaker --assetIndex " + version.assetIndex.id + " --assetsDir " + new File(extension.getFabricUserCache(), "assets-" + extension.version).getAbsolutePath(); + ideaClient.programArgs = "--tweakClass com.openmodloader.loader.launch.OpenClientTweaker --assetIndex " + version.assetIndex.id + " --assetsDir " + new File(extension.getUserCache(), "assets-" + extension.version).getAbsolutePath(); runManager.appendChild(ideaClient.genRuns(runManager)); diff --git a/src/main/java/net/fabricmc/loom/task/RunClientTask.java b/src/main/java/net/fabricmc/loom/task/RunClientTask.java index 5993be8..55b7e2e 100644 --- a/src/main/java/net/fabricmc/loom/task/RunClientTask.java +++ b/src/main/java/net/fabricmc/loom/task/RunClientTask.java @@ -68,7 +68,7 @@ public class RunClientTask extends JavaExec { libs.add(Constants.MINECRAFT_FINAL_JAR.get(extension).getAbsolutePath()); classpath(libs); - args("--tweakClass", "com.openmodloader.loader.launch.OpenClientTweaker", "--assetIndex", version.assetIndex.id, "--assetsDir", new File(extension.getFabricUserCache(), "assets-" + extension.version).getAbsolutePath()); + args("--tweakClass", "com.openmodloader.loader.launch.OpenClientTweaker", "--assetIndex", version.assetIndex.id, "--assetsDir", new File(extension.getUserCache(), "assets-" + extension.version).getAbsolutePath()); setWorkingDir(new File(getProject().getRootDir(), "run")); diff --git a/src/main/java/net/fabricmc/loom/util/Constants.java b/src/main/java/net/fabricmc/loom/util/Constants.java index fb52088..8f9634f 100644 --- a/src/main/java/net/fabricmc/loom/util/Constants.java +++ b/src/main/java/net/fabricmc/loom/util/Constants.java @@ -37,13 +37,13 @@ public class Constants { public static final File WORKING_DIRECTORY = new File("."); public static final File CACHE_FILES = new File(WORKING_DIRECTORY, ".gradle/minecraft"); - public static final IDelayed MINECRAFT_CLIENT_JAR = new DelayedFile(extension -> new File(extension.getFabricUserCache(), extension.version + "-client.jar")); - public static final IDelayed MINECRAFT_SERVER_JAR = new DelayedFile(extension -> new File(extension.getFabricUserCache(), extension.version + "-server.jar")); - public static final IDelayed MINECRAFT_MERGED_JAR = new DelayedFile(extension -> new File(extension.getFabricUserCache(), extension.version + "-merged.jar")); - public static final IDelayed MINECRAFT_MAPPED_JAR = new DelayedFile(extension -> new File(extension.getFabricUserCache(), extension.getVersionString() + "-mapped-" + extension.pomfVersion + ".jar")); + public static final IDelayed MINECRAFT_CLIENT_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-client.jar")); + public static final IDelayed MINECRAFT_SERVER_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-server.jar")); + public static final IDelayed MINECRAFT_MERGED_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-merged.jar")); + public static final IDelayed MINECRAFT_MAPPED_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.getVersionString() + "-mapped-" + extension.pomfVersion + ".jar")); public static final IDelayed MINECRAFT_FINAL_JAR = new DelayedFile(extension -> new File(CACHE_FILES, extension.getVersionString() + "-mixed-" + extension.pomfVersion + ".jar")); - public static final IDelayed POMF_DIR = new DelayedFile(extension -> new File(extension.getFabricUserCache(), "pomf")); + public static final IDelayed POMF_DIR = new DelayedFile(extension -> new File(extension.getUserCache(), "pomf")); public static IDelayed MAPPINGS_ZIP = new DelayedFile(extension -> new File(POMF_DIR.get(extension), "pomf-enigma-" + extension.version + "." + extension.pomfVersion + ".zip")); public static final IDelayed MAPPINGS_DIR = new DelayedFile(extension -> new File(POMF_DIR.get(extension), "pomf-enigma-" + extension.version + "." + extension.pomfVersion + "")); public static IDelayed MAPPINGS_TINY_GZ = new DelayedFile(extension -> new File(POMF_DIR.get(extension), "pomf-tiny-" + extension.version + "." + extension.pomfVersion + ".gz")); @@ -53,11 +53,11 @@ public class Constants { public static final IDelayed MAPPINGS_ZIP_LOCAL = new DelayedFile(extension -> new File(MAPPINGS_DIR_LOCAL.get(extension), "pomf-enigma-" + extension.version + ".zip")); public static final IDelayed MAPPINGS_TINY_GZ_LOCAL = new DelayedFile(extension -> new File(MAPPINGS_DIR_LOCAL.get(extension), "pomf-tiny-" + extension.version + ".gz")); - public static final IDelayed MINECRAFT_LIBS = new DelayedFile(extension -> new File(extension.getFabricUserCache(), extension.version + "-libs")); - public static final IDelayed MINECRAFT_NATIVES = new DelayedFile(extension -> new File(extension.getFabricUserCache(), extension.version + "-natives")); - public static final IDelayed MINECRAFT_JSON = new DelayedFile(extension -> new File(extension.getFabricUserCache(), extension.version + "-info.json")); + public static final IDelayed MINECRAFT_LIBS = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-libs")); + public static final IDelayed MINECRAFT_NATIVES = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-natives")); + public static final IDelayed MINECRAFT_JSON = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-info.json")); - public static final IDelayed VERSION_MANIFEST = new DelayedFile(extension -> new File(extension.getFabricUserCache(), "version_manifest.json")); + public static final IDelayed VERSION_MANIFEST = new DelayedFile(extension -> new File(extension.getUserCache(), "version_manifest.json")); public static final String LIBRARIES_BASE = "https://libraries.minecraft.net/"; public static final String RESOURCES_BASE = "http://resources.download.minecraft.net/"; From 3156237af7fe266e7d69d20e7b6455c2615f8933 Mon Sep 17 00:00:00 2001 From: TheCodedOne Date: Sun, 13 May 2018 21:31:44 +0100 Subject: [PATCH 05/54] Set task groups --- .../com/openmodloader/gradle/OpenGradlePlugin.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/openmodloader/gradle/OpenGradlePlugin.java b/src/main/java/com/openmodloader/gradle/OpenGradlePlugin.java index 69e73b8..6dce25d 100644 --- a/src/main/java/com/openmodloader/gradle/OpenGradlePlugin.java +++ b/src/main/java/com/openmodloader/gradle/OpenGradlePlugin.java @@ -38,14 +38,14 @@ public class OpenGradlePlugin extends AbstractPlugin { makeTask("mergeJars", MergeJarsTask.class).dependsOn("download"); makeTask("mapJars", MapJarsTask.class).dependsOn("mergeJars"); makeTask("processMods", ProcessModsTask.class).dependsOn("mapJars"); - makeTask("setup", DefaultTask.class).dependsOn("processMods"); + makeTask("setup", DefaultTask.class).dependsOn("processMods").setGroup("openmodloader"); makeTask("extractNatives", ExtractNativesTask.class).dependsOn("download"); - makeTask("genIdeaWorkspace", GenIdeaProjectTask.class).dependsOn("idea"); + makeTask("genIdeaWorkspace", GenIdeaProjectTask.class).dependsOn("idea").setGroup("ide"); - makeTask("vscode", GenVSCodeProjectTask.class).dependsOn("extractNatives"); + makeTask("vscode", GenVSCodeProjectTask.class).dependsOn("extractNatives").setGroup("ide"); - makeTask("runClient", RunClientTask.class).dependsOn("buildNeeded"); - makeTask("runServer", RunServerTask.class).dependsOn("buildNeeded"); + makeTask("runClient", RunClientTask.class).dependsOn("buildNeeded").setGroup("minecraft"); + makeTask("runServer", RunServerTask.class).dependsOn("buildNeeded").setGroup("minecraft"); } } From e9d221817328b4451d0d4f21179af7cccfc024c7 Mon Sep 17 00:00:00 2001 From: TheCodedOne Date: Mon, 14 May 2018 00:01:38 +0100 Subject: [PATCH 06/54] add mixins to the default arguments --- build.gradle | 5 +---- src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java | 4 ++-- src/main/java/net/fabricmc/loom/task/RunClientTask.java | 2 +- src/main/java/net/fabricmc/loom/task/RunServerTask.java | 1 + 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index 08cae16..87f7696 100644 --- a/build.gradle +++ b/build.gradle @@ -10,9 +10,6 @@ plugins { sourceCompatibility = 1.8 targetCompatibility = 1.8 -apply from: 'https://github.com/FabricMC/fabric-docs/raw/master/gradle/maven.gradle' -apply from: 'https://github.com/FabricMC/fabric-docs/raw/master/gradle/license.gradle' - group = 'com.openmodloader' archivesBaseName = project.name version = '0.0.7-SNAPSHOT' @@ -80,4 +77,4 @@ jar { task wrapper(type: Wrapper) { gradleVersion = '3.1' -} +} \ No newline at end of file diff --git a/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java b/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java index 2521bf3..cd2742a 100644 --- a/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java @@ -140,7 +140,7 @@ public class GenIdeaProjectTask extends DefaultTask { ideaClient.configName = "Minecraft Client"; ideaClient.runDir = "file://$PROJECT_DIR$/" + extension.runDir; ideaClient.vmArgs = "-Djava.library.path=" + Constants.MINECRAFT_NATIVES.get(extension).getAbsolutePath() + " -Dfabric.development=true"; - ideaClient.programArgs = "--tweakClass com.openmodloader.loader.launch.OpenClientTweaker --assetIndex " + version.assetIndex.id + " --assetsDir " + new File(extension.getUserCache(), "assets-" + extension.version).getAbsolutePath(); + ideaClient.programArgs = "--tweakClass com.openmodloader.loader.launch.OpenClientTweaker --tweakClass org.spongepowered.asm.launch.MixinTweaker --assetIndex " + version.assetIndex.id + " --assetsDir " + new File(extension.getUserCache(), "assets-" + extension.version).getAbsolutePath(); runManager.appendChild(ideaClient.genRuns(runManager)); @@ -150,7 +150,7 @@ public class GenIdeaProjectTask extends DefaultTask { ideaServer.configName = "Minecraft Server"; ideaServer.runDir = "file://$PROJECT_DIR$/" + extension.runDir; ideaServer.vmArgs = "-Dfabric.development=true"; - ideaServer.programArgs = "--tweakClass com.openmodloader.loader.launch.OpenServerTweaker"; + ideaServer.programArgs = "--tweakClass com.openmodloader.loader.launch.OpenServerTweaker --tweakClass org.spongepowered.asm.launch.MixinTweaker"; runManager.appendChild(ideaServer.genRuns(runManager)); diff --git a/src/main/java/net/fabricmc/loom/task/RunClientTask.java b/src/main/java/net/fabricmc/loom/task/RunClientTask.java index 55b7e2e..ecf2de3 100644 --- a/src/main/java/net/fabricmc/loom/task/RunClientTask.java +++ b/src/main/java/net/fabricmc/loom/task/RunClientTask.java @@ -68,7 +68,7 @@ public class RunClientTask extends JavaExec { libs.add(Constants.MINECRAFT_FINAL_JAR.get(extension).getAbsolutePath()); classpath(libs); - args("--tweakClass", "com.openmodloader.loader.launch.OpenClientTweaker", "--assetIndex", version.assetIndex.id, "--assetsDir", new File(extension.getUserCache(), "assets-" + extension.version).getAbsolutePath()); + args("--tweakClass", "com.openmodloader.loader.launch.OpenClientTweaker", "--tweakClass", "org.spongepowered.asm.launch.MixinTweaker", "--assetIndex", version.assetIndex.id, "--assetsDir", new File(extension.getUserCache(), "assets-" + extension.version).getAbsolutePath()); setWorkingDir(new File(getProject().getRootDir(), "run")); diff --git a/src/main/java/net/fabricmc/loom/task/RunServerTask.java b/src/main/java/net/fabricmc/loom/task/RunServerTask.java index 115a5f4..bd76d0c 100644 --- a/src/main/java/net/fabricmc/loom/task/RunServerTask.java +++ b/src/main/java/net/fabricmc/loom/task/RunServerTask.java @@ -66,6 +66,7 @@ public class RunServerTask extends JavaExec { classpath(libs); args("--tweakClass", "com.openmodloader.loader.launch.OpenServerTweaker"); + args("--tweakClass", "org.spongepowered.asm.launch.MixinTweaker"); setWorkingDir(new File(getProject().getRootDir(), "run")); From a9dfbde6d4c1c6378378098c98bf978064562e2c Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 14 May 2018 11:17:26 +0100 Subject: [PATCH 07/54] Revert 3857631498074f634adb7c1d543f91ae0fe0cfcc --- build.gradle | 8 + .../net/fabricmc/loom/AbstractPlugin.java | 31 ++++ .../fabricmc/loom/LoomGradleExtension.java | 1 + .../loom/mixin/MixinMappingProviderTiny.java | 144 ++++++++++++++++++ .../loom/mixin/MixinMappingWriterTiny.java | 75 +++++++++ .../mixin/ObfuscationEnvironmentFabric.java | 51 +++++++ .../loom/mixin/ObfuscationServiceFabric.java | 75 +++++++++ .../net/fabricmc/loom/util/Constants.java | 4 +- .../net/fabricmc/loom/util/ModRemapper.java | 1 + 9 files changed, 389 insertions(+), 1 deletion(-) create mode 100644 src/main/java/net/fabricmc/loom/mixin/MixinMappingProviderTiny.java create mode 100644 src/main/java/net/fabricmc/loom/mixin/MixinMappingWriterTiny.java create mode 100644 src/main/java/net/fabricmc/loom/mixin/ObfuscationEnvironmentFabric.java create mode 100644 src/main/java/net/fabricmc/loom/mixin/ObfuscationServiceFabric.java diff --git a/build.gradle b/build.gradle index 87f7696..7f3e249 100644 --- a/build.gradle +++ b/build.gradle @@ -28,6 +28,10 @@ repositories { name = 'Mojang' url = 'https://libraries.minecraft.net/' } + maven { + name = 'SpongePowered' + url = 'http://repo.spongepowered.org/maven' + } } configurations { @@ -53,6 +57,10 @@ dependencies { //Always fun when your dep needs the tool to build, but the tool needs the dep. //compile 'net.fabricmc:fabric-base:16w38a-0.0.4-SNAPSHOT' + shade('org.spongepowered:mixin:0.6.8-SNAPSHOT') { + exclude module: 'launchwrapper' + exclude module: 'guava' + } shade 'org.apache.commons:commons-lang3:3.5' } diff --git a/src/main/java/net/fabricmc/loom/AbstractPlugin.java b/src/main/java/net/fabricmc/loom/AbstractPlugin.java index c792af0..b4c99b2 100644 --- a/src/main/java/net/fabricmc/loom/AbstractPlugin.java +++ b/src/main/java/net/fabricmc/loom/AbstractPlugin.java @@ -82,6 +82,37 @@ public class AbstractPlugin implements Plugin { configureIDEs(); configureCompile(); + + Map> taskMap = project.getAllTasks(true); + for (Map.Entry> entry : taskMap.entrySet()) { + Project project = entry.getKey(); + Set taskSet = entry.getValue(); + for (Task task : taskSet) { + if (task instanceof JavaCompile + && !(task.getName().contains("Test")) && !(task.getName().contains("test"))) { + JavaCompile javaCompileTask = (JavaCompile) task; + javaCompileTask.doFirst(task1 -> { + project.getLogger().lifecycle(":setting java compiler args"); + try { + javaCompileTask.getClasspath().add(target.files(this.getClass().getProtectionDomain().getCodeSource().getLocation())); + + javaCompileTask.getOptions().getCompilerArgs().add("-AinMapFilePomfMojang=" + Constants.MAPPINGS_TINY.get(extension).getCanonicalPath()); + javaCompileTask.getOptions().getCompilerArgs().add("-AoutMapFilePomfMojang=" + Constants.MAPPINGS_MIXIN_EXPORT.get(extension).getCanonicalPath()); + if(extension.refmapName == null || extension.refmapName.isEmpty()){ + project.getLogger().error("Could not find refmap definition, will be using default name: " + project.getName() + "-refmap.json"); + extension.refmapName = project.getName() + "-refmap.json"; + } + javaCompileTask.getOptions().getCompilerArgs().add("-AoutRefMapFile=" + new File(javaCompileTask.getDestinationDir(), extension.refmapName).getCanonicalPath()); + javaCompileTask.getOptions().getCompilerArgs().add("-AdefaultObfuscationEnv=pomf:mojang"); + } catch (IOException e) { + e.printStackTrace(); + } + }); + } + } + + } + } /** diff --git a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java index 3b02508..2ffb196 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java +++ b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java @@ -33,6 +33,7 @@ public class LoomGradleExtension { public String runDir = "run"; public String fabricVersion; public String pomfVersion; + public String refmapName; public boolean localMappings = false; //Not to be set in the build.gradle diff --git a/src/main/java/net/fabricmc/loom/mixin/MixinMappingProviderTiny.java b/src/main/java/net/fabricmc/loom/mixin/MixinMappingProviderTiny.java new file mode 100644 index 0000000..e63db8e --- /dev/null +++ b/src/main/java/net/fabricmc/loom/mixin/MixinMappingProviderTiny.java @@ -0,0 +1,144 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2016 FabricMC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.fabricmc.loom.mixin; + +import net.fabricmc.tinyremapper.TinyUtils; +import org.spongepowered.asm.obfuscation.mapping.common.MappingField; +import org.spongepowered.asm.obfuscation.mapping.common.MappingMethod; +import org.spongepowered.tools.obfuscation.mapping.common.MappingProvider; + +import javax.annotation.processing.Filer; +import javax.annotation.processing.Messager; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; + +public class MixinMappingProviderTiny extends MappingProvider { + private final String from, to; + + public MixinMappingProviderTiny(Messager messager, Filer filer, String from, String to) { + super(messager, filer); + this.from = from; + this.to = to; + } + + private static final String[] removeFirst(String[] src, int count) { + if (count >= src.length) { + return new String[0]; + } else { + String[] out = new String[src.length - count]; + System.arraycopy(src, count, out, 0, out.length); + return out; + } + } + + @Override + public MappingMethod getMethodMapping(MappingMethod method) { + System.out.println("processing " + method.getName() + method.getDesc()); + + MappingMethod mapped = this.methodMap.get(method); + if (mapped != null) + return mapped; + + try { + Class c = this.getClass().getClassLoader().loadClass(method.getOwner().replace('/', '.')); + if (c == null || c == Object.class) { + return null; + } + + for (Class cc : c.getInterfaces()) { + mapped = getMethodMapping(method.move(cc.getName().replace('.', '/'))); + if (mapped != null) + return mapped; + } + + if (c.getSuperclass() != null) { + mapped = getMethodMapping(method.move(c.getSuperclass().getName().replace('.', '/'))); + if (mapped != null) + return mapped; + } + + return null; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + @Override + public MappingField getFieldMapping(MappingField field) { + System.out.println("processing " + field.getOwner() + "/" + field.getName() + field.getDesc()); + + MappingField mapped = this.fieldMap.get(field); + if (mapped != null) + return mapped; + + try { + Class c = this.getClass().getClassLoader().loadClass(field.getOwner().replace('/', '.')); + if (c == null || c == Object.class) { + return null; + } + + for (Class cc : c.getInterfaces()) { + mapped = getFieldMapping(field.move(cc.getName().replace('.', '/'))); + if (mapped != null) + return mapped; + } + + if (c.getSuperclass() != null) { + mapped = getFieldMapping(field.move(c.getSuperclass().getName().replace('.', '/'))); + if (mapped != null) + return mapped; + } + + return null; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + // TODO: Unify with tiny-remapper + + @Override + public void read(File input) throws IOException { + BufferedReader reader = Files.newBufferedReader(input.toPath()); + + TinyUtils.read(reader, from, to, (classFrom, classTo) -> { + classMap.put(classFrom, classTo); + }, (fieldFrom, fieldTo) -> { + fieldMap.put( + new MappingField(fieldFrom.owner, fieldFrom.name, fieldFrom.desc), + new MappingField(fieldTo.owner, fieldTo.name, fieldTo.desc) + ); + }, (methodFrom, methodTo) -> { + methodMap.put( + new MappingMethod(methodFrom.owner, methodFrom.name, methodFrom.desc), + new MappingMethod(methodTo.owner, methodTo.name, methodTo.desc) + ); + }); + } +} diff --git a/src/main/java/net/fabricmc/loom/mixin/MixinMappingWriterTiny.java b/src/main/java/net/fabricmc/loom/mixin/MixinMappingWriterTiny.java new file mode 100644 index 0000000..0ea4a47 --- /dev/null +++ b/src/main/java/net/fabricmc/loom/mixin/MixinMappingWriterTiny.java @@ -0,0 +1,75 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2016 FabricMC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.fabricmc.loom.mixin; + +import org.spongepowered.asm.obfuscation.mapping.common.MappingField; +import org.spongepowered.asm.obfuscation.mapping.common.MappingMethod; +import org.spongepowered.tools.obfuscation.ObfuscationType; +import org.spongepowered.tools.obfuscation.mapping.IMappingConsumer; +import org.spongepowered.tools.obfuscation.mapping.common.MappingWriter; + +import javax.annotation.processing.Filer; +import javax.annotation.processing.Messager; +import java.io.IOException; +import java.io.PrintWriter; + +/** + * Created by asie on 10/9/16. + */ +public class MixinMappingWriterTiny extends MappingWriter { + public MixinMappingWriterTiny(Messager messager, Filer filer) { + super(messager, filer); + } + + @Override + public void write(String output, ObfuscationType type, IMappingConsumer.MappingSet fields, IMappingConsumer.MappingSet methods) { + if (output != null) { + PrintWriter writer = null; + + try { + String from = type.getKey().split(":")[0]; + String to = type.getKey().split(":")[1]; + + writer = this.openFileWriter(output, type + " output TinyMappings"); + writer.println(String.format("v1\t%s\t%s", from, to)); + for (IMappingConsumer.MappingSet.Pair pair : fields) { + writer.println(String.format("FIELD\t%s\t%s\t%s\t%s", pair.from.getOwner(), pair.from.getDesc(), pair.from.getSimpleName(), pair.to.getSimpleName())); + } + for (IMappingConsumer.MappingSet.Pair pair : methods) { + writer.println(String.format("METHOD\t%s\t%s\t%s\t%s", pair.from.getOwner(), pair.from.getDesc(), pair.from.getSimpleName(), pair.to.getSimpleName())); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (writer != null) { + try { + writer.close(); + } catch (Exception e) { + } + } + } + } + } +} diff --git a/src/main/java/net/fabricmc/loom/mixin/ObfuscationEnvironmentFabric.java b/src/main/java/net/fabricmc/loom/mixin/ObfuscationEnvironmentFabric.java new file mode 100644 index 0000000..70318e4 --- /dev/null +++ b/src/main/java/net/fabricmc/loom/mixin/ObfuscationEnvironmentFabric.java @@ -0,0 +1,51 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2016 FabricMC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.fabricmc.loom.mixin; + +import org.spongepowered.tools.obfuscation.ObfuscationEnvironment; +import org.spongepowered.tools.obfuscation.ObfuscationType; +import org.spongepowered.tools.obfuscation.mapping.IMappingProvider; +import org.spongepowered.tools.obfuscation.mapping.IMappingWriter; + +import javax.annotation.processing.Filer; +import javax.annotation.processing.Messager; + +public class ObfuscationEnvironmentFabric extends ObfuscationEnvironment { + protected ObfuscationEnvironmentFabric(ObfuscationType type) { + super(type); + } + + @Override + protected IMappingProvider getMappingProvider(Messager messager, Filer filer) { + String from = type.getKey().split(":")[0]; + String to = type.getKey().split(":")[1]; + return new MixinMappingProviderTiny(messager, filer, from, to); + } + + @Override + protected IMappingWriter getMappingWriter(Messager messager, Filer filer) { + return new MixinMappingWriterTiny(messager, filer); + } +} diff --git a/src/main/java/net/fabricmc/loom/mixin/ObfuscationServiceFabric.java b/src/main/java/net/fabricmc/loom/mixin/ObfuscationServiceFabric.java new file mode 100644 index 0000000..b95f719 --- /dev/null +++ b/src/main/java/net/fabricmc/loom/mixin/ObfuscationServiceFabric.java @@ -0,0 +1,75 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2016 FabricMC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.fabricmc.loom.mixin; + +import com.google.common.collect.ImmutableSet; +import org.apache.commons.lang3.StringUtils; +import org.spongepowered.tools.obfuscation.service.IObfuscationService; +import org.spongepowered.tools.obfuscation.service.ObfuscationTypeDescriptor; + +import java.util.Collection; +import java.util.Set; + +public class ObfuscationServiceFabric implements IObfuscationService { + public static final String IN_MAP_FILE = "inMapFile"; + public static final String IN_MAP_EXTRA_FILES = "inMapExtraFiles"; + public static final String OUT_MAP_FILE = "outMapFile"; + + private String asSuffixed(String arg, String from, String to) { + return arg + StringUtils.capitalize(from) + StringUtils.capitalize(to); + } + + private ObfuscationTypeDescriptor createObfuscationType(String from, String to) { + return new ObfuscationTypeDescriptor( + from + ":" + to, + asSuffixed(ObfuscationServiceFabric.IN_MAP_FILE, from, to), + asSuffixed(ObfuscationServiceFabric.IN_MAP_EXTRA_FILES, from, to), + asSuffixed(ObfuscationServiceFabric.OUT_MAP_FILE, from, to), + ObfuscationEnvironmentFabric.class + ); + } + + private void addSupportedOptions(ImmutableSet.Builder builder, String from, String to) { + builder.add(asSuffixed(ObfuscationServiceFabric.IN_MAP_FILE, from, to)); + builder.add(asSuffixed(ObfuscationServiceFabric.IN_MAP_EXTRA_FILES, from, to)); + builder.add(asSuffixed(ObfuscationServiceFabric.OUT_MAP_FILE, from, to)); + } + + @Override + public Set getSupportedOptions() { + ImmutableSet.Builder builder = new ImmutableSet.Builder(); + addSupportedOptions(builder, "mojang", "pomf"); + addSupportedOptions(builder, "pomf", "mojang"); + return builder.build(); + } + + @Override + public Collection getObfuscationTypes() { + return ImmutableSet.of( + createObfuscationType("mojang", "pomf"), + createObfuscationType("pomf", "mojang") + ); + } +} diff --git a/src/main/java/net/fabricmc/loom/util/Constants.java b/src/main/java/net/fabricmc/loom/util/Constants.java index 8f9634f..40a792b 100644 --- a/src/main/java/net/fabricmc/loom/util/Constants.java +++ b/src/main/java/net/fabricmc/loom/util/Constants.java @@ -48,14 +48,16 @@ public class Constants { public static final IDelayed MAPPINGS_DIR = new DelayedFile(extension -> new File(POMF_DIR.get(extension), "pomf-enigma-" + extension.version + "." + extension.pomfVersion + "")); public static IDelayed MAPPINGS_TINY_GZ = new DelayedFile(extension -> new File(POMF_DIR.get(extension), "pomf-tiny-" + extension.version + "." + extension.pomfVersion + ".gz")); public static final IDelayed MAPPINGS_TINY = new DelayedFile(extension -> new File(POMF_DIR.get(extension), "pomf-tiny-" + extension.version + "." + extension.pomfVersion)); + public static final IDelayed MAPPINGS_MIXIN_EXPORT = new DelayedFile(extension -> new File(CACHE_FILES, "mixin-map-" + extension.version + "." + extension.pomfVersion + ".mappings")); public static final IDelayed MAPPINGS_DIR_LOCAL = new DelayedFile(extension -> new File(WORKING_DIRECTORY, "mappings")); public static final IDelayed MAPPINGS_ZIP_LOCAL = new DelayedFile(extension -> new File(MAPPINGS_DIR_LOCAL.get(extension), "pomf-enigma-" + extension.version + ".zip")); public static final IDelayed MAPPINGS_TINY_GZ_LOCAL = new DelayedFile(extension -> new File(MAPPINGS_DIR_LOCAL.get(extension), "pomf-tiny-" + extension.version + ".gz")); - + public static final IDelayed MINECRAFT_LIBS = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-libs")); public static final IDelayed MINECRAFT_NATIVES = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-natives")); public static final IDelayed MINECRAFT_JSON = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-info.json")); + public static final IDelayed REF_MAP = new DelayedFile(extension -> new File(CACHE_FILES, "mixin-refmap.json")); public static final IDelayed VERSION_MANIFEST = new DelayedFile(extension -> new File(extension.getUserCache(), "version_manifest.json")); diff --git a/src/main/java/net/fabricmc/loom/util/ModRemapper.java b/src/main/java/net/fabricmc/loom/util/ModRemapper.java index aa0d71f..20d0ddd 100644 --- a/src/main/java/net/fabricmc/loom/util/ModRemapper.java +++ b/src/main/java/net/fabricmc/loom/util/ModRemapper.java @@ -74,6 +74,7 @@ public class ModRemapper { TinyRemapper remapper = TinyRemapper.newRemapper() .withMappings(TinyUtils.createTinyMappingProvider(mappings, fromM, toM)) + .withMappings(TinyUtils.createTinyMappingProvider(Constants.MAPPINGS_MIXIN_EXPORT.get(extension).toPath(), toM, fromM)) .build(); OutputConsumerPath outputConsumer = new OutputConsumerPath(modJar.toPath()); From 55c6018bff6118f928b3a7e69a6b23f010d8079d Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 14 May 2018 11:20:19 +0100 Subject: [PATCH 08/54] Update to gradle 4.7 --- gradle/wrapper/gradle-wrapper.jar | Bin 52928 -> 54329 bytes gradle/wrapper/gradle-wrapper.properties | 3 +-- gradlew | 23 ++++++++++-------- .../net/fabricmc/loom/util/Constants.java | 2 +- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 6ffa237849ef3607e39c3b334a92a65367962071..f6b961fd5a86aa5fbfe90f707c3138408be7c718 100644 GIT binary patch delta 37264 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 delta 35919 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 MAPPINGS_DIR_LOCAL = new DelayedFile(extension -> new File(WORKING_DIRECTORY, "mappings")); public static final IDelayed MAPPINGS_ZIP_LOCAL = new DelayedFile(extension -> new File(MAPPINGS_DIR_LOCAL.get(extension), "pomf-enigma-" + extension.version + ".zip")); public static final IDelayed MAPPINGS_TINY_GZ_LOCAL = new DelayedFile(extension -> new File(MAPPINGS_DIR_LOCAL.get(extension), "pomf-tiny-" + extension.version + ".gz")); - + public static final IDelayed MINECRAFT_LIBS = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-libs")); public static final IDelayed MINECRAFT_NATIVES = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-natives")); public static final IDelayed MINECRAFT_JSON = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-info.json")); From fe13ce212e4f3eb2f794867edf4ce1ab3293814d Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 14 May 2018 11:22:50 +0100 Subject: [PATCH 09/54] Fix build --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 3 ++- src/main/java/net/fabricmc/loom/AbstractPlugin.java | 3 +++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 7f3e249..c56db12 100644 --- a/build.gradle +++ b/build.gradle @@ -57,7 +57,7 @@ dependencies { //Always fun when your dep needs the tool to build, but the tool needs the dep. //compile 'net.fabricmc:fabric-base:16w38a-0.0.4-SNAPSHOT' - shade('org.spongepowered:mixin:0.6.8-SNAPSHOT') { + shade('org.spongepowered:mixin:0.7.8-SNAPSHOT') { exclude module: 'launchwrapper' exclude module: 'guava' } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 16d2805..1f47535 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Mon May 14 11:21:37 BST 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.7-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.7-all.zip diff --git a/src/main/java/net/fabricmc/loom/AbstractPlugin.java b/src/main/java/net/fabricmc/loom/AbstractPlugin.java index b4c99b2..6ea6fbc 100644 --- a/src/main/java/net/fabricmc/loom/AbstractPlugin.java +++ b/src/main/java/net/fabricmc/loom/AbstractPlugin.java @@ -39,6 +39,7 @@ import org.gradle.api.artifacts.repositories.MavenArtifactRepository; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.JavaPluginConvention; import org.gradle.api.tasks.SourceSet; +import org.gradle.api.tasks.compile.JavaCompile; import org.gradle.api.tasks.javadoc.Javadoc; import org.gradle.plugins.ide.eclipse.model.EclipseModel; import org.gradle.plugins.ide.idea.model.IdeaModel; @@ -47,6 +48,8 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; +import java.util.Map; +import java.util.Set; public class AbstractPlugin implements Plugin { protected Project project; From 2ad488f0d84e8604f6b0e5f718ff9a249236bfbf Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 14 May 2018 11:50:02 +0100 Subject: [PATCH 10/54] Upload to maven --- Jenkinsfile | 2 +- build.gradle | 35 +++++++++++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 6b9f40b..422b309 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -11,5 +11,5 @@ node { stage "Archive artifacts" - sh "./gradlew upload" + sh "./gradlew publish" } \ No newline at end of file diff --git a/build.gradle b/build.gradle index c56db12..d0bed68 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,7 @@ plugins { id 'java' id 'groovy' id 'maven' + id 'maven-publish' id 'idea' id 'eclipse' @@ -12,7 +13,7 @@ targetCompatibility = 1.8 group = 'com.openmodloader' archivesBaseName = project.name -version = '0.0.7-SNAPSHOT' +version = '0.0.8-SNAPSHOT' repositories { mavenCentral() @@ -84,5 +85,35 @@ jar { task wrapper(type: Wrapper) { - gradleVersion = '3.1' + gradleVersion = '4.7' +} + +publishing { + publications { + maven(MavenPublication) { + groupId 'OpenGradle' + artifactId project.archivesBaseName + version project.version + + from components.java + + artifact jar + + //Removes all of the dependencies from the maven pom, prevents sub projects downloading all the libs, as we use a fat jar + pom.withXml { + asNode().remove(asNode().get('dependencies')) + } + } + } + repositories { + maven { + url "http://mavenupload.modmuss50.me/" + if (project.hasProperty('mavenPass')) { + credentials { + username 'buildslave' + password project.getProperty('mavenPass') + } + } + } + } } \ No newline at end of file From 460dcbacde2eb01b1af18c75ca1ddf59e4c0d51e Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 14 May 2018 11:56:43 +0100 Subject: [PATCH 11/54] Fix build on gradle 4.7 --- build.gradle | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index d0bed68..09034d7 100644 --- a/build.gradle +++ b/build.gradle @@ -74,12 +74,9 @@ sourceSets { } jar { - from { - configurations.shade.each { dep -> - from(project.zipTree(dep)){ - exclude 'META-INF', 'META-INF/**' - } - } + from (configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }) { + exclude 'META-INF/*' + exclude 'META-INF' } } From 3050df55c749dff76e869b6b0979ec1119e6169a Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 14 May 2018 11:58:41 +0100 Subject: [PATCH 12/54] Rename JenkinsFile to BuildFile to prevent jenkins building the forks --- .gitignore | 2 +- Jenkinsfile => BuildFile | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename Jenkinsfile => BuildFile (100%) diff --git a/.gitignore b/.gitignore index 9023533..b1099a3 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,4 @@ !/LICENSE !/README.md !/settings.gradle -!/Jenkinsfile \ No newline at end of file +!/BuildFile \ No newline at end of file diff --git a/Jenkinsfile b/BuildFile similarity index 100% rename from Jenkinsfile rename to BuildFile From eee410a8f0c0fa15b361802eecc8b31681a906cd Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 14 May 2018 12:00:56 +0100 Subject: [PATCH 13/54] Shoudl fix maven publishing --- build.gradle | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 09034d7..71b4af1 100644 --- a/build.gradle +++ b/build.gradle @@ -93,9 +93,7 @@ publishing { version project.version from components.java - - artifact jar - + //Removes all of the dependencies from the maven pom, prevents sub projects downloading all the libs, as we use a fat jar pom.withXml { asNode().remove(asNode().get('dependencies')) From 0979217d0bbe18849e8d34be417c2d6568c62b87 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 14 May 2018 12:06:57 +0100 Subject: [PATCH 14/54] Should fix jar size --- build.gradle | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 71b4af1..6dc9daa 100644 --- a/build.gradle +++ b/build.gradle @@ -74,7 +74,8 @@ sourceSets { } jar { - from (configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }) { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + from (configurations.shade.collect { it.isDirectory() ? it : zipTree(it) }) { exclude 'META-INF/*' exclude 'META-INF' } @@ -93,7 +94,7 @@ publishing { version project.version from components.java - + //Removes all of the dependencies from the maven pom, prevents sub projects downloading all the libs, as we use a fat jar pom.withXml { asNode().remove(asNode().get('dependencies')) From ae97990aaa2070bb6ee85a11bd780958cd7575cc Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 14 May 2018 14:35:23 +0100 Subject: [PATCH 15/54] Use OML pomf --- src/main/java/net/fabricmc/loom/task/DownloadTask.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/task/DownloadTask.java b/src/main/java/net/fabricmc/loom/task/DownloadTask.java index 5c7d73a..9118545 100644 --- a/src/main/java/net/fabricmc/loom/task/DownloadTask.java +++ b/src/main/java/net/fabricmc/loom/task/DownloadTask.java @@ -75,7 +75,7 @@ public class DownloadTask extends DefaultTask { if (!Constants.MAPPINGS_ZIP.get(extension).exists() && extension.hasPomf()) { this.getLogger().lifecycle(":downloading mappings"); try { - FileUtils.copyURLToFile(new URL("http://modmuss50.me:8080/job/FabricMC/job/pomf/job/" + extension.version + "/" + extension.pomfVersion + "/artifact/build/libs/pomf-enigma-" + extension.version + "." + extension.pomfVersion + ".zip"), Constants.MAPPINGS_ZIP.get(extension)); + FileUtils.copyURLToFile(new URL("http://modmuss50.me:8080/job/OpenModLoader/job/pomf/job/" + extension.version + "/" + extension.pomfVersion + "/artifact/build/libs/pomf-enigma-" + extension.version + "." + extension.pomfVersion + ".zip"), Constants.MAPPINGS_ZIP.get(extension)); } catch (Exception e) { throw new RuntimeException("Failed to download mappings", e); } @@ -103,7 +103,7 @@ public class DownloadTask extends DefaultTask { if (!Constants.MAPPINGS_TINY_GZ.get(extension).exists() && !extension.localMappings) { getLogger().lifecycle(":downloading tiny mappings"); try { - FileUtils.copyURLToFile(new URL("http://modmuss50.me:8080/job/FabricMC/job/pomf/job/" + extension.version + "/" + extension.pomfVersion + "/artifact/build/libs/pomf-tiny-" + extension.version + "." + extension.pomfVersion + ".gz"), Constants.MAPPINGS_TINY_GZ.get(extension)); + FileUtils.copyURLToFile(new URL("http://modmuss50.me:8080/job/OpenModLoader/job/pomf/job/" + extension.version + "/" + extension.pomfVersion + "/artifact/build/libs/pomf-tiny-" + extension.version + "." + extension.pomfVersion + ".gz"), Constants.MAPPINGS_TINY_GZ.get(extension)); } catch (Exception e) { throw new RuntimeException("Failed to download mappings", e); } From 66c043f1716caa5887e81b36f7c386681fb3d1a1 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 14 May 2018 14:47:43 +0100 Subject: [PATCH 16/54] Fix runClient --- src/main/java/net/fabricmc/loom/task/RunClientTask.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/net/fabricmc/loom/task/RunClientTask.java b/src/main/java/net/fabricmc/loom/task/RunClientTask.java index ecf2de3..02e4e17 100644 --- a/src/main/java/net/fabricmc/loom/task/RunClientTask.java +++ b/src/main/java/net/fabricmc/loom/task/RunClientTask.java @@ -86,6 +86,7 @@ public class RunClientTask extends JavaExec { List args = new ArrayList<>(); args.add("-Djava.library.path=" + Constants.MINECRAFT_NATIVES.get(extension).getAbsolutePath()); args.add("-Dfabric.development=true"); + args.add("-XstartOnFirstThread"); //Fixes lwjgl starting on an incorrect thread return args; } From 5280806f45bd572354a6e784dc5d804724850c12 Mon Sep 17 00:00:00 2001 From: gegy1000 Date: Mon, 14 May 2018 16:13:20 +0200 Subject: [PATCH 17/54] Fix VSCode resource configuration --- .../java/net/fabricmc/loom/task/GenVSCodeProjectTask.java | 4 ++-- src/main/java/net/fabricmc/loom/task/RunClientTask.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/task/GenVSCodeProjectTask.java b/src/main/java/net/fabricmc/loom/task/GenVSCodeProjectTask.java index b979058..bc030d9 100644 --- a/src/main/java/net/fabricmc/loom/task/GenVSCodeProjectTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenVSCodeProjectTask.java @@ -67,9 +67,9 @@ public class GenVSCodeProjectTask extends DefaultTask { JsonObject jsonObject = new JsonObject(); JsonArray jsonArray = new JsonArray(); jsonArray.add("src/main/java"); - jsonArray.add("src/main/resorces"); + jsonArray.add("src/main/resources"); jsonArray.add("src/test/java"); - jsonArray.add("src/test/resorces"); + jsonArray.add("src/test/resources"); jsonObject.add("sourcePath", jsonArray); JsonElement element = new JsonPrimitive(classPathFile.getName()); jsonObject.add("classPathFile", element); diff --git a/src/main/java/net/fabricmc/loom/task/RunClientTask.java b/src/main/java/net/fabricmc/loom/task/RunClientTask.java index 02e4e17..a74f1d7 100644 --- a/src/main/java/net/fabricmc/loom/task/RunClientTask.java +++ b/src/main/java/net/fabricmc/loom/task/RunClientTask.java @@ -46,7 +46,7 @@ public class RunClientTask extends JavaExec { try { version = gson.fromJson(new FileReader(Constants.MINECRAFT_JSON.get(extension)), Version.class); } catch (FileNotFoundException e) { - e.printStackTrace(); + getLogger().error("Failed to retrieve version from minecraft json", e); } List libs = new ArrayList<>(); From 5546d876fb279cae7a9a5fe2971c088d73fa7c2a Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 14 May 2018 21:29:48 +0100 Subject: [PATCH 18/54] No longer use sponges own tweak class, run client task now uses the obfed jar. --- src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java | 4 ++-- src/main/java/net/fabricmc/loom/task/RunClientTask.java | 5 ++--- src/main/java/net/fabricmc/loom/task/RunServerTask.java | 1 - 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java b/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java index cd2742a..2521bf3 100644 --- a/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java @@ -140,7 +140,7 @@ public class GenIdeaProjectTask extends DefaultTask { ideaClient.configName = "Minecraft Client"; ideaClient.runDir = "file://$PROJECT_DIR$/" + extension.runDir; ideaClient.vmArgs = "-Djava.library.path=" + Constants.MINECRAFT_NATIVES.get(extension).getAbsolutePath() + " -Dfabric.development=true"; - ideaClient.programArgs = "--tweakClass com.openmodloader.loader.launch.OpenClientTweaker --tweakClass org.spongepowered.asm.launch.MixinTweaker --assetIndex " + version.assetIndex.id + " --assetsDir " + new File(extension.getUserCache(), "assets-" + extension.version).getAbsolutePath(); + ideaClient.programArgs = "--tweakClass com.openmodloader.loader.launch.OpenClientTweaker --assetIndex " + version.assetIndex.id + " --assetsDir " + new File(extension.getUserCache(), "assets-" + extension.version).getAbsolutePath(); runManager.appendChild(ideaClient.genRuns(runManager)); @@ -150,7 +150,7 @@ public class GenIdeaProjectTask extends DefaultTask { ideaServer.configName = "Minecraft Server"; ideaServer.runDir = "file://$PROJECT_DIR$/" + extension.runDir; ideaServer.vmArgs = "-Dfabric.development=true"; - ideaServer.programArgs = "--tweakClass com.openmodloader.loader.launch.OpenServerTweaker --tweakClass org.spongepowered.asm.launch.MixinTweaker"; + ideaServer.programArgs = "--tweakClass com.openmodloader.loader.launch.OpenServerTweaker"; runManager.appendChild(ideaServer.genRuns(runManager)); diff --git a/src/main/java/net/fabricmc/loom/task/RunClientTask.java b/src/main/java/net/fabricmc/loom/task/RunClientTask.java index 02e4e17..aaa5795 100644 --- a/src/main/java/net/fabricmc/loom/task/RunClientTask.java +++ b/src/main/java/net/fabricmc/loom/task/RunClientTask.java @@ -65,10 +65,10 @@ public class RunClientTask extends JavaExec { libs.add(file.getAbsolutePath()); } } - libs.add(Constants.MINECRAFT_FINAL_JAR.get(extension).getAbsolutePath()); + libs.add(Constants.MINECRAFT_CLIENT_JAR.get(extension).getAbsolutePath()); classpath(libs); - args("--tweakClass", "com.openmodloader.loader.launch.OpenClientTweaker", "--tweakClass", "org.spongepowered.asm.launch.MixinTweaker", "--assetIndex", version.assetIndex.id, "--assetsDir", new File(extension.getUserCache(), "assets-" + extension.version).getAbsolutePath()); + args("--tweakClass", "com.openmodloader.loader.launch.OpenClientTweaker", "--assetIndex", version.assetIndex.id, "--assetsDir", new File(extension.getUserCache(), "assets-" + extension.version).getAbsolutePath()); setWorkingDir(new File(getProject().getRootDir(), "run")); @@ -85,7 +85,6 @@ public class RunClientTask extends JavaExec { LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); List args = new ArrayList<>(); args.add("-Djava.library.path=" + Constants.MINECRAFT_NATIVES.get(extension).getAbsolutePath()); - args.add("-Dfabric.development=true"); args.add("-XstartOnFirstThread"); //Fixes lwjgl starting on an incorrect thread return args; } diff --git a/src/main/java/net/fabricmc/loom/task/RunServerTask.java b/src/main/java/net/fabricmc/loom/task/RunServerTask.java index bd76d0c..115a5f4 100644 --- a/src/main/java/net/fabricmc/loom/task/RunServerTask.java +++ b/src/main/java/net/fabricmc/loom/task/RunServerTask.java @@ -66,7 +66,6 @@ public class RunServerTask extends JavaExec { classpath(libs); args("--tweakClass", "com.openmodloader.loader.launch.OpenServerTweaker"); - args("--tweakClass", "org.spongepowered.asm.launch.MixinTweaker"); setWorkingDir(new File(getProject().getRootDir(), "run")); From db3ff955e5370a5ab6e10fdec7ed943bcdbaa140 Mon Sep 17 00:00:00 2001 From: TheCodedOne Date: Tue, 15 May 2018 01:56:39 +0100 Subject: [PATCH 19/54] Change default enviroment arguments to oml --- src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java b/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java index 2521bf3..eb47cd5 100644 --- a/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java @@ -139,7 +139,7 @@ public class GenIdeaProjectTask extends DefaultTask { ideaClient.projectName = project.getName(); ideaClient.configName = "Minecraft Client"; ideaClient.runDir = "file://$PROJECT_DIR$/" + extension.runDir; - ideaClient.vmArgs = "-Djava.library.path=" + Constants.MINECRAFT_NATIVES.get(extension).getAbsolutePath() + " -Dfabric.development=true"; + ideaClient.vmArgs = "-Djava.library.path=" + Constants.MINECRAFT_NATIVES.get(extension).getAbsolutePath() + " -Doml.development=true"; ideaClient.programArgs = "--tweakClass com.openmodloader.loader.launch.OpenClientTweaker --assetIndex " + version.assetIndex.id + " --assetsDir " + new File(extension.getUserCache(), "assets-" + extension.version).getAbsolutePath(); runManager.appendChild(ideaClient.genRuns(runManager)); @@ -149,7 +149,7 @@ public class GenIdeaProjectTask extends DefaultTask { ideaServer.projectName = project.getName(); ideaServer.configName = "Minecraft Server"; ideaServer.runDir = "file://$PROJECT_DIR$/" + extension.runDir; - ideaServer.vmArgs = "-Dfabric.development=true"; + ideaServer.vmArgs = "-Doml.development=true"; ideaServer.programArgs = "--tweakClass com.openmodloader.loader.launch.OpenServerTweaker"; runManager.appendChild(ideaServer.genRuns(runManager)); From 24e3a3fb7db60858620012be2b02562028892471 Mon Sep 17 00:00:00 2001 From: TheCodedOne Date: Tue, 15 May 2018 02:14:12 +0100 Subject: [PATCH 20/54] Make OpenGradle merge data from client --- src/main/java/net/fabricmc/loom/task/MapJarsTask.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/fabricmc/loom/task/MapJarsTask.java b/src/main/java/net/fabricmc/loom/task/MapJarsTask.java index 4b0d52e..b80471b 100644 --- a/src/main/java/net/fabricmc/loom/task/MapJarsTask.java +++ b/src/main/java/net/fabricmc/loom/task/MapJarsTask.java @@ -76,7 +76,7 @@ public class MapJarsTask extends DefaultTask { tempAssests.mkdir(); ZipUtil.unpack(Constants.MINECRAFT_CLIENT_JAR.get(extension), tempAssests, name -> { - if (name.startsWith("assets") || name.startsWith("log4j2.xml") || name.startsWith("pack.png")) { + if (name.startsWith("assets") || name.startsWith("data") || name.startsWith("log4j2.xml") || name.startsWith("pack.png")) { return name; } else { return null; From d13f33d0f3661dd5e06ccd8b8c579a2a9919f71c Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Tue, 15 May 2018 11:54:40 +0100 Subject: [PATCH 21/54] Inital work on mixin prebaker, old code taken from fabric-base --- build.gradle | 3 + .../loom/util/proccessing/MixinPrebaker.java | 253 ++++++++++++++++++ .../loom/util/proccessing/PreBakeMixins.java | 3 +- 3 files changed, 257 insertions(+), 2 deletions(-) create mode 100644 src/main/java/net/fabricmc/loom/util/proccessing/MixinPrebaker.java diff --git a/build.gradle b/build.gradle index 6dc9daa..115fac1 100644 --- a/build.gradle +++ b/build.gradle @@ -54,6 +54,9 @@ dependencies { shade 'cuchaz:enigma:0.11.0.+:lib' shade 'net.fabricmc:tiny-remapper:+' + shade ('net.minecraft:launchwrapper:1.12') { + transitive = false + } //Always fun when your dep needs the tool to build, but the tool needs the dep. //compile 'net.fabricmc:fabric-base:16w38a-0.0.4-SNAPSHOT' diff --git a/src/main/java/net/fabricmc/loom/util/proccessing/MixinPrebaker.java b/src/main/java/net/fabricmc/loom/util/proccessing/MixinPrebaker.java new file mode 100644 index 0000000..799e79b --- /dev/null +++ b/src/main/java/net/fabricmc/loom/util/proccessing/MixinPrebaker.java @@ -0,0 +1,253 @@ +/* + * Copyright 2016 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package net.fabricmc.loom.util.proccessing; + +import com.google.common.base.Charsets; +import com.google.common.io.ByteStreams; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.minecraft.launchwrapper.Launch; +import net.minecraft.launchwrapper.LaunchClassLoader; +import org.objectweb.asm.*; +import org.spongepowered.asm.launch.GlobalProperties; +import org.spongepowered.asm.mixin.EnvironmentStateTweaker; +import org.spongepowered.asm.mixin.transformer.MixinTransformer; +import org.spongepowered.asm.service.mojang.MixinServiceLaunchWrapper; + +import javax.annotation.Nonnull; +import java.io.*; +import java.net.URLClassLoader; +import java.nio.file.Files; +import java.nio.file.attribute.FileTime; +import java.time.Instant; +import java.util.*; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.jar.JarInputStream; +import java.util.jar.JarOutputStream; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; + +/** + * The purpose of this class is to provide an utility for baking mixins from + * mods into a JAR file at compile time to make accessing APIs provided by them + * more intuitive in development environment. + */ +public class MixinPrebaker { + private static class DesprinklingFieldVisitor extends FieldVisitor { + public DesprinklingFieldVisitor(int api, FieldVisitor fv) { + super(api, fv); + } + + @Override + public AnnotationVisitor visitAnnotation(String desc, boolean visible) { + if (isSprinkledAnnotation(desc)) { + return null; + } + return super.visitAnnotation(desc, visible); + } + } + + private static class DesprinklingMethodVisitor extends MethodVisitor { + public DesprinklingMethodVisitor(int api, MethodVisitor mv) { + super(api, mv); + } + + @Override + public AnnotationVisitor visitAnnotation(String desc, boolean visible) { + if (isSprinkledAnnotation(desc)) { + return null; + } + return super.visitAnnotation(desc, visible); + } + } + + private static class DesprinklingClassVisitor extends ClassVisitor { + public DesprinklingClassVisitor(int api, ClassVisitor cv) { + super(api, cv); + } + + @Override + public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { + return new DesprinklingFieldVisitor(Opcodes.ASM5, super.visitField(access, name, desc, signature, value)); + } + + @Override + public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { + return new DesprinklingMethodVisitor(Opcodes.ASM5, super.visitMethod(access, name, desc, signature, exceptions)); + } + + @Override + public AnnotationVisitor visitAnnotation(String desc, boolean visible) { + if (isSprinkledAnnotation(desc)) { + return null; + } + return super.visitAnnotation(desc, visible); + } + } + + private static boolean isSprinkledAnnotation(String desc) { + //System.out.println(desc); + return desc.startsWith("Lorg/spongepowered/asm/mixin/transformer/meta"); + } + + // Term proposed by Mumfrey, don't blame me + public static byte[] desprinkle(byte[] cls) { + ClassReader reader = new ClassReader(cls); + ClassWriter writer = new ClassWriter(0); + + reader.accept(new DesprinklingClassVisitor(Opcodes.ASM5, writer), 0); + return writer.toByteArray(); + } + + public static final String APPLIED_MIXIN_CONFIGS_FILENAME = ".oml-applied-mixin-configs"; + public static final String MAPPINGS_FILENAME = ".oml-dev-mappings.tiny"; + + public static void main(String[] args) { + boolean hasMappingsFile = false; + + if (args.length < 3) { + System.out.println("usage: MixinPrebaker [-m mapping-file] "); + return; + } + + File mappingsFile = null; + int argOffset; + for (argOffset = 0; argOffset < args.length; argOffset++) { + if ("-m".equals(args[argOffset])) { + hasMappingsFile = true; + mappingsFile = new File(args[++argOffset]); + //TODO this is prob what was handling the mixin remmapping, this may need to be added back + //FabricMixinBootstrap.setMappingFile(); + } else { + break; + } + } + + Set modFiles = new HashSet<>(); + for (int i = argOffset + 2; i < args.length; i++) { + modFiles.add(new File(args[i])); + } + + URLClassLoader ucl = (URLClassLoader) MixinPrebaker.class.getClassLoader(); + Launch.classLoader = new LaunchClassLoader(ucl.getURLs()); + Launch.blackboard = new HashMap<>(); + Launch.blackboard.put(MixinServiceLaunchWrapper.BLACKBOARD_KEY_TWEAKS, Collections.emptyList()); + + List modInfo = findModInfo(modFiles); + List mods = new ArrayList<>(); + for(JsonObject modInfoJson : modInfo){ + if(!modInfoJson.isJsonArray()){ + continue; + } + JsonArray jsonArray = modInfoJson.getAsJsonArray(); + for (int i = 0; i < jsonArray.size(); i++) { + mods.add(jsonArray.get(i).getAsJsonObject()); + } + } + List mixins = new ArrayList<>(); + for(JsonObject modObject : mods){ + mixins.addAll(findMixins(modObject.getAsJsonArray("mixins"))); + mixins.addAll(findMixins(modObject.getAsJsonArray("clientMixins"))); + mixins.addAll(findMixins(modObject.getAsJsonArray("serverMixins"))); + } + System.out.println("Found " + mixins.size() + " mixins to pre bake"); + + EnvironmentStateTweaker tweaker = new EnvironmentStateTweaker(); + tweaker.getLaunchArguments(); + tweaker.injectIntoClassLoader(Launch.classLoader); + + MixinTransformer mixinTransformer = GlobalProperties.get(GlobalProperties.Keys.TRANSFORMER); + + try { + JarInputStream input = new JarInputStream(new FileInputStream(new File(args[argOffset + 0]))); + JarOutputStream output = new JarOutputStream(new FileOutputStream(new File(args[argOffset + 1]))); + JarEntry entry; + while ((entry = input.getNextJarEntry()) != null) { + if (entry.getName().equals(APPLIED_MIXIN_CONFIGS_FILENAME)) { + continue; + } + + if (hasMappingsFile && entry.getName().equals(MAPPINGS_FILENAME)) { + continue; + } + + if (entry.getName().endsWith(".class")) { + byte[] classIn = ByteStreams.toByteArray(input); + String className = entry.getName().substring(0, entry.getName().length() - 6).replace('/', '.'); + byte[] classOut = mixinTransformer.transformClassBytes(className, className, classIn); + if (classIn != classOut) { + System.out.println("Transformed " + className); + classOut = desprinkle(classOut); + } + JarEntry newEntry = new JarEntry(entry.getName()); + newEntry.setComment(entry.getComment()); + newEntry.setSize(classOut.length); + newEntry.setLastModifiedTime(FileTime.from(Instant.now())); + output.putNextEntry(newEntry); + output.write(classOut); + } else { + output.putNextEntry(entry); + ByteStreams.copy(input, output); + } + } + + output.putNextEntry(new JarEntry(APPLIED_MIXIN_CONFIGS_FILENAME)); + output.write(String.join("\n", mixins).getBytes(Charsets.UTF_8)); + + if (hasMappingsFile) { + output.putNextEntry(new JarEntry(MAPPINGS_FILENAME)); + Files.copy(mappingsFile.toPath(), output); + } + + input.close(); + output.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private static List findMixins(JsonArray jsonArray){ + if(jsonArray == null || jsonArray.size() == 0){ + return Collections.emptyList(); + } + List mixinList = new ArrayList<>(); + for (int i = 0; i < jsonArray.size(); i++) { + mixinList.add(jsonArray.get(i).getAsString()); + } + return mixinList; + } + + private static List findModInfo(Set mods){ + return mods.stream().map(file -> { + try { + JarFile jar = new JarFile(file); + return readModInfoFromJar(jar); + } catch (IOException e) { + throw new RuntimeException("Failed to mod " + file.getName(), e); + } + }).collect(Collectors.toList()); + } + + private static JsonObject readModInfoFromJar(@Nonnull JarFile file) throws IOException { + Gson gson = new Gson(); + ZipEntry entry = file.getEntry("mod.json"); + if (entry == null) + return null; + return gson.fromJson(new InputStreamReader(file.getInputStream(entry)), JsonObject.class); + } +} \ No newline at end of file diff --git a/src/main/java/net/fabricmc/loom/util/proccessing/PreBakeMixins.java b/src/main/java/net/fabricmc/loom/util/proccessing/PreBakeMixins.java index 7d36572..45635d5 100644 --- a/src/main/java/net/fabricmc/loom/util/proccessing/PreBakeMixins.java +++ b/src/main/java/net/fabricmc/loom/util/proccessing/PreBakeMixins.java @@ -46,8 +46,7 @@ public class PreBakeMixins { } project.getLogger().lifecycle(":preBaking mixins"); ProcessModsTask.addFile(Constants.MINECRAFT_MAPPED_JAR.get(extension), this); - //LogManager.getFormatterLogger("test"); - // MixinPrebaker.main(args); + MixinPrebaker.main(args); } } From f1a00533ad4209161746249c3beb0ca1ba75b9fa Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Tue, 15 May 2018 11:58:51 +0100 Subject: [PATCH 22/54] Fix to support new mod.json format --- .../net/fabricmc/loom/AbstractPlugin.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/AbstractPlugin.java b/src/main/java/net/fabricmc/loom/AbstractPlugin.java index 6ea6fbc..a11bf1b 100644 --- a/src/main/java/net/fabricmc/loom/AbstractPlugin.java +++ b/src/main/java/net/fabricmc/loom/AbstractPlugin.java @@ -26,6 +26,7 @@ package net.fabricmc.loom; import com.google.common.collect.ImmutableMap; import com.google.gson.Gson; +import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import net.fabricmc.loom.task.DownloadTask; @@ -273,17 +274,19 @@ public class AbstractPlugin implements Plugin { Gson gson = new Gson(); try { JsonElement jsonElement = gson.fromJson(new FileReader(modJson), JsonElement.class); - JsonObject jsonObject = jsonElement.getAsJsonObject(); - if ((extension.version == null || extension.version.isEmpty()) && jsonObject.has("version")) { - project.setVersion(jsonObject.get("version").getAsString()); + JsonArray jsonArray = jsonElement.getAsJsonArray(); + for (int i = 0; i < jsonArray.size(); i++) { + JsonObject jsonObject = jsonArray.get(i).getAsJsonObject(); + if ((extension.version == null || extension.version.isEmpty()) && jsonObject.has("version")) { + project.setVersion(jsonObject.get("version").getAsString()); + } + if (jsonObject.has("group")) { + project.setGroup(jsonObject.get("group").getAsString()); + } + if (jsonObject.has("description")) { + project.setDescription(jsonObject.get("description").getAsString()); + } } - if (jsonObject.has("group")) { - project.setGroup(jsonObject.get("group").getAsString()); - } - if (jsonObject.has("description")) { - project.setDescription(jsonObject.get("description").getAsString()); - } - //TODO load deps } catch (FileNotFoundException e) { //This wont happen as we have checked for it From b298dd2a1b6e2e096321ae93f179bceabd38b703 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Tue, 15 May 2018 21:35:58 +0100 Subject: [PATCH 23/54] include pack.mcmeta + more log4j stuff --- src/main/java/net/fabricmc/loom/task/MapJarsTask.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/fabricmc/loom/task/MapJarsTask.java b/src/main/java/net/fabricmc/loom/task/MapJarsTask.java index b80471b..49b83db 100644 --- a/src/main/java/net/fabricmc/loom/task/MapJarsTask.java +++ b/src/main/java/net/fabricmc/loom/task/MapJarsTask.java @@ -76,7 +76,7 @@ public class MapJarsTask extends DefaultTask { tempAssests.mkdir(); ZipUtil.unpack(Constants.MINECRAFT_CLIENT_JAR.get(extension), tempAssests, name -> { - if (name.startsWith("assets") || name.startsWith("data") || name.startsWith("log4j2.xml") || name.startsWith("pack.png")) { + if (name.startsWith("assets") || name.startsWith("pack.mcmeta") || name.startsWith("data") || name.toLowerCase().startsWith("log4j2") || name.startsWith("pack.png")) { return name; } else { return null; From d8609346dda6b4283f9b69884c31cdec10b7687d Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Wed, 16 May 2018 14:26:12 +0100 Subject: [PATCH 24/54] Update engima --- build.gradle | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 115fac1..d60c674 100644 --- a/build.gradle +++ b/build.gradle @@ -50,8 +50,11 @@ dependencies { shade 'com.google.code.gson:gson:2.6.2' shade 'commons-io:commons-io:1.4' shade 'com.google.guava:guava:19.0' - shade 'net.fabricmc:weave:0.1.0.+' - shade 'cuchaz:enigma:0.11.0.+:lib' + shade ('net.fabricmc:weave:0.1.0.+'){ + transitive = false + } + shade 'org.ow2.asm:asm-debug-all:5.2' + shade 'cuchaz:enigma:0.11.0.33:lib' shade 'net.fabricmc:tiny-remapper:+' shade ('net.minecraft:launchwrapper:1.12') { From 527000ed2487889823aaac1951a2a211fd8f2227 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 18 Jun 2018 16:16:03 +0100 Subject: [PATCH 25/54] Inital work on getting the prebaker to work, still very broken but things have worked --- build.gradle | 6 +- .../net/fabricmc/loom/AbstractPlugin.java | 10 ++- .../fabricmc/loom/LoomGradleExtension.java | 6 +- .../loom/mixin/MixinServiceGradle.java | 63 +++++++++++++++++++ .../loom/util/proccessing/MixinPrebaker.java | 58 ++++++++++++----- .../loom/util/proccessing/PreBakeMixins.java | 3 +- ...rg.spongepowered.asm.service.IMixinService | 1 + 7 files changed, 122 insertions(+), 25 deletions(-) create mode 100644 src/main/java/net/fabricmc/loom/mixin/MixinServiceGradle.java create mode 100644 src/main/resources/META-INF/services/org.spongepowered.asm.service.IMixinService diff --git a/build.gradle b/build.gradle index d60c674..e86cc36 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ targetCompatibility = 1.8 group = 'com.openmodloader' archivesBaseName = project.name -version = '0.0.8-SNAPSHOT' +version = '0.0.9-SNAPSHOT' repositories { mavenCentral() @@ -56,6 +56,10 @@ dependencies { shade 'org.ow2.asm:asm-debug-all:5.2' shade 'cuchaz:enigma:0.11.0.33:lib' shade 'net.fabricmc:tiny-remapper:+' + shade 'net.sf.jopt-simple:jopt-simple:5.0.4' + shade 'org.apache.logging.log4j:log4j-api:2.11.0' + shade 'org.apache.logging.log4j:log4j-core:2.11.0' + shade ('net.minecraft:launchwrapper:1.12') { transitive = false diff --git a/src/main/java/net/fabricmc/loom/AbstractPlugin.java b/src/main/java/net/fabricmc/loom/AbstractPlugin.java index a11bf1b..141bd81 100644 --- a/src/main/java/net/fabricmc/loom/AbstractPlugin.java +++ b/src/main/java/net/fabricmc/loom/AbstractPlugin.java @@ -210,6 +210,11 @@ public class AbstractPlugin implements Plugin { mavenArtifactRepository.setUrl("http://maven.fabricmc.net/"); }); + project1.getRepositories().maven(mavenArtifactRepository -> { + mavenArtifactRepository.setName("modmuss50"); + mavenArtifactRepository.setUrl("https://maven.modmuss50.me"); + }); + project1.getRepositories().maven(mavenArtifactRepository -> { mavenArtifactRepository.setName("SpongePowered"); mavenArtifactRepository.setUrl("http://repo.spongepowered.org/maven"); @@ -241,11 +246,10 @@ public class AbstractPlugin implements Plugin { } project1.getDependencies().add(Constants.CONFIG_MC_DEPENDENCIES, "net.minecraft:" + Constants.MINECRAFT_FINAL_JAR.get(extension).getName().replace(".jar", "")); - if (extension.fabricVersion != null && !extension.fabricVersion.isEmpty()) { + if (extension.omlVersion != null && !extension.omlVersion.isEmpty()) { //only add this when not in a fabric dev env - project1.getDependencies().add(Constants.CONFIG_MC_DEPENDENCIES, "net.fabricmc:fabric-base:" + extension.version + "-" + extension.fabricVersion + ":deobf"); + project1.getDependencies().add(Constants.COMPILE_MODS, "OpenModLoader:OpenModLoader:" + extension.version + "-" + extension.omlVersion); } - project1.getDependencies().add(Constants.PROCESS_MODS_DEPENDENCIES, "net.fabricmc:fabric-base:16w38a-0.0.4-SNAPSHOT"); }); project.getTasks().getByName("build").doLast(task -> { diff --git a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java index 2ffb196..1b2fbd8 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java +++ b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java @@ -31,7 +31,7 @@ import java.io.File; public class LoomGradleExtension { public String version; public String runDir = "run"; - public String fabricVersion; + public String omlVersion; public String pomfVersion; public String refmapName; public boolean localMappings = false; @@ -41,13 +41,13 @@ public class LoomGradleExtension { public String getVersionString() { if (isModWorkspace()) { - return version + "-" + fabricVersion; + return version + "-" + omlVersion; } return version; } public boolean isModWorkspace() { - return fabricVersion != null && !fabricVersion.isEmpty(); + return omlVersion != null && !omlVersion.isEmpty(); } public File getUserCache() { diff --git a/src/main/java/net/fabricmc/loom/mixin/MixinServiceGradle.java b/src/main/java/net/fabricmc/loom/mixin/MixinServiceGradle.java new file mode 100644 index 0000000..c1ca596 --- /dev/null +++ b/src/main/java/net/fabricmc/loom/mixin/MixinServiceGradle.java @@ -0,0 +1,63 @@ +package net.fabricmc.loom.mixin; + +import com.google.common.io.ByteStreams; +import org.spongepowered.asm.service.IClassBytecodeProvider; +import org.spongepowered.asm.service.mojang.MixinServiceLaunchWrapper; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.jar.JarFile; +import java.util.zip.ZipEntry; + +public class MixinServiceGradle extends MixinServiceLaunchWrapper implements IClassBytecodeProvider { + + private static List jars = new ArrayList<>(); + + @Override + public String getName() { + return "OpenModLoaderGradle"; + } + + @Override + public InputStream getResourceAsStream(String name) { + for(JarFile file : jars){ + ZipEntry entry = file.getEntry(name); + if(entry != null){ + try { + InputStream stream = file.getInputStream(entry); + return stream; + } catch (IOException e) { + throw new RuntimeException("Failed to read mod file", e); + } + } + } + return super.getResourceAsStream(name); + } + + public static void setupModFiles(Set mods, File minecraft) throws IOException { + jars.clear(); + for(File mod : mods){ + JarFile jarFile = new JarFile(mod); + jars.add(jarFile); + } + jars.add(new JarFile(minecraft)); + } + + @Override + public IClassBytecodeProvider getBytecodeProvider() { + return this; + } + + public byte[] getClassBytes(String name, String transformedName) throws IOException { + InputStream inputStream = getResourceAsStream(name.replace(".", "/") + ".class"); + byte[] classBytes = ByteStreams.toByteArray(inputStream); + if(classBytes == null){ + return super.getClassBytes(name, transformedName); + } + return classBytes; + } +} diff --git a/src/main/java/net/fabricmc/loom/util/proccessing/MixinPrebaker.java b/src/main/java/net/fabricmc/loom/util/proccessing/MixinPrebaker.java index 799e79b..de2c24a 100644 --- a/src/main/java/net/fabricmc/loom/util/proccessing/MixinPrebaker.java +++ b/src/main/java/net/fabricmc/loom/util/proccessing/MixinPrebaker.java @@ -16,15 +16,20 @@ package net.fabricmc.loom.util.proccessing; import com.google.common.base.Charsets; +import com.google.common.base.Predicate; import com.google.common.io.ByteStreams; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import net.fabricmc.loom.mixin.MixinServiceGradle; import net.minecraft.launchwrapper.Launch; import net.minecraft.launchwrapper.LaunchClassLoader; import org.objectweb.asm.*; import org.spongepowered.asm.launch.GlobalProperties; +import org.spongepowered.asm.launch.MixinBootstrap; import org.spongepowered.asm.mixin.EnvironmentStateTweaker; +import org.spongepowered.asm.mixin.MixinEnvironment; +import org.spongepowered.asm.mixin.Mixins; import org.spongepowered.asm.mixin.transformer.MixinTransformer; import org.spongepowered.asm.service.mojang.MixinServiceLaunchWrapper; @@ -116,8 +121,9 @@ public class MixinPrebaker { public static final String APPLIED_MIXIN_CONFIGS_FILENAME = ".oml-applied-mixin-configs"; public static final String MAPPINGS_FILENAME = ".oml-dev-mappings.tiny"; + public static MixinTransformer mixinTransformer; - public static void main(String[] args) { + public static void main(String[] args) throws IOException { boolean hasMappingsFile = false; if (args.length < 3) { @@ -148,17 +154,8 @@ public class MixinPrebaker { Launch.blackboard = new HashMap<>(); Launch.blackboard.put(MixinServiceLaunchWrapper.BLACKBOARD_KEY_TWEAKS, Collections.emptyList()); - List modInfo = findModInfo(modFiles); - List mods = new ArrayList<>(); - for(JsonObject modInfoJson : modInfo){ - if(!modInfoJson.isJsonArray()){ - continue; - } - JsonArray jsonArray = modInfoJson.getAsJsonArray(); - for (int i = 0; i < jsonArray.size(); i++) { - mods.add(jsonArray.get(i).getAsJsonObject()); - } - } + List mods = findModInfo(modFiles); + System.out.println("Found " + mods.size() + " mods"); List mixins = new ArrayList<>(); for(JsonObject modObject : mods){ mixins.addAll(findMixins(modObject.getAsJsonArray("mixins"))); @@ -167,11 +164,30 @@ public class MixinPrebaker { } System.out.println("Found " + mixins.size() + " mixins to pre bake"); + List tweakers = new ArrayList<>(); + tweakers.add("com.openmodloader.loader.launch.OpenTweaker"); + GlobalProperties.put("TweakClasses", tweakers); + + MixinBootstrap.init(); + mixins.forEach(Mixins::addConfiguration); + + MixinServiceGradle.setupModFiles(modFiles, new File(args[argOffset + 0])); + EnvironmentStateTweaker tweaker = new EnvironmentStateTweaker(); tweaker.getLaunchArguments(); tweaker.injectIntoClassLoader(Launch.classLoader); - MixinTransformer mixinTransformer = GlobalProperties.get(GlobalProperties.Keys.TRANSFORMER); + if(mixinTransformer == null){ + mixinTransformer = GlobalProperties.get(GlobalProperties.Keys.TRANSFORMER); + } + //Check to ensure its not null + if(mixinTransformer == null){ + throw new RuntimeException("Failed to get MixinTransformer!"); + } + + MixinEnvironment mixinEnvironment = MixinEnvironment.getDefaultEnvironment(); + mixinEnvironment.setSide(MixinEnvironment.Side.CLIENT); //TODO have an all side? + mixinTransformer.audit(mixinEnvironment); try { JarInputStream input = new JarInputStream(new FileInputStream(new File(args[argOffset + 0]))); @@ -233,21 +249,29 @@ public class MixinPrebaker { } private static List findModInfo(Set mods){ - return mods.stream().map(file -> { + List modFiles = mods.stream().map(file -> { try { JarFile jar = new JarFile(file); return readModInfoFromJar(jar); } catch (IOException e) { throw new RuntimeException("Failed to mod " + file.getName(), e); } - }).collect(Collectors.toList()); + }).filter((Predicate) Objects::nonNull).collect(Collectors.toList()); + + List containedMods = new ArrayList<>(); + for(JsonArray modFile : modFiles){ + for (int i = 0; i < modFile.size(); i++) { + containedMods.add(modFile.get(i).getAsJsonObject()); + } + } + return containedMods; } - private static JsonObject readModInfoFromJar(@Nonnull JarFile file) throws IOException { + private static JsonArray readModInfoFromJar(@Nonnull JarFile file) throws IOException { Gson gson = new Gson(); ZipEntry entry = file.getEntry("mod.json"); if (entry == null) return null; - return gson.fromJson(new InputStreamReader(file.getInputStream(entry)), JsonObject.class); + return gson.fromJson(new InputStreamReader(file.getInputStream(entry)), JsonArray.class); } } \ No newline at end of file diff --git a/src/main/java/net/fabricmc/loom/util/proccessing/PreBakeMixins.java b/src/main/java/net/fabricmc/loom/util/proccessing/PreBakeMixins.java index 45635d5..9be07f4 100644 --- a/src/main/java/net/fabricmc/loom/util/proccessing/PreBakeMixins.java +++ b/src/main/java/net/fabricmc/loom/util/proccessing/PreBakeMixins.java @@ -30,11 +30,12 @@ import net.fabricmc.loom.util.Constants; import org.gradle.api.Project; import java.io.File; +import java.io.IOException; import java.util.List; public class PreBakeMixins { - public void proccess(Project project, LoomGradleExtension extension, List mods) { + public void proccess(Project project, LoomGradleExtension extension, List mods) throws IOException { project.getLogger().lifecycle(":Found " + mods.size() + " mods to prebake"); String[] args = new String[mods.size() + 4]; args[0] = "-m"; diff --git a/src/main/resources/META-INF/services/org.spongepowered.asm.service.IMixinService b/src/main/resources/META-INF/services/org.spongepowered.asm.service.IMixinService new file mode 100644 index 0000000..75ed11a --- /dev/null +++ b/src/main/resources/META-INF/services/org.spongepowered.asm.service.IMixinService @@ -0,0 +1 @@ +net.fabricmc.loom.mixin.MixinServiceGradle \ No newline at end of file From cc23189335b17751ea20f2f5e924375f20bb6ff1 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 18 Jun 2018 16:41:50 +0100 Subject: [PATCH 26/54] Small tweaks --- .../java/com/openmodloader/gradle/OpenGradlePlugin.java | 6 +++--- src/main/java/net/fabricmc/loom/AbstractPlugin.java | 2 +- .../net/fabricmc/loom/util/proccessing/PreBakeMixins.java | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/openmodloader/gradle/OpenGradlePlugin.java b/src/main/java/com/openmodloader/gradle/OpenGradlePlugin.java index 6dce25d..bd06f2c 100644 --- a/src/main/java/com/openmodloader/gradle/OpenGradlePlugin.java +++ b/src/main/java/com/openmodloader/gradle/OpenGradlePlugin.java @@ -36,9 +36,9 @@ public class OpenGradlePlugin extends AbstractPlugin { makeTask("download", DownloadTask.class); makeTask("mergeJars", MergeJarsTask.class).dependsOn("download"); - makeTask("mapJars", MapJarsTask.class).dependsOn("mergeJars"); - makeTask("processMods", ProcessModsTask.class).dependsOn("mapJars"); - makeTask("setup", DefaultTask.class).dependsOn("processMods").setGroup("openmodloader"); + makeTask("processMods", ProcessModsTask.class).dependsOn("mergeJars"); + makeTask("mapJars", MapJarsTask.class).dependsOn("processMods"); + makeTask("setup", DefaultTask.class).dependsOn("mapJars").setGroup("openmodloader"); makeTask("extractNatives", ExtractNativesTask.class).dependsOn("download"); makeTask("genIdeaWorkspace", GenIdeaProjectTask.class).dependsOn("idea").setGroup("ide"); diff --git a/src/main/java/net/fabricmc/loom/AbstractPlugin.java b/src/main/java/net/fabricmc/loom/AbstractPlugin.java index 141bd81..cd9fc24 100644 --- a/src/main/java/net/fabricmc/loom/AbstractPlugin.java +++ b/src/main/java/net/fabricmc/loom/AbstractPlugin.java @@ -252,7 +252,7 @@ public class AbstractPlugin implements Plugin { } }); - project.getTasks().getByName("build").doLast(task -> { + project.getTasks().getByName("jar").doLast(task -> { project.getLogger().lifecycle(":remapping mods"); LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); try { diff --git a/src/main/java/net/fabricmc/loom/util/proccessing/PreBakeMixins.java b/src/main/java/net/fabricmc/loom/util/proccessing/PreBakeMixins.java index 9be07f4..1ef5228 100644 --- a/src/main/java/net/fabricmc/loom/util/proccessing/PreBakeMixins.java +++ b/src/main/java/net/fabricmc/loom/util/proccessing/PreBakeMixins.java @@ -40,13 +40,13 @@ public class PreBakeMixins { String[] args = new String[mods.size() + 4]; args[0] = "-m"; args[1] = Constants.MAPPINGS_TINY.get(extension).getAbsolutePath(); - args[2] = Constants.MINECRAFT_MAPPED_JAR.get(extension).getAbsolutePath(); - args[3] = Constants.MINECRAFT_FINAL_JAR.get(extension).getAbsolutePath(); + args[2] = Constants.MINECRAFT_MERGED_JAR.get(extension).getAbsolutePath(); + args[3] = Constants.MINECRAFT_MAPPED_JAR.get(extension).getAbsolutePath(); for (int i = 0; i < mods.size(); i++) { args[i + 4] = mods.get(i).getAbsolutePath(); } project.getLogger().lifecycle(":preBaking mixins"); - ProcessModsTask.addFile(Constants.MINECRAFT_MAPPED_JAR.get(extension), this); + ProcessModsTask.addFile(Constants.MINECRAFT_MERGED_JAR.get(extension), this); MixinPrebaker.main(args); } From 69f15e870cb812152bb56d2713b95520f3ca8885 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 18 Jun 2018 16:55:51 +0100 Subject: [PATCH 27/54] Ensure file is moved --- src/main/java/net/fabricmc/loom/util/ModRemapper.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/fabricmc/loom/util/ModRemapper.java b/src/main/java/net/fabricmc/loom/util/ModRemapper.java index 20d0ddd..f4d5dba 100644 --- a/src/main/java/net/fabricmc/loom/util/ModRemapper.java +++ b/src/main/java/net/fabricmc/loom/util/ModRemapper.java @@ -28,6 +28,7 @@ import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.tinyremapper.OutputConsumerPath; import net.fabricmc.tinyremapper.TinyRemapper; import net.fabricmc.tinyremapper.TinyUtils; +import org.apache.commons.io.FileUtils; import org.gradle.api.Project; import java.io.File; @@ -53,8 +54,11 @@ public class ModRemapper { deobfJar.delete(); } + FileUtils.touch(modJar); //Done to ensure that the file can be moved //Move the pre existing mod jar to the deobf jar - modJar.renameTo(deobfJar); + if(!modJar.renameTo(deobfJar)){ + throw new RuntimeException("Failed to rename " + modJar); + } Path mappings = Constants.MAPPINGS_TINY.get(extension).toPath(); From 1893966038d3315c7f961b99472838e70359a2f4 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 18 Jun 2018 17:01:39 +0100 Subject: [PATCH 28/54] throw an error if a jar is missing --- src/main/java/net/fabricmc/loom/util/ModRemapper.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/net/fabricmc/loom/util/ModRemapper.java b/src/main/java/net/fabricmc/loom/util/ModRemapper.java index f4d5dba..c8a1285 100644 --- a/src/main/java/net/fabricmc/loom/util/ModRemapper.java +++ b/src/main/java/net/fabricmc/loom/util/ModRemapper.java @@ -90,6 +90,10 @@ public class ModRemapper { outputConsumer.finish(); remapper.finish(); + if(!deobfJar.exists() || !modJar.exists()){ + throw new RuntimeException("Failed to remap jar"); + } + //Add the deobf jar to be uploaded to maven project.getArtifacts().add("archives", deobfJar); } From 0b75f4d2849e7449e8762c34a591bf2fd8903aca Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Tue, 19 Jun 2018 10:43:40 +0100 Subject: [PATCH 29/54] Should fix OML build --- src/main/java/net/fabricmc/loom/task/ProcessModsTask.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/fabricmc/loom/task/ProcessModsTask.java b/src/main/java/net/fabricmc/loom/task/ProcessModsTask.java index 8496c05..105b51c 100644 --- a/src/main/java/net/fabricmc/loom/task/ProcessModsTask.java +++ b/src/main/java/net/fabricmc/loom/task/ProcessModsTask.java @@ -57,7 +57,7 @@ public class ProcessModsTask extends DefaultTask { Constants.MINECRAFT_FINAL_JAR.get(extension).delete(); } if (mods.size() == 0) { - FileUtils.copyFile(Constants.MINECRAFT_MAPPED_JAR.get(extension), Constants.MINECRAFT_FINAL_JAR.get(extension)); + FileUtils.copyFile(Constants.MINECRAFT_MERGED_JAR.get(extension), Constants.MINECRAFT_MAPPED_JAR.get(extension)); } else { downloadRequiredDeps(extension); new PreBakeMixins().proccess(getProject(), extension, mods); From 65bebb6fbc654adff73ece37ea7f7dcde001fe8b Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Tue, 19 Jun 2018 10:49:10 +0100 Subject: [PATCH 30/54] Should fix OML build part 2 --- src/main/java/net/fabricmc/loom/task/MapJarsTask.java | 4 ++-- src/main/java/net/fabricmc/loom/task/ProcessModsTask.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/task/MapJarsTask.java b/src/main/java/net/fabricmc/loom/task/MapJarsTask.java index 49b83db..41d9660 100644 --- a/src/main/java/net/fabricmc/loom/task/MapJarsTask.java +++ b/src/main/java/net/fabricmc/loom/task/MapJarsTask.java @@ -55,7 +55,7 @@ public class MapJarsTask extends DefaultTask { } if(!extension.hasPomf()){ this.getLogger().lifecycle("POMF version not set, skipping mapping!"); - FileUtils.copyFile(Constants.MINECRAFT_MERGED_JAR.get(extension), Constants.MINECRAFT_MAPPED_JAR.get(extension)); + FileUtils.copyFile(Constants.MINECRAFT_MIXED_JAR.get(extension), Constants.MINECRAFT_MAPPED_JAR.get(extension)); return; } if (!Constants.MAPPINGS_DIR.get(extension).exists() || extension.localMappings) { @@ -65,7 +65,7 @@ public class MapJarsTask extends DefaultTask { } this.getLogger().lifecycle(":remapping jar"); - deobfuscator = new Deobfuscator(new JarFile(Constants.MINECRAFT_MERGED_JAR.get(extension))); + deobfuscator = new Deobfuscator(new JarFile(Constants.MINECRAFT_MIXED_JAR.get(extension))); this.deobfuscator.setMappings(new MappingsEnigmaReader().read(Constants.MAPPINGS_DIR.get(extension))); writeJar(Constants.MINECRAFT_MAPPED_JAR.get(extension), new ProgressListener(), deobfuscator); diff --git a/src/main/java/net/fabricmc/loom/task/ProcessModsTask.java b/src/main/java/net/fabricmc/loom/task/ProcessModsTask.java index 105b51c..2dcf979 100644 --- a/src/main/java/net/fabricmc/loom/task/ProcessModsTask.java +++ b/src/main/java/net/fabricmc/loom/task/ProcessModsTask.java @@ -57,7 +57,7 @@ public class ProcessModsTask extends DefaultTask { Constants.MINECRAFT_FINAL_JAR.get(extension).delete(); } if (mods.size() == 0) { - FileUtils.copyFile(Constants.MINECRAFT_MERGED_JAR.get(extension), Constants.MINECRAFT_MAPPED_JAR.get(extension)); + FileUtils.copyFile(Constants.MINECRAFT_MERGED_JAR.get(extension), Constants.MINECRAFT_MIXED_JAR.get(extension)); } else { downloadRequiredDeps(extension); new PreBakeMixins().proccess(getProject(), extension, mods); From 9e4012571a8f06e42a6bf50c7cd08a37d49184d7 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Tue, 19 Jun 2018 11:04:39 +0100 Subject: [PATCH 31/54] Lets get it working, and then write clean code --- .../gradle/OpenGradlePlugin.java | 3 +- .../loom/mixin/MixinServiceGradle.java | 14 ++++ .../net/fabricmc/loom/task/FinaliseJar.java | 23 ++++++ .../net/fabricmc/loom/task/MapJarsTask.java | 2 +- .../fabricmc/loom/task/ProcessModsTask.java | 1 + .../net/fabricmc/loom/util/Constants.java | 3 +- .../util/proccessing/MixinDevRemapper.java | 75 +++++++++++++++++++ .../loom/util/proccessing/MixinPrebaker.java | 60 ++++++++++++--- .../loom/util/proccessing/PreBakeMixins.java | 6 +- 9 files changed, 171 insertions(+), 16 deletions(-) create mode 100644 src/main/java/net/fabricmc/loom/task/FinaliseJar.java create mode 100644 src/main/java/net/fabricmc/loom/util/proccessing/MixinDevRemapper.java diff --git a/src/main/java/com/openmodloader/gradle/OpenGradlePlugin.java b/src/main/java/com/openmodloader/gradle/OpenGradlePlugin.java index bd06f2c..a1efb20 100644 --- a/src/main/java/com/openmodloader/gradle/OpenGradlePlugin.java +++ b/src/main/java/com/openmodloader/gradle/OpenGradlePlugin.java @@ -38,7 +38,8 @@ public class OpenGradlePlugin extends AbstractPlugin { makeTask("mergeJars", MergeJarsTask.class).dependsOn("download"); makeTask("processMods", ProcessModsTask.class).dependsOn("mergeJars"); makeTask("mapJars", MapJarsTask.class).dependsOn("processMods"); - makeTask("setup", DefaultTask.class).dependsOn("mapJars").setGroup("openmodloader"); + makeTask("finaliseJars", FinaliseJar.class).dependsOn("mapJars"); + makeTask("setup", DefaultTask.class).dependsOn("finaliseJars").setGroup("openmodloader"); makeTask("extractNatives", ExtractNativesTask.class).dependsOn("download"); makeTask("genIdeaWorkspace", GenIdeaProjectTask.class).dependsOn("idea").setGroup("ide"); diff --git a/src/main/java/net/fabricmc/loom/mixin/MixinServiceGradle.java b/src/main/java/net/fabricmc/loom/mixin/MixinServiceGradle.java index c1ca596..d38c8a5 100644 --- a/src/main/java/net/fabricmc/loom/mixin/MixinServiceGradle.java +++ b/src/main/java/net/fabricmc/loom/mixin/MixinServiceGradle.java @@ -1,6 +1,8 @@ package net.fabricmc.loom.mixin; import com.google.common.io.ByteStreams; +import net.fabricmc.loom.task.ProcessModsTask; +import net.fabricmc.loom.util.proccessing.MixinPrebaker; import org.spongepowered.asm.service.IClassBytecodeProvider; import org.spongepowered.asm.service.mojang.MixinServiceLaunchWrapper; @@ -17,6 +19,7 @@ public class MixinServiceGradle extends MixinServiceLaunchWrapper implements ICl private static List jars = new ArrayList<>(); + @Override public String getName() { return "OpenModLoaderGradle"; @@ -24,6 +27,9 @@ public class MixinServiceGradle extends MixinServiceLaunchWrapper implements ICl @Override public InputStream getResourceAsStream(String name) { + if(MixinPrebaker.jarFileCache.containsKey(name)){ + return MixinPrebaker.jarFileCache.get(name); + } for(JarFile file : jars){ ZipEntry entry = file.getEntry(name); if(entry != null){ @@ -47,6 +53,14 @@ public class MixinServiceGradle extends MixinServiceLaunchWrapper implements ICl jars.add(new JarFile(minecraft)); } + public static void addMCDeps(Set deps, Object object) throws IOException { + for(File mod : deps){ + JarFile jarFile = new JarFile(mod); + jars.add(jarFile); + ProcessModsTask.addFile(mod, object); + } + } + @Override public IClassBytecodeProvider getBytecodeProvider() { return this; diff --git a/src/main/java/net/fabricmc/loom/task/FinaliseJar.java b/src/main/java/net/fabricmc/loom/task/FinaliseJar.java new file mode 100644 index 0000000..cbc48ec --- /dev/null +++ b/src/main/java/net/fabricmc/loom/task/FinaliseJar.java @@ -0,0 +1,23 @@ +package net.fabricmc.loom.task; + +import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.util.Constants; +import org.apache.commons.io.FileUtils; +import org.gradle.api.DefaultTask; +import org.gradle.api.tasks.TaskAction; + +import java.io.IOException; + +public class FinaliseJar extends DefaultTask { + + @TaskAction + public void finalisejar() throws IOException { + LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); + if(Constants.MINECRAFT_FINAL_JAR.get(extension).exists()){ + Constants.MINECRAFT_FINAL_JAR.get(extension).delete(); + } + FileUtils.copyFile(Constants.MINECRAFT_MAPPED_JAR.get(extension), Constants.MINECRAFT_FINAL_JAR.get(extension)); + } + + +} diff --git a/src/main/java/net/fabricmc/loom/task/MapJarsTask.java b/src/main/java/net/fabricmc/loom/task/MapJarsTask.java index 41d9660..7a18a0f 100644 --- a/src/main/java/net/fabricmc/loom/task/MapJarsTask.java +++ b/src/main/java/net/fabricmc/loom/task/MapJarsTask.java @@ -48,7 +48,7 @@ public class MapJarsTask extends DefaultTask { @TaskAction public void mapJars() throws IOException, MappingParseException { LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); - if (!Constants.MINECRAFT_MAPPED_JAR.get(extension).exists() || extension.localMappings) { + if (!Constants.MINECRAFT_MAPPED_JAR.get(extension).exists() || extension.localMappings || true) { if(extension.localMappings && Constants.MINECRAFT_MAPPED_JAR.get(extension).exists()){ //Always remap the jar when using local mappings. Constants.MINECRAFT_MAPPED_JAR.get(extension).delete(); diff --git a/src/main/java/net/fabricmc/loom/task/ProcessModsTask.java b/src/main/java/net/fabricmc/loom/task/ProcessModsTask.java index 2dcf979..66af582 100644 --- a/src/main/java/net/fabricmc/loom/task/ProcessModsTask.java +++ b/src/main/java/net/fabricmc/loom/task/ProcessModsTask.java @@ -57,6 +57,7 @@ public class ProcessModsTask extends DefaultTask { Constants.MINECRAFT_FINAL_JAR.get(extension).delete(); } if (mods.size() == 0) { + getProject().getLogger().lifecycle(":skipping mixin prebake"); FileUtils.copyFile(Constants.MINECRAFT_MERGED_JAR.get(extension), Constants.MINECRAFT_MIXED_JAR.get(extension)); } else { downloadRequiredDeps(extension); diff --git a/src/main/java/net/fabricmc/loom/util/Constants.java b/src/main/java/net/fabricmc/loom/util/Constants.java index ef48946..baeff33 100644 --- a/src/main/java/net/fabricmc/loom/util/Constants.java +++ b/src/main/java/net/fabricmc/loom/util/Constants.java @@ -40,8 +40,9 @@ public class Constants { public static final IDelayed MINECRAFT_CLIENT_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-client.jar")); public static final IDelayed MINECRAFT_SERVER_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-server.jar")); public static final IDelayed MINECRAFT_MERGED_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-merged.jar")); + public static final IDelayed MINECRAFT_MIXED_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-mixed.jar")); public static final IDelayed MINECRAFT_MAPPED_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.getVersionString() + "-mapped-" + extension.pomfVersion + ".jar")); - public static final IDelayed MINECRAFT_FINAL_JAR = new DelayedFile(extension -> new File(CACHE_FILES, extension.getVersionString() + "-mixed-" + extension.pomfVersion + ".jar")); + public static final IDelayed MINECRAFT_FINAL_JAR = new DelayedFile(extension -> new File(CACHE_FILES, extension.getVersionString() + "-final-" + extension.pomfVersion + ".jar")); public static final IDelayed POMF_DIR = new DelayedFile(extension -> new File(extension.getUserCache(), "pomf")); public static IDelayed MAPPINGS_ZIP = new DelayedFile(extension -> new File(POMF_DIR.get(extension), "pomf-enigma-" + extension.version + "." + extension.pomfVersion + ".zip")); diff --git a/src/main/java/net/fabricmc/loom/util/proccessing/MixinDevRemapper.java b/src/main/java/net/fabricmc/loom/util/proccessing/MixinDevRemapper.java new file mode 100644 index 0000000..4cde444 --- /dev/null +++ b/src/main/java/net/fabricmc/loom/util/proccessing/MixinDevRemapper.java @@ -0,0 +1,75 @@ +package net.fabricmc.loom.util.proccessing; + +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import net.fabricmc.tinyremapper.TinyUtils; +import org.objectweb.asm.commons.Remapper; +import org.spongepowered.asm.mixin.extensibility.IRemapper; + +import java.io.BufferedReader; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +public class MixinDevRemapper implements IRemapper { + private final BiMap classMap = HashBiMap.create(); + private final Map fieldMap = new HashMap<>(); + private final Map methodMap = new HashMap<>(); + + private final SimpleClassMapper classMapper = new SimpleClassMapper(classMap); + private final SimpleClassMapper classUnmapper = new SimpleClassMapper(classMap.inverse()); + + private static class SimpleClassMapper extends Remapper { + final Map classMap; + + public SimpleClassMapper(Map map) { + this.classMap = map; + } + + public String map(String typeName) { + return this.classMap.getOrDefault(typeName, typeName); + } + } + + public void readMapping(BufferedReader reader, String fromM, String toM) throws IOException { + TinyUtils.read(reader, fromM, toM, classMap::put, fieldMap::put, methodMap::put); + } + + @Override + public String mapMethodName(String owner, String name, String desc) { + TinyUtils.Mapping mapping = methodMap.get(new TinyUtils.Mapping(owner, name, desc)); + return mapping != null ? mapping.name : name; + } + + @Override + public String mapFieldName(String owner, String name, String desc) { + TinyUtils.Mapping mapping = fieldMap.get(new TinyUtils.Mapping(owner, name, desc)); + if(mapping == null){ + //We try again using obfed names + owner = unmap(owner); + desc = unmapDesc(desc); + mapping = fieldMap.get(new TinyUtils.Mapping(owner, name, desc)); + } + return mapping != null ? mapping.name : name; + } + + @Override + public String map(String typeName) { + return classMap.getOrDefault(typeName, typeName); + } + + @Override + public String unmap(String typeName) { + return classMap.inverse().getOrDefault(typeName, typeName); + } + + @Override + public String mapDesc(String desc) { + return classMapper.mapDesc(desc); + } + + @Override + public String unmapDesc(String desc) { + return classUnmapper.mapDesc(desc); + } +} \ No newline at end of file diff --git a/src/main/java/net/fabricmc/loom/util/proccessing/MixinPrebaker.java b/src/main/java/net/fabricmc/loom/util/proccessing/MixinPrebaker.java index de2c24a..f08bbd4 100644 --- a/src/main/java/net/fabricmc/loom/util/proccessing/MixinPrebaker.java +++ b/src/main/java/net/fabricmc/loom/util/proccessing/MixinPrebaker.java @@ -24,6 +24,7 @@ import com.google.gson.JsonObject; import net.fabricmc.loom.mixin.MixinServiceGradle; import net.minecraft.launchwrapper.Launch; import net.minecraft.launchwrapper.LaunchClassLoader; +import org.gradle.api.Project; import org.objectweb.asm.*; import org.spongepowered.asm.launch.GlobalProperties; import org.spongepowered.asm.launch.MixinBootstrap; @@ -31,6 +32,7 @@ import org.spongepowered.asm.mixin.EnvironmentStateTweaker; import org.spongepowered.asm.mixin.MixinEnvironment; import org.spongepowered.asm.mixin.Mixins; import org.spongepowered.asm.mixin.transformer.MixinTransformer; +import org.spongepowered.asm.service.MixinService; import org.spongepowered.asm.service.mojang.MixinServiceLaunchWrapper; import javax.annotation.Nonnull; @@ -121,9 +123,10 @@ public class MixinPrebaker { public static final String APPLIED_MIXIN_CONFIGS_FILENAME = ".oml-applied-mixin-configs"; public static final String MAPPINGS_FILENAME = ".oml-dev-mappings.tiny"; - public static MixinTransformer mixinTransformer; - public static void main(String[] args) throws IOException { + public static Map jarFileCache = new HashMap<>(); + + public static void main(String[] args, Project project) throws IOException { boolean hasMappingsFile = false; if (args.length < 3) { @@ -144,6 +147,8 @@ public class MixinPrebaker { } } + + Set modFiles = new HashSet<>(); for (int i = argOffset + 2; i < args.length; i++) { modFiles.add(new File(args[i])); @@ -173,22 +178,33 @@ public class MixinPrebaker { MixinServiceGradle.setupModFiles(modFiles, new File(args[argOffset + 0])); + EnvironmentStateTweaker tweaker = new EnvironmentStateTweaker(); tweaker.getLaunchArguments(); tweaker.injectIntoClassLoader(Launch.classLoader); - if(mixinTransformer == null){ - mixinTransformer = GlobalProperties.get(GlobalProperties.Keys.TRANSFORMER); - } - //Check to ensure its not null - if(mixinTransformer == null){ - throw new RuntimeException("Failed to get MixinTransformer!"); - } + //MixinServiceGradle.addMCDeps(project.getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES).getFiles(), tweaker); MixinEnvironment mixinEnvironment = MixinEnvironment.getDefaultEnvironment(); + + System.out.println("Loading mappings: " + mappingsFile); + InputStream mappingStream = new FileInputStream(mappingsFile); + MixinDevRemapper devRemapper = new MixinDevRemapper(); + devRemapper.readMapping(new BufferedReader(new InputStreamReader(mappingStream)), "pomf", "mojang"); + mappingStream.close(); + mixinEnvironment.getRemappers().add(devRemapper); + mixinEnvironment.setSide(MixinEnvironment.Side.CLIENT); //TODO have an all side? + + + MixinTransformer mixinTransformer = GlobalProperties.get(GlobalProperties.Keys.TRANSFORMER); + if(mixinTransformer == null){ + MixinService.getService().beginPhase(); + mixinTransformer = GlobalProperties.get(GlobalProperties.Keys.TRANSFORMER); + } mixinTransformer.audit(mixinEnvironment); + try { JarInputStream input = new JarInputStream(new FileInputStream(new File(args[argOffset + 0]))); JarOutputStream output = new JarOutputStream(new FileOutputStream(new File(args[argOffset + 1]))); @@ -272,6 +288,30 @@ public class MixinPrebaker { ZipEntry entry = file.getEntry("mod.json"); if (entry == null) return null; - return gson.fromJson(new InputStreamReader(file.getInputStream(entry)), JsonArray.class); + + InputStreamReader stream = new InputStreamReader(file.getInputStream(entry)); + JsonArray jsonArray = gson.fromJson(stream, JsonArray.class); + stream.close(); + + List mixins = new ArrayList<>(); + for (int i = 0; i < jsonArray.size(); i++) { + JsonObject modObject = jsonArray.get(i).getAsJsonObject(); + mixins.addAll(findMixins(modObject.getAsJsonArray("mixins"))); + mixins.addAll(findMixins(modObject.getAsJsonArray("clientMixins"))); + mixins.addAll(findMixins(modObject.getAsJsonArray("serverMixins"))); + } + + System.out.println("Found: " + mixins.size() + " mixins in " + file.getName()); + + mixins.forEach(s -> { + ZipEntry entry1 = file.getEntry(s); + try { + jarFileCache.put(s, file.getInputStream(entry1)); + } catch (IOException e) { + throw new RuntimeException("Failed to load jar", e); + } + }); + return jsonArray; } + } \ No newline at end of file diff --git a/src/main/java/net/fabricmc/loom/util/proccessing/PreBakeMixins.java b/src/main/java/net/fabricmc/loom/util/proccessing/PreBakeMixins.java index 1ef5228..accdc66 100644 --- a/src/main/java/net/fabricmc/loom/util/proccessing/PreBakeMixins.java +++ b/src/main/java/net/fabricmc/loom/util/proccessing/PreBakeMixins.java @@ -41,13 +41,13 @@ public class PreBakeMixins { args[0] = "-m"; args[1] = Constants.MAPPINGS_TINY.get(extension).getAbsolutePath(); args[2] = Constants.MINECRAFT_MERGED_JAR.get(extension).getAbsolutePath(); - args[3] = Constants.MINECRAFT_MAPPED_JAR.get(extension).getAbsolutePath(); + args[3] = Constants.MINECRAFT_MIXED_JAR.get(extension).getAbsolutePath(); for (int i = 0; i < mods.size(); i++) { args[i + 4] = mods.get(i).getAbsolutePath(); } project.getLogger().lifecycle(":preBaking mixins"); - ProcessModsTask.addFile(Constants.MINECRAFT_MERGED_JAR.get(extension), this); - MixinPrebaker.main(args); + ProcessModsTask.addFile(Constants.MINECRAFT_MIXED_JAR.get(extension), this); + MixinPrebaker.main(args, project); } } From fb94d092ad247ad448e6d0ec0dc5b1ec447ee887 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Wed, 20 Jun 2018 13:12:02 +0100 Subject: [PATCH 32/54] Add skipPrebake --- src/main/java/net/fabricmc/loom/LoomGradleExtension.java | 1 + src/main/java/net/fabricmc/loom/task/ProcessModsTask.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java index 1b2fbd8..fe42321 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java +++ b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java @@ -34,6 +34,7 @@ public class LoomGradleExtension { public String omlVersion; public String pomfVersion; public String refmapName; + public boolean skipPrebake = false; public boolean localMappings = false; //Not to be set in the build.gradle diff --git a/src/main/java/net/fabricmc/loom/task/ProcessModsTask.java b/src/main/java/net/fabricmc/loom/task/ProcessModsTask.java index 66af582..fdbe413 100644 --- a/src/main/java/net/fabricmc/loom/task/ProcessModsTask.java +++ b/src/main/java/net/fabricmc/loom/task/ProcessModsTask.java @@ -56,7 +56,7 @@ public class ProcessModsTask extends DefaultTask { if (Constants.MINECRAFT_FINAL_JAR.get(extension).exists()) { Constants.MINECRAFT_FINAL_JAR.get(extension).delete(); } - if (mods.size() == 0) { + if (mods.size() == 0 || extension.skipPrebake) { getProject().getLogger().lifecycle(":skipping mixin prebake"); FileUtils.copyFile(Constants.MINECRAFT_MERGED_JAR.get(extension), Constants.MINECRAFT_MIXED_JAR.get(extension)); } else { From 5296c986066a81f963217e6e678cbc32c98d10ff Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Wed, 20 Jun 2018 13:19:44 +0100 Subject: [PATCH 33/54] Fix OML not being in IDE's scopes --- src/main/java/net/fabricmc/loom/AbstractPlugin.java | 2 ++ src/main/java/net/fabricmc/loom/task/ProcessModsTask.java | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/fabricmc/loom/AbstractPlugin.java b/src/main/java/net/fabricmc/loom/AbstractPlugin.java index cd9fc24..cd4e9dc 100644 --- a/src/main/java/net/fabricmc/loom/AbstractPlugin.java +++ b/src/main/java/net/fabricmc/loom/AbstractPlugin.java @@ -169,10 +169,12 @@ public class AbstractPlugin implements Plugin { ideaModule.getModule().setDownloadSources(true); ideaModule.getModule().setInheritOutputDirs(true); ideaModule.getModule().getScopes().get("COMPILE").get("plus").add(project.getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES)); + ideaModule.getModule().getScopes().get("COMPILE").get("plus").add(project.getConfigurations().getByName(Constants.COMPILE_MODS)); // ECLIPSE EclipseModel eclipseModule = (EclipseModel) project.getExtensions().getByName("eclipse"); eclipseModule.getClasspath().getPlusConfigurations().add(project.getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES)); + eclipseModule.getClasspath().getPlusConfigurations().add(project.getConfigurations().getByName(Constants.COMPILE_MODS)); } /** diff --git a/src/main/java/net/fabricmc/loom/task/ProcessModsTask.java b/src/main/java/net/fabricmc/loom/task/ProcessModsTask.java index fdbe413..697662f 100644 --- a/src/main/java/net/fabricmc/loom/task/ProcessModsTask.java +++ b/src/main/java/net/fabricmc/loom/task/ProcessModsTask.java @@ -50,7 +50,7 @@ public class ProcessModsTask extends DefaultTask { Configuration configuration = getProject().getConfigurations().getByName(Constants.COMPILE_MODS); List mods = new ArrayList<>(); for (ResolvedArtifact artifact : configuration.getResolvedConfiguration().getResolvedArtifacts()) { - getProject().getLogger().lifecycle(":found mod to mix:" + artifact.getFile().getName()); + //getProject().getLogger().lifecycle(":found mod to mix:" + artifact.getFile().getName()); mods.add(artifact.getFile()); } if (Constants.MINECRAFT_FINAL_JAR.get(extension).exists()) { From b598d876808b9724d4b9c96d4b1b291ba2399466 Mon Sep 17 00:00:00 2001 From: gegy1000 Date: Sat, 23 Jun 2018 09:53:53 +0200 Subject: [PATCH 34/54] Update enigma --- build.gradle | 4 ++-- .../java/net/fabricmc/loom/task/MapJarsTask.java | 13 +++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index e86cc36..70b4cd0 100644 --- a/build.gradle +++ b/build.gradle @@ -54,7 +54,7 @@ dependencies { transitive = false } shade 'org.ow2.asm:asm-debug-all:5.2' - shade 'cuchaz:enigma:0.11.0.33:lib' + shade 'enigma-asm:enigma:0.12.0.6:lib' shade 'net.fabricmc:tiny-remapper:+' shade 'net.sf.jopt-simple:jopt-simple:5.0.4' shade 'org.apache.logging.log4j:log4j-api:2.11.0' @@ -122,4 +122,4 @@ publishing { } } } -} \ No newline at end of file +} diff --git a/src/main/java/net/fabricmc/loom/task/MapJarsTask.java b/src/main/java/net/fabricmc/loom/task/MapJarsTask.java index 7a18a0f..7ab0eea 100644 --- a/src/main/java/net/fabricmc/loom/task/MapJarsTask.java +++ b/src/main/java/net/fabricmc/loom/task/MapJarsTask.java @@ -28,12 +28,15 @@ import cuchaz.enigma.Deobfuscator; import cuchaz.enigma.TranslatingTypeLoader; import cuchaz.enigma.mapping.MappingsEnigmaReader; import cuchaz.enigma.mapping.TranslationDirection; +import cuchaz.enigma.mapping.Translator; +import cuchaz.enigma.mapping.entry.ReferencedEntryPool; import cuchaz.enigma.throwables.MappingParseException; -import javassist.CtClass; import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.util.Constants; import org.gradle.api.DefaultTask; import org.gradle.api.tasks.TaskAction; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.tree.ClassNode; import org.zeroturnaround.zip.ZipUtil; import org.zeroturnaround.zip.commons.FileUtils; @@ -93,7 +96,9 @@ public class MapJarsTask extends DefaultTask { } public void writeJar(File out, Deobfuscator.ProgressListener progress, Deobfuscator deobfuscator) { - TranslatingTypeLoader loader = new TranslatingTypeLoader(deobfuscator.getJar(), deobfuscator.getJarIndex(), deobfuscator.getTranslator(TranslationDirection.Obfuscating), deobfuscator.getTranslator(TranslationDirection.Deobfuscating)); + Translator obfuscationTranslator = deobfuscator.getTranslator(TranslationDirection.OBFUSCATING); + Translator deobfuscationTranslator = deobfuscator.getTranslator(TranslationDirection.DEOBFUSCATING); + TranslatingTypeLoader loader = new TranslatingTypeLoader(deobfuscator.getJar(), deobfuscator.getJarIndex(), new ReferencedEntryPool(), obfuscationTranslator, deobfuscationTranslator); deobfuscator.transformJar(out, progress, new CustomClassTransformer(loader)); } @@ -106,8 +111,8 @@ public class MapJarsTask extends DefaultTask { } @Override - public CtClass transform(CtClass ctClass) throws Exception { - return loader.transformClass(ctClass); + public void write(ClassNode classNode, ClassWriter classWriter) { + loader.createTransformer(classNode, classWriter); } } From e21625b660cab8327c14949df0f78979e59a1f9c Mon Sep 17 00:00:00 2001 From: gegy1000 Date: Sat, 23 Jun 2018 14:25:11 +0200 Subject: [PATCH 35/54] Update weave --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 70b4cd0..1218676 100644 --- a/build.gradle +++ b/build.gradle @@ -50,7 +50,7 @@ dependencies { shade 'com.google.code.gson:gson:2.6.2' shade 'commons-io:commons-io:1.4' shade 'com.google.guava:guava:19.0' - shade ('net.fabricmc:weave:0.1.0.+'){ + shade ('weave-asm:weave:0.1.0.+'){ transitive = false } shade 'org.ow2.asm:asm-debug-all:5.2' From d73bcc926dced0d6585ed1381ba68f5ce3e1a2b6 Mon Sep 17 00:00:00 2001 From: gegy1000 Date: Sat, 23 Jun 2018 16:03:43 +0200 Subject: [PATCH 36/54] Update enigma --- build.gradle | 2 +- .../net/fabricmc/loom/task/MapJarsTask.java | 18 +----------------- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/build.gradle b/build.gradle index 1218676..b3245a8 100644 --- a/build.gradle +++ b/build.gradle @@ -54,7 +54,7 @@ dependencies { transitive = false } shade 'org.ow2.asm:asm-debug-all:5.2' - shade 'enigma-asm:enigma:0.12.0.6:lib' + shade 'enigma-asm:enigma:0.12.0.8:lib' shade 'net.fabricmc:tiny-remapper:+' shade 'net.sf.jopt-simple:jopt-simple:5.0.4' shade 'org.apache.logging.log4j:log4j-api:2.11.0' diff --git a/src/main/java/net/fabricmc/loom/task/MapJarsTask.java b/src/main/java/net/fabricmc/loom/task/MapJarsTask.java index 7ab0eea..28ed3c3 100644 --- a/src/main/java/net/fabricmc/loom/task/MapJarsTask.java +++ b/src/main/java/net/fabricmc/loom/task/MapJarsTask.java @@ -35,8 +35,6 @@ import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.util.Constants; import org.gradle.api.DefaultTask; import org.gradle.api.tasks.TaskAction; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.tree.ClassNode; import org.zeroturnaround.zip.ZipUtil; import org.zeroturnaround.zip.commons.FileUtils; @@ -99,21 +97,7 @@ public class MapJarsTask extends DefaultTask { Translator obfuscationTranslator = deobfuscator.getTranslator(TranslationDirection.OBFUSCATING); Translator deobfuscationTranslator = deobfuscator.getTranslator(TranslationDirection.DEOBFUSCATING); TranslatingTypeLoader loader = new TranslatingTypeLoader(deobfuscator.getJar(), deobfuscator.getJarIndex(), new ReferencedEntryPool(), obfuscationTranslator, deobfuscationTranslator); - deobfuscator.transformJar(out, progress, new CustomClassTransformer(loader)); - } - - private class CustomClassTransformer implements Deobfuscator.ClassTransformer { - - TranslatingTypeLoader loader; - - public CustomClassTransformer(TranslatingTypeLoader loader) { - this.loader = loader; - } - - @Override - public void write(ClassNode classNode, ClassWriter classWriter) { - loader.createTransformer(classNode, classWriter); - } + deobfuscator.transformJar(out, progress, loader::transformInto); } public static class ProgressListener implements Deobfuscator.ProgressListener { From c5b625e704d7b22980ac9f2f7bf5f16696ff8aa5 Mon Sep 17 00:00:00 2001 From: gegy1000 Date: Sat, 23 Jun 2018 16:36:34 +0200 Subject: [PATCH 37/54] Update enigma --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b3245a8..122acc8 100644 --- a/build.gradle +++ b/build.gradle @@ -54,7 +54,7 @@ dependencies { transitive = false } shade 'org.ow2.asm:asm-debug-all:5.2' - shade 'enigma-asm:enigma:0.12.0.8:lib' + shade 'enigma-asm:enigma:0.12.0.9:lib' shade 'net.fabricmc:tiny-remapper:+' shade 'net.sf.jopt-simple:jopt-simple:5.0.4' shade 'org.apache.logging.log4j:log4j-api:2.11.0' From 9ba63ed3eb696e4b6c86563eef4228fd53fe902d Mon Sep 17 00:00:00 2001 From: gegy1000 Date: Sat, 23 Jun 2018 17:30:20 +0200 Subject: [PATCH 38/54] Update enigma --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 122acc8..7a4b7d9 100644 --- a/build.gradle +++ b/build.gradle @@ -54,7 +54,7 @@ dependencies { transitive = false } shade 'org.ow2.asm:asm-debug-all:5.2' - shade 'enigma-asm:enigma:0.12.0.9:lib' + shade 'enigma-asm:enigma:0.12.0.10:lib' shade 'net.fabricmc:tiny-remapper:+' shade 'net.sf.jopt-simple:jopt-simple:5.0.4' shade 'org.apache.logging.log4j:log4j-api:2.11.0' From 52ba513d4e136c193bc60f7b048dc366a164c13b Mon Sep 17 00:00:00 2001 From: gegy1000 Date: Sat, 23 Jun 2018 18:36:37 +0200 Subject: [PATCH 39/54] Update enigma --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7a4b7d9..a0c6335 100644 --- a/build.gradle +++ b/build.gradle @@ -54,7 +54,7 @@ dependencies { transitive = false } shade 'org.ow2.asm:asm-debug-all:5.2' - shade 'enigma-asm:enigma:0.12.0.10:lib' + shade 'enigma-asm:enigma:0.12.0.11:lib' shade 'net.fabricmc:tiny-remapper:+' shade 'net.sf.jopt-simple:jopt-simple:5.0.4' shade 'org.apache.logging.log4j:log4j-api:2.11.0' From a0bce96a5eab76d4f9557d06a8184dfb85f6ab8d Mon Sep 17 00:00:00 2001 From: gegy1000 Date: Sat, 23 Jun 2018 19:16:52 +0200 Subject: [PATCH 40/54] Update enigma --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a0c6335..ef2dec3 100644 --- a/build.gradle +++ b/build.gradle @@ -54,7 +54,7 @@ dependencies { transitive = false } shade 'org.ow2.asm:asm-debug-all:5.2' - shade 'enigma-asm:enigma:0.12.0.11:lib' + shade 'enigma-asm:enigma:0.12.0.12:lib' shade 'net.fabricmc:tiny-remapper:+' shade 'net.sf.jopt-simple:jopt-simple:5.0.4' shade 'org.apache.logging.log4j:log4j-api:2.11.0' From 70c5ab2830828eacdc3c2c59bdc4a7072e16df69 Mon Sep 17 00:00:00 2001 From: gegy1000 Date: Sun, 24 Jun 2018 12:26:38 +0200 Subject: [PATCH 41/54] Update enigma --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ef2dec3..f3a688c 100644 --- a/build.gradle +++ b/build.gradle @@ -54,7 +54,7 @@ dependencies { transitive = false } shade 'org.ow2.asm:asm-debug-all:5.2' - shade 'enigma-asm:enigma:0.12.0.12:lib' + shade 'enigma-asm:enigma:0.12.0.13:lib' shade 'net.fabricmc:tiny-remapper:+' shade 'net.sf.jopt-simple:jopt-simple:5.0.4' shade 'org.apache.logging.log4j:log4j-api:2.11.0' From 24cfea03f9852981db5fe3bc91e63c80a2e5b60f Mon Sep 17 00:00:00 2001 From: gegy1000 Date: Mon, 25 Jun 2018 09:41:41 +0200 Subject: [PATCH 42/54] Update enigma --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index f3a688c..9bd2ba1 100644 --- a/build.gradle +++ b/build.gradle @@ -54,7 +54,7 @@ dependencies { transitive = false } shade 'org.ow2.asm:asm-debug-all:5.2' - shade 'enigma-asm:enigma:0.12.0.13:lib' + shade 'enigma-asm:enigma:0.12.0.16:lib' shade 'net.fabricmc:tiny-remapper:+' shade 'net.sf.jopt-simple:jopt-simple:5.0.4' shade 'org.apache.logging.log4j:log4j-api:2.11.0' From 42b2de62b05d1967911d126fda9d27cfbb5d3c60 Mon Sep 17 00:00:00 2001 From: gegy1000 Date: Tue, 3 Jul 2018 18:00:50 +0200 Subject: [PATCH 43/54] Update weave and enigma --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 9bd2ba1..fa548b4 100644 --- a/build.gradle +++ b/build.gradle @@ -50,11 +50,11 @@ dependencies { shade 'com.google.code.gson:gson:2.6.2' shade 'commons-io:commons-io:1.4' shade 'com.google.guava:guava:19.0' - shade ('weave-asm:weave:0.1.0.+'){ + shade ('weave-asm:weave:0.1.0.5'){ transitive = false } shade 'org.ow2.asm:asm-debug-all:5.2' - shade 'enigma-asm:enigma:0.12.0.16:lib' + shade 'enigma-asm:enigma:0.12.0.17:lib' shade 'net.fabricmc:tiny-remapper:+' shade 'net.sf.jopt-simple:jopt-simple:5.0.4' shade 'org.apache.logging.log4j:log4j-api:2.11.0' From 8bf709adf9fd24415978d61ef4c4904e5f5bfaa7 Mon Sep 17 00:00:00 2001 From: Thiakil Date: Thu, 19 Jul 2018 10:49:20 +0800 Subject: [PATCH 44/54] update weave --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index fa548b4..dfdbfc4 100644 --- a/build.gradle +++ b/build.gradle @@ -50,7 +50,7 @@ dependencies { shade 'com.google.code.gson:gson:2.6.2' shade 'commons-io:commons-io:1.4' shade 'com.google.guava:guava:19.0' - shade ('weave-asm:weave:0.1.0.5'){ + shade ('weave-asm:weave:0.1.0.7'){ transitive = false } shade 'org.ow2.asm:asm-debug-all:5.2' From 6b59f9cc59c1de975e8d0cb566b414936bbc9c7c Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Sun, 5 Aug 2018 21:45:54 +0100 Subject: [PATCH 45/54] Remove a bunch of stuff + update to support modlauncher --- build.gradle | 19 +- gradle/wrapper/gradle-wrapper.jar | Bin 54329 -> 54413 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- .../net/fabricmc/loom/AbstractPlugin.java | 37 +- .../fabricmc/loom/LoomGradleExtension.java | 1 - .../loom/mixin/MixinMappingProviderTiny.java | 144 -------- .../loom/mixin/MixinMappingWriterTiny.java | 75 ----- .../loom/mixin/MixinServiceGradle.java | 77 ----- .../mixin/ObfuscationEnvironmentFabric.java | 51 --- .../loom/mixin/ObfuscationServiceFabric.java | 75 ----- .../loom/task/GenIdeaProjectTask.java | 8 +- .../net/fabricmc/loom/task/MapJarsTask.java | 2 +- .../fabricmc/loom/task/ProcessModsTask.java | 6 +- .../net/fabricmc/loom/task/RunClientTask.java | 2 +- .../net/fabricmc/loom/task/RunServerTask.java | 4 +- .../net/fabricmc/loom/util/Constants.java | 1 - .../util/proccessing/MixinDevRemapper.java | 75 ----- .../loom/util/proccessing/MixinPrebaker.java | 317 ------------------ .../loom/util/proccessing/PreBakeMixins.java | 53 --- ...rg.spongepowered.asm.service.IMixinService | 1 - ...ls.obfuscation.service.IObfuscationService | 1 - 21 files changed, 16 insertions(+), 936 deletions(-) delete mode 100644 src/main/java/net/fabricmc/loom/mixin/MixinMappingProviderTiny.java delete mode 100644 src/main/java/net/fabricmc/loom/mixin/MixinMappingWriterTiny.java delete mode 100644 src/main/java/net/fabricmc/loom/mixin/MixinServiceGradle.java delete mode 100644 src/main/java/net/fabricmc/loom/mixin/ObfuscationEnvironmentFabric.java delete mode 100644 src/main/java/net/fabricmc/loom/mixin/ObfuscationServiceFabric.java delete mode 100644 src/main/java/net/fabricmc/loom/util/proccessing/MixinDevRemapper.java delete mode 100644 src/main/java/net/fabricmc/loom/util/proccessing/MixinPrebaker.java delete mode 100644 src/main/java/net/fabricmc/loom/util/proccessing/PreBakeMixins.java delete mode 100644 src/main/resources/META-INF/services/org.spongepowered.asm.service.IMixinService delete mode 100644 src/main/resources/META-INF/services/org.spongepowered.tools.obfuscation.service.IObfuscationService diff --git a/build.gradle b/build.gradle index dfdbfc4..9144bf4 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ targetCompatibility = 1.8 group = 'com.openmodloader' archivesBaseName = project.name -version = '0.0.9-SNAPSHOT' +version = '0.0.10-SNAPSHOT' repositories { mavenCentral() @@ -30,8 +30,8 @@ repositories { url = 'https://libraries.minecraft.net/' } maven { - name = 'SpongePowered' - url = 'http://repo.spongepowered.org/maven' + name = 'Forge' //For ModLauncher + url = 'http://files.minecraftforge.net/maven/' } } @@ -61,17 +61,8 @@ dependencies { shade 'org.apache.logging.log4j:log4j-core:2.11.0' - shade ('net.minecraft:launchwrapper:1.12') { - transitive = false - } + shade 'cpw.mods:modlauncher:0.1.0-rc.3' - //Always fun when your dep needs the tool to build, but the tool needs the dep. - //compile 'net.fabricmc:fabric-base:16w38a-0.0.4-SNAPSHOT' - - shade('org.spongepowered:mixin:0.7.8-SNAPSHOT') { - exclude module: 'launchwrapper' - exclude module: 'guava' - } shade 'org.apache.commons:commons-lang3:3.5' } @@ -93,7 +84,7 @@ jar { task wrapper(type: Wrapper) { - gradleVersion = '4.7' + gradleVersion = '4.9' } publishing { diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index f6b961fd5a86aa5fbfe90f707c3138408be7c718..91ca28c8b802289c3a438766657a5e98f20eff03 100644 GIT binary patch delta 7397 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 delta 7284 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 { configureIDEs(); configureCompile(); - Map> taskMap = project.getAllTasks(true); - for (Map.Entry> entry : taskMap.entrySet()) { - Project project = entry.getKey(); - Set taskSet = entry.getValue(); - for (Task task : taskSet) { - if (task instanceof JavaCompile - && !(task.getName().contains("Test")) && !(task.getName().contains("test"))) { - JavaCompile javaCompileTask = (JavaCompile) task; - javaCompileTask.doFirst(task1 -> { - project.getLogger().lifecycle(":setting java compiler args"); - try { - javaCompileTask.getClasspath().add(target.files(this.getClass().getProtectionDomain().getCodeSource().getLocation())); - - javaCompileTask.getOptions().getCompilerArgs().add("-AinMapFilePomfMojang=" + Constants.MAPPINGS_TINY.get(extension).getCanonicalPath()); - javaCompileTask.getOptions().getCompilerArgs().add("-AoutMapFilePomfMojang=" + Constants.MAPPINGS_MIXIN_EXPORT.get(extension).getCanonicalPath()); - if(extension.refmapName == null || extension.refmapName.isEmpty()){ - project.getLogger().error("Could not find refmap definition, will be using default name: " + project.getName() + "-refmap.json"); - extension.refmapName = project.getName() + "-refmap.json"; - } - javaCompileTask.getOptions().getCompilerArgs().add("-AoutRefMapFile=" + new File(javaCompileTask.getDestinationDir(), extension.refmapName).getCanonicalPath()); - javaCompileTask.getOptions().getCompilerArgs().add("-AdefaultObfuscationEnv=pomf:mojang"); - } catch (IOException e) { - e.printStackTrace(); - } - }); - } - } - - } - } /** @@ -217,11 +187,6 @@ public class AbstractPlugin implements Plugin { mavenArtifactRepository.setUrl("https://maven.modmuss50.me"); }); - project1.getRepositories().maven(mavenArtifactRepository -> { - mavenArtifactRepository.setName("SpongePowered"); - mavenArtifactRepository.setUrl("http://repo.spongepowered.org/maven"); - }); - project1.getRepositories().maven(mavenArtifactRepository -> { mavenArtifactRepository.setName("Mojang"); mavenArtifactRepository.setUrl("https://libraries.minecraft.net/"); @@ -250,7 +215,7 @@ public class AbstractPlugin implements Plugin { if (extension.omlVersion != null && !extension.omlVersion.isEmpty()) { //only add this when not in a fabric dev env - project1.getDependencies().add(Constants.COMPILE_MODS, "OpenModLoader:OpenModLoader:" + extension.version + "-" + extension.omlVersion); + project1.getDependencies().add(Constants.CONFIG_MC_DEPENDENCIES, "OpenModLoader:OpenModLoader:" + extension.version + "-" + extension.omlVersion); } }); diff --git a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java index fe42321..27be810 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java +++ b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java @@ -33,7 +33,6 @@ public class LoomGradleExtension { public String runDir = "run"; public String omlVersion; public String pomfVersion; - public String refmapName; public boolean skipPrebake = false; public boolean localMappings = false; diff --git a/src/main/java/net/fabricmc/loom/mixin/MixinMappingProviderTiny.java b/src/main/java/net/fabricmc/loom/mixin/MixinMappingProviderTiny.java deleted file mode 100644 index e63db8e..0000000 --- a/src/main/java/net/fabricmc/loom/mixin/MixinMappingProviderTiny.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * This file is part of fabric-loom, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 FabricMC - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package net.fabricmc.loom.mixin; - -import net.fabricmc.tinyremapper.TinyUtils; -import org.spongepowered.asm.obfuscation.mapping.common.MappingField; -import org.spongepowered.asm.obfuscation.mapping.common.MappingMethod; -import org.spongepowered.tools.obfuscation.mapping.common.MappingProvider; - -import javax.annotation.processing.Filer; -import javax.annotation.processing.Messager; -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; - -public class MixinMappingProviderTiny extends MappingProvider { - private final String from, to; - - public MixinMappingProviderTiny(Messager messager, Filer filer, String from, String to) { - super(messager, filer); - this.from = from; - this.to = to; - } - - private static final String[] removeFirst(String[] src, int count) { - if (count >= src.length) { - return new String[0]; - } else { - String[] out = new String[src.length - count]; - System.arraycopy(src, count, out, 0, out.length); - return out; - } - } - - @Override - public MappingMethod getMethodMapping(MappingMethod method) { - System.out.println("processing " + method.getName() + method.getDesc()); - - MappingMethod mapped = this.methodMap.get(method); - if (mapped != null) - return mapped; - - try { - Class c = this.getClass().getClassLoader().loadClass(method.getOwner().replace('/', '.')); - if (c == null || c == Object.class) { - return null; - } - - for (Class cc : c.getInterfaces()) { - mapped = getMethodMapping(method.move(cc.getName().replace('.', '/'))); - if (mapped != null) - return mapped; - } - - if (c.getSuperclass() != null) { - mapped = getMethodMapping(method.move(c.getSuperclass().getName().replace('.', '/'))); - if (mapped != null) - return mapped; - } - - return null; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - @Override - public MappingField getFieldMapping(MappingField field) { - System.out.println("processing " + field.getOwner() + "/" + field.getName() + field.getDesc()); - - MappingField mapped = this.fieldMap.get(field); - if (mapped != null) - return mapped; - - try { - Class c = this.getClass().getClassLoader().loadClass(field.getOwner().replace('/', '.')); - if (c == null || c == Object.class) { - return null; - } - - for (Class cc : c.getInterfaces()) { - mapped = getFieldMapping(field.move(cc.getName().replace('.', '/'))); - if (mapped != null) - return mapped; - } - - if (c.getSuperclass() != null) { - mapped = getFieldMapping(field.move(c.getSuperclass().getName().replace('.', '/'))); - if (mapped != null) - return mapped; - } - - return null; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - // TODO: Unify with tiny-remapper - - @Override - public void read(File input) throws IOException { - BufferedReader reader = Files.newBufferedReader(input.toPath()); - - TinyUtils.read(reader, from, to, (classFrom, classTo) -> { - classMap.put(classFrom, classTo); - }, (fieldFrom, fieldTo) -> { - fieldMap.put( - new MappingField(fieldFrom.owner, fieldFrom.name, fieldFrom.desc), - new MappingField(fieldTo.owner, fieldTo.name, fieldTo.desc) - ); - }, (methodFrom, methodTo) -> { - methodMap.put( - new MappingMethod(methodFrom.owner, methodFrom.name, methodFrom.desc), - new MappingMethod(methodTo.owner, methodTo.name, methodTo.desc) - ); - }); - } -} diff --git a/src/main/java/net/fabricmc/loom/mixin/MixinMappingWriterTiny.java b/src/main/java/net/fabricmc/loom/mixin/MixinMappingWriterTiny.java deleted file mode 100644 index 0ea4a47..0000000 --- a/src/main/java/net/fabricmc/loom/mixin/MixinMappingWriterTiny.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This file is part of fabric-loom, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 FabricMC - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package net.fabricmc.loom.mixin; - -import org.spongepowered.asm.obfuscation.mapping.common.MappingField; -import org.spongepowered.asm.obfuscation.mapping.common.MappingMethod; -import org.spongepowered.tools.obfuscation.ObfuscationType; -import org.spongepowered.tools.obfuscation.mapping.IMappingConsumer; -import org.spongepowered.tools.obfuscation.mapping.common.MappingWriter; - -import javax.annotation.processing.Filer; -import javax.annotation.processing.Messager; -import java.io.IOException; -import java.io.PrintWriter; - -/** - * Created by asie on 10/9/16. - */ -public class MixinMappingWriterTiny extends MappingWriter { - public MixinMappingWriterTiny(Messager messager, Filer filer) { - super(messager, filer); - } - - @Override - public void write(String output, ObfuscationType type, IMappingConsumer.MappingSet fields, IMappingConsumer.MappingSet methods) { - if (output != null) { - PrintWriter writer = null; - - try { - String from = type.getKey().split(":")[0]; - String to = type.getKey().split(":")[1]; - - writer = this.openFileWriter(output, type + " output TinyMappings"); - writer.println(String.format("v1\t%s\t%s", from, to)); - for (IMappingConsumer.MappingSet.Pair pair : fields) { - writer.println(String.format("FIELD\t%s\t%s\t%s\t%s", pair.from.getOwner(), pair.from.getDesc(), pair.from.getSimpleName(), pair.to.getSimpleName())); - } - for (IMappingConsumer.MappingSet.Pair pair : methods) { - writer.println(String.format("METHOD\t%s\t%s\t%s\t%s", pair.from.getOwner(), pair.from.getDesc(), pair.from.getSimpleName(), pair.to.getSimpleName())); - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (writer != null) { - try { - writer.close(); - } catch (Exception e) { - } - } - } - } - } -} diff --git a/src/main/java/net/fabricmc/loom/mixin/MixinServiceGradle.java b/src/main/java/net/fabricmc/loom/mixin/MixinServiceGradle.java deleted file mode 100644 index d38c8a5..0000000 --- a/src/main/java/net/fabricmc/loom/mixin/MixinServiceGradle.java +++ /dev/null @@ -1,77 +0,0 @@ -package net.fabricmc.loom.mixin; - -import com.google.common.io.ByteStreams; -import net.fabricmc.loom.task.ProcessModsTask; -import net.fabricmc.loom.util.proccessing.MixinPrebaker; -import org.spongepowered.asm.service.IClassBytecodeProvider; -import org.spongepowered.asm.service.mojang.MixinServiceLaunchWrapper; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.jar.JarFile; -import java.util.zip.ZipEntry; - -public class MixinServiceGradle extends MixinServiceLaunchWrapper implements IClassBytecodeProvider { - - private static List jars = new ArrayList<>(); - - - @Override - public String getName() { - return "OpenModLoaderGradle"; - } - - @Override - public InputStream getResourceAsStream(String name) { - if(MixinPrebaker.jarFileCache.containsKey(name)){ - return MixinPrebaker.jarFileCache.get(name); - } - for(JarFile file : jars){ - ZipEntry entry = file.getEntry(name); - if(entry != null){ - try { - InputStream stream = file.getInputStream(entry); - return stream; - } catch (IOException e) { - throw new RuntimeException("Failed to read mod file", e); - } - } - } - return super.getResourceAsStream(name); - } - - public static void setupModFiles(Set mods, File minecraft) throws IOException { - jars.clear(); - for(File mod : mods){ - JarFile jarFile = new JarFile(mod); - jars.add(jarFile); - } - jars.add(new JarFile(minecraft)); - } - - public static void addMCDeps(Set deps, Object object) throws IOException { - for(File mod : deps){ - JarFile jarFile = new JarFile(mod); - jars.add(jarFile); - ProcessModsTask.addFile(mod, object); - } - } - - @Override - public IClassBytecodeProvider getBytecodeProvider() { - return this; - } - - public byte[] getClassBytes(String name, String transformedName) throws IOException { - InputStream inputStream = getResourceAsStream(name.replace(".", "/") + ".class"); - byte[] classBytes = ByteStreams.toByteArray(inputStream); - if(classBytes == null){ - return super.getClassBytes(name, transformedName); - } - return classBytes; - } -} diff --git a/src/main/java/net/fabricmc/loom/mixin/ObfuscationEnvironmentFabric.java b/src/main/java/net/fabricmc/loom/mixin/ObfuscationEnvironmentFabric.java deleted file mode 100644 index 70318e4..0000000 --- a/src/main/java/net/fabricmc/loom/mixin/ObfuscationEnvironmentFabric.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * This file is part of fabric-loom, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 FabricMC - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package net.fabricmc.loom.mixin; - -import org.spongepowered.tools.obfuscation.ObfuscationEnvironment; -import org.spongepowered.tools.obfuscation.ObfuscationType; -import org.spongepowered.tools.obfuscation.mapping.IMappingProvider; -import org.spongepowered.tools.obfuscation.mapping.IMappingWriter; - -import javax.annotation.processing.Filer; -import javax.annotation.processing.Messager; - -public class ObfuscationEnvironmentFabric extends ObfuscationEnvironment { - protected ObfuscationEnvironmentFabric(ObfuscationType type) { - super(type); - } - - @Override - protected IMappingProvider getMappingProvider(Messager messager, Filer filer) { - String from = type.getKey().split(":")[0]; - String to = type.getKey().split(":")[1]; - return new MixinMappingProviderTiny(messager, filer, from, to); - } - - @Override - protected IMappingWriter getMappingWriter(Messager messager, Filer filer) { - return new MixinMappingWriterTiny(messager, filer); - } -} diff --git a/src/main/java/net/fabricmc/loom/mixin/ObfuscationServiceFabric.java b/src/main/java/net/fabricmc/loom/mixin/ObfuscationServiceFabric.java deleted file mode 100644 index b95f719..0000000 --- a/src/main/java/net/fabricmc/loom/mixin/ObfuscationServiceFabric.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This file is part of fabric-loom, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 FabricMC - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package net.fabricmc.loom.mixin; - -import com.google.common.collect.ImmutableSet; -import org.apache.commons.lang3.StringUtils; -import org.spongepowered.tools.obfuscation.service.IObfuscationService; -import org.spongepowered.tools.obfuscation.service.ObfuscationTypeDescriptor; - -import java.util.Collection; -import java.util.Set; - -public class ObfuscationServiceFabric implements IObfuscationService { - public static final String IN_MAP_FILE = "inMapFile"; - public static final String IN_MAP_EXTRA_FILES = "inMapExtraFiles"; - public static final String OUT_MAP_FILE = "outMapFile"; - - private String asSuffixed(String arg, String from, String to) { - return arg + StringUtils.capitalize(from) + StringUtils.capitalize(to); - } - - private ObfuscationTypeDescriptor createObfuscationType(String from, String to) { - return new ObfuscationTypeDescriptor( - from + ":" + to, - asSuffixed(ObfuscationServiceFabric.IN_MAP_FILE, from, to), - asSuffixed(ObfuscationServiceFabric.IN_MAP_EXTRA_FILES, from, to), - asSuffixed(ObfuscationServiceFabric.OUT_MAP_FILE, from, to), - ObfuscationEnvironmentFabric.class - ); - } - - private void addSupportedOptions(ImmutableSet.Builder builder, String from, String to) { - builder.add(asSuffixed(ObfuscationServiceFabric.IN_MAP_FILE, from, to)); - builder.add(asSuffixed(ObfuscationServiceFabric.IN_MAP_EXTRA_FILES, from, to)); - builder.add(asSuffixed(ObfuscationServiceFabric.OUT_MAP_FILE, from, to)); - } - - @Override - public Set getSupportedOptions() { - ImmutableSet.Builder builder = new ImmutableSet.Builder(); - addSupportedOptions(builder, "mojang", "pomf"); - addSupportedOptions(builder, "pomf", "mojang"); - return builder.build(); - } - - @Override - public Collection getObfuscationTypes() { - return ImmutableSet.of( - createObfuscationType("mojang", "pomf"), - createObfuscationType("pomf", "mojang") - ); - } -} diff --git a/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java b/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java index eb47cd5..ee13c7c 100644 --- a/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java @@ -135,22 +135,22 @@ public class GenIdeaProjectTask extends DefaultTask { } IdeaRunConfig ideaClient = new IdeaRunConfig(); - ideaClient.mainClass = "net.minecraft.launchwrapper.Launch"; + ideaClient.mainClass = "cpw.mods.modlauncher.Launcher"; ideaClient.projectName = project.getName(); ideaClient.configName = "Minecraft Client"; ideaClient.runDir = "file://$PROJECT_DIR$/" + extension.runDir; ideaClient.vmArgs = "-Djava.library.path=" + Constants.MINECRAFT_NATIVES.get(extension).getAbsolutePath() + " -Doml.development=true"; - ideaClient.programArgs = "--tweakClass com.openmodloader.loader.launch.OpenClientTweaker --assetIndex " + version.assetIndex.id + " --assetsDir " + new File(extension.getUserCache(), "assets-" + extension.version).getAbsolutePath(); + ideaClient.programArgs = "--launchTarget oml --accessToken not_a_real_token --version " + extension.version + " --assetIndex " + version.assetIndex.id + " --assetsDir " + new File(extension.getUserCache(), "assets-" + extension.version).getAbsolutePath(); runManager.appendChild(ideaClient.genRuns(runManager)); IdeaRunConfig ideaServer = new IdeaRunConfig(); - ideaServer.mainClass = "net.minecraft.launchwrapper.Launch"; + ideaServer.mainClass = "com.openmodloader.loader.launch.ServerLauncher"; ideaServer.projectName = project.getName(); ideaServer.configName = "Minecraft Server"; ideaServer.runDir = "file://$PROJECT_DIR$/" + extension.runDir; ideaServer.vmArgs = "-Doml.development=true"; - ideaServer.programArgs = "--tweakClass com.openmodloader.loader.launch.OpenServerTweaker"; + ideaServer.programArgs = ""; runManager.appendChild(ideaServer.genRuns(runManager)); diff --git a/src/main/java/net/fabricmc/loom/task/MapJarsTask.java b/src/main/java/net/fabricmc/loom/task/MapJarsTask.java index 28ed3c3..c2451a8 100644 --- a/src/main/java/net/fabricmc/loom/task/MapJarsTask.java +++ b/src/main/java/net/fabricmc/loom/task/MapJarsTask.java @@ -49,7 +49,7 @@ public class MapJarsTask extends DefaultTask { @TaskAction public void mapJars() throws IOException, MappingParseException { LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); - if (!Constants.MINECRAFT_MAPPED_JAR.get(extension).exists() || extension.localMappings || true) { + if (!Constants.MINECRAFT_MAPPED_JAR.get(extension).exists() || extension.localMappings) { if(extension.localMappings && Constants.MINECRAFT_MAPPED_JAR.get(extension).exists()){ //Always remap the jar when using local mappings. Constants.MINECRAFT_MAPPED_JAR.get(extension).delete(); diff --git a/src/main/java/net/fabricmc/loom/task/ProcessModsTask.java b/src/main/java/net/fabricmc/loom/task/ProcessModsTask.java index 697662f..b58e2eb 100644 --- a/src/main/java/net/fabricmc/loom/task/ProcessModsTask.java +++ b/src/main/java/net/fabricmc/loom/task/ProcessModsTask.java @@ -26,7 +26,6 @@ package net.fabricmc.loom.task; import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.util.Constants; -import net.fabricmc.loom.util.proccessing.PreBakeMixins; import org.apache.commons.io.FileUtils; import org.gradle.api.DefaultTask; import org.gradle.api.artifacts.Configuration; @@ -57,11 +56,10 @@ public class ProcessModsTask extends DefaultTask { Constants.MINECRAFT_FINAL_JAR.get(extension).delete(); } if (mods.size() == 0 || extension.skipPrebake) { - getProject().getLogger().lifecycle(":skipping mixin prebake"); FileUtils.copyFile(Constants.MINECRAFT_MERGED_JAR.get(extension), Constants.MINECRAFT_MIXED_JAR.get(extension)); } else { - downloadRequiredDeps(extension); - new PreBakeMixins().proccess(getProject(), extension, mods); +// downloadRequiredDeps(extension); + throw new UnsupportedOperationException("Mixin prebake isnt done yet"); } } diff --git a/src/main/java/net/fabricmc/loom/task/RunClientTask.java b/src/main/java/net/fabricmc/loom/task/RunClientTask.java index 87e005f..e1de4d0 100644 --- a/src/main/java/net/fabricmc/loom/task/RunClientTask.java +++ b/src/main/java/net/fabricmc/loom/task/RunClientTask.java @@ -68,7 +68,7 @@ public class RunClientTask extends JavaExec { libs.add(Constants.MINECRAFT_CLIENT_JAR.get(extension).getAbsolutePath()); classpath(libs); - args("--tweakClass", "com.openmodloader.loader.launch.OpenClientTweaker", "--assetIndex", version.assetIndex.id, "--assetsDir", new File(extension.getUserCache(), "assets-" + extension.version).getAbsolutePath()); + args("--launchTarget", "oml", "--accessToken", "NOT_A_TOKEN", "--version", extension.version, "--assetIndex", version.assetIndex.id, "--assetsDir", new File(extension.getUserCache(), "assets-" + extension.version).getAbsolutePath()); setWorkingDir(new File(getProject().getRootDir(), "run")); diff --git a/src/main/java/net/fabricmc/loom/task/RunServerTask.java b/src/main/java/net/fabricmc/loom/task/RunServerTask.java index 115a5f4..a9a734d 100644 --- a/src/main/java/net/fabricmc/loom/task/RunServerTask.java +++ b/src/main/java/net/fabricmc/loom/task/RunServerTask.java @@ -65,8 +65,6 @@ public class RunServerTask extends JavaExec { libs.add(Constants.MINECRAFT_FINAL_JAR.get(extension).getAbsolutePath()); classpath(libs); - args("--tweakClass", "com.openmodloader.loader.launch.OpenServerTweaker"); - setWorkingDir(new File(getProject().getRootDir(), "run")); super.exec(); @@ -74,7 +72,7 @@ public class RunServerTask extends JavaExec { @Override public String getMain() { - return "net.minecraft.launchwrapper.Launch"; + return "com.openmodloader.loader.launch.ServerLauncher"; } @Override diff --git a/src/main/java/net/fabricmc/loom/util/Constants.java b/src/main/java/net/fabricmc/loom/util/Constants.java index baeff33..5591483 100644 --- a/src/main/java/net/fabricmc/loom/util/Constants.java +++ b/src/main/java/net/fabricmc/loom/util/Constants.java @@ -58,7 +58,6 @@ public class Constants { public static final IDelayed MINECRAFT_LIBS = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-libs")); public static final IDelayed MINECRAFT_NATIVES = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-natives")); public static final IDelayed MINECRAFT_JSON = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-info.json")); - public static final IDelayed REF_MAP = new DelayedFile(extension -> new File(CACHE_FILES, "mixin-refmap.json")); public static final IDelayed VERSION_MANIFEST = new DelayedFile(extension -> new File(extension.getUserCache(), "version_manifest.json")); diff --git a/src/main/java/net/fabricmc/loom/util/proccessing/MixinDevRemapper.java b/src/main/java/net/fabricmc/loom/util/proccessing/MixinDevRemapper.java deleted file mode 100644 index 4cde444..0000000 --- a/src/main/java/net/fabricmc/loom/util/proccessing/MixinDevRemapper.java +++ /dev/null @@ -1,75 +0,0 @@ -package net.fabricmc.loom.util.proccessing; - -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; -import net.fabricmc.tinyremapper.TinyUtils; -import org.objectweb.asm.commons.Remapper; -import org.spongepowered.asm.mixin.extensibility.IRemapper; - -import java.io.BufferedReader; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -public class MixinDevRemapper implements IRemapper { - private final BiMap classMap = HashBiMap.create(); - private final Map fieldMap = new HashMap<>(); - private final Map methodMap = new HashMap<>(); - - private final SimpleClassMapper classMapper = new SimpleClassMapper(classMap); - private final SimpleClassMapper classUnmapper = new SimpleClassMapper(classMap.inverse()); - - private static class SimpleClassMapper extends Remapper { - final Map classMap; - - public SimpleClassMapper(Map map) { - this.classMap = map; - } - - public String map(String typeName) { - return this.classMap.getOrDefault(typeName, typeName); - } - } - - public void readMapping(BufferedReader reader, String fromM, String toM) throws IOException { - TinyUtils.read(reader, fromM, toM, classMap::put, fieldMap::put, methodMap::put); - } - - @Override - public String mapMethodName(String owner, String name, String desc) { - TinyUtils.Mapping mapping = methodMap.get(new TinyUtils.Mapping(owner, name, desc)); - return mapping != null ? mapping.name : name; - } - - @Override - public String mapFieldName(String owner, String name, String desc) { - TinyUtils.Mapping mapping = fieldMap.get(new TinyUtils.Mapping(owner, name, desc)); - if(mapping == null){ - //We try again using obfed names - owner = unmap(owner); - desc = unmapDesc(desc); - mapping = fieldMap.get(new TinyUtils.Mapping(owner, name, desc)); - } - return mapping != null ? mapping.name : name; - } - - @Override - public String map(String typeName) { - return classMap.getOrDefault(typeName, typeName); - } - - @Override - public String unmap(String typeName) { - return classMap.inverse().getOrDefault(typeName, typeName); - } - - @Override - public String mapDesc(String desc) { - return classMapper.mapDesc(desc); - } - - @Override - public String unmapDesc(String desc) { - return classUnmapper.mapDesc(desc); - } -} \ No newline at end of file diff --git a/src/main/java/net/fabricmc/loom/util/proccessing/MixinPrebaker.java b/src/main/java/net/fabricmc/loom/util/proccessing/MixinPrebaker.java deleted file mode 100644 index f08bbd4..0000000 --- a/src/main/java/net/fabricmc/loom/util/proccessing/MixinPrebaker.java +++ /dev/null @@ -1,317 +0,0 @@ -/* - * Copyright 2016 FabricMC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package net.fabricmc.loom.util.proccessing; - -import com.google.common.base.Charsets; -import com.google.common.base.Predicate; -import com.google.common.io.ByteStreams; -import com.google.gson.Gson; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import net.fabricmc.loom.mixin.MixinServiceGradle; -import net.minecraft.launchwrapper.Launch; -import net.minecraft.launchwrapper.LaunchClassLoader; -import org.gradle.api.Project; -import org.objectweb.asm.*; -import org.spongepowered.asm.launch.GlobalProperties; -import org.spongepowered.asm.launch.MixinBootstrap; -import org.spongepowered.asm.mixin.EnvironmentStateTweaker; -import org.spongepowered.asm.mixin.MixinEnvironment; -import org.spongepowered.asm.mixin.Mixins; -import org.spongepowered.asm.mixin.transformer.MixinTransformer; -import org.spongepowered.asm.service.MixinService; -import org.spongepowered.asm.service.mojang.MixinServiceLaunchWrapper; - -import javax.annotation.Nonnull; -import java.io.*; -import java.net.URLClassLoader; -import java.nio.file.Files; -import java.nio.file.attribute.FileTime; -import java.time.Instant; -import java.util.*; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; -import java.util.jar.JarInputStream; -import java.util.jar.JarOutputStream; -import java.util.stream.Collectors; -import java.util.zip.ZipEntry; - -/** - * The purpose of this class is to provide an utility for baking mixins from - * mods into a JAR file at compile time to make accessing APIs provided by them - * more intuitive in development environment. - */ -public class MixinPrebaker { - private static class DesprinklingFieldVisitor extends FieldVisitor { - public DesprinklingFieldVisitor(int api, FieldVisitor fv) { - super(api, fv); - } - - @Override - public AnnotationVisitor visitAnnotation(String desc, boolean visible) { - if (isSprinkledAnnotation(desc)) { - return null; - } - return super.visitAnnotation(desc, visible); - } - } - - private static class DesprinklingMethodVisitor extends MethodVisitor { - public DesprinklingMethodVisitor(int api, MethodVisitor mv) { - super(api, mv); - } - - @Override - public AnnotationVisitor visitAnnotation(String desc, boolean visible) { - if (isSprinkledAnnotation(desc)) { - return null; - } - return super.visitAnnotation(desc, visible); - } - } - - private static class DesprinklingClassVisitor extends ClassVisitor { - public DesprinklingClassVisitor(int api, ClassVisitor cv) { - super(api, cv); - } - - @Override - public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { - return new DesprinklingFieldVisitor(Opcodes.ASM5, super.visitField(access, name, desc, signature, value)); - } - - @Override - public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { - return new DesprinklingMethodVisitor(Opcodes.ASM5, super.visitMethod(access, name, desc, signature, exceptions)); - } - - @Override - public AnnotationVisitor visitAnnotation(String desc, boolean visible) { - if (isSprinkledAnnotation(desc)) { - return null; - } - return super.visitAnnotation(desc, visible); - } - } - - private static boolean isSprinkledAnnotation(String desc) { - //System.out.println(desc); - return desc.startsWith("Lorg/spongepowered/asm/mixin/transformer/meta"); - } - - // Term proposed by Mumfrey, don't blame me - public static byte[] desprinkle(byte[] cls) { - ClassReader reader = new ClassReader(cls); - ClassWriter writer = new ClassWriter(0); - - reader.accept(new DesprinklingClassVisitor(Opcodes.ASM5, writer), 0); - return writer.toByteArray(); - } - - public static final String APPLIED_MIXIN_CONFIGS_FILENAME = ".oml-applied-mixin-configs"; - public static final String MAPPINGS_FILENAME = ".oml-dev-mappings.tiny"; - - public static Map jarFileCache = new HashMap<>(); - - public static void main(String[] args, Project project) throws IOException { - boolean hasMappingsFile = false; - - if (args.length < 3) { - System.out.println("usage: MixinPrebaker [-m mapping-file] "); - return; - } - - File mappingsFile = null; - int argOffset; - for (argOffset = 0; argOffset < args.length; argOffset++) { - if ("-m".equals(args[argOffset])) { - hasMappingsFile = true; - mappingsFile = new File(args[++argOffset]); - //TODO this is prob what was handling the mixin remmapping, this may need to be added back - //FabricMixinBootstrap.setMappingFile(); - } else { - break; - } - } - - - - Set modFiles = new HashSet<>(); - for (int i = argOffset + 2; i < args.length; i++) { - modFiles.add(new File(args[i])); - } - - URLClassLoader ucl = (URLClassLoader) MixinPrebaker.class.getClassLoader(); - Launch.classLoader = new LaunchClassLoader(ucl.getURLs()); - Launch.blackboard = new HashMap<>(); - Launch.blackboard.put(MixinServiceLaunchWrapper.BLACKBOARD_KEY_TWEAKS, Collections.emptyList()); - - List mods = findModInfo(modFiles); - System.out.println("Found " + mods.size() + " mods"); - List mixins = new ArrayList<>(); - for(JsonObject modObject : mods){ - mixins.addAll(findMixins(modObject.getAsJsonArray("mixins"))); - mixins.addAll(findMixins(modObject.getAsJsonArray("clientMixins"))); - mixins.addAll(findMixins(modObject.getAsJsonArray("serverMixins"))); - } - System.out.println("Found " + mixins.size() + " mixins to pre bake"); - - List tweakers = new ArrayList<>(); - tweakers.add("com.openmodloader.loader.launch.OpenTweaker"); - GlobalProperties.put("TweakClasses", tweakers); - - MixinBootstrap.init(); - mixins.forEach(Mixins::addConfiguration); - - MixinServiceGradle.setupModFiles(modFiles, new File(args[argOffset + 0])); - - - EnvironmentStateTweaker tweaker = new EnvironmentStateTweaker(); - tweaker.getLaunchArguments(); - tweaker.injectIntoClassLoader(Launch.classLoader); - - //MixinServiceGradle.addMCDeps(project.getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES).getFiles(), tweaker); - - MixinEnvironment mixinEnvironment = MixinEnvironment.getDefaultEnvironment(); - - System.out.println("Loading mappings: " + mappingsFile); - InputStream mappingStream = new FileInputStream(mappingsFile); - MixinDevRemapper devRemapper = new MixinDevRemapper(); - devRemapper.readMapping(new BufferedReader(new InputStreamReader(mappingStream)), "pomf", "mojang"); - mappingStream.close(); - mixinEnvironment.getRemappers().add(devRemapper); - - mixinEnvironment.setSide(MixinEnvironment.Side.CLIENT); //TODO have an all side? - - - MixinTransformer mixinTransformer = GlobalProperties.get(GlobalProperties.Keys.TRANSFORMER); - if(mixinTransformer == null){ - MixinService.getService().beginPhase(); - mixinTransformer = GlobalProperties.get(GlobalProperties.Keys.TRANSFORMER); - } - mixinTransformer.audit(mixinEnvironment); - - - try { - JarInputStream input = new JarInputStream(new FileInputStream(new File(args[argOffset + 0]))); - JarOutputStream output = new JarOutputStream(new FileOutputStream(new File(args[argOffset + 1]))); - JarEntry entry; - while ((entry = input.getNextJarEntry()) != null) { - if (entry.getName().equals(APPLIED_MIXIN_CONFIGS_FILENAME)) { - continue; - } - - if (hasMappingsFile && entry.getName().equals(MAPPINGS_FILENAME)) { - continue; - } - - if (entry.getName().endsWith(".class")) { - byte[] classIn = ByteStreams.toByteArray(input); - String className = entry.getName().substring(0, entry.getName().length() - 6).replace('/', '.'); - byte[] classOut = mixinTransformer.transformClassBytes(className, className, classIn); - if (classIn != classOut) { - System.out.println("Transformed " + className); - classOut = desprinkle(classOut); - } - JarEntry newEntry = new JarEntry(entry.getName()); - newEntry.setComment(entry.getComment()); - newEntry.setSize(classOut.length); - newEntry.setLastModifiedTime(FileTime.from(Instant.now())); - output.putNextEntry(newEntry); - output.write(classOut); - } else { - output.putNextEntry(entry); - ByteStreams.copy(input, output); - } - } - - output.putNextEntry(new JarEntry(APPLIED_MIXIN_CONFIGS_FILENAME)); - output.write(String.join("\n", mixins).getBytes(Charsets.UTF_8)); - - if (hasMappingsFile) { - output.putNextEntry(new JarEntry(MAPPINGS_FILENAME)); - Files.copy(mappingsFile.toPath(), output); - } - - input.close(); - output.close(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - private static List findMixins(JsonArray jsonArray){ - if(jsonArray == null || jsonArray.size() == 0){ - return Collections.emptyList(); - } - List mixinList = new ArrayList<>(); - for (int i = 0; i < jsonArray.size(); i++) { - mixinList.add(jsonArray.get(i).getAsString()); - } - return mixinList; - } - - private static List findModInfo(Set mods){ - List modFiles = mods.stream().map(file -> { - try { - JarFile jar = new JarFile(file); - return readModInfoFromJar(jar); - } catch (IOException e) { - throw new RuntimeException("Failed to mod " + file.getName(), e); - } - }).filter((Predicate) Objects::nonNull).collect(Collectors.toList()); - - List containedMods = new ArrayList<>(); - for(JsonArray modFile : modFiles){ - for (int i = 0; i < modFile.size(); i++) { - containedMods.add(modFile.get(i).getAsJsonObject()); - } - } - return containedMods; - } - - private static JsonArray readModInfoFromJar(@Nonnull JarFile file) throws IOException { - Gson gson = new Gson(); - ZipEntry entry = file.getEntry("mod.json"); - if (entry == null) - return null; - - InputStreamReader stream = new InputStreamReader(file.getInputStream(entry)); - JsonArray jsonArray = gson.fromJson(stream, JsonArray.class); - stream.close(); - - List mixins = new ArrayList<>(); - for (int i = 0; i < jsonArray.size(); i++) { - JsonObject modObject = jsonArray.get(i).getAsJsonObject(); - mixins.addAll(findMixins(modObject.getAsJsonArray("mixins"))); - mixins.addAll(findMixins(modObject.getAsJsonArray("clientMixins"))); - mixins.addAll(findMixins(modObject.getAsJsonArray("serverMixins"))); - } - - System.out.println("Found: " + mixins.size() + " mixins in " + file.getName()); - - mixins.forEach(s -> { - ZipEntry entry1 = file.getEntry(s); - try { - jarFileCache.put(s, file.getInputStream(entry1)); - } catch (IOException e) { - throw new RuntimeException("Failed to load jar", e); - } - }); - return jsonArray; - } - -} \ No newline at end of file diff --git a/src/main/java/net/fabricmc/loom/util/proccessing/PreBakeMixins.java b/src/main/java/net/fabricmc/loom/util/proccessing/PreBakeMixins.java deleted file mode 100644 index accdc66..0000000 --- a/src/main/java/net/fabricmc/loom/util/proccessing/PreBakeMixins.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * This file is part of fabric-loom, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 FabricMC - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package net.fabricmc.loom.util.proccessing; - -import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.task.ProcessModsTask; -import net.fabricmc.loom.util.Constants; -import org.gradle.api.Project; - -import java.io.File; -import java.io.IOException; -import java.util.List; - -public class PreBakeMixins { - - public void proccess(Project project, LoomGradleExtension extension, List mods) throws IOException { - project.getLogger().lifecycle(":Found " + mods.size() + " mods to prebake"); - String[] args = new String[mods.size() + 4]; - args[0] = "-m"; - args[1] = Constants.MAPPINGS_TINY.get(extension).getAbsolutePath(); - args[2] = Constants.MINECRAFT_MERGED_JAR.get(extension).getAbsolutePath(); - args[3] = Constants.MINECRAFT_MIXED_JAR.get(extension).getAbsolutePath(); - for (int i = 0; i < mods.size(); i++) { - args[i + 4] = mods.get(i).getAbsolutePath(); - } - project.getLogger().lifecycle(":preBaking mixins"); - ProcessModsTask.addFile(Constants.MINECRAFT_MIXED_JAR.get(extension), this); - MixinPrebaker.main(args, project); - } - -} diff --git a/src/main/resources/META-INF/services/org.spongepowered.asm.service.IMixinService b/src/main/resources/META-INF/services/org.spongepowered.asm.service.IMixinService deleted file mode 100644 index 75ed11a..0000000 --- a/src/main/resources/META-INF/services/org.spongepowered.asm.service.IMixinService +++ /dev/null @@ -1 +0,0 @@ -net.fabricmc.loom.mixin.MixinServiceGradle \ No newline at end of file diff --git a/src/main/resources/META-INF/services/org.spongepowered.tools.obfuscation.service.IObfuscationService b/src/main/resources/META-INF/services/org.spongepowered.tools.obfuscation.service.IObfuscationService deleted file mode 100644 index b3949cc..0000000 --- a/src/main/resources/META-INF/services/org.spongepowered.tools.obfuscation.service.IObfuscationService +++ /dev/null @@ -1 +0,0 @@ -net.fabricmc.loom.mixin.ObfuscationServiceFabric \ No newline at end of file From 18dfa2cdb20b6a7f8903b5cf8da6a7202dcefabd Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Sun, 5 Aug 2018 22:16:52 +0100 Subject: [PATCH 46/54] Fix crash, as we no longer have special mappings for the mixins, something will need to be done about this however, but it will most likey be at runtime --- src/main/java/net/fabricmc/loom/util/Constants.java | 1 - src/main/java/net/fabricmc/loom/util/ModRemapper.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/util/Constants.java b/src/main/java/net/fabricmc/loom/util/Constants.java index 5591483..e4d4b8f 100644 --- a/src/main/java/net/fabricmc/loom/util/Constants.java +++ b/src/main/java/net/fabricmc/loom/util/Constants.java @@ -49,7 +49,6 @@ public class Constants { public static final IDelayed MAPPINGS_DIR = new DelayedFile(extension -> new File(POMF_DIR.get(extension), "pomf-enigma-" + extension.version + "." + extension.pomfVersion + "")); public static IDelayed MAPPINGS_TINY_GZ = new DelayedFile(extension -> new File(POMF_DIR.get(extension), "pomf-tiny-" + extension.version + "." + extension.pomfVersion + ".gz")); public static final IDelayed MAPPINGS_TINY = new DelayedFile(extension -> new File(POMF_DIR.get(extension), "pomf-tiny-" + extension.version + "." + extension.pomfVersion)); - public static final IDelayed MAPPINGS_MIXIN_EXPORT = new DelayedFile(extension -> new File(CACHE_FILES, "mixin-map-" + extension.version + "." + extension.pomfVersion + ".mappings")); public static final IDelayed MAPPINGS_DIR_LOCAL = new DelayedFile(extension -> new File(WORKING_DIRECTORY, "mappings")); public static final IDelayed MAPPINGS_ZIP_LOCAL = new DelayedFile(extension -> new File(MAPPINGS_DIR_LOCAL.get(extension), "pomf-enigma-" + extension.version + ".zip")); diff --git a/src/main/java/net/fabricmc/loom/util/ModRemapper.java b/src/main/java/net/fabricmc/loom/util/ModRemapper.java index c8a1285..23fd5e2 100644 --- a/src/main/java/net/fabricmc/loom/util/ModRemapper.java +++ b/src/main/java/net/fabricmc/loom/util/ModRemapper.java @@ -78,7 +78,6 @@ public class ModRemapper { TinyRemapper remapper = TinyRemapper.newRemapper() .withMappings(TinyUtils.createTinyMappingProvider(mappings, fromM, toM)) - .withMappings(TinyUtils.createTinyMappingProvider(Constants.MAPPINGS_MIXIN_EXPORT.get(extension).toPath(), toM, fromM)) .build(); OutputConsumerPath outputConsumer = new OutputConsumerPath(modJar.toPath()); From 60fd3105cc6a85f04f511e843ab0081f6ae2dea9 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Tue, 7 Aug 2018 12:42:50 +0100 Subject: [PATCH 47/54] Remove LW, should also fix lwjgl 2 being added --- src/main/java/net/fabricmc/loom/task/DownloadTask.java | 3 --- src/main/java/net/fabricmc/loom/task/RunClientTask.java | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/task/DownloadTask.java b/src/main/java/net/fabricmc/loom/task/DownloadTask.java index 9118545..e4a1f4c 100644 --- a/src/main/java/net/fabricmc/loom/task/DownloadTask.java +++ b/src/main/java/net/fabricmc/loom/task/DownloadTask.java @@ -138,9 +138,6 @@ public class DownloadTask extends DefaultTask { version.libraries.stream().filter(lib -> lib.natives != null).forEach(lib -> dependencyHandler.add(Constants.CONFIG_NATIVES, lib.getArtifactName())); } - // Force add LaunchWrapper - dependencyHandler.add(Constants.CONFIG_MC_DEPENDENCIES, "net.minecraft:launchwrapper:1.12"); - Version.AssetIndex assetIndex = version.assetIndex; File assets = new File(extension.getUserCache(), "assets-" + extension.version); diff --git a/src/main/java/net/fabricmc/loom/task/RunClientTask.java b/src/main/java/net/fabricmc/loom/task/RunClientTask.java index e1de4d0..1e3e9e4 100644 --- a/src/main/java/net/fabricmc/loom/task/RunClientTask.java +++ b/src/main/java/net/fabricmc/loom/task/RunClientTask.java @@ -77,7 +77,7 @@ public class RunClientTask extends JavaExec { @Override public String getMain() { - return "net.minecraft.launchwrapper.Launch"; + return "cpw.mods.modlauncher.Launcher"; } @Override From dffcc5a9d8dace0f44ca054935c811d7b1c19909 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Tue, 7 Aug 2018 15:56:39 +0100 Subject: [PATCH 48/54] Fix OML building --- build.gradle | 10 ++++---- .../net/fabricmc/loom/util/ModRemapper.java | 24 +++++++++++-------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/build.gradle b/build.gradle index 9144bf4..3566492 100644 --- a/build.gradle +++ b/build.gradle @@ -53,16 +53,14 @@ dependencies { shade ('weave-asm:weave:0.1.0.7'){ transitive = false } - shade 'org.ow2.asm:asm-debug-all:5.2' - shade 'enigma-asm:enigma:0.12.0.17:lib' - shade 'net.fabricmc:tiny-remapper:+' + shade ('enigma-asm:enigma:0.12.0.33:lib'){ + exclude group: 'org.ow2.asm' + } + shade 'OpenModLoader.tiny-remapper:tiny-remapper:+' shade 'net.sf.jopt-simple:jopt-simple:5.0.4' shade 'org.apache.logging.log4j:log4j-api:2.11.0' shade 'org.apache.logging.log4j:log4j-core:2.11.0' - - shade 'cpw.mods:modlauncher:0.1.0-rc.3' - shade 'org.apache.commons:commons-lang3:3.5' } diff --git a/src/main/java/net/fabricmc/loom/util/ModRemapper.java b/src/main/java/net/fabricmc/loom/util/ModRemapper.java index 23fd5e2..6784712 100644 --- a/src/main/java/net/fabricmc/loom/util/ModRemapper.java +++ b/src/main/java/net/fabricmc/loom/util/ModRemapper.java @@ -69,7 +69,6 @@ public class ModRemapper { classpathFiles.addAll(project.getConfigurations().getByName("compile").getFiles()); classpathFiles.addAll(project.getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES_CLIENT).getFiles()); classpathFiles.addAll(project.getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES).getFiles()); - classpathFiles.add(new File(Constants.MINECRAFT_FINAL_JAR.get(extension).getAbsolutePath()));//Seems to fix it not finding it Path[] classpath = new Path[classpathFiles.size()]; for (int i = 0; i < classpathFiles.size(); i++) { @@ -80,17 +79,22 @@ public class ModRemapper { .withMappings(TinyUtils.createTinyMappingProvider(mappings, fromM, toM)) .build(); - OutputConsumerPath outputConsumer = new OutputConsumerPath(modJar.toPath()); - //Rebof the deobf jar - outputConsumer.addNonClassFiles(deobfJar.toPath()); - remapper.read(deobfJar.toPath()); - remapper.read(classpath); - remapper.apply(deobfJar.toPath(), outputConsumer); - outputConsumer.finish(); - remapper.finish(); + try { + OutputConsumerPath outputConsumer = new OutputConsumerPath(modJar.toPath()); + //Rebof the deobf jar + outputConsumer.addNonClassFiles(deobfJar.toPath()); + remapper.read(deobfJar.toPath()); + remapper.read(classpath); + remapper.apply(deobfJar.toPath(), outputConsumer); + outputConsumer.finish(); + remapper.finish(); + } catch (Exception e){ + remapper.finish(); + throw new RuntimeException("Failed to remap jar", e); + } if(!deobfJar.exists() || !modJar.exists()){ - throw new RuntimeException("Failed to remap jar"); + throw new RuntimeException("Failed to rebof jar"); } //Add the deobf jar to be uploaded to maven From 856e8b5c1fa86270f483641b30e323d4200214d4 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Tue, 7 Aug 2018 18:52:17 +0100 Subject: [PATCH 49/54] Mixin remapper + fixes. Now runs on notch names --- build.gradle | 4 +- .../net/fabricmc/loom/task/RunClientTask.java | 7 +- .../net/fabricmc/loom/util/ModRemapper.java | 142 +++++++++++++++++- 3 files changed, 145 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index 3566492..94e84a7 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ targetCompatibility = 1.8 group = 'com.openmodloader' archivesBaseName = project.name -version = '0.0.10-SNAPSHOT' +version = '0.0.11-SNAPSHOT' repositories { mavenCentral() @@ -56,7 +56,7 @@ dependencies { shade ('enigma-asm:enigma:0.12.0.33:lib'){ exclude group: 'org.ow2.asm' } - shade 'OpenModLoader.tiny-remapper:tiny-remapper:+' + shade 'OpenModLoader.tiny-remapper:tiny-remapper:0.1.0.7' shade 'net.sf.jopt-simple:jopt-simple:5.0.4' shade 'org.apache.logging.log4j:log4j-api:2.11.0' shade 'org.apache.logging.log4j:log4j-core:2.11.0' diff --git a/src/main/java/net/fabricmc/loom/task/RunClientTask.java b/src/main/java/net/fabricmc/loom/task/RunClientTask.java index 1e3e9e4..31b4bf5 100644 --- a/src/main/java/net/fabricmc/loom/task/RunClientTask.java +++ b/src/main/java/net/fabricmc/loom/task/RunClientTask.java @@ -66,6 +66,11 @@ public class RunClientTask extends JavaExec { } } libs.add(Constants.MINECRAFT_CLIENT_JAR.get(extension).getAbsolutePath()); + + //Removes the deobf jars + libs.removeIf(s -> s.contains(Constants.MINECRAFT_FINAL_JAR.get(extension).getName())); + libs.removeIf(s -> s.contains(getProject().getName() + "-" + getProject().getVersion() + "-deobf.jar")); + classpath(libs); args("--launchTarget", "oml", "--accessToken", "NOT_A_TOKEN", "--version", extension.version, "--assetIndex", version.assetIndex.id, "--assetsDir", new File(extension.getUserCache(), "assets-" + extension.version).getAbsolutePath()); @@ -85,7 +90,7 @@ public class RunClientTask extends JavaExec { LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); List args = new ArrayList<>(); args.add("-Djava.library.path=" + Constants.MINECRAFT_NATIVES.get(extension).getAbsolutePath()); - args.add("-XstartOnFirstThread"); //Fixes lwjgl starting on an incorrect thread + //args.add("-XstartOnFirstThread"); //Fixes lwjgl starting on an incorrect thread return args; } diff --git a/src/main/java/net/fabricmc/loom/util/ModRemapper.java b/src/main/java/net/fabricmc/loom/util/ModRemapper.java index 6784712..80858bf 100644 --- a/src/main/java/net/fabricmc/loom/util/ModRemapper.java +++ b/src/main/java/net/fabricmc/loom/util/ModRemapper.java @@ -25,17 +25,21 @@ package net.fabricmc.loom.util; import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.tinyremapper.OutputConsumerPath; -import net.fabricmc.tinyremapper.TinyRemapper; -import net.fabricmc.tinyremapper.TinyUtils; +import net.fabricmc.tinyremapper.*; import org.apache.commons.io.FileUtils; import org.gradle.api.Project; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.Type; +import org.objectweb.asm.tree.AnnotationNode; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.FieldNode; +import org.objectweb.asm.tree.MethodNode; import java.io.File; import java.io.IOException; import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; +import java.util.*; public class ModRemapper { @@ -77,6 +81,7 @@ public class ModRemapper { TinyRemapper remapper = TinyRemapper.newRemapper() .withMappings(TinyUtils.createTinyMappingProvider(mappings, fromM, toM)) + .withRemapperExtension(new MixinRemapper()) .build(); try { @@ -100,4 +105,131 @@ public class ModRemapper { //Add the deobf jar to be uploaded to maven project.getArtifacts().add("archives", deobfJar); } + + public static class MixinRemapper implements IRemapperExtension{ + + @Override + public byte[] handleUnmappedClass(byte[] inBytes, TinyRemapper remapper) { + //I know this isnt the fastest, but its the easiest + ClassNode classNode = readClassFromBytes(inBytes); + if(isMixin(classNode)){ + String target = getMixinTarget(classNode); + System.out.println("Remapping mixin (" + classNode.name + ") targeting: " + target); + for(MethodNode methodNode : classNode.methods){ + if(needsTargetMap(methodNode.visibleAnnotations)){ + methodNode.visibleAnnotations.add(createTargetMap(methodNode, target, remapper)); + } + } + for(FieldNode fieldNode : classNode.fields){ + if(needsTargetMap(fieldNode.visibleAnnotations)){ + //fieldNode.visibleAnnotations.add(createTargetMap(fieldNode)); + } + } + return writeClassToBytes(classNode); + } + return inBytes; + } + + private AnnotationNode createTargetMap(MethodNode methodNode, String targetClass, TinyRemapper remapper){ + AnnotationNode targetMapNode = new AnnotationNode("Lme/modmuss50/fusion/api/TargetMap;"); + String deobfTarget = methodNode.name + methodNode.desc; + if(getRewriteTarget(methodNode).isPresent()){ + deobfTarget = getRewriteTarget(methodNode).get(); + } + + if(deobfTarget.equals("")){ + //No need to handle constructors, may need to do something about the desc but we will see + return targetMapNode; + } + String oldName = deobfTarget.substring(0, deobfTarget.indexOf("(")); + String oldDesc = deobfTarget.substring(deobfTarget.lastIndexOf("(")); + + String newName = remapper.remapper.mapMethodName(targetClass.replaceAll("\\.", "/"), oldName, oldDesc); + String newDesc = remapper.remapper.mapDesc(oldDesc); + + System.out.println(oldName + oldDesc + " -> " + newName + newDesc); + targetMapNode.visit("value", newName + newDesc); + return targetMapNode; + } + + private boolean isMixin(ClassNode classNode){ + if(classNode.visibleAnnotations == null){ + return false; + } + for(AnnotationNode annotation : classNode.visibleAnnotations){ + if(annotation.desc.equals("Lme/modmuss50/fusion/api/Mixin;")){ + return true; + } + } + return false; + } + + private String getMixinTarget(ClassNode classNode){ + if(classNode.visibleAnnotations == null){ + throw new RuntimeException(classNode.name + " is not a mixin!"); + } + for(AnnotationNode annotation : classNode.visibleAnnotations){ + if(annotation.desc.equals("Lme/modmuss50/fusion/api/Mixin;")){ + for (int i = 0; i < annotation.values.size(); i++) { + Object value = annotation.values.get(i); + if(value instanceof String && value.toString().equals("value")){ + Type target = (Type) annotation.values.get(i + 1); + return target.getClassName(); + } + } + + } + } + throw new RuntimeException(classNode.name + " is not a valid mixin!"); + } + + private Optional getRewriteTarget(MethodNode methodNode){ + if(methodNode.visibleAnnotations == null){ + return Optional.empty(); + } + for(AnnotationNode annotation : methodNode.visibleAnnotations){ + if(annotation.desc.equals("Lme/modmuss50/fusion/api/Rewrite;")){ + for (int i = 0; i < annotation.values.size(); i++) { + Object value = annotation.values.get(i); + if(value instanceof String && value.toString().equals("target")){ + return Optional.of((String) annotation.values.get(i + 1)); + } + } + } + } + return Optional.empty(); + } + + private boolean needsTargetMap(List annotationNodes){ + if(annotationNodes == null){ + return false; + } + for(AnnotationNode annotation : annotationNodes){ + if(annotation.desc.equals("Lme/modmuss50/fusion/api/Rewrite;")){ + return true; + } + if(annotation.desc.equals("Lme/modmuss50/fusion/api/Inject;")){ + return true; + } + } + return false; + } + + + private static ClassNode readClassFromBytes(byte[] bytes) { + ClassNode classNode = new org.objectweb.asm.tree.ClassNode(); + ClassReader classReader = new ClassReader(bytes); + classReader.accept(classNode, 0); + return classNode; + } + + private static byte[] writeClassToBytes(ClassNode classNode) { + ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); + classNode.accept(writer); + return writer.toByteArray(); + } + + } + + } From add71b622b5cf57d75d0f3066c0ffda1cba27d9f Mon Sep 17 00:00:00 2001 From: TheCodedOne Date: Fri, 10 Aug 2018 18:15:05 +0100 Subject: [PATCH 50/54] Fix maven location --- build.gradle | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 94e84a7..cc45d35 100644 --- a/build.gradle +++ b/build.gradle @@ -2,8 +2,7 @@ plugins { id 'java' id 'groovy' id 'maven' - id 'maven-publish' - + id 'maven-publish' id 'idea' id 'eclipse' } @@ -88,7 +87,7 @@ task wrapper(type: Wrapper) { publishing { publications { maven(MavenPublication) { - groupId 'OpenGradle' + groupId project.group artifactId project.archivesBaseName version project.version From bf07da6c30e926b21ff421c538097aca746d1ca2 Mon Sep 17 00:00:00 2001 From: TheCodedOne Date: Sat, 18 Aug 2018 02:00:48 +0100 Subject: [PATCH 51/54] Fix dev env --- src/main/java/net/fabricmc/loom/AbstractPlugin.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/AbstractPlugin.java b/src/main/java/net/fabricmc/loom/AbstractPlugin.java index 42cb8ae..5c523b6 100644 --- a/src/main/java/net/fabricmc/loom/AbstractPlugin.java +++ b/src/main/java/net/fabricmc/loom/AbstractPlugin.java @@ -184,7 +184,7 @@ public class AbstractPlugin implements Plugin { project1.getRepositories().maven(mavenArtifactRepository -> { mavenArtifactRepository.setName("modmuss50"); - mavenArtifactRepository.setUrl("https://maven.modmuss50.me"); + mavenArtifactRepository.setUrl("https://maven.modmuss50.me/"); }); project1.getRepositories().maven(mavenArtifactRepository -> { @@ -213,9 +213,9 @@ public class AbstractPlugin implements Plugin { } project1.getDependencies().add(Constants.CONFIG_MC_DEPENDENCIES, "net.minecraft:" + Constants.MINECRAFT_FINAL_JAR.get(extension).getName().replace(".jar", "")); - if (extension.omlVersion != null && !extension.omlVersion.isEmpty()) { - //only add this when not in a fabric dev env - project1.getDependencies().add(Constants.CONFIG_MC_DEPENDENCIES, "OpenModLoader:OpenModLoader:" + extension.version + "-" + extension.omlVersion); + if (extension.isModWorkspace()) { + //only add this when not in a dev env + project1.getDependencies().add(Constants.CONFIG_MC_DEPENDENCIES, "com.openmodloader:OpenModLoader:" + extension.getVersionString()); } }); From 76f94700abcea00a82e48668f75d92908afc6427 Mon Sep 17 00:00:00 2001 From: TheCodedOne Date: Sat, 18 Aug 2018 02:03:19 +0100 Subject: [PATCH 52/54] Dont make different things for every damn OML version --- src/main/java/net/fabricmc/loom/util/Constants.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/util/Constants.java b/src/main/java/net/fabricmc/loom/util/Constants.java index e4d4b8f..63e2cdd 100644 --- a/src/main/java/net/fabricmc/loom/util/Constants.java +++ b/src/main/java/net/fabricmc/loom/util/Constants.java @@ -41,8 +41,8 @@ public class Constants { public static final IDelayed MINECRAFT_SERVER_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-server.jar")); public static final IDelayed MINECRAFT_MERGED_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-merged.jar")); public static final IDelayed MINECRAFT_MIXED_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-mixed.jar")); - public static final IDelayed MINECRAFT_MAPPED_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.getVersionString() + "-mapped-" + extension.pomfVersion + ".jar")); - public static final IDelayed MINECRAFT_FINAL_JAR = new DelayedFile(extension -> new File(CACHE_FILES, extension.getVersionString() + "-final-" + extension.pomfVersion + ".jar")); + public static final IDelayed MINECRAFT_MAPPED_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-mapped-" + extension.pomfVersion + ".jar")); + public static final IDelayed MINECRAFT_FINAL_JAR = new DelayedFile(extension -> new File(CACHE_FILES, extension.version + "-final-" + extension.pomfVersion + ".jar")); public static final IDelayed POMF_DIR = new DelayedFile(extension -> new File(extension.getUserCache(), "pomf")); public static IDelayed MAPPINGS_ZIP = new DelayedFile(extension -> new File(POMF_DIR.get(extension), "pomf-enigma-" + extension.version + "." + extension.pomfVersion + ".zip")); From 6666738b92125bd831c47c4f562a01239ddc1d12 Mon Sep 17 00:00:00 2001 From: TheCodedOne Date: Sat, 18 Aug 2018 02:40:23 +0100 Subject: [PATCH 53/54] Use deobf jar --- src/main/java/net/fabricmc/loom/AbstractPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/fabricmc/loom/AbstractPlugin.java b/src/main/java/net/fabricmc/loom/AbstractPlugin.java index 5c523b6..21a39ce 100644 --- a/src/main/java/net/fabricmc/loom/AbstractPlugin.java +++ b/src/main/java/net/fabricmc/loom/AbstractPlugin.java @@ -215,7 +215,7 @@ public class AbstractPlugin implements Plugin { if (extension.isModWorkspace()) { //only add this when not in a dev env - project1.getDependencies().add(Constants.CONFIG_MC_DEPENDENCIES, "com.openmodloader:OpenModLoader:" + extension.getVersionString()); + project1.getDependencies().add(Constants.CONFIG_MC_DEPENDENCIES, "com.openmodloader:OpenModLoader:" + extension.getVersionString() +":deobf"); } }); From b8f0ec9d95bae1120b9b3a03b9dc4eb455f86095 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Mon, 22 Oct 2018 19:25:18 +0100 Subject: [PATCH 54/54] Revert to old name --- build.gradle | 4 ++-- gradle.properties | 6 +++--- src/main/java/net/fabricmc/loom/LoomGradleExtension.java | 2 +- .../fabricmc/loom/LoomGradlePlugin.java} | 5 ++--- .../gradle-plugins/com.openmodloader.gradle.properties | 2 +- 5 files changed, 9 insertions(+), 10 deletions(-) rename src/main/java/{com/openmodloader/gradle/OpenGradlePlugin.java => net/fabricmc/loom/LoomGradlePlugin.java} (94%) diff --git a/build.gradle b/build.gradle index cc45d35..f9b880c 100644 --- a/build.gradle +++ b/build.gradle @@ -10,9 +10,9 @@ plugins { sourceCompatibility = 1.8 targetCompatibility = 1.8 -group = 'com.openmodloader' +group = 'net.fabricmc' archivesBaseName = project.name -version = '0.0.11-SNAPSHOT' +version = '0.0.12-SNAPSHOT' repositories { mavenCentral() diff --git a/gradle.properties b/gradle.properties index 036af22..69c68a8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ -name = OpenGradle -description = The Gradle plugin for OpenModLoader -url = https://github.com/OpenModLoader/OpenGradle +name = fabric-loom +description = The Gradle plugin for Fabric +url = https://github.com/FabricMC/fabric-loom \ No newline at end of file diff --git a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java index 27be810..c4250da 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java +++ b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java @@ -51,7 +51,7 @@ public class LoomGradleExtension { } public File getUserCache() { - File userCache = new File(project.getGradle().getGradleUserHomeDir(), "caches" + File.separator + "opengradle"); + File userCache = new File(project.getGradle().getGradleUserHomeDir(), "caches" + File.separator + "fabric-loom"); if (!userCache.exists()) { userCache.mkdirs(); } diff --git a/src/main/java/com/openmodloader/gradle/OpenGradlePlugin.java b/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java similarity index 94% rename from src/main/java/com/openmodloader/gradle/OpenGradlePlugin.java rename to src/main/java/net/fabricmc/loom/LoomGradlePlugin.java index a1efb20..2a551d6 100644 --- a/src/main/java/com/openmodloader/gradle/OpenGradlePlugin.java +++ b/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java @@ -22,14 +22,13 @@ * SOFTWARE. */ -package com.openmodloader.gradle; +package net.fabricmc.loom; -import net.fabricmc.loom.AbstractPlugin; import net.fabricmc.loom.task.*; import org.gradle.api.DefaultTask; import org.gradle.api.Project; -public class OpenGradlePlugin extends AbstractPlugin { +public class LoomGradlePlugin extends AbstractPlugin { @Override public void apply(Project target) { super.apply(target); diff --git a/src/main/resources/META-INF/gradle-plugins/com.openmodloader.gradle.properties b/src/main/resources/META-INF/gradle-plugins/com.openmodloader.gradle.properties index ae280f1..dffb4b5 100644 --- a/src/main/resources/META-INF/gradle-plugins/com.openmodloader.gradle.properties +++ b/src/main/resources/META-INF/gradle-plugins/com.openmodloader.gradle.properties @@ -1 +1 @@ -implementation-class=com.openmodloader.gradle.OpenGradlePlugin \ No newline at end of file +implementation-class=net.fabricmc.loom.LoomGradlePlugin \ No newline at end of file