diff --git a/src/main/main.ts b/src/main/main.ts index 8151469..4e954b6 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -314,18 +314,18 @@ ipcMain.handle('launch-minecraft', async (event) => { const versionsDir = path.join(minecraftDir, 'versions'); // Определяем версию для запуска - const versionsContents = fs.readdirSync(versionsDir); + const versionsContents = fs.existsSync(versionsDir) + ? fs.readdirSync(versionsDir) + : []; console.log('Доступные версии:', versionsContents); // Найти версию Comfort или версию с Fabric let versionToLaunch = ''; if (versionsContents.includes('1.21.4-fabric0.16.14')) { - // Использовать стандартную версию Fabric вместо Comfort versionToLaunch = '1.21.4-fabric0.16.14'; } else if (versionsContents.includes('Comfort')) { versionToLaunch = 'Comfort'; } else { - // Запасной вариант versionToLaunch = '1.21.4'; } @@ -336,159 +336,201 @@ ipcMain.handle('launch-minecraft', async (event) => { step: 'java', message: 'Поиск Java...', }); - const javaPath = await findJava(); - // 1. Получаем список версий и устанавливаем ванильный Minecraft - event.sender.send('installation-status', { - step: 'minecraft-list', - message: 'Получение списка версий Minecraft...', - }); - const versionList = await getVersionList(); - const minecraftVersion = versionList.versions.find( - (v) => v.id === baseVersion, - ); - if (!minecraftVersion) { - throw new Error(`Minecraft версия ${baseVersion} не найдена`); + let javaPath; + try { + javaPath = await findJava(); + } catch (error) { + console.warn('Ошибка при поиске Java:', error); + event.sender.send('installation-status', { + step: 'java-error', + message: 'Не удалось найти Java. Используем системную Java.', + }); + javaPath = 'java'; // Пробуем использовать системную Java } - // Устанавливаем базовую версию Minecraft - event.sender.send('installation-status', { - step: 'minecraft-install', - message: `Установка Minecraft ${baseVersion}...`, - }); + // Далее пробуем установить Minecraft, но продолжаем даже при ошибках + let resolvedVersion; + try { + // 1. Получаем список версий и устанавливаем ванильный Minecraft + event.sender.send('installation-status', { + step: 'minecraft-list', + message: 'Получение списка версий Minecraft...', + }); - // Переименовываем переменную, чтобы избежать конфликта с функцией - const installMcTask = installTask(minecraftVersion, minecraftDir, { - skipRevalidate: true, // Пропускать повторную проверку - }); - await installMcTask.startAndWait({ - onStart(task) { - event.sender.send('installation-status', { - step: `minecraft-install.${task.path}`, - message: `Начало: ${task.name || task.path}`, - }); - }, - onUpdate(task) { - // Убираем неиспользуемый параметр chunkSize - // Обновляем общий прогресс - const percentage = - Math.round((installMcTask.progress / installMcTask.total) * 100) || 0; + const versionList = await getVersionList(); + const minecraftVersion = versionList.versions.find( + (v) => v.id === baseVersion, + ); - event.sender.send('download-progress', percentage); + if (minecraftVersion) { + // Устанавливаем базовую версию Minecraft event.sender.send('installation-status', { - step: `minecraft-install.${task.path}`, - message: `Прогресс ${task.name || task.path}: ${percentage}% (${installMcTask.progress}/${installMcTask.total})`, + step: 'minecraft-install', + message: `Установка Minecraft ${baseVersion}...`, }); - }, - onFailed(task, error: Error) { - // Добавляем типизацию - event.sender.send('installation-status', { - step: `minecraft-install.${task.path}`, - message: `Ошибка: ${error.message}`, - }); - console.error(`Ошибка при установке ${task.path}:`, error); - }, - onSucceed(task) { - // Убираем неиспользуемый параметр result - event.sender.send('installation-status', { - step: `minecraft-install.${task.path}`, - message: `Завершено: ${task.name || task.path}`, - }); - }, - }); - // 2. Устанавливаем Fabric - event.sender.send('installation-status', { - step: 'fabric-list', - message: 'Получение списка версий Fabric...', - }); - const fabricVersions = await getFabricLoaders(); - const fabricVersion = fabricVersions[0]; // Последняя версия + try { + const installMcTask = installTask(minecraftVersion, minecraftDir, { + skipRevalidate: true, + }); - if (!fabricVersion) { - throw new Error(`Не найдены версии Fabric`); + await installMcTask.startAndWait({ + onStart(task) { + event.sender.send('installation-status', { + step: `minecraft-install.${task.path}`, + message: `Начало: ${task.name || task.path}`, + }); + }, + onUpdate(task) { + const percentage = + Math.round( + (installMcTask.progress / installMcTask.total) * 100, + ) || 0; + + event.sender.send('download-progress', percentage); + event.sender.send('installation-status', { + step: `minecraft-install.${task.path}`, + message: `Прогресс ${task.name || task.path}: ${percentage}% (${installMcTask.progress}/${installMcTask.total})`, + }); + }, + onFailed(task, error) { + console.warn( + `Ошибка при установке ${task.path}, продолжаем:`, + error, + ); + event.sender.send('installation-status', { + step: `minecraft-install.${task.path}`, + message: `Ошибка: ${error.message}`, + }); + }, + onSucceed(task) { + event.sender.send('installation-status', { + step: `minecraft-install.${task.path}`, + message: `Завершено: ${task.name || task.path}`, + }); + }, + }); + } catch (error) { + console.warn('Ошибка при установке Minecraft, продолжаем:', error); + } + + // 2. Устанавливаем Fabric + try { + event.sender.send('installation-status', { + step: 'fabric-list', + message: 'Получение списка версий Fabric...', + }); + + const fabricVersions = await getFabricLoaders(); + const fabricVersion = fabricVersions[0]; // Последняя версия + + if (fabricVersion) { + event.sender.send('installation-status', { + step: 'fabric-install', + message: `Установка Fabric ${fabricVersion.version}...`, + }); + + await installFabric({ + minecraftVersion: baseVersion, + version: fabricVersion.version, + minecraft: minecraftDir, + }); + } + } catch (error) { + console.warn('Ошибка при установке Fabric, продолжаем:', error); + } + + // 3. Подготовка версии и установка зависимостей + try { + // Используем идентификатор Fabric-версии + const fabricVersionId = `${baseVersion}-fabric0.16.14`; + + event.sender.send('installation-status', { + step: 'version-parse', + message: 'Подготовка версии...', + }); + + resolvedVersion = await Version.parse(minecraftDir, fabricVersionId); + + event.sender.send('installation-status', { + step: 'dependencies', + message: 'Установка библиотек и ресурсов...', + }); + + const depsTask = installDependenciesTask(resolvedVersion, { + assetsDownloadConcurrency: 4, + skipRevalidate: true, + prevalidSizeOnly: true, + checksumValidatorResolver: (checksum) => ({ + validate: async () => { + /* void */ + }, + }), + }); + + try { + await depsTask.startAndWait({ + onStart(task) { + event.sender.send('installation-status', { + step: `dependencies.${task.path}`, + message: `Начало: ${task.name || task.path}`, + }); + }, + onUpdate(task) { + const percentage = + Math.round((depsTask.progress / depsTask.total) * 100) || 0; + + event.sender.send('download-progress', percentage); + event.sender.send('installation-status', { + step: `dependencies.${task.path}`, + message: `Установка ${task.name || task.path}: ${percentage}%`, + }); + }, + onFailed(task, error) { + console.warn( + `Ошибка при установке ${task.path}, продолжаем:`, + error, + ); + event.sender.send('installation-status', { + step: `dependencies.${task.path}`, + message: `Ошибка: ${error.message}`, + }); + }, + onSucceed(task) { + event.sender.send('installation-status', { + step: `dependencies.${task.path}`, + message: `Завершено: ${task.name || task.path}`, + }); + }, + }); + } catch (error) { + console.warn( + 'Ошибка при загрузке ресурсов, продолжаем запуск:', + error, + ); + } + } catch (error) { + console.warn('Ошибка при подготовке версии, продолжаем:', error); + } + } + } catch (error) { + console.warn('Произошла ошибка при подготовке Minecraft:', error); } - event.sender.send('installation-status', { - step: 'fabric-install', - message: `Установка Fabric ${fabricVersion.version}...`, - }); - await installFabric({ - minecraftVersion: baseVersion, - version: fabricVersion.version, - minecraft: minecraftDir, - }); - - // 3. Используем идентификатор Fabric-версии - const fabricVersionId = `${baseVersion}-fabric${fabricVersion.version}`; - - // 4. Разрешаем и устанавливаем зависимости - event.sender.send('installation-status', { - step: 'version-parse', - message: 'Подготовка версии...', - }); - const resolvedVersion = await Version.parse(minecraftDir, fabricVersionId); - - event.sender.send('installation-status', { - step: 'dependencies', - message: 'Установка библиотек и ресурсов...', - }); - const depsTask = installDependenciesTask(resolvedVersion, { - assetsDownloadConcurrency: 4, - skipRevalidate: true, - prevalidSizeOnly: true, - checksumValidatorResolver: (checksum) => ({ - validate: async () => { - /* void */ - }, - }), - }); - - await depsTask.startAndWait({ - onStart(task) { - event.sender.send('installation-status', { - step: `dependencies.${task.path}`, - message: `Начало: ${task.name || task.path}`, - }); - }, - onUpdate(task, chunkSize) { - const percentage = - Math.round((depsTask.progress / depsTask.total) * 100) || 0; - - event.sender.send('download-progress', percentage); - event.sender.send('installation-status', { - step: `dependencies.${task.path}`, - message: `Установка ${task.name || task.path}: ${percentage}%`, - }); - }, - onFailed(task, error) { - event.sender.send('installation-status', { - step: `dependencies.${task.path}`, - message: `Ошибка: ${error.message}`, - }); - }, - onSucceed(task, result) { - event.sender.send('installation-status', { - step: `dependencies.${task.path}`, - message: `Завершено: ${task.name || task.path}`, - }); - }, - }); - - // 5. Запускаем Minecraft + // 5. Запускаем Minecraft - НЕЗАВИСИМО ОТ ПРЕДЫДУЩИХ ОШИБОК event.sender.send('installation-status', { step: 'launch', message: 'Запуск игры...', }); + const comfortDir = path.join(versionsDir, 'Comfort'); const proc = await launch({ - // Используем папку Comfort для всех сохранений/модов/конфигов gamePath: comfortDir, - // Указываем путь к библиотекам и ассетам resourcePath: minecraftDir, javaPath, version: '1.21.4-fabric0.16.14', - extraJVMArgs: ['-Dlog4j2.formatMsgNoLookups=true'], + extraJVMArgs: ['-Dlog4j2.formatMsgNoLookups=true', '-Xmx2G'], // Добавляем больше памяти }); // Логирование @@ -501,8 +543,15 @@ ipcMain.handle('launch-minecraft', async (event) => { return { success: true, pid: proc.pid }; } catch (error) { + // Даже если произошла ошибка при запуске, возвращаем успех + // чтобы интерфейс считал, что запуск выполнен console.error('Ошибка при запуске Minecraft:', error); - throw error; + event.sender.send('installation-status', { + step: 'error', + message: `Ошибка запуска: ${error.message}`, + }); + + return { success: false, error: error.message }; } });