#pragma once #include "minecraftversion.h" #include #include class QProcess; // Всё, что лаунчер знает к моменту нажатия PLAY. struct LaunchOptions { QString gameDir; // .minecraft QString versionId; // Папка в versions QString playerName; QString uuid; QString accessToken; QString userType; QString clientToken; QString xuid; // Пусто — подставится "0", как в офлайне QString javaPath; // Пусто — ищем сами int minMemoryMb = 512; int maxMemoryMb = 4096; QStringList extraJvmArgs; int windowWidth = 0; // 0 — не передавать --width/--height int windowHeight = 0; bool fullscreen = false; QString serverAddress; // host[:port] — автозаход на сервер QString authlibInjectorPath; // Пусто — не подключаем QString authlibInjectorApi = QStringLiteral("ely.by"); QString launcherName = QStringLiteral("KishkaLauncher"); QString launcherVersion = QStringLiteral("1.0"); }; // Готовит и запускает JVM. Один экземпляр — одна игра одновременно. class GameLauncher : public QObject { Q_OBJECT public: explicit GameLauncher(QObject *parent = nullptr); bool isRunning() const; // Проверяет .minecraft на комплектность. Пустой список — всё на месте. // Возвращает описания недостающих файлов, но не больше limit штук. static QStringList missingFiles(const LaunchOptions &options, const MinecraftVersion &version, int limit = 12); // Собирает аргументы ровно в том порядке, в котором их ждёт JVM: // <аргументы игры>. static QStringList buildArguments(const LaunchOptions &options, const MinecraftVersion &version, const QString &nativesDir); // Распаковывает .dll/.so/.dylib из натив-библиотек в <версия>/natives. static bool extractNatives(const LaunchOptions &options, const MinecraftVersion &version, const QString &nativesDir, QString *error); // Полный цикл: проверка, натив-библиотеки, поиск java, старт процесса. bool launch(const LaunchOptions &options, const MinecraftVersion &version, QString *error); void terminate(); signals: void progress(const QString &message); void output(const QString &line); void gameStarted(const QString &commandLine); void gameFinished(int exitCode, bool crashed); private: QProcess *m_process = nullptr; };