New, better, liteloader support

This commit is contained in:
Jan Dalheimer
2014-02-19 22:34:17 +01:00
parent 5cf599673d
commit 7146724607
12 changed files with 355 additions and 51 deletions

View File

@ -26,7 +26,6 @@ class BaseInstaller
public:
BaseInstaller();
virtual bool canApply(OneSixInstance *instance) const { return true; }
bool isApplied(OneSixInstance *on);
virtual bool add(OneSixInstance *to);

View File

@ -24,23 +24,9 @@
#include "OneSixLibrary.h"
#include "OneSixInstance.h"
QMap<QString, QString> LiteLoaderInstaller::m_launcherWrapperVersionMapping;
LiteLoaderInstaller::LiteLoaderInstaller()
: BaseInstaller()
LiteLoaderInstaller::LiteLoaderInstaller(LiteLoaderVersionPtr version)
: BaseInstaller(), m_version(version)
{
if (m_launcherWrapperVersionMapping.isEmpty())
{
m_launcherWrapperVersionMapping["1.6.2"] = "1.3";
m_launcherWrapperVersionMapping["1.6.4"] = "1.8";
//m_launcherWrapperVersionMapping["1.7.2"] = "1.8";
//m_launcherWrapperVersionMapping["1.7.4"] = "1.8";
}
}
bool LiteLoaderInstaller::canApply(OneSixInstance *instance) const
{
return m_launcherWrapperVersionMapping.contains(instance->intendedVersionId());
}
bool LiteLoaderInstaller::add(OneSixInstance *to)
@ -53,24 +39,26 @@ bool LiteLoaderInstaller::add(OneSixInstance *to)
QJsonObject obj;
obj.insert("mainClass", QString("net.minecraft.launchwrapper.Launch"));
obj.insert("+tweakers", QJsonArray::fromStringList(QStringList() << "com.mumfrey.liteloader.launch.LiteLoaderTweaker"));
obj.insert("+tweakers", QJsonArray::fromStringList(QStringList() << m_version->tweakClass));
obj.insert("order", 10);
QJsonArray libraries;
// launchwrapper
for (auto libStr : m_version->libraries)
{
OneSixLibrary launchwrapperLib("net.minecraft:launchwrapper:" + m_launcherWrapperVersionMapping[to->intendedVersionId()]);
launchwrapperLib.finalize();
QJsonObject lwLibObj = launchwrapperLib.toJson();
lwLibObj.insert("insert", QString("prepend"));
libraries.append(lwLibObj);
OneSixLibrary lib(libStr);
lib.finalize();
QJsonObject libObj = lib.toJson();
libObj.insert("insert", QString("prepend"));
libraries.append(libObj);
}
// liteloader
{
OneSixLibrary liteloaderLib("com.mumfrey:liteloader:" + to->intendedVersionId());
liteloaderLib.setBaseUrl("http://dl.liteloader.com/versions/");
OneSixLibrary liteloaderLib("com.mumfrey:liteloader:" + m_version->version);
liteloaderLib.setAbsoluteUrl(
QString("http://dl.liteloader.com/versions/com/mumfrey/liteloader/%1/%2")
.arg(m_version->mcVersion, m_version->file));
liteloaderLib.finalize();
QJsonObject llLibObj = liteloaderLib.toJson();
llLibObj.insert("insert", QString("prepend"));
@ -87,7 +75,8 @@ bool LiteLoaderInstaller::add(OneSixInstance *to)
QFile file(filename(to->instanceRoot()));
if (!file.open(QFile::WriteOnly))
{
QLOG_ERROR() << "Error opening" << file.fileName() << "for reading:" << file.errorString();
QLOG_ERROR() << "Error opening" << file.fileName()
<< "for reading:" << file.errorString();
return false;
}
file.write(QJsonDocument(obj).toJson());

View File

@ -20,16 +20,19 @@
#include <QString>
#include <QMap>
#include "logic/lists/LiteLoaderVersionList.h"
class LiteLoaderInstaller : public BaseInstaller
{
public:
LiteLoaderInstaller();
LiteLoaderInstaller(LiteLoaderVersionPtr version);
bool canApply(OneSixInstance *instance) const override;
bool add(OneSixInstance *to) override;
private:
virtual QString id() const override { return "com.mumfrey.liteloader"; }
static QMap<QString, QString> m_launcherWrapperVersionMapping;
virtual QString id() const override
{
return "com.mumfrey.liteloader";
}
LiteLoaderVersionPtr m_version;
};

View File

@ -0,0 +1,190 @@
/* Copyright 2013 MultiMC Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "LiteLoaderVersionList.h"
#include "MultiMC.h"
#include "logic/net/URLConstants.h"
#include <QtXml>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include <QJsonParseError>
#include <QtAlgorithms>
#include <QtNetwork>
LiteLoaderVersionList::LiteLoaderVersionList(QObject *parent) : BaseVersionList(parent)
{
}
Task *LiteLoaderVersionList::getLoadTask()
{
return new LLListLoadTask(this);
}
bool LiteLoaderVersionList::isLoaded()
{
return m_loaded;
}
const BaseVersionPtr LiteLoaderVersionList::at(int i) const
{
return m_vlist.at(i);
}
int LiteLoaderVersionList::count() const
{
return m_vlist.count();
}
static bool cmpVersions(BaseVersionPtr first, BaseVersionPtr second)
{
auto left = std::dynamic_pointer_cast<LiteLoaderVersion>(first);
auto right = std::dynamic_pointer_cast<LiteLoaderVersion>(second);
return left->timestamp > right->timestamp;
}
void LiteLoaderVersionList::sort()
{
beginResetModel();
qSort(m_vlist.begin(), m_vlist.end(), cmpVersions);
endResetModel();
}
BaseVersionPtr LiteLoaderVersionList::getLatestStable() const
{
for (int i = 0; i < m_vlist.length(); i++)
{
auto ver = std::dynamic_pointer_cast<LiteLoaderVersion>(m_vlist.at(i));
if (ver->isLatest)
{
return m_vlist.at(i);
}
}
return BaseVersionPtr();
}
void LiteLoaderVersionList::updateListData(QList<BaseVersionPtr> versions)
{
beginResetModel();
m_vlist = versions;
m_loaded = true;
qSort(m_vlist.begin(), m_vlist.end(), cmpVersions);
endResetModel();
}
LLListLoadTask::LLListLoadTask(LiteLoaderVersionList *vlist)
{
m_list = vlist;
vlistReply = nullptr;
}
LLListLoadTask::~LLListLoadTask()
{
}
void LLListLoadTask::executeTask()
{
setStatus(tr("Loading LiteLoader version list..."));
auto worker = MMC->qnam();
vlistReply = worker->get(QNetworkRequest(QUrl(URLConstants::LITELOADER_URL)));
connect(vlistReply, SIGNAL(finished()), this, SLOT(listDownloaded()));
}
void LLListLoadTask::listDownloaded()
{
if (vlistReply->error() != QNetworkReply::NoError)
{
vlistReply->deleteLater();
emitFailed("Failed to load LiteLoader version list" + vlistReply->errorString());
return;
}
QJsonParseError jsonError;
QJsonDocument jsonDoc = QJsonDocument::fromJson(vlistReply->readAll(), &jsonError);
vlistReply->deleteLater();
if (jsonError.error != QJsonParseError::NoError)
{
emitFailed("Error parsing version list JSON:" + jsonError.errorString());
return;
}
if (!jsonDoc.isObject())
{
emitFailed("Error parsing version list JSON: jsonDoc is not an object");
return;
}
const QJsonObject root = jsonDoc.object();
// Now, get the array of versions.
if (!root.value("versions").isObject())
{
emitFailed("Error parsing version list JSON: missing 'versions' object");
return;
}
const QJsonObject versions = root.value("versions").toObject();
QList<BaseVersionPtr> tempList;
for (auto vIt = versions.begin(); vIt != versions.end(); ++vIt)
{
const QString mcVersion = vIt.key();
QString latest;
const QJsonObject artefacts = vIt.value()
.toObject()
.value("artefacts")
.toObject()
.value("com.mumfrey:liteloader")
.toObject();
QList<BaseVersionPtr> perMcVersionList;
for (auto aIt = artefacts.begin(); aIt != artefacts.end(); ++aIt)
{
const QString identifier = aIt.key();
const QJsonObject artefact = aIt.value().toObject();
if (identifier == "latest")
{
latest = artefact.value("version").toString();
continue;
}
LiteLoaderVersionPtr version(new LiteLoaderVersion());
version->version = artefact.value("version").toString();
version->file = artefact.value("file").toString();
version->mcVersion = mcVersion;
version->md5 = artefact.value("md5").toString();
version->timestamp = artefact.value("timestamp").toDouble();
version->tweakClass = artefact.value("tweakClass").toString();
const QJsonArray libs = artefact.value("libraries").toArray();
for (auto lIt = libs.begin(); lIt != libs.end(); ++lIt)
{
version->libraries.append((*lIt).toObject().value("name").toString());
}
perMcVersionList.append(version);
}
for (auto version : perMcVersionList)
{
auto v = std::dynamic_pointer_cast<LiteLoaderVersion>(version);
v->isLatest = v->version == latest;
}
tempList.append(perMcVersionList);
}
m_list->updateListData(tempList);
emitSucceeded();
}

View File

@ -0,0 +1,101 @@
/* Copyright 2013 MultiMC Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <QObject>
#include "BaseVersionList.h"
#include "logic/tasks/Task.h"
#include "logic/BaseVersion.h"
class LLListLoadTask;
class QNetworkReply;
class LiteLoaderVersion : public BaseVersion
{
public:
QString descriptor() override
{
if (isLatest)
{
return QObject::tr("Latest");
}
return QString();
}
QString typeString() const override
{
return mcVersion;
}
QString name() override
{
return version;
}
QString version;
QString file;
QString mcVersion;
QString md5;
int timestamp;
bool isLatest;
QString tweakClass;
QStringList libraries;
};
typedef std::shared_ptr<LiteLoaderVersion> LiteLoaderVersionPtr;
class LiteLoaderVersionList : public BaseVersionList
{
Q_OBJECT
public:
friend class LLListLoadTask;
explicit LiteLoaderVersionList(QObject *parent = 0);
virtual Task *getLoadTask();
virtual bool isLoaded();
virtual const BaseVersionPtr at(int i) const;
virtual int count() const;
virtual void sort();
virtual BaseVersionPtr getLatestStable() const;
protected:
QList<BaseVersionPtr> m_vlist;
bool m_loaded = false;
protected
slots:
virtual void updateListData(QList<BaseVersionPtr> versions);
};
class LLListLoadTask : public Task
{
Q_OBJECT
public:
explicit LLListLoadTask(LiteLoaderVersionList *vlist);
~LLListLoadTask();
virtual void executeTask();
protected
slots:
void listDownloaded();
protected:
QNetworkReply *vlistReply;
LiteLoaderVersionList *m_list;
};

View File

@ -53,7 +53,7 @@ int MinecraftVersionList::count() const
return m_vlist.count();
}
bool cmpVersions(BaseVersionPtr first, BaseVersionPtr second)
static bool cmpVersions(BaseVersionPtr first, BaseVersionPtr second)
{
auto left = std::dynamic_pointer_cast<MinecraftVersion>(first);
auto right = std::dynamic_pointer_cast<MinecraftVersion>(second);

View File

@ -33,4 +33,5 @@ const QString FORGE_LEGACY_URL("http://files.minecraftforge.net/minecraftforge/j
const QString FORGE_GRADLE_URL("http://files.minecraftforge.net/maven/net/minecraftforge/forge/json");
const QString MOJANG_STATUS_URL("http://status.mojang.com/check");
const QString MOJANG_STATUS_NEWS_URL("http://status.mojang.com/news");
const QString LITELOADER_URL("http://dl.liteloader.com/versions/versions.json");
}