diff --git a/src/main/java/net/fabricmc/loom/AbstractPlugin.java b/src/main/java/net/fabricmc/loom/AbstractPlugin.java index e4679dd..d6da82b 100644 --- a/src/main/java/net/fabricmc/loom/AbstractPlugin.java +++ b/src/main/java/net/fabricmc/loom/AbstractPlugin.java @@ -56,6 +56,7 @@ public class AbstractPlugin implements Plugin { project.apply(ImmutableMap.of("plugin", "idea")); project.getExtensions().create("minecraft", LoomGradleExtension.class); + project.getExtensions().getByType(LoomGradleExtension.class).project = project; // Force add Mojang repository addMavenRepo(target, "Mojang", "https://libraries.minecraft.net/"); @@ -152,6 +153,11 @@ public class AbstractPlugin implements Plugin { flatDirectoryArtifactRepository.setName("LoomCacheFiles"); }); + project1.getRepositories().flatDir(flatDirectoryArtifactRepository -> { + flatDirectoryArtifactRepository.dir(extension.getFabricUserCache()); + flatDirectoryArtifactRepository.setName("UserCacheFiles"); + }); + project1.getRepositories().maven(mavenArtifactRepository -> { mavenArtifactRepository.setName("FabricMC"); mavenArtifactRepository.setUrl("http://maven.fabricmc.net/"); @@ -175,7 +181,7 @@ public class AbstractPlugin implements Plugin { DownloadTask.downloadMcJson(extension, project1.getLogger()); Version version = gson.fromJson(new FileReader(Constants.MINECRAFT_JSON.get(extension)), Version.class); for (Version.Library library : version.libraries) { - if (library.allowed() && library.getFile() != null) { + if (library.allowed() && library.getFile(extension) != null) { String configName = Constants.CONFIG_MC_DEPENDENCIES; if (library.name.contains("java3d") || library.name.contains("paulscode") || library.name.contains("lwjgl") || library.name.contains("twitch") || library.name.contains("jinput")) { configName = Constants.CONFIG_MC_DEPENDENCIES_CLIENT; diff --git a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java index 8f1d585..ad8cea5 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java +++ b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java @@ -24,8 +24,34 @@ package net.fabricmc.loom; +import org.gradle.api.Project; + +import java.io.File; + public class LoomGradleExtension { public String version; public String runDir = "run"; public String fabricVersion; + + //Not to be set in the build.gradle + public Project project; + + public String getVersionString() { + if (isModWorkspace()) { + return version + "-" + fabricVersion; + } + return version; + } + + public boolean isModWorkspace() { + return fabricVersion != null && !fabricVersion.isEmpty(); + } + + public File getFabricUserCache() { + File userCache = new File(project.getGradle().getGradleUserHomeDir(), "caches" + File.separator + "loom"); + if (!userCache.exists()) { + userCache.mkdirs(); + } + return userCache; + } } diff --git a/src/main/java/net/fabricmc/loom/task/DownloadTask.java b/src/main/java/net/fabricmc/loom/task/DownloadTask.java index 1cf0dac..a8a8df8 100644 --- a/src/main/java/net/fabricmc/loom/task/DownloadTask.java +++ b/src/main/java/net/fabricmc/loom/task/DownloadTask.java @@ -80,7 +80,7 @@ public class DownloadTask extends DefaultTask { if (getProject().getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES).getState() == Configuration.State.UNRESOLVED) { for (Version.Library library : version.libraries) { - if (library.allowed() && library.getFile() != null) { + if (library.allowed() && library.getFile(extension) != null) { // By default, they are all available on all sides String configName = Constants.CONFIG_MC_DEPENDENCIES; if (library.name.contains("java3d") || library.name.contains("paulscode") || library.name.contains("lwjgl") || library.name.contains("twitch") || library.name.contains("jinput")) { @@ -100,7 +100,7 @@ public class DownloadTask extends DefaultTask { Version.AssetIndex assetIndex = version.assetIndex; - File assets = new File(Constants.CACHE_FILES, "assets"); + File assets = new File(extension.getFabricUserCache(), "assets-" + extension.version); if (!assets.exists()) { assets.mkdirs(); } @@ -143,8 +143,8 @@ public class DownloadTask extends DefaultTask { public static void downloadMcJson(LoomGradleExtension extension, Logger logger) throws IOException { if (!Constants.MINECRAFT_JSON.get(extension).exists()) { logger.lifecycle(":downloading minecraft json"); - FileUtils.copyURLToFile(new URL("https://launchermeta.mojang.com/mc/game/version_manifest.json"), Constants.VERSION_MANIFEST); - ManifestVersion mcManifest = new GsonBuilder().create().fromJson(FileUtils.readFileToString(Constants.VERSION_MANIFEST), ManifestVersion.class); + FileUtils.copyURLToFile(new URL("https://launchermeta.mojang.com/mc/game/version_manifest.json"), Constants.VERSION_MANIFEST.get(extension)); + ManifestVersion mcManifest = new GsonBuilder().create().fromJson(FileUtils.readFileToString(Constants.VERSION_MANIFEST.get(extension)), ManifestVersion.class); Optional optionalVersion = mcManifest.versions.stream().filter(versions -> versions.id.equalsIgnoreCase(extension.version)).findFirst(); if (optionalVersion.isPresent()) { diff --git a/src/main/java/net/fabricmc/loom/task/ExtractNativesTask.java b/src/main/java/net/fabricmc/loom/task/ExtractNativesTask.java index ed660db..7a96065 100644 --- a/src/main/java/net/fabricmc/loom/task/ExtractNativesTask.java +++ b/src/main/java/net/fabricmc/loom/task/ExtractNativesTask.java @@ -24,6 +24,7 @@ package net.fabricmc.loom.task; +import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.util.Constants; import org.gradle.api.DefaultTask; import org.gradle.api.tasks.TaskAction; @@ -35,9 +36,10 @@ import java.io.FileNotFoundException; public class ExtractNativesTask extends DefaultTask { @TaskAction public void extractNatives() throws FileNotFoundException { - if (!Constants.MINECRAFT_NATIVES.exists()) { + LoomGradleExtension extension = getProject().getExtensions().getByType(LoomGradleExtension.class); + if (!Constants.MINECRAFT_NATIVES.get(extension).exists()) { for (File source : getProject().getConfigurations().getByName(Constants.CONFIG_NATIVES)) { - ZipUtil.unpack(source, Constants.MINECRAFT_NATIVES); + ZipUtil.unpack(source, Constants.MINECRAFT_NATIVES.get(extension)); } } } diff --git a/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java b/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java index c09a600..f0b8d49 100644 --- a/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenIdeaProjectTask.java @@ -103,7 +103,7 @@ public class GenIdeaProjectTask extends DefaultTask { Version version = gson.fromJson(new FileReader(Constants.MINECRAFT_JSON.get(extension)), Version.class); for (Version.Library library : version.libraries) { - if (library.allowed() && library.getFile() != null && library.getFile().exists()) { + if (library.allowed() && library.getFile(extension) != null && library.getFile(extension).exists()) { Element node = doc.createElement("orderEntry"); node.setAttribute("type", "module-library"); Element libraryElement = doc.createElement("library"); @@ -111,7 +111,7 @@ public class GenIdeaProjectTask extends DefaultTask { Element javadoc = doc.createElement("JAVADOC"); Element sources = doc.createElement("SOURCES"); Element root = doc.createElement("root"); - root.setAttribute("url", "jar://" + library.getFile().getAbsolutePath() + "!/"); + root.setAttribute("url", "jar://" + library.getFile(extension).getAbsolutePath() + "!/"); classes.appendChild(root); libraryElement.appendChild(classes); libraryElement.appendChild(javadoc); @@ -119,7 +119,7 @@ public class GenIdeaProjectTask extends DefaultTask { node.appendChild(libraryElement); component.appendChild(node); } else if (!library.allowed()) { - this.getLogger().info(":" + library.getFile().getName() + " is not allowed on this os"); + this.getLogger().info(":" + library.getFile(extension).getName() + " is not allowed on this os"); } } @@ -172,7 +172,7 @@ public class GenIdeaProjectTask extends DefaultTask { ideaClient.configName = "Minecraft Client"; ideaClient.runDir = "file://$PROJECT_DIR$/" + extension.runDir; ideaClient.vmArgs = "-Djava.library.path=../.gradle/minecraft/natives/ -Dfabric.development=true"; - ideaClient.programArgs = "--tweakClass net.fabricmc.base.launch.FabricClientTweaker --assetIndex " + version.assetIndex.id + " --assetsDir " + new File(Constants.CACHE_FILES, "assets").getAbsolutePath(); + ideaClient.programArgs = "--tweakClass net.fabricmc.base.launch.FabricClientTweaker --assetIndex " + version.assetIndex.id + " --assetsDir " + new File(extension.getFabricUserCache(), "assets-" + extension.version).getAbsolutePath(); runManager.appendChild(ideaClient.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 4511985..b76fddc 100644 --- a/src/main/java/net/fabricmc/loom/task/MapJarsTask.java +++ b/src/main/java/net/fabricmc/loom/task/MapJarsTask.java @@ -49,10 +49,14 @@ public class MapJarsTask extends DefaultTask { if (Constants.MAPPINGS_DIR.exists()) { FileUtils.deleteDirectory(Constants.MAPPINGS_DIR); } + if (Constants.MINECRAFT_MAPPED_JAR.get(extension).exists()) { + Constants.MINECRAFT_MAPPED_JAR.get(extension).delete(); + } ZipUtil.unpack(Constants.MAPPINGS_ZIP, Constants.MAPPINGS_DIR); File tempFile = new File(Constants.CACHE_FILES, "tempJar.jar"); if (tempFile.exists()) { + //This should not happen, just want to be safe tempFile.delete(); } diff --git a/src/main/java/net/fabricmc/loom/util/Constants.java b/src/main/java/net/fabricmc/loom/util/Constants.java index 2239c7e..9923581 100644 --- a/src/main/java/net/fabricmc/loom/util/Constants.java +++ b/src/main/java/net/fabricmc/loom/util/Constants.java @@ -37,22 +37,19 @@ 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(CACHE_FILES, extension.version + "-client.jar")); - public static final IDelayed MINECRAFT_SERVER_JAR = new DelayedFile(extension -> new File(CACHE_FILES, extension.version + "-server.jar")); - public static final IDelayed MINECRAFT_MERGED_JAR = new DelayedFile(extension -> new File(CACHE_FILES, extension.version + "-merged.jar")); - public static final IDelayed MINECRAFT_MAPPED_JAR = new DelayedFile(extension -> new File(CACHE_FILES, extension.version + "-mapped.jar")); + 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.jar")); public static final File MAPPINGS_ZIP = new File(CACHE_FILES, "mappings.zip"); public static final File MAPPINGS_DIR = new File(CACHE_FILES, "mappings"); - public static final File MINECRAFT_LIBS = new File(CACHE_FILES, "libs"); - public static final File MINECRAFT_NATIVES = new File(CACHE_FILES, "natives"); - public static final IDelayed MINECRAFT_JSON = new DelayedFile(extension -> new File(CACHE_FILES, extension.version + "-info.json")); + 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 File MINECRAFT_ROOT = new File(WORKING_DIRECTORY, "minecraft"); - public static final IDelayed MAPPING_SRG = new DelayedFile(extension -> new File(WORKING_DIRECTORY, "mappings.srg")); - - public static final File VERSION_MANIFEST = new File(CACHE_FILES, "version_manifest.json"); + public static final IDelayed VERSION_MANIFEST = new DelayedFile(extension -> new File(extension.getFabricUserCache(), "version_manifest.json")); public static final String LIBRARIES_BASE = "https://libraries.minecraft.net/"; public static final String RESOURCES_BASE = "http://resources.download.minecraft.net/"; diff --git a/src/main/java/net/fabricmc/loom/util/Version.java b/src/main/java/net/fabricmc/loom/util/Version.java index 8b0b9ea..1fcccc4 100644 --- a/src/main/java/net/fabricmc/loom/util/Version.java +++ b/src/main/java/net/fabricmc/loom/util/Version.java @@ -25,6 +25,7 @@ package net.fabricmc.loom.util; import com.google.gson.JsonObject; +import net.fabricmc.loom.LoomGradleExtension; import java.io.File; import java.util.List; @@ -60,9 +61,9 @@ public class Version { return Constants.LIBRARIES_BASE + path; } - public File getFile() { + public File getFile(LoomGradleExtension extension) { String[] parts = this.name.split(":", 3); - return new File(Constants.MINECRAFT_LIBS, parts[0].replace(".", File.separator) + File.separator + parts[1] + File.separator + parts[2] + File.separator + parts[1] + "-" + parts[2] + getClassifier() + ".jar"); + return new File(Constants.MINECRAFT_LIBS.get(extension), parts[0].replace(".", File.separator) + File.separator + parts[1] + File.separator + parts[2] + File.separator + parts[1] + "-" + parts[2] + getClassifier() + ".jar"); } public String getSha1() {