From 865b20057120a61cfd26f5eea9aa68243efc3319 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Fri, 3 Apr 2015 11:55:16 +0200 Subject: GH-856 add profile strategy for FTB packs --- CMakeLists.txt | 2 + logic/ftb/FTBProfileStrategy.cpp | 163 +++++++++++++++++++++++++++++++++++++++ logic/ftb/FTBProfileStrategy.h | 21 +++++ logic/ftb/OneSixFTBInstance.cpp | 12 ++- logic/ftb/OneSixFTBInstance.h | 5 +- 5 files changed, 193 insertions(+), 10 deletions(-) create mode 100644 logic/ftb/FTBProfileStrategy.cpp create mode 100644 logic/ftb/FTBProfileStrategy.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b6230766..4bc06b0e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -557,6 +557,8 @@ SET(MULTIMC_SOURCES logic/ftb/OneSixFTBInstance.cpp logic/ftb/LegacyFTBInstance.h logic/ftb/LegacyFTBInstance.cpp + logic/ftb/FTBProfileStrategy.h + logic/ftb/FTBProfileStrategy.cpp # the screenshots feature logic/screenshots/Screenshot.h diff --git a/logic/ftb/FTBProfileStrategy.cpp b/logic/ftb/FTBProfileStrategy.cpp new file mode 100644 index 00000000..0a4984f7 --- /dev/null +++ b/logic/ftb/FTBProfileStrategy.cpp @@ -0,0 +1,163 @@ +#include "logic/ftb/FTBProfileStrategy.h" +#include "logic/minecraft/VersionBuildError.h" +#include "logic/ftb/OneSixFTBInstance.h" +#include "logic/minecraft/MinecraftVersionList.h" + +#include "MultiMC.h" + +#include +#include +#include +#include +#include + +FTBProfileStrategy::FTBProfileStrategy(OneSixFTBInstance* instance) : OneSixProfileStrategy(instance) +{ +} + +void FTBProfileStrategy::loadDefaultBuiltinPatches() +{ + auto mcVersion = m_instance->intendedVersionId(); + + ProfilePatchPtr minecraftPatch; + { + auto mcJson = m_instance->versionsPath().absoluteFilePath(mcVersion + "/" + mcVersion + ".json"); + // load up the base minecraft patch + if(QFile::exists(mcJson)) + { + auto file = ProfileUtils::parseJsonFile(QFileInfo(mcJson), false); + file->fileId = "net.minecraft"; + file->name = "Minecraft (FTB tracked)"; + if(file->version.isEmpty()) + { + file->version = mcVersion; + } + minecraftPatch = std::dynamic_pointer_cast(file); + } + else + { + throw VersionIncomplete("net.minecraft"); + } + minecraftPatch->setOrder(-2); + } + profile->appendPatch(minecraftPatch); + + ProfilePatchPtr packPatch; + { + auto mcJson = m_instance->minecraftRoot() + "/pack.json"; + // load up the base minecraft patch + if(QFile::exists(mcJson)) + { + auto file = ProfileUtils::parseJsonFile(QFileInfo(mcJson), false, true); + file->fileId = "org.multimc.ftb.pack"; + file->name = QString("%1 (FTB tracked)").arg(m_instance->name()); + if(file->version.isEmpty()) + { + file->version = mcVersion; + } + minecraftPatch = std::dynamic_pointer_cast(file); + } + else + { + throw VersionIncomplete("org.multimc.ftb.pack"); + } + minecraftPatch->setOrder(1); + } + profile->appendPatch(minecraftPatch); + +} + +void FTBProfileStrategy::loadUserPatches() +{ + // load all patches, put into map for ordering, apply in the right order + ProfileUtils::PatchOrder userOrder; + ProfileUtils::readOverrideOrders(PathCombine(m_instance->instanceRoot(), "order.json"), userOrder); + QDir patches(PathCombine(m_instance->instanceRoot(),"patches")); + + // first, load things by sort order. + for (auto id : userOrder) + { + // ignore builtins + if (id == "net.minecraft") + continue; + if (id == "org.lwjgl") + continue; + // parse the file + QString filename = patches.absoluteFilePath(id + ".json"); + QFileInfo finfo(filename); + if(!finfo.exists()) + { + QLOG_INFO() << "Patch file " << filename << " was deleted by external means..."; + continue; + } + QLOG_INFO() << "Reading" << filename << "by user order"; + auto file = ProfileUtils::parseJsonFile(finfo, false); + // sanity check. prevent tampering with files. + if (file->fileId != id) + { + throw VersionBuildError( + QObject::tr("load id %1 does not match internal id %2").arg(id, file->fileId)); + } + profile->appendPatch(file); + } + // now load the rest by internal preference. + QMap> files; + for (auto info : patches.entryInfoList(QStringList() << "*.json", QDir::Files)) + { + // parse the file + QLOG_INFO() << "Reading" << info.fileName(); + auto file = ProfileUtils::parseJsonFile(info, true); + // ignore builtins + if (file->fileId == "net.minecraft") + continue; + if (file->fileId == "org.lwjgl") + continue; + // do not load what we already loaded in the first pass + if (userOrder.contains(file->fileId)) + continue; + if (files.contains(file->order)) + { + // FIXME: do not throw? + throw VersionBuildError(QObject::tr("%1 has the same order as %2") + .arg(file->fileId, files[file->order].second->fileId)); + } + files.insert(file->order, qMakePair(info.fileName(), file)); + } + for (auto order : files.keys()) + { + auto &filePair = files[order]; + profile->appendPatch(filePair.second); + } +} + + +void FTBProfileStrategy::load() +{ + profile->clearPatches(); + + loadDefaultBuiltinPatches(); + loadUserPatches(); + + profile->finalize(); +} + +bool FTBProfileStrategy::saveOrder(ProfileUtils::PatchOrder order) +{ + return false; +} + +bool FTBProfileStrategy::resetOrder() +{ + return false; +} + +bool FTBProfileStrategy::removePatch(ProfilePatchPtr patch) +{ + return false; +} + +bool FTBProfileStrategy::installJarMods(QStringList filepaths) +{ + return false; +} + diff --git a/logic/ftb/FTBProfileStrategy.h b/logic/ftb/FTBProfileStrategy.h new file mode 100644 index 00000000..65f07069 --- /dev/null +++ b/logic/ftb/FTBProfileStrategy.h @@ -0,0 +1,21 @@ +#pragma once +#include "../minecraft/ProfileStrategy.h" +#include "../minecraft/OneSixProfileStrategy.h" + +class OneSixFTBInstance; + +class FTBProfileStrategy : public OneSixProfileStrategy +{ +public: + FTBProfileStrategy(OneSixFTBInstance * instance); + virtual ~FTBProfileStrategy() {}; + virtual void load() override; + virtual bool resetOrder() override; + virtual bool saveOrder(ProfileUtils::PatchOrder order) override; + virtual bool installJarMods(QStringList filepaths) override; + virtual bool removePatch(ProfilePatchPtr patch) override; + +protected: + void loadDefaultBuiltinPatches(); + void loadUserPatches(); +}; diff --git a/logic/ftb/OneSixFTBInstance.cpp b/logic/ftb/OneSixFTBInstance.cpp index d55b1ea9..212b7373 100644 --- a/logic/ftb/OneSixFTBInstance.cpp +++ b/logic/ftb/OneSixFTBInstance.cpp @@ -1,4 +1,5 @@ #include "OneSixFTBInstance.h" +#include "FTBProfileStrategy.h" #include "logic/minecraft/MinecraftProfile.h" #include "logic/minecraft/OneSixLibrary.h" @@ -109,17 +110,14 @@ QDir OneSixFTBInstance::versionsPath() const return QDir(MMC->settings()->get("FTBRoot").toString() + "/versions"); } -/* -QStringList OneSixFTBInstance::externalPatches() const +bool OneSixFTBInstance::providesVersionFile() const { - return QStringList() << versionsPath().absoluteFilePath(intendedVersionId() + "/" + intendedVersionId() + ".json") - << minecraftRoot() + "/pack.json"; + return true; } -*/ -bool OneSixFTBInstance::providesVersionFile() const +void OneSixFTBInstance::createProfile() { - return true; + m_version.reset(new MinecraftProfile(new FTBProfileStrategy(this))); } QString OneSixFTBInstance::getStatusbarDescription() diff --git a/logic/ftb/OneSixFTBInstance.h b/logic/ftb/OneSixFTBInstance.h index 3419e94c..4a9521e0 100644 --- a/logic/ftb/OneSixFTBInstance.h +++ b/logic/ftb/OneSixFTBInstance.h @@ -14,6 +14,8 @@ public: void copy(const QDir &newDir) override; + virtual void createProfile(); + virtual QString getStatusbarDescription(); virtual std::shared_ptr doUpdate() override; @@ -23,7 +25,4 @@ public: QDir librariesPath() const override; QDir versionsPath() const override; bool providesVersionFile() const override; - -private: - std::shared_ptr m_forge; }; -- cgit v1.2.3