diff --git a/gui/MCModInfoFrame.ui b/gui/MCModInfoFrame.ui
index b24251ae..60e0a65c 100644
--- a/gui/MCModInfoFrame.ui
+++ b/gui/MCModInfoFrame.ui
@@ -7,7 +7,7 @@
0
0
527
- 68
+ 113
@@ -28,12 +28,6 @@
-
-
-
- 0
- 0
-
-
Select a mod to view title and authors...
@@ -53,12 +47,6 @@
-
-
-
- 0
- 0
-
-
Select a mod to view description...
diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp
index 5784b85a..c726591d 100644
--- a/gui/mainwindow.cpp
+++ b/gui/mainwindow.cpp
@@ -606,6 +606,15 @@ void MainWindow::on_actionChangeInstMCVersion_triggered()
vselect.setFilter(1, "OneSix");
if (vselect.exec() && vselect.selectedVersion())
{
+ if (m_selectedInstance->versionIsCustom())
+ {
+ auto result = QMessageBox::warning(
+ this, tr("Are you sure?"),
+ tr("This will remove any library/version customization you did previously. "
+ "This includes things like Forge install and similar."), QMessageBox::Ok, QMessageBox::Abort);
+ if(result != QMessageBox::Ok)
+ return;
+ }
m_selectedInstance->setIntendedVersionId(vselect.selectedVersion()->descriptor());
}
}
diff --git a/logic/BaseInstance.h b/logic/BaseInstance.h
index e360d3ae..b083c24a 100644
--- a/logic/BaseInstance.h
+++ b/logic/BaseInstance.h
@@ -3,7 +3,7 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
@@ -33,9 +33,9 @@ class BaseInstancePrivate;
/*!
* \brief Base class for instances.
- * This class implements many functions that are common between instances and
+ * This class implements many functions that are common between instances and
* provides a standard interface for all instances.
- *
+ *
* To create a new instance type, create a new class inheriting from this class
* and implement the pure virtual functions.
*/
@@ -44,66 +44,72 @@ class BaseInstance : public QObject
Q_OBJECT
protected:
/// no-touchy!
- BaseInstance(BaseInstancePrivate * d, const QString &rootDir, SettingsObject * settings, QObject *parent = 0);
+ BaseInstance(BaseInstancePrivate *d, const QString &rootDir, SettingsObject *settings,
+ QObject *parent = 0);
+
public:
/// virtual destructor to make sure the destruction is COMPLETE
virtual ~BaseInstance() {};
-
- /// nuke thoroughly - deletes the instance contents, notifies the list/model which is responsible of cleaning up the husk
+
+ /// nuke thoroughly - deletes the instance contents, notifies the list/model which is
+ /// responsible of cleaning up the husk
void nuke();
-
- /// The instance's ID. The ID SHALL be determined by MMC internally. The ID IS guaranteed to be unique.
+
+ /// The instance's ID. The ID SHALL be determined by MMC internally. The ID IS guaranteed to
+ /// be unique.
QString id() const;
-
+
/// get the type of this instance
QString instanceType() const;
-
+
/// Path to the instance's root directory.
QString instanceRoot() const;
-
+
/// Path to the instance's minecraft directory.
QString minecraftRoot() const;
-
+
QString name() const;
void setName(QString val);
-
+
QString iconKey() const;
void setIconKey(QString val);
-
+
QString notes() const;
void setNotes(QString val);
-
+
QString group() const;
void setGroupInitial(QString val);
void setGroupPost(QString val);
-
-
+
virtual QString intendedVersionId() const = 0;
virtual bool setIntendedVersionId(QString version) = 0;
-
+
+ virtual bool versionIsCustom() = 0;
+
/*!
* The instance's current version.
- * This value represents the instance's current version. If this value is
+ * This value represents the instance's current version. If this value is
* different from the intendedVersion, the instance should be updated.
* \warning Don't change this value unless you know what you're doing.
*/
virtual QString currentVersionId() const = 0;
- //virtual void setCurrentVersionId(QString val) = 0;
-
+ // virtual void setCurrentVersionId(QString val) = 0;
+
/*!
* Whether or not Minecraft should be downloaded when the instance is launched.
*/
virtual bool shouldUpdate() const = 0;
virtual void setShouldUpdate(bool val) = 0;
- /// Get the curent base jar of this instance. By default, it's the versions/$version/$version.jar
+ /// Get the curent base jar of this instance. By default, it's the
+ /// versions/$version/$version.jar
QString baseJar() const;
/// the default base jar of this instance
virtual QString defaultBaseJar() const = 0;
/// the default custom base jar of this instance
virtual QString defaultCustomBaseJar() const = 0;
-
+
/*!
* Whether or not custom base jar is used
*/
@@ -114,7 +120,7 @@ public:
*/
QString customBaseJar() const;
void setCustomBaseJar(QString val);
-
+
/**
* Gets the time that the instance was last launched.
* Stored in milliseconds since epoch.
@@ -122,53 +128,54 @@ public:
qint64 lastLaunch() const;
/// Sets the last launched time to 'val' milliseconds since epoch
void setLastLaunch(qint64 val = QDateTime::currentMSecsSinceEpoch());
-
+
/*!
- * \brief Gets the instance list that this instance is a part of.
- * Returns NULL if this instance is not in a list
+ * \brief Gets the instance list that this instance is a part of.
+ * Returns NULL if this instance is not in a list
* (the parent is not an InstanceList).
- * \return A pointer to the InstanceList containing this instance.
+ * \return A pointer to the InstanceList containing this instance.
*/
InstanceList *instList() const;
-
+
/*!
* \brief Gets a pointer to this instance's version list.
* \return A pointer to the available version list for this instance.
*/
virtual std::shared_ptr versionList() const;
-
+
/*!
* \brief Gets this instance's settings object.
* This settings object stores instance-specific settings.
* \return A pointer to this instance's settings object.
*/
virtual SettingsObject &settings() const;
-
+
/// returns a valid update task if update is needed, NULL otherwise
- virtual BaseUpdate* doUpdate() = 0;
-
+ virtual BaseUpdate *doUpdate() = 0;
+
/// returns a valid minecraft process, ready for launch
- virtual MinecraftProcess* prepareForLaunch(LoginResponse response) = 0;
-
- /// do any necessary cleanups after the instance finishes. also runs before 'prepareForLaunch'
+ virtual MinecraftProcess *prepareForLaunch(LoginResponse response) = 0;
+
+ /// do any necessary cleanups after the instance finishes. also runs before
+ /// 'prepareForLaunch'
virtual void cleanupAfterRun() = 0;
-
+
/// create a mod edit dialog for the instance
- virtual QDialog * createModEditDialog ( QWidget* parent ) = 0;
-
+ virtual QDialog *createModEditDialog(QWidget *parent) = 0;
+
/// is a particular action enabled with this instance selected?
virtual bool menuActionEnabled(QString action_name) const = 0;
-
+
virtual QString getStatusbarDescription() = 0;
-
+
/// FIXME: this really should be elsewhere...
virtual QString instanceConfigFolder() const = 0;
-
+
signals:
/*!
* \brief Signal emitted when properties relevant to the instance view change
*/
- void propertiesChanged(BaseInstance * inst);
+ void propertiesChanged(BaseInstance *inst);
/*!
* \brief Signal emitted when groups are affected in any way
*/
@@ -176,12 +183,11 @@ signals:
/*!
* \brief The instance just got nuked. Hurray!
*/
- void nuked(BaseInstance * inst);
-
+ void nuked(BaseInstance *inst);
+
protected:
std::shared_ptr inst_d;
};
// pointer for lazy people
typedef std::shared_ptr InstancePtr;
-
diff --git a/logic/LegacyInstance.h b/logic/LegacyInstance.h
index d7438cca..8bf334f6 100644
--- a/logic/LegacyInstance.h
+++ b/logic/LegacyInstance.h
@@ -9,21 +9,22 @@ class LegacyInstance : public BaseInstance
{
Q_OBJECT
public:
-
- explicit LegacyInstance(const QString &rootDir, SettingsObject * settings, QObject *parent = 0);
-
+
+ explicit LegacyInstance(const QString &rootDir, SettingsObject *settings,
+ QObject *parent = 0);
+
/// Path to the instance's minecraft.jar
QString runnableJar() const;
-
+
//! Path to the instance's modlist file.
QString modListFile() const;
-
+
////// Mod Lists //////
std::shared_ptr jarModList();
std::shared_ptr coreModList();
std::shared_ptr loaderModList();
std::shared_ptr texturePackList();
-
+
////// Directories //////
QString savesDir() const;
QString texturePacksDir() const;
@@ -33,40 +34,47 @@ public:
QString coreModsDir() const;
QString resourceDir() const;
virtual QString instanceConfigFolder() const;
-
+
/*!
* Whether or not the instance's minecraft.jar needs to be rebuilt.
- * If this is true, when the instance launches, its jar mods will be
+ * If this is true, when the instance launches, its jar mods will be
* re-added to a fresh minecraft.jar file.
*/
bool shouldRebuild() const;
void setShouldRebuild(bool val);
-
+
virtual QString currentVersionId() const;
virtual void setCurrentVersionId(QString val);
-
+
//! The version of LWJGL that this instance uses.
QString lwjglVersion() const;
/// st the version of LWJGL libs this instance will use
void setLWJGLVersion(QString val);
-
+
virtual QString intendedVersionId() const;
- virtual bool setIntendedVersionId ( QString version );
-
+ virtual bool setIntendedVersionId(QString version);
+ // the `version' of Legacy instances is defined by the launcher code.
+ // in contrast with OneSix, where `version' is described in a json file
+ virtual bool versionIsCustom() override
+ {
+ return false;
+ };
+
virtual bool shouldUpdate() const;
virtual void setShouldUpdate(bool val);
- virtual BaseUpdate* doUpdate();
-
- virtual MinecraftProcess* prepareForLaunch(LoginResponse response);
+ virtual BaseUpdate *doUpdate();
+
+ virtual MinecraftProcess *prepareForLaunch(LoginResponse response);
virtual void cleanupAfterRun();
- virtual QDialog * createModEditDialog ( QWidget* parent );
-
+ virtual QDialog *createModEditDialog(QWidget *parent);
+
virtual QString defaultBaseJar() const;
virtual QString defaultCustomBaseJar() const;
-
- bool menuActionEnabled ( QString action_name ) const;
+
+ bool menuActionEnabled(QString action_name) const;
virtual QString getStatusbarDescription();
-
-protected slots:
+
+protected
+slots:
virtual void jarModsChanged();
};
\ No newline at end of file
diff --git a/logic/LegacyUpdate.cpp b/logic/LegacyUpdate.cpp
index 5f5a2e52..66b4bf8a 100644
--- a/logic/LegacyUpdate.cpp
+++ b/logic/LegacyUpdate.cpp
@@ -57,7 +57,7 @@ void LegacyUpdate::lwjglStart()
auto worker = MMC->qnam();
QNetworkRequest req(realUrl);
req.setRawHeader("Host", hostname.toLatin1());
- req.setHeader(QNetworkRequest::UserAgentHeader, "Wget/1.14 (linux-gnu)");
+ req.setHeader(QNetworkRequest::UserAgentHeader, "MultiMC/5.0 (Cached)");
QNetworkReply *rep = worker->get(req);
m_reply = std::shared_ptr(rep);
@@ -100,7 +100,7 @@ void LegacyUpdate::lwjglFinished(QNetworkReply *reply)
QString hostname = realUrl.host();
QNetworkRequest req(redirectedTo);
req.setRawHeader("Host", hostname.toLatin1());
- req.setHeader(QNetworkRequest::UserAgentHeader, "Wget/1.14 (linux-gnu)");
+ req.setHeader(QNetworkRequest::UserAgentHeader, "MultiMC/5.0 (Cached)");
QNetworkReply *rep = worker->get(req);
connect(rep, SIGNAL(downloadProgress(qint64, qint64)),
SIGNAL(progress(qint64, qint64)));
diff --git a/logic/OneSixInstance.cpp b/logic/OneSixInstance.cpp
index ad3f9f58..1b7b5bb4 100644
--- a/logic/OneSixInstance.cpp
+++ b/logic/OneSixInstance.cpp
@@ -192,6 +192,11 @@ bool OneSixInstance::setIntendedVersionId(QString version)
{
settings().set("IntendedVersion", version);
setShouldUpdate(true);
+ auto pathCustom = PathCombine(instanceRoot(), "custom.json");
+ auto pathOrig = PathCombine(instanceRoot(), "version.json");
+ QFile::remove(pathCustom);
+ QFile::remove(pathOrig);
+ reloadFullVersion();
return true;
}
@@ -271,7 +276,11 @@ bool OneSixInstance::reloadFullVersion()
d->version = version;
return true;
}
- return false;
+ else
+ {
+ d->version.reset();
+ return false;
+ }
}
std::shared_ptr OneSixInstance::getFullVersion()
diff --git a/logic/OneSixInstance.h b/logic/OneSixInstance.h
index 8f5c22e6..d2276afc 100644
--- a/logic/OneSixInstance.h
+++ b/logic/OneSixInstance.h
@@ -10,33 +10,33 @@ class OneSixInstance : public BaseInstance
{
Q_OBJECT
public:
- explicit OneSixInstance(const QString &rootDir, SettingsObject * settings, QObject *parent = 0);
-
-
+ explicit OneSixInstance(const QString &rootDir, SettingsObject *settings,
+ QObject *parent = 0);
+
////// Mod Lists //////
std::shared_ptr loaderModList();
std::shared_ptr resourcePackList();
-
+
////// Directories //////
QString resourcePacksDir() const;
QString loaderModsDir() const;
virtual QString instanceConfigFolder() const;
-
- virtual BaseUpdate* doUpdate();
- virtual MinecraftProcess* prepareForLaunch ( LoginResponse response );
+
+ virtual BaseUpdate *doUpdate();
+ virtual MinecraftProcess *prepareForLaunch(LoginResponse response);
virtual void cleanupAfterRun();
-
+
virtual QString intendedVersionId() const;
- virtual bool setIntendedVersionId ( QString version );
-
+ virtual bool setIntendedVersionId(QString version);
+
virtual QString currentVersionId() const;
// virtual void setCurrentVersionId ( QString val ) {};
-
+
virtual bool shouldUpdate() const;
virtual void setShouldUpdate(bool val);
-
- virtual QDialog * createModEditDialog ( QWidget* parent );
-
+
+ virtual QDialog *createModEditDialog(QWidget *parent);
+
/// reload the full version json file. return true on success!
bool reloadFullVersion();
/// get the current full version info
@@ -46,13 +46,14 @@ public:
/// customize the current base version
bool customizeVersion();
/// is the current version original, or custom?
- bool versionIsCustom();
-
+ virtual bool versionIsCustom() override;
+
virtual QString defaultBaseJar() const;
virtual QString defaultCustomBaseJar() const;
-
- virtual bool menuActionEnabled ( QString action_name ) const;
+
+ virtual bool menuActionEnabled(QString action_name) const;
virtual QString getStatusbarDescription();
+
private:
- QStringList processMinecraftArgs( LoginResponse response );
+ QStringList processMinecraftArgs(LoginResponse response);
};
\ No newline at end of file