diff options
author | shedaniel <daniel@shedaniel.me> | 2021-08-14 02:31:16 +0800 |
---|---|---|
committer | shedaniel <daniel@shedaniel.me> | 2021-08-14 02:31:16 +0800 |
commit | 83de8bbc9afaa8da8ec0df95de9430da6678a3c4 (patch) | |
tree | 86cdd94797bf046a609fbebfb5fd233c04bbc220 /src/main/java/net/fabricmc/loom/configuration | |
parent | ab4ae39664f5bbb5aa12d6be5b249bdd29e4c4e4 (diff) | |
parent | 159e573cade48ee649fc0dc2c9111cda77dd7816 (diff) | |
download | architectury-loom-83de8bbc9afaa8da8ec0df95de9430da6678a3c4.tar.gz architectury-loom-83de8bbc9afaa8da8ec0df95de9430da6678a3c4.tar.bz2 architectury-loom-83de8bbc9afaa8da8ec0df95de9430da6678a3c4.zip |
Merge remote-tracking branch 'FabricMC/dev/0.9' into dev/0.9
# Conflicts:
# build.gradle
# src/main/java/net/fabricmc/loom/LoomGradleExtension.java
# src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java
# src/main/java/net/fabricmc/loom/build/JarRemapper.java
# src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java
# src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java
# src/main/java/net/fabricmc/loom/configuration/providers/mappings/GradleMappingContext.java
# src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java
# src/main/java/net/fabricmc/loom/task/AbstractLoomTask.java
# src/main/java/net/fabricmc/loom/task/AbstractRunTask.java
# src/main/java/net/fabricmc/loom/task/LoomTasks.java
# src/main/java/net/fabricmc/loom/util/Constants.java
# src/main/java/net/fabricmc/loom/util/SourceRemapper.java
# src/test/groovy/net/fabricmc/loom/test/unit/layeredmappings/LayeredMappingSpecBuilderTest.groovy
# src/test/resources/projects/kotlin/build.gradle.kts
Diffstat (limited to 'src/main/java/net/fabricmc/loom/configuration')
15 files changed, 158 insertions, 42 deletions
diff --git a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java index 42d6e0fd..e6589da5 100644 --- a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java +++ b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java @@ -29,7 +29,6 @@ import org.gradle.api.artifacts.ConfigurationContainer; 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.jvm.tasks.Jar; @@ -147,11 +146,6 @@ public final class CompileConfiguration { Javadoc javadoc = (Javadoc) p.getTasks().getByName(JavaPlugin.JAVADOC_TASK_NAME); javadoc.setClasspath(main.getOutput().plus(main.getCompileClasspath())); - p.getTasks().withType(JavaCompile.class).configureEach(compile -> { - // Fork the java compiler to ensure that it does not keep any files open. - compile.getOptions().setFork(true); - }); - p.afterEvaluate(project -> { LoomGradleExtension extension = LoomGradleExtension.get(project); @@ -186,9 +180,10 @@ public final class CompileConfiguration { SetupIntelijRunConfigs.setup(project); GenVsCodeProjectTask.generate(project); + extension.getRemapArchives().finalizeValue(); // Enables the default mod remapper - if (extension.isRemapMod()) { + if (extension.getRemapArchives().get()) { RemapConfiguration.setupDefaultRemap(project); } else { Jar jarTask = (Jar) project.getTasks().getByName("jar"); @@ -201,7 +196,7 @@ public final class CompileConfiguration { System.setProperty("log4j.skipJansi", "true"); project.getLogger().info("Configuring compiler arguments for Java"); - MixinApExtension mixinApExtension = LoomGradleExtension.get(project).getMixinApExtension(); + MixinApExtension mixinApExtension = LoomGradleExtension.get(project).getMixin(); mixinApExtension.init(); new JavaApInvoker(project).configureMixin(); diff --git a/src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java b/src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java index b0568731..b14d2678 100644 --- a/src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java +++ b/src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java @@ -25,6 +25,7 @@ package net.fabricmc.loom.configuration; import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -170,7 +171,15 @@ public class LoomDependencyManager { ModCompileRemapper.remapDependencies(project, mappingsKey, extension, sourceRemapper); - sourceRemapper.remapAll(); + long start = System.currentTimeMillis(); + + try { + sourceRemapper.remapAll(); + } catch (IOException exception) { + throw new RuntimeException("Failed to remap mod sources", exception); + } + + project.getLogger().info("Source remapping took: %dms".formatted(System.currentTimeMillis() - start)); for (Runnable runnable : afterTasks) { runnable.run(); diff --git a/src/main/java/net/fabricmc/loom/configuration/RemapConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/RemapConfiguration.java index f8d45018..6afcf2c1 100644 --- a/src/main/java/net/fabricmc/loom/configuration/RemapConfiguration.java +++ b/src/main/java/net/fabricmc/loom/configuration/RemapConfiguration.java @@ -105,7 +105,7 @@ public class RemapConfiguration { // TODO what is this for? Task parentTask = project.getTasks().getByName("build"); - if (extension.isShareCaches()) { + if (extension.getShareRemapCaches().get()) { Project rootProject = project.getRootProject(); if (extension.isRootProject()) { @@ -116,7 +116,6 @@ public class RemapConfiguration { rootProject.getTasks().register(remapAllSourcesTaskName, RemapAllSourcesTask.class, task -> { task.sourceRemapper = sourceRemapper; - task.doLast(t -> sourceRemapper.remapAll()); }); parentTask = rootProject.getTasks().getByName(remapAllSourcesTaskName); @@ -165,7 +164,7 @@ public class RemapConfiguration { }); } - if (extension.isShareCaches()) { + if (extension.getShareRemapCaches().get()) { remapSourcesJarTask.setSourceRemapper(remapper); } diff --git a/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerJarProcessor.java b/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerJarProcessor.java index ef2f37e1..cecf4d34 100644 --- a/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerJarProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerJarProcessor.java @@ -71,16 +71,22 @@ public class AccessWidenerJarProcessor implements JarProcessor { } @Override + public String getId() { + return "loom:access_widener"; + } + + @Override public void setup() { LoomGradleExtension loomGradleExtension = LoomGradleExtension.get(project); + File awPath = loomGradleExtension.getAccessWidenerPath().get().getAsFile(); - if (!loomGradleExtension.getAccessWidener().exists()) { - throw new RuntimeException("Could not find access widener file @ " + loomGradleExtension.getAccessWidener().getAbsolutePath()); + if (!awPath.exists()) { + throw new RuntimeException("Could not find access widener file @ " + awPath.getAbsolutePath()); } - inputHash = Checksum.sha256(loomGradleExtension.getAccessWidener()); + inputHash = Checksum.sha256(awPath); - try (BufferedReader reader = new BufferedReader(new FileReader(loomGradleExtension.getAccessWidener()))) { + try (BufferedReader reader = new BufferedReader(new FileReader(awPath))) { accessWidenerReader.read(reader); } catch (IOException e) { throw new RuntimeException("Failed to read project access widener file"); diff --git a/src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java b/src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java index a9335764..8c60619f 100644 --- a/src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java +++ b/src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java @@ -52,6 +52,7 @@ import org.w3c.dom.Element; import org.w3c.dom.Node; import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.configuration.InstallerData; import net.fabricmc.loom.util.OperatingSystem; public class RunConfig { @@ -269,7 +270,13 @@ public class RunConfig { } private static String getMainClass(String side, LoomGradleExtension extension, String defaultMainClass) { - JsonObject installerJson = extension.getInstallerData() == null ? null : extension.getInstallerData().installerJson(); + InstallerData installerData = extension.getInstallerData() == null ? null : extension.getInstallerData(); + + if (installerData == null) { + return defaultMainClass; + } + + JsonObject installerJson = installerData.installerJson(); if (installerJson != null && installerJson.has("mainClass")) { JsonElement mainClassJson = installerJson.get("mainClass"); diff --git a/src/main/java/net/fabricmc/loom/configuration/processors/JarProcessor.java b/src/main/java/net/fabricmc/loom/configuration/processors/JarProcessor.java index 33cde23b..71f9a6bf 100644 --- a/src/main/java/net/fabricmc/loom/configuration/processors/JarProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/processors/JarProcessor.java @@ -27,6 +27,18 @@ package net.fabricmc.loom.configuration.processors; import java.io.File; public interface JarProcessor { + /** + * Returns a unique ID for this jar processor, containing all configuration details. + * + * <p>If the jar processor implementation class supports creating multiple jar processors with different effects, + * the needed configuration should also be included in this ID. Example: {@code path.to.MyJarProcessor#someOption}. + * + * @return the ID of this jar processor + */ + default String getId() { + return getClass().getName(); + } + void setup(); /** diff --git a/src/main/java/net/fabricmc/loom/configuration/processors/JarProcessorManager.java b/src/main/java/net/fabricmc/loom/configuration/processors/JarProcessorManager.java index 9ee6864d..4c36c40d 100644 --- a/src/main/java/net/fabricmc/loom/configuration/processors/JarProcessorManager.java +++ b/src/main/java/net/fabricmc/loom/configuration/processors/JarProcessorManager.java @@ -25,9 +25,27 @@ package net.fabricmc.loom.configuration.processors; import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UncheckedIOException; +import java.nio.charset.StandardCharsets; import java.util.List; +import java.util.jar.Attributes; +import java.util.jar.JarFile; +import java.util.jar.Manifest; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; + +import com.google.common.hash.Hashing; +import com.google.common.io.CharSource; +import org.zeroturnaround.zip.ZipUtil; +import org.zeroturnaround.zip.transform.StreamZipEntryTransformer; +import org.zeroturnaround.zip.transform.ZipEntryTransformerEntry; public class JarProcessorManager { + private static final String MANIFEST_PATH = "META-INF/MANIFEST.MF"; + private static final String JAR_PROCESSOR_HASH_ATTRIBUTE = "Loom-Jar-Processor-Hash"; private final List<JarProcessor> jarProcessors; public JarProcessorManager(List<JarProcessor> jarProcessors) { @@ -47,13 +65,56 @@ public class JarProcessorManager { return true; } + String jarProcessorHash = getJarProcessorHash(); + + try (JarFile jar = new JarFile(file)) { + Attributes attributes = jar.getManifest().getMainAttributes(); + + if (!jarProcessorHash.equals(attributes.getValue(JAR_PROCESSOR_HASH_ATTRIBUTE))) { + return true; + } + } catch (IOException e) { + throw new UncheckedIOException("Could not check jar manifest of " + file, e); + } + return jarProcessors.stream().anyMatch(jarProcessor -> jarProcessor.isInvalid(file)); } + private String getJarProcessorHash() { + String jarProcessorIds = jarProcessors.stream() + .map(JarProcessor::getId) + .sorted() + .collect(Collectors.joining(";")); + + try { + return CharSource.wrap(jarProcessorIds) + .asByteSource(StandardCharsets.UTF_8) + .hash(Hashing.sha256()) + .toString(); + } catch (IOException e) { + throw new UncheckedIOException("Could not hash jar processor IDs", e); + } + } + public void process(File file) { for (JarProcessor jarProcessor : jarProcessors) { jarProcessor.process(file); } + + boolean manifestTransformed = ZipUtil.transformEntries(file, new ZipEntryTransformerEntry[] { + new ZipEntryTransformerEntry(MANIFEST_PATH, new StreamZipEntryTransformer() { + @Override + protected void transform(ZipEntry zipEntry, InputStream in, OutputStream out) throws IOException { + Manifest manifest = new Manifest(in); + manifest.getMainAttributes().putValue(JAR_PROCESSOR_HASH_ATTRIBUTE, getJarProcessorHash()); + manifest.write(out); + } + }) + }); + + if (!manifestTransformed) { + throw new RuntimeException("Could not add data to jar manifest in " + file); + } } public <T extends JarProcessor> T getByType(Class<T> tClass) { diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProviderImpl.java b/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProviderImpl.java index fa6e5703..2ac31e06 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProviderImpl.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProviderImpl.java @@ -135,7 +135,7 @@ public class MinecraftProviderImpl extends DependencyProvider implements Minecra } private void downloadMcJson(boolean offline) throws IOException { - if (getExtension().isShareCaches() && !getExtension().isRootProject() && versionManifestJson.exists() && !isRefreshDeps()) { + if (getExtension().getShareRemapCaches().get() && !getExtension().isRootProject() && versionManifestJson.exists() && !isRefreshDeps()) { return; } @@ -159,10 +159,10 @@ public class MinecraftProviderImpl extends DependencyProvider implements Minecra Optional<ManifestVersion.Versions> optionalVersion = Optional.empty(); - if (getExtension().getCustomManifest() != null) { + if (getExtension().getCustomMinecraftManifest().isPresent()) { ManifestVersion.Versions customVersion = new ManifestVersion.Versions(); customVersion.id = minecraftVersion; - customVersion.url = getExtension().getCustomManifest(); + customVersion.url = getExtension().getCustomMinecraftManifest().get(); optionalVersion = Optional.of(customVersion); getProject().getLogger().lifecycle("Using custom minecraft manifest"); } @@ -226,7 +226,7 @@ public class MinecraftProviderImpl extends DependencyProvider implements Minecra } private boolean hasRecentValidManifest() throws IOException { - if (getExtension().getCustomManifest() != null) { + if (getExtension().getCustomMinecraftManifest().isPresent()) { return false; } @@ -247,7 +247,7 @@ public class MinecraftProviderImpl extends DependencyProvider implements Minecra } private void downloadJars(Logger logger) throws IOException { - if (getExtension().isShareCaches() && !getExtension().isRootProject() && minecraftClientJar.exists() && minecraftServerJar.exists() && !isRefreshDeps()) { + if (getExtension().getShareRemapCaches().get() && !getExtension().isRootProject() && minecraftClientJar.exists() && minecraftServerJar.exists() && !isRefreshDeps()) { return; } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/GradleMappingContext.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/GradleMappingContext.java index db478671..ced88424 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/GradleMappingContext.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/GradleMappingContext.java @@ -25,8 +25,9 @@ package net.fabricmc.loom.configuration.providers.mappings; import java.io.File; -import java.util.function.Supplier; +import java.io.IOException; +import org.apache.commons.io.FileUtils; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; import org.gradle.api.logging.Logger; @@ -37,12 +38,11 @@ import net.fabricmc.loom.configuration.providers.MinecraftProvider; public class GradleMappingContext implements MappingContext { private final Project project; private final LoomGradleExtension extension; - private final Supplier<String> workingDirName; + private File workingDir; - public GradleMappingContext(Project project, Supplier<String> workingDirName) { + public GradleMappingContext(Project project) { this.project = project; this.extension = LoomGradleExtension.get(project); - this.workingDirName = workingDirName; } @Override @@ -62,10 +62,28 @@ public class GradleMappingContext implements MappingContext { } @Override + public File workingDirectory() { + if (workingDir == null) { + workingDir = new File(mappingsProvider().getMappingsDir().toFile(), "layered/" + minecraftProvider().minecraftVersion()); + + if (workingDir.exists()) { + try { + FileUtils.deleteDirectory(workingDir); + } catch (IOException e) { + getLogger().warn("Failed to cleanup layered mappings working directory: {}", e.getMessage()); + } + } + } + + return workingDir; + } + + @Override public File workingDirectory(String name) { - File tempDir = new File(mappingsProvider().getMappingsDir().toFile(), workingDirName.get()); - tempDir.mkdirs(); - return new File(tempDir, name); + File file = new File(workingDirectory(), name); + file.mkdirs(); + + return file; } @Override diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/LayeredMappingSpec.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/LayeredMappingSpec.java index 2e47af39..f42a3289 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/LayeredMappingSpec.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/LayeredMappingSpec.java @@ -27,8 +27,8 @@ package net.fabricmc.loom.configuration.providers.mappings; import java.util.List; public record LayeredMappingSpec(List<MappingsSpec<?>> layers) { - public String getVersion() { + public String getVersion(MappingContext context) { // TODO something better? - return "layered+hash.%d".formatted(Math.abs(hashCode())); + return "layered+hash.%d.minecraft.%s".formatted(Math.abs(hashCode()), context.minecraftVersion()); } } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/LayeredMappingsDependency.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/LayeredMappingsDependency.java index 1b5d673f..b253a114 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/LayeredMappingsDependency.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/LayeredMappingsDependency.java @@ -54,17 +54,16 @@ public class LayeredMappingsDependency implements SelfResolvingDependency { private final MappingContext mappingContext; private final LayeredMappingSpec layeredMappingSpec; - private final String version; + private String version = null; - public LayeredMappingsDependency(MappingContext mappingContext, LayeredMappingSpec layeredMappingSpec, String version) { + public LayeredMappingsDependency(MappingContext mappingContext, LayeredMappingSpec layeredMappingSpec) { this.mappingContext = mappingContext; this.layeredMappingSpec = layeredMappingSpec; - this.version = version; } @Override public Set<File> resolve() { - Path mappingsDir = mappingContext.mappingsProvider().getMappingsDir(); + Path mappingsDir = mappingContext.workingDirectory().toPath(); Path mappingsFile = mappingsDir.resolve(String.format("%s.%s-%s.tiny", GROUP, MODULE, getVersion())); if (!Files.exists(mappingsFile) || LoomGradlePlugin.refreshDeps) { @@ -115,6 +114,10 @@ public class LayeredMappingsDependency implements SelfResolvingDependency { @Override public String getVersion() { + if (version == null) { + version = layeredMappingSpec.getVersion(mappingContext); + } + return version; } @@ -129,7 +132,7 @@ public class LayeredMappingsDependency implements SelfResolvingDependency { @Override public Dependency copy() { - return new LayeredMappingsDependency(mappingContext, layeredMappingSpec, version); + return new LayeredMappingsDependency(mappingContext, layeredMappingSpec); } @Override diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingContext.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingContext.java index 3fbfb655..0ccd61ea 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingContext.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingContext.java @@ -41,6 +41,8 @@ public interface MappingContext { return minecraftProvider().minecraftVersion(); } + File workingDirectory(); + /** * Creates a temporary working dir to be used to store working files. */ diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java index 1de460e8..f15f6eca 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java @@ -277,11 +277,13 @@ public class MappingsProviderImpl extends DependencyProvider implements Mappings LoomGradleExtension extension = getExtension(); - if (extension.getAccessWidener() != null) { - extension.addJarProcessor(new AccessWidenerJarProcessor(getProject())); + if (extension.getAccessWidenerPath().isPresent()) { + extension.getGameJarProcessors().add(new AccessWidenerJarProcessor(getProject())); } - JarProcessorManager processorManager = new JarProcessorManager(extension.getJarProcessors()); + extension.getAccessWidenerPath().finalizeValue(); + extension.getGameJarProcessors().finalizeValue(); + JarProcessorManager processorManager = new JarProcessorManager(extension.getGameJarProcessors().get()); extension.setJarProcessorManager(processorManager); processorManager.setupProcessors(); diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/mojmap/MojangMappingLayer.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/mojmap/MojangMappingLayer.java index 251ff986..4b4d407b 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/mojmap/MojangMappingLayer.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/mojmap/MojangMappingLayer.java @@ -44,15 +44,16 @@ import net.fabricmc.mappingio.MappingVisitor; import net.fabricmc.mappingio.adapter.MappingSourceNsSwitch; import net.fabricmc.mappingio.format.ProGuardReader; -public record MojangMappingLayer(MinecraftVersionMeta.Download clientDownload, +public record MojangMappingLayer(String minecraftVersion, + MinecraftVersionMeta.Download clientDownload, MinecraftVersionMeta.Download serverDownload, File workingDir, Logger logger, MojangMappingsSpec.SilenceLicenseOption silenceLicense) implements MappingLayer { @Override public void visit(MappingVisitor mappingVisitor) throws IOException { - var clientMappings = new File(workingDir(), "client.txt"); - var serverMappings = new File(workingDir(), "server.txt"); + var clientMappings = new File(workingDir(), "%s.client.txt".formatted(minecraftVersion)); + var serverMappings = new File(workingDir(), "%s.server.txt".formatted(minecraftVersion)); download(clientMappings, serverMappings); diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/mojmap/MojangMappingsSpec.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/mojmap/MojangMappingsSpec.java index 67f22460..f304530f 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/mojmap/MojangMappingsSpec.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/mojmap/MojangMappingsSpec.java @@ -78,6 +78,7 @@ public record MojangMappingsSpec(SilenceLicenseOption silenceLicense) implements } return new MojangMappingLayer( + context.minecraftVersion(), versionInfo.download(MANIFEST_CLIENT_MAPPINGS), versionInfo.download(MANIFEST_SERVER_MAPPINGS), context.workingDirectory("mojang"), |