@@ -12,14 +12,23 @@ const ConfigManager = require('./configmanager')
12
12
13
13
const logger = LoggerUtil . getLogger ( 'ProcessBuilder' )
14
14
15
+
16
+ /**
17
+ * Only forge and fabric are top level mod loaders.
18
+ *
19
+ * Forge 1.13+ launch logic is similar to fabrics, for now using usingFabricLoader flag to
20
+ * change minor details when needed.
21
+ *
22
+ * Rewrite of this module may be needed in the future.
23
+ */
15
24
class ProcessBuilder {
16
25
17
- constructor ( distroServer , versionData , forgeData , authUser , launcherVersion ) {
26
+ constructor ( distroServer , vanillaManifest , modManifest , authUser , launcherVersion ) {
18
27
this . gameDir = path . join ( ConfigManager . getInstanceDirectory ( ) , distroServer . rawServer . id )
19
28
this . commonDir = ConfigManager . getCommonDirectory ( )
20
29
this . server = distroServer
21
- this . versionData = versionData
22
- this . forgeData = forgeData
30
+ this . vanillaManifest = vanillaManifest
31
+ this . modManifest = modManifest
23
32
this . authUser = authUser
24
33
this . launcherVersion = launcherVersion
25
34
this . forgeModListFile = path . join ( this . gameDir , 'forgeMods.list' ) // 1.13+
@@ -28,6 +37,7 @@ class ProcessBuilder {
28
37
this . libPath = path . join ( this . commonDir , 'libraries' )
29
38
30
39
this . usingLiteLoader = false
40
+ this . usingFabricLoader = false
31
41
this . llPath = null
32
42
}
33
43
@@ -40,9 +50,12 @@ class ProcessBuilder {
40
50
process . throwDeprecation = true
41
51
this . setupLiteLoader ( )
42
52
logger . info ( 'Using liteloader:' , this . usingLiteLoader )
53
+ this . usingFabricLoader = this . server . modules . some ( mdl => mdl . rawModule . type === Type . Fabric )
54
+ logger . info ( 'Using fabric loader:' , this . usingFabricLoader )
43
55
const modObj = this . resolveModConfiguration ( ConfigManager . getModConfiguration ( this . server . rawServer . id ) . mods , this . server . modules )
44
56
45
57
// Mod list below 1.13
58
+ // Fabric only supports 1.14+
46
59
if ( ! mcVersionAtLeast ( '1.13' , this . server . rawServer . minecraftVersion ) ) {
47
60
this . constructJSONModList ( 'forge' , modObj . fMods , true )
48
61
if ( this . usingLiteLoader ) {
@@ -166,7 +179,7 @@ class ProcessBuilder {
166
179
167
180
for ( let mdl of mdls ) {
168
181
const type = mdl . rawModule . type
169
- if ( type === Type . ForgeMod || type === Type . LiteMod || type === Type . LiteLoader ) {
182
+ if ( type === Type . ForgeMod || type === Type . LiteMod || type === Type . LiteLoader || type === Type . FabricMod ) {
170
183
const o = ! mdl . getRequired ( ) . value
171
184
const e = ProcessBuilder . isModEnabled ( modCfg [ mdl . getVersionlessMavenIdentifier ( ) ] , mdl . getRequired ( ) )
172
185
if ( ! o || ( o && e ) ) {
@@ -178,7 +191,7 @@ class ProcessBuilder {
178
191
continue
179
192
}
180
193
}
181
- if ( type === Type . ForgeMod ) {
194
+ if ( type === Type . ForgeMod || type === Type . FabricMod ) {
182
195
fMods . push ( mdl )
183
196
} else {
184
197
lMods . push ( mdl )
@@ -194,7 +207,7 @@ class ProcessBuilder {
194
207
}
195
208
196
209
_lteMinorVersion ( version ) {
197
- return Number ( this . forgeData . id . split ( '-' ) [ 0 ] . split ( '.' ) [ 1 ] ) <= Number ( version )
210
+ return Number ( this . modManifest . id . split ( '-' ) [ 0 ] . split ( '.' ) [ 1 ] ) <= Number ( version )
198
211
}
199
212
200
213
/**
@@ -206,7 +219,7 @@ class ProcessBuilder {
206
219
if ( this . _lteMinorVersion ( 9 ) ) {
207
220
return false
208
221
}
209
- const ver = this . forgeData . id . split ( '-' ) [ 2 ]
222
+ const ver = this . modManifest . id . split ( '-' ) [ 2 ]
210
223
const pts = ver . split ( '.' )
211
224
const min = [ 14 , 23 , 3 , 2655 ]
212
225
for ( let i = 0 ; i < pts . length ; i ++ ) {
@@ -282,18 +295,21 @@ class ProcessBuilder {
282
295
// }
283
296
284
297
/**
285
- * Construct the mod argument list for forge 1.13
298
+ * Construct the mod argument list for forge 1.13 and Fabric
286
299
*
287
300
* @param {Array.<Object> } mods An array of mods to add to the mod list.
288
301
*/
289
302
constructModList ( mods ) {
290
303
const writeBuffer = mods . map ( mod => {
291
- return mod . getExtensionlessMavenIdentifier ( )
304
+ return this . usingFabricLoader ? mod . getPath ( ) : mod . getExtensionlessMavenIdentifier ( )
292
305
} ) . join ( '\n' )
293
306
294
307
if ( writeBuffer ) {
295
308
fs . writeFileSync ( this . forgeModListFile , writeBuffer , 'UTF-8' )
296
- return [
309
+ return this . usingFabricLoader ? [
310
+ '--fabric.addMods' ,
311
+ `@${ this . forgeModListFile } `
312
+ ] : [
297
313
'--fml.mavenRoots' ,
298
314
path . join ( '..' , '..' , 'common' , 'modstore' ) ,
299
315
'--fml.modLists' ,
@@ -361,7 +377,7 @@ class ProcessBuilder {
361
377
args . push ( '-Djava.library.path=' + tempNativePath )
362
378
363
379
// Main Java Class
364
- args . push ( this . forgeData . mainClass )
380
+ args . push ( this . modManifest . mainClass )
365
381
366
382
// Forge Arguments
367
383
args = args . concat ( this . _resolveForgeArgs ( ) )
@@ -384,17 +400,17 @@ class ProcessBuilder {
384
400
const argDiscovery = / \$ { * ( .* ) } /
385
401
386
402
// JVM Arguments First
387
- let args = this . versionData . arguments . jvm
403
+ let args = this . vanillaManifest . arguments . jvm
388
404
389
405
// Debug securejarhandler
390
406
// args.push('-Dbsl.debug=true')
391
407
392
- if ( this . forgeData . arguments . jvm != null ) {
393
- for ( const argStr of this . forgeData . arguments . jvm ) {
408
+ if ( this . modManifest . arguments . jvm != null ) {
409
+ for ( const argStr of this . modManifest . arguments . jvm ) {
394
410
args . push ( argStr
395
411
. replaceAll ( '${library_directory}' , this . libPath )
396
412
. replaceAll ( '${classpath_separator}' , ProcessBuilder . getClasspathSeparator ( ) )
397
- . replaceAll ( '${version_name}' , this . forgeData . id )
413
+ . replaceAll ( '${version_name}' , this . modManifest . id )
398
414
)
399
415
}
400
416
}
@@ -411,10 +427,10 @@ class ProcessBuilder {
411
427
args = args . concat ( ConfigManager . getJVMOptions ( this . server . rawServer . id ) )
412
428
413
429
// Main Java Class
414
- args . push ( this . forgeData . mainClass )
430
+ args . push ( this . modManifest . mainClass )
415
431
416
432
// Vanilla Arguments
417
- args = args . concat ( this . versionData . arguments . game )
433
+ args = args . concat ( this . vanillaManifest . arguments . game )
418
434
419
435
for ( let i = 0 ; i < args . length ; i ++ ) {
420
436
if ( typeof args [ i ] === 'object' && args [ i ] . rules != null ) {
@@ -471,7 +487,7 @@ class ProcessBuilder {
471
487
val = this . authUser . displayName . trim ( )
472
488
break
473
489
case 'version_name' :
474
- //val = versionData .id
490
+ //val = vanillaManifest .id
475
491
val = this . server . rawServer . id
476
492
break
477
493
case 'game_directory' :
@@ -481,7 +497,7 @@ class ProcessBuilder {
481
497
val = path . join ( this . commonDir , 'assets' )
482
498
break
483
499
case 'assets_index_name' :
484
- val = this . versionData . assets
500
+ val = this . vanillaManifest . assets
485
501
break
486
502
case 'auth_uuid' :
487
503
val = this . authUser . uuid . trim ( )
@@ -493,7 +509,7 @@ class ProcessBuilder {
493
509
val = this . authUser . type === 'microsoft' ? 'msa' : 'mojang'
494
510
break
495
511
case 'version_type' :
496
- val = this . versionData . type
512
+ val = this . vanillaManifest . type
497
513
break
498
514
case 'resolution_width' :
499
515
val = ConfigManager . getGameWidth ( )
@@ -522,25 +538,11 @@ class ProcessBuilder {
522
538
}
523
539
524
540
// Autoconnect
525
- let isAutoconnectBroken
526
- try {
527
- isAutoconnectBroken = ProcessBuilder . isAutoconnectBroken ( this . forgeData . id . split ( '-' ) [ 2 ] )
528
- } catch ( err ) {
529
- logger . error ( err )
530
- logger . error ( 'Forge version format changed.. assuming autoconnect works.' )
531
- logger . debug ( 'Forge version:' , this . forgeData . id )
532
- }
533
-
534
- if ( isAutoconnectBroken ) {
535
- logger . error ( 'Server autoconnect disabled on Forge 1.15.2 for builds earlier than 31.2.15 due to OpenGL Stack Overflow issue.' )
536
- logger . error ( 'Please upgrade your Forge version to at least 31.2.15!' )
537
- } else {
538
- this . _processAutoConnectArg ( args )
539
- }
541
+ this . _processAutoConnectArg ( args )
540
542
541
543
542
544
// Forge Specific Arguments
543
- args = args . concat ( this . forgeData . arguments . game )
545
+ args = args . concat ( this . modManifest . arguments . game )
544
546
545
547
// Filter null values
546
548
args = args . filter ( arg => {
@@ -556,7 +558,7 @@ class ProcessBuilder {
556
558
* @returns {Array.<string> } An array containing the arguments required by forge.
557
559
*/
558
560
_resolveForgeArgs ( ) {
559
- const mcArgs = this . forgeData . minecraftArguments . split ( ' ' )
561
+ const mcArgs = this . modManifest . minecraftArguments . split ( ' ' )
560
562
const argDiscovery = / \$ { * ( .* ) } /
561
563
562
564
// Replace the declared variables with their proper values.
@@ -569,7 +571,7 @@ class ProcessBuilder {
569
571
val = this . authUser . displayName . trim ( )
570
572
break
571
573
case 'version_name' :
572
- //val = versionData .id
574
+ //val = vanillaManifest .id
573
575
val = this . server . rawServer . id
574
576
break
575
577
case 'game_directory' :
@@ -579,7 +581,7 @@ class ProcessBuilder {
579
581
val = path . join ( this . commonDir , 'assets' )
580
582
break
581
583
case 'assets_index_name' :
582
- val = this . versionData . assets
584
+ val = this . vanillaManifest . assets
583
585
break
584
586
case 'auth_uuid' :
585
587
val = this . authUser . uuid . trim ( )
@@ -594,7 +596,7 @@ class ProcessBuilder {
594
596
val = '{}'
595
597
break
596
598
case 'version_type' :
597
- val = this . versionData . type
599
+ val = this . vanillaManifest . type
598
600
break
599
601
}
600
602
if ( val != null ) {
@@ -669,10 +671,10 @@ class ProcessBuilder {
669
671
classpathArg ( mods , tempNativePath ) {
670
672
let cpArgs = [ ]
671
673
672
- if ( ! mcVersionAtLeast ( '1.17' , this . server . rawServer . minecraftVersion ) ) {
674
+ if ( ! mcVersionAtLeast ( '1.17' , this . server . rawServer . minecraftVersion ) || this . usingFabricLoader ) {
673
675
// Add the version.jar to the classpath.
674
676
// Must not be added to the classpath for Forge 1.17+.
675
- const version = this . versionData . id
677
+ const version = this . vanillaManifest . id
676
678
cpArgs . push ( path . join ( this . commonDir , 'versions' , version , version + '.jar' ) )
677
679
}
678
680
@@ -711,7 +713,7 @@ class ProcessBuilder {
711
713
const nativesRegex = / .+ : n a t i v e s - ( [ ^ - ] + ) (?: - ( .+ ) ) ? /
712
714
const libs = { }
713
715
714
- const libArr = this . versionData . libraries
716
+ const libArr = this . vanillaManifest . libraries
715
717
fs . ensureDirSync ( tempNativePath )
716
718
for ( let i = 0 ; i < libArr . length ; i ++ ) {
717
719
const lib = libArr [ i ]
@@ -830,10 +832,10 @@ class ProcessBuilder {
830
832
const mdls = this . server . modules
831
833
let libs = { }
832
834
833
- // Locate Forge/Libraries
835
+ // Locate Forge/Fabric/ Libraries
834
836
for ( let mdl of mdls ) {
835
837
const type = mdl . rawModule . type
836
- if ( type === Type . ForgeHosted || type === Type . Library ) {
838
+ if ( type === Type . ForgeHosted || type === Type . Fabric || type === Type . Library ) {
837
839
libs [ mdl . getVersionlessMavenIdentifier ( ) ] = mdl . getPath ( )
838
840
if ( mdl . subModules . length > 0 ) {
839
841
const res = this . _resolveModuleLibraries ( mdl )
@@ -887,24 +889,6 @@ class ProcessBuilder {
887
889
return libs
888
890
}
889
891
890
- static isAutoconnectBroken ( forgeVersion ) {
891
-
892
- const minWorking = [ 31 , 2 , 15 ]
893
- const verSplit = forgeVersion . split ( '.' ) . map ( v => Number ( v ) )
894
-
895
- if ( verSplit [ 0 ] === 31 ) {
896
- for ( let i = 0 ; i < minWorking . length ; i ++ ) {
897
- if ( verSplit [ i ] > minWorking [ i ] ) {
898
- return false
899
- } else if ( verSplit [ i ] < minWorking [ i ] ) {
900
- return true
901
- }
902
- }
903
- }
904
-
905
- return false
906
- }
907
-
908
892
}
909
893
910
894
module . exports = ProcessBuilder
0 commit comments