diff --git a/launcher/InstanceCreationTask.cpp b/launcher/InstanceCreationTask.cpp index 94c229128..5f87b001d 100644 --- a/launcher/InstanceCreationTask.cpp +++ b/launcher/InstanceCreationTask.cpp @@ -2,7 +2,23 @@ #include #include -#include "FileSystem.h" + +#include "minecraft/MinecraftLoadAndCheck.h" +#include "tasks/SequentialTask.h" + +bool InstanceCreationTask::abort() +{ + if (!canAbort()) { + return false; + } + + m_abort = true; + if (m_gameFilesTask) { + return m_gameFilesTask->abort(); + } + + return true; +} void InstanceCreationTask::executeTask() { @@ -19,7 +35,8 @@ void InstanceCreationTask::executeTask() return; } - if (!createInstance()) { + m_instance = createInstance(); + if (!m_instance) { if (m_abort) return; @@ -61,6 +78,32 @@ void InstanceCreationTask::executeTask() return; } } - if (!m_abort) - emitSucceeded(); + + if (!m_abort) { + setAbortable(true); + setStatus(tr("Downloading game files")); + qDebug() << "Downloading game files"; + + auto updateTasks = m_instance->createUpdateTask(); + if (updateTasks.isEmpty()) { + emitSucceeded(); + return; + } + auto task = makeShared(); + task->addTask(makeShared(m_instance.get(), Net::Mode::Online)); + for (const auto& t : updateTasks) { + task->addTask(t); + } + connect(task.get(), &Task::finished, this, [this, task] { + if (task->wasSuccessful() || m_abort) { + emitSucceeded(); + } else { + emitFailed(tr("Could not download game files: %1").arg(task->failReason())); + } + }); + propagateFromOther(task.get()); + + m_gameFilesTask = task; + m_gameFilesTask->start(); + } } diff --git a/launcher/InstanceCreationTask.h b/launcher/InstanceCreationTask.h index 95dc816a2..e25afd3e9 100644 --- a/launcher/InstanceCreationTask.h +++ b/launcher/InstanceCreationTask.h @@ -10,6 +10,8 @@ class InstanceCreationTask : public InstanceTask { InstanceCreationTask() = default; virtual ~InstanceCreationTask() = default; + bool abort() override; + protected: void executeTask() final override; @@ -44,4 +46,6 @@ class InstanceCreationTask : public InstanceTask { private: QString m_error_message; + std::unique_ptr m_instance; + Task::Ptr m_gameFilesTask; }; diff --git a/launcher/InstanceList.cpp b/launcher/InstanceList.cpp index 68681a9bb..6e84111f2 100644 --- a/launcher/InstanceList.cpp +++ b/launcher/InstanceList.cpp @@ -938,9 +938,7 @@ class InstanceStaging : public Task { if (!canAbort()) return false; - m_child->abort(); - - return Task::abort(); + return m_child->abort(); } bool canAbort() const override { return (m_child && m_child->canAbort()); } diff --git a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp index 98cd6fb28..66475bc08 100644 --- a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp +++ b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp @@ -75,7 +75,6 @@ bool FlameCreationTask::abort() if (!canAbort()) return false; - m_abort = true; if (m_processUpdateFileInfoJob) m_processUpdateFileInfoJob->abort(); if (m_filesJob) @@ -83,7 +82,7 @@ bool FlameCreationTask::abort() if (m_modIdResolver) m_modIdResolver->abort(); - return Task::abort(); + return InstanceCreationTask::abort(); } bool FlameCreationTask::updateInstance() diff --git a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp index 3bc3dc755..6409c4f35 100644 --- a/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp +++ b/launcher/modplatform/modrinth/ModrinthInstanceCreationTask.cpp @@ -32,10 +32,9 @@ bool ModrinthCreationTask::abort() if (!canAbort()) return false; - m_abort = true; if (m_task) m_task->abort(); - return Task::abort(); + return InstanceCreationTask::abort(); } bool ModrinthCreationTask::updateInstance()