#include "mainwindow.h" #include "ui_mainwindow.h" // Подключаем сгенерированный заголовочный файл #include "settingsdialog.h" #include #include #include #include #include // Для диалога выбора #include // Для проверки файла MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) // Инициализируем указатель на UI { ui->setupUi(this); // Загружаем интерфейс из .ui файла // Начальная настройка виджетов ui->progressBar->setRange(0, 0); // Неопределенный прогресс-бар ui->progressBar->setVisible(false); // Инициализация логики settings = new QSettings("GaleonDev", "MinecraftLauncher", this); process = new QProcess(this); // Подключаем сигналы от процесса (это делается вручную) connect(process, &QProcess::readyReadStandardOutput, this, &MainWindow::readProcessOutput); connect(process, &QProcess::readyReadStandardError, this, &MainWindow::readProcessOutput); connect(process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(onProcessFinished(int, QProcess::ExitStatus))); connect(process, SIGNAL(errorOccurred(QProcess::ProcessError)), this, SLOT(onProcessError(QProcess::ProcessError))); } MainWindow::~MainWindow() { delete ui; // Освобождаем память от объекта UI } void MainWindow::on_launchButton_clicked() { QString minecraftPath = getMinecraftPath(); if (minecraftPath.isEmpty()) { QMessageBox::warning(this, "Ошибка", "Не удалось найти директорию .minecraft."); return; } // 1. Находим папку с версиями QString versionsPath = minecraftPath + "/versions"; QDir versionsDir(versionsPath); if (!versionsDir.exists()) { QMessageBox::warning(this, "Ошибка", "Папка 'versions' не найдена!"); return; } // 2. Получаем список всех папок внутри 'versions' (это и есть наши версии) QStringList versionList = versionsDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot); if (versionList.isEmpty()) { QMessageBox::warning(this, "Ошибка", "Не найдено ни одной установленной версии Minecraft."); return; } // 3. Предлагаем пользователю выбрать версию bool ok; QString selectedVersion = QInputDialog::getItem(this, "Выбор версии", "Выберите версию Minecraft для запуска:", versionList, 0, false, &ok); // 4. Если пользователь сделал выбор (нажал "OK" и версия не пустая) if (ok && !selectedVersion.isEmpty()) { // Формируем путь к .jar файлу. Например: /.minecraft/versions/1.19.2/1.19.2.jar QString jarPath = versionsPath + "/" + selectedVersion + "/" + selectedVersion + ".jar"; // Проверяем, что .jar файл действительно существует QFileInfo jarFile(jarPath); if (!jarFile.exists() || !jarFile.isFile()) { QMessageBox::critical(this, "Ошибка запуска", "Не удалось найти запускаемый .jar файл для версии " + selectedVersion + ".\n" "Проверьте целостность файлов игры.\n" "Ожидаемый путь: " + jarPath); return; } // 5. Запускаем игру QString javaPath = "java"; // Java должна быть в системной переменной PATH QStringList arguments; arguments << "-jar" << jarPath << "net.fabricmc.loader.impl.launch.knot.KnotClient"; ui->logOutput->appendPlainText("Запуск Minecraft версии: " + selectedVersion); process->start(javaPath, arguments); ui->progressBar->setVisible(true); } } void MainWindow::on_modsFolderButton_clicked() { QString minecraftPath = getMinecraftPath(); if (minecraftPath.isEmpty()) { QMessageBox::warning(this, "Ошибка", "Не удалось найти директорию .minecraft."); return; } QString modsPath = minecraftPath + "/mods"; QDesktopServices::openUrl(QUrl::fromLocalFile(modsPath)); } void MainWindow::on_settingsButton_clicked() { SettingsDialog dialog(this); dialog.exec(); } void MainWindow::on_updateModsButton_clicked() { QString gitRepoUrl = settings->value("gitRepoUrl").toString(); if (gitRepoUrl.isEmpty()) { QMessageBox::information(this, "Настройки", "Пожалуйста, укажите URL Git-репозитория в настройках."); return; } QString minecraftPath = getMinecraftPath(); if (minecraftPath.isEmpty()) { QMessageBox::warning(this, "Ошибка", "Не удалось найти директорию .minecraft."); return; } QString modsPath = minecraftPath + "/mods"; QDir modsDir(modsPath); if (!modsDir.exists(".git")) { ui->logOutput->appendPlainText("Клонирование модов из " + gitRepoUrl); process->start("git", QStringList() << "clone" << gitRepoUrl << modsPath); } else { ui->logOutput->appendPlainText("Обновление модов..."); process->setWorkingDirectory(modsPath); process->start("git", QStringList() << "pull"); } ui->progressBar->setVisible(true); } void MainWindow::onProcessFinished(int exitCode, QProcess::ExitStatus exitStatus) { ui->progressBar->setVisible(false); if (exitStatus == QProcess::CrashExit) { ui->logOutput->appendPlainText("Процесс завершился с ошибкой."); } else { ui->logOutput->appendPlainText("Процесс успешно завершен с кодом " + QString::number(exitCode)); } } void MainWindow::onProcessError(QProcess::ProcessError error) { ui->progressBar->setVisible(false); ui->logOutput->appendPlainText("Ошибка запуска процесса: " + process->errorString()); } void MainWindow::readProcessOutput() { ui->logOutput->appendPlainText(process->readAllStandardOutput()); ui->logOutput->appendPlainText(process->readAllStandardError()); } QString MainWindow::getMinecraftPath() { QString path; #if defined(Q_OS_WIN) path = QDir::homePath() + "/AppData/Roaming/.minecraft"; #elif defined(Q_OS_MAC) path = QDir::homePath() + "/Library/Application Support/minecraft"; #else path = QDir::homePath() + "/.minecraft"; #endif return path; }