Skip to content

Commit 7ade3da

Browse files
authored
Display a warning if Renamer is not present using legacy Forge versions (#1071)
1 parent 6f56d11 commit 7ade3da

2 files changed

Lines changed: 79 additions & 1 deletion

File tree

src/main/java/net/minecraftforge/gradle/internal/ForgeGradleProblems.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,43 @@ void reportMissingMinecraftDependency() {
9696
);
9797
}
9898

99+
void reportMissingRenamerPluginForOldVersion(Dependency dependency) {
100+
// This should never happen, so assert this check for testing purposes.
101+
assert !this.testFalse("net.minecraftforge.gradle.warnings.minecraft.legacy.renamer.missing");
102+
103+
LOGGER.warn("WARNING: Renamer Gradle not present with legacy Forge version. See Problems report for details.");
104+
this.report("legacy-missing-renamer", "Missing Renamer Gradle for legacy Minecraft dependency", spec -> spec
105+
.details("""
106+
A legacy Forge dependency was declared, but Renamer Gradle has not been applied to the project!
107+
While your mod will work in development, the built jar won't work in production without Renamer Gradle's reobf functionality explicitly setup.
108+
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.
109+
Dependency: '%s'"""
110+
.formatted(Util.toString(dependency)))
111+
.severity(Severity.WARNING)
112+
.solution("Apply the 'net.minecraftforge.renamer' plugin.")
113+
.solution("Review MDKExamples to cross-reference your setup with a working example using Renamer Gradle.")
114+
.solution("Disable this warning in 'gradle.properties' if you are an advanced user: `net.minecraftforge.gradle.warnings.minecraft.legacy.renamer.missing=false`")
115+
.solution("Consider building your project for a newer version of Forge targeting Minecraft 1.20.5 or newer.")
116+
.solution(HELP_MESSAGE));
117+
}
118+
119+
void reportMissingRenamerCheckFailed(Dependency dependency, Throwable e) {
120+
assert !this.testFalse("net.minecraftforge.gradle.warnings.minecraft.legacy.renamer.missing");
121+
122+
LOGGER.warn("WARNING: Failed to check if Renamer Gradle is required. See Problems report for details.");
123+
this.report("failed-missing-renamer-check", "Failed to check if Renamer is required", spec -> spec
124+
.details("""
125+
Failed to check if Renamer Gradle is required for the Minecraft dependency.
126+
This issue may have been caused due to an invalid or unknown Minecraft version.
127+
Dependency: '%s'"""
128+
.formatted(Util.toString(dependency)))
129+
.withException(e)
130+
.severity(Severity.WARNING)
131+
.solution("Review MDKExamples to cross-reference your setup with a working example using Renamer Gradle.")
132+
.solution("Disable this warning in 'gradle.properties' if you are an advanced user: `net.minecraftforge.gradle.warnings.minecraft.legacy.renamer.missing=false`")
133+
.solution(HELP_MESSAGE));
134+
}
135+
99136
RuntimeException invalidMinecraftDependencyType(Dependency dependency) {
100137
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
101138
.details("""

src/main/java/net/minecraftforge/gradle/internal/MavenizerInstanceImpl.java

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
class MavenizerInstanceImpl implements MavenizerInstance {
2121
private static final Logger LOGGER = Logging.getLogger(MavenizerInstanceImpl.class);
2222
private final MinecraftExtensionImpl.ForProjectImpl extension;
23+
private final ForgeGradleProblems problems;
2324
private final Provider<Boolean> valueSource;
2425
private final ExternalModuleDependency dependency;
2526
private final File jsonFile;
@@ -34,6 +35,7 @@ class MavenizerInstanceImpl implements MavenizerInstance {
3435
File jsonFile
3536
) {
3637
this.extension = extension;
38+
this.problems = this.extension.getObjects().newInstance(ForgeGradleProblems.class);
3739
this.dependency = dependency;
3840
this.valueSource = valueSource;
3941
this.jsonFile = jsonFile;
@@ -45,12 +47,51 @@ class MavenizerInstanceImpl implements MavenizerInstance {
4547
private Map<String, String> invoke() {
4648
if (this.map == null) {
4749
valueSource.get(); // Execute Mavenizer, probably called before, but just be sure.
48-
this.map = (Map<String, String>) new JsonSlurper().parse(this.jsonFile, "UTF-8");
50+
this.map = validate((Map<String, String>) new JsonSlurper().parse(this.jsonFile, "UTF-8"));
4951
//this.map.forEach((k, v) -> this.extension.getProject().getLogger().lifecycle(k + " => " + v));
5052
}
5153
return this.map;
5254
}
5355

56+
private Map<String, String> validate(Map<String, String> map) {
57+
// this entire error check is gated behind a gradle property. if it's set to false, stop immediately.
58+
// also don't bother checking if we aren't using Forge, which is net.minecraftforge:forge/fmlonly
59+
// this code is kind of ugly but I don't know how to make it any cleaner without the nesting.
60+
if (!problems.testFalse("net.minecraftforge.gradle.warnings.minecraft.legacy.renamer.missing")) {
61+
var minecraftVersion = map.get("mc.version");
62+
boolean forge = "net.minecraftforge".equals(dependency.getGroup())
63+
&& ("forge".equals(dependency.getName()) || "fmlonly".equals(dependency.getName()));
64+
if (minecraftVersion != null && !"UNKNOWN".equals(minecraftVersion)) {
65+
boolean legacy = false;
66+
try {
67+
if (minecraftVersion.indexOf('w') > 0) {
68+
var split = minecraftVersion.split("[w|a-z]");
69+
int int1 = Integer.parseInt(split[0]);
70+
int int2 = Integer.parseInt(split[1]);
71+
legacy = int1 <= 24 && int2 <= 13; // 24w13a was the last snapshot before 1.20.5
72+
} else {
73+
var split = minecraftVersion.split("[.|-]");
74+
int int1 = Integer.parseInt(split[0]);
75+
int int2 = Integer.parseInt(split[1]);
76+
int int3 = split.length > 2 ? Integer.parseInt(split[2]) : 0;
77+
legacy = forge ? int1 <= 1 && int2 <= 20 && int3 < 5
78+
: int1 < 26; // version < 1.20.5 == legacy for forge, 26 for vanilla
79+
}
80+
} catch (Exception e) {
81+
// there are a number of things that could go wrong here.
82+
// but it should never cause a build failure. stop immediately and report problem.
83+
problems.reportMissingRenamerCheckFailed(dependency, e);
84+
}
85+
86+
if (legacy && !extension.getProject().getPluginManager().hasPlugin("net.minecraftforge.renamer")) {
87+
problems.reportMissingRenamerPluginForOldVersion(dependency);
88+
}
89+
}
90+
}
91+
92+
return map;
93+
}
94+
5495
private Provider<String> get(String key) {
5596
return this.invoke.getting(key)
5697
.orElse(this.extension.getProviders().provider(() -> {

0 commit comments

Comments
 (0)