diff --git a/app/assets/js/processbuilder.js b/app/assets/js/processbuilder.js index 18c48fb5..e02a90c8 100644 --- a/app/assets/js/processbuilder.js +++ b/app/assets/js/processbuilder.js @@ -28,6 +28,7 @@ class ProcessBuilder { this.libPath = path.join(this.commonDir, 'libraries') this.usingLiteLoader = false + this.usingFabricLoader = false this.llPath = null } @@ -40,9 +41,12 @@ class ProcessBuilder { process.throwDeprecation = true this.setupLiteLoader() logger.info('Using liteloader:', this.usingLiteLoader) + this.usingFabricLoader = this.server.modules.some(mdl => mdl.rawModule.type === Type.Fabric) + logger.info('Using fabric loader:', this.usingFabricLoader) const modObj = this.resolveModConfiguration(ConfigManager.getModConfiguration(this.server.rawServer.id).mods, this.server.modules) // Mod list below 1.13 + // Fabric only supports 1.14+ if(!mcVersionAtLeast('1.13', this.server.rawServer.minecraftVersion)){ this.constructJSONModList('forge', modObj.fMods, true) if(this.usingLiteLoader){ @@ -166,7 +170,7 @@ class ProcessBuilder { for(let mdl of mdls){ const type = mdl.rawModule.type - if(type === Type.ForgeMod || type === Type.LiteMod || type === Type.LiteLoader){ + if(type === Type.ForgeMod || type === Type.LiteMod || type === Type.LiteLoader || type === Type.FabricMod){ const o = !mdl.getRequired().value const e = ProcessBuilder.isModEnabled(modCfg[mdl.getVersionlessMavenIdentifier()], mdl.getRequired()) if(!o || (o && e)){ @@ -178,7 +182,7 @@ class ProcessBuilder { continue } } - if(type === Type.ForgeMod){ + if(type === Type.ForgeMod || type === Type.FabricMod){ fMods.push(mdl) } else { lMods.push(mdl) @@ -282,18 +286,21 @@ class ProcessBuilder { // } /** - * Construct the mod argument list for forge 1.13 + * Construct the mod argument list for forge 1.13 and Fabric * * @param {Array.} mods An array of mods to add to the mod list. */ constructModList(mods) { const writeBuffer = mods.map(mod => { - return mod.getExtensionlessMavenIdentifier() + return this.usingFabricLoader ? mod.getPath() : mod.getExtensionlessMavenIdentifier() }).join('\n') if(writeBuffer) { fs.writeFileSync(this.forgeModListFile, writeBuffer, 'UTF-8') - return [ + return this.usingFabricLoader ? [ + '--fabric.addMods', + `@${this.forgeModListFile}` + ] : [ '--fml.mavenRoots', path.join('..', '..', 'common', 'modstore'), '--fml.modLists', @@ -669,7 +676,7 @@ class ProcessBuilder { classpathArg(mods, tempNativePath){ let cpArgs = [] - if(!mcVersionAtLeast('1.17', this.server.rawServer.minecraftVersion)) { + if(!mcVersionAtLeast('1.17', this.server.rawServer.minecraftVersion) || this.usingFabricLoader) { // Add the version.jar to the classpath. // Must not be added to the classpath for Forge 1.17+. const version = this.versionData.id @@ -830,10 +837,10 @@ class ProcessBuilder { const mdls = this.server.modules let libs = {} - // Locate Forge/Libraries + // Locate Forge/Fabric/Libraries for(let mdl of mdls){ const type = mdl.rawModule.type - if(type === Type.ForgeHosted || type === Type.Library){ + if(type === Type.ForgeHosted || type === Type.Fabric || type === Type.Library){ libs[mdl.getVersionlessMavenIdentifier()] = mdl.getPath() if(mdl.subModules.length > 0){ const res = this._resolveModuleLibraries(mdl) diff --git a/app/assets/js/scripts/landing.js b/app/assets/js/scripts/landing.js index 1c73e044..1a1c1768 100644 --- a/app/assets/js/scripts/landing.js +++ b/app/assets/js/scripts/landing.js @@ -442,7 +442,7 @@ let hasRPC = false // Joined server regex // Change this if your server uses something different. const GAME_JOINED_REGEX = /\[.+\]: Sound engine started/ -const GAME_LAUNCH_REGEX = /^\[.+\]: (?:MinecraftForge .+ Initialized|ModLauncher .+ starting: .+)$/ +const GAME_LAUNCH_REGEX = /^\[.+\]: (?:MinecraftForge .+ Initialized|ModLauncher .+ starting: .+|Loading Minecraft .+ with Fabric Loader .+)$/ const MIN_LINGER = 5000 async function dlAsync(login = true) { @@ -548,13 +548,13 @@ async function dlAsync(login = true) { serv.rawServer.id ) - const forgeData = await distributionIndexProcessor.loadForgeVersionJson(serv) + const modLoaderData = await distributionIndexProcessor.loadModLoaderVersionJson(serv) const versionData = await mojangIndexProcessor.getVersionJson() if(login) { const authUser = ConfigManager.getSelectedAccount() loggerLaunchSuite.info(`Sending selected account (${authUser.displayName}) to ProcessBuilder.`) - let pb = new ProcessBuilder(serv, versionData, forgeData, authUser, remote.app.getVersion()) + let pb = new ProcessBuilder(serv, versionData, modLoaderData, authUser, remote.app.getVersion()) setLaunchDetails(Lang.queryJS('landing.dlAsync.launchingGame')) // const SERVER_JOINED_REGEX = /\[.+\]: \[CHAT\] [a-zA-Z0-9_]{1,16} joined the game/ diff --git a/app/assets/js/scripts/settings.js b/app/assets/js/scripts/settings.js index 628c63ce..81a65a70 100644 --- a/app/assets/js/scripts/settings.js +++ b/app/assets/js/scripts/settings.js @@ -736,7 +736,7 @@ function parseModulesForUI(mdls, submodules, servConf){ for(const mdl of mdls){ - if(mdl.rawModule.type === Type.ForgeMod || mdl.rawModule.type === Type.LiteMod || mdl.rawModule.type === Type.LiteLoader){ + if(mdl.rawModule.type === Type.ForgeMod || mdl.rawModule.type === Type.LiteMod || mdl.rawModule.type === Type.LiteLoader || mdl.rawModule.type === Type.FabricMod){ if(mdl.getRequired().value){ diff --git a/app/assets/js/scripts/uibinder.js b/app/assets/js/scripts/uibinder.js index 469f49fd..5fe79df5 100644 --- a/app/assets/js/scripts/uibinder.js +++ b/app/assets/js/scripts/uibinder.js @@ -163,7 +163,7 @@ function syncModConfigurations(data){ for(let mdl of mdls){ const type = mdl.rawModule.type - if(type === Type.ForgeMod || type === Type.LiteMod || type === Type.LiteLoader){ + if(type === Type.ForgeMod || type === Type.LiteMod || type === Type.LiteLoader || type === Type.FabricMod){ if(!mdl.getRequired().value){ const mdlID = mdl.getVersionlessMavenIdentifier() if(modsOld[mdlID] == null){ @@ -198,7 +198,7 @@ function syncModConfigurations(data){ for(let mdl of mdls){ const type = mdl.rawModule.type - if(type === Type.ForgeMod || type === Type.LiteMod || type === Type.LiteLoader){ + if(type === Type.ForgeMod || type === Type.LiteMod || type === Type.LiteLoader || type === Type.FabricMod){ if(!mdl.getRequired().value){ mods[mdl.getVersionlessMavenIdentifier()] = scanOptionalSubModules(mdl.subModules, mdl) } else { @@ -253,7 +253,7 @@ function scanOptionalSubModules(mdls, origin){ for(let mdl of mdls){ const type = mdl.rawModule.type // Optional types. - if(type === Type.ForgeMod || type === Type.LiteMod || type === Type.LiteLoader){ + if(type === Type.ForgeMod || type === Type.LiteMod || type === Type.LiteLoader || type === Type.FabricMod){ // It is optional. if(!mdl.getRequired().value){ mods[mdl.getVersionlessMavenIdentifier()] = scanOptionalSubModules(mdl.subModules, mdl)