Merge pull request #1549 from Trial97/atlauncher_browser
added suport for atlauncher browser download
This commit is contained in:
commit
0927035a26
@ -37,6 +37,7 @@
|
|||||||
#include "ATLPackInstallTask.h"
|
#include "ATLPackInstallTask.h"
|
||||||
|
|
||||||
#include <QtConcurrent>
|
#include <QtConcurrent>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
#include <quazip/quazip.h>
|
#include <quazip/quazip.h>
|
||||||
|
|
||||||
@ -50,6 +51,7 @@
|
|||||||
#include "minecraft/MinecraftInstance.h"
|
#include "minecraft/MinecraftInstance.h"
|
||||||
#include "minecraft/OneSixVersionFormat.h"
|
#include "minecraft/OneSixVersionFormat.h"
|
||||||
#include "minecraft/PackProfile.h"
|
#include "minecraft/PackProfile.h"
|
||||||
|
#include "modplatform/atlauncher/ATLPackManifest.h"
|
||||||
#include "net/ChecksumValidator.h"
|
#include "net/ChecksumValidator.h"
|
||||||
#include "settings/INISettingsObject.h"
|
#include "settings/INISettingsObject.h"
|
||||||
|
|
||||||
@ -57,6 +59,7 @@
|
|||||||
|
|
||||||
#include "Application.h"
|
#include "Application.h"
|
||||||
#include "BuildConfig.h"
|
#include "BuildConfig.h"
|
||||||
|
#include "ui/dialogs/BlockedModsDialog.h"
|
||||||
|
|
||||||
namespace ATLauncher {
|
namespace ATLauncher {
|
||||||
|
|
||||||
@ -717,6 +720,8 @@ void PackInstallTask::downloadMods()
|
|||||||
|
|
||||||
jarmods.clear();
|
jarmods.clear();
|
||||||
jobPtr.reset(new NetJob(tr("Mod download"), APPLICATION->network()));
|
jobPtr.reset(new NetJob(tr("Mod download"), APPLICATION->network()));
|
||||||
|
|
||||||
|
QList<VersionMod> blocked_mods;
|
||||||
for (const auto& mod : m_version.mods) {
|
for (const auto& mod : m_version.mods) {
|
||||||
// skip non-client mods
|
// skip non-client mods
|
||||||
if (!mod.client)
|
if (!mod.client)
|
||||||
@ -731,9 +736,10 @@ void PackInstallTask::downloadMods()
|
|||||||
case DownloadType::Server:
|
case DownloadType::Server:
|
||||||
url = BuildConfig.ATL_DOWNLOAD_SERVER_URL + mod.url;
|
url = BuildConfig.ATL_DOWNLOAD_SERVER_URL + mod.url;
|
||||||
break;
|
break;
|
||||||
case DownloadType::Browser:
|
case DownloadType::Browser: {
|
||||||
emitFailed(tr("Unsupported download type: %1").arg(mod.download_raw));
|
blocked_mods.append(mod);
|
||||||
return;
|
continue;
|
||||||
|
}
|
||||||
case DownloadType::Direct:
|
case DownloadType::Direct:
|
||||||
url = mod.url;
|
url = mod.url;
|
||||||
break;
|
break;
|
||||||
@ -805,24 +811,86 @@ void PackInstallTask::downloadMods()
|
|||||||
modsToCopy[entry->getFullPath()] = path;
|
modsToCopy[entry->getFullPath()] = path;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!blocked_mods.isEmpty()) {
|
||||||
|
QList<BlockedMod> mods;
|
||||||
|
|
||||||
|
for (auto mod : blocked_mods) {
|
||||||
|
BlockedMod blocked_mod;
|
||||||
|
blocked_mod.name = mod.file;
|
||||||
|
blocked_mod.websiteUrl = mod.url;
|
||||||
|
blocked_mod.hash = mod.md5;
|
||||||
|
blocked_mod.matched = false;
|
||||||
|
blocked_mod.localPath = "";
|
||||||
|
|
||||||
|
mods.append(blocked_mod);
|
||||||
|
}
|
||||||
|
|
||||||
|
qWarning() << "Blocked mods found, displaying mod list";
|
||||||
|
|
||||||
|
BlockedModsDialog message_dialog(nullptr, tr("Blocked mods found"),
|
||||||
|
tr("The following files are not available for download in third party launchers.<br/>"
|
||||||
|
"You will need to manually download them and add them to the instance."),
|
||||||
|
mods, "md5");
|
||||||
|
|
||||||
|
message_dialog.setModal(true);
|
||||||
|
|
||||||
|
if (message_dialog.exec()) {
|
||||||
|
qDebug() << "Post dialog blocked mods list: " << mods;
|
||||||
|
for (auto blocked : mods) {
|
||||||
|
if (!blocked.matched) {
|
||||||
|
qDebug() << blocked.name << "was not matched to a local file, skipping copy";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
auto modIter = std::find_if(blocked_mods.begin(), blocked_mods.end(),
|
||||||
|
[blocked](const VersionMod& mod) { return mod.url == blocked.websiteUrl; });
|
||||||
|
if (modIter == blocked_mods.end())
|
||||||
|
continue;
|
||||||
|
auto mod = *modIter;
|
||||||
|
if (mod.type == ModType::Extract || mod.type == ModType::TexturePackExtract || mod.type == ModType::ResourcePackExtract) {
|
||||||
|
modsToExtract.insert(blocked.localPath, mod);
|
||||||
|
} else if (mod.type == ModType::Decomp) {
|
||||||
|
modsToDecomp.insert(blocked.localPath, mod);
|
||||||
|
} else {
|
||||||
|
auto relpath = getDirForModType(mod.type, mod.type_raw);
|
||||||
|
if (relpath == Q_NULLPTR)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
auto path = FS::PathCombine(m_stagingPath, "minecraft", relpath, mod.file);
|
||||||
|
|
||||||
|
if (mod.type == ModType::Forge) {
|
||||||
|
auto ver = getComponentVersion("net.minecraftforge", mod.version);
|
||||||
|
if (ver) {
|
||||||
|
componentsToInstall.insert("net.minecraftforge", ver);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
qDebug() << "Jarmod: " + path;
|
||||||
|
jarmods.push_back(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mod.type == ModType::Jar) {
|
||||||
|
qDebug() << "Jarmod: " + path;
|
||||||
|
jarmods.push_back(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
modsToCopy[blocked.localPath] = path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
emitFailed(tr("Unknown download type: %1").arg("browser"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
connect(jobPtr.get(), &NetJob::succeeded, this, &PackInstallTask::onModsDownloaded);
|
connect(jobPtr.get(), &NetJob::succeeded, this, &PackInstallTask::onModsDownloaded);
|
||||||
connect(jobPtr.get(), &NetJob::failed, [&](QString reason) {
|
connect(jobPtr.get(), &NetJob::progress, [this](qint64 current, qint64 total) {
|
||||||
abortable = false;
|
|
||||||
jobPtr.reset();
|
|
||||||
emitFailed(reason);
|
|
||||||
});
|
|
||||||
connect(jobPtr.get(), &NetJob::progress, [&](qint64 current, qint64 total) {
|
|
||||||
setDetails(tr("%1 out of %2 complete").arg(current).arg(total));
|
setDetails(tr("%1 out of %2 complete").arg(current).arg(total));
|
||||||
abortable = true;
|
abortable = true;
|
||||||
setProgress(current, total);
|
setProgress(current, total);
|
||||||
});
|
});
|
||||||
connect(jobPtr.get(), &NetJob::stepProgress, this, &PackInstallTask::propagateStepProgress);
|
connect(jobPtr.get(), &NetJob::stepProgress, this, &PackInstallTask::propagateStepProgress);
|
||||||
connect(jobPtr.get(), &NetJob::aborted, [&] {
|
connect(jobPtr.get(), &NetJob::aborted, &PackInstallTask::emitAborted);
|
||||||
abortable = false;
|
connect(jobPtr.get(), &NetJob::failed, &PackInstallTask::emitFailed);
|
||||||
jobPtr.reset();
|
|
||||||
emitAborted();
|
|
||||||
});
|
|
||||||
|
|
||||||
jobPtr->start();
|
jobPtr->start();
|
||||||
}
|
}
|
||||||
@ -843,7 +911,7 @@ void PackInstallTask::onModsDownloaded()
|
|||||||
QtConcurrent::run(QThreadPool::globalInstance(), this, &PackInstallTask::extractMods, modsToExtract, modsToDecomp, modsToCopy);
|
QtConcurrent::run(QThreadPool::globalInstance(), this, &PackInstallTask::extractMods, modsToExtract, modsToDecomp, modsToCopy);
|
||||||
#endif
|
#endif
|
||||||
connect(&m_modExtractFutureWatcher, &QFutureWatcher<QStringList>::finished, this, &PackInstallTask::onModsExtracted);
|
connect(&m_modExtractFutureWatcher, &QFutureWatcher<QStringList>::finished, this, &PackInstallTask::onModsExtracted);
|
||||||
connect(&m_modExtractFutureWatcher, &QFutureWatcher<QStringList>::canceled, this, [&]() { emitAborted(); });
|
connect(&m_modExtractFutureWatcher, &QFutureWatcher<QStringList>::canceled, this, &PackInstallTask::emitAborted);
|
||||||
m_modExtractFutureWatcher.setFuture(m_modExtractFuture);
|
m_modExtractFutureWatcher.setFuture(m_modExtractFuture);
|
||||||
} else {
|
} else {
|
||||||
install();
|
install();
|
||||||
|
@ -41,8 +41,8 @@
|
|||||||
#include <QPushButton>
|
#include <QPushButton>
|
||||||
#include <QStandardPaths>
|
#include <QStandardPaths>
|
||||||
|
|
||||||
BlockedModsDialog::BlockedModsDialog(QWidget* parent, const QString& title, const QString& text, QList<BlockedMod>& mods)
|
BlockedModsDialog::BlockedModsDialog(QWidget* parent, const QString& title, const QString& text, QList<BlockedMod>& mods, QString hash_type)
|
||||||
: QDialog(parent), ui(new Ui::BlockedModsDialog), m_mods(mods)
|
: QDialog(parent), ui(new Ui::BlockedModsDialog), m_mods(mods), m_hash_type(hash_type)
|
||||||
{
|
{
|
||||||
m_hashing_task = shared_qobject_ptr<ConcurrentTask>(
|
m_hashing_task = shared_qobject_ptr<ConcurrentTask>(
|
||||||
new ConcurrentTask(this, "MakeHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt()));
|
new ConcurrentTask(this, "MakeHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt()));
|
||||||
@ -255,7 +255,7 @@ void BlockedModsDialog::addHashTask(QString path)
|
|||||||
/// @param path the path to the local file being hashed
|
/// @param path the path to the local file being hashed
|
||||||
void BlockedModsDialog::buildHashTask(QString path)
|
void BlockedModsDialog::buildHashTask(QString path)
|
||||||
{
|
{
|
||||||
auto hash_task = Hashing::createBlockedModHasher(path, ModPlatform::ResourceProvider::FLAME, "sha1");
|
auto hash_task = Hashing::createBlockedModHasher(path, ModPlatform::ResourceProvider::FLAME, m_hash_type);
|
||||||
|
|
||||||
qDebug() << "[Blocked Mods Dialog] Creating Hash task for path: " << path;
|
qDebug() << "[Blocked Mods Dialog] Creating Hash task for path: " << path;
|
||||||
|
|
||||||
@ -335,6 +335,13 @@ bool BlockedModsDialog::checkValidPath(QString path)
|
|||||||
|
|
||||||
for (auto& mod : m_mods) {
|
for (auto& mod : m_mods) {
|
||||||
if (compare(filename, mod.name)) {
|
if (compare(filename, mod.name)) {
|
||||||
|
// if the mod is not yet matched and doesn't have a hash then
|
||||||
|
// just match it with the file that has the exact same name
|
||||||
|
if (!mod.matched && mod.hash.isEmpty()) {
|
||||||
|
mod.matched = true;
|
||||||
|
mod.localPath = path;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
qDebug() << "[Blocked Mods Dialog] Name match found:" << mod.name << "| From path:" << path;
|
qDebug() << "[Blocked Mods Dialog] Name match found:" << mod.name << "| From path:" << path;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -54,7 +54,7 @@ class BlockedModsDialog : public QDialog {
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BlockedModsDialog(QWidget* parent, const QString& title, const QString& text, QList<BlockedMod>& mods);
|
BlockedModsDialog(QWidget* parent, const QString& title, const QString& text, QList<BlockedMod>& mods, QString hash_type = "sha1");
|
||||||
|
|
||||||
~BlockedModsDialog() override;
|
~BlockedModsDialog() override;
|
||||||
|
|
||||||
@ -73,6 +73,7 @@ class BlockedModsDialog : public QDialog {
|
|||||||
QSet<QString> m_pending_hash_paths;
|
QSet<QString> m_pending_hash_paths;
|
||||||
bool m_rehash_pending;
|
bool m_rehash_pending;
|
||||||
QPushButton* m_openMissingButton;
|
QPushButton* m_openMissingButton;
|
||||||
|
QString m_hash_type;
|
||||||
|
|
||||||
void openAll(bool missingOnly);
|
void openAll(bool missingOnly);
|
||||||
void addDownloadFolder();
|
void addDownloadFolder();
|
||||||
|
Loading…
Reference in New Issue
Block a user