NOISSUE split out the LaunchProfile out of the ComponentList

This commit is contained in:
Petr Mrázek 2017-11-04 22:55:25 +01:00
parent 3470158943
commit 17c8f31a09
16 changed files with 493 additions and 422 deletions

View File

@ -237,6 +237,8 @@ set(MINECRAFT_SOURCES
minecraft/GradleSpecifier.h minecraft/GradleSpecifier.h
minecraft/MinecraftInstance.cpp minecraft/MinecraftInstance.cpp
minecraft/MinecraftInstance.h minecraft/MinecraftInstance.h
minecraft/LaunchProfile.cpp
minecraft/LaunchProfile.h
minecraft/ComponentList.cpp minecraft/ComponentList.cpp
minecraft/ComponentList.h minecraft/ComponentList.h
minecraft/MinecraftUpdate.h minecraft/MinecraftUpdate.h

View File

@ -16,18 +16,19 @@ struct PatchProblem
class ProblemProvider class ProblemProvider
{ {
public: public:
virtual const QList<PatchProblem> getProblems() = 0; virtual ~ProblemProvider() {};
virtual ProblemSeverity getProblemSeverity() = 0; virtual const QList<PatchProblem> getProblems() const = 0;
virtual ProblemSeverity getProblemSeverity() const = 0;
}; };
class ProblemContainer : public ProblemProvider class ProblemContainer : public ProblemProvider
{ {
public: public:
const QList<PatchProblem> getProblems() override const QList<PatchProblem> getProblems() const override
{ {
return m_problems; return m_problems;
} }
ProblemSeverity getProblemSeverity() override ProblemSeverity getProblemSeverity() const override
{ {
return m_problemSeverity; return m_problemSeverity;
} }

View File

@ -35,7 +35,6 @@ ComponentList::ComponentList(MinecraftInstance * instance)
: QAbstractListModel() : QAbstractListModel()
{ {
m_instance = instance; m_instance = instance;
clear();
} }
ComponentList::~ComponentList() ComponentList::~ComponentList()
@ -50,22 +49,6 @@ void ComponentList::reload()
endResetModel(); endResetModel();
} }
void ComponentList::clear()
{
m_minecraftVersion.clear();
m_minecraftVersionType.clear();
m_minecraftAssets.reset();
m_minecraftArguments.clear();
m_tweakers.clear();
m_mainClass.clear();
m_appletClass.clear();
m_libraries.clear();
m_traits.clear();
m_jarMods.clear();
m_mainJar.reset();
m_problemSeverity = ProblemSeverity::None;
}
void ComponentList::clearPatches() void ComponentList::clearPatches()
{ {
beginResetModel(); beginResetModel();
@ -365,290 +348,22 @@ bool ComponentList::reapplyPatches()
{ {
try try
{ {
clear(); m_profile.reset(new LaunchProfile);
for(auto file: m_patches) for(auto file: m_patches)
{ {
qDebug() << "Applying" << file->getID() << (file->getProblemSeverity() == ProblemSeverity::Error ? "ERROR" : "GOOD"); qDebug() << "Applying" << file->getID() << (file->getProblemSeverity() == ProblemSeverity::Error ? "ERROR" : "GOOD");
file->applyTo(this); file->applyTo(m_profile.get());
} }
} }
catch (Exception & error) catch (Exception & error)
{ {
clear(); m_profile.reset();
qWarning() << "Couldn't apply profile patches because: " << error.cause(); qWarning() << "Couldn't apply profile patches because: " << error.cause();
return false; return false;
} }
return true; return true;
} }
static void applyString(const QString & from, QString & to)
{
if(from.isEmpty())
return;
to = from;
}
void ComponentList::applyMinecraftVersion(const QString& id)
{
applyString(id, this->m_minecraftVersion);
}
void ComponentList::applyAppletClass(const QString& appletClass)
{
applyString(appletClass, this->m_appletClass);
}
void ComponentList::applyMainClass(const QString& mainClass)
{
applyString(mainClass, this->m_mainClass);
}
void ComponentList::applyMinecraftArguments(const QString& minecraftArguments)
{
applyString(minecraftArguments, this->m_minecraftArguments);
}
void ComponentList::applyMinecraftVersionType(const QString& type)
{
applyString(type, this->m_minecraftVersionType);
}
void ComponentList::applyMinecraftAssets(MojangAssetIndexInfo::Ptr assets)
{
if(assets)
{
m_minecraftAssets = assets;
}
}
void ComponentList::applyTraits(const QSet<QString>& traits)
{
this->m_traits.unite(traits);
}
void ComponentList::applyTweakers(const QStringList& tweakers)
{
// if the applied tweakers override an existing one, skip it. this effectively moves it later in the sequence
QStringList newTweakers;
for(auto & tweaker: m_tweakers)
{
if (tweakers.contains(tweaker))
{
continue;
}
newTweakers.append(tweaker);
}
// then just append the new tweakers (or moved original ones)
newTweakers += tweakers;
m_tweakers = newTweakers;
}
void ComponentList::applyJarMods(const QList<LibraryPtr>& jarMods)
{
this->m_jarMods.append(jarMods);
}
static int findLibraryByName(QList<LibraryPtr> *haystack, const GradleSpecifier &needle)
{
int retval = -1;
for (int i = 0; i < haystack->size(); ++i)
{
if (haystack->at(i)->rawName().matchName(needle))
{
// only one is allowed.
if (retval != -1)
return -1;
retval = i;
}
}
return retval;
}
void ComponentList::applyMods(const QList<LibraryPtr>& mods)
{
QList<LibraryPtr> * list = &m_mods;
for(auto & mod: mods)
{
auto modCopy = Library::limitedCopy(mod);
// find the mod by name.
const int index = findLibraryByName(list, mod->rawName());
// mod not found? just add it.
if (index < 0)
{
list->append(modCopy);
return;
}
auto existingLibrary = list->at(index);
// if we are higher it means we should update
if (Version(mod->version()) > Version(existingLibrary->version()))
{
list->replace(index, modCopy);
}
}
}
void ComponentList::applyLibrary(LibraryPtr library)
{
if(!library->isActive())
{
return;
}
QList<LibraryPtr> * list = &m_libraries;
if(library->isNative())
{
list = &m_nativeLibraries;
}
auto libraryCopy = Library::limitedCopy(library);
// find the library by name.
const int index = findLibraryByName(list, library->rawName());
// library not found? just add it.
if (index < 0)
{
list->append(libraryCopy);
return;
}
auto existingLibrary = list->at(index);
// if we are higher it means we should update
if (Version(library->version()) > Version(existingLibrary->version()))
{
list->replace(index, libraryCopy);
}
}
const LibraryPtr ComponentList::getMainJar() const
{
return m_mainJar;
}
void ComponentList::applyMainJar(LibraryPtr jar)
{
if(jar)
{
m_mainJar = jar;
}
}
void ComponentList::applyProblemSeverity(ProblemSeverity severity)
{
if (m_problemSeverity < severity)
{
m_problemSeverity = severity;
}
}
QString ComponentList::getMinecraftVersion() const
{
return m_minecraftVersion;
}
QString ComponentList::getAppletClass() const
{
return m_appletClass;
}
QString ComponentList::getMainClass() const
{
return m_mainClass;
}
const QSet<QString> &ComponentList::getTraits() const
{
return m_traits;
}
const QStringList & ComponentList::getTweakers() const
{
return m_tweakers;
}
bool ComponentList::hasTrait(const QString& trait) const
{
return m_traits.contains(trait);
}
ProblemSeverity ComponentList::getProblemSeverity() const
{
return m_problemSeverity;
}
QString ComponentList::getMinecraftVersionType() const
{
return m_minecraftVersionType;
}
std::shared_ptr<MojangAssetIndexInfo> ComponentList::getMinecraftAssets() const
{
if(!m_minecraftAssets)
{
return std::make_shared<MojangAssetIndexInfo>("legacy");
}
return m_minecraftAssets;
}
QString ComponentList::getMinecraftArguments() const
{
return m_minecraftArguments;
}
const QList<LibraryPtr> & ComponentList::getJarMods() const
{
return m_jarMods;
}
const QList<LibraryPtr> & ComponentList::getLibraries() const
{
return m_libraries;
}
const QList<LibraryPtr> & ComponentList::getNativeLibraries() const
{
return m_nativeLibraries;
}
void ComponentList::getLibraryFiles(const QString& architecture, QStringList& jars, QStringList& nativeJars, const QString& overridePath, const QString& tempPath) const
{
QStringList native32, native64;
jars.clear();
nativeJars.clear();
for (auto lib : getLibraries())
{
lib->getApplicableFiles(currentSystem, jars, nativeJars, native32, native64, overridePath);
}
// NOTE: order is important here, add main jar last to the lists
if(m_mainJar)
{
// FIXME: HACK!! jar modding is weird and unsystematic!
if(m_jarMods.size())
{
QDir tempDir(tempPath);
jars.append(tempDir.absoluteFilePath("minecraft.jar"));
}
else
{
m_mainJar->getApplicableFiles(currentSystem, jars, nativeJars, native32, native64, overridePath);
}
}
for (auto lib : getNativeLibraries())
{
lib->getApplicableFiles(currentSystem, jars, nativeJars, native32, native64, overridePath);
}
if(architecture == "32")
{
nativeJars.append(native32);
}
else if(architecture == "64")
{
nativeJars.append(native64);
}
}
void ComponentList::installJarMods(QStringList selectedFiles) void ComponentList::installJarMods(QStringList selectedFiles)
{ {
installJarMods_internal(selectedFiles); installJarMods_internal(selectedFiles);
@ -1123,3 +838,13 @@ bool ComponentList::installCustomJar_internal(QString filepath)
reapplyPatches(); reapplyPatches();
return true; return true;
} }
std::shared_ptr<LaunchProfile> ComponentList::getProfile() const
{
return m_profile;
}
void ComponentList::clearProfile()
{
m_profile.reset();
}

View File

@ -22,11 +22,11 @@
#include <memory> #include <memory>
#include "Library.h" #include "Library.h"
#include "LaunchProfile.h"
#include "ProfilePatch.h" #include "ProfilePatch.h"
#include "ProfileUtils.h" #include "ProfileUtils.h"
#include "BaseVersion.h" #include "BaseVersion.h"
#include "MojangDownloadInfo.h" #include "MojangDownloadInfo.h"
#include "multimc_logic_export.h" #include "multimc_logic_export.h"
class MinecraftInstance; class MinecraftInstance;
@ -80,45 +80,11 @@ public:
/// reload all profile patches from storage, clear the profile and apply the patches /// reload all profile patches from storage, clear the profile and apply the patches
void reload(); void reload();
/// clear the profile
void clear();
/// apply the patches. Catches all the errors and returns true/false for success/failure /// apply the patches. Catches all the errors and returns true/false for success/failure
bool reapplyPatches(); bool reapplyPatches();
public: /* application of profile variables from patches */ std::shared_ptr<LaunchProfile> getProfile() const;
void applyMinecraftVersion(const QString& id); void clearProfile();
void applyMainClass(const QString& mainClass);
void applyAppletClass(const QString& appletClass);
void applyMinecraftArguments(const QString& minecraftArguments);
void applyMinecraftVersionType(const QString& type);
void applyMinecraftAssets(MojangAssetIndexInfo::Ptr assets);
void applyTraits(const QSet<QString> &traits);
void applyTweakers(const QStringList &tweakers);
void applyJarMods(const QList<LibraryPtr> &jarMods);
void applyMods(const QList<LibraryPtr> &jarMods);
void applyLibrary(LibraryPtr library);
void applyMainJar(LibraryPtr jar);
void applyProblemSeverity(ProblemSeverity severity);
public: /* getters for profile variables */
QString getMinecraftVersion() const;
QString getMainClass() const;
QString getAppletClass() const;
QString getMinecraftVersionType() const;
MojangAssetIndexInfo::Ptr getMinecraftAssets() const;
QString getMinecraftArguments() const;
const QSet<QString> & getTraits() const;
const QStringList & getTweakers() const;
const QList<LibraryPtr> & getJarMods() const;
const QList<LibraryPtr> & getLibraries() const;
const QList<LibraryPtr> & getNativeLibraries() const;
const LibraryPtr getMainJar() const;
void getLibraryFiles(const QString & architecture, QStringList & jars, QStringList & nativeJars, const QString & overridePath,
const QString & tempPath) const;
bool hasTrait(const QString & trait) const;
ProblemSeverity getProblemSeverity() const;
public: public:
/// get the profile patch by id /// get the profile patch by id
ProfilePatchPtr versionPatch(const QString &id); ProfilePatchPtr versionPatch(const QString &id);
@ -149,55 +115,11 @@ private:
void upgradeDeprecatedFiles_internal(); void upgradeDeprecatedFiles_internal();
private: /* data */ private: /* data */
/// the version of Minecraft - jar to use
QString m_minecraftVersion;
/// Release type - "release" or "snapshot"
QString m_minecraftVersionType;
/// Assets type - "legacy" or a version ID
MojangAssetIndexInfo::Ptr m_minecraftAssets;
/**
* arguments that should be used for launching minecraft
*
* ex: "--username ${auth_player_name} --session ${auth_session}
* --version ${version_name} --gameDir ${game_directory} --assetsDir ${game_assets}"
*/
QString m_minecraftArguments;
/// A list of all tweaker classes
QStringList m_tweakers;
/// The main class to load first
QString m_mainClass;
/// The applet class, for some very old minecraft releases
QString m_appletClass;
/// the list of libraries
QList<LibraryPtr> m_libraries;
/// the main jar
LibraryPtr m_mainJar;
/// the list of libraries
QList<LibraryPtr> m_nativeLibraries;
/// traits, collected from all the version files (version files can only add)
QSet<QString> m_traits;
/// A list of jar mods. version files can add those.
QList<LibraryPtr> m_jarMods;
/// the list of mods
QList<LibraryPtr> m_mods;
ProblemSeverity m_problemSeverity = ProblemSeverity::None;
/// list of attached profile patches /// list of attached profile patches
QList<ProfilePatchPtr> m_patches; QList<ProfilePatchPtr> m_patches;
// the instance this belongs to // the instance this belongs to
MinecraftInstance *m_instance; MinecraftInstance *m_instance;
std::shared_ptr<LaunchProfile> m_profile;
}; };

View File

@ -0,0 +1,297 @@
#include "LaunchProfile.h"
#include <Version.h>
void LaunchProfile::clear()
{
m_minecraftVersion.clear();
m_minecraftVersionType.clear();
m_minecraftAssets.reset();
m_minecraftArguments.clear();
m_tweakers.clear();
m_mainClass.clear();
m_appletClass.clear();
m_libraries.clear();
m_traits.clear();
m_jarMods.clear();
m_mainJar.reset();
m_problemSeverity = ProblemSeverity::None;
}
static void applyString(const QString & from, QString & to)
{
if(from.isEmpty())
return;
to = from;
}
void LaunchProfile::applyMinecraftVersion(const QString& id)
{
applyString(id, this->m_minecraftVersion);
}
void LaunchProfile::applyAppletClass(const QString& appletClass)
{
applyString(appletClass, this->m_appletClass);
}
void LaunchProfile::applyMainClass(const QString& mainClass)
{
applyString(mainClass, this->m_mainClass);
}
void LaunchProfile::applyMinecraftArguments(const QString& minecraftArguments)
{
applyString(minecraftArguments, this->m_minecraftArguments);
}
void LaunchProfile::applyMinecraftVersionType(const QString& type)
{
applyString(type, this->m_minecraftVersionType);
}
void LaunchProfile::applyMinecraftAssets(MojangAssetIndexInfo::Ptr assets)
{
if(assets)
{
m_minecraftAssets = assets;
}
}
void LaunchProfile::applyTraits(const QSet<QString>& traits)
{
this->m_traits.unite(traits);
}
void LaunchProfile::applyTweakers(const QStringList& tweakers)
{
// if the applied tweakers override an existing one, skip it. this effectively moves it later in the sequence
QStringList newTweakers;
for(auto & tweaker: m_tweakers)
{
if (tweakers.contains(tweaker))
{
continue;
}
newTweakers.append(tweaker);
}
// then just append the new tweakers (or moved original ones)
newTweakers += tweakers;
m_tweakers = newTweakers;
}
void LaunchProfile::applyJarMods(const QList<LibraryPtr>& jarMods)
{
this->m_jarMods.append(jarMods);
}
static int findLibraryByName(QList<LibraryPtr> *haystack, const GradleSpecifier &needle)
{
int retval = -1;
for (int i = 0; i < haystack->size(); ++i)
{
if (haystack->at(i)->rawName().matchName(needle))
{
// only one is allowed.
if (retval != -1)
return -1;
retval = i;
}
}
return retval;
}
void LaunchProfile::applyMods(const QList<LibraryPtr>& mods)
{
QList<LibraryPtr> * list = &m_mods;
for(auto & mod: mods)
{
auto modCopy = Library::limitedCopy(mod);
// find the mod by name.
const int index = findLibraryByName(list, mod->rawName());
// mod not found? just add it.
if (index < 0)
{
list->append(modCopy);
return;
}
auto existingLibrary = list->at(index);
// if we are higher it means we should update
if (Version(mod->version()) > Version(existingLibrary->version()))
{
list->replace(index, modCopy);
}
}
}
void LaunchProfile::applyLibrary(LibraryPtr library)
{
if(!library->isActive())
{
return;
}
QList<LibraryPtr> * list = &m_libraries;
if(library->isNative())
{
list = &m_nativeLibraries;
}
auto libraryCopy = Library::limitedCopy(library);
// find the library by name.
const int index = findLibraryByName(list, library->rawName());
// library not found? just add it.
if (index < 0)
{
list->append(libraryCopy);
return;
}
auto existingLibrary = list->at(index);
// if we are higher it means we should update
if (Version(library->version()) > Version(existingLibrary->version()))
{
list->replace(index, libraryCopy);
}
}
const LibraryPtr LaunchProfile::getMainJar() const
{
return m_mainJar;
}
void LaunchProfile::applyMainJar(LibraryPtr jar)
{
if(jar)
{
m_mainJar = jar;
}
}
void LaunchProfile::applyProblemSeverity(ProblemSeverity severity)
{
if (m_problemSeverity < severity)
{
m_problemSeverity = severity;
}
}
const QList<PatchProblem> LaunchProfile::getProblems() const
{
// FIXME: implement something that actually makes sense here
return {};
}
QString LaunchProfile::getMinecraftVersion() const
{
return m_minecraftVersion;
}
QString LaunchProfile::getAppletClass() const
{
return m_appletClass;
}
QString LaunchProfile::getMainClass() const
{
return m_mainClass;
}
const QSet<QString> &LaunchProfile::getTraits() const
{
return m_traits;
}
const QStringList & LaunchProfile::getTweakers() const
{
return m_tweakers;
}
bool LaunchProfile::hasTrait(const QString& trait) const
{
return m_traits.contains(trait);
}
ProblemSeverity LaunchProfile::getProblemSeverity() const
{
return m_problemSeverity;
}
QString LaunchProfile::getMinecraftVersionType() const
{
return m_minecraftVersionType;
}
std::shared_ptr<MojangAssetIndexInfo> LaunchProfile::getMinecraftAssets() const
{
if(!m_minecraftAssets)
{
return std::make_shared<MojangAssetIndexInfo>("legacy");
}
return m_minecraftAssets;
}
QString LaunchProfile::getMinecraftArguments() const
{
return m_minecraftArguments;
}
const QList<LibraryPtr> & LaunchProfile::getJarMods() const
{
return m_jarMods;
}
const QList<LibraryPtr> & LaunchProfile::getLibraries() const
{
return m_libraries;
}
const QList<LibraryPtr> & LaunchProfile::getNativeLibraries() const
{
return m_nativeLibraries;
}
void LaunchProfile::getLibraryFiles(
const QString& architecture,
QStringList& jars,
QStringList& nativeJars,
const QString& overridePath,
const QString& tempPath
) const
{
QStringList native32, native64;
jars.clear();
nativeJars.clear();
for (auto lib : getLibraries())
{
lib->getApplicableFiles(currentSystem, jars, nativeJars, native32, native64, overridePath);
}
// NOTE: order is important here, add main jar last to the lists
if(m_mainJar)
{
// FIXME: HACK!! jar modding is weird and unsystematic!
if(m_jarMods.size())
{
QDir tempDir(tempPath);
jars.append(tempDir.absoluteFilePath("minecraft.jar"));
}
else
{
m_mainJar->getApplicableFiles(currentSystem, jars, nativeJars, native32, native64, overridePath);
}
}
for (auto lib : getNativeLibraries())
{
lib->getApplicableFiles(currentSystem, jars, nativeJars, native32, native64, overridePath);
}
if(architecture == "32")
{
nativeJars.append(native32);
}
else if(architecture == "64")
{
nativeJars.append(native64);
}
}

View File

@ -0,0 +1,99 @@
#pragma once
#include <QString>
#include "Library.h"
#include <ProblemProvider.h>
class LaunchProfile: public ProblemProvider
{
public:
virtual ~LaunchProfile() {};
public: /* application of profile variables from patches */
void applyMinecraftVersion(const QString& id);
void applyMainClass(const QString& mainClass);
void applyAppletClass(const QString& appletClass);
void applyMinecraftArguments(const QString& minecraftArguments);
void applyMinecraftVersionType(const QString& type);
void applyMinecraftAssets(MojangAssetIndexInfo::Ptr assets);
void applyTraits(const QSet<QString> &traits);
void applyTweakers(const QStringList &tweakers);
void applyJarMods(const QList<LibraryPtr> &jarMods);
void applyMods(const QList<LibraryPtr> &jarMods);
void applyLibrary(LibraryPtr library);
void applyMainJar(LibraryPtr jar);
void applyProblemSeverity(ProblemSeverity severity);
/// clear the profile
void clear();
public: /* getters for profile variables */
QString getMinecraftVersion() const;
QString getMainClass() const;
QString getAppletClass() const;
QString getMinecraftVersionType() const;
MojangAssetIndexInfo::Ptr getMinecraftAssets() const;
QString getMinecraftArguments() const;
const QSet<QString> & getTraits() const;
const QStringList & getTweakers() const;
const QList<LibraryPtr> & getJarMods() const;
const QList<LibraryPtr> & getLibraries() const;
const QList<LibraryPtr> & getNativeLibraries() const;
const LibraryPtr getMainJar() const;
void getLibraryFiles(
const QString & architecture,
QStringList & jars,
QStringList & nativeJars,
const QString & overridePath,
const QString & tempPath
) const;
bool hasTrait(const QString & trait) const;
ProblemSeverity getProblemSeverity() const override;
const QList<PatchProblem> getProblems() const override;
private:
/// the version of Minecraft - jar to use
QString m_minecraftVersion;
/// Release type - "release" or "snapshot"
QString m_minecraftVersionType;
/// Assets type - "legacy" or a version ID
MojangAssetIndexInfo::Ptr m_minecraftAssets;
/**
* arguments that should be used for launching minecraft
*
* ex: "--username ${auth_player_name} --session ${auth_session}
* --version ${version_name} --gameDir ${game_directory} --assetsDir ${game_assets}"
*/
QString m_minecraftArguments;
/// A list of all tweaker classes
QStringList m_tweakers;
/// The main class to load first
QString m_mainClass;
/// The applet class, for some very old minecraft releases
QString m_appletClass;
/// the list of libraries
QList<LibraryPtr> m_libraries;
/// the main jar
LibraryPtr m_mainJar;
/// the list of libraries
QList<LibraryPtr> m_nativeLibraries;
/// traits, collected from all the version files (version files can only add)
QSet<QString> m_traits;
/// A list of jar mods. version files can add those.
QList<LibraryPtr> m_jarMods;
/// the list of mods
QList<LibraryPtr> m_mods;
ProblemSeverity m_problemSeverity = ProblemSeverity::None;
};

View File

@ -133,38 +133,39 @@ bool MinecraftInstance::reload()
void MinecraftInstance::createProfile() void MinecraftInstance::createProfile()
{ {
m_profile.reset(new ComponentList(this)); m_components.reset(new ComponentList(this));
} }
void MinecraftInstance::reloadProfile() void MinecraftInstance::reloadProfile()
{ {
m_profile->reload(); m_components->reload();
setVersionBroken(m_profile->getProblemSeverity() == ProblemSeverity::Error);
emit versionReloaded(); emit versionReloaded();
} }
void MinecraftInstance::clearProfile() void MinecraftInstance::clearProfile()
{ {
m_profile->clear(); m_components->clearProfile();
emit versionReloaded(); emit versionReloaded();
} }
std::shared_ptr<ComponentList> MinecraftInstance::getComponentList() const std::shared_ptr<ComponentList> MinecraftInstance::getComponentList() const
{ {
return m_profile; return m_components;
} }
QSet<QString> MinecraftInstance::traits() const QSet<QString> MinecraftInstance::traits() const
{ {
auto version = getComponentList(); auto components = getComponentList();
if (!version) if (!components)
{ {
return {"version-incomplete"}; return {"version-incomplete"};
} }
else auto profile = components->getProfile();
if (!profile)
{ {
return version->getTraits(); return {"version-incomplete"};
} }
return profile->getTraits();
} }
QString MinecraftInstance::minecraftRoot() const QString MinecraftInstance::minecraftRoot() const
@ -254,20 +255,23 @@ QStringList MinecraftInstance::getClassPath() const
{ {
QStringList jars, nativeJars; QStringList jars, nativeJars;
auto javaArchitecture = settings()->get("JavaArchitecture").toString(); auto javaArchitecture = settings()->get("JavaArchitecture").toString();
m_profile->getLibraryFiles(javaArchitecture, jars, nativeJars, getLocalLibraryPath(), binRoot()); auto profile = m_components->getProfile();
profile->getLibraryFiles(javaArchitecture, jars, nativeJars, getLocalLibraryPath(), binRoot());
return jars; return jars;
} }
QString MinecraftInstance::getMainClass() const QString MinecraftInstance::getMainClass() const
{ {
return m_profile->getMainClass(); auto profile = m_components->getProfile();
return profile->getMainClass();
} }
QStringList MinecraftInstance::getNativeJars() const QStringList MinecraftInstance::getNativeJars() const
{ {
QStringList jars, nativeJars; QStringList jars, nativeJars;
auto javaArchitecture = settings()->get("JavaArchitecture").toString(); auto javaArchitecture = settings()->get("JavaArchitecture").toString();
m_profile->getLibraryFiles(javaArchitecture, jars, nativeJars, getLocalLibraryPath(), binRoot()); auto profile = m_components->getProfile();
profile->getLibraryFiles(javaArchitecture, jars, nativeJars, getLocalLibraryPath(), binRoot());
return nativeJars; return nativeJars;
} }
@ -298,11 +302,11 @@ QStringList MinecraftInstance::javaArguments() const
args << "-Xdock:icon=icon.png"; args << "-Xdock:icon=icon.png";
args << QString("-Xdock:name=\"%1\"").arg(windowTitle()); args << QString("-Xdock:name=\"%1\"").arg(windowTitle());
#endif #endif
auto traits = m_profile->getTraits(); auto traits_ = traits();
// HACK: fix issues on macOS with 1.13 snapshots // HACK: fix issues on macOS with 1.13 snapshots
// NOTE: Oracle Java option. if there are alternate jvm implementations, this would be the place to customize this for them // NOTE: Oracle Java option. if there are alternate jvm implementations, this would be the place to customize this for them
#ifdef Q_OS_MAC #ifdef Q_OS_MAC
if(traits.contains("FirstThreadOnMacOS")) if(traits_.contains("FirstThreadOnMacOS"))
{ {
args << QString("-XstartOnFirstThread"); args << QString("-XstartOnFirstThread");
} }
@ -395,8 +399,9 @@ static QString replaceTokensIn(QString text, QMap<QString, QString> with)
QStringList MinecraftInstance::processMinecraftArgs(AuthSessionPtr session) const QStringList MinecraftInstance::processMinecraftArgs(AuthSessionPtr session) const
{ {
QString args_pattern = m_profile->getMinecraftArguments(); auto profile = m_components->getProfile();
for (auto tweaker : m_profile->getTweakers()) QString args_pattern = profile->getMinecraftArguments();
for (auto tweaker : profile->getTweakers())
{ {
args_pattern += " --tweakClass " + tweaker; args_pattern += " --tweakClass " + tweaker;
} }
@ -416,9 +421,9 @@ QStringList MinecraftInstance::processMinecraftArgs(AuthSessionPtr session) cons
// blatant self-promotion. // blatant self-promotion.
token_mapping["profile_name"] = token_mapping["version_name"] = "MultiMC5"; token_mapping["profile_name"] = token_mapping["version_name"] = "MultiMC5";
if(m_profile->isVanilla()) if(m_components->isVanilla())
{ {
token_mapping["version_type"] = m_profile->getMinecraftVersionType(); token_mapping["version_type"] = profile->getMinecraftVersionType();
} }
else else
{ {
@ -428,7 +433,7 @@ QStringList MinecraftInstance::processMinecraftArgs(AuthSessionPtr session) cons
QString absRootDir = QDir(minecraftRoot()).absolutePath(); QString absRootDir = QDir(minecraftRoot()).absolutePath();
token_mapping["game_directory"] = absRootDir; token_mapping["game_directory"] = absRootDir;
QString absAssetsDir = QDir("assets/").absolutePath(); QString absAssetsDir = QDir("assets/").absolutePath();
auto assets = m_profile->getMinecraftAssets(); auto assets = profile->getMinecraftAssets();
// FIXME: this is wrong and should be run as an async task // FIXME: this is wrong and should be run as an async task
token_mapping["game_assets"] = AssetsUtils::reconstructAssets(assets->id).absolutePath(); token_mapping["game_assets"] = AssetsUtils::reconstructAssets(assets->id).absolutePath();
@ -448,15 +453,18 @@ QString MinecraftInstance::createLaunchScript(AuthSessionPtr session)
{ {
QString launchScript; QString launchScript;
if (!m_profile) if (!m_components)
return nullptr; return QString();
auto profile = m_components->getProfile();
if(!profile)
return QString();
auto mainClass = getMainClass(); auto mainClass = getMainClass();
if (!mainClass.isEmpty()) if (!mainClass.isEmpty())
{ {
launchScript += "mainClass " + mainClass + "\n"; launchScript += "mainClass " + mainClass + "\n";
} }
auto appletClass = m_profile->getAppletClass(); auto appletClass = profile->getAppletClass();
if (!appletClass.isEmpty()) if (!appletClass.isEmpty())
{ {
launchScript += "appletClass " + appletClass + "\n"; launchScript += "appletClass " + appletClass + "\n";
@ -492,7 +500,7 @@ QString MinecraftInstance::createLaunchScript(AuthSessionPtr session)
{ {
QStringList jars, nativeJars; QStringList jars, nativeJars;
auto javaArchitecture = settings()->get("JavaArchitecture").toString(); auto javaArchitecture = settings()->get("JavaArchitecture").toString();
m_profile->getLibraryFiles(javaArchitecture, jars, nativeJars, getLocalLibraryPath(), binRoot()); profile->getLibraryFiles(javaArchitecture, jars, nativeJars, getLocalLibraryPath(), binRoot());
for(auto file: jars) for(auto file: jars)
{ {
launchScript += "cp " + file + "\n"; launchScript += "cp " + file + "\n";
@ -504,7 +512,7 @@ QString MinecraftInstance::createLaunchScript(AuthSessionPtr session)
launchScript += "natives " + getNativePath() + "\n"; launchScript += "natives " + getNativePath() + "\n";
} }
for (auto trait : m_profile->getTraits()) for (auto trait : profile->getTraits())
{ {
launchScript += "traits " + trait + "\n"; launchScript += "traits " + trait + "\n";
} }
@ -519,6 +527,7 @@ QStringList MinecraftInstance::verboseDescription(AuthSessionPtr session)
out << "Main Class:" << " " + getMainClass() << ""; out << "Main Class:" << " " + getMainClass() << "";
out << "Native path:" << " " + getNativePath() << ""; out << "Native path:" << " " + getNativePath() << "";
auto profile = m_components->getProfile();
auto alltraits = traits(); auto alltraits = traits();
if(alltraits.size()) if(alltraits.size())
@ -536,7 +545,7 @@ QStringList MinecraftInstance::verboseDescription(AuthSessionPtr session)
out << "Libraries:"; out << "Libraries:";
QStringList jars, nativeJars; QStringList jars, nativeJars;
auto javaArchitecture = settings()->get("JavaArchitecture").toString(); auto javaArchitecture = settings()->get("JavaArchitecture").toString();
m_profile->getLibraryFiles(javaArchitecture, jars, nativeJars, getLocalLibraryPath(), binRoot()); profile->getLibraryFiles(javaArchitecture, jars, nativeJars, getLocalLibraryPath(), binRoot());
auto printLibFile = [&](const QString & path) auto printLibFile = [&](const QString & path)
{ {
QFileInfo info(path); QFileInfo info(path);
@ -594,7 +603,7 @@ QStringList MinecraftInstance::verboseDescription(AuthSessionPtr session)
out << ""; out << "";
} }
auto & jarMods = m_profile->getJarMods(); auto & jarMods = profile->getJarMods();
if(jarMods.size()) if(jarMods.size())
{ {
out << "Jar Mods:"; out << "Jar Mods:";
@ -989,8 +998,9 @@ std::shared_ptr<WorldList> MinecraftInstance::worldList() const
QList< Mod > MinecraftInstance::getJarMods() const QList< Mod > MinecraftInstance::getJarMods() const
{ {
auto profile = m_components->getProfile();
QList<Mod> mods; QList<Mod> mods;
for (auto jarmod : m_profile->getJarMods()) for (auto jarmod : profile->getJarMods())
{ {
QStringList jar, temp1, temp2, temp3; QStringList jar, temp1, temp2, temp3;
jarmod->getApplicableFiles(currentSystem, jar, temp1, temp2, temp3, jarmodsPath().absolutePath()); jarmod->getApplicableFiles(currentSystem, jar, temp1, temp2, temp3, jarmodsPath().absolutePath());

View File

@ -19,7 +19,9 @@ public:
virtual ~MinecraftInstance() {}; virtual ~MinecraftInstance() {};
virtual void init() override; virtual void init() override;
// FIXME: remove
QString typeName() const override; QString typeName() const override;
// FIXME: remove
QSet<QString> traits() const override; QSet<QString> traits() const override;
bool canEdit() const override bool canEdit() const override
@ -91,15 +93,21 @@ public:
QString getStatusbarDescription() override; QString getStatusbarDescription() override;
// FIXME: remove
virtual QStringList getClassPath() const; virtual QStringList getClassPath() const;
// FIXME: remove
virtual QStringList getNativeJars() const; virtual QStringList getNativeJars() const;
// FIXME: remove
virtual QString getMainClass() const; virtual QString getMainClass() const;
// FIXME: remove
virtual QStringList processMinecraftArgs(AuthSessionPtr account) const; virtual QStringList processMinecraftArgs(AuthSessionPtr account) const;
virtual JavaVersion getJavaVersion() const; virtual JavaVersion getJavaVersion() const;
// FIXME: remove
QString getComponentVersion(const QString &uid) const; QString getComponentVersion(const QString &uid) const;
// FIXME: remove
bool setComponentVersion(const QString &uid, const QString &version); bool setComponentVersion(const QString &uid, const QString &version);
signals: signals:
@ -114,7 +122,7 @@ private:
QString prettifyTimeDuration(int64_t duration); QString prettifyTimeDuration(int64_t duration);
protected: // data protected: // data
std::shared_ptr<ComponentList> m_profile; std::shared_ptr<ComponentList> m_components;
mutable std::shared_ptr<ModList> m_loader_mod_list; mutable std::shared_ptr<ModList> m_loader_mod_list;
mutable std::shared_ptr<ModList> m_core_mod_list; mutable std::shared_ptr<ModList> m_core_mod_list;
mutable std::shared_ptr<ModList> m_resource_pack_list; mutable std::shared_ptr<ModList> m_resource_pack_list;

View File

@ -22,7 +22,7 @@ std::shared_ptr<Meta::Version> ProfilePatch::getMeta()
return m_metaVersion; return m_metaVersion;
} }
void ProfilePatch::applyTo(ComponentList* profile) void ProfilePatch::applyTo(LaunchProfile* profile)
{ {
auto vfile = getVersionFile(); auto vfile = getVersionFile();
if(vfile) if(vfile)
@ -35,7 +35,7 @@ void ProfilePatch::applyTo(ComponentList* profile)
} }
} }
std::shared_ptr<class VersionFile> ProfilePatch::getVersionFile() std::shared_ptr<class VersionFile> ProfilePatch::getVersionFile() const
{ {
if(m_metaVersion) if(m_metaVersion)
{ {
@ -51,7 +51,7 @@ std::shared_ptr<class VersionFile> ProfilePatch::getVersionFile()
} }
} }
std::shared_ptr<class Meta::VersionList> ProfilePatch::getVersionList() std::shared_ptr<class Meta::VersionList> ProfilePatch::getVersionList() const
{ {
if(m_metaVersion) if(m_metaVersion)
{ {
@ -167,7 +167,7 @@ void ProfilePatch::setMovable (bool state)
m_isMovable = state; m_isMovable = state;
} }
ProblemSeverity ProfilePatch::getProblemSeverity() ProblemSeverity ProfilePatch::getProblemSeverity() const
{ {
auto file = getVersionFile(); auto file = getVersionFile();
if(file) if(file)
@ -177,7 +177,7 @@ ProblemSeverity ProfilePatch::getProblemSeverity()
return ProblemSeverity::Error; return ProblemSeverity::Error;
} }
const QList<PatchProblem> ProfilePatch::getProblems() const QList<PatchProblem> ProfilePatch::getProblems() const
{ {
auto file = getVersionFile(); auto file = getVersionFile();
if(file) if(file)

View File

@ -7,6 +7,7 @@
#include "ProblemProvider.h" #include "ProblemProvider.h"
class ComponentList; class ComponentList;
class LaunchProfile;
namespace Meta namespace Meta
{ {
class Version; class Version;
@ -21,7 +22,7 @@ public:
ProfilePatch(std::shared_ptr<VersionFile> file, const QString &filename = QString()); ProfilePatch(std::shared_ptr<VersionFile> file, const QString &filename = QString());
virtual ~ProfilePatch(){}; virtual ~ProfilePatch(){};
virtual void applyTo(ComponentList *profile); virtual void applyTo(LaunchProfile *profile);
virtual bool isMoveable(); virtual bool isMoveable();
virtual bool isCustomizable(); virtual bool isCustomizable();
@ -41,16 +42,16 @@ public:
virtual QString getFilename(); virtual QString getFilename();
virtual std::shared_ptr<class VersionFile> getVersionFile(); virtual std::shared_ptr<class VersionFile> getVersionFile() const;
virtual std::shared_ptr<class Meta::VersionList> getVersionList(); virtual std::shared_ptr<class Meta::VersionList> getVersionList() const;
void setVanilla (bool state); void setVanilla (bool state);
void setRemovable (bool state); void setRemovable (bool state);
void setRevertible (bool state); void setRevertible (bool state);
void setMovable (bool state); void setMovable (bool state);
const QList<PatchProblem> getProblems() override; const QList<PatchProblem> getProblems() const override;
ProblemSeverity getProblemSeverity() override; ProblemSeverity getProblemSeverity() const override;
protected: protected:
// Properties for UI and version manipulation from UI in general // Properties for UI and version manipulation from UI in general

View File

@ -15,7 +15,7 @@ static bool isMinecraftVersion(const QString &uid)
return uid == "net.minecraft"; return uid == "net.minecraft";
} }
void VersionFile::applyTo(ComponentList *profile) void VersionFile::applyTo(LaunchProfile *profile)
{ {
// Only real Minecraft can set those. Don't let anything override them. // Only real Minecraft can set those. Don't let anything override them.
if (isMinecraftVersion(uid)) if (isMinecraftVersion(uid))

View File

@ -13,6 +13,7 @@
class ComponentList; class ComponentList;
class VersionFile; class VersionFile;
class LaunchProfile;
struct MojangDownloadInfo; struct MojangDownloadInfo;
struct MojangAssetIndexInfo; struct MojangAssetIndexInfo;
@ -22,7 +23,7 @@ class VersionFile : public ProblemContainer
friend class MojangVersionFormat; friend class MojangVersionFormat;
friend class OneSixVersionFormat; friend class OneSixVersionFormat;
public: /* methods */ public: /* methods */
void applyTo(ComponentList *profile); void applyTo(LaunchProfile* profile);
public: /* data */ public: /* data */
/// MultiMC: order hint for this version file if no explicit order is set /// MultiMC: order hint for this version file if no explicit order is set

View File

@ -42,7 +42,8 @@ void ModMinecraftJar::executeTask()
} }
// create temporary modded jar, if needed // create temporary modded jar, if needed
auto profile = m_inst->getComponentList(); auto components = m_inst->getComponentList();
auto profile = components->getProfile();
auto jarMods = m_inst->getJarMods(); auto jarMods = m_inst->getJarMods();
if(jarMods.size()) if(jarMods.size())
{ {

View File

@ -12,7 +12,8 @@ AssetUpdateTask::AssetUpdateTask(MinecraftInstance * inst)
void AssetUpdateTask::executeTask() void AssetUpdateTask::executeTask()
{ {
setStatus(tr("Updating assets index...")); setStatus(tr("Updating assets index..."));
auto profile = m_inst->getComponentList(); auto components = m_inst->getComponentList();
auto profile = components->getProfile();
auto assets = profile->getMinecraftAssets(); auto assets = profile->getMinecraftAssets();
QUrl indexUrl = assets->url; QUrl indexUrl = assets->url;
QString localPath = assets->id + ".json"; QString localPath = assets->id + ".json";
@ -48,7 +49,8 @@ void AssetUpdateTask::assetIndexFinished()
AssetsIndex index; AssetsIndex index;
qDebug() << m_inst->name() << ": Finished asset index download"; qDebug() << m_inst->name() << ": Finished asset index download";
auto profile = m_inst->getComponentList(); auto components = m_inst->getComponentList();
auto profile = components->getProfile();
auto assets = profile->getMinecraftAssets(); auto assets = profile->getMinecraftAssets();
QString asset_fname = "assets/indexes/" + assets->id + ".json"; QString asset_fname = "assets/indexes/" + assets->id + ".json";

View File

@ -13,7 +13,8 @@ void FMLLibrariesTask::executeTask()
{ {
// Get the mod list // Get the mod list
MinecraftInstance *inst = (MinecraftInstance *)m_inst; MinecraftInstance *inst = (MinecraftInstance *)m_inst;
std::shared_ptr<ComponentList> profile = inst->getComponentList(); auto components = inst->getComponentList();
auto profile = components->getProfile();
bool forge_present = false; bool forge_present = false;
if (!profile->hasTrait("legacyFML")) if (!profile->hasTrait("legacyFML"))
@ -34,7 +35,7 @@ void FMLLibrariesTask::executeTask()
// determine if we need some libs for FML or forge // determine if we need some libs for FML or forge
setStatus(tr("Checking for FML libraries...")); setStatus(tr("Checking for FML libraries..."));
forge_present = (profile->versionPatch("net.minecraftforge") != nullptr); forge_present = (components->versionPatch("net.minecraftforge") != nullptr);
// we don't... // we don't...
if (!forge_present) if (!forge_present)
{ {

View File

@ -21,7 +21,8 @@ void LibrariesTask::executeTask()
} }
// Build a list of URLs that will need to be downloaded. // Build a list of URLs that will need to be downloaded.
std::shared_ptr<ComponentList> profile = inst->getComponentList(); auto components = inst->getComponentList();
auto profile = components->getProfile();
auto job = new NetJob(tr("Libraries for instance %1").arg(inst->name())); auto job = new NetJob(tr("Libraries for instance %1").arg(inst->name()));
downloadJob.reset(job); downloadJob.reset(job);