NOISSUE Move FTB logic out of generic code
This commit is contained in:
parent
c7b39fe116
commit
8b4e22bbb8
@ -559,6 +559,8 @@ SET(MULTIMC_SOURCES
|
||||
logic/ftb/LegacyFTBInstance.cpp
|
||||
logic/ftb/FTBProfileStrategy.h
|
||||
logic/ftb/FTBProfileStrategy.cpp
|
||||
logic/ftb/FTBPlugin.h
|
||||
logic/ftb/FTBPlugin.cpp
|
||||
|
||||
# the screenshots feature
|
||||
logic/screenshots/Screenshot.h
|
||||
|
92
MultiMC.cpp
92
MultiMC.cpp
@ -43,10 +43,7 @@
|
||||
|
||||
#include "logic/trans/TranslationDownloader.h"
|
||||
|
||||
#ifdef Q_OS_WIN32
|
||||
#include <windows.h>
|
||||
static const int APPDATA_BUFFER_SIZE = 1024;
|
||||
#endif
|
||||
#include "logic/ftb/FTBPlugin.h"
|
||||
|
||||
using namespace Util::Commandline;
|
||||
|
||||
@ -381,92 +378,7 @@ void MultiMC::initGlobalSettings(bool test_mode)
|
||||
}
|
||||
m_settings->registerSetting("ConsoleFontSize", defaultSize);
|
||||
|
||||
// FTB
|
||||
m_settings->registerSetting("TrackFTBInstances", false);
|
||||
QString ftbDataDefault;
|
||||
#ifdef Q_OS_LINUX
|
||||
QString ftbDefault = ftbDataDefault = QDir::home().absoluteFilePath(".ftblauncher");
|
||||
#elif defined(Q_OS_WIN32)
|
||||
wchar_t buf[APPDATA_BUFFER_SIZE];
|
||||
wchar_t newBuf[APPDATA_BUFFER_SIZE];
|
||||
QString ftbDefault, newFtbDefault, oldFtbDefault;
|
||||
if (!GetEnvironmentVariableW(L"LOCALAPPDATA", newBuf, APPDATA_BUFFER_SIZE))
|
||||
{
|
||||
QLOG_FATAL() << "Your LOCALAPPDATA folder is missing! If you are on windows, this "
|
||||
"means your system is broken. If you aren't on windows, how the **** "
|
||||
"are you running the windows build????";
|
||||
}
|
||||
else
|
||||
{
|
||||
newFtbDefault = QDir(QString::fromWCharArray(newBuf)).absoluteFilePath("ftblauncher");
|
||||
}
|
||||
if (!GetEnvironmentVariableW(L"APPDATA", buf, APPDATA_BUFFER_SIZE))
|
||||
{
|
||||
QLOG_FATAL() << "Your APPDATA folder is missing! If you are on windows, this means "
|
||||
"your system is broken. If you aren't on windows, how the **** are you "
|
||||
"running the windows build????";
|
||||
}
|
||||
else
|
||||
{
|
||||
oldFtbDefault = QDir(QString::fromWCharArray(buf)).absoluteFilePath("ftblauncher");
|
||||
}
|
||||
if (QFile::exists(QDir(newFtbDefault).absoluteFilePath("ftblaunch.cfg")))
|
||||
{
|
||||
QLOG_INFO() << "Old FTB setup";
|
||||
ftbDefault = ftbDataDefault = oldFtbDefault;
|
||||
}
|
||||
else
|
||||
{
|
||||
QLOG_INFO() << "New FTB setup";
|
||||
ftbDefault = oldFtbDefault;
|
||||
ftbDataDefault = newFtbDefault;
|
||||
}
|
||||
#elif defined(Q_OS_MAC)
|
||||
QString ftbDefault = ftbDataDefault =
|
||||
PathCombine(QDir::homePath(), "Library/Application Support/ftblauncher");
|
||||
#endif
|
||||
m_settings->registerSetting("FTBLauncherDataRoot", ftbDataDefault);
|
||||
m_settings->registerSetting("FTBLauncherRoot", ftbDefault);
|
||||
QLOG_INFO() << "FTB Launcher paths:" << m_settings->get("FTBLauncherDataRoot").toString()
|
||||
<< "and" << m_settings->get("FTBLauncherRoot").toString();
|
||||
|
||||
m_settings->registerSetting("FTBRoot");
|
||||
if (m_settings->get("FTBRoot").isNull())
|
||||
{
|
||||
QString ftbRoot;
|
||||
QFile f(QDir(m_settings->get("FTBLauncherRoot").toString())
|
||||
.absoluteFilePath("ftblaunch.cfg"));
|
||||
QLOG_INFO() << "Attempting to read" << f.fileName();
|
||||
if (f.open(QFile::ReadOnly))
|
||||
{
|
||||
const QString data = QString::fromLatin1(f.readAll());
|
||||
QRegularExpression exp("installPath=(.*)");
|
||||
ftbRoot = QDir::cleanPath(exp.match(data).captured(1));
|
||||
#ifdef Q_OS_WIN32
|
||||
if (!ftbRoot.isEmpty())
|
||||
{
|
||||
if (ftbRoot.at(0).isLetter() && ftbRoot.size() > 1 && ftbRoot.at(1) == '/')
|
||||
{
|
||||
ftbRoot.remove(1, 1);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (ftbRoot.isEmpty())
|
||||
{
|
||||
QLOG_INFO() << "Failed to get FTB root path";
|
||||
}
|
||||
else
|
||||
{
|
||||
QLOG_INFO() << "FTB is installed at" << ftbRoot;
|
||||
m_settings->set("FTBRoot", ftbRoot);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
QLOG_WARN() << "Couldn't open" << f.fileName() << ":" << f.errorString();
|
||||
QLOG_WARN() << "This is perfectly normal if you don't have FTB installed";
|
||||
}
|
||||
}
|
||||
FTBPlugin::initialize();
|
||||
|
||||
// Folders
|
||||
m_settings->registerSetting("InstanceDir", "instances");
|
||||
|
@ -31,9 +31,6 @@
|
||||
#include "logic/OneSixInstance.h"
|
||||
#include "logic/BaseVersion.h"
|
||||
#include "logic/minecraft/MinecraftVersion.h"
|
||||
#include "logic/ftb/LegacyFTBInstance.h"
|
||||
#include "logic/ftb/OneSixFTBInstance.h"
|
||||
#include "logic/ftb/FTBVersion.h"
|
||||
|
||||
InstanceFactory InstanceFactory::loader;
|
||||
|
||||
@ -59,14 +56,6 @@ InstanceFactory::InstLoadError InstanceFactory::loadInstance(InstancePtr &inst,
|
||||
{
|
||||
inst.reset(new LegacyInstance(instDir, m_settings));
|
||||
}
|
||||
else if (inst_type == "LegacyFTB")
|
||||
{
|
||||
inst.reset(new LegacyFTBInstance(instDir, m_settings));
|
||||
}
|
||||
else if (inst_type == "OneSixFTB")
|
||||
{
|
||||
inst.reset(new OneSixFTBInstance(instDir, m_settings));
|
||||
}
|
||||
else
|
||||
{
|
||||
return InstanceFactory::UnknownLoadError;
|
||||
@ -106,25 +95,6 @@ InstanceFactory::createInstance(InstancePtr &inst, BaseVersionPtr version, const
|
||||
inst->init();
|
||||
return InstanceFactory::NoCreateError;
|
||||
}
|
||||
auto ftbVersion = std::dynamic_pointer_cast<FTBVersion>(version);
|
||||
if(ftbVersion)
|
||||
{
|
||||
auto mcversion = ftbVersion->getMinecraftVersion();
|
||||
if (mcversion->usesLegacyLauncher())
|
||||
{
|
||||
m_settings->set("InstanceType", "LegacyFTB");
|
||||
inst.reset(new LegacyFTBInstance(instDir, m_settings));
|
||||
inst->setIntendedVersionId(mcversion->descriptor());
|
||||
}
|
||||
else
|
||||
{
|
||||
m_settings->set("InstanceType", "OneSixFTB");
|
||||
inst.reset(new OneSixFTBInstance(instDir, m_settings));
|
||||
inst->setIntendedVersionId(mcversion->descriptor());
|
||||
inst->init();
|
||||
}
|
||||
return InstanceFactory::NoCreateError;
|
||||
}
|
||||
delete m_settings;
|
||||
return InstanceFactory::NoSuchVersion;
|
||||
}
|
||||
@ -146,11 +116,6 @@ InstanceFactory::InstCreateError InstanceFactory::copyInstance(InstancePtr &newI
|
||||
settings_obj.registerSetting("InstanceType", "Legacy");
|
||||
QString inst_type = settings_obj.get("InstanceType").toString();
|
||||
|
||||
if (inst_type == "OneSixFTB")
|
||||
settings_obj.set("InstanceType", "OneSix");
|
||||
if (inst_type == "LegacyFTB")
|
||||
settings_obj.set("InstanceType", "Legacy");
|
||||
|
||||
oldInstance->copy(instDir);
|
||||
|
||||
auto error = loadInstance(newInstance, instDir);
|
||||
|
@ -32,7 +32,7 @@
|
||||
#include "logic/minecraft/MinecraftVersionList.h"
|
||||
#include "logic/BaseInstance.h"
|
||||
#include "logic/InstanceFactory.h"
|
||||
#include "ftb/FTBVersion.h"
|
||||
#include "ftb/FTBPlugin.h"
|
||||
#include "logger/QsLog.h"
|
||||
#include "gui/groupview/GroupView.h"
|
||||
|
||||
@ -284,169 +284,6 @@ void InstanceList::loadGroupList(QMap<QString, QString> &groupMap)
|
||||
}
|
||||
}
|
||||
|
||||
QSet<FTBRecord> InstanceList::discoverFTBInstances()
|
||||
{
|
||||
QSet<FTBRecord> records;
|
||||
QDir dir = QDir(MMC->settings()->get("FTBLauncherDataRoot").toString());
|
||||
QDir dataDir = QDir(MMC->settings()->get("FTBRoot").toString());
|
||||
if (!dataDir.exists())
|
||||
{
|
||||
QLOG_INFO() << "The FTB directory specified does not exist. Please check your settings";
|
||||
return records;
|
||||
}
|
||||
else if (!dir.exists())
|
||||
{
|
||||
QLOG_INFO() << "The FTB launcher data directory specified does not exist. Please check your settings";
|
||||
return records;
|
||||
}
|
||||
dir.cd("ModPacks");
|
||||
auto allFiles = dir.entryList(QDir::Readable | QDir::Files, QDir::Name);
|
||||
for (auto filename : allFiles)
|
||||
{
|
||||
if (!filename.endsWith(".xml"))
|
||||
continue;
|
||||
auto fpath = dir.absoluteFilePath(filename);
|
||||
QFile f(fpath);
|
||||
QLOG_INFO() << "Discovering FTB instances -- " << fpath;
|
||||
if (!f.open(QFile::ReadOnly))
|
||||
continue;
|
||||
|
||||
// read the FTB packs XML.
|
||||
QXmlStreamReader reader(&f);
|
||||
while (!reader.atEnd())
|
||||
{
|
||||
switch (reader.readNext())
|
||||
{
|
||||
case QXmlStreamReader::StartElement:
|
||||
{
|
||||
if (reader.name() == "modpack")
|
||||
{
|
||||
QXmlStreamAttributes attrs = reader.attributes();
|
||||
FTBRecord record;
|
||||
record.dirName = attrs.value("dir").toString();
|
||||
record.instanceDir = dataDir.absoluteFilePath(record.dirName);
|
||||
record.templateDir = dir.absoluteFilePath(record.dirName);
|
||||
QDir test(record.instanceDir);
|
||||
QLOG_DEBUG() << dataDir.absolutePath() << record.instanceDir << record.dirName;
|
||||
if (!test.exists())
|
||||
continue;
|
||||
record.name = attrs.value("name").toString();
|
||||
record.logo = attrs.value("logo").toString();
|
||||
auto customVersions = attrs.value("customMCVersions");
|
||||
if(!customVersions.isNull())
|
||||
{
|
||||
QMap<QString, QString> versionMatcher;
|
||||
QString customVersionsStr = customVersions.toString();
|
||||
QStringList list = customVersionsStr.split(';');
|
||||
for(auto item: list)
|
||||
{
|
||||
auto segment = item.split('^');
|
||||
if(segment.size() != 2)
|
||||
{
|
||||
QLOG_ERROR() << "FTB: Segment of size < 2 in " << customVersionsStr;
|
||||
continue;
|
||||
}
|
||||
versionMatcher[segment[0]] = segment[1];
|
||||
}
|
||||
auto actualVersion = attrs.value("version").toString();
|
||||
if(versionMatcher.contains(actualVersion))
|
||||
{
|
||||
record.mcVersion = versionMatcher[actualVersion];
|
||||
}
|
||||
else
|
||||
{
|
||||
record.mcVersion = attrs.value("mcVersion").toString();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
record.mcVersion = attrs.value("mcVersion").toString();
|
||||
}
|
||||
record.description = attrs.value("description").toString();
|
||||
records.insert(record);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case QXmlStreamReader::EndElement:
|
||||
break;
|
||||
case QXmlStreamReader::Characters:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
f.close();
|
||||
}
|
||||
return records;
|
||||
}
|
||||
|
||||
void InstanceList::loadFTBInstances(QMap<QString, QString> &groupMap,
|
||||
QList<InstancePtr> &tempList)
|
||||
{
|
||||
auto records = discoverFTBInstances();
|
||||
if (!records.size())
|
||||
{
|
||||
QLOG_INFO() << "No FTB instances to load.";
|
||||
return;
|
||||
}
|
||||
QLOG_INFO() << "Loading FTB instances! -- got " << records.size();
|
||||
// process the records we acquired.
|
||||
for (auto record : records)
|
||||
{
|
||||
QLOG_INFO() << "Loading FTB instance from " << record.instanceDir;
|
||||
QString iconKey = record.logo;
|
||||
iconKey.remove(QRegularExpression("\\..*"));
|
||||
MMC->icons()->addIcon(iconKey, iconKey, PathCombine(record.templateDir, record.logo),
|
||||
MMCIcon::Transient);
|
||||
|
||||
if (!QFileInfo(PathCombine(record.instanceDir, "instance.cfg")).exists())
|
||||
{
|
||||
QLOG_INFO() << "Converting " << record.name << " as new.";
|
||||
InstancePtr instPtr;
|
||||
auto &factory = InstanceFactory::get();
|
||||
auto mcVersion = std::dynamic_pointer_cast<MinecraftVersion>(MMC->minecraftlist()->findVersion(record.mcVersion));
|
||||
if (!mcVersion)
|
||||
{
|
||||
QLOG_ERROR() << "Can't load instance " << record.instanceDir
|
||||
<< " because minecraft version " << record.mcVersion
|
||||
<< " can't be resolved.";
|
||||
continue;
|
||||
}
|
||||
auto ftbVersion = std::make_shared<FTBVersion>(mcVersion);
|
||||
auto error = factory.createInstance(instPtr, ftbVersion, record.instanceDir);
|
||||
|
||||
if (!instPtr || error != InstanceFactory::NoCreateError)
|
||||
continue;
|
||||
|
||||
instPtr->setGroupInitial("FTB");
|
||||
instPtr->setName(record.name);
|
||||
instPtr->setIconKey(iconKey);
|
||||
instPtr->setIntendedVersionId(record.mcVersion);
|
||||
instPtr->setNotes(record.description);
|
||||
if(!continueProcessInstance(instPtr, error, record.instanceDir, groupMap))
|
||||
continue;
|
||||
tempList.append(InstancePtr(instPtr));
|
||||
}
|
||||
else
|
||||
{
|
||||
QLOG_INFO() << "Loading existing " << record.name;
|
||||
InstancePtr instPtr;
|
||||
auto error = InstanceFactory::get().loadInstance(instPtr, record.instanceDir);
|
||||
if (!instPtr || error != InstanceFactory::NoLoadError)
|
||||
continue;
|
||||
instPtr->setGroupInitial("FTB");
|
||||
instPtr->setName(record.name);
|
||||
instPtr->setIconKey(iconKey);
|
||||
if (instPtr->intendedVersionId() != record.mcVersion)
|
||||
instPtr->setIntendedVersionId(record.mcVersion);
|
||||
instPtr->setNotes(record.description);
|
||||
if(!continueProcessInstance(instPtr, error, record.instanceDir, groupMap))
|
||||
continue;
|
||||
tempList.append(InstancePtr(instPtr));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
InstanceList::InstListError InstanceList::loadList()
|
||||
{
|
||||
// load the instance groups
|
||||
@ -471,10 +308,9 @@ InstanceList::InstListError InstanceList::loadList()
|
||||
}
|
||||
}
|
||||
|
||||
if (MMC->settings()->get("TrackFTBInstances").toBool())
|
||||
{
|
||||
loadFTBInstances(groupMap, tempList);
|
||||
}
|
||||
// FIXME: generalize
|
||||
FTBPlugin::loadInstances(groupMap, tempList);
|
||||
|
||||
beginResetModel();
|
||||
m_instances.clear();
|
||||
for(auto inst: tempList)
|
||||
|
@ -26,33 +26,11 @@ class BaseInstance;
|
||||
|
||||
class QDir;
|
||||
|
||||
struct FTBRecord
|
||||
{
|
||||
QString dirName;
|
||||
QString name;
|
||||
QString logo;
|
||||
QString mcVersion;
|
||||
QString description;
|
||||
QString instanceDir;
|
||||
QString templateDir;
|
||||
bool operator ==(const FTBRecord other) const
|
||||
{
|
||||
return instanceDir == other.instanceDir;
|
||||
}
|
||||
};
|
||||
|
||||
inline uint qHash(FTBRecord record)
|
||||
{
|
||||
return qHash(record.instanceDir);
|
||||
}
|
||||
|
||||
class InstanceList : public QAbstractListModel
|
||||
{
|
||||
Q_OBJECT
|
||||
private:
|
||||
void loadGroupList(QMap<QString, QString> &groupList);
|
||||
QSet<FTBRecord> discoverFTBInstances();
|
||||
void loadFTBInstances(QMap<QString, QString> &groupMap, QList<InstancePtr> & tempList);
|
||||
|
||||
public
|
||||
slots:
|
||||
@ -141,7 +119,8 @@ slots:
|
||||
private:
|
||||
int getInstIndex(BaseInstance *inst) const;
|
||||
|
||||
bool continueProcessInstance(InstancePtr instPtr, const int error, const QDir &dir,
|
||||
public:
|
||||
static bool continueProcessInstance(InstancePtr instPtr, const int error, const QDir &dir,
|
||||
QMap<QString, QString> &groupMap);
|
||||
|
||||
protected:
|
||||
|
361
logic/ftb/FTBPlugin.cpp
Normal file
361
logic/ftb/FTBPlugin.cpp
Normal file
@ -0,0 +1,361 @@
|
||||
#include "FTBPlugin.h"
|
||||
#include "FTBVersion.h"
|
||||
#include "LegacyFTBInstance.h"
|
||||
#include "OneSixFTBInstance.h"
|
||||
#include <logic/BaseInstance.h>
|
||||
#include <logic/icons/IconList.h>
|
||||
#include <logic/InstanceFactory.h>
|
||||
#include <logic/InstanceList.h>
|
||||
#include <logic/minecraft/MinecraftVersionList.h>
|
||||
#include <logic/settings/INISettingsObject.h>
|
||||
#include "MultiMC.h"
|
||||
#include <pathutils.h>
|
||||
#include "QDebug"
|
||||
#include <QXmlStreamReader>
|
||||
#include <QRegularExpression>
|
||||
|
||||
struct FTBRecord
|
||||
{
|
||||
QString dirName;
|
||||
QString name;
|
||||
QString logo;
|
||||
QString mcVersion;
|
||||
QString description;
|
||||
QString instanceDir;
|
||||
QString templateDir;
|
||||
bool operator==(const FTBRecord other) const
|
||||
{
|
||||
return instanceDir == other.instanceDir;
|
||||
}
|
||||
};
|
||||
|
||||
inline uint qHash(FTBRecord record)
|
||||
{
|
||||
return qHash(record.instanceDir);
|
||||
}
|
||||
|
||||
QSet<FTBRecord> discoverFTBInstances()
|
||||
{
|
||||
QSet<FTBRecord> records;
|
||||
QDir dir = QDir(MMC->settings()->get("FTBLauncherDataRoot").toString());
|
||||
QDir dataDir = QDir(MMC->settings()->get("FTBRoot").toString());
|
||||
if (!dataDir.exists())
|
||||
{
|
||||
qDebug() << "The FTB directory specified does not exist. Please check your settings";
|
||||
return records;
|
||||
}
|
||||
else if (!dir.exists())
|
||||
{
|
||||
qDebug() << "The FTB launcher data directory specified does not exist. Please check "
|
||||
"your settings";
|
||||
return records;
|
||||
}
|
||||
dir.cd("ModPacks");
|
||||
auto allFiles = dir.entryList(QDir::Readable | QDir::Files, QDir::Name);
|
||||
for (auto filename : allFiles)
|
||||
{
|
||||
if (!filename.endsWith(".xml"))
|
||||
continue;
|
||||
auto fpath = dir.absoluteFilePath(filename);
|
||||
QFile f(fpath);
|
||||
qDebug() << "Discovering FTB instances -- " << fpath;
|
||||
if (!f.open(QFile::ReadOnly))
|
||||
continue;
|
||||
|
||||
// read the FTB packs XML.
|
||||
QXmlStreamReader reader(&f);
|
||||
while (!reader.atEnd())
|
||||
{
|
||||
switch (reader.readNext())
|
||||
{
|
||||
case QXmlStreamReader::StartElement:
|
||||
{
|
||||
if (reader.name() == "modpack")
|
||||
{
|
||||
QXmlStreamAttributes attrs = reader.attributes();
|
||||
FTBRecord record;
|
||||
record.dirName = attrs.value("dir").toString();
|
||||
record.instanceDir = dataDir.absoluteFilePath(record.dirName);
|
||||
record.templateDir = dir.absoluteFilePath(record.dirName);
|
||||
QDir test(record.instanceDir);
|
||||
qDebug() << dataDir.absolutePath() << record.instanceDir << record.dirName;
|
||||
if (!test.exists())
|
||||
continue;
|
||||
record.name = attrs.value("name").toString();
|
||||
record.logo = attrs.value("logo").toString();
|
||||
auto customVersions = attrs.value("customMCVersions");
|
||||
if (!customVersions.isNull())
|
||||
{
|
||||
QMap<QString, QString> versionMatcher;
|
||||
QString customVersionsStr = customVersions.toString();
|
||||
QStringList list = customVersionsStr.split(';');
|
||||
for (auto item : list)
|
||||
{
|
||||
auto segment = item.split('^');
|
||||
if (segment.size() != 2)
|
||||
{
|
||||
qCritical() << "FTB: Segment of size < 2 in "
|
||||
<< customVersionsStr;
|
||||
continue;
|
||||
}
|
||||
versionMatcher[segment[0]] = segment[1];
|
||||
}
|
||||
auto actualVersion = attrs.value("version").toString();
|
||||
if (versionMatcher.contains(actualVersion))
|
||||
{
|
||||
record.mcVersion = versionMatcher[actualVersion];
|
||||
}
|
||||
else
|
||||
{
|
||||
record.mcVersion = attrs.value("mcVersion").toString();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
record.mcVersion = attrs.value("mcVersion").toString();
|
||||
}
|
||||
record.description = attrs.value("description").toString();
|
||||
records.insert(record);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case QXmlStreamReader::EndElement:
|
||||
break;
|
||||
case QXmlStreamReader::Characters:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
f.close();
|
||||
}
|
||||
return records;
|
||||
}
|
||||
|
||||
InstancePtr loadInstance(const QString &instDir)
|
||||
{
|
||||
auto m_settings = new INISettingsObject(PathCombine(instDir, "instance.cfg"));
|
||||
|
||||
InstancePtr inst;
|
||||
|
||||
m_settings->registerSetting("InstanceType", "Legacy");
|
||||
|
||||
QString inst_type = m_settings->get("InstanceType").toString();
|
||||
|
||||
if (inst_type == "LegacyFTB")
|
||||
{
|
||||
inst.reset(new LegacyFTBInstance(instDir, m_settings));
|
||||
}
|
||||
else if (inst_type == "OneSixFTB")
|
||||
{
|
||||
inst.reset(new OneSixFTBInstance(instDir, m_settings));
|
||||
}
|
||||
inst->init();
|
||||
return inst;
|
||||
}
|
||||
|
||||
InstancePtr createInstance(MinecraftVersionPtr version, const QString &instDir)
|
||||
{
|
||||
QDir rootDir(instDir);
|
||||
|
||||
InstancePtr inst;
|
||||
|
||||
if (!version)
|
||||
{
|
||||
qCritical() << "Can't create instance for non-existing MC version";
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
qDebug() << instDir.toUtf8();
|
||||
if (!rootDir.exists() && !rootDir.mkpath("."))
|
||||
{
|
||||
qCritical() << "Can't create instance folder" << instDir;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
auto m_settings = new INISettingsObject(PathCombine(instDir, "instance.cfg"));
|
||||
m_settings->registerSetting("InstanceType", "Legacy");
|
||||
|
||||
if (version->usesLegacyLauncher())
|
||||
{
|
||||
m_settings->set("InstanceType", "LegacyFTB");
|
||||
inst.reset(new LegacyFTBInstance(instDir, m_settings));
|
||||
inst->setIntendedVersionId(version->descriptor());
|
||||
}
|
||||
else
|
||||
{
|
||||
m_settings->set("InstanceType", "OneSixFTB");
|
||||
inst.reset(new OneSixFTBInstance(instDir, m_settings));
|
||||
inst->setIntendedVersionId(version->descriptor());
|
||||
inst->init();
|
||||
}
|
||||
return inst;
|
||||
}
|
||||
|
||||
void FTBPlugin::loadInstances(QMap<QString, QString> &groupMap, QList<InstancePtr> &tempList)
|
||||
{
|
||||
// nothing to load when we don't have
|
||||
if (MMC->settings()->get("TrackFTBInstances").toBool() != true)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
auto records = discoverFTBInstances();
|
||||
if (!records.size())
|
||||
{
|
||||
qDebug() << "No FTB instances to load.";
|
||||
return;
|
||||
}
|
||||
qDebug() << "Loading FTB instances! -- got " << records.size();
|
||||
// process the records we acquired.
|
||||
for (auto record : records)
|
||||
{
|
||||
qDebug() << "Loading FTB instance from " << record.instanceDir;
|
||||
QString iconKey = record.logo;
|
||||
iconKey.remove(QRegularExpression("\\..*"));
|
||||
MMC->icons()->addIcon(iconKey, iconKey, PathCombine(record.templateDir, record.logo),
|
||||
MMCIcon::Transient);
|
||||
|
||||
if (!QFileInfo(PathCombine(record.instanceDir, "instance.cfg")).exists())
|
||||
{
|
||||
qDebug() << "Converting " << record.name << " as new.";
|
||||
auto mcVersion = std::dynamic_pointer_cast<MinecraftVersion>(MMC->minecraftlist()->findVersion(record.mcVersion));
|
||||
if (!mcVersion)
|
||||
{
|
||||
qCritical() << "Can't load instance " << record.instanceDir
|
||||
<< " because minecraft version " << record.mcVersion
|
||||
<< " can't be resolved.";
|
||||
continue;
|
||||
}
|
||||
|
||||
auto instPtr = createInstance(mcVersion, record.instanceDir);
|
||||
if (!instPtr)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
instPtr->setGroupInitial("FTB");
|
||||
instPtr->setName(record.name);
|
||||
instPtr->setIconKey(iconKey);
|
||||
instPtr->setIntendedVersionId(record.mcVersion);
|
||||
instPtr->setNotes(record.description);
|
||||
if (!InstanceList::continueProcessInstance(instPtr, InstanceFactory::NoCreateError, record.instanceDir, groupMap))
|
||||
continue;
|
||||
tempList.append(InstancePtr(instPtr));
|
||||
}
|
||||
else
|
||||
{
|
||||
qDebug() << "Loading existing " << record.name;
|
||||
auto instPtr = loadInstance(record.instanceDir);
|
||||
if (!instPtr)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
instPtr->setGroupInitial("FTB");
|
||||
instPtr->setName(record.name);
|
||||
instPtr->setIconKey(iconKey);
|
||||
if (instPtr->intendedVersionId() != record.mcVersion)
|
||||
{
|
||||
instPtr->setIntendedVersionId(record.mcVersion);
|
||||
}
|
||||
instPtr->setNotes(record.description);
|
||||
if (!InstanceList::continueProcessInstance(instPtr, InstanceFactory::NoCreateError, record.instanceDir, groupMap))
|
||||
continue;
|
||||
tempList.append(InstancePtr(instPtr));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef Q_OS_WIN32
|
||||
#include <windows.h>
|
||||
static const int APPDATA_BUFFER_SIZE = 1024;
|
||||
#endif
|
||||
|
||||
void FTBPlugin::initialize()
|
||||
{
|
||||
auto m_settings = MMC->settings();
|
||||
// FTB
|
||||
m_settings->registerSetting("TrackFTBInstances", false);
|
||||
QString ftbDataDefault;
|
||||
#ifdef Q_OS_LINUX
|
||||
QString ftbDefault = ftbDataDefault = QDir::home().absoluteFilePath(".ftblauncher");
|
||||
#elif defined(Q_OS_WIN32)
|
||||
wchar_t buf[APPDATA_BUFFER_SIZE];
|
||||
wchar_t newBuf[APPDATA_BUFFER_SIZE];
|
||||
QString ftbDefault, newFtbDefault, oldFtbDefault;
|
||||
if (!GetEnvironmentVariableW(L"LOCALAPPDATA", newBuf, APPDATA_BUFFER_SIZE))
|
||||
{
|
||||
qCritical() << "Your LOCALAPPDATA folder is missing! If you are on windows, this means "
|
||||
"your system is broken.";
|
||||
}
|
||||
else
|
||||
{
|
||||
newFtbDefault = QDir(QString::fromWCharArray(newBuf)).absoluteFilePath("ftblauncher");
|
||||
}
|
||||
if (!GetEnvironmentVariableW(L"APPDATA", buf, APPDATA_BUFFER_SIZE))
|
||||
{
|
||||
qCritical() << "Your APPDATA folder is missing! If you are on windows, this means your "
|
||||
"system is broken.";
|
||||
}
|
||||
else
|
||||
{
|
||||
oldFtbDefault = QDir(QString::fromWCharArray(buf)).absoluteFilePath("ftblauncher");
|
||||
}
|
||||
if (QFile::exists(QDir(newFtbDefault).absoluteFilePath("ftblaunch.cfg")))
|
||||
{
|
||||
qDebug() << "Old FTB setup";
|
||||
ftbDefault = ftbDataDefault = oldFtbDefault;
|
||||
}
|
||||
else
|
||||
{
|
||||
qDebug() << "New FTB setup";
|
||||
ftbDefault = oldFtbDefault;
|
||||
ftbDataDefault = newFtbDefault;
|
||||
}
|
||||
#elif defined(Q_OS_MAC)
|
||||
QString ftbDefault = ftbDataDefault =
|
||||
PathCombine(QDir::homePath(), "Library/Application Support/ftblauncher");
|
||||
#endif
|
||||
m_settings->registerSetting("FTBLauncherDataRoot", ftbDataDefault);
|
||||
m_settings->registerSetting("FTBLauncherRoot", ftbDefault);
|
||||
qDebug() << "FTB Launcher paths:" << m_settings->get("FTBLauncherDataRoot").toString()
|
||||
<< "and" << m_settings->get("FTBLauncherRoot").toString();
|
||||
|
||||
m_settings->registerSetting("FTBRoot");
|
||||
if (m_settings->get("FTBRoot").isNull())
|
||||
{
|
||||
QString ftbRoot;
|
||||
QFile f(QDir(m_settings->get("FTBLauncherRoot").toString())
|
||||
.absoluteFilePath("ftblaunch.cfg"));
|
||||
qDebug() << "Attempting to read" << f.fileName();
|
||||
if (f.open(QFile::ReadOnly))
|
||||
{
|
||||
const QString data = QString::fromLatin1(f.readAll());
|
||||
QRegularExpression exp("installPath=(.*)");
|
||||
ftbRoot = QDir::cleanPath(exp.match(data).captured(1));
|
||||
#ifdef Q_OS_WIN32
|
||||
if (!ftbRoot.isEmpty())
|
||||
{
|
||||
if (ftbRoot.at(0).isLetter() && ftbRoot.size() > 1 && ftbRoot.at(1) == '/')
|
||||
{
|
||||
ftbRoot.remove(1, 1);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (ftbRoot.isEmpty())
|
||||
{
|
||||
qDebug() << "Failed to get FTB root path";
|
||||
}
|
||||
else
|
||||
{
|
||||
qDebug() << "FTB is installed at" << ftbRoot;
|
||||
m_settings->set("FTBRoot", ftbRoot);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
qWarning() << "Couldn't open" << f.fileName() << ":" << f.errorString();
|
||||
qWarning() << "This is perfectly normal if you don't have FTB installed";
|
||||
}
|
||||
}
|
||||
}
|
11
logic/ftb/FTBPlugin.h
Normal file
11
logic/ftb/FTBPlugin.h
Normal file
@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
|
||||
#include <logic/BaseInstance.h>
|
||||
|
||||
// Pseudo-plugin for FTB related things. Super derpy!
|
||||
class FTBPlugin
|
||||
{
|
||||
public:
|
||||
static void initialize();
|
||||
static void loadInstances(QMap<QString, QString> &groupMap, QList<InstancePtr> &tempList);
|
||||
};
|
@ -1,4 +1,6 @@
|
||||
#include "LegacyFTBInstance.h"
|
||||
#include <logic/settings/INISettingsObject.h>
|
||||
#include <QDir>
|
||||
|
||||
LegacyFTBInstance::LegacyFTBInstance(const QString &rootDir, SettingsObject *settings, QObject *parent) :
|
||||
LegacyInstance(rootDir, settings, parent)
|
||||
@ -18,3 +20,12 @@ QString LegacyFTBInstance::id() const
|
||||
{
|
||||
return "FTB/" + BaseInstance::id();
|
||||
}
|
||||
|
||||
void LegacyFTBInstance::copy(const QDir &newDir)
|
||||
{
|
||||
// set the target instance to be plain Legacy
|
||||
INISettingsObject settings_obj(newDir.absoluteFilePath("instance.cfg"));
|
||||
settings_obj.registerSetting("InstanceType", "Legacy");
|
||||
QString inst_type = settings_obj.get("InstanceType").toString();
|
||||
settings_obj.set("InstanceType", "Legacy");
|
||||
}
|
||||
|
@ -10,4 +10,5 @@ public:
|
||||
QObject *parent = 0);
|
||||
virtual QString getStatusbarDescription();
|
||||
virtual QString id() const;
|
||||
virtual void copy(const QDir &newDir);
|
||||
};
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include "logic/tasks/SequentialTask.h"
|
||||
#include "logic/forge/ForgeInstaller.h"
|
||||
#include "logic/forge/ForgeVersionList.h"
|
||||
#include <logic/settings/INISettingsObject.h>
|
||||
#include "MultiMC.h"
|
||||
#include "pathutils.h"
|
||||
|
||||
@ -93,6 +94,11 @@ void OneSixFTBInstance::copy(const QDir &newDir)
|
||||
}
|
||||
}
|
||||
}
|
||||
// now set the target instance to be plain OneSix
|
||||
INISettingsObject settings_obj(newDir.absoluteFilePath("instance.cfg"));
|
||||
settings_obj.registerSetting("InstanceType", "Legacy");
|
||||
QString inst_type = settings_obj.get("InstanceType").toString();
|
||||
settings_obj.set("InstanceType", "OneSix");
|
||||
}
|
||||
|
||||
QString OneSixFTBInstance::id() const
|
||||
|
Loading…
Reference in New Issue
Block a user