Skip to content

Commit 1a1a188

Browse files
authored
Unobfusicated userdev3 support (#26)
1 parent 23a8b9f commit 1a1a188

File tree

7 files changed

+128
-39
lines changed

7 files changed

+128
-39
lines changed

.github/workflows/test.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ jobs:
2020
"--forge --version 1.21.11-61.1.0",
2121
"--forge --version 1.20.1-47.4.0",
2222
"--forge --version 1.12.2-14.23.5.2859 --mappings snapshot:20171003-1.12",
23+
"--forge --version 26.1-62.0.0",
2324
"--client --version 1.20.1",
2425
"--server --version 1.20.1",
2526
"--mc --version 1.20.1",

settings.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ dependencyResolutionManagement.versionCatalogs.register('libs') {
3131
library 'gson', 'com.google.code.gson', 'gson' version '2.10.1'
3232
library 'jopt', 'net.sf.jopt-simple', 'jopt-simple' version '6.0-alpha-3'
3333
library 'jver', 'net.minecraftforge', 'java-provisioner' version '2.0.4'
34-
library 'srgutils', 'net.minecraftforge', 'srgutils' version '0.6.1'
34+
library 'srgutils', 'net.minecraftforge', 'srgutils' version '0.6.3'
3535
library 'diff', 'io.codechicken', 'DiffPatch' version '2.0.0.36' // Fuzzy patching
3636

3737
library 'fastcsv', 'de.siegmar', 'fastcsv' version '3.4.0'

src/main/java/net/minecraftforge/mcmaven/impl/mappings/Mappings.java

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,21 @@
55
package net.minecraftforge.mcmaven.impl.mappings;
66

77
import java.io.File;
8+
import java.io.FileOutputStream;
89
import java.io.IOException;
910
import java.io.InputStreamReader;
11+
import java.nio.charset.StandardCharsets;
1012
import java.util.Collections;
1113
import java.util.HashMap;
1214
import java.util.List;
1315
import java.util.Map;
1416
import java.util.Objects;
17+
import java.util.zip.ZipEntry;
1518
import java.util.zip.ZipFile;
19+
import java.util.zip.ZipOutputStream;
1620

1721
import net.minecraftforge.mcmaven.impl.Mavenizer;
22+
import net.minecraftforge.mcmaven.impl.repo.mcpconfig.MCPConfigRepo;
1823
import net.minecraftforge.mcmaven.impl.repo.mcpconfig.MCPSide;
1924
import net.minecraftforge.mcmaven.impl.repo.mcpconfig.MinecraftTasks;
2025
import net.minecraftforge.mcmaven.impl.util.Artifact;
@@ -153,12 +158,19 @@ public Task getCsvZip(MCPSide side) {
153158

154159
var mc = side.getMCP().getMinecraftTasks();
155160
var srg = side.getTasks().getMappings();
156-
var client = mc.versionFile(MinecraftTasks.MCFile.CLIENT_MAPPINGS);
157-
var server = mc.versionFile(MinecraftTasks.MCFile.SERVER_MAPPINGS);
158-
ret = Task.named("srg2names[" + this + ']',
159-
Task.deps(srg, client, server),
160-
() -> getMappings(side, srg, client, server)
161-
);
161+
162+
if (MCPConfigRepo.isObfuscated(mc.getVersion())) {
163+
var client = mc.versionFile(MinecraftTasks.MCFile.CLIENT_MAPPINGS);
164+
var server = mc.versionFile(MinecraftTasks.MCFile.SERVER_MAPPINGS);
165+
ret = Task.named("srg2names[" + this + ']',
166+
Task.deps(srg, client, server),
167+
() -> getMappings(side, srg, client, server)
168+
);
169+
} else {
170+
// Create an empty srg->mapped zip file when requested. This is needed by old MCPConfig setups until we bump it to a version that doesn't require the concept of mappings at all
171+
ret = Task.named("srg2names[" + this + "][Empty]", () -> makeEmptyCsv(side));
172+
}
173+
162174
tasks.put(key, ret);
163175
return ret;
164176
}
@@ -187,6 +199,36 @@ private Task getTsrg(MCPSide side, Tasks type) {
187199
return ret;
188200
}
189201

202+
private File makeEmptyCsv(MCPSide side) {
203+
var root = getFolder(new File(side.getMCP().getBuildFolder(), "data/mapings"));
204+
var output = new File(root, "official.zip");
205+
206+
var cache = Util.cache(output);
207+
208+
if (Mavenizer.checkCache(output, cache))
209+
return output;
210+
211+
if (!output.getParentFile().exists())
212+
output.getParentFile().mkdirs();
213+
214+
byte[] header = String.join(",", "searge", "name", "side", "desc").getBytes(StandardCharsets.UTF_8);
215+
216+
try (var fos = new FileOutputStream(output);
217+
var out = new ZipOutputStream(fos)) {
218+
out.putNextEntry(new ZipEntry("fields.csv"));
219+
out.write(header);
220+
out.closeEntry();
221+
out.putNextEntry(new ZipEntry("methods.csv"));
222+
out.write(header);
223+
out.closeEntry();
224+
} catch (IOException e) {
225+
Util.sneak(e);
226+
}
227+
228+
cache.save();
229+
return output;
230+
}
231+
190232
private File getMappings(MCPSide side, Task srgMappings, Task clientTask, Task serverTask) {
191233
var tool = side.getMCP().getCache().maven().download(Constants.INSTALLER_TOOLS);
192234

src/main/java/net/minecraftforge/mcmaven/impl/repo/Repo.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import net.minecraftforge.mcmaven.impl.cache.Cache;
99
import net.minecraftforge.mcmaven.impl.data.GradleModule;
1010
import net.minecraftforge.mcmaven.impl.mappings.Mappings;
11+
import net.minecraftforge.mcmaven.impl.repo.mcpconfig.MCPConfigRepo;
1112
import net.minecraftforge.mcmaven.impl.repo.mcpconfig.MCPSide;
1213
import net.minecraftforge.mcmaven.impl.util.Artifact;
1314
import net.minecraftforge.mcmaven.impl.util.GradleAttributes;
@@ -280,14 +281,23 @@ public PendingArtifact withVariants(Supplier<GradleModule.Variant[]> variants) {
280281
* channel-verson-map2srg.tsrg.gz: gzip compressed tsrg file for mapped names to srg (intermediate) names
281282
*/
282283
protected List<PendingArtifact> mappingArtifacts(File cache, Mappings mappings, MCPSide side, Map<String, Supplier<String>> outputJson) {
284+
if (outputJson != null) {
285+
outputJson.put("mappings.channel", mappings::channel);
286+
outputJson.put("mappings.version", mappings::version);
287+
}
288+
289+
// 26.1 has no mappings as they are not obfed, so just output the channel.
290+
// In theory we need to add support for arbitrary mappings not just SRG.
291+
// So i'll have to change this later, but we'll cross that bridge when we come to it.
292+
if (!MCPConfigRepo.isObfuscated(side.getMCP().getMinecraftTasks().getVersion()))
293+
return List.of();
294+
283295
var coords = mappings.getArtifact(side);
284296
var csvs = pending("Mappings Zip", mappings.getCsvZip(side), coords, false);
285297
var pom = pending("Mappings POM", simplePom(cache, coords), coords.withExtension("pom"), false);
286298
var m2o = pending("Mappings map2obf", mappings.getMapped2Obf(side), coords.withClassifier("map2obf").withExtension("tsrg.gz"), false);
287299
var m2s = pending("Mappings map2srg", mappings.getMapped2Srg(side), coords.withClassifier("map2srg").withExtension("tsrg.gz"), false);
288300
if (outputJson != null) {
289-
outputJson.put("mappings.channel", mappings::channel);
290-
outputJson.put("mappings.version", mappings::version);
291301
outputJson.put("mappings.csv.artifact", csvs.artifact()::toString);
292302
outputJson.put("mappings.csv.file", csvs.task().filePathSupplier());
293303
outputJson.put("mappings.obf.artifact", m2o.artifact()::toString);

src/main/java/net/minecraftforge/mcmaven/impl/repo/mcpconfig/MCPConfigRepo.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public Task getLauncherManifestTask() {
101101

102102
// Mojang stopped obfusciating their released with the 26.1-snapshot-1
103103
private static final ComparableVersion LAST_OBFUSCATED = new ComparableVersion("1.21.11");
104-
public boolean isObfuscated(String version) {
104+
public static boolean isObfuscated(String version) {
105105
return new ComparableVersion(version).compareTo(LAST_OBFUSCATED) <= 0;
106106
}
107107

src/main/java/net/minecraftforge/mcmaven/impl/repo/mcpconfig/MCPTaskFactory.java

Lines changed: 61 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ public class MCPTaskFactory {
6464
private final Map<String, Task> tasks = new LinkedHashMap<>();
6565
private final Task preStrip;
6666
private final Task rawJar;
67-
private final Task mappings;
68-
private final Task srgJar;
67+
private final @Nullable Task mappings;
68+
private final @Nullable Task srgJar;
6969
private final Task preDecomp;
7070
private final Task last;
7171

@@ -172,11 +172,13 @@ public MCPTaskFactory(MCPSide side, File build) {
172172
if (rawJar == null)
173173
throw except("Could not find `%s` task".formatted(MCPSide.JOINED.equals(side.getName()) ? "merge" : "strip"));
174174

175-
if (mappings == null)
176-
throw except("Could not find `mappings` task");
175+
if (MCPConfigRepo.isObfuscated(this.cfg.version)) {
176+
if (mappings == null)
177+
throw except("Could not find `mappings` task");
177178

178-
if (srgJar == null)
179-
throw except("Could not find `rename` task");
179+
if (srgJar == null)
180+
throw except("Could not find `rename` task");
181+
}
180182

181183
if (predecomp == null)
182184
throw except("Could not find `decompile` step");
@@ -209,11 +211,11 @@ public Task getRawJar() {
209211
return this.rawJar;
210212
}
211213

212-
public Task getMappings() {
214+
public @Nullable Task getMappings() {
213215
return this.mappings;
214216
}
215217

216-
public Task getSrgJar() {
218+
public @Nullable Task getSrgJar() {
217219
return this.srgJar;
218220
}
219221

@@ -409,11 +411,13 @@ private Task strip(String name, Map<String, String> step) {
409411

410412
private File strip(Task inputTask, boolean whitelist, File output) {
411413
var input = inputTask.execute();
412-
var mappings = this.mappings.execute();
413414

414415
var cache = Util.cache(output)
415-
.add("input", input)
416-
.add("mappings", mappings);
416+
.add("input", input);
417+
418+
var mappings = this.mappings == null ? null : this.mappings.execute();
419+
if (mappings != null)
420+
cache.add("mappings", mappings);
417421

418422
if (Mavenizer.checkCache(output, cache))
419423
return output;
@@ -424,17 +428,28 @@ private File strip(Task inputTask, boolean whitelist, File output) {
424428
FileUtils.ensureParent(output);
425429

426430
try {
427-
var map = IMappingFile.load(mappings);
428431
var classes = new HashSet<>();
429-
for (var cls : map.getClasses())
430-
classes.add(cls.getOriginal() + ".class");
432+
433+
if (mappings != null) {
434+
var map = IMappingFile.load(mappings);
435+
for (var cls : map.getClasses())
436+
classes.add(cls.getOriginal() + ".class");
437+
}
431438

432439
try (var is = new JarInputStream(new FileInputStream(input));
433440
var os = new JarOutputStream(new FileOutputStream(output))) {
434441
JarEntry entry;
435442
while ((entry = is.getNextJarEntry()) != null) {
436-
if (entry.isDirectory() || classes.contains(entry.getName()) != whitelist)
443+
if (entry.isDirectory())
437444
continue;
445+
// If we don't have any mappings, then we're in unobfed 26.1+ so we just want classes
446+
if (classes.isEmpty()) {
447+
if (!entry.getName().endsWith(".class"))
448+
continue;
449+
} else {
450+
if (classes.contains(entry.getName()) != whitelist)
451+
continue;
452+
}
438453
os.putNextEntry(FileUtils.getStableEntry(entry));
439454
is.transferTo(os);
440455
os.closeEntry();
@@ -722,29 +737,50 @@ public int compareTo(LibLine o) {
722737
public Task getExtra() {
723738
return Task.named("extra[" + this.side.getName() + ']',
724739
Task.deps(this.preStrip, this.mappings),
725-
() -> getExtra(this.preStrip, mappings)
740+
() -> getExtra(this.preStrip, this.mappings)
726741
);
727742
}
728743

729-
private File getExtra(Task prestripTask, Task mappingsTask) {
744+
private File getExtra(Task prestripTask, @Nullable Task mappingsTask) {
730745
var prestrip = prestripTask.execute();
731-
var mappings = mappingsTask.execute();
732746

733747
var output = new File(this.build, "extra.jar");
734748

735749
var cache = Util.cache(output)
736-
.add("prestrip", prestrip)
737-
.add("mappings", mappings);
750+
.add("prestrip", prestrip);
751+
752+
var mappings = mappingsTask == null ? null : mappingsTask.execute();
753+
if (mappings != null)
754+
cache.add("mappings", mappings);
738755

739756
if (Mavenizer.checkCache(output, cache))
740757
return output;
741758

742759
try {
743-
var whitelist = IMappingFile
744-
.load(mappings).getClasses().stream()
745-
.map(IMappingFile.IClass::getOriginal)
746-
.collect(Collectors.toSet());
747-
FileUtils.splitJar(prestrip, whitelist, output, false, false);
760+
if (!output.getParentFile().exists())
761+
output.getParentFile().mkdirs();
762+
763+
// If we don't have mappings then we're in a non-obfed version (26.1+) so just strip out all classes
764+
var whitelist = new HashSet<String>();
765+
if (mappings != null) {
766+
var map = IMappingFile.load(mappings);
767+
for (var cls : map.getClasses())
768+
whitelist.add(cls.getOriginal());
769+
FileUtils.splitJar(prestrip, whitelist, output, false, false);
770+
} else {
771+
try (var zin = new ZipInputStream(new FileInputStream(prestrip));
772+
var fos = new FileOutputStream(output);
773+
var out = new ZipOutputStream(fos)) {
774+
for (ZipEntry entry = null; (entry = zin.getNextEntry()) != null; ) {
775+
// Skip classes and directories (directories are optional in zips)
776+
if (entry.getName().endsWith(".class") || entry.getName().endsWith("/"))
777+
continue;
778+
out.putNextEntry(new ZipEntry(entry.getName()));
779+
zin.transferTo(out);
780+
out.closeEntry();
781+
}
782+
}
783+
}
748784
} catch (IOException e) {
749785
Util.sneak(e);
750786
}

src/main/java/net/minecraftforge/mcmaven/impl/util/Constants.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,16 @@ public final class Constants {
2525
public static final String LAUNCHER_MANIFEST = "https://launchermeta.mojang.com/mc/game/version_manifest_v2.json";
2626
public static final String MOJANG_MAVEN = "https://libraries.minecraft.net/";
2727

28-
public static final Artifact ACCESS_TRANSFORMER = Artifact.from("net.minecraftforge:accesstransformers:8.2.1:fatjar");
28+
public static final Artifact ACCESS_TRANSFORMER = Artifact.from("net.minecraftforge:accesstransformers:8.2.14:fatjar");
2929
public static final int ACCESS_TRANSFORMER_JAVA_VERSION = 8;
3030

31-
public static final Artifact SIDE_STRIPPER = Artifact.from("net.minecraftforge:mergetool:1.2.0:fatjar");
31+
public static final Artifact SIDE_STRIPPER = Artifact.from("net.minecraftforge:mergetool:1.2.5:fatjar");
3232
public static final int SIDE_STRIPPER_JAVA_VERSION = 8;
3333

34-
public static final Artifact INSTALLER_TOOLS = Artifact.from("net.minecraftforge:installertools:1.4.3:fatjar");
34+
public static final Artifact INSTALLER_TOOLS = Artifact.from("net.minecraftforge:installertools:1.4.5:fatjar");
3535
public static final int INSTALLER_TOOLS_JAVA_VERSION = 8;
3636

37-
public static final Artifact RENAMER = Artifact.from("net.minecraftforge:ForgeAutoRenamingTool:1.1.2:all");
37+
public static final Artifact RENAMER = Artifact.from("net.minecraftforge:renamer:2.0.4:all");
3838
public static final int RENAMER_JAVA_VERSION = 8;
3939

4040
public static final Artifact STUBIFY = Artifact.from("net.minecraftforge:jar-stubify:1.0.0");

0 commit comments

Comments
 (0)