Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 28 additions & 18 deletions src/main/java/net/ornithemc/ploceus/Constants.java
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -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/";

Expand All @@ -26,30 +32,28 @@ 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;
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";
Expand All @@ -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";
Expand All @@ -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";
Expand All @@ -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);
}
}
113 changes: 68 additions & 45 deletions src/main/java/net/ornithemc/ploceus/PloceusGradleExtension.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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;
Expand All @@ -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");
Expand All @@ -65,8 +68,6 @@ public static PloceusGradleExtension get(Project project) {
private final Property<GameSide> side; // gen 1
private final Property<Integer> intermediaryGeneration; // gen 2+

private int nextManifestPriority = -10;

public PloceusGradleExtension(Project project) {
this.project = project;
this.loom = LoomGradleExtension.get(this.project);
Expand Down Expand Up @@ -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();
}
Expand Down Expand Up @@ -186,7 +187,7 @@ private void apply() {
});
});

switchToGen1();
this.setIntermediaryGeneration(DEFAULT_INTERMEDIARY_GEN);
}

public List<Path> getLibraries() {
Expand Down Expand Up @@ -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))
));
});
}
Expand All @@ -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))
));
});
}
Expand Down Expand Up @@ -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<GameSide> getSide() {
return side;
}
Expand All @@ -460,12 +433,58 @@ public Property<Integer> 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<ManifestLocation> 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()));
});
}
}

Expand All @@ -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);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

public record VersionsManifest(List<Version> versions) {

public static record Version(String id, String details) {
public static record Version(String id, String details, String detailsSha1) {
}

public Version getVersion(String id) {
Expand Down