fix #23 by adding validating on first startup and close #30 by adding
tests / package-smoke-linux (push) Skipped
tests / package-smoke-windows (push) Skipped
tests / package-smoke-macos (push) Skipped
tests / macos (push) Successful in 1m20s
tests / linux (push) Successful in 2m14s
tests / windows (push) Failing after 23m21s
tests / package-smoke-linux (push) Skipped
tests / package-smoke-windows (push) Skipped
tests / package-smoke-macos (push) Skipped
tests / macos (push) Successful in 1m20s
tests / linux (push) Successful in 2m14s
tests / windows (push) Failing after 23m21s
version number Signed-off-by: galeon <dertiellis@gmail.com>
This commit is contained in:
1 parent
bc205fa2e7
commit
1d781b5324
19 files changed
+805
-10
No files matched your search
@@ -15,6 +15,7 @@
|
||||
#include "msaauthservice.h"
|
||||
#include "modloaderversionservice.h"
|
||||
#include "buildswitcher.h"
|
||||
#include "gamedirimport.h"
|
||||
#include "seasonalbuildservice.h"
|
||||
#include "seasonalpackdownloader.h"
|
||||
|
||||
@@ -97,11 +98,20 @@ LauncherBackend::LauncherBackend(QObject *parent)
|
||||
if (!LauncherPaths::ensureRootExists(&storageError))
|
||||
m_storageIssues << Loc::text("storage.error.launcherDirFailed").arg(storageError);
|
||||
|
||||
// Первый запуск — ни настроек, ни списка сборок, ни старого versions.json.
|
||||
// Смотреть надо до loadData(): битый файл она отводит в .bak, а
|
||||
// ensureDataFiles() создаёт пустые. Пустой customBuilds.json — это уже
|
||||
// решение пользователя «сборок нет», и сборку из папки игры мы не заводим.
|
||||
const bool firstRun = !QFile::exists(LauncherPaths::settingsFile())
|
||||
&& !QFile::exists(LauncherPaths::customBuildsFile())
|
||||
&& !QFile::exists(LauncherPaths::legacyCustomBuildsFile());
|
||||
|
||||
loadSettings();
|
||||
// Порядок важен: миграция должна успеть до того, как ensureDataFiles()
|
||||
// создаст пустой customBuilds.json поверх старых данных.
|
||||
migrateLegacyBuildsFile();
|
||||
loadData();
|
||||
const QString importedBuild = firstRun && m_builds.isEmpty() ? importGameDir() : QString();
|
||||
ensureDataFiles();
|
||||
|
||||
// Прошлое переключение оборвалось на середине. Доигрываем его сами, а не
|
||||
@@ -370,6 +380,10 @@ LauncherBackend::LauncherBackend(QObject *parent)
|
||||
});
|
||||
|
||||
// Интерфейс подключается к сигналам уже после конструктора — сообщаем отложенно.
|
||||
// Ошибки хранилища идут следом: плашка одна, и важнее показать их.
|
||||
if (!importedBuild.isEmpty()) {
|
||||
QTimer::singleShot(0, this, [this, importedBuild] { emit gameDirImported(importedBuild); });
|
||||
}
|
||||
if (!m_storageIssues.isEmpty()) {
|
||||
QTimer::singleShot(0, this, [this] {
|
||||
emit launchError(m_storageIssues.join(u'\n'));
|
||||
@@ -2483,6 +2497,36 @@ bool LauncherBackend::migrateLegacyBuildsFile()
|
||||
return true;
|
||||
}
|
||||
|
||||
// Сборка описывает то, что уже разложено в .minecraft, поэтому BuildSwitcher не
|
||||
// нужен: активная сборка без архива — штатное состояние. Через addCustomBuild()
|
||||
// не идём, чтобы при старте не началась установка.
|
||||
QString LauncherBackend::importGameDir()
|
||||
{
|
||||
const std::optional<GameDirImport::Detected> found = GameDirImport::detect(gameDir());
|
||||
if (!found)
|
||||
return {};
|
||||
|
||||
CustomBuild build;
|
||||
build.id = m_nextBuildId++;
|
||||
build.minecraftVersion = found->minecraftVersion;
|
||||
build.resolvedVersionId = found->resolvedVersionId;
|
||||
build.loader = found->loader;
|
||||
build.loaderVersion = found->loaderVersion;
|
||||
if (build.minecraftVersion.isEmpty()) {
|
||||
build.name = Loc::text("build.title.fromGameDir");
|
||||
} else if (const auto loader = loaderFromKey(build.loader)) {
|
||||
build.name = loaderTitle(*loader) + u' ' + build.minecraftVersion;
|
||||
} else {
|
||||
build.name = QStringLiteral("Minecraft ") + build.minecraftVersion;
|
||||
}
|
||||
m_builds.append(build);
|
||||
|
||||
m_settings.insert(QStringLiteral("activeBuildId"), build.id);
|
||||
saveSettings();
|
||||
saveCustomBuilds();
|
||||
return build.name;
|
||||
}
|
||||
|
||||
// Файлы могли не появиться при первом запуске, быть удалены или отложены в .bak —
|
||||
// создаём заново, чтобы папка лаунчера всегда была укомплектована.
|
||||
void LauncherBackend::ensureDataFiles()
|
||||
|
||||
Reference in new issue
Block a user