@@ -165,7 +165,7 @@ await IOUtil.UnzipFiles(path, tempFolder, (file) =>
165
165
foreach ( var kv in op . Files )
166
166
{
167
167
var zipPath = kv . Value ;
168
- allPmpFiles . Add ( zipPath ) ;
168
+ allPmpFiles . Add ( zipPath . ToLower ( ) ) ;
169
169
}
170
170
}
171
171
}
@@ -178,7 +178,7 @@ await IOUtil.UnzipFiles(path, tempFolder, (file) =>
178
178
foreach ( var kv in defOp . Files )
179
179
{
180
180
var zipPath = kv . Value ;
181
- allPmpFiles . Add ( zipPath ) ;
181
+ allPmpFiles . Add ( zipPath . ToLower ( ) ) ;
182
182
}
183
183
}
184
184
@@ -194,8 +194,6 @@ await IOUtil.UnzipFiles(originalPath, path, (file) =>
194
194
} ) ;
195
195
}
196
196
197
-
198
-
199
197
return ( pmp , path , image ) ;
200
198
}
201
199
@@ -316,124 +314,124 @@ private static void ValidateOption(PmpStandardOptionJson op)
316
314
317
315
tx . ModPack = modPack ;
318
316
319
- if ( pmp . Groups == null || pmp . Groups . Count == 0 )
317
+ var defMod = pmp . DefaultMod as PmpStandardOptionJson ;
318
+
319
+ // Default option is always selected and always applied first, if it is present
320
+ if ( defMod != null && ! defMod . IsEmptyOption )
320
321
{
321
- // No options, just default.
322
322
var groupRes = await ImportOption ( pmp . DefaultMod , unzippedPath , tx , progress ) ;
323
323
UnionDict ( imported , groupRes . Imported ) ;
324
324
notImported . UnionWith ( groupRes . NotImported ) ;
325
325
}
326
- else
326
+
327
+ // Order groups by Priority, Lowest => Highest, tiebreaker default order
328
+ var orderedGroups = pmp . Groups . OrderBy ( x => x . Priority ) . ToList ( ) ;
329
+ var groupIdx = 0 ;
330
+ foreach ( var group in orderedGroups )
327
331
{
328
- // Order groups by Priority, Lowest => Highest, tiebreaker default order
329
- var orderedGroups = pmp . Groups . OrderBy ( x => x . Priority ) . ToList ( ) ;
330
- var groupIdx = 0 ;
331
- foreach ( var group in orderedGroups )
332
+ if ( group . Options == null || group . Options . Count == 0 )
332
333
{
333
- if ( group . Options == null || group . Options . Count == 0 )
334
- {
335
- // No valid options.
336
- groupIdx ++ ;
337
- continue ;
338
- }
339
- var optionIdx = 0 ;
334
+ // No valid options.
335
+ groupIdx ++ ;
336
+ continue ;
337
+ }
338
+ var optionIdx = 0 ;
340
339
341
- // Get Default selection.
342
- var selected = group . DefaultSettings ;
340
+ // Get Default selection.
341
+ var selected = group . DefaultSettings ;
343
342
344
- // If the user selected custom settings, use those.
345
- if ( group . SelectedSettings >= 0 )
343
+ // If the user selected custom settings, use those.
344
+ if ( group . SelectedSettings >= 0 )
345
+ {
346
+ selected = group . SelectedSettings ;
347
+ }
348
+
349
+ if ( group . Type == "Single" )
350
+ {
351
+ if ( selected < 0 || selected >= group . Options . Count )
346
352
{
347
- selected = group . SelectedSettings ;
353
+ selected = 0 ;
348
354
}
355
+ var groupRes = await ImportOption ( group . Options [ selected ] , unzippedPath , tx , progress , groupIdx , optionIdx ) ;
356
+ UnionDict ( imported , groupRes . Imported ) ;
357
+ notImported . UnionWith ( groupRes . NotImported ) ;
358
+ }
359
+ else if ( group . Type == "Multi" )
360
+ {
361
+ var ordered = group . Options . OrderBy ( x => ( ( PmpStandardOptionJson ) x ) . Priority ) . ToList ( ) ;
349
362
350
- if ( group . Type == "Single" )
363
+ // Bitmask options. Install in priority order.
364
+ foreach ( var op in ordered )
351
365
{
352
- if ( selected < 0 || selected >= group . Options . Count )
366
+ var i = group . Options . IndexOf ( op ) ;
367
+ var value = 1 << i ;
368
+ if ( ( selected & value ) > 0 )
353
369
{
354
- selected = 0 ;
370
+ var groupRes = await ImportOption ( group . Options [ i ] , unzippedPath , tx , progress , groupIdx , optionIdx ) ;
371
+ UnionDict ( imported , groupRes . Imported ) ;
372
+ notImported . UnionWith ( groupRes . NotImported ) ;
373
+ optionIdx ++ ;
355
374
}
356
- var groupRes = await ImportOption ( group . Options [ selected ] , unzippedPath , tx , progress , groupIdx , optionIdx ) ;
357
- UnionDict ( imported , groupRes . Imported ) ;
358
- notImported . UnionWith ( groupRes . NotImported ) ;
359
375
}
360
- else if ( group . Type == "Multi" )
361
- {
362
- var ordered = group . Options . OrderBy ( x => ( ( PmpStandardOptionJson ) x ) . Priority ) . ToList ( ) ;
363
376
364
- // Bitmask options. Install in priority order.
365
- foreach ( var op in ordered )
377
+ } else if ( group . Type == "Imc" )
378
+ {
379
+ // Could do with popping this out to its own function.
380
+ var imcGroup = group as PMPImcGroupJson ;
381
+ var xivImc = imcGroup . DefaultEntry . ToXivImc ( ) ;
382
+
383
+ bool disabled = false ;
384
+ // Bitmask options.
385
+ for ( int i = 0 ; i < group . Options . Count ; i ++ )
386
+ {
387
+ var value = 1 << i ;
388
+ if ( ( selected & value ) > 0 )
366
389
{
367
- var i = group . Options . IndexOf ( op ) ;
368
- var value = 1 << i ;
369
- if ( ( selected & value ) > 0 )
390
+ var disableOpt = group . Options [ i ] as PmpDisableImcOptionJson ;
391
+ if ( disableOpt != null )
370
392
{
371
- var groupRes = await ImportOption ( group . Options [ i ] , unzippedPath , tx , progress , groupIdx , optionIdx ) ;
372
- UnionDict ( imported , groupRes . Imported ) ;
373
- notImported . UnionWith ( groupRes . NotImported ) ;
374
- optionIdx ++ ;
393
+ // No options allowed >:|
394
+ disabled = true ;
395
+ break ;
375
396
}
397
+
398
+ var opt = group . Options [ i ] as PmpImcOptionJson ;
399
+ optionIdx ++ ;
400
+
401
+ xivImc . AttributeMask |= opt . AttributeMask ;
376
402
}
403
+ }
377
404
378
- } else if ( group . Type == "Imc" )
405
+ if ( ! disabled )
379
406
{
380
- // Could do with popping this out to its own function.
381
- var imcGroup = group as PMPImcGroupJson ;
382
- var xivImc = imcGroup . DefaultEntry . ToXivImc ( ) ;
383
-
384
- bool disabled = false ;
385
- // Bitmask options.
386
- for ( int i = 0 ; i < group . Options . Count ; i ++ )
407
+ var root = imcGroup . GetRoot ( ) ;
408
+ var metaData = await GetImportMetadata ( imported , root , tx ) ;
409
+ if ( metaData . ImcEntries . Count <= imcGroup . Identifier . Variant )
387
410
{
388
- var value = 1 << i ;
389
- if ( ( selected & value ) > 0 )
411
+ while ( metaData . ImcEntries . Count <= imcGroup . Identifier . Variant )
390
412
{
391
- var disableOpt = group . Options [ i ] as PmpDisableImcOptionJson ;
392
- if ( disableOpt != null )
393
- {
394
- // No options allowed >:|
395
- disabled = true ;
396
- break ;
397
- }
398
-
399
- var opt = group . Options [ i ] as PmpImcOptionJson ;
400
- optionIdx ++ ;
401
-
402
- xivImc . AttributeMask |= opt . AttributeMask ;
413
+ metaData . ImcEntries . Add ( ( XivImc ) xivImc . Clone ( ) ) ;
403
414
}
404
415
}
405
-
406
- if ( ! disabled )
416
+ else
407
417
{
408
- var root = imcGroup . GetRoot ( ) ;
409
- var metaData = await GetImportMetadata ( imported , root , tx ) ;
410
- if ( metaData . ImcEntries . Count <= imcGroup . Identifier . Variant )
411
- {
412
- while ( metaData . ImcEntries . Count <= imcGroup . Identifier . Variant )
413
- {
414
- metaData . ImcEntries . Add ( ( XivImc ) xivImc . Clone ( ) ) ;
415
- }
416
- }
417
- else
418
- {
419
- metaData . ImcEntries [ ( int ) imcGroup . Identifier . Variant ] = xivImc ;
420
- }
418
+ metaData . ImcEntries [ ( int ) imcGroup . Identifier . Variant ] = xivImc ;
419
+ }
421
420
422
- if ( imcGroup . AllVariants )
421
+ if ( imcGroup . AllVariants )
422
+ {
423
+ for ( int i = 0 ; i < metaData . ImcEntries . Count ; i ++ )
423
424
{
424
- for ( int i = 0 ; i < metaData . ImcEntries . Count ; i ++ )
425
- {
426
- metaData . ImcEntries [ i ] = ( XivImc ) xivImc . Clone ( ) ;
427
- }
425
+ metaData . ImcEntries [ i ] = ( XivImc ) xivImc . Clone ( ) ;
428
426
}
427
+ }
429
428
430
- await ItemMetadata . SaveMetadata ( metaData , _Source , tx ) ;
431
- await ItemMetadata . ApplyMetadata ( metaData , tx ) ;
429
+ await ItemMetadata . SaveMetadata ( metaData , _Source , tx ) ;
430
+ await ItemMetadata . ApplyMetadata ( metaData , tx ) ;
432
431
433
- }
434
432
}
435
- groupIdx ++ ;
436
433
}
434
+ groupIdx ++ ;
437
435
}
438
436
439
437
var preRootTime = DateTimeOffset . Now . ToUnixTimeMilliseconds ( ) ;
@@ -910,28 +908,31 @@ internal static async Task<Dictionary<string, FileStorageInformation>> UnpackPMP
910
908
var defMod = pmp . DefaultMod as PmpStandardOptionJson ;
911
909
PmpStandardOptionJson option = null ;
912
910
913
- if ( defMod != null && ( defMod . FileSwaps . Count > 0 || defMod . Manipulations . Count > 0 || defMod . Files . Count > 0 ) && pmp . Groups . Count == 0 )
911
+ // Default mod is always present, but may be void of any data
912
+ if ( defMod != null && ! defMod . IsEmptyOption )
914
913
{
915
914
// Valid Default Mod Option
916
915
option = defMod ;
917
916
}
918
- else
917
+
918
+ if ( pmp . Groups . Count == 1 )
919
919
{
920
- if ( pmp . Groups . Count == 1 )
920
+ var group = pmp . Groups [ 0 ] ;
921
+ if ( group . Options . Count == 1 )
921
922
{
922
- var group = pmp . Groups [ 0 ] ;
923
- if ( group . Options . Count == 1 )
924
- {
925
- option = group . Options [ 0 ] as PmpStandardOptionJson ;
926
- }
927
- else if ( group . Options . Count > 1 )
928
- {
923
+ // The default option was already found to be valid, leaving us with two valid options
924
+ // Return null so it gets treated as a wizard modpack instead
925
+ if ( option != null )
929
926
return null ;
930
- }
931
- } else if ( pmp . Groups . Count > 1 )
927
+ option = group . Options [ 0 ] as PmpStandardOptionJson ;
928
+ }
929
+ else if ( group . Options . Count > 1 )
932
930
{
933
931
return null ;
934
932
}
933
+ } else if ( pmp . Groups . Count > 1 )
934
+ {
935
+ return null ;
935
936
}
936
937
937
938
if ( option == null )
@@ -1402,6 +1403,12 @@ public class PmpStandardOptionJson : PMPOptionJson
1402
1403
public Dictionary < string , string > FileSwaps ;
1403
1404
public List < PMPManipulationWrapperJson > Manipulations ;
1404
1405
public int Priority ;
1406
+
1407
+ [ JsonIgnore ] public bool IsEmptyOption => ! (
1408
+ ( FileSwaps != null && FileSwaps . Count > 0 ) ||
1409
+ ( Manipulations != null && Manipulations . Count > 0 ) ||
1410
+ ( Files != null && Files . Count > 0 )
1411
+ ) ;
1405
1412
}
1406
1413
1407
1414
public class PmpDisableImcOptionJson : PMPOptionJson
0 commit comments