add neoforge modpacks support
This commit is contained in:
@ -1,9 +1,4 @@
|
||||
import {
|
||||
Box,
|
||||
Typography,
|
||||
Button,
|
||||
LinearProgress,
|
||||
} from '@mui/material';
|
||||
import { Box, Typography, Button, LinearProgress } from '@mui/material';
|
||||
import { useEffect, useState } from 'react';
|
||||
import { useNavigate, useParams } from 'react-router-dom';
|
||||
import ServerStatus from '../components/ServerStatus/ServerStatus';
|
||||
@ -13,7 +8,10 @@ import React from 'react';
|
||||
import SettingsModal from '../components/Settings/SettingsModal';
|
||||
import CustomNotification from '../components/Notifications/CustomNotification';
|
||||
import type { NotificationPosition } from '../components/Notifications/CustomNotification';
|
||||
import { isNotificationsEnabled, getNotifPositionFromSettings } from '../utils/notifications';
|
||||
import {
|
||||
isNotificationsEnabled,
|
||||
getNotifPositionFromSettings,
|
||||
} from '../utils/notifications';
|
||||
|
||||
declare global {
|
||||
interface Window {
|
||||
@ -31,7 +29,6 @@ declare global {
|
||||
interface LaunchPageProps {
|
||||
onLaunchPage?: () => void;
|
||||
launchOptions?: {
|
||||
// Делаем опциональным
|
||||
downloadUrl: string;
|
||||
apiReleaseUrl: string;
|
||||
versionFileName: string;
|
||||
@ -40,6 +37,8 @@ interface LaunchPageProps {
|
||||
baseVersion: string;
|
||||
serverIp: string;
|
||||
fabricVersion: string;
|
||||
neoForgeVersion?: string;
|
||||
loaderType?: string;
|
||||
};
|
||||
}
|
||||
|
||||
@ -50,6 +49,7 @@ const LaunchPage = ({
|
||||
const navigate = useNavigate();
|
||||
const { versionId } = useParams();
|
||||
const [versionConfig, setVersionConfig] = useState<any>(null);
|
||||
const [fullVersionConfig, setFullVersionConfig] = useState<any>(null); // Полная конфигурация из Gist
|
||||
|
||||
// Начальное состояние должно быть пустым или с минимальными значениями
|
||||
const [config, setConfig] = useState<{
|
||||
@ -161,6 +161,29 @@ const LaunchPage = ({
|
||||
};
|
||||
}, [navigate]);
|
||||
|
||||
// Функция для загрузки полной конфигурации версии из Gist
|
||||
const fetchFullVersionConfig = async (): Promise<any> => {
|
||||
if (!versionId) return null;
|
||||
|
||||
try {
|
||||
// Загружаем весь список версий из Gist
|
||||
const result = await window.electron.ipcRenderer.invoke(
|
||||
'get-available-versions',
|
||||
{},
|
||||
);
|
||||
|
||||
if (result.success && result.versions) {
|
||||
// Находим нужную версию по ID
|
||||
const version = result.versions.find((v: any) => v.id === versionId);
|
||||
return version || null;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Ошибка при загрузке полной конфигурации:', error);
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
const fetchVersionConfig = async () => {
|
||||
if (!versionId) return;
|
||||
@ -174,6 +197,7 @@ const LaunchPage = ({
|
||||
// Если конфиг пустой — считаем, что он невалидный и идём по IPC-ветке
|
||||
if (Object.keys(parsedConfig).length > 0) {
|
||||
setVersionConfig(parsedConfig);
|
||||
setFullVersionConfig(parsedConfig);
|
||||
|
||||
setConfig({
|
||||
memory: parsedConfig.memory || 4096,
|
||||
@ -187,36 +211,50 @@ const LaunchPage = ({
|
||||
}
|
||||
}
|
||||
|
||||
// Если нет в localStorage, запрашиваем с сервера
|
||||
const result = await window.electron.ipcRenderer.invoke(
|
||||
'get-version-config',
|
||||
{ versionId },
|
||||
);
|
||||
// Загружаем полную конфигурацию из Gist
|
||||
const fullConfig = await fetchFullVersionConfig();
|
||||
if (fullConfig) {
|
||||
setFullVersionConfig(fullConfig);
|
||||
|
||||
// Сохраняем только config часть для совместимости
|
||||
setVersionConfig(fullConfig.config || {});
|
||||
|
||||
if (result.success) {
|
||||
setVersionConfig(result.config);
|
||||
setConfig({
|
||||
memory: result.config.memory || 4096,
|
||||
preserveFiles: result.config.preserveFiles || [],
|
||||
memory: fullConfig.config?.memory || 4096,
|
||||
preserveFiles: fullConfig.config?.preserveFiles || [],
|
||||
});
|
||||
} else {
|
||||
// Если не удалось получить конфигурацию, используем значения по умолчанию
|
||||
const defaultConfig = {
|
||||
downloadUrl: '',
|
||||
apiReleaseUrl: '',
|
||||
versionFileName: `${versionId}_version.txt`,
|
||||
packName: versionId || 'Comfort',
|
||||
memory: 4096,
|
||||
baseVersion: '1.21.4',
|
||||
serverIp: 'popa-popa.ru',
|
||||
fabricVersion: '0.16.14',
|
||||
preserveFiles: ['popa-launcher-config.json'],
|
||||
};
|
||||
setVersionConfig(defaultConfig);
|
||||
setConfig({
|
||||
memory: defaultConfig.memory,
|
||||
preserveFiles: defaultConfig.preserveFiles || [],
|
||||
});
|
||||
// Если не удалось получить конфигурацию из Gist, используем IPC
|
||||
const result = await window.electron.ipcRenderer.invoke(
|
||||
'get-version-config',
|
||||
{ versionId },
|
||||
);
|
||||
|
||||
if (result.success) {
|
||||
setVersionConfig(result.config);
|
||||
setConfig({
|
||||
memory: result.config.memory || 4096,
|
||||
preserveFiles: result.config.preserveFiles || [],
|
||||
});
|
||||
} else {
|
||||
// Если не удалось получить конфигурацию, используем значения по умолчанию
|
||||
const defaultConfig = {
|
||||
downloadUrl: '',
|
||||
apiReleaseUrl: '',
|
||||
versionFileName: `${versionId}_version.txt`,
|
||||
packName: versionId || 'Comfort',
|
||||
memory: 4096,
|
||||
baseVersion: '1.21.4',
|
||||
serverIp: 'popa-popa.ru',
|
||||
fabricVersion: '0.16.14',
|
||||
preserveFiles: ['popa-launcher-config.json'],
|
||||
};
|
||||
setVersionConfig(defaultConfig);
|
||||
setConfig({
|
||||
memory: defaultConfig.memory,
|
||||
preserveFiles: defaultConfig.preserveFiles || [],
|
||||
});
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Ошибка при получении настроек версии:', error);
|
||||
@ -266,15 +304,30 @@ const LaunchPage = ({
|
||||
return;
|
||||
}
|
||||
|
||||
// Используем настройки выбранной версии или дефолтные
|
||||
const currentConfig = versionConfig || {
|
||||
packName: versionId || 'Comfort',
|
||||
memory: 4096,
|
||||
baseVersion: '1.21.4',
|
||||
serverIp: 'popa-popa.ru',
|
||||
fabricVersion: '0.16.14',
|
||||
preserveFiles: [],
|
||||
};
|
||||
// Загружаем полную конфигурацию, если еще не загружена
|
||||
if (!fullVersionConfig) {
|
||||
const loadedConfig = await fetchFullVersionConfig();
|
||||
if (loadedConfig) {
|
||||
setFullVersionConfig(loadedConfig);
|
||||
setVersionConfig(loadedConfig.config || {});
|
||||
}
|
||||
}
|
||||
|
||||
// Используем настройки из Gist или дефолтные
|
||||
const currentConfig = fullVersionConfig?.config ||
|
||||
versionConfig || {
|
||||
packName: versionId || 'Comfort',
|
||||
memory: 4096,
|
||||
baseVersion: '1.21.4',
|
||||
serverIp: 'popa-popa.ru',
|
||||
fabricVersion: '0.16.14',
|
||||
neoForgeVersion: null,
|
||||
loaderType: 'fabric',
|
||||
preserveFiles: [],
|
||||
};
|
||||
|
||||
// Получаем версию для запуска из Gist (например, "1.21.1-neoforge21.1.215")
|
||||
const versionFromGist = fullVersionConfig?.version || null;
|
||||
|
||||
// Проверяем, является ли это ванильной версией
|
||||
const isVanillaVersion =
|
||||
@ -318,7 +371,8 @@ const LaunchPage = ({
|
||||
localStorage.getItem('launcher_config') || '{}',
|
||||
);
|
||||
|
||||
const options = {
|
||||
// Формируем полные опции для запуска
|
||||
const options: any = {
|
||||
accessToken: savedConfig.accessToken,
|
||||
uuid: savedConfig.uuid,
|
||||
username: savedConfig.username,
|
||||
@ -327,22 +381,27 @@ const LaunchPage = ({
|
||||
packName: versionId || currentConfig.packName,
|
||||
serverIp: currentConfig.serverIp,
|
||||
fabricVersion: currentConfig.fabricVersion,
|
||||
// Для ванильной версии устанавливаем флаг
|
||||
neoForgeVersion: currentConfig.neoForgeVersion,
|
||||
loaderType: currentConfig.loaderType || 'fabric',
|
||||
isVanillaVersion: isVanillaVersion,
|
||||
versionToLaunchOverride: isVanillaVersion ? versionId : undefined,
|
||||
versionToLaunchOverride:
|
||||
versionFromGist || (isVanillaVersion ? versionId : undefined),
|
||||
// Передаем Gist URL для загрузки конфигурации в процессе запуска
|
||||
gistUrl:
|
||||
'https://gist.githubusercontent.com/DIKER0K/06cd12fb3a4d08b1f0f8c763a7d05e06/raw/versions.json',
|
||||
};
|
||||
|
||||
const launchContext = {
|
||||
versionId,
|
||||
packName: versionId || currentConfig.packName,
|
||||
|
||||
baseVersion: currentConfig.baseVersion,
|
||||
fabricVersion: currentConfig.fabricVersion,
|
||||
neoForgeVersion: currentConfig.neoForgeVersion,
|
||||
loaderType: currentConfig.loaderType,
|
||||
serverIp: currentConfig.serverIp,
|
||||
|
||||
isVanillaVersion,
|
||||
versionToLaunchOverride: isVanillaVersion ? versionId : undefined,
|
||||
|
||||
versionToLaunchOverride:
|
||||
versionFromGist || (isVanillaVersion ? versionId : undefined),
|
||||
memory: config.memory,
|
||||
};
|
||||
|
||||
@ -358,8 +417,10 @@ const LaunchPage = ({
|
||||
|
||||
if (launchResult?.success) {
|
||||
showNotification('Minecraft успешно запущен!', 'success');
|
||||
} else if (launchResult?.error) {
|
||||
showNotification(`Ошибка запуска: ${launchResult.error}`, 'error');
|
||||
}
|
||||
} catch (error) {
|
||||
} catch (error: any) {
|
||||
console.error('Error:', error);
|
||||
showNotification(`Ошибка: ${error.message}`, 'error');
|
||||
} finally {
|
||||
@ -408,9 +469,6 @@ const LaunchPage = ({
|
||||
config: configToSave,
|
||||
});
|
||||
|
||||
// Обновляем launchOptions
|
||||
launchOptions.memory = config.memory;
|
||||
|
||||
showNotification('Настройки сохранены', 'success');
|
||||
} catch (error) {
|
||||
console.error('Ошибка при сохранении настроек:', error);
|
||||
|
||||
Reference in New Issue
Block a user