From da66abfaef2601936f95c576d60b30b54b425964 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Wed, 29 Sep 2021 19:33:04 +0100 Subject: [PATCH] Support 21w39a --- .../providers/MinecraftProviderImpl.java | 59 ++++++++++++++++++- .../projects/java16/gradle.properties | 4 +- 2 files changed, 60 insertions(+), 3 deletions(-) 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 93ab7ae..466543b 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProviderImpl.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProviderImpl.java @@ -27,10 +27,15 @@ package net.fabricmc.loom.configuration.providers; import java.io.File; import java.io.FileReader; import java.io.IOException; +import java.io.InputStream; import java.net.URL; import java.nio.charset.StandardCharsets; +import java.nio.file.StandardCopyOption; +import java.util.Objects; import java.util.Optional; import java.util.function.Consumer; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; import com.google.common.io.Files; import org.gradle.api.GradleException; @@ -57,7 +62,10 @@ public class MinecraftProviderImpl extends DependencyProvider implements Minecra private File workingDir; private File minecraftJson; private File minecraftClientJar; + // Note this will be the boostrap jar starting with 21w39a private File minecraftServerJar; + // The extracted server jar from the boostrap, only exists in >=21w39a + private File minecraftExtractedServerJar; private File minecraftMergedJar; private File versionManifestJson; private File experimentalVersionsJson; @@ -116,6 +124,7 @@ public class MinecraftProviderImpl extends DependencyProvider implements Minecra minecraftJson = file("minecraft-info.json"); minecraftClientJar = file("minecraft-client.jar"); minecraftServerJar = file("minecraft-server.jar"); + minecraftExtractedServerJar = file("minecraft-extracted_server.jar"); minecraftMergedJar = file("minecraft-merged.jar"); versionManifestJson = new File(getDirectories().getUserCache(), "version_manifest.json"); experimentalVersionsJson = new File(getDirectories().getUserCache(), "experimental_version_manifest.json"); @@ -248,12 +257,60 @@ public class MinecraftProviderImpl extends DependencyProvider implements Minecra private void mergeJars(Logger logger) throws IOException { logger.info(":merging jars"); - try (JarMerger jarMerger = new JarMerger(minecraftClientJar, minecraftServerJar, minecraftMergedJar)) { + try (JarMerger jarMerger = new JarMerger(minecraftClientJar, getServerJarToMerge(logger), minecraftMergedJar)) { jarMerger.enableSyntheticParamsOffset(); jarMerger.merge(); } } + private File getServerJarToMerge(Logger logger) throws IOException { + try (ZipFile zipFile = new ZipFile(minecraftServerJar)) { + ZipEntry versionsListEntry = zipFile.getEntry("META-INF/versions.list"); + + if (versionsListEntry == null) { + // Legacy pre 21w38a jar + return minecraftServerJar; + } + + logger.info(":Extracting server jar from bootstrap"); + + String versionsList; + + try (InputStream is = zipFile.getInputStream(versionsListEntry)) { + versionsList = new String(is.readAllBytes(), StandardCharsets.UTF_8); + } + + String jarPath = null; + + for (String version : versionsList.split("\n")) { + if (version.isBlank()) continue; + + String[] split = version.split("\t"); + + if (split.length != 3) continue; + + final String hash = split[0]; + final String id = split[1]; + final String path = split[2]; + + if (minecraftVersion().equals(id)) { + jarPath = path; + break; + } + } + + Objects.requireNonNull(jarPath, "Could not find minecraft server jar for " + minecraftVersion()); + ZipEntry serverJarEntry = zipFile.getEntry("META-INF/versions/" + jarPath); + Objects.requireNonNull(serverJarEntry, "Could not find server jar in boostrap@ " + jarPath); + + try (InputStream is = zipFile.getInputStream(serverJarEntry)) { + java.nio.file.Files.copy(is, minecraftExtractedServerJar.toPath(), StandardCopyOption.REPLACE_EXISTING); + } + + return minecraftExtractedServerJar; + } + } + public File getMergedJar() { return minecraftMergedJar; } diff --git a/src/test/resources/projects/java16/gradle.properties b/src/test/resources/projects/java16/gradle.properties index 941d7f5..753673c 100644 --- a/src/test/resources/projects/java16/gradle.properties +++ b/src/test/resources/projects/java16/gradle.properties @@ -1,7 +1,7 @@ org.gradle.jvmargs=-Xmx1G -minecraft_version=21w38a -yarn_mappings=21w38a+build.9 +minecraft_version=21w39a +yarn_mappings=21w39a+build.1 loader_version=0.11.7 fabric_version=0.40.4+1.18