Download and cache FML libs for legacy minecraft versions.
* minor fix for version filtering (1.5 no longer shows forge for 1.5.1 and 1.5.2) * FML libs are downloaded to mods/minecraftforge/libs and cached * FML libs are copied to instances which contain FML or forge
This commit is contained in:
parent
bf1632e4ed
commit
565dab24b5
@ -470,6 +470,7 @@ void MultiMC::initHttpMetaCache()
|
|||||||
m_metacache->addBase("versions", QDir("versions").absolutePath());
|
m_metacache->addBase("versions", QDir("versions").absolutePath());
|
||||||
m_metacache->addBase("libraries", QDir("libraries").absolutePath());
|
m_metacache->addBase("libraries", QDir("libraries").absolutePath());
|
||||||
m_metacache->addBase("minecraftforge", QDir("mods/minecraftforge").absolutePath());
|
m_metacache->addBase("minecraftforge", QDir("mods/minecraftforge").absolutePath());
|
||||||
|
m_metacache->addBase("fmllibs", QDir("mods/minecraftforge/libs").absolutePath());
|
||||||
m_metacache->addBase("liteloader", QDir("mods/liteloader").absolutePath());
|
m_metacache->addBase("liteloader", QDir("mods/liteloader").absolutePath());
|
||||||
m_metacache->addBase("skins", QDir("accounts/skins").absolutePath());
|
m_metacache->addBase("skins", QDir("accounts/skins").absolutePath());
|
||||||
m_metacache->addBase("root", QDir(root()).absolutePath());
|
m_metacache->addBase("root", QDir(root()).absolutePath());
|
||||||
|
@ -100,7 +100,9 @@ void VersionSelectDialog::on_refreshButton_clicked()
|
|||||||
void VersionSelectDialog::setFilter(int column, QString filter)
|
void VersionSelectDialog::setFilter(int column, QString filter)
|
||||||
{
|
{
|
||||||
m_proxyModel->setFilterKeyColumn(column);
|
m_proxyModel->setFilterKeyColumn(column);
|
||||||
m_proxyModel->setFilterFixedString(filter);
|
// m_proxyModel->setFilterFixedString(filter);
|
||||||
|
m_proxyModel->setFilterRegExp(QRegExp(QString("^%1$").arg(filter.replace(".", "\\.")),
|
||||||
|
Qt::CaseInsensitive, QRegExp::RegExp));
|
||||||
/*
|
/*
|
||||||
QStringList filteredTypes;
|
QStringList filteredTypes;
|
||||||
if (!ui->filterSnapshotsCheckbox->isChecked())
|
if (!ui->filterSnapshotsCheckbox->isChecked())
|
||||||
|
@ -159,6 +159,11 @@ QString LegacyInstance::binDir() const
|
|||||||
return PathCombine(minecraftRoot(), "bin");
|
return PathCombine(minecraftRoot(), "bin");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString LegacyInstance::libDir() const
|
||||||
|
{
|
||||||
|
return PathCombine(minecraftRoot(), "lib");
|
||||||
|
}
|
||||||
|
|
||||||
QString LegacyInstance::savesDir() const
|
QString LegacyInstance::savesDir() const
|
||||||
{
|
{
|
||||||
return PathCombine(minecraftRoot(), "saves");
|
return PathCombine(minecraftRoot(), "saves");
|
||||||
|
@ -41,6 +41,7 @@ public:
|
|||||||
std::shared_ptr<ModList> texturePackList();
|
std::shared_ptr<ModList> texturePackList();
|
||||||
|
|
||||||
////// Directories //////
|
////// Directories //////
|
||||||
|
QString libDir() const;
|
||||||
QString savesDir() const;
|
QString savesDir() const;
|
||||||
QString texturePacksDir() const;
|
QString texturePacksDir() const;
|
||||||
QString jarModsDir() const;
|
QString jarModsDir() const;
|
||||||
|
@ -26,9 +26,56 @@
|
|||||||
#include <JlCompress.h>
|
#include <JlCompress.h>
|
||||||
#include "logger/QsLog.h"
|
#include "logger/QsLog.h"
|
||||||
#include "logic/net/URLConstants.h"
|
#include "logic/net/URLConstants.h"
|
||||||
|
#include <QStringList>
|
||||||
|
|
||||||
LegacyUpdate::LegacyUpdate(BaseInstance *inst, QObject *parent) : Task(parent), m_inst(inst)
|
LegacyUpdate::LegacyUpdate(BaseInstance *inst, QObject *parent) : Task(parent), m_inst(inst)
|
||||||
{
|
{
|
||||||
|
// 1.3 - 1.3.2
|
||||||
|
auto libs13 = QList<FMLlib>{
|
||||||
|
{"argo-2.25.jar", "bb672829fde76cb163004752b86b0484bd0a7f4b", false},
|
||||||
|
{"guava-12.0.1.jar", "b8e78b9af7bf45900e14c6f958486b6ca682195f", false},
|
||||||
|
{"asm-all-4.0.jar", "98308890597acb64047f7e896638e0d98753ae82", false}};
|
||||||
|
|
||||||
|
fmlLibsMapping["1.3.2"] = libs13;
|
||||||
|
|
||||||
|
auto libs14 = QList<FMLlib>{
|
||||||
|
{"argo-2.25.jar", "bb672829fde76cb163004752b86b0484bd0a7f4b", false},
|
||||||
|
{"guava-12.0.1.jar", "b8e78b9af7bf45900e14c6f958486b6ca682195f", false},
|
||||||
|
{"asm-all-4.0.jar", "98308890597acb64047f7e896638e0d98753ae82", false},
|
||||||
|
{"bcprov-jdk15on-147.jar", "b6f5d9926b0afbde9f4dbe3db88c5247be7794bb", false}};
|
||||||
|
|
||||||
|
fmlLibsMapping["1.4"] = libs14;
|
||||||
|
fmlLibsMapping["1.4.1"] = libs14;
|
||||||
|
fmlLibsMapping["1.4.2"] = libs14;
|
||||||
|
fmlLibsMapping["1.4.3"] = libs14;
|
||||||
|
fmlLibsMapping["1.4.4"] = libs14;
|
||||||
|
fmlLibsMapping["1.4.5"] = libs14;
|
||||||
|
fmlLibsMapping["1.4.6"] = libs14;
|
||||||
|
fmlLibsMapping["1.4.7"] = libs14;
|
||||||
|
|
||||||
|
fmlLibsMapping["1.5"] = QList<FMLlib>{
|
||||||
|
{"argo-small-3.2.jar", "58912ea2858d168c50781f956fa5b59f0f7c6b51", false},
|
||||||
|
{"guava-14.0-rc3.jar", "931ae21fa8014c3ce686aaa621eae565fefb1a6a", false},
|
||||||
|
{"asm-all-4.1.jar", "054986e962b88d8660ae4566475658469595ef58", false},
|
||||||
|
{"bcprov-jdk15on-148.jar", "960dea7c9181ba0b17e8bab0c06a43f0a5f04e65", true},
|
||||||
|
{"deobfuscation_data_1.5.zip", "5f7c142d53776f16304c0bbe10542014abad6af8", false},
|
||||||
|
{"scala-library.jar", "458d046151ad179c85429ed7420ffb1eaf6ddf85", true}};
|
||||||
|
|
||||||
|
fmlLibsMapping["1.5.1"] = QList<FMLlib>{
|
||||||
|
{"argo-small-3.2.jar", "58912ea2858d168c50781f956fa5b59f0f7c6b51", false},
|
||||||
|
{"guava-14.0-rc3.jar", "931ae21fa8014c3ce686aaa621eae565fefb1a6a", false},
|
||||||
|
{"asm-all-4.1.jar", "054986e962b88d8660ae4566475658469595ef58", false},
|
||||||
|
{"bcprov-jdk15on-148.jar", "960dea7c9181ba0b17e8bab0c06a43f0a5f04e65", true},
|
||||||
|
{"deobfuscation_data_1.5.1.zip", "22e221a0d89516c1f721d6cab056a7e37471d0a6", false},
|
||||||
|
{"scala-library.jar", "458d046151ad179c85429ed7420ffb1eaf6ddf85", true}};
|
||||||
|
|
||||||
|
fmlLibsMapping["1.5.2"] = QList<FMLlib>{
|
||||||
|
{"argo-small-3.2.jar", "58912ea2858d168c50781f956fa5b59f0f7c6b51", false},
|
||||||
|
{"guava-14.0-rc3.jar", "931ae21fa8014c3ce686aaa621eae565fefb1a6a", false},
|
||||||
|
{"asm-all-4.1.jar", "054986e962b88d8660ae4566475658469595ef58", false},
|
||||||
|
{"bcprov-jdk15on-148.jar", "960dea7c9181ba0b17e8bab0c06a43f0a5f04e65", true},
|
||||||
|
{"deobfuscation_data_1.5.2.zip", "446e55cd986582c70fcf12cb27bc00114c5adfd9", false},
|
||||||
|
{"scala-library.jar", "458d046151ad179c85429ed7420ffb1eaf6ddf85", true}};
|
||||||
}
|
}
|
||||||
|
|
||||||
void LegacyUpdate::executeTask()
|
void LegacyUpdate::executeTask()
|
||||||
@ -50,10 +97,130 @@ void LegacyUpdate::executeTask()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
*/
|
*/
|
||||||
lwjglStart();
|
fmllibsStart();
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LegacyUpdate::fmllibsStart()
|
||||||
|
{
|
||||||
|
// Get the mod list
|
||||||
|
LegacyInstance *inst = (LegacyInstance *)m_inst;
|
||||||
|
auto modList = inst->jarModList();
|
||||||
|
|
||||||
|
bool forge_present = false;
|
||||||
|
|
||||||
|
QString version = inst->intendedVersionId();
|
||||||
|
if (!fmlLibsMapping.contains(version))
|
||||||
|
{
|
||||||
|
lwjglStart();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto &libList = fmlLibsMapping[version];
|
||||||
|
|
||||||
|
// determine if we need some libs for FML or forge
|
||||||
|
setStatus(tr("Checking for FML libraries..."));
|
||||||
|
for (unsigned i = 0; i < modList->size(); i++)
|
||||||
|
{
|
||||||
|
auto &mod = modList->operator[](i);
|
||||||
|
|
||||||
|
// do not use disabled mods.
|
||||||
|
if (!mod.enabled())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (mod.type() != Mod::MOD_ZIPFILE)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (mod.mmc_id().contains("forge", Qt::CaseInsensitive))
|
||||||
|
{
|
||||||
|
forge_present = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (mod.mmc_id().contains("fml", Qt::CaseInsensitive))
|
||||||
|
{
|
||||||
|
forge_present = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// we don't...
|
||||||
|
if (!forge_present)
|
||||||
|
{
|
||||||
|
lwjglStart();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// now check the lib folder inside the instance for files.
|
||||||
|
for (auto &lib : libList)
|
||||||
|
{
|
||||||
|
QFileInfo libInfo(PathCombine(inst->libDir(), lib.name));
|
||||||
|
if (libInfo.exists())
|
||||||
|
continue;
|
||||||
|
fmlLibsToProcess.append(lib);
|
||||||
|
}
|
||||||
|
|
||||||
|
// if everything is in place, there's nothing to do here...
|
||||||
|
if (fmlLibsToProcess.isEmpty())
|
||||||
|
{
|
||||||
|
lwjglStart();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// download missing libs to our place
|
||||||
|
setStatus(tr("Dowloading FML libraries..."));
|
||||||
|
auto dljob = new NetJob("FML libraries");
|
||||||
|
auto metacache = MMC->metacache();
|
||||||
|
for (auto &lib : fmlLibsToProcess)
|
||||||
|
{
|
||||||
|
auto entry = metacache->resolveEntry("fmllibs", lib.name);
|
||||||
|
QString urlString = lib.ours ? URLConstants::FMLLIBS_OUR_BASE_URL + lib.name
|
||||||
|
: URLConstants::FMLLIBS_FORGE_BASE_URL + lib.name;
|
||||||
|
dljob->addNetAction(CacheDownload::make(QUrl(urlString), entry));
|
||||||
|
}
|
||||||
|
|
||||||
|
connect(dljob, SIGNAL(succeeded()), SLOT(fmllibsFinished()));
|
||||||
|
connect(dljob, SIGNAL(failed()), SLOT(fmllibsFailed()));
|
||||||
|
connect(dljob, SIGNAL(progress(qint64, qint64)), SIGNAL(progress(qint64, qint64)));
|
||||||
|
legacyDownloadJob.reset(dljob);
|
||||||
|
legacyDownloadJob->start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LegacyUpdate::fmllibsFinished()
|
||||||
|
{
|
||||||
|
legacyDownloadJob.reset();
|
||||||
|
if(!fmlLibsToProcess.isEmpty())
|
||||||
|
{
|
||||||
|
setStatus(tr("Copying FML libraries into the instance..."));
|
||||||
|
LegacyInstance *inst = (LegacyInstance *)m_inst;
|
||||||
|
auto metacache = MMC->metacache();
|
||||||
|
int index = 0;
|
||||||
|
for (auto &lib : fmlLibsToProcess)
|
||||||
|
{
|
||||||
|
progress(index, fmlLibsToProcess.size());
|
||||||
|
auto entry = metacache->resolveEntry("fmllibs", lib.name);
|
||||||
|
auto path = PathCombine(inst->libDir(), lib.name);
|
||||||
|
if(!ensureFilePathExists(path))
|
||||||
|
{
|
||||||
|
emitFailed(tr("Failed creating FML library folder inside the instance."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!QFile::copy(entry->getFullPath(), PathCombine(inst->libDir(), lib.name)))
|
||||||
|
{
|
||||||
|
emitFailed(tr("Failed copying Forge/FML library: %1.").arg(lib.name));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
progress(index, fmlLibsToProcess.size());
|
||||||
|
}
|
||||||
|
lwjglStart();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LegacyUpdate::fmllibsFailed()
|
||||||
|
{
|
||||||
|
emitFailed("Game update failed: it was impossible to fetch the required FML libraries.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
void LegacyUpdate::lwjglStart()
|
void LegacyUpdate::lwjglStart()
|
||||||
{
|
{
|
||||||
LegacyInstance *inst = (LegacyInstance *)m_inst;
|
LegacyInstance *inst = (LegacyInstance *)m_inst;
|
||||||
|
@ -27,6 +27,13 @@ class BaseInstance;
|
|||||||
class QuaZip;
|
class QuaZip;
|
||||||
class Mod;
|
class Mod;
|
||||||
|
|
||||||
|
struct FMLlib
|
||||||
|
{
|
||||||
|
QString name;
|
||||||
|
QString checksum;
|
||||||
|
bool ours;
|
||||||
|
};
|
||||||
|
|
||||||
class LegacyUpdate : public Task
|
class LegacyUpdate : public Task
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@ -44,6 +51,10 @@ slots:
|
|||||||
void jarFinished();
|
void jarFinished();
|
||||||
void jarFailed();
|
void jarFailed();
|
||||||
|
|
||||||
|
void fmllibsStart();
|
||||||
|
void fmllibsFinished();
|
||||||
|
void fmllibsFailed();
|
||||||
|
|
||||||
void extractLwjgl();
|
void extractLwjgl();
|
||||||
|
|
||||||
void ModTheJar();
|
void ModTheJar();
|
||||||
@ -72,4 +83,6 @@ private:
|
|||||||
private:
|
private:
|
||||||
NetJobPtr legacyDownloadJob;
|
NetJobPtr legacyDownloadJob;
|
||||||
BaseInstance *m_inst = nullptr;
|
BaseInstance *m_inst = nullptr;
|
||||||
|
QList<FMLlib> fmlLibsToProcess;
|
||||||
|
QMap<QString, QList<FMLlib>> fmlLibsMapping;
|
||||||
};
|
};
|
||||||
|
@ -16,4 +16,6 @@ const QString MOJANG_STATUS_URL("http://status.mojang.com/check");
|
|||||||
const QString MOJANG_STATUS_NEWS_URL("http://status.mojang.com/news");
|
const QString MOJANG_STATUS_NEWS_URL("http://status.mojang.com/news");
|
||||||
const QString LITELOADER_URL("http://dl.liteloader.com/versions/versions.json");
|
const QString LITELOADER_URL("http://dl.liteloader.com/versions/versions.json");
|
||||||
const QString IMGUR_BASE_URL("https://api.imgur.com/3/");
|
const QString IMGUR_BASE_URL("https://api.imgur.com/3/");
|
||||||
|
const QString FMLLIBS_OUR_BASE_URL("http://dethware.org/dl/fmllibs/");
|
||||||
|
const QString FMLLIBS_FORGE_BASE_URL("http://files.minecraftforge.net/fmllibs/");
|
||||||
}
|
}
|
@ -34,4 +34,6 @@ extern const QString MOJANG_STATUS_URL;
|
|||||||
extern const QString MOJANG_STATUS_NEWS_URL;
|
extern const QString MOJANG_STATUS_NEWS_URL;
|
||||||
extern const QString LITELOADER_URL;
|
extern const QString LITELOADER_URL;
|
||||||
extern const QString IMGUR_BASE_URL;
|
extern const QString IMGUR_BASE_URL;
|
||||||
|
extern const QString FMLLIBS_OUR_BASE_URL;
|
||||||
|
extern const QString FMLLIBS_FORGE_BASE_URL;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user