feat: download game files during instance creation

Signed-off-by: Octol1ttle <l1ttleofficial@outlook.com>
This commit is contained in:
Octol1ttle 2026-02-02 16:06:02 +05:00
parent aa9896031d
commit 625f0060a1
No known key found for this signature in database
GPG key ID: B77C34313AEE1FFF
5 changed files with 54 additions and 11 deletions

View file

@ -2,7 +2,23 @@
#include <QDebug>
#include <QFile>
#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<SequentialTask>();
task->addTask(makeShared<MinecraftLoadAndCheck>(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();
}
}

View file

@ -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<MinecraftInstance> m_instance;
Task::Ptr m_gameFilesTask;
};

View file

@ -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()); }

View file

@ -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()

View file

@ -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()