diff --git a/src/main/java/net/minecraftforge/gradle/internal/ForgeGradleProblems.java b/src/main/java/net/minecraftforge/gradle/internal/ForgeGradleProblems.java index 57b59f3c0..2d9e2e433 100644 --- a/src/main/java/net/minecraftforge/gradle/internal/ForgeGradleProblems.java +++ b/src/main/java/net/minecraftforge/gradle/internal/ForgeGradleProblems.java @@ -96,6 +96,28 @@ void reportMissingMinecraftDependency() { ); } + void reportMissingRenamerPluginForOldVersion(Dependency dependency) { + if (this.testFalse("net.minecraftforge.gradle.warnings.minecraft.legacy.renamer.missing")) return; + + LOGGER.warn("WARNING: Renamer Gradle not present with legacy Forge version. See Problems report for details."); + this.report("legacy-missing-renamer", "Missing Renamer Gradle for legacy Minecraft dependency", spec -> spec + .details(""" + A legacy Forge dependency was declared, but Renamer Gradle has not been applied to the project! + While the workspace will continue to function, this may cause problems with resultant artifacts not being renamed to obfuscated mappings. + Legacy Forge versions use obfuscated mappings at runtime, so this is a requirement if you are publishing this project as a mod that uses Minecraft names. + Dependency: '%s'""" + .formatted(Util.toString(dependency))) + .severity(Severity.WARNING) + .solution("Apply the 'net.minecraftforge.renamer' plugin.") + .solution("Disable this warning in 'gradle.properties' if you are an advanced user: `net.minecraftforge.gradle.warnings.minecraft.legacy.renamer.missing=false`") + .solution("Consider building your project for a newer version of Forge targeting Minecraft 1.20.5 or newer.") + .solution(HELP_MESSAGE)); + } + + void reportMissingRenamerCheckFailed(Dependency dependency, Throwable e) { + LOGG + } + RuntimeException invalidMinecraftDependencyType(Dependency dependency) { return this.throwing(new IllegalArgumentException("Minecraft dependency is not a module dependency"), "unsupported-minecraft-dependency-type", "Non-module dependency used as Minecraft dependency", spec -> spec .details(""" diff --git a/src/main/java/net/minecraftforge/gradle/internal/MavenizerInstanceImpl.java b/src/main/java/net/minecraftforge/gradle/internal/MavenizerInstanceImpl.java index 7941cb11a..a8ec80f6a 100644 --- a/src/main/java/net/minecraftforge/gradle/internal/MavenizerInstanceImpl.java +++ b/src/main/java/net/minecraftforge/gradle/internal/MavenizerInstanceImpl.java @@ -20,6 +20,7 @@ class MavenizerInstanceImpl implements MavenizerInstance { private static final Logger LOGGER = Logging.getLogger(MavenizerInstanceImpl.class); private final MinecraftExtensionImpl.ForProjectImpl extension; + private final ForgeGradleProblems problems; private final Provider valueSource; private final ExternalModuleDependency dependency; private final File jsonFile; @@ -34,6 +35,7 @@ class MavenizerInstanceImpl implements MavenizerInstance { File jsonFile ) { this.extension = extension; + this.problems = this.extension.getObjects().newInstance(ForgeGradleProblems.class); this.dependency = dependency; this.valueSource = valueSource; this.jsonFile = jsonFile; @@ -45,12 +47,51 @@ class MavenizerInstanceImpl implements MavenizerInstance { private Map invoke() { if (this.map == null) { valueSource.get(); // Execute Mavenizer, probably called before, but just be sure. - this.map = (Map) new JsonSlurper().parse(this.jsonFile, "UTF-8"); + this.map = validate((Map) new JsonSlurper().parse(this.jsonFile, "UTF-8")); //this.map.forEach((k, v) -> this.extension.getProject().getLogger().lifecycle(k + " => " + v)); } return this.map; } + private Map validate(Map map) { + // this entire error check is gated behind a gradle property. if it's set to false, stop immediately. + // also don't bother checking if we aren't using Forge, which is net.minecraftforge:forge/fmlonly + // this code is kind of ugly but I don't know how to make it any cleaner without the nesting. + if (!problems.testFalse("net.minecraftforge.gradle.warnings.minecraft.legacy.renamer.missing")) { + var minecraftVersion = map.get("mc.version"); + boolean forge = "net.minecraftforge".equals(dependency.getGroup()) + && ("forge".equals(dependency.getName()) || "fmlonly".equals(dependency.getName())) + if (minecraftVersion != null && !"UNKNOWN".equals(minecraftVersion)) { + boolean legacy = false; + try { + if (minecraftVersion.indexOf('w') > 0) { + var split = minecraftVersion.split("[w|a-z]"); + int int1 = Integer.parseInt(split[0]); + int int2 = Integer.parseInt(split[1]); + legacy = int1 <= 24 && int2 <= 13; // 24w13a was the last snapshot before 1.20.5 + } else { + var split = minecraftVersion.split("[.|-]"); + int int1 = Integer.parseInt(split[0]); + int int2 = Integer.parseInt(split[1]); + int int3 = split.length > 2 ? Integer.parseInt(split[2]) : 0; + legacy = forge ? int1 <= 1 && int2 <= 20 && int3 < 5 + : int1 < 26; // version < 1.20.5 == legacy for forge, 26 for vanilla + } + } catch (Exception e) { + // there are a number of things that could go wrong here. + // but it should never cause a build failure. stop immediately and report problem. + problems.reportMissingRenamerCheckFailed(dependency, e); + } + + if (legacy && !extension.getProject().getPluginManager().hasPlugin("net.minecraftforge.renamer")) { + problems.reportMissingRenamerPluginForOldVersion(dependency); + } + } + } + + return map; + } + private Provider get(String key) { return this.invoke.getting(key) .orElse(this.extension.getProviders().provider(() -> {