diff --git a/src/main/java/net/ornithemc/ploceus/Constants.java b/src/main/java/net/ornithemc/ploceus/Constants.java index 98431e3..90c7cde 100644 --- a/src/main/java/net/ornithemc/ploceus/Constants.java +++ b/src/main/java/net/ornithemc/ploceus/Constants.java @@ -1,5 +1,8 @@ package net.ornithemc.ploceus; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + import net.ornithemc.ploceus.api.GameSide; public class Constants { @@ -12,6 +15,9 @@ public class Constants { public static final String QUILT_MAVEN_NAME = "Quilt"; public static final String QUILT_MAVEN_URL = "https://maven.quiltmc.org/repository/release"; + public static final String LEGACY_FABRIC_MAVEN_NAME = "Legacy Fabric"; + public static final String LEGACY_FABRIC_MAVEN_URL = "https://maven.legacyfabric.net"; + public static final String FORGE_MAVEN_NAME = "Forge"; public static final String FORGE_MAVEN_URL = "https://maven.minecraftforge.net/"; @@ -26,22 +32,20 @@ public class Constants { public static final String CLIENT_NESTS_CONFIGURATION = "clientNests"; public static final String SERVER_NESTS_CONFIGURATION = "serverNests"; - public static final String VERSIONS_MANIFEST_NAME_GEN1 = "skyrising"; - public static final String VERSIONS_MANIFEST_URL_GEN1 = "https://skyrising.github.io/mc-versions/version_manifest.json"; - public static final String VERSIONS_MANIFEST_NAME_GEN2 = "ornithe"; - public static final String VERSIONS_MANIFEST_URL_GEN2 = "https://ornithemc.net/mc-versions/version_manifest.json"; + public static final String VERSIONS_MANIFEST_NAME = "ornithe-gen%d"; + public static final String VERSIONS_MANIFEST_URL = "https://ornithemc.net/mc-versions/gen%d/version_manifest.json"; public static String versionsManifestName(int generation) { - return generation == 1 ? VERSIONS_MANIFEST_NAME_GEN1 : VERSIONS_MANIFEST_NAME_GEN2; + return String.format(VERSIONS_MANIFEST_NAME, generation); } public static String versionsManifestUrl(int generation) { - return generation == 1 ? VERSIONS_MANIFEST_URL_GEN1 : VERSIONS_MANIFEST_URL_GEN2; + return String.format(VERSIONS_MANIFEST_URL, generation); } public static final String LIBRARIES_META_URL = META_URL + "/v3/versions/gen%d/libraries/%s"; public static String librariesMetaUrl(String mc, int generation) { - return LIBRARIES_META_URL.formatted(generation, mc); + return LIBRARIES_META_URL.formatted(generation, URLEncoder.encode(mc, StandardCharsets.UTF_8)); } public static final String CALAMUS_INTERMEDIARY_MAVEN_GROUP = MAVEN_GROUP; @@ -49,7 +53,7 @@ public static String calamusGen1Mappings(GameSide side) { return CALAMUS_INTERMEDIARY_MAVEN_GROUP + ":calamus-intermediary:%1$s" + side.suffix() + ":v2"; } public static String calamusGen1Mappings(String mc, GameSide side) { - return calamusGen1Mappings(side).formatted(mc); + return calamusGen1Mappings(side).formatted(URLEncoder.encode(mc, StandardCharsets.UTF_8)); } public static String calamusGen1Url(GameSide side) { return MAVEN_URL + "/net/ornithemc/calamus-intermediary/%1$s" + side.suffix() + "/calamus-intermediary-%1$s" + side.suffix() + "-v2.jar"; @@ -58,7 +62,7 @@ public static String calamusGen2Mappings(int generation) { return CALAMUS_INTERMEDIARY_MAVEN_GROUP + ":calamus-intermediary-gen" + generation + ":%1$s:v2"; } public static String calamusGen2Mappings(String mc, int generation) { - return calamusGen2Mappings(generation).formatted(mc); + return calamusGen2Mappings(generation).formatted(URLEncoder.encode(mc, StandardCharsets.UTF_8)); } public static String calamusGen2Url(int generation) { return MAVEN_URL + "/net/ornithemc/calamus-intermediary-gen" + generation + "/%1$s/calamus-intermediary-gen" + generation + "-%1$s-v2.jar"; @@ -67,29 +71,29 @@ public static String calamusGen2Url(int generation) { public static final String FEATHER_MAVEN_GROUP = MAVEN_GROUP; public static final String FEATHER_GEN1_MAPPINGS = FEATHER_MAVEN_GROUP + ":feather:%s%s+build.%s:v2"; public static String featherGen1Mappings(String mc, GameSide side, String build) { - return String.format(FEATHER_GEN1_MAPPINGS, mc, side.suffix(), build); + return String.format(FEATHER_GEN1_MAPPINGS, URLEncoder.encode(mc, StandardCharsets.UTF_8), side.suffix(), build); } public static final String FEATHER_GEN2_MAPPINGS = FEATHER_MAVEN_GROUP + ":feather-gen%s:%s+build.%s:v2"; public static String featherGen2Mappings(int generation, String mc, String build) { - return String.format(FEATHER_GEN2_MAPPINGS, generation, mc, build); + return String.format(FEATHER_GEN2_MAPPINGS, generation, URLEncoder.encode(mc, StandardCharsets.UTF_8), build); } public static final String RAVEN_MAVEN_GROUP = MAVEN_GROUP; public static final String RAVEN = RAVEN_MAVEN_GROUP + ":raven:%s%s+build.%s"; public static String raven(String mc, GameSide side, String build) { - return String.format(RAVEN, mc, side.suffix(), build); + return String.format(RAVEN, URLEncoder.encode(mc, StandardCharsets.UTF_8), side.suffix(), build); } public static final String SPARROW_MAVEN_GROUP = MAVEN_GROUP; public static final String SPARROW = SPARROW_MAVEN_GROUP + ":sparrow:%s%s+build.%s"; public static String sparrow(String mc, GameSide side, String build) { - return String.format(SPARROW, mc, side.suffix(), build); + return String.format(SPARROW, URLEncoder.encode(mc, StandardCharsets.UTF_8), side.suffix(), build); } public static final String NESTS_MAVEN_GROUP = MAVEN_GROUP; public static final String NESTS = NESTS_MAVEN_GROUP + ":nests:%s%s+build.%s"; public static String nests(String mc, GameSide side, String build) { - return String.format(NESTS, mc, side.suffix(), build); + return String.format(NESTS, URLEncoder.encode(mc, StandardCharsets.UTF_8), side.suffix(), build); } public static final String MANIFEST_PATH = "META-INF/MANIFEST.MF"; @@ -108,16 +112,22 @@ public static String oslVersionMetaEndpoint(int generation, String version) { } public static final String OSL_MODULE_VERSION_META_ENDPOINT = "/v3/versions/gen%d/osl/%s/%s/%s"; public static String oslModuleVersionMetaEndpoint(int generation, String module, String mc, String version) { - return String.format(OSL_MODULE_VERSION_META_ENDPOINT, generation, module, mc, version); + return String.format(OSL_MODULE_VERSION_META_ENDPOINT, generation, module, URLEncoder.encode(mc, StandardCharsets.UTF_8), version); } public static final String MCP_MAVEN_GROUP = "de.oceanlabs.mcp"; public static final String SRG_MAPPINGS = MCP_MAVEN_GROUP + ":mcp:%s:srg@zip"; + public static String srgMappings(String mc) { + return String.format(SRG_MAPPINGS, URLEncoder.encode(mc, StandardCharsets.UTF_8)); + } public static final String MCP_MAPPINGS = MCP_MAVEN_GROUP + ":mcp_%s:%s-%s@zip"; + public static String mcpMappings(String channel, String build, String mc) { + return String.format(MCP_MAPPINGS, channel, build, URLEncoder.encode(mc, StandardCharsets.UTF_8)); + } public static final String FORGE_MAVEN_GROUP = "net.minecraftforge.mcp"; public static final String FORGE_SRC = FORGE_MAVEN_GROUP + ":forge:%s-%s:src@zip"; - - public static final String RELEASE_TIME_B1_0 = "2010-12-20T17:28:00+00:00"; - + public static String forgeSrc(String mc, String version) { + return String.format(FORGE_SRC, URLEncoder.encode(mc, StandardCharsets.UTF_8), version); + } } diff --git a/src/main/java/net/ornithemc/ploceus/PloceusGradleExtension.java b/src/main/java/net/ornithemc/ploceus/PloceusGradleExtension.java index d94dfcc..36aada8 100644 --- a/src/main/java/net/ornithemc/ploceus/PloceusGradleExtension.java +++ b/src/main/java/net/ornithemc/ploceus/PloceusGradleExtension.java @@ -2,9 +2,9 @@ import java.io.BufferedReader; import java.io.File; -import java.io.FileReader; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Iterator; import java.util.List; import java.util.Map; @@ -23,9 +23,11 @@ import net.fabricmc.loom.api.mappings.layered.spec.FileSpec; import net.fabricmc.loom.api.mappings.layered.spec.LayeredMappingSpecBuilder; import net.fabricmc.loom.configuration.DependencyInfo; +import net.fabricmc.loom.configuration.providers.minecraft.ManifestLocations.ManifestLocation; import net.fabricmc.loom.configuration.providers.minecraft.library.Library; import net.fabricmc.loom.task.AbstractRemapJarTask; import net.fabricmc.loom.util.Constants.Configurations; +import net.fabricmc.loom.util.download.DownloadException; import net.ornithemc.ploceus.api.GameSide; import net.ornithemc.ploceus.api.PloceusGradleExtensionApi; @@ -48,6 +50,7 @@ public class PloceusGradleExtension implements PloceusGradleExtensionApi { private static final Gson GSON = new GsonBuilder().create(); + private static final int DEFAULT_INTERMEDIARY_GEN = 1; public static PloceusGradleExtension get(Project project) { return (PloceusGradleExtension)project.getExtensions().getByName("ploceus"); @@ -65,8 +68,6 @@ public static PloceusGradleExtension get(Project project) { private final Property side; // gen 1 private final Property intermediaryGeneration; // gen 2+ - private int nextManifestPriority = -10; - public PloceusGradleExtension(Project project) { this.project = project; this.loom = LoomGradleExtension.get(this.project); @@ -141,7 +142,7 @@ public PloceusGradleExtension(Project project) { return GameSide.MERGED; })); this.intermediaryGeneration = project.getObjects().property(int.class); - this.intermediaryGeneration.convention(1); + this.intermediaryGeneration.convention(DEFAULT_INTERMEDIARY_GEN); apply(); } @@ -186,7 +187,7 @@ private void apply() { }); }); - switchToGen1(); + this.setIntermediaryGeneration(DEFAULT_INTERMEDIARY_GEN); } public List getLibraries() { @@ -238,8 +239,8 @@ public Dependency mcpMappings(String channel, String mc, String build) { intermediaryGeneration.get() == 1 ? FileSpec.create(Constants.calamusGen1Mappings(mc, side.get())) : FileSpec.create(Constants.calamusGen2Mappings(mc, intermediaryGeneration.get())), - FileSpec.create(String.format(Constants.SRG_MAPPINGS, mc)), - FileSpec.create(String.format(Constants.MCP_MAPPINGS, channel, build, mc)) + FileSpec.create(Constants.srgMappings(mc)), + FileSpec.create(Constants.mcpMappings(channel, build, mc)) )); }); } @@ -256,7 +257,7 @@ public Dependency mcpForgeMappings(String mc, String version) { intermediaryGeneration.get() == 1 ? FileSpec.create(Constants.calamusGen1Mappings(mc, side.get())) : FileSpec.create(Constants.calamusGen2Mappings(mc, intermediaryGeneration.get())), - FileSpec.create(String.format(Constants.FORGE_SRC, mc, version)) + FileSpec.create(Constants.forgeSrc(mc, version)) )); }); } @@ -422,34 +423,6 @@ public void serverOnlyMappings() { side.set(GameSide.SERVER); } - private void switchToGen1() { - loom.setIntermediateMappingsProvider(CalamusGen1Provider.class, provider -> { - provider.getSide() - .convention(side) - .finalizeValueOnRead(); - provider.getIntermediaryUrl() - .convention(project.provider(() -> Constants.calamusGen1Url(provider.getSide().get()))) - .finalizeValueOnRead(); - provider.getRefreshDeps().set(project.provider(() -> LoomGradleExtension.get(project).refreshDeps())); - }); - - loom.getVersionsManifests().add(Constants.VERSIONS_MANIFEST_NAME_GEN1, Constants.VERSIONS_MANIFEST_URL_GEN1, nextManifestPriority--); - } - - private void switchToGen2() { - loom.setIntermediateMappingsProvider(CalamusGen2Provider.class, provider -> { - provider.getIntermediaryGeneration() - .convention(intermediaryGeneration) - .finalizeValueOnRead(); - provider.getIntermediaryUrl() - .convention(project.provider(() -> Constants.calamusGen2Url(provider.getIntermediaryGeneration().get()))) - .finalizeValueOnRead(); - provider.getRefreshDeps().set(project.provider(() -> LoomGradleExtension.get(project).refreshDeps())); - }); - - loom.getVersionsManifests().add(Constants.VERSIONS_MANIFEST_NAME_GEN2, Constants.VERSIONS_MANIFEST_URL_GEN2, nextManifestPriority--); - } - public Property getSide() { return side; } @@ -460,12 +433,58 @@ public Property getIntermediaryGeneration() { @Override public void setIntermediaryGeneration(int generation) { + int oldGeneration = this.intermediaryGeneration.get(); this.intermediaryGeneration.set(generation); - if (generation == 1) { - switchToGen1(); + switchedIntermediaryGen(oldGeneration, generation); + } + + private void switchedIntermediaryGen(int from, int to) { + switchVersionsManifest(from); + switchIntermediateMappingsProvider(); + } + + private void switchVersionsManifest(int oldIntermediaryGen) { + String oldManifestName = Constants.versionsManifestName(oldIntermediaryGen); + + // remove the previous manifest + for (Iterator it = loom.getVersionsManifests().iterator(); it.hasNext(); ) { + ManifestLocation location = it.next(); + + if (location.name().equals(oldManifestName)) { + it.remove(); + } + } + + // replace with the new one + loom.getVersionsManifests().add( + Constants.versionsManifestName(intermediaryGeneration.get()), + Constants.versionsManifestUrl(intermediaryGeneration.get()), + -10 + ); + } + + private void switchIntermediateMappingsProvider() { + if (intermediaryGeneration.get() == 1) { + loom.setIntermediateMappingsProvider(CalamusGen1Provider.class, provider -> { + provider.getSide() + .convention(side) + .finalizeValueOnRead(); + provider.getIntermediaryUrl() + .convention(project.provider(() -> Constants.calamusGen1Url(provider.getSide().get()))) + .finalizeValueOnRead(); + provider.getRefreshDeps().set(project.provider(() -> LoomGradleExtension.get(project).refreshDeps())); + }); } else { - switchToGen2(); + loom.setIntermediateMappingsProvider(CalamusGen2Provider.class, provider -> { + provider.getIntermediaryGeneration() + .convention(intermediaryGeneration) + .finalizeValueOnRead(); + provider.getIntermediaryUrl() + .convention(project.provider(() -> Constants.calamusGen2Url(provider.getIntermediaryGeneration().get()))) + .finalizeValueOnRead(); + provider.getRefreshDeps().set(project.provider(() -> LoomGradleExtension.get(project).refreshDeps())); + }); } } @@ -485,22 +504,26 @@ public VersionDetails minecraftVersionDetails() { Path manifestCache = userCache.resolve(Constants.versionsManifestName(intermediaryGeneration.get()) + "_versions_manifest.json"); try { - if (!Files.exists(manifestCache)) { + // always try to download - the manifest may have changed... + try { loom.download(manifestUrl).downloadPath(manifestCache); + } catch (DownloadException e) { + if (!Files.exists(manifestCache)) { + throw new RuntimeException("could not download versions manifest, and no cache exists!", e); + } } - try (BufferedReader br = new BufferedReader(new FileReader(manifestCache.toFile()))) { + try (BufferedReader br = Files.newBufferedReader(manifestCache)) { VersionsManifest manifest = GSON.fromJson(br, VersionsManifest.class); VersionsManifest.Version version = manifest.getVersion(versionId); String detailsUrl = version.details(); + String detailsSha1 = version.detailsSha1(); Path detailsCache = userCache.resolve(versionId).resolve("minecraft-details.json"); - if (!Files.exists(detailsCache)) { - loom.download(detailsUrl).downloadPath(detailsCache); - } + loom.download(detailsUrl).sha1(detailsSha1).downloadPath(detailsCache); - try (BufferedReader _br = new BufferedReader(new FileReader(detailsCache.toFile()))) { + try (BufferedReader _br = Files.newBufferedReader(detailsCache)) { return GSON.fromJson(_br, VersionDetails.class); } } diff --git a/src/main/java/net/ornithemc/ploceus/PloceusRepositoryPlugin.java b/src/main/java/net/ornithemc/ploceus/PloceusRepositoryPlugin.java index 5f56afd..49723aa 100644 --- a/src/main/java/net/ornithemc/ploceus/PloceusRepositoryPlugin.java +++ b/src/main/java/net/ornithemc/ploceus/PloceusRepositoryPlugin.java @@ -37,6 +37,13 @@ private void declareRepositories(RepositoryHandler repositories) { repo.setName(Constants.QUILT_MAVEN_NAME); repo.setUrl(Constants.QUILT_MAVEN_URL); }); + repositories.maven(repo -> { + repo.setName(Constants.LEGACY_FABRIC_MAVEN_NAME); + repo.setUrl(Constants.LEGACY_FABRIC_MAVEN_URL); + repo.content(content -> { + content.includeGroup("org.lwjgl.lwjgl"); + }); + }); repositories.maven(repo -> { repo.setName(Constants.FORGE_MAVEN_NAME); repo.setUrl(Constants.FORGE_MAVEN_URL); diff --git a/src/main/java/net/ornithemc/ploceus/manifest/VersionsManifest.java b/src/main/java/net/ornithemc/ploceus/manifest/VersionsManifest.java index c197d03..c472db2 100644 --- a/src/main/java/net/ornithemc/ploceus/manifest/VersionsManifest.java +++ b/src/main/java/net/ornithemc/ploceus/manifest/VersionsManifest.java @@ -4,7 +4,7 @@ public record VersionsManifest(List versions) { - public static record Version(String id, String details) { + public static record Version(String id, String details, String detailsSha1) { } public Version getVersion(String id) {