Skip to content

Commit 6d0e886

Browse files
committed
Merge branch 'fix3540/multimc-patch-json' of https://github.com/burningtnt/HMCL into prs
2 parents e7d47a1 + 60cba55 commit 6d0e886

3 files changed

Lines changed: 52 additions & 43 deletions

File tree

HMCLCore/src/main/java/org/jackhuang/hmcl/game/Version.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,10 @@ public Version setJar(String jar) {
437437
return new Version(resolved, id, version, priority, minecraftArguments, arguments, mainClass, inheritsFrom, jar, assetIndex, assets, complianceLevel, javaVersion, libraries, compatibilityRules, downloads, logging, type, time, releaseTime, minimumLauncherVersion, hidden, root, patches);
438438
}
439439

440+
public Version setAssetIndex(AssetIndexInfo assetIndex) {
441+
return new Version(resolved, id, version, priority, minecraftArguments, arguments, mainClass, inheritsFrom, jar, assetIndex, assets, complianceLevel, javaVersion, libraries, compatibilityRules, downloads, logging, type, time, releaseTime, minimumLauncherVersion, hidden, root, patches);
442+
}
443+
440444
public Version setLibraries(List<Library> libraries) {
441445
return new Version(resolved, id, version, priority, minecraftArguments, arguments, mainClass, inheritsFrom, jar, assetIndex, assets, complianceLevel, javaVersion, libraries, compatibilityRules, downloads, logging, type, time, releaseTime, minimumLauncherVersion, hidden, root, patches);
442446
}

HMCLCore/src/main/java/org/jackhuang/hmcl/mod/multimc/MultiMCInstancePatch.java

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@
1818
package org.jackhuang.hmcl.mod.multimc;
1919

2020
import com.google.gson.annotations.SerializedName;
21-
import org.jackhuang.hmcl.game.Library;
21+
import org.jackhuang.hmcl.game.*;
2222
import org.jackhuang.hmcl.util.Immutable;
2323
import org.jackhuang.hmcl.util.Lang;
2424
import org.jetbrains.annotations.Nullable;
2525

26+
import java.util.ArrayList;
27+
import java.util.Arrays;
2628
import java.util.Collections;
2729
import java.util.List;
2830

