#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("BiLauncher"); QString launcherVersion = QStringLiteral("1.0"); }; class GameLauncher : public QObject { Q_OBJECT public: explicit GameLauncher(QObject *parent = nullptr); bool isRunning() const; static QStringList missingFiles(const LaunchOptions &options, const MinecraftVersion &version, int limit = 12); static QStringList buildArguments(const LaunchOptions &options, const MinecraftVersion &version, const QString &nativesDir); static bool extractNatives(const LaunchOptions &options, const MinecraftVersion &version, const QString &nativesDir, QString *error); 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; };