|
|
|
|
@@ -75,12 +75,12 @@ bool FlameCreationTask::abort()
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
m_abort = true;
|
|
|
|
|
if (m_process_update_file_info_job)
|
|
|
|
|
m_process_update_file_info_job->abort();
|
|
|
|
|
if (m_files_job)
|
|
|
|
|
m_files_job->abort();
|
|
|
|
|
if (m_mod_id_resolver)
|
|
|
|
|
m_mod_id_resolver->abort();
|
|
|
|
|
if (m_processUpdateFileInfoJob)
|
|
|
|
|
m_processUpdateFileInfoJob->abort();
|
|
|
|
|
if (m_filesJob)
|
|
|
|
|
m_filesJob->abort();
|
|
|
|
|
if (m_modIdResolver)
|
|
|
|
|
m_modIdResolver->abort();
|
|
|
|
|
|
|
|
|
|
return Task::abort();
|
|
|
|
|
}
|
|
|
|
|
@@ -232,12 +232,12 @@ bool FlameCreationTask::updateInstance()
|
|
|
|
|
connect(job.get(), &Task::failed, this, [](QString reason) { qCritical() << "Failed to get files: " << reason; });
|
|
|
|
|
connect(job.get(), &Task::finished, &loop, &QEventLoop::quit);
|
|
|
|
|
|
|
|
|
|
m_process_update_file_info_job = job;
|
|
|
|
|
m_processUpdateFileInfoJob = job;
|
|
|
|
|
job->start();
|
|
|
|
|
|
|
|
|
|
loop.exec();
|
|
|
|
|
|
|
|
|
|
m_process_update_file_info_job = nullptr;
|
|
|
|
|
m_processUpdateFileInfoJob = nullptr;
|
|
|
|
|
} else {
|
|
|
|
|
// We don't have an old index file, so we may duplicate stuff!
|
|
|
|
|
auto dialog = CustomMessageBox::selectable(m_parent, tr("No index file."),
|
|
|
|
|
@@ -430,26 +430,26 @@ bool FlameCreationTask::createInstance()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Don't add managed info to packs without an ID (most likely imported from ZIP)
|
|
|
|
|
if (!m_managed_id.isEmpty())
|
|
|
|
|
instance.setManagedPack("flame", m_managed_id, m_pack.name, m_managed_version_id, m_pack.version);
|
|
|
|
|
if (!m_managedId.isEmpty())
|
|
|
|
|
instance.setManagedPack("flame", m_managedId, m_pack.name, m_managedVersionId, m_pack.version);
|
|
|
|
|
else
|
|
|
|
|
instance.setManagedPack("flame", "", name(), "", "");
|
|
|
|
|
|
|
|
|
|
instance.setName(name());
|
|
|
|
|
|
|
|
|
|
m_mod_id_resolver.reset(new Flame::FileResolvingTask(APPLICATION->network(), m_pack));
|
|
|
|
|
connect(m_mod_id_resolver.get(), &Flame::FileResolvingTask::succeeded, this, [this, &loop] { idResolverSucceeded(loop); });
|
|
|
|
|
connect(m_mod_id_resolver.get(), &Flame::FileResolvingTask::failed, [this, &loop](QString reason) {
|
|
|
|
|
m_mod_id_resolver.reset();
|
|
|
|
|
m_modIdResolver.reset(new Flame::FileResolvingTask(APPLICATION->network(), m_pack));
|
|
|
|
|
connect(m_modIdResolver.get(), &Flame::FileResolvingTask::succeeded, this, [this, &loop] { idResolverSucceeded(loop); });
|
|
|
|
|
connect(m_modIdResolver.get(), &Flame::FileResolvingTask::failed, [this, &loop](QString reason) {
|
|
|
|
|
m_modIdResolver.reset();
|
|
|
|
|
setError(tr("Unable to resolve mod IDs:\n") + reason);
|
|
|
|
|
loop.quit();
|
|
|
|
|
});
|
|
|
|
|
connect(m_mod_id_resolver.get(), &Flame::FileResolvingTask::aborted, &loop, &QEventLoop::quit);
|
|
|
|
|
connect(m_mod_id_resolver.get(), &Flame::FileResolvingTask::progress, this, &FlameCreationTask::setProgress);
|
|
|
|
|
connect(m_mod_id_resolver.get(), &Flame::FileResolvingTask::status, this, &FlameCreationTask::setStatus);
|
|
|
|
|
connect(m_mod_id_resolver.get(), &Flame::FileResolvingTask::stepProgress, this, &FlameCreationTask::propagateStepProgress);
|
|
|
|
|
connect(m_mod_id_resolver.get(), &Flame::FileResolvingTask::details, this, &FlameCreationTask::setDetails);
|
|
|
|
|
m_mod_id_resolver->start();
|
|
|
|
|
connect(m_modIdResolver.get(), &Flame::FileResolvingTask::aborted, &loop, &QEventLoop::quit);
|
|
|
|
|
connect(m_modIdResolver.get(), &Flame::FileResolvingTask::progress, this, &FlameCreationTask::setProgress);
|
|
|
|
|
connect(m_modIdResolver.get(), &Flame::FileResolvingTask::status, this, &FlameCreationTask::setStatus);
|
|
|
|
|
connect(m_modIdResolver.get(), &Flame::FileResolvingTask::stepProgress, this, &FlameCreationTask::propagateStepProgress);
|
|
|
|
|
connect(m_modIdResolver.get(), &Flame::FileResolvingTask::details, this, &FlameCreationTask::setDetails);
|
|
|
|
|
m_modIdResolver->start();
|
|
|
|
|
|
|
|
|
|
loop.exec();
|
|
|
|
|
|
|
|
|
|
@@ -468,14 +468,14 @@ bool FlameCreationTask::createInstance()
|
|
|
|
|
|
|
|
|
|
void FlameCreationTask::idResolverSucceeded(QEventLoop& loop)
|
|
|
|
|
{
|
|
|
|
|
auto results = m_mod_id_resolver->getResults();
|
|
|
|
|
auto results = m_modIdResolver->getResults();
|
|
|
|
|
|
|
|
|
|
// first check for blocked mods
|
|
|
|
|
QList<BlockedMod> blocked_mods;
|
|
|
|
|
auto anyBlocked = false;
|
|
|
|
|
for (const auto& result : results.files.values()) {
|
|
|
|
|
if (result.version.fileName.endsWith(".zip")) {
|
|
|
|
|
m_ZIP_resources.append(std::make_pair(result.version.fileName, result.targetFolder));
|
|
|
|
|
if (result.resourceType != PackedResourceType::Mod) {
|
|
|
|
|
m_otherResources.append(std::make_pair(result.version.fileName, result.targetFolder));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (result.version.downloadUrl.isEmpty()) {
|
|
|
|
|
@@ -507,7 +507,7 @@ void FlameCreationTask::idResolverSucceeded(QEventLoop& loop)
|
|
|
|
|
copyBlockedMods(blocked_mods);
|
|
|
|
|
setupDownloadJob(loop);
|
|
|
|
|
} else {
|
|
|
|
|
m_mod_id_resolver.reset();
|
|
|
|
|
m_modIdResolver.reset();
|
|
|
|
|
setError("Canceled");
|
|
|
|
|
loop.quit();
|
|
|
|
|
}
|
|
|
|
|
@@ -518,8 +518,8 @@ void FlameCreationTask::idResolverSucceeded(QEventLoop& loop)
|
|
|
|
|
|
|
|
|
|
void FlameCreationTask::setupDownloadJob(QEventLoop& loop)
|
|
|
|
|
{
|
|
|
|
|
m_files_job.reset(new NetJob(tr("Mod Download Flame"), APPLICATION->network()));
|
|
|
|
|
auto results = m_mod_id_resolver->getResults().files;
|
|
|
|
|
m_filesJob.reset(new NetJob(tr("Mod Download Flame"), APPLICATION->network()));
|
|
|
|
|
auto results = m_modIdResolver->getResults().files;
|
|
|
|
|
|
|
|
|
|
QStringList optionalFiles;
|
|
|
|
|
for (auto& result : results) {
|
|
|
|
|
@@ -554,26 +554,26 @@ void FlameCreationTask::setupDownloadJob(QEventLoop& loop)
|
|
|
|
|
if (!result.version.downloadUrl.isEmpty()) {
|
|
|
|
|
qDebug() << "Will download" << result.version.downloadUrl << "to" << path;
|
|
|
|
|
auto dl = Net::ApiDownload::makeFile(result.version.downloadUrl, path);
|
|
|
|
|
m_files_job->addNetAction(dl);
|
|
|
|
|
m_filesJob->addNetAction(dl);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
connect(m_files_job.get(), &NetJob::finished, this, [this, &loop]() {
|
|
|
|
|
m_files_job.reset();
|
|
|
|
|
validateZIPResources(loop);
|
|
|
|
|
connect(m_filesJob.get(), &NetJob::finished, this, [this, &loop]() {
|
|
|
|
|
m_filesJob.reset();
|
|
|
|
|
validateOtherResources(loop);
|
|
|
|
|
});
|
|
|
|
|
connect(m_files_job.get(), &NetJob::failed, [this](QString reason) {
|
|
|
|
|
m_files_job.reset();
|
|
|
|
|
connect(m_filesJob.get(), &NetJob::failed, [this](QString reason) {
|
|
|
|
|
m_filesJob.reset();
|
|
|
|
|
setError(reason);
|
|
|
|
|
});
|
|
|
|
|
connect(m_files_job.get(), &NetJob::progress, this, [this](qint64 current, qint64 total) {
|
|
|
|
|
connect(m_filesJob.get(), &NetJob::progress, this, [this](qint64 current, qint64 total) {
|
|
|
|
|
setDetails(tr("%1 out of %2 complete").arg(current).arg(total));
|
|
|
|
|
setProgress(current, total);
|
|
|
|
|
});
|
|
|
|
|
connect(m_files_job.get(), &NetJob::stepProgress, this, &FlameCreationTask::propagateStepProgress);
|
|
|
|
|
connect(m_filesJob.get(), &NetJob::stepProgress, this, &FlameCreationTask::propagateStepProgress);
|
|
|
|
|
|
|
|
|
|
setStatus(tr("Downloading mods..."));
|
|
|
|
|
m_files_job->start();
|
|
|
|
|
m_filesJob->start();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// @brief copy the matched blocked mods to the instance staging area
|
|
|
|
|
@@ -614,11 +614,11 @@ void FlameCreationTask::copyBlockedMods(QList<BlockedMod> const& blocked_mods)
|
|
|
|
|
setAbortable(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FlameCreationTask::validateZIPResources(QEventLoop& loop)
|
|
|
|
|
void FlameCreationTask::validateOtherResources(QEventLoop& loop)
|
|
|
|
|
{
|
|
|
|
|
qDebug() << "Validating whether resources stored as .zip are in the right place";
|
|
|
|
|
qDebug() << "Validating whether other resources are in the right place";
|
|
|
|
|
QStringList zipMods;
|
|
|
|
|
for (auto [fileName, targetFolder] : m_ZIP_resources) {
|
|
|
|
|
for (auto [fileName, targetFolder] : m_otherResources) {
|
|
|
|
|
qDebug() << "Checking" << fileName << "...";
|
|
|
|
|
auto localPath = FS::PathCombine(m_stagingPath, "minecraft", targetFolder, fileName);
|
|
|
|
|
|
|
|
|
|
@@ -678,6 +678,7 @@ void FlameCreationTask::validateZIPResources(QEventLoop& loop)
|
|
|
|
|
installWorld(worldPath);
|
|
|
|
|
break;
|
|
|
|
|
case PackedResourceType::UNKNOWN:
|
|
|
|
|
/* fallthrough */
|
|
|
|
|
default:
|
|
|
|
|
qDebug() << "Can't Identify" << fileName << "at" << localPath << ", leaving it where it is.";
|
|
|
|
|
break;
|
|
|
|
|
@@ -685,7 +686,7 @@ void FlameCreationTask::validateZIPResources(QEventLoop& loop)
|
|
|
|
|
}
|
|
|
|
|
// TODO make this work with other sorts of resource
|
|
|
|
|
auto task = makeShared<ConcurrentTask>("CreateModMetadata", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt());
|
|
|
|
|
auto results = m_mod_id_resolver->getResults().files;
|
|
|
|
|
auto results = m_modIdResolver->getResults().files;
|
|
|
|
|
auto folder = FS::PathCombine(m_stagingPath, "minecraft", "mods", ".index");
|
|
|
|
|
for (auto file : results) {
|
|
|
|
|
if (file.targetFolder != "mods" || (file.version.fileName.endsWith(".zip") && !zipMods.contains(file.version.fileName))) {
|
|
|
|
|
@@ -694,6 +695,6 @@ void FlameCreationTask::validateZIPResources(QEventLoop& loop)
|
|
|
|
|
task->addTask(makeShared<LocalResourceUpdateTask>(folder, file.pack, file.version));
|
|
|
|
|
}
|
|
|
|
|
connect(task.get(), &Task::finished, &loop, &QEventLoop::quit);
|
|
|
|
|
m_process_update_file_info_job = task;
|
|
|
|
|
m_processUpdateFileInfoJob = task;
|
|
|
|
|
task->start();
|
|
|
|
|
}
|
|
|
|
|
|