diff --git a/build.gradle b/build.gradle index 8092da2c..964024a3 100644 --- a/build.gradle +++ b/build.gradle @@ -22,7 +22,7 @@ if (ENV.BUILD_NUMBER) { build = "release #${ENV.BUILD_NUMBER}" version = baseVersion + '.' + ENV.BUILD_NUMBER } else { - version = baseVersion + '-forge.28' + version = baseVersion + '-forge.31' } configurations { diff --git a/src/main/java/net/fabricmc/loom/providers/ForgeUniversalProvider.java b/src/main/java/net/fabricmc/loom/providers/ForgeUniversalProvider.java index 93e54050..e46bd520 100644 --- a/src/main/java/net/fabricmc/loom/providers/ForgeUniversalProvider.java +++ b/src/main/java/net/fabricmc/loom/providers/ForgeUniversalProvider.java @@ -32,9 +32,11 @@ import org.gradle.api.Project; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.DependencyProvider; +import net.fabricmc.loom.util.JarUtil; public class ForgeUniversalProvider extends DependencyProvider { private File forge; + private File forgeManifest; public ForgeUniversalProvider(Project project) { super(project); @@ -43,17 +45,26 @@ public class ForgeUniversalProvider extends DependencyProvider { @Override public void provide(DependencyInfo dependency, Consumer postPopulationScheduler) throws Exception { forge = new File(getExtension().getProjectPersistentCache(), "forge-" + dependency.getDependency().getVersion() + "-universal.jar"); + forgeManifest = new File(getExtension().getProjectPersistentCache(), "forge-" + dependency.getDependency().getVersion() + "-manifest.mf"); if (!forge.exists() || isRefreshDeps()) { File dep = dependency.resolveFile().orElseThrow(() -> new RuntimeException("Could not resolve Forge")); Files.copy(dep, forge); } + + if (!forgeManifest.exists() || isRefreshDeps()) { + JarUtil.extractFile(forge, "META-INF/MANIFEST.MF", forgeManifest); + } } public File getForge() { return forge; } + public File getForgeManifest() { + return forgeManifest; + } + @Override public String getTargetConfig() { return Constants.Configurations.FORGE_UNIVERSAL; diff --git a/src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java b/src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java index f328cce3..ddbddc72 100644 --- a/src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java +++ b/src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java @@ -25,18 +25,21 @@ package net.fabricmc.loom.providers; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.net.URI; import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.List; import java.util.Map; import java.util.function.Consumer; +import java.util.jar.Attributes; +import java.util.jar.Manifest; import com.google.common.collect.ImmutableMap; import org.gradle.api.Project; @@ -145,17 +148,35 @@ public class MinecraftMappedProvider extends DependencyProvider { try (FileSystem fs = FileSystems.newFileSystem(URI.create("jar:" + output.toUri()), ImmutableMap.of("create", false))) { Path manifestPath = fs.getPath("META-INF", "MANIFEST.MF"); ForgeProvider.ForgeVersion version = getExtension().getForgeProvider().getVersion(); - List lines = new ArrayList<>(Files.readAllLines(manifestPath)); + Manifest minecraftManifest; + Manifest forgeManifest; - lines.add(""); - lines.add("Name: net/minecraftforge/fml/javafmlmod/"); - lines.add("Implementation-Version: " + version.getForgeVersion()); - lines.add(""); - lines.add("Name: net/minecraftforge/fml/mclanguageprovider/"); - lines.add("Implementation-Version: " + version.getMinecraftVersion()); + try (InputStream in = Files.newInputStream(manifestPath)) { + minecraftManifest = new Manifest(in); + } + + try (InputStream in = new FileInputStream(getExtension().getForgeUniversalProvider().getForgeManifest())) { + forgeManifest = new Manifest(in); + } + + for (Map.Entry forgeEntry : forgeManifest.getEntries().entrySet()) { + if (!forgeEntry.getKey().endsWith(".class")) { + minecraftManifest.getEntries().put(forgeEntry.getKey(), forgeEntry.getValue()); + } + } + + Attributes javafmlmod = new Attributes(); + javafmlmod.put("Implementation-Version", version.getForgeVersion()); + Attributes mclanguageprovider = new Attributes(); + mclanguageprovider.put("Implementation-Version", version.getMinecraftVersion()); + minecraftManifest.getEntries().putIfAbsent("net/minecraftforge/fml/javafmlmod/", javafmlmod); + minecraftManifest.getEntries().putIfAbsent("net/minecraftforge/fml/mclanguageprovider/", mclanguageprovider); Files.delete(manifestPath); - Files.write(manifestPath, lines); + + try (OutputStream out = Files.newOutputStream(manifestPath)) { + minecraftManifest.write(out); + } } TinyTree yarnWithSrg = getExtension().getMappingsProvider().getMappingsWithSrg();