From 8ace5fa91d7abaadc00758e1f6eeb692f424a8ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sat, 22 Apr 2017 18:51:04 +0200 Subject: NOISSUE Add flame. --- api/logic/CMakeLists.txt | 10 +-- api/logic/InstanceImportTask.cpp | 57 ++++++++++-------- api/logic/InstanceImportTask.h | 6 +- api/logic/minecraft/curse/FileResolvingTask.cpp | 66 -------------------- api/logic/minecraft/curse/FileResolvingTask.h | 32 ---------- api/logic/minecraft/curse/PackManifest.cpp | 67 --------------------- api/logic/minecraft/curse/PackManifest.h | 46 -------------- api/logic/minecraft/flame/FileResolvingTask.cpp | 66 ++++++++++++++++++++ api/logic/minecraft/flame/FileResolvingTask.h | 32 ++++++++++ api/logic/minecraft/flame/PackManifest.cpp | 67 +++++++++++++++++++++ api/logic/minecraft/flame/PackManifest.h | 46 ++++++++++++++ .../resources/multimc/128x128/instances/flame.png | Bin 0 -> 3375 bytes .../resources/multimc/32x32/instances/flame.png | Bin 0 -> 849 bytes application/resources/multimc/multimc.qrc | 3 + application/resources/sources/flame.svg | 51 ++++++++++++++++ 15 files changed, 304 insertions(+), 245 deletions(-) delete mode 100644 api/logic/minecraft/curse/FileResolvingTask.cpp delete mode 100644 api/logic/minecraft/curse/FileResolvingTask.h delete mode 100644 api/logic/minecraft/curse/PackManifest.cpp delete mode 100644 api/logic/minecraft/curse/PackManifest.h create mode 100644 api/logic/minecraft/flame/FileResolvingTask.cpp create mode 100644 api/logic/minecraft/flame/FileResolvingTask.h create mode 100644 api/logic/minecraft/flame/PackManifest.cpp create mode 100644 api/logic/minecraft/flame/PackManifest.h create mode 100644 application/resources/multimc/128x128/instances/flame.png create mode 100644 application/resources/multimc/32x32/instances/flame.png create mode 100644 application/resources/sources/flame.svg diff --git a/api/logic/CMakeLists.txt b/api/logic/CMakeLists.txt index fa1a9f57..096af6b1 100644 --- a/api/logic/CMakeLists.txt +++ b/api/logic/CMakeLists.txt @@ -291,11 +291,11 @@ set(MINECRAFT_SOURCES minecraft/ftb/FTBPlugin.h minecraft/ftb/FTBPlugin.cpp - # Curse - minecraft/curse/PackManifest.h - minecraft/curse/PackManifest.cpp - minecraft/curse/FileResolvingTask.h - minecraft/curse/FileResolvingTask.cpp + # Flame + minecraft/flame/PackManifest.h + minecraft/flame/PackManifest.cpp + minecraft/flame/FileResolvingTask.h + minecraft/flame/FileResolvingTask.cpp # Assets minecraft/AssetsUtils.h diff --git a/api/logic/InstanceImportTask.cpp b/api/logic/InstanceImportTask.cpp index 2005b61f..f1b3d5aa 100644 --- a/api/logic/InstanceImportTask.cpp +++ b/api/logic/InstanceImportTask.cpp @@ -11,9 +11,9 @@ #include "icons/IIconList.h" #include -// FIXME: this does not belong here, it's Minecraft/Curse specific -#include "minecraft/curse/FileResolvingTask.h" -#include "minecraft/curse/PackManifest.h" +// FIXME: this does not belong here, it's Minecraft/Flame specific +#include "minecraft/flame/FileResolvingTask.h" +#include "minecraft/flame/PackManifest.h" #include "Json.h" InstanceImportTask::InstanceImportTask(SettingsObjectPtr settings, const QUrl sourceUrl, BaseInstanceProvider * target, @@ -147,16 +147,16 @@ void InstanceImportTask::extractFinished() } const QFileInfo instanceCfgFile = findRecursive(extractDir.absolutePath(), "instance.cfg"); - const QFileInfo curseJson = findRecursive(extractDir.absolutePath(), "manifest.json"); + const QFileInfo flameJson = findRecursive(extractDir.absolutePath(), "manifest.json"); if (instanceCfgFile.isFile()) { qDebug() << "Pack appears to be exported from MultiMC."; processMultiMC(instanceCfgFile); } - else if (curseJson.isFile()) + else if (flameJson.isFile()) { - qDebug() << "Pack appears to be from Curse."; - processCurse(curseJson); + qDebug() << "Pack appears to be from 'Flame'."; + processFlame(flameJson); } else { @@ -173,7 +173,7 @@ void InstanceImportTask::extractAborted() return; } -void InstanceImportTask::processCurse(const QFileInfo & manifest) +void InstanceImportTask::processFlame(const QFileInfo & manifest) { const static QMap forgemap = { {"1.2.5", "3.4.9.171"}, @@ -181,15 +181,15 @@ void InstanceImportTask::processCurse(const QFileInfo & manifest) {"1.4.7", "6.6.2.534"}, {"1.5.2", "7.8.1.737"} }; - Curse::Manifest pack; + Flame::Manifest pack; try { - Curse::loadManifest(pack, manifest.absoluteFilePath()); + Flame::loadManifest(pack, manifest.absoluteFilePath()); } catch (JSONValidationError & e) { m_target->destroyStagingPath(m_stagingPath); - emitFailed(tr("Could not understand curse manifest:\n") + e.cause()); + emitFailed(tr("Could not understand pack manifest:\n") + e.cause()); return; } m_packRoot = manifest.absolutePath(); @@ -200,7 +200,7 @@ void InstanceImportTask::processCurse(const QFileInfo & manifest) if (!QFile::rename(overridePath, mcPath)) { m_target->destroyStagingPath(m_stagingPath); - emitFailed(tr("Could not rename the curse overrides:\n") + pack.overrides); + emitFailed(tr("Could not rename the overrides folder:\n") + pack.overrides); return; } } @@ -215,7 +215,7 @@ void InstanceImportTask::processCurse(const QFileInfo & manifest) forgeVersion = id; continue; } - qWarning() << "Unknown mod loader in curse manifest:" << id; + qWarning() << "Unknown mod loader in manifest:" << id; } QString configPath = FS::PathCombine(m_packRoot, "instance.cfg"); @@ -224,11 +224,11 @@ void InstanceImportTask::processCurse(const QFileInfo & manifest) instanceSettings->set("InstanceType", "OneSix"); OneSixInstance instance(m_globalSettings, instanceSettings, m_packRoot); auto mcVersion = pack.minecraft.version; - // Hack to correct some 'special curse sauce'... + // Hack to correct some 'special sauce'... if(mcVersion.endsWith('.')) { mcVersion.remove(QRegExp("[.]+$")); - qWarning() << "Mysterious trailing dots removed from Minecraft version while importing Curse pack."; + qWarning() << "Mysterious trailing dots removed from Minecraft version while importing pack."; } instance.setComponentVersion("net.minecraft", mcVersion); if(!forgeVersion.isEmpty()) @@ -261,6 +261,11 @@ void InstanceImportTask::processCurse(const QFileInfo & manifest) { instance.setIconKey("ftb_logo"); } + else + { + // default to something other than the MultiMC default to distinguish these + instance.setIconKey("flame"); + } } instance.init(); QString jarmodsPath = FS::PathCombine(m_packRoot, "minecraft", "jarmods"); @@ -282,18 +287,18 @@ void InstanceImportTask::processCurse(const QFileInfo & manifest) FS::deletePath(jarmodsPath); } instance.setName(m_instName); - m_curseResolver.reset(new Curse::FileResolvingTask(pack)); - connect(m_curseResolver.get(), &Curse::FileResolvingTask::succeeded, [&]() + m_modIdResolver.reset(new Flame::FileResolvingTask(pack)); + connect(m_modIdResolver.get(), &Flame::FileResolvingTask::succeeded, [&]() { - auto results = m_curseResolver->getResults(); - m_filesNetJob.reset(new NetJob(tr("Curse mod download"))); + auto results = m_modIdResolver->getResults(); + m_filesNetJob.reset(new NetJob(tr("Mod download"))); for(auto result: results.files) { auto path = FS::PathCombine(m_packRoot, "minecraft/mods", result.fileName); auto dl = Net::Download::makeFile(result.url,path); m_filesNetJob->addNetAction(dl); } - m_curseResolver.reset(); + m_modIdResolver.reset(); connect(m_filesNetJob.get(), &NetJob::succeeded, this, [&]() { m_filesNetJob.reset(); @@ -320,21 +325,21 @@ void InstanceImportTask::processCurse(const QFileInfo & manifest) m_filesNetJob->start(); } ); - connect(m_curseResolver.get(), &Curse::FileResolvingTask::failed, [&](QString reason) + connect(m_modIdResolver.get(), &Flame::FileResolvingTask::failed, [&](QString reason) { m_target->destroyStagingPath(m_stagingPath); - m_curseResolver.reset(); - emitFailed(tr("Unable to resolve Curse mod IDs:\n") + reason); + m_modIdResolver.reset(); + emitFailed(tr("Unable to resolve mod IDs:\n") + reason); }); - connect(m_curseResolver.get(), &Curse::FileResolvingTask::progress, [&](qint64 current, qint64 total) + connect(m_modIdResolver.get(), &Flame::FileResolvingTask::progress, [&](qint64 current, qint64 total) { setProgress(current, total); }); - connect(m_curseResolver.get(), &Curse::FileResolvingTask::status, [&](QString status) + connect(m_modIdResolver.get(), &Flame::FileResolvingTask::status, [&](QString status) { setStatus(status); }); - m_curseResolver->start(); + m_modIdResolver->start(); } void InstanceImportTask::processMultiMC(const QFileInfo & config) diff --git a/api/logic/InstanceImportTask.h b/api/logic/InstanceImportTask.h index a1c1857d..d5192299 100644 --- a/api/logic/InstanceImportTask.h +++ b/api/logic/InstanceImportTask.h @@ -10,7 +10,7 @@ #include "QObjectPtr.h" class BaseInstanceProvider; -namespace Curse +namespace Flame { class FileResolvingTask; } @@ -29,7 +29,7 @@ protected: private: void extractAndTweak(); void processMultiMC(const QFileInfo &config); - void processCurse(const QFileInfo &manifest); + void processFlame(const QFileInfo &manifest); private slots: void downloadSucceeded(); @@ -41,7 +41,7 @@ private slots: private: /* data */ SettingsObjectPtr m_globalSettings; NetJobPtr m_filesNetJob; - shared_qobject_ptr m_curseResolver; + shared_qobject_ptr m_modIdResolver; QUrl m_sourceUrl; BaseInstanceProvider * m_target; QString m_archivePath; diff --git a/api/logic/minecraft/curse/FileResolvingTask.cpp b/api/logic/minecraft/curse/FileResolvingTask.cpp deleted file mode 100644 index aaac404b..00000000 --- a/api/logic/minecraft/curse/FileResolvingTask.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include "FileResolvingTask.h" -#include "Json.h" - -const char * metabase = "https://cursemeta.dries007.net"; - -Curse::FileResolvingTask::FileResolvingTask(Curse::Manifest& toProcess) - : m_toProcess(toProcess) -{ -} - -void Curse::FileResolvingTask::executeTask() -{ - setStatus(tr("Resolving curse mod IDs...")); - setProgress(0, m_toProcess.files.size()); - m_dljob.reset(new NetJob("Curse file resolver")); - results.resize(m_toProcess.files.size()); - int index = 0; - for(auto & file: m_toProcess.files) - { - auto projectIdStr = QString::number(file.projectId); - auto fileIdStr = QString::number(file.fileId); - QString metaurl = QString("%1/%2/%3.json").arg(metabase, projectIdStr, fileIdStr); - auto dl = Net::Download::makeByteArray(QUrl(metaurl), &results[index]); - m_dljob->addNetAction(dl); - index ++; - } - connect(m_dljob.get(), &NetJob::finished, this, &Curse::FileResolvingTask::netJobFinished); - m_dljob->start(); -} - -void Curse::FileResolvingTask::netJobFinished() -{ - bool failed = false; - int index = 0; - for(auto & bytes: results) - { - try - { - auto doc = Json::requireDocument(bytes); - auto obj = Json::requireObject(doc); - // result code signifies true failure. - if(obj.contains("code")) - { - failed = true; - continue; - } - auto & out = m_toProcess.files[index]; - out.fileName = Json::requireString(obj, "FileNameOnDisk"); - out.url = Json::requireString(obj, "DownloadURL"); - out.resolved = true; - } - catch(JSONValidationError & e) - { - failed = true; - } - index++; - } - if(!failed) - { - emitSucceeded(); - } - else - { - emitFailed(tr("Some curse ID resolving tasks failed.")); - } -} diff --git a/api/logic/minecraft/curse/FileResolvingTask.h b/api/logic/minecraft/curse/FileResolvingTask.h deleted file mode 100644 index a9357bfb..00000000 --- a/api/logic/minecraft/curse/FileResolvingTask.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include "tasks/Task.h" -#include "net/NetJob.h" -#include "PackManifest.h" - -#include "multimc_logic_export.h" - -namespace Curse -{ -class MULTIMC_LOGIC_EXPORT FileResolvingTask : public Task -{ - Q_OBJECT -public: - explicit FileResolvingTask(Curse::Manifest &toProcess); - const Curse::Manifest &getResults() const - { - return m_toProcess; - } - -protected: - virtual void executeTask() override; - -protected slots: - void netJobFinished(); - -private: /* data */ - Curse::Manifest m_toProcess; - QVector results; - NetJobPtr m_dljob; -}; -} diff --git a/api/logic/minecraft/curse/PackManifest.cpp b/api/logic/minecraft/curse/PackManifest.cpp deleted file mode 100644 index 7d9c2f89..00000000 --- a/api/logic/minecraft/curse/PackManifest.cpp +++ /dev/null @@ -1,67 +0,0 @@ -#include "PackManifest.h" -#include "Json.h" - -static void loadFileV1(Curse::File & f, QJsonObject & file) -{ - f.projectId = Json::requireInteger(file, "projectID"); - f.fileId = Json::requireInteger(file, "fileID"); - // FIXME: what does this mean? - f.required = Json::ensureBoolean(file, QString("required"), true); -} - -static void loadModloaderV1(Curse::Modloader & m, QJsonObject & modLoader) -{ - m.id = Json::requireString(modLoader, "id"); - m.primary = Json::ensureBoolean(modLoader, QString("primary"), false); -} - -static void loadMinecraftV1(Curse::Minecraft & m, QJsonObject & minecraft) -{ - m.version = Json::requireString(minecraft, "version"); - // extra libraries... apparently only used for a custom Minecraft launcher in the 1.2.5 FTB retro pack - // intended use is likely hardcoded in the Curse client, the manifest says nothing - m.libraries = Json::ensureString(minecraft, QString("libraries"), QString()); - auto arr = Json::ensureArray(minecraft, "modLoaders", QJsonArray()); - for (const auto & item : arr) - { - auto obj = Json::requireObject(item); - Curse::Modloader loader; - loadModloaderV1(loader, obj); - m.modLoaders.append(loader); - } -} - -static void loadManifestV1(Curse::Manifest & m, QJsonObject & manifest) -{ - auto mc = Json::requireObject(manifest, "minecraft"); - loadMinecraftV1(m.minecraft, mc); - m.name = Json::ensureString(manifest, QString("name"), "Unnamed"); - m.version = Json::ensureString(manifest, QString("version"), QString()); - m.author = Json::ensureString(manifest, QString("author"), "Anonymous Coward"); - auto arr = Json::ensureArray(manifest, "files", QJsonArray()); - for (const auto & item : arr) - { - auto obj = Json::requireObject(item); - Curse::File file; - loadFileV1(file, obj); - m.files.append(file); - } - m.overrides = Json::ensureString(manifest, "overrides", "overrides"); -} - -void Curse::loadManifest(Curse::Manifest & m, const QString &filepath) -{ - auto doc = Json::requireDocument(filepath); - auto obj = Json::requireObject(doc); - m.manifestType = Json::requireString(obj, "manifestType"); - if(m.manifestType != "minecraftModpack") - { - throw JSONValidationError("Not a Curse modpack manifest!"); - } - m.manifestVersion = Json::requireInteger(obj, "manifestVersion"); - if(m.manifestVersion != 1) - { - throw JSONValidationError(QString("Unknown manifest version (%1)").arg(m.manifestVersion)); - } - loadManifestV1(m, obj); -} diff --git a/api/logic/minecraft/curse/PackManifest.h b/api/logic/minecraft/curse/PackManifest.h deleted file mode 100644 index 36e05cc2..00000000 --- a/api/logic/minecraft/curse/PackManifest.h +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once - -#include -#include - -namespace Curse -{ -struct File -{ - int projectId = 0; - int fileId = 0; - bool required = true; - - // our - bool resolved = false; - QString fileName; - QString url; -}; - -struct Modloader -{ - QString id; - bool primary = false; -}; - -struct Minecraft -{ - QString version; - QString libraries; - QVector modLoaders; -}; - -struct Manifest -{ - QString manifestType; - int manifestVersion = 0; - Curse::Minecraft minecraft; - QString name; - QString version; - QString author; - QVector files; - QString overrides; -}; - -void loadManifest(Curse::Manifest & m, const QString &filepath); -} diff --git a/api/logic/minecraft/flame/FileResolvingTask.cpp b/api/logic/minecraft/flame/FileResolvingTask.cpp new file mode 100644 index 00000000..582e4a07 --- /dev/null +++ b/api/logic/minecraft/flame/FileResolvingTask.cpp @@ -0,0 +1,66 @@ +#include "FileResolvingTask.h" +#include "Json.h" + +const char * metabase = "https://cursemeta.dries007.net"; + +Flame::FileResolvingTask::FileResolvingTask(Flame::Manifest& toProcess) + : m_toProcess(toProcess) +{ +} + +void Flame::FileResolvingTask::executeTask() +{ + setStatus(tr("Resolving mod IDs...")); + setProgress(0, m_toProcess.files.size()); + m_dljob.reset(new NetJob("Mod id resolver")); + results.resize(m_toProcess.files.size()); + int index = 0; + for(auto & file: m_toProcess.files) + { + auto projectIdStr = QString::number(file.projectId); + auto fileIdStr = QString::number(file.fileId); + QString metaurl = QString("%1/%2/%3.json").arg(metabase, projectIdStr, fileIdStr); + auto dl = Net::Download::makeByteArray(QUrl(metaurl), &results[index]); + m_dljob->addNetAction(dl); + index ++; + } + connect(m_dljob.get(), &NetJob::finished, this, &Flame::FileResolvingTask::netJobFinished); + m_dljob->start(); +} + +void Flame::FileResolvingTask::netJobFinished() +{ + bool failed = false; + int index = 0; + for(auto & bytes: results) + { + try + { + auto doc = Json::requireDocument(bytes); + auto obj = Json::requireObject(doc); + // result code signifies true failure. + if(obj.contains("code")) + { + failed = true; + continue; + } + auto & out = m_toProcess.files[index]; + out.fileName = Json::requireString(obj, "FileNameOnDisk"); + out.url = Json::requireString(obj, "DownloadURL"); + out.resolved = true; + } + catch(JSONValidationError & e) + { + failed = true; + } + index++; + } + if(!failed) + { + emitSucceeded(); + } + else + { + emitFailed(tr("Some mod ID resolving tasks failed.")); + } +} diff --git a/api/logic/minecraft/flame/FileResolvingTask.h b/api/logic/minecraft/flame/FileResolvingTask.h new file mode 100644 index 00000000..00658452 --- /dev/null +++ b/api/logic/minecraft/flame/FileResolvingTask.h @@ -0,0 +1,32 @@ +#pragma once + +#include "tasks/Task.h" +#include "net/NetJob.h" +#include "PackManifest.h" + +#include "multimc_logic_export.h" + +namespace Flame +{ +class MULTIMC_LOGIC_EXPORT FileResolvingTask : public Task +{ + Q_OBJECT +public: + explicit FileResolvingTask(Flame::Manifest &toProcess); + const Flame::Manifest &getResults() const + { + return m_toProcess; + } + +protected: + virtual void executeTask() override; + +protected slots: + void netJobFinished(); + +private: /* data */ + Flame::Manifest m_toProcess; + QVector results; + NetJobPtr m_dljob; +}; +} diff --git a/api/logic/minecraft/flame/PackManifest.cpp b/api/logic/minecraft/flame/PackManifest.cpp new file mode 100644 index 00000000..62921493 --- /dev/null +++ b/api/logic/minecraft/flame/PackManifest.cpp @@ -0,0 +1,67 @@ +#include "PackManifest.h" +#include "Json.h" + +static void loadFileV1(Flame::File & f, QJsonObject & file) +{ + f.projectId = Json::requireInteger(file, "projectID"); + f.fileId = Json::requireInteger(file, "fileID"); + // FIXME: what does this mean? + f.required = Json::ensureBoolean(file, QString("required"), true); +} + +static void loadModloaderV1(Flame::Modloader & m, QJsonObject & modLoader) +{ + m.id = Json::requireString(modLoader, "id"); + m.primary = Json::ensureBoolean(modLoader, QString("primary"), false); +} + +static void loadMinecraftV1(Flame::Minecraft & m, QJsonObject & minecraft) +{ + m.version = Json::requireString(minecraft, "version"); + // extra libraries... apparently only used for a custom Minecraft launcher in the 1.2.5 FTB retro pack + // intended use is likely hardcoded in the 'Flame' client, the manifest says nothing + m.libraries = Json::ensureString(minecraft, QString("libraries"), QString()); + auto arr = Json::ensureArray(minecraft, "modLoaders", QJsonArray()); + for (const auto & item : arr) + { + auto obj = Json::requireObject(item); + Flame::Modloader loader; + loadModloaderV1(loader, obj); + m.modLoaders.append(loader); + } +} + +static void loadManifestV1(Flame::Manifest & m, QJsonObject & manifest) +{ + auto mc = Json::requireObject(manifest, "minecraft"); + loadMinecraftV1(m.minecraft, mc); + m.name = Json::ensureString(manifest, QString("name"), "Unnamed"); + m.version = Json::ensureString(manifest, QString("version"), QString()); + m.author = Json::ensureString(manifest, QString("author"), "Anonymous Coward"); + auto arr = Json::ensureArray(manifest, "files", QJsonArray()); + for (const auto & item : arr) + { + auto obj = Json::requireObject(item); + Flame::File file; + loadFileV1(file, obj); + m.files.append(file); + } + m.overrides = Json::ensureString(manifest, "overrides", "overrides"); +} + +void Flame::loadManifest(Flame::Manifest & m, const QString &filepath) +{ + auto doc = Json::requireDocument(filepath); + auto obj = Json::requireObject(doc); + m.manifestType = Json::requireString(obj, "manifestType"); + if(m.manifestType != "minecraftModpack") + { + throw JSONValidationError("Not a modpack manifest!"); + } + m.manifestVersion = Json::requireInteger(obj, "manifestVersion"); + if(m.manifestVersion != 1) + { + throw JSONValidationError(QString("Unknown manifest version (%1)").arg(m.manifestVersion)); + } + loadManifestV1(m, obj); +} diff --git a/api/logic/minecraft/flame/PackManifest.h b/api/logic/minecraft/flame/PackManifest.h new file mode 100644 index 00000000..ae91bffb --- /dev/null +++ b/api/logic/minecraft/flame/PackManifest.h @@ -0,0 +1,46 @@ +#pragma once + +#include +#include + +namespace Flame +{ +struct File +{ + int projectId = 0; + int fileId = 0; + bool required = true; + + // our + bool resolved = false; + QString fileName; + QString url; +}; + +struct Modloader +{ + QString id; + bool primary = false; +}; + +struct Minecraft +{ + QString version; + QString libraries; + QVector modLoaders; +}; + +struct Manifest +{ + QString manifestType; + int manifestVersion = 0; + Flame::Minecraft minecraft; + QString name; + QString version; + QString author; + QVector files; + QString overrides; +}; + +void loadManifest(Flame::Manifest & m, const QString &filepath); +} diff --git a/application/resources/multimc/128x128/instances/flame.png b/application/resources/multimc/128x128/instances/flame.png new file mode 100644 index 00000000..8a50a0b4 Binary files /dev/null and b/application/resources/multimc/128x128/instances/flame.png differ diff --git a/application/resources/multimc/32x32/instances/flame.png b/application/resources/multimc/32x32/instances/flame.png new file mode 100644 index 00000000..d8987338 Binary files /dev/null and b/application/resources/multimc/32x32/instances/flame.png differ diff --git a/application/resources/multimc/multimc.qrc b/application/resources/multimc/multimc.qrc index ef3e9ab6..b4bc5c16 100644 --- a/application/resources/multimc/multimc.qrc +++ b/application/resources/multimc/multimc.qrc @@ -249,6 +249,9 @@ 32x32/instances/ftb_logo.png 128x128/instances/ftb_logo.png + 32x32/instances/flame.png + 128x128/instances/flame.png + 32x32/instances/gear.png 128x128/instances/gear.png diff --git a/application/resources/sources/flame.svg b/application/resources/sources/flame.svg new file mode 100644 index 00000000..8a6da2f7 --- /dev/null +++ b/application/resources/sources/flame.svg @@ -0,0 +1,51 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + -- cgit v1.2.3