NOISSUE split out the LaunchProfile out of the ComponentList
This commit is contained in:
		| @@ -237,6 +237,8 @@ set(MINECRAFT_SOURCES | ||||
| 	minecraft/GradleSpecifier.h | ||||
| 	minecraft/MinecraftInstance.cpp | ||||
| 	minecraft/MinecraftInstance.h | ||||
| 	minecraft/LaunchProfile.cpp | ||||
| 	minecraft/LaunchProfile.h | ||||
| 	minecraft/ComponentList.cpp | ||||
| 	minecraft/ComponentList.h | ||||
| 	minecraft/MinecraftUpdate.h | ||||
|   | ||||
| @@ -16,18 +16,19 @@ struct PatchProblem | ||||
| class ProblemProvider | ||||
| { | ||||
| public: | ||||
| 	virtual const QList<PatchProblem> getProblems() = 0; | ||||
| 	virtual ProblemSeverity getProblemSeverity() = 0; | ||||
| 	virtual ~ProblemProvider() {}; | ||||
| 	virtual const QList<PatchProblem> getProblems() const = 0; | ||||
| 	virtual ProblemSeverity getProblemSeverity() const = 0; | ||||
| }; | ||||
|  | ||||
| class ProblemContainer : public ProblemProvider | ||||
| { | ||||
| public: | ||||
| 	const QList<PatchProblem> getProblems() override | ||||
| 	const QList<PatchProblem> getProblems() const override | ||||
| 	{ | ||||
| 		return m_problems; | ||||
| 	} | ||||
| 	ProblemSeverity getProblemSeverity() override | ||||
| 	ProblemSeverity getProblemSeverity() const override | ||||
| 	{ | ||||
| 		return m_problemSeverity; | ||||
| 	} | ||||
|   | ||||
| @@ -35,7 +35,6 @@ ComponentList::ComponentList(MinecraftInstance * instance) | ||||
| 	: QAbstractListModel() | ||||
| { | ||||
| 	m_instance = instance; | ||||
| 	clear(); | ||||
| } | ||||
|  | ||||
| ComponentList::~ComponentList() | ||||
| @@ -50,22 +49,6 @@ void ComponentList::reload() | ||||
| 	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() | ||||
| { | ||||
| 	beginResetModel(); | ||||
| @@ -365,290 +348,22 @@ bool ComponentList::reapplyPatches() | ||||
| { | ||||
| 	try | ||||
| 	{ | ||||
| 		clear(); | ||||
| 		m_profile.reset(new LaunchProfile); | ||||
| 		for(auto file: m_patches) | ||||
| 		{ | ||||
| 			qDebug() << "Applying" << file->getID() << (file->getProblemSeverity() == ProblemSeverity::Error ? "ERROR" : "GOOD"); | ||||
| 			file->applyTo(this); | ||||
| 			file->applyTo(m_profile.get()); | ||||
| 		} | ||||
| 	} | ||||
| 	catch (Exception & error) | ||||
| 	{ | ||||
| 		clear(); | ||||
| 		m_profile.reset(); | ||||
| 		qWarning() << "Couldn't apply profile patches because: " << error.cause(); | ||||
| 		return false; | ||||
| 	} | ||||
| 	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) | ||||
| { | ||||
| 	installJarMods_internal(selectedFiles); | ||||
| @@ -1122,4 +837,14 @@ bool ComponentList::installCustomJar_internal(QString filepath) | ||||
| 	saveCurrentOrder(); | ||||
| 	reapplyPatches(); | ||||
| 	return true; | ||||
| } | ||||
| } | ||||
|  | ||||
| std::shared_ptr<LaunchProfile> ComponentList::getProfile() const | ||||
| { | ||||
| 	return m_profile; | ||||
| } | ||||
|  | ||||
| void ComponentList::clearProfile() | ||||
| { | ||||
| 	m_profile.reset(); | ||||
| } | ||||
|   | ||||
| @@ -22,11 +22,11 @@ | ||||
| #include <memory> | ||||
|  | ||||
| #include "Library.h" | ||||
| #include "LaunchProfile.h" | ||||
| #include "ProfilePatch.h" | ||||
| #include "ProfileUtils.h" | ||||
| #include "BaseVersion.h" | ||||
| #include "MojangDownloadInfo.h" | ||||
|  | ||||
| #include "multimc_logic_export.h" | ||||
|  | ||||
| class MinecraftInstance; | ||||
| @@ -80,45 +80,11 @@ public: | ||||
| 	/// reload all profile patches from storage, clear the profile and apply the patches | ||||
| 	void reload(); | ||||
|  | ||||
| 	/// clear the profile | ||||
| 	void clear(); | ||||
|  | ||||
| 	/// apply the patches. Catches all the errors and returns true/false for success/failure | ||||
| 	bool reapplyPatches(); | ||||
|  | ||||
| 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); | ||||
|  | ||||
| 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; | ||||
|  | ||||
| 	std::shared_ptr<LaunchProfile> getProfile() const; | ||||
| 	void clearProfile(); | ||||
| public: | ||||
| 	/// get the profile patch by id | ||||
| 	ProfilePatchPtr versionPatch(const QString &id); | ||||
| @@ -149,55 +115,11 @@ private: | ||||
| 	void upgradeDeprecatedFiles_internal(); | ||||
|  | ||||
| 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 | ||||
| 	QList<ProfilePatchPtr> m_patches; | ||||
|  | ||||
| 	// the instance this belongs to | ||||
| 	MinecraftInstance *m_instance; | ||||
|  | ||||
| 	std::shared_ptr<LaunchProfile> m_profile; | ||||
| }; | ||||
|   | ||||
							
								
								
									
										297
									
								
								api/logic/minecraft/LaunchProfile.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										297
									
								
								api/logic/minecraft/LaunchProfile.cpp
									
									
									
									
									
										Normal 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); | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										99
									
								
								api/logic/minecraft/LaunchProfile.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								api/logic/minecraft/LaunchProfile.h
									
									
									
									
									
										Normal 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; | ||||
|  | ||||
| }; | ||||
| @@ -133,38 +133,39 @@ bool MinecraftInstance::reload() | ||||
|  | ||||
| void MinecraftInstance::createProfile() | ||||
| { | ||||
| 	m_profile.reset(new ComponentList(this)); | ||||
| 	m_components.reset(new ComponentList(this)); | ||||
| } | ||||
|  | ||||
| void MinecraftInstance::reloadProfile() | ||||
| { | ||||
| 	m_profile->reload(); | ||||
| 	setVersionBroken(m_profile->getProblemSeverity() == ProblemSeverity::Error); | ||||
| 	m_components->reload(); | ||||
| 	emit versionReloaded(); | ||||
| } | ||||
|  | ||||
| void MinecraftInstance::clearProfile() | ||||
| { | ||||
| 	m_profile->clear(); | ||||
| 	m_components->clearProfile(); | ||||
| 	emit versionReloaded(); | ||||
| } | ||||
|  | ||||
| std::shared_ptr<ComponentList> MinecraftInstance::getComponentList() const | ||||
| { | ||||
| 	return m_profile; | ||||
| 	return m_components; | ||||
| } | ||||
|  | ||||
| QSet<QString> MinecraftInstance::traits() const | ||||
| { | ||||
| 	auto version = getComponentList(); | ||||
| 	if (!version) | ||||
| 	auto components = getComponentList(); | ||||
| 	if (!components) | ||||
| 	{ | ||||
| 		return {"version-incomplete"}; | ||||
| 	} | ||||
| 	else | ||||
| 	auto profile = components->getProfile(); | ||||
| 	if (!profile) | ||||
| 	{ | ||||
| 		return version->getTraits(); | ||||
| 		return {"version-incomplete"}; | ||||
| 	} | ||||
| 	return profile->getTraits(); | ||||
| } | ||||
|  | ||||
| QString MinecraftInstance::minecraftRoot() const | ||||
| @@ -254,20 +255,23 @@ QStringList MinecraftInstance::getClassPath() const | ||||
| { | ||||
| 	QStringList jars, nativeJars; | ||||
| 	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; | ||||
| } | ||||
|  | ||||
| QString MinecraftInstance::getMainClass() const | ||||
| { | ||||
| 	return m_profile->getMainClass(); | ||||
| 	auto profile = m_components->getProfile(); | ||||
| 	return profile->getMainClass(); | ||||
| } | ||||
|  | ||||
| QStringList MinecraftInstance::getNativeJars() const | ||||
| { | ||||
| 	QStringList jars, nativeJars; | ||||
| 	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; | ||||
| } | ||||
|  | ||||
| @@ -298,11 +302,11 @@ QStringList MinecraftInstance::javaArguments() const | ||||
| 	args << "-Xdock:icon=icon.png"; | ||||
| 	args << QString("-Xdock:name=\"%1\"").arg(windowTitle()); | ||||
| #endif | ||||
| 	auto traits = m_profile->getTraits(); | ||||
| 	auto traits_ = traits(); | ||||
| 	// 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 | ||||
| #ifdef Q_OS_MAC | ||||
| 	if(traits.contains("FirstThreadOnMacOS")) | ||||
| 	if(traits_.contains("FirstThreadOnMacOS")) | ||||
| 	{ | ||||
| 		args << QString("-XstartOnFirstThread"); | ||||
| 	} | ||||
| @@ -395,8 +399,9 @@ static QString replaceTokensIn(QString text, QMap<QString, QString> with) | ||||
|  | ||||
| QStringList MinecraftInstance::processMinecraftArgs(AuthSessionPtr session) const | ||||
| { | ||||
| 	QString args_pattern = m_profile->getMinecraftArguments(); | ||||
| 	for (auto tweaker : m_profile->getTweakers()) | ||||
| 	auto profile = m_components->getProfile(); | ||||
| 	QString args_pattern = profile->getMinecraftArguments(); | ||||
| 	for (auto tweaker : profile->getTweakers()) | ||||
| 	{ | ||||
| 		args_pattern += " --tweakClass " + tweaker; | ||||
| 	} | ||||
| @@ -416,9 +421,9 @@ QStringList MinecraftInstance::processMinecraftArgs(AuthSessionPtr session) cons | ||||
|  | ||||
| 	// blatant self-promotion. | ||||
| 	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 | ||||
| 	{ | ||||
| @@ -428,7 +433,7 @@ QStringList MinecraftInstance::processMinecraftArgs(AuthSessionPtr session) cons | ||||
| 	QString absRootDir = QDir(minecraftRoot()).absolutePath(); | ||||
| 	token_mapping["game_directory"] = absRootDir; | ||||
| 	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 | ||||
| 	token_mapping["game_assets"] = AssetsUtils::reconstructAssets(assets->id).absolutePath(); | ||||
|  | ||||
| @@ -448,15 +453,18 @@ QString MinecraftInstance::createLaunchScript(AuthSessionPtr session) | ||||
| { | ||||
| 	QString launchScript; | ||||
|  | ||||
| 	if (!m_profile) | ||||
| 		return nullptr; | ||||
| 	if (!m_components) | ||||
| 		return QString(); | ||||
| 	auto profile = m_components->getProfile(); | ||||
| 	if(!profile) | ||||
| 		return QString(); | ||||
|  | ||||
| 	auto mainClass = getMainClass(); | ||||
| 	if (!mainClass.isEmpty()) | ||||
| 	{ | ||||
| 		launchScript += "mainClass " + mainClass + "\n"; | ||||
| 	} | ||||
| 	auto appletClass = m_profile->getAppletClass(); | ||||
| 	auto appletClass = profile->getAppletClass(); | ||||
| 	if (!appletClass.isEmpty()) | ||||
| 	{ | ||||
| 		launchScript += "appletClass " + appletClass + "\n"; | ||||
| @@ -492,7 +500,7 @@ QString MinecraftInstance::createLaunchScript(AuthSessionPtr session) | ||||
| 	{ | ||||
| 		QStringList jars, nativeJars; | ||||
| 		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) | ||||
| 		{ | ||||
| 			launchScript += "cp " + file + "\n"; | ||||
| @@ -504,7 +512,7 @@ QString MinecraftInstance::createLaunchScript(AuthSessionPtr session) | ||||
| 		launchScript += "natives " + getNativePath() + "\n"; | ||||
| 	} | ||||
|  | ||||
| 	for (auto trait : m_profile->getTraits()) | ||||
| 	for (auto trait : profile->getTraits()) | ||||
| 	{ | ||||
| 		launchScript += "traits " + trait + "\n"; | ||||
| 	} | ||||
| @@ -519,6 +527,7 @@ QStringList MinecraftInstance::verboseDescription(AuthSessionPtr session) | ||||
| 	out << "Main Class:" << "  " + getMainClass() << ""; | ||||
| 	out << "Native path:" << "  " + getNativePath() << ""; | ||||
|  | ||||
| 	auto profile = m_components->getProfile(); | ||||
|  | ||||
| 	auto alltraits = traits(); | ||||
| 	if(alltraits.size()) | ||||
| @@ -536,7 +545,7 @@ QStringList MinecraftInstance::verboseDescription(AuthSessionPtr session) | ||||
| 		out << "Libraries:"; | ||||
| 		QStringList jars, nativeJars; | ||||
| 		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) | ||||
| 		{ | ||||
| 			QFileInfo info(path); | ||||
| @@ -594,7 +603,7 @@ QStringList MinecraftInstance::verboseDescription(AuthSessionPtr session) | ||||
| 		out << ""; | ||||
| 	} | ||||
|  | ||||
| 	auto & jarMods = m_profile->getJarMods(); | ||||
| 	auto & jarMods = profile->getJarMods(); | ||||
| 	if(jarMods.size()) | ||||
| 	{ | ||||
| 		out << "Jar Mods:"; | ||||
| @@ -989,8 +998,9 @@ std::shared_ptr<WorldList> MinecraftInstance::worldList() const | ||||
|  | ||||
| QList< Mod > MinecraftInstance::getJarMods() const | ||||
| { | ||||
| 	auto profile = m_components->getProfile(); | ||||
| 	QList<Mod> mods; | ||||
| 	for (auto jarmod : m_profile->getJarMods()) | ||||
| 	for (auto jarmod : profile->getJarMods()) | ||||
| 	{ | ||||
| 		QStringList jar, temp1, temp2, temp3; | ||||
| 		jarmod->getApplicableFiles(currentSystem, jar, temp1, temp2, temp3, jarmodsPath().absolutePath()); | ||||
|   | ||||
| @@ -19,7 +19,9 @@ public: | ||||
| 	virtual ~MinecraftInstance() {}; | ||||
| 	virtual void init() override; | ||||
|  | ||||
| 	// FIXME: remove | ||||
| 	QString typeName() const override; | ||||
| 	// FIXME: remove | ||||
| 	QSet<QString> traits() const override; | ||||
|  | ||||
| 	bool canEdit() const override | ||||
| @@ -91,15 +93,21 @@ public: | ||||
|  | ||||
| 	QString getStatusbarDescription() override; | ||||
|  | ||||
| 	// FIXME: remove | ||||
| 	virtual QStringList getClassPath() const; | ||||
| 	// FIXME: remove | ||||
| 	virtual QStringList getNativeJars() const; | ||||
| 	// FIXME: remove | ||||
| 	virtual QString getMainClass() const; | ||||
|  | ||||
| 	// FIXME: remove | ||||
| 	virtual QStringList processMinecraftArgs(AuthSessionPtr account) const; | ||||
|  | ||||
| 	virtual JavaVersion getJavaVersion() const; | ||||
|  | ||||
| 	// FIXME: remove | ||||
| 	QString getComponentVersion(const QString &uid) const; | ||||
| 	// FIXME: remove | ||||
| 	bool setComponentVersion(const QString &uid, const QString &version); | ||||
|  | ||||
| signals: | ||||
| @@ -114,7 +122,7 @@ private: | ||||
| 	QString prettifyTimeDuration(int64_t duration); | ||||
|  | ||||
| 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_core_mod_list; | ||||
| 	mutable std::shared_ptr<ModList> m_resource_pack_list; | ||||
|   | ||||
| @@ -22,7 +22,7 @@ std::shared_ptr<Meta::Version> ProfilePatch::getMeta() | ||||
| 	return m_metaVersion; | ||||
| } | ||||
|  | ||||
| void ProfilePatch::applyTo(ComponentList* profile) | ||||
| void ProfilePatch::applyTo(LaunchProfile* profile) | ||||
| { | ||||
| 	auto vfile = getVersionFile(); | ||||
| 	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) | ||||
| 	{ | ||||
| @@ -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) | ||||
| 	{ | ||||
| @@ -167,7 +167,7 @@ void ProfilePatch::setMovable (bool state) | ||||
| 	m_isMovable = state; | ||||
| } | ||||
|  | ||||
| ProblemSeverity ProfilePatch::getProblemSeverity() | ||||
| ProblemSeverity ProfilePatch::getProblemSeverity() const | ||||
| { | ||||
| 	auto file = getVersionFile(); | ||||
| 	if(file) | ||||
| @@ -177,7 +177,7 @@ ProblemSeverity ProfilePatch::getProblemSeverity() | ||||
| 	return ProblemSeverity::Error; | ||||
| } | ||||
|  | ||||
| const QList<PatchProblem> ProfilePatch::getProblems() | ||||
| const QList<PatchProblem> ProfilePatch::getProblems() const | ||||
| { | ||||
| 	auto file = getVersionFile(); | ||||
| 	if(file) | ||||
|   | ||||
| @@ -7,6 +7,7 @@ | ||||
| #include "ProblemProvider.h" | ||||
|  | ||||
| class ComponentList; | ||||
| class LaunchProfile; | ||||
| namespace Meta | ||||
| { | ||||
| 	class Version; | ||||
| @@ -21,7 +22,7 @@ public: | ||||
| 	ProfilePatch(std::shared_ptr<VersionFile> file, const QString &filename = QString()); | ||||
|  | ||||
| 	virtual ~ProfilePatch(){}; | ||||
| 	virtual void applyTo(ComponentList *profile); | ||||
| 	virtual void applyTo(LaunchProfile *profile); | ||||
|  | ||||
| 	virtual bool isMoveable(); | ||||
| 	virtual bool isCustomizable(); | ||||
| @@ -41,16 +42,16 @@ public: | ||||
|  | ||||
| 	virtual QString getFilename(); | ||||
|  | ||||
| 	virtual std::shared_ptr<class VersionFile> getVersionFile(); | ||||
| 	virtual std::shared_ptr<class Meta::VersionList> getVersionList(); | ||||
| 	virtual std::shared_ptr<class VersionFile> getVersionFile() const; | ||||
| 	virtual std::shared_ptr<class Meta::VersionList> getVersionList() const; | ||||
|  | ||||
| 	void setVanilla (bool state); | ||||
| 	void setRemovable (bool state); | ||||
| 	void setRevertible (bool state); | ||||
| 	void setMovable (bool state); | ||||
|  | ||||
| 	const QList<PatchProblem> getProblems() override; | ||||
| 	ProblemSeverity getProblemSeverity() override; | ||||
| 	const QList<PatchProblem> getProblems() const override; | ||||
| 	ProblemSeverity getProblemSeverity() const override; | ||||
|  | ||||
| protected: | ||||
| 	// Properties for UI and version manipulation from UI in general | ||||
|   | ||||
| @@ -15,7 +15,7 @@ static bool isMinecraftVersion(const QString &uid) | ||||
| 	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. | ||||
| 	if (isMinecraftVersion(uid)) | ||||
|   | ||||
| @@ -13,6 +13,7 @@ | ||||
|  | ||||
| class ComponentList; | ||||
| class VersionFile; | ||||
| class LaunchProfile; | ||||
| struct MojangDownloadInfo; | ||||
| struct MojangAssetIndexInfo; | ||||
|  | ||||
| @@ -22,7 +23,7 @@ class VersionFile : public ProblemContainer | ||||
| 	friend class MojangVersionFormat; | ||||
| 	friend class OneSixVersionFormat; | ||||
| public: /* methods */ | ||||
| 	void applyTo(ComponentList *profile); | ||||
| 	void applyTo(LaunchProfile* profile); | ||||
|  | ||||
| public: /* data */ | ||||
| 	/// MultiMC: order hint for this version file if no explicit order is set | ||||
|   | ||||
| @@ -42,7 +42,8 @@ void ModMinecraftJar::executeTask() | ||||
| 	} | ||||
|  | ||||
| 	// 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(); | ||||
| 	if(jarMods.size()) | ||||
| 	{ | ||||
|   | ||||
| @@ -12,7 +12,8 @@ AssetUpdateTask::AssetUpdateTask(MinecraftInstance * inst) | ||||
| void AssetUpdateTask::executeTask() | ||||
| { | ||||
| 	setStatus(tr("Updating assets index...")); | ||||
| 	auto profile = m_inst->getComponentList(); | ||||
| 	auto components = m_inst->getComponentList(); | ||||
| 	auto profile = components->getProfile(); | ||||
| 	auto assets = profile->getMinecraftAssets(); | ||||
| 	QUrl indexUrl = assets->url; | ||||
| 	QString localPath = assets->id + ".json"; | ||||
| @@ -48,7 +49,8 @@ void AssetUpdateTask::assetIndexFinished() | ||||
| 	AssetsIndex index; | ||||
| 	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(); | ||||
|  | ||||
| 	QString asset_fname = "assets/indexes/" + assets->id + ".json"; | ||||
|   | ||||
| @@ -13,7 +13,8 @@ void FMLLibrariesTask::executeTask() | ||||
| { | ||||
| 	// Get the mod list | ||||
| 	MinecraftInstance *inst = (MinecraftInstance *)m_inst; | ||||
| 	std::shared_ptr<ComponentList> profile = inst->getComponentList(); | ||||
| 	auto components = inst->getComponentList(); | ||||
| 	auto profile = components->getProfile(); | ||||
| 	bool forge_present = false; | ||||
|  | ||||
| 	if (!profile->hasTrait("legacyFML")) | ||||
| @@ -34,7 +35,7 @@ void FMLLibrariesTask::executeTask() | ||||
|  | ||||
| 	// determine if we need some libs for FML or forge | ||||
| 	setStatus(tr("Checking for FML libraries...")); | ||||
| 	forge_present = (profile->versionPatch("net.minecraftforge") != nullptr); | ||||
| 	forge_present = (components->versionPatch("net.minecraftforge") != nullptr); | ||||
| 	// we don't... | ||||
| 	if (!forge_present) | ||||
| 	{ | ||||
|   | ||||
| @@ -21,7 +21,8 @@ void LibrariesTask::executeTask() | ||||
| 	} | ||||
|  | ||||
| 	// 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())); | ||||
| 	downloadJob.reset(job); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user