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 --- logic/ftb/FTBProfileStrategy.cpp | 163 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 logic/ftb/FTBProfileStrategy.cpp (limited to 'logic/ftb/FTBProfileStrategy.cpp') 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; +} + -- cgit v1.2.3