UNPKG

adlauncher-core

Version:

Un módulo que permite la descarga y la ejecución de minecraft java con node.js

111 lines (91 loc) 3.65 kB
const { readFileSync } = require('node:fs'); const { basename, join, resolve } = require('node:path'); const { spawn } = require('node:child_process'); const { createProfile, authUser } = require('../Utils/auth.js'); const getJarFiles = require('../Utils/getJarFiles.js'); const argsResolver = require('../Utils/argsResolver.js'); const getVersion = require('../Utils/getVersion.js'); const getExtraLibs = require('../Utils/getExtraLibs.js'); const filterVersionLib = require('../Utils/filterVersionLib.js'); /** * * @param {Object} data Datos completos para jugar */ module.exports = async function launchMinecraft(data) { let { user, gameDirectory, version, type, java, usersConfig } = data; let [vanillaVersionFile, customVersionFile] = getVersion(version, gameDirectory); createProfile(gameDirectory); const userData = JSON.stringify(user); usersConfig = resolve(usersConfig || join(gameDirectory, 'usercache.json')); user = authUser({ user: userData, config: usersConfig }); // LIBRERIAS const libRoot = resolve(gameDirectory, 'libraries'); let libNecessary = vanillaVersionFile.libraries .filter( (lib) => lib.downloads.artifact && (!lib.rules || lib.rules.every( (rule) => rule.action === 'allow' && rule.os && rule.os.name === 'windows' ) || lib.rules.some((rule) => rule.action === 'disallow' && rule.os && rule.os.name === 'osx')) ) .map((lib) => basename(lib.downloads.artifact.path || lib.downloads.artifact.url)); if (type !== 'release' && type !== 'snapshot') { let customLibs; if (type === 'forge' || type === 'fabric' || type === 'optifine') { customLibs = customVersionFile.libraries .filter((dependency) => dependency.name) .map((customLib) => { const parts = customLib.name.split(':'); const [, name, version, api] = parts; if (api) { return `${name}-${version}-${api}.jar`; } else { return `${name}-${version}.jar`; } }); } else if (type === 'neoforge') { customLibs = customVersionFile.libraries .filter((dependency) => dependency.name) .map((customLib) => { const parts = customLib.name.split(':'); const [, name, version, api] = parts; if (api) { return `${name}-${version}-${api.replace('@', '.')}`; } else { return `${name}-${version.replace('@', '.')}`; } }); } libNecessary.push(...customLibs); } if (type === 'neoforge' || type === 'fabric') { libNecessary = filterVersionLib(libNecessary); } let { libraries, missingLibs } = await getJarFiles({ root: libRoot, libNecessary: libNecessary, }); if (missingLibs.length > 0) { const extraLibs = await getExtraLibs({ missingLibs, libRoot }); libraries += extraLibs; } data = JSON.stringify(data); let args = argsResolver({ user: user, libs: libraries, versionFile: vanillaVersionFile, data: data, customFile: customVersionFile, }); const spawnRoot = resolve(gameDirectory); if (!java) { java = 'java'; } console.log('Lanzando Minecraft version:', customVersionFile.id); console.log('Usando Java:', java); const minecraft = spawn(java, args, { cwd: spawnRoot }); minecraft.stdout.on('data', (data) => console.log('debug:', data.toString().trim())); minecraft.stderr.on('data', (data) => console.log('debug:', data.toString().trim())); };