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