@@ -35,6 +37,7 @@ public final class MultiMCInstancePatch {
3537
private final String name;
3638
private final String version;
3739
private final int order;
40+
private final AssetIndexInfo assetIndex;
3841

3942
private final String minecraftArguments;
4043

@@ -63,10 +66,11 @@ public final class MultiMCInstancePatch {
6366
@Nullable
6467
private final List<Library> jarMods;
6568

66-
public MultiMCInstancePatch(String name, String version, int order, String minecraftArguments, String gameVersion, String mainClass, int[] javaMajors, @Nullable List<String> tweakers, @Nullable List<String> jvmArgs, @Nullable List<Library> _libraries, @Nullable List<Library> libraries, @Nullable List<Library> jarMods) {
69+
public MultiMCInstancePatch(String name, String version, int order, AssetIndexInfo assetIndex, String minecraftArguments, String gameVersion, String mainClass, int[] javaMajors, @Nullable List<String> tweakers, @Nullable List<String> jvmArgs, @Nullable List<Library> _libraries, @Nullable List<Library> libraries, @Nullable List<Library> jarMods) {
6770
this.name = name;
6871
this.version = version;
6972
this.order = order;
73+
this.assetIndex = assetIndex;
7074
this.minecraftArguments = minecraftArguments;
7175
this.gameVersion = gameVersion;
7276
this.mainClass = mainClass;
@@ -86,6 +90,10 @@ public String getVersion() {
8690
return version;
8791
}
8892

93+
public AssetIndexInfo getAssetIndex() {
94+
return assetIndex;
95+
}
96+
8997
public String getMinecraftArguments() {
9098
return minecraftArguments;
9199
}
@@ -121,4 +129,38 @@ public List<Library> getLibraries() {
121129
public List<Library> getJarMods() {
122130
return jarMods != null ? Collections.unmodifiableList(jarMods) : Collections.emptyList();
123131
}
132+
133+
public Version asVersion(String patchID) {
134+
List<String> arguments = new ArrayList<>();
135+
for (String arg : getTweakers()) {
136+
arguments.add("--tweakClass");
137+
arguments.add(arg);
138+
}
139+
140+
Version version = new Version(patchID)
141+
.setVersion(getVersion())
142+
.setArguments(new Arguments().addGameArguments(arguments).addJVMArguments(getJvmArgs()))
143+
.setMainClass(getMainClass())
144+
.setMinecraftArguments(getMinecraftArguments())
145+
.setLibraries(getLibraries())
146+
.setAssetIndex(getAssetIndex());
147+
148+
/* TODO: Official Version Json can only store one GameJavaVersion, not a array of all suitable java versions.
149+
For compatibility with official launcher and any other launchers, a transform is made between int[] and GameJavaVersion. */
150+
int[] majors = getJavaMajors();
151+
if (majors != null) {
152+
majors = majors.clone();
153+
Arrays.sort(majors);
154+
155+
for (int i = majors.length - 1; i >= 0; i--) {
156+
GameJavaVersion jv = GameJavaVersion.get(majors[i]);
157+
if (jv != null) {
158+
version = version.setJavaVersion(jv);
159+
break;
160+
}
161+
}
162+
}
163+
164+
return version;
165+
}
124166
}

HMCLCore/src/main/java/org/jackhuang/hmcl/mod/multimc/MultiMCModpackInstallTask.java

Lines changed: 4 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import org.jackhuang.hmcl.download.LibraryAnalyzer;
2424
import org.jackhuang.hmcl.game.Arguments;
2525
import org.jackhuang.hmcl.game.DefaultGameRepository;
26-
import org.jackhuang.hmcl.game.GameJavaVersion;
2726
import org.jackhuang.hmcl.game.Version;
2827
import org.jackhuang.hmcl.mod.MinecraftInstanceTask;
2928
import org.jackhuang.hmcl.mod.Modpack;
@@ -194,8 +193,8 @@ public void execute() throws Exception {
194193
String componentID = entry.getKey();
195194
String patchJson = Objects.requireNonNull(entry.getValue().getResult());
196195

197-
if (components.put(componentID, Pair.pair(convertPatchToVersion(
198-
readPatch(patchJson), componentID), null
196+
if (components.put(componentID, Pair.pair(readPatch(patchJson).asVersion(
197+
componentID), null
199198
)) != null) {
200199
throw new IllegalArgumentException("Duplicate libraries: " + componentID);
201200
}
@@ -277,7 +276,7 @@ public void execute() throws Exception {
277276
FileUtils.copyDirectory(jm.getPath("/"), mc.getPath("/"));
278277
}
279278
} else {
280-
Version tc, pp = jp == null ? null : convertPatchToVersion(jp, componentID);
279+
Version tc, pp = jp == null ? null : jp.asVersion(componentID);
281280

282281
if (original == null) {
283282
tc = Objects.requireNonNull(pp, "Original and Json-Patch shouldn't be empty at the same time.");
@@ -300,46 +299,10 @@ public void execute() throws Exception {
300299
}
301300

302301
private MultiMCInstancePatch readPatch(String patchJson) {
303-
MultiMCInstancePatch patch;
304302
try {
305-
patch = JsonUtils.GSON.fromJson(patchJson, MultiMCInstancePatch.class);
303+
return JsonUtils.GSON.fromJson(patchJson, MultiMCInstancePatch.class);
306304
} catch (JsonParseException e) {
307305
throw new IllegalArgumentException("Cannot parse MultiMC patch json: " + patchJson, e);
308306
}
309-
return patch;
310-
}
311-
312-
private Version convertPatchToVersion(MultiMCInstancePatch patch, String patchID) {
313-
List<String> arguments = new ArrayList<>();
314-
for (String arg : patch.getTweakers()) {
315-
arguments.add("--tweakClass");
316-
arguments.add(arg);
317-
}
318-
319-
Version version = new Version(patchID)
320-
.setVersion(patch.getVersion())
321-
.setArguments(new Arguments().addGameArguments(arguments).addJVMArguments(patch.getJvmArgs()))
322-
.setMainClass(patch.getMainClass())
323-
.setMinecraftArguments(patch.getMinecraftArguments())
324-
.setLibraries(patch.getLibraries());
325-
326-
// Workaround: Official Version Json can only store one GameJavaVersion, not a array of all suitable java versions.
327-
// For compatibility with official launcher and any other launchers,
328-
// a transform is made between int[] and GameJavaVersion.
329-
int[] majors = patch.getJavaMajors();
330-
if (majors != null) {
331-
majors = majors.clone();
332-
Arrays.sort(majors);
333-
334-
for (int i = majors.length - 1; i >= 0; i--) {
335-
GameJavaVersion jv = GameJavaVersion.get(majors[i]);
336-
if (jv != null) {
337-
version = version.setJavaVersion(jv);
338-
break;
339-
}
340-
}
341-
}
342-
343-
return version;
344307
}
345308
}

0 commit comments

Comments
 (0)