diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index eb3c066e6..dea725c88 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -265,6 +265,8 @@ set(MINECRAFT_SOURCES minecraft/launch/ClaimAccount.h minecraft/launch/CreateGameFolders.cpp minecraft/launch/CreateGameFolders.h + minecraft/launch/EnsureOfflineLibraries.cpp + minecraft/launch/EnsureOfflineLibraries.h minecraft/launch/ModMinecraftJar.cpp minecraft/launch/ModMinecraftJar.h minecraft/launch/ExtractNatives.cpp diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index f586f78d8..50f1c231c 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -40,13 +40,6 @@ #include "BuildConfig.h" #include "Json.h" #include "QObjectPtr.h" -#include "minecraft/launch/AutoInstallJava.h" -#include "minecraft/launch/CreateGameFolders.h" -#include "minecraft/launch/ExtractNatives.h" -#include "minecraft/launch/PrintInstanceInfo.h" -#include "minecraft/update/AssetUpdateTask.h" -#include "minecraft/update/LegacyFMLLibrariesTask.h" -#include "minecraft/update/LibrariesTask.h" #include "settings/Setting.h" #include "settings/SettingsObject.h" @@ -63,13 +56,23 @@ #include "launch/steps/QuitAfterGameStop.h" #include "launch/steps/TextPrint.h" +#include "minecraft/launch/AutoInstallJava.h" #include "minecraft/launch/ClaimAccount.h" +#include "minecraft/launch/CreateGameFolders.h" +#include "minecraft/launch/EnsureOfflineLibraries.h" +#include "minecraft/launch/ExtractNatives.h" #include "minecraft/launch/LauncherPartLaunch.h" #include "minecraft/launch/ModMinecraftJar.h" +#include "minecraft/launch/PrintInstanceInfo.h" #include "minecraft/launch/ReconstructAssets.h" #include "minecraft/launch/ScanModFolders.h" #include "minecraft/launch/VerifyJavaInstall.h" +#include "minecraft/update/AssetUpdateTask.h" +#include "minecraft/update/FoldersTask.h" +#include "minecraft/update/LegacyFMLLibrariesTask.h" +#include "minecraft/update/LibrariesTask.h" + #include "java/JavaUtils.h" #include "icons/IconList.h" @@ -84,7 +87,6 @@ #include "AssetsUtils.h" #include "MinecraftLoadAndCheck.h" #include "PackProfile.h" -#include "minecraft/update/FoldersTask.h" #include "tools/BaseProfiler.h" @@ -920,21 +922,13 @@ QStringList MinecraftInstance::verboseDescription(AuthSessionPtr session, Minecr out << "Libraries:"; QStringList jars, nativeJars; profile->getLibraryFiles(runtimeContext(), jars, nativeJars, getLocalLibraryPath(), binRoot()); - auto printLibFile = [&out](const QString& path) { - QFileInfo info(path); - if (info.exists()) { - out << indent + path; - } else { - out << indent + path + " (missing)"; - } - }; for (auto file : jars) { - printLibFile(file); + out << indent + file; } out << emptyLine; out << "Native libraries:"; for (auto file : nativeJars) { - printLibFile(file); + out << indent + file; } out << emptyLine; } @@ -1184,6 +1178,8 @@ LaunchTask* MinecraftInstance::createLaunchTask(AuthSessionPtr session, Minecraf for (auto t : createUpdateTask()) { process->appendStep(makeShared(pptr, t)); } + } else { + process->appendStep(makeShared(pptr, this)); } // if there are any jar mods diff --git a/launcher/minecraft/launch/EnsureOfflineLibraries.cpp b/launcher/minecraft/launch/EnsureOfflineLibraries.cpp new file mode 100644 index 000000000..59801a1d0 --- /dev/null +++ b/launcher/minecraft/launch/EnsureOfflineLibraries.cpp @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (C) 2026 Octol1ttle + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "EnsureOfflineLibraries.h" + +#include "minecraft/PackProfile.h" + +EnsureOfflineLibraries::EnsureOfflineLibraries(LaunchTask* parent, MinecraftInstance* instance) : LaunchStep(parent), m_instance(instance) +{} + +void EnsureOfflineLibraries::executeTask() +{ + const auto profile = m_instance->getPackProfile()->getProfile(); + QStringList allJars; + profile->getLibraryFiles(m_instance->runtimeContext(), allJars, allJars, m_instance->getLocalLibraryPath(), m_instance->binRoot()); + for (const auto& jar : allJars) { + if (!QFileInfo::exists(jar)) { + emit logLine(tr("This instance cannot be launched because some libraries are missing or have not been downloaded yet. Please " + "try again in online mode with a working Internet connection"), + MessageLevel::Fatal); + emitFailed("Required libraries are missing"); + return; + } + } + + emitSucceeded(); +} diff --git a/launcher/minecraft/launch/EnsureOfflineLibraries.h b/launcher/minecraft/launch/EnsureOfflineLibraries.h new file mode 100644 index 000000000..87c0536a3 --- /dev/null +++ b/launcher/minecraft/launch/EnsureOfflineLibraries.h @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (C) 2026 Octol1ttle + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include "launch/LaunchStep.h" +#include "minecraft/MinecraftInstance.h" + +class EnsureOfflineLibraries : public LaunchStep { + Q_OBJECT + + public: + explicit EnsureOfflineLibraries(LaunchTask* parent, MinecraftInstance* instance); + ~EnsureOfflineLibraries() override = default; + + void executeTask() override; + bool canAbort() const override { return false; } + + private: + MinecraftInstance* m_instance; +};