diff --git a/launcher/app/assets/js/processbuilder.js b/launcher/app/assets/js/processbuilder.js index 948400a..79a0225 100644 --- a/launcher/app/assets/js/processbuilder.js +++ b/launcher/app/assets/js/processbuilder.js @@ -12,6 +12,44 @@ const ConfigManager = require('./configmanager') const logger = LoggerUtil.getLogger('ProcessBuilder') +/** + * SurviePote : dossiers système contenant libGL/libEGL/libvulkan (dispatch + drivers). + * Nécessaire là où dlopen ne les voit pas (ex: NixOS hors wrapper, LD_LIBRARY_PATH vide). + * Ne retourne que des dossiers existants. Ordre : dispatch d'abord, drivers ensuite. + * + * @returns {Array.} Dossiers à ajouter à LD_LIBRARY_PATH pour le jeu. + */ +function resolveSystemGLDirs(){ + const dirs = [] + const candidates = [ + '/run/opengl-driver/lib', + '/run/opengl-driver-32/lib', + '/usr/lib/x86_64-linux-gnu', + '/usr/lib64', + '/usr/lib' + ] + for(const dir of candidates){ + try { + if(fs.existsSync(dir) && !dirs.includes(dir)){ + dirs.push(dir) + } + } catch(_err) { /* ignore */ } + } + // NixOS : libglvnd (dispatch libGL/libEGL) + vulkan-loader dans le store. + try { + const store = fs.readdirSync('/nix/store') + for(const entry of store){ + if(entry.includes('libglvnd') || entry.includes('vulkan-loader')){ + const lib = path.join('/nix/store', entry, 'lib') + if(fs.existsSync(lib) && !dirs.includes(lib)){ + dirs.push(lib) + } + } + } + } catch(_err) { /* pas NixOS, ignore */ } + return dirs +} + /** * Only forge and fabric are top level mod loaders. @@ -77,9 +115,23 @@ class ProcessBuilder { logger.info('Launch Arguments:', loggableArgs) + // SurviePote : sur NixOS, libGL/libEGL/libvulkan (dispatch + drivers Mesa) ne sont PAS + // dans les chemins système vus par dlopen (LD_LIBRARY_PATH vide hors wrapper nix). + // Sans ça : "[LWJGL] libGL.so.1 not found in system paths" -> crash "no OpenGL context API". + const gameEnv = { ...process.env } + if(process.platform === 'linux'){ + const glDirs = resolveSystemGLDirs() + if(glDirs.length > 0){ + const prev = gameEnv.LD_LIBRARY_PATH ? gameEnv.LD_LIBRARY_PATH + ':' : '' + gameEnv.LD_LIBRARY_PATH = prev + glDirs.join(':') + logger.info('Prepended GL driver dirs to LD_LIBRARY_PATH:', glDirs.join(':')) + } + } + const child = child_process.spawn(ConfigManager.getJavaExecutable(this.server.rawServer.id), args, { cwd: this.gameDir, - detached: ConfigManager.getLaunchDetached() + detached: ConfigManager.getLaunchDetached(), + env: gameEnv }) if(ConfigManager.getLaunchDetached()){