Skip to content

Commit 4ce6a1a

Browse files
authored
导入 PrismLauncher 格式整合包时 $.jvmArgs 参数未正确移除两侧引号 | 安装 MultiMC 整合包后应当设置图标 | 修复 HMCL 3.5.8.248 无法安装启动带 forge 的 1.11.2 版本的问题 | 更新 mod 数据 | 修复 Minecraft 1.20.2+Forge 默认图标错误的问题 (#843)
* HMCL-dev/HMCL#3030 * HMCL-dev/HMCL#3541 * HMCL-dev/HMCL#3113 * HMCL-dev/HMCL#3601 * HMCL-dev/HMCL#3439
1 parent 7bd7f82 commit 4ce6a1a

File tree

7 files changed

+5575
-1226
lines changed

7 files changed

+5575
-1226
lines changed

FCL/src/main/assets/mod_data.txt

Lines changed: 5177 additions & 1143 deletions
Large diffs are not rendered by default.

FCL/src/main/assets/modpack_data.txt

Lines changed: 337 additions & 57 deletions
Large diffs are not rendered by default.

FCL/src/main/java/com/tungsten/fcl/ui/manage/ModpackFileSelectionPage.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,8 @@ public void execute() {
294294
/* overrideJavaArgs */ true,
295295
/* overrideConsole */ true,
296296
/* overrideCommands */ true,
297-
/* overrideWindow */ true
297+
/* overrideWindow */ true,
298+
/* iconKey */ null // TODO
298299
), modpackFile);
299300
}
300301

FCLCore/src/main/java/com/tungsten/fclcore/download/LibraryAnalyzer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ public static boolean isModded(VersionProvider provider, Version version) {
171171
Version resolvedVersion = version.resolve(provider);
172172
String mainClass = resolvedVersion.getMainClass();
173173
return mainClass != null && (LAUNCH_WRAPPER_MAIN.equals(mainClass)
174+
|| mainClass.startsWith("net.minecraftforge")
174175
|| mainClass.startsWith("net.fabricmc")
175176
|| mainClass.startsWith("org.quiltmc")
176177
|| mainClass.startsWith("cpw.mods"));

FCLCore/src/main/java/com/tungsten/fclcore/download/game/GameLibrariesTask.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ public void execute() throws IOException {
132132
}
133133
}
134134
}
135-
if (shouldDownloadLibrary(gameRepository, version, library, integrityCheck) && library.hasDownloadURL()) {
135+
if (shouldDownloadLibrary(gameRepository, version, library, integrityCheck) && (library.hasDownloadURL() || !"optifine".equals(library.getGroupId()))) {
136136
dependencies.add(new LibraryDownloadTask(dependencyManager, file, library));
137137
} else {
138138
dependencyManager.getCacheRepository().tryCacheLibrary(library, file.toPath());

FCLCore/src/main/java/com/tungsten/fclcore/mod/multimc/MultiMCInstanceConfiguration.java

Lines changed: 49 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -54,43 +54,62 @@ public final class MultiMCInstanceConfiguration implements ModpackManifest {
5454
private final boolean overrideConsole; // OverrideConsole
5555
private final boolean overrideCommands; // OverrideCommands
5656
private final boolean overrideWindow; // OverrideWindow
57+
private final String iconKey;
5758

5859
private final MultiMCManifest mmcPack;
5960

6061
MultiMCInstanceConfiguration(String defaultName, InputStream contentStream, MultiMCManifest mmcPack) throws IOException {
62+
// instance.cfg is in .ini format. As it's like the .properties format, we use Properties to parse thie file.
63+
// Maybe this will provide some problems (and it does, such as https://github.com/HMCL-dev/HMCL/issues/2991), but this workaround works, doesn't it?
6164
Properties p = new Properties();
6265
p.load(new InputStreamReader(contentStream, StandardCharsets.UTF_8));
6366

6467
this.mmcPack = mmcPack;
6568

66-
instanceType = p.getProperty("InstanceType");
67-
autoCloseConsole = Boolean.parseBoolean(p.getProperty("AutoCloseConsole"));
69+
instanceType = readValue(p, "InstanceType");
70+
autoCloseConsole = Boolean.parseBoolean(readValue(p, "AutoCloseConsole"));
6871
gameVersion = mmcPack != null ? mmcPack.getComponents().stream().filter(e -> "net.minecraft".equals(e.getUid())).findAny()
69-
.orElseThrow(() -> new IOException("Malformed mmc-pack.json")).getVersion() : p.getProperty("IntendedVersion");
70-
javaPath = p.getProperty("JavaPath");
71-
jvmArgs = p.getProperty("JvmArgs");
72-
fullscreen = Boolean.parseBoolean(p.getProperty("LaunchMaximized"));
73-
maxMemory = Lang.toIntOrNull(p.getProperty("MaxMemAlloc"));
74-
minMemory = Lang.toIntOrNull(p.getProperty("MinMemAlloc"));
75-
height = Lang.toIntOrNull(p.getProperty("MinecraftWinHeight"));
76-
width = Lang.toIntOrNull(p.getProperty("MinecraftWinWidth"));
77-
overrideCommands = Boolean.parseBoolean(p.getProperty("OverrideCommands"));
78-
overrideConsole = Boolean.parseBoolean(p.getProperty("OverrideConsole"));
79-
overrideJavaArgs = Boolean.parseBoolean(p.getProperty("OverrideJavaArgs"));
80-
overrideJavaLocation = Boolean.parseBoolean(p.getProperty("OverrideJavaLocation"));
81-
overrideMemory = Boolean.parseBoolean(p.getProperty("OverrideMemory"));
82-
overrideWindow = Boolean.parseBoolean(p.getProperty("OverrideWindow"));
83-
permGen = Lang.toIntOrNull(p.getProperty("PermGen"));
84-
postExitCommand = p.getProperty("PostExitCommand");
85-
preLaunchCommand = p.getProperty("PreLaunchCommand");
86-
showConsole = Boolean.parseBoolean(p.getProperty("ShowConsole"));
87-
showConsoleOnError = Boolean.parseBoolean(p.getProperty("ShowConsoleOnError"));
88-
wrapperCommand = p.getProperty("WrapperCommand");
72+
.orElseThrow(() -> new IOException("Malformed mmc-pack.json")).getVersion() : readValue(p, "IntendedVersion");
73+
javaPath = readValue(p, "JavaPath");
74+
jvmArgs = readValue(p, "JvmArgs");
75+
fullscreen = Boolean.parseBoolean(readValue(p, "LaunchMaximized"));
76+
maxMemory = Lang.toIntOrNull(readValue(p, "MaxMemAlloc"));
77+
minMemory = Lang.toIntOrNull(readValue(p, "MinMemAlloc"));
78+
height = Lang.toIntOrNull(readValue(p, "MinecraftWinHeight"));
79+
width = Lang.toIntOrNull(readValue(p, "MinecraftWinWidth"));
80+
overrideCommands = Boolean.parseBoolean(readValue(p, "OverrideCommands"));
81+
overrideConsole = Boolean.parseBoolean(readValue(p, "OverrideConsole"));
82+
overrideJavaArgs = Boolean.parseBoolean(readValue(p, "OverrideJavaArgs"));
83+
overrideJavaLocation = Boolean.parseBoolean(readValue(p, "OverrideJavaLocation"));
84+
overrideMemory = Boolean.parseBoolean(readValue(p, "OverrideMemory"));
85+
overrideWindow = Boolean.parseBoolean(readValue(p, "OverrideWindow"));
86+
permGen = Lang.toIntOrNull(readValue(p, "PermGen"));
87+
postExitCommand = readValue(p, "PostExitCommand");
88+
preLaunchCommand = readValue(p, "PreLaunchCommand");
89+
showConsole = Boolean.parseBoolean(readValue(p, "ShowConsole"));
90+
showConsoleOnError = Boolean.parseBoolean(readValue(p, "ShowConsoleOnError"));
91+
wrapperCommand = readValue(p, "WrapperCommand");
8992
name = defaultName;
90-
notes = Optional.ofNullable(p.getProperty("notes")).orElse("");
93+
notes = Optional.ofNullable(readValue(p, "notes")).orElse("");
94+
iconKey = readValue(p, "iconKey");
9195
}
9296

93-
public MultiMCInstanceConfiguration(String instanceType, String name, String gameVersion, Integer permGen, String wrapperCommand, String preLaunchCommand, String postExitCommand, String notes, String javaPath, String jvmArgs, boolean fullscreen, Integer width, Integer height, Integer maxMemory, Integer minMemory, boolean showConsole, boolean showConsoleOnError, boolean autoCloseConsole, boolean overrideMemory, boolean overrideJavaLocation, boolean overrideJavaArgs, boolean overrideConsole, boolean overrideCommands, boolean overrideWindow) {
97+
/**
98+
* A workaround for <a href="https://github.com/HMCL-dev/HMCL/issues/2991">...</a>
99+
*/
100+
private String readValue(Properties p, String key) {
101+
String value = p.getProperty(key);
102+
if (value == null) {
103+
return null;
104+
}
105+
int l = value.length();
106+
if (l >= 2 && value.charAt(0) == '"' && value.charAt(l - 1) == ':') {
107+
return value.substring(0, l - 1);
108+
}
109+
return value;
110+
}
111+
112+
public MultiMCInstanceConfiguration(String instanceType, String name, String gameVersion, Integer permGen, String wrapperCommand, String preLaunchCommand, String postExitCommand, String notes, String javaPath, String jvmArgs, boolean fullscreen, Integer width, Integer height, Integer maxMemory, Integer minMemory, boolean showConsole, boolean showConsoleOnError, boolean autoCloseConsole, boolean overrideMemory, boolean overrideJavaLocation, boolean overrideJavaArgs, boolean overrideConsole, boolean overrideCommands, boolean overrideWindow, String iconKey) {
94113
this.instanceType = instanceType;
95114
this.name = name;
96115
this.gameVersion = gameVersion;
@@ -116,6 +135,7 @@ public MultiMCInstanceConfiguration(String instanceType, String name, String gam
116135
this.overrideCommands = overrideCommands;
117136
this.overrideWindow = overrideWindow;
118137
this.mmcPack = null;
138+
this.iconKey = iconKey;
119139
}
120140

121141
public String getInstanceType() {
@@ -288,6 +308,10 @@ public boolean isOverrideWindow() {
288308
return overrideWindow;
289309
}
290310

311+
public String getIconKey() {
312+
return iconKey;
313+
}
314+
291315
public Properties toProperties() {
292316
Properties p = new Properties();
293317
if (instanceType != null) p.setProperty("InstanceType", instanceType);
@@ -314,6 +338,7 @@ public Properties toProperties() {
314338
if (wrapperCommand != null) p.setProperty("WrapperCommand", wrapperCommand);
315339
if (name != null) p.setProperty("name", name);
316340
if (notes != null) p.setProperty("notes", notes);
341+
if (iconKey != null) p.setProperty("iconKey", iconKey);
317342
return p;
318343
}
319344

FCLCore/src/main/java/com/tungsten/fclcore/mod/multimc/MultiMCModpackInstallTask.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,14 @@ public void execute() throws Exception {
197197
Path jarmods = root.resolve("jarmods");
198198
if (Files.exists(jarmods))
199199
FileUtils.copyDirectory(jarmods, repository.getVersionRoot(name).toPath().resolve("jarmods"));
200+
201+
String iconKey = this.manifest.getIconKey();
202+
if (iconKey != null) {
203+
Path iconFile = root.resolve(iconKey + ".png");
204+
if (Files.exists(iconFile)) {
205+
FileUtils.copyFile(iconFile, repository.getVersionRoot(name).toPath().resolve("icon.png"));
206+
}
207+
}
200208
}
201209

202210
dependencies.add(repository.saveAsync(version));

0 commit comments

Comments
 (0)