diff --git a/launcher/minecraft/ComponentUpdateTask.cpp b/launcher/minecraft/ComponentUpdateTask.cpp index ceae10dbe..73203f74b 100644 --- a/launcher/minecraft/ComponentUpdateTask.cpp +++ b/launcher/minecraft/ComponentUpdateTask.cpp @@ -74,6 +74,11 @@ bool ComponentUpdateTask::abort() return aborted; } +Net::Mode ComponentUpdateTask::netMode() +{ + return d->netmode; +} + void ComponentUpdateTask::executeTask() { qCDebug(instanceProfileResolveC) << "Loading components"; diff --git a/launcher/minecraft/ComponentUpdateTask.h b/launcher/minecraft/ComponentUpdateTask.h index b0a6f8bff..2ef9737ba 100644 --- a/launcher/minecraft/ComponentUpdateTask.h +++ b/launcher/minecraft/ComponentUpdateTask.h @@ -19,6 +19,7 @@ class ComponentUpdateTask : public Task { bool canAbort() const override; bool abort() override; + Net::Mode netMode(); protected: void executeTask() override; diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index 72e1207ab..f0cff7f0e 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -326,7 +326,15 @@ PackProfile::Result PackProfile::reload(Net::Mode netmode) { // Do not reload when the update/resolve task is running. It is in control. if (d->m_updateTask) { - return Result::Success(); + if (d->m_updateTask->netMode() == netmode) { + return Result::Success(); + } + + // https://github.com/PrismLauncher/PrismLauncher/issues/5209 + // FIXME: HACK HACK HACK + disconnect(d->m_updateTask.get(), &ComponentUpdateTask::aborted, nullptr, nullptr); + d->m_updateTask->abort(); + d->m_updateTask.reset(); } // flush any scheduled saves to not lose state diff --git a/launcher/minecraft/PackProfile_p.h b/launcher/minecraft/PackProfile_p.h index 4fb3621f0..feb825904 100644 --- a/launcher/minecraft/PackProfile_p.h +++ b/launcher/minecraft/PackProfile_p.h @@ -22,7 +22,7 @@ struct PackProfileData { ComponentIndex componentIndex; bool dirty = false; QTimer m_saveTimer; - Task::Ptr m_updateTask; + shared_qobject_ptr m_updateTask; bool loaded = false; bool interactionDisabled = true; };