Make forge work.
Using classifiers FTW.
This commit is contained in:
		| @@ -357,6 +357,9 @@ void MultiMC::initGlobalSettings() | ||||
| 	m_settings->registerSetting("AutoUpdate", true); | ||||
| 	m_settings->registerSetting("IconTheme", QString("multimc")); | ||||
|  | ||||
| 	// Minecraft Sneaky Updates | ||||
| 	m_settings->registerSetting("AutoUpdateMinecraftVersions", true); | ||||
|  | ||||
| 	// Notifications | ||||
| 	m_settings->registerSetting("ShownNotifications", QString()); | ||||
|  | ||||
|   | ||||
| @@ -29,10 +29,7 @@ class IconPickerDialog : public QDialog | ||||
| public: | ||||
| 	explicit IconPickerDialog(QWidget *parent = 0); | ||||
| 	~IconPickerDialog(); | ||||
| 	#pragma clang diagnostic push | ||||
| 	#pragma clang diagnostic ignored "-Woverloaded-virtual" | ||||
| 	int exec(QString selection); | ||||
| 	#pragma clang diagnostic pop | ||||
| 	QString selectedIconKey; | ||||
|  | ||||
| protected: | ||||
|   | ||||
| @@ -34,10 +34,7 @@ public: | ||||
|  | ||||
| 	void updateSize(); | ||||
|  | ||||
| 	#pragma clang diagnostic push | ||||
| 	#pragma clang diagnostic ignored "-Woverloaded-virtual" | ||||
| 	int exec(ProgressProvider *task); | ||||
| 	#pragma clang diagnostic pop | ||||
|  | ||||
| 	void setSkipButton(bool present, QString label = QString()); | ||||
|  | ||||
|   | ||||
| @@ -365,6 +365,9 @@ void SettingsDialog::applySettings(SettingsObject *s) | ||||
| 	} | ||||
| 	s->set("JsonEditor", jsonEditor); | ||||
|  | ||||
| 	// Minecraft version updates | ||||
| 	s->set("AutoUpdateMinecraftVersions", ui->autoupdateMinecraft->isChecked()); | ||||
|  | ||||
| 	// Console | ||||
| 	s->set("ShowConsole", ui->showConsoleCheck->isChecked()); | ||||
| 	s->set("AutoCloseConsole", ui->autoCloseConsoleCheck->isChecked()); | ||||
| @@ -470,6 +473,9 @@ void SettingsDialog::loadSettings(SettingsObject *s) | ||||
| 	// Editors | ||||
| 	ui->jsonEditorTextBox->setText(s->get("JsonEditor").toString()); | ||||
|  | ||||
| 	// Minecraft version updates | ||||
| 	ui->autoupdateMinecraft->setChecked(s->get("AutoUpdateMinecraftVersions").toBool()); | ||||
| 	 | ||||
| 	// Console | ||||
| 	ui->showConsoleCheck->setChecked(s->get("ShowConsole").toBool()); | ||||
| 	ui->autoCloseConsoleCheck->setChecked(s->get("AutoCloseConsole").toBool()); | ||||
|   | ||||
| @@ -409,6 +409,22 @@ | ||||
|        <string>Minecraft</string> | ||||
|       </attribute> | ||||
|       <layout class="QVBoxLayout" name="verticalLayout_3"> | ||||
|        <item> | ||||
|         <widget class="QGroupBox" name="groupBox_5"> | ||||
|          <property name="title"> | ||||
|           <string>Minecraft Version Updates</string> | ||||
|          </property> | ||||
|          <layout class="QVBoxLayout" name="verticalLayout_14"> | ||||
|           <item> | ||||
|            <widget class="QCheckBox" name="autoupdateMinecraft"> | ||||
|             <property name="text"> | ||||
|              <string>Automatically update to latest version revision</string> | ||||
|             </property> | ||||
|            </widget> | ||||
|           </item> | ||||
|          </layout> | ||||
|         </widget> | ||||
|        </item> | ||||
|        <item> | ||||
|         <widget class="QGroupBox" name="windowSizeGroupBox"> | ||||
|          <property name="title"> | ||||
| @@ -1056,11 +1072,30 @@ | ||||
|   </layout> | ||||
|  </widget> | ||||
|  <tabstops> | ||||
|   <tabstop>buttonBox</tabstop> | ||||
|   <tabstop>settingsTabs</tabstop> | ||||
|   <tabstop>autoUpdateCheckBox</tabstop> | ||||
|   <tabstop>updateChannelComboBox</tabstop> | ||||
|   <tabstop>trackFtbBox</tabstop> | ||||
|   <tabstop>ftbLauncherBox</tabstop> | ||||
|   <tabstop>ftbLauncherBrowseBtn</tabstop> | ||||
|   <tabstop>ftbBox</tabstop> | ||||
|   <tabstop>ftbBrowseBtn</tabstop> | ||||
|   <tabstop>instDirTextBox</tabstop> | ||||
|   <tabstop>instDirBrowseBtn</tabstop> | ||||
|   <tabstop>modsDirTextBox</tabstop> | ||||
|   <tabstop>modsDirBrowseBtn</tabstop> | ||||
|   <tabstop>lwjglDirTextBox</tabstop> | ||||
|   <tabstop>lwjglDirBrowseBtn</tabstop> | ||||
|   <tabstop>iconsDirTextBox</tabstop> | ||||
|   <tabstop>iconsDirBrowseBtn</tabstop> | ||||
|   <tabstop>languageBox</tabstop> | ||||
|   <tabstop>resetNotificationsBtn</tabstop> | ||||
|   <tabstop>sortLastLaunchedBtn</tabstop> | ||||
|   <tabstop>sortByNameBtn</tabstop> | ||||
|   <tabstop>themeComboBox</tabstop> | ||||
|   <tabstop>jsonEditorTextBox</tabstop> | ||||
|   <tabstop>jsonEditorBrowseBtn</tabstop> | ||||
|   <tabstop>autoupdateMinecraft</tabstop> | ||||
|   <tabstop>maximizedCheckBox</tabstop> | ||||
|   <tabstop>windowWidthSpinBox</tabstop> | ||||
|   <tabstop>windowHeightSpinBox</tabstop> | ||||
| @@ -1076,7 +1111,23 @@ | ||||
|   <tabstop>jvmArgsTextBox</tabstop> | ||||
|   <tabstop>preLaunchCmdTextBox</tabstop> | ||||
|   <tabstop>postExitCmdTextBox</tabstop> | ||||
|   <tabstop>settingsTabs</tabstop> | ||||
|   <tabstop>proxyDefaultBtn</tabstop> | ||||
|   <tabstop>proxyNoneBtn</tabstop> | ||||
|   <tabstop>proxySOCKS5Btn</tabstop> | ||||
|   <tabstop>proxyHTTPBtn</tabstop> | ||||
|   <tabstop>proxyAddrEdit</tabstop> | ||||
|   <tabstop>proxyPortEdit</tabstop> | ||||
|   <tabstop>proxyUserEdit</tabstop> | ||||
|   <tabstop>proxyPassEdit</tabstop> | ||||
|   <tabstop>jprofilerPathEdit</tabstop> | ||||
|   <tabstop>jprofilerPathBtn</tabstop> | ||||
|   <tabstop>jprofilerCheckBtn</tabstop> | ||||
|   <tabstop>jvisualvmPathEdit</tabstop> | ||||
|   <tabstop>jvisualvmPathBtn</tabstop> | ||||
|   <tabstop>jvisualvmCheckBtn</tabstop> | ||||
|   <tabstop>mceditPathEdit</tabstop> | ||||
|   <tabstop>mceditPathBtn</tabstop> | ||||
|   <tabstop>mceditCheckBtn</tabstop> | ||||
|  </tabstops> | ||||
|  <resources> | ||||
|   <include location="../../graphics.qrc"/> | ||||
|   | ||||
| @@ -100,10 +100,7 @@ public: | ||||
| 	/*! | ||||
| 	 * Sorts the version list. | ||||
| 	 */ | ||||
| 	#pragma clang diagnostic push | ||||
| 	#pragma clang diagnostic ignored "-Woverloaded-virtual" | ||||
| 	virtual void sort() = 0; | ||||
| 	#pragma clang diagnostic pop | ||||
|  | ||||
| protected | ||||
| slots: | ||||
|   | ||||
| @@ -65,4 +65,8 @@ VersionFilterData::VersionFilterData() | ||||
| 	 * (these versions need to be tested by us first) | ||||
| 	 */ | ||||
| 	legacyCutoffDate = timeFromS3Time("2013-06-25T15:08:56+02:00"); | ||||
| 	lwjglWhitelist = | ||||
| 		QSet<QString>{"net.java.jinput:jinput",	 "net.java.jinput:jinput-platform", | ||||
| 					  "net.java.jutils:jutils",	 "org.lwjgl.lwjgl:lwjgl", | ||||
| 					  "org.lwjgl.lwjgl:lwjgl_util", "org.lwjgl.lwjgl:lwjgl-platform"}; | ||||
| } | ||||
|   | ||||
| @@ -22,5 +22,7 @@ struct VersionFilterData | ||||
| 	QSet<QString> legacyBlacklist; | ||||
| 	// no new versions below this date will be accepted from Mojang servers | ||||
| 	QDateTime legacyCutoffDate; | ||||
| 	// Libraries that belong to LWJGL | ||||
| 	QSet<QString> lwjglWhitelist; | ||||
| }; | ||||
| extern VersionFilterData g_VersionFilterData; | ||||
|   | ||||
| @@ -133,8 +133,8 @@ bool ForgeInstaller::add(OneSixInstance *to) | ||||
| 	int sliding_insert_window = 0; | ||||
| 	{ | ||||
| 		QJsonArray librariesPlus; | ||||
| 		// A blacklist - we ignore these entirely | ||||
| 		QSet<QString> blacklist{"lwjgl", "lwjgl_util", "lwjgl-platform"}; | ||||
| 		// A blacklist | ||||
| 		QSet<QString> blacklist{"authlib", "realms"}; | ||||
| 		//  | ||||
| 		QList<QString> xzlist{"org.scala-lang", "com.typesafe"}; | ||||
| 		// for each library in the version we are adding (except for the blacklisted) | ||||
| @@ -143,15 +143,38 @@ bool ForgeInstaller::add(OneSixInstance *to) | ||||
| 			QString libName = lib->name(); | ||||
| 			QString rawName = lib->rawName(); | ||||
|  | ||||
| 			// ignore blacklisted stuff | ||||
| 			// ignore lwjgl libraries. | ||||
| 			if (g_VersionFilterData.lwjglWhitelist.contains(lib->fullname())) | ||||
| 				continue; | ||||
| 			// ignore other blacklisted (realms, authlib) | ||||
| 			if (blacklist.contains(libName)) | ||||
| 				continue; | ||||
|  | ||||
| 			// WARNING: This could actually break. | ||||
| 			// if this is the actual forge lib, set an absolute url for the download | ||||
| 			if (libName.contains("minecraftforge")) | ||||
| 			if(m_forge_version->type == ForgeVersion::Gradle) | ||||
| 			{ | ||||
| 				lib->setAbsoluteUrl(m_universal_url); | ||||
| 				if (libName == "forge") | ||||
| 				{ | ||||
| 					lib->m_name.setClassifier("universal"); | ||||
| 					lib->finalize(); | ||||
| 				} | ||||
| 				else if (libName == "minecraftforge") | ||||
| 				{ | ||||
| 					QString forgeCoord ("net.minecraftforge:forge:%1:universal"); | ||||
| 					// using insane form of the MC version... | ||||
| 					QString longVersion = m_forge_version->mcver + "-" + m_forge_version->jobbuildver; | ||||
| 					GradleSpecifier spec(forgeCoord.arg(longVersion)); | ||||
| 					lib->m_name = spec; | ||||
| 					lib->finalize(); | ||||
| 				} | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				if (libName.contains("minecraftforge")) | ||||
| 				{ | ||||
| 					lib->setAbsoluteUrl(m_universal_url); | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			// WARNING: This could actually break. | ||||
| @@ -192,7 +215,7 @@ bool ForgeInstaller::add(OneSixInstance *to) | ||||
| 			{ | ||||
| 				// add lib | ||||
| 				libObj.insert("insert", QString("prepend")); | ||||
| 				if (lib->name() == "minecraftforge") | ||||
| 				if (lib->name() == "minecraftforge" || lib->name() == "forge") | ||||
| 				{ | ||||
| 					libObj.insert("MMC-depend", QString("hard")); | ||||
| 				} | ||||
|   | ||||
| @@ -17,6 +17,13 @@ struct ForgeVersion : public BaseVersion | ||||
| 	QString filename(); | ||||
| 	QString url(); | ||||
| 	 | ||||
| 	enum | ||||
| 	{ | ||||
| 		Invalid, | ||||
| 		Legacy, | ||||
| 		Gradle | ||||
| 	} type = Invalid; | ||||
| 	 | ||||
| 	bool usesInstaller(); | ||||
|  | ||||
| 	int m_buildnr = 0; | ||||
|   | ||||
| @@ -286,6 +286,7 @@ bool ForgeListLoadTask::parseForgeList(QList<BaseVersionPtr> &out) | ||||
| 			fVersion->installer_filename = installer_filename; | ||||
| 			fVersion->universal_filename = universal_filename; | ||||
| 			fVersion->m_buildnr = build_nr; | ||||
| 			fVersion->type = ForgeVersion::Legacy; | ||||
| 			out.append(fVersion); | ||||
| 		} | ||||
| 	} | ||||
| @@ -335,6 +336,10 @@ bool ForgeListLoadTask::parseForgeGradleList(QList<BaseVersionPtr> &out) | ||||
| 		QJsonObject number = it.value().toObject(); | ||||
| 		std::shared_ptr<ForgeVersion> fVersion(new ForgeVersion()); | ||||
| 		fVersion->m_buildnr = number.value("build").toDouble(); | ||||
| 		if(fVersion->m_buildnr >= 953 && fVersion->m_buildnr <= 965) | ||||
| 		{ | ||||
| 			QLOG_DEBUG() << fVersion->m_buildnr; | ||||
| 		} | ||||
| 		fVersion->jobbuildver = number.value("version").toString(); | ||||
| 		fVersion->branch = number.value("branch").toString(""); | ||||
| 		fVersion->mcver = number.value("mcversion").toString(); | ||||
| @@ -395,6 +400,7 @@ bool ForgeListLoadTask::parseForgeGradleList(QList<BaseVersionPtr> &out) | ||||
| 		} | ||||
| 		fVersion->universal_filename = universal_filename; | ||||
| 		fVersion->installer_filename = installer_filename; | ||||
| 		fVersion->type = ForgeVersion::Gradle; | ||||
| 		out.append(fVersion); | ||||
| 	} | ||||
| 	return true; | ||||
|   | ||||
| @@ -212,7 +212,7 @@ void LLListLoadTask::listDownloaded() | ||||
| 				{ | ||||
| 					auto lib = RawLibrary::fromJson(libobject, "versions.json"); | ||||
| 					// hack to make liteloader 1.7.10_00 work | ||||
| 					if(lib->m_name == "org.ow2.asm:asm-all:5.0.3") | ||||
| 					if(lib->m_name == GradleSpecifier("org.ow2.asm:asm-all:5.0.3")) | ||||
| 					{ | ||||
| 						lib->m_base_url = "http://repo.maven.apache.org/maven2/"; | ||||
| 					} | ||||
|   | ||||
| @@ -30,13 +30,13 @@ struct GradleSpecifier | ||||
| 		QRegExp matcher("([^:@]+):([^:@]+):([^:@]+)" "(:([^:@]+))?" "(@([^:@]+))?"); | ||||
| 		m_valid = matcher.exactMatch(value); | ||||
| 		auto elements = matcher.capturedTexts(); | ||||
| 		groupId = elements[1]; | ||||
| 		artifactId = elements[2]; | ||||
| 		version = elements[3]; | ||||
| 		classifier = elements[5]; | ||||
| 		m_groupId = elements[1]; | ||||
| 		m_artifactId = elements[2]; | ||||
| 		m_version = elements[3]; | ||||
| 		m_classifier = elements[5]; | ||||
| 		if(!elements[7].isEmpty()) | ||||
| 		{ | ||||
| 			extension = elements[7]; | ||||
| 			m_extension = elements[7]; | ||||
| 		} | ||||
| 		return *this; | ||||
| 	} | ||||
| @@ -44,14 +44,14 @@ struct GradleSpecifier | ||||
| 	{ | ||||
| 		if(!m_valid) | ||||
| 			return "INVALID"; | ||||
| 		QString retval = groupId + ":" + artifactId + ":" + version; | ||||
| 		if(!classifier.isEmpty()) | ||||
| 		QString retval = m_groupId + ":" + m_artifactId + ":" + m_version; | ||||
| 		if(!m_classifier.isEmpty()) | ||||
| 		{ | ||||
| 			retval += ":" + classifier; | ||||
| 			retval += ":" + m_classifier; | ||||
| 		} | ||||
| 		if(extension.isExplicit()) | ||||
| 		if(m_extension.isExplicit()) | ||||
| 		{ | ||||
| 			retval += "@" + extension; | ||||
| 			retval += "@" + m_extension; | ||||
| 		} | ||||
| 		return retval; | ||||
| 	} | ||||
| @@ -59,25 +59,71 @@ struct GradleSpecifier | ||||
| 	{ | ||||
| 		if(!m_valid) | ||||
| 			return "INVALID"; | ||||
| 		QString path = groupId; | ||||
| 		QString path = m_groupId; | ||||
| 		path.replace('.', '/'); | ||||
| 		path += '/' + artifactId + '/' + version + '/' + artifactId + '-' + version; | ||||
| 		if(!classifier.isEmpty()) | ||||
| 		path += '/' + m_artifactId + '/' + m_version + '/' + m_artifactId + '-' + m_version; | ||||
| 		if(!m_classifier.isEmpty()) | ||||
| 		{ | ||||
| 			path += "-" + classifier; | ||||
| 			path += "-" + m_classifier; | ||||
| 		} | ||||
| 		path += "." + extension; | ||||
| 		path += "." + m_extension; | ||||
| 		return path; | ||||
| 	} | ||||
| 	bool valid() | ||||
| 	inline bool valid() const | ||||
| 	{ | ||||
| 		return m_valid; | ||||
| 	} | ||||
| 	inline QString version() const | ||||
| 	{ | ||||
| 		return m_version; | ||||
| 	} | ||||
| 	inline QString groupId() const | ||||
| 	{ | ||||
| 		return m_groupId; | ||||
| 	} | ||||
| 	inline QString artifactId() const | ||||
| 	{ | ||||
| 		return m_artifactId; | ||||
| 	} | ||||
| 	inline void setClassifier(const QString & classifier) | ||||
| 	{ | ||||
| 		m_classifier = classifier; | ||||
| 	} | ||||
| 	inline QString classifier() const | ||||
| 	{ | ||||
| 		return m_classifier; | ||||
| 	} | ||||
| 	inline QString extension() const | ||||
| 	{ | ||||
| 		return m_extension; | ||||
| 	} | ||||
| 	inline QString artifactPrefix() const | ||||
| 	{ | ||||
| 		return m_groupId + ":" + m_artifactId; | ||||
| 	} | ||||
| 	bool matchName(const GradleSpecifier & other) | ||||
| 	{ | ||||
| 		return other.artifactId() == artifactId() && other.groupId() == groupId(); | ||||
| 	} | ||||
| 	bool operator==(const GradleSpecifier & other) | ||||
| 	{ | ||||
| 		if(m_groupId != other.m_groupId) | ||||
| 			return false; | ||||
| 		if(m_artifactId != other.m_artifactId) | ||||
| 			return false; | ||||
| 		if(m_version != other.m_version) | ||||
| 			return false; | ||||
| 		if(m_classifier != other.m_classifier) | ||||
| 			return false; | ||||
| 		if(m_extension != other.m_extension) | ||||
| 			return false; | ||||
| 		return true; | ||||
| 	} | ||||
| private: | ||||
| 	QString groupId; | ||||
| 	QString artifactId; | ||||
| 	QString version; | ||||
| 	QString classifier; | ||||
| 	DefaultVariable<QString> extension = DefaultVariable<QString>("jar"); | ||||
| 	QString m_groupId; | ||||
| 	QString m_artifactId; | ||||
| 	QString m_version; | ||||
| 	QString m_classifier; | ||||
| 	DefaultVariable<QString> m_extension = DefaultVariable<QString>("jar"); | ||||
| 	bool m_valid = false; | ||||
| }; | ||||
|   | ||||
| @@ -2,6 +2,8 @@ | ||||
| #include "InstanceVersion.h" | ||||
| #include "VersionBuildError.h" | ||||
| #include "VersionBuilder.h" | ||||
| #include "MultiMC.h" | ||||
| #include "logic/settings/SettingsObject.h" | ||||
|  | ||||
| bool MinecraftVersion::usesLegacyLauncher() | ||||
| { | ||||
| @@ -141,3 +143,15 @@ QString MinecraftVersion::getPatchFilename() | ||||
| { | ||||
| 	return QString(); | ||||
| } | ||||
|  | ||||
| bool MinecraftVersion::needsUpdate() | ||||
| { | ||||
| 	auto settings = MMC->settings(); | ||||
| 	bool result = hasUpdate() && settings->get("AutoUpdateMinecraftVersions").toBool(); | ||||
| 	return result; | ||||
| } | ||||
|  | ||||
| bool MinecraftVersion::hasUpdate() | ||||
| { | ||||
| 	return m_versionSource == Remote || (m_versionSource == Local && upstreamUpdate); | ||||
| } | ||||
|   | ||||
| @@ -45,14 +45,8 @@ public: /* methods */ | ||||
| 	virtual QString getPatchVersion() override; | ||||
| 	virtual QString getPatchName() override; | ||||
| 	virtual QString getPatchFilename() override; | ||||
| 	bool needsUpdate() | ||||
| 	{ | ||||
| 		return m_versionSource == Remote; | ||||
| 	} | ||||
| 	bool hasUpdate() | ||||
| 	{ | ||||
| 		return m_versionSource == Remote || (m_versionSource == Local && upstreamUpdate); | ||||
| 	} | ||||
| 	bool needsUpdate(); | ||||
| 	bool hasUpdate(); | ||||
|  | ||||
| private: /* methods */ | ||||
| 	void applyFileTo(InstanceVersion *version); | ||||
|   | ||||
| @@ -266,7 +266,8 @@ void MinecraftVersionList::loadMojangList(QJsonDocument jsonDoc, VersionSource s | ||||
| 		QString versionTypeStr = versionObj.value("type").toString(""); | ||||
| 		if (versionTypeStr.isEmpty()) | ||||
| 		{ | ||||
| 			// FIXME: log this somewhere | ||||
| 			QLOG_ERROR() << "Ignoring" << versionID | ||||
| 						 << "because it doesn't have the version type set."; | ||||
| 			continue; | ||||
| 		} | ||||
| 		// OneSix or Legacy. use filter to determine type | ||||
| @@ -284,10 +285,13 @@ void MinecraftVersionList::loadMojangList(QJsonDocument jsonDoc, VersionSource s | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			// FIXME: log this somewhere | ||||
| 			QLOG_ERROR() << "Ignoring" << versionID | ||||
| 						 << "because it has an invalid version type."; | ||||
| 			continue; | ||||
| 		} | ||||
| 		mcVersion->m_type = versionTypeStr; | ||||
| 		QLOG_INFO() << "Loaded version" << versionID << "from" | ||||
| 					<< ((source == Remote) ? "remote" : "local") << "version list."; | ||||
| 		tempList.append(mcVersion); | ||||
| 	} | ||||
| 	updateListData(tempList); | ||||
| @@ -333,12 +337,6 @@ void MinecraftVersionList::updateListData(QList<BaseVersionPtr> versions) | ||||
| 		{ | ||||
| 			continue; | ||||
| 		} | ||||
| 		// is it actually an update? | ||||
| 		if (orig->m_updateTime >= added->m_updateTime) | ||||
| 		{ | ||||
| 			// nope. | ||||
| 			continue; | ||||
| 		} | ||||
| 		// alright, it's an update. put it inside the original, for further processing. | ||||
| 		orig->upstreamUpdate = added; | ||||
| 	} | ||||
| @@ -451,13 +449,10 @@ void MCVListVersionUpdateTask::json_downloaded() | ||||
| 	} | ||||
| 	QList<RawLibraryPtr> filteredLibs; | ||||
| 	QList<RawLibraryPtr> lwjglLibs; | ||||
| 	QSet<QString> lwjglFilter = { | ||||
| 		"net.java.jinput:jinput",	 "net.java.jinput:jinput-platform", | ||||
| 		"net.java.jutils:jutils",	 "org.lwjgl.lwjgl:lwjgl", | ||||
| 		"org.lwjgl.lwjgl:lwjgl_util", "org.lwjgl.lwjgl:lwjgl-platform"}; | ||||
|  | ||||
| 	for (auto lib : file->overwriteLibs) | ||||
| 	{ | ||||
| 		if (lwjglFilter.contains(lib->fullname())) | ||||
| 		if (g_VersionFilterData.lwjglWhitelist.contains(lib->fullname())) | ||||
| 		{ | ||||
| 			lwjglLibs.append(lib); | ||||
| 		} | ||||
| @@ -581,9 +576,11 @@ void MinecraftVersionList::finalizeUpdate(QString version) | ||||
|  | ||||
| 	auto updatedVersion = std::dynamic_pointer_cast<MinecraftVersion>(m_vlist[idx]); | ||||
|  | ||||
| 	// reject any updates to builtin versions. | ||||
| 	if (updatedVersion->m_versionSource == Builtin) | ||||
| 		return; | ||||
|  | ||||
| 	// if we have an update for the version, replace it, make the update local | ||||
| 	if (updatedVersion->upstreamUpdate) | ||||
| 	{ | ||||
| 		auto updatedWith = updatedVersion->upstreamUpdate; | ||||
| @@ -593,6 +590,7 @@ void MinecraftVersionList::finalizeUpdate(QString version) | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		// otherwise, just set the version as local; | ||||
| 		updatedVersion->m_versionSource = Local; | ||||
| 	} | ||||
|  | ||||
|   | ||||
| @@ -30,7 +30,7 @@ OneSixLibrary::OneSixLibrary(RawLibraryPtr base) | ||||
| 	m_hint = base->m_hint; | ||||
| 	m_absolute_url = base->m_absolute_url; | ||||
| 	extract_excludes = base->extract_excludes; | ||||
| 	m_native_suffixes = base->m_native_suffixes; | ||||
| 	m_native_classifiers = base->m_native_classifiers; | ||||
| 	m_rules = base->m_rules; | ||||
| 	finalize(); | ||||
| } | ||||
| @@ -42,34 +42,8 @@ OneSixLibraryPtr OneSixLibrary::fromRawLibrary(RawLibraryPtr lib) | ||||
|  | ||||
| void OneSixLibrary::finalize() | ||||
| { | ||||
| 	QStringList parts = m_name.split(':'); | ||||
| 	QString relative = parts[0]; | ||||
| 	relative.replace('.', '/'); | ||||
| 	relative += '/' + parts[1] + '/' + parts[2] + '/' + parts[1] + '-' + parts[2]; | ||||
|  | ||||
| 	if (!isNative()) | ||||
| 		relative += ".jar"; | ||||
| 	else | ||||
| 	{ | ||||
| 		if (m_native_suffixes.contains(currentSystem)) | ||||
| 		{ | ||||
| 			relative += "-" + m_native_suffixes[currentSystem] + ".jar"; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			// really, bad. | ||||
| 			relative += ".jar"; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	m_decentname = parts[1]; | ||||
| 	m_decentversion = minVersion = parts[2]; | ||||
| 	m_storage_path = relative; | ||||
| 	if(m_base_url.isEmpty()) | ||||
| 		m_download_url = QString("https://" + URLConstants::LIBRARY_BASE) + relative; | ||||
| 	else | ||||
| 		m_download_url = m_base_url + relative; | ||||
|  | ||||
| 	QString relative; | ||||
| 	 | ||||
| 	if (m_rules.empty()) | ||||
| 	{ | ||||
| 		m_is_active = true; | ||||
| @@ -87,13 +61,32 @@ void OneSixLibrary::finalize() | ||||
| 	} | ||||
| 	if (isNative()) | ||||
| 	{ | ||||
| 		m_is_active = m_is_active && m_native_suffixes.contains(currentSystem); | ||||
| 		GradleSpecifier nativeSpec = m_name; | ||||
| 		m_is_active = m_is_active && m_native_classifiers.contains(currentSystem); | ||||
| 		m_decenttype = "Native"; | ||||
| 		if(m_native_classifiers.contains(currentSystem)) | ||||
| 		{ | ||||
| 			nativeSpec.setClassifier(m_native_classifiers[currentSystem]); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			nativeSpec.setClassifier("INVALID"); | ||||
| 		} | ||||
| 		relative = nativeSpec.toPath(); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		relative = m_name.toPath(); | ||||
| 		m_decenttype = "Java"; | ||||
| 	} | ||||
|  | ||||
| 	m_decentname = m_name.artifactId(); | ||||
| 	m_decentversion = minVersion = m_name.version(); | ||||
| 	m_storage_path = relative; | ||||
| 	if(m_base_url.isEmpty()) | ||||
| 		m_download_url = QString("https://" + URLConstants::LIBRARY_BASE) + relative; | ||||
| 	else | ||||
| 		m_download_url = m_base_url + relative; | ||||
| } | ||||
|  | ||||
| void OneSixLibrary::setName(const QString &name) | ||||
| @@ -106,11 +99,11 @@ void OneSixLibrary::setBaseUrl(const QString &base_url) | ||||
| } | ||||
| void OneSixLibrary::addNative(OpSys os, const QString &suffix) | ||||
| { | ||||
| 	m_native_suffixes[os] = suffix; | ||||
| 	m_native_classifiers[os] = suffix; | ||||
| } | ||||
| void OneSixLibrary::clearSuffixes() | ||||
| { | ||||
| 	m_native_suffixes.clear(); | ||||
| 	m_native_classifiers.clear(); | ||||
| } | ||||
| void OneSixLibrary::setRules(QList<std::shared_ptr<Rule>> rules) | ||||
| { | ||||
|   | ||||
| @@ -54,7 +54,7 @@ RawLibraryPtr RawLibrary::fromJson(const QJsonObject &libObj, const QString &fil | ||||
| 			OpSys opSys = OpSys_fromString(it.key()); | ||||
| 			if (opSys != Os_Other) | ||||
| 			{ | ||||
| 				out->m_native_suffixes[opSys] = it.value().toString(); | ||||
| 				out->m_native_classifiers[opSys] = it.value().toString(); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| @@ -134,13 +134,13 @@ RawLibraryPtr RawLibrary::fromJsonPlus(const QJsonObject &libObj, const QString | ||||
|  | ||||
| bool RawLibrary::isNative() const | ||||
| { | ||||
| 	return m_native_suffixes.size() != 0; | ||||
| 	return m_native_classifiers.size() != 0; | ||||
| } | ||||
|  | ||||
| QJsonObject RawLibrary::toJson() | ||||
| { | ||||
| 	QJsonObject libRoot; | ||||
| 	libRoot.insert("name", m_name); | ||||
| 	libRoot.insert("name", (QString)m_name); | ||||
| 	if (m_absolute_url.size()) | ||||
| 		libRoot.insert("MMC-absoluteUrl", m_absolute_url); | ||||
| 	if (m_hint.size()) | ||||
| @@ -154,8 +154,8 @@ QJsonObject RawLibrary::toJson() | ||||
| 	if (isNative()) | ||||
| 	{ | ||||
| 		QJsonObject nativeList; | ||||
| 		auto iter = m_native_suffixes.begin(); | ||||
| 		while (iter != m_native_suffixes.end()) | ||||
| 		auto iter = m_native_classifiers.begin(); | ||||
| 		while (iter != m_native_classifiers.end()) | ||||
| 		{ | ||||
| 			nativeList.insert(OpSys_toString(iter.key()), iter.value()); | ||||
| 			iter++; | ||||
| @@ -188,18 +188,5 @@ QJsonObject RawLibrary::toJson() | ||||
|  | ||||
| QString RawLibrary::fullname() | ||||
| { | ||||
| 	QStringList parts = m_name.split(':'); | ||||
| 	return parts[0] + ":" + parts[1]; | ||||
| } | ||||
|  | ||||
| QString RawLibrary::group() | ||||
| { | ||||
| 	QStringList parts = m_name.split(':'); | ||||
| 	return parts[0]; | ||||
| } | ||||
|  | ||||
| QString RawLibrary::version() | ||||
| { | ||||
| 	QStringList parts = m_name.split(':'); | ||||
| 	return parts[2]; | ||||
| 	return m_name.artifactPrefix(); | ||||
| } | ||||
|   | ||||
| @@ -8,6 +8,7 @@ | ||||
|  | ||||
| #include "logic/minecraft/OneSixRule.h" | ||||
| #include "logic/minecraft/OpSys.h" | ||||
| #include "GradleSpecifier.h" | ||||
| #include "logic/net/URLConstants.h" | ||||
|  | ||||
| class RawLibrary; | ||||
| @@ -23,11 +24,9 @@ public: /* methods */ | ||||
| 	QJsonObject toJson(); | ||||
| 	 | ||||
| 	QString fullname(); | ||||
| 	QString version(); | ||||
| 	QString group(); | ||||
| 	 | ||||
| public: /* data */ | ||||
| 	QString m_name; | ||||
| 	GradleSpecifier m_name; | ||||
| 	QString m_base_url; | ||||
|  | ||||
| 	/// type hint - modifies how the library is treated | ||||
| @@ -41,7 +40,7 @@ public: /* data */ | ||||
| 	/// Returns true if the library is native | ||||
| 	bool isNative() const; | ||||
| 	/// native suffixes per OS | ||||
| 	QMap<OpSys, QString> m_native_suffixes; | ||||
| 	QMap<OpSys, QString> m_native_classifiers; | ||||
|  | ||||
| 	bool applyRules = false; | ||||
| 	QList<std::shared_ptr<Rule>> m_rules; | ||||
|   | ||||
| @@ -17,13 +17,13 @@ using namespace MMCJson; | ||||
|  | ||||
| #define CURRENT_MINIMUM_LAUNCHER_VERSION 14 | ||||
|  | ||||
| int findLibrary(QList<OneSixLibraryPtr> haystack, const QString &needle) | ||||
| int findLibraryByName(QList<OneSixLibraryPtr> haystack, const GradleSpecifier &needle) | ||||
| { | ||||
| 	int retval = -1; | ||||
| 	for (int i = 0; i < haystack.size(); ++i) | ||||
| 	{ | ||||
| 		QString chunk = haystack.at(i)->rawName(); | ||||
| 		if (QRegExp(needle, Qt::CaseSensitive, QRegExp::WildcardUnix).indexIn(chunk) != -1) | ||||
| 		 | ||||
| 		if(haystack.at(i)->m_name.matchName(needle)) | ||||
| 		{ | ||||
| 			// only one is allowed. | ||||
| 			if (retval != -1) | ||||
| @@ -382,7 +382,7 @@ void VersionFile::applyTo(InstanceVersion *version) | ||||
| 		case RawLibrary::Apply: | ||||
| 		{ | ||||
| 			// QLOG_INFO() << "Applying lib " << lib->name; | ||||
| 			int index = findLibrary(version->libraries, lib->m_name); | ||||
| 			int index = findLibraryByName(version->libraries, lib->m_name); | ||||
| 			if (index >= 0) | ||||
| 			{ | ||||
| 				auto library = version->libraries[index]; | ||||
| @@ -405,7 +405,7 @@ void VersionFile::applyTo(InstanceVersion *version) | ||||
| 				if (lib->isNative()) | ||||
| 				{ | ||||
| 					// library->clearSuffixes(); | ||||
| 					library->m_native_suffixes = lib->m_native_suffixes; | ||||
| 					library->m_native_classifiers = lib->m_native_classifiers; | ||||
| 					/* | ||||
| 					for (auto native : lib->natives) | ||||
| 					{ | ||||
| @@ -429,9 +429,7 @@ void VersionFile::applyTo(InstanceVersion *version) | ||||
| 		case RawLibrary::Prepend: | ||||
| 		{ | ||||
| 			// QLOG_INFO() << "Adding lib " << lib->name; | ||||
| 			const int startOfVersion = lib->m_name.lastIndexOf(':') + 1; | ||||
| 			const int index = findLibrary( | ||||
| 				version->libraries, QString(lib->m_name).replace(startOfVersion, INT_MAX, '*')); | ||||
| 			const int index = findLibraryByName(version->libraries, lib->m_name); | ||||
| 			if (index < 0) | ||||
| 			{ | ||||
| 				if (lib->insertType == RawLibrary::Append) | ||||
| @@ -446,8 +444,8 @@ void VersionFile::applyTo(InstanceVersion *version) | ||||
| 			else | ||||
| 			{ | ||||
| 				auto otherLib = version->libraries.at(index); | ||||
| 				const Util::Version ourVersion = lib->m_name.mid(startOfVersion, INT_MAX); | ||||
| 				const Util::Version otherVersion = otherLib->version(); | ||||
| 				const Util::Version ourVersion = lib->m_name.version(); | ||||
| 				const Util::Version otherVersion = otherLib->m_name.version(); | ||||
| 				// if the existing version is a hard dependency we can either use it or | ||||
| 				// fail, but we can't change it | ||||
| 				if (otherLib->dependType == OneSixLibrary::Hard) | ||||
| @@ -497,16 +495,17 @@ void VersionFile::applyTo(InstanceVersion *version) | ||||
| 		} | ||||
| 		case RawLibrary::Replace: | ||||
| 		{ | ||||
| 			QString toReplace; | ||||
| 			GradleSpecifier toReplace; | ||||
| 			if (lib->insertData.isEmpty()) | ||||
| 			{ | ||||
| 				const int startOfVersion = lib->m_name.lastIndexOf(':') + 1; | ||||
| 				toReplace = QString(lib->m_name).replace(startOfVersion, INT_MAX, '*'); | ||||
| 				toReplace = lib->m_name; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				toReplace = lib->insertData; | ||||
| 			} | ||||
| 			// QLOG_INFO() << "Replacing lib " << toReplace << " with " << lib->name; | ||||
| 			int index = findLibrary(version->libraries, toReplace); | ||||
| 			int index = findLibraryByName(version->libraries, toReplace); | ||||
| 			if (index >= 0) | ||||
| 			{ | ||||
| 				version->libraries.replace(index, OneSixLibrary::fromRawLibrary(lib)); | ||||
| @@ -521,7 +520,7 @@ void VersionFile::applyTo(InstanceVersion *version) | ||||
| 	} | ||||
| 	for (auto lib : removeLibs) | ||||
| 	{ | ||||
| 		int index = findLibrary(version->libraries, lib); | ||||
| 		int index = findLibraryByName(version->libraries, lib); | ||||
| 		if (index >= 0) | ||||
| 		{ | ||||
| 			// QLOG_INFO() << "Removing lib " << lib; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user