@@ -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
0 commit comments