171 lines
7.2 KiB
C++
171 lines
7.2 KiB
C++
|
|
#include "mainwindow.h"
|
|||
|
|
#include "ui_mainwindow.h" // Подключаем сгенерированный заголовочный файл
|
|||
|
|
#include "settingsdialog.h"
|
|||
|
|
|
|||
|
|
#include <QMessageBox>
|
|||
|
|
#include <QDesktopServices>
|
|||
|
|
#include <QUrl>
|
|||
|
|
#include <QDir>
|
|||
|
|
#include <QInputDialog> // Для диалога выбора
|
|||
|
|
#include <QFileInfo> // Для проверки файла
|
|||
|
|
|
|||
|
|
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;
|
|||
|
|
}
|