WTF, I don't even...
This commit is contained in:
parent
2e0cbf393a
commit
13b1b98f7c
@ -47,7 +47,6 @@ AppSettings::AppSettings(QObject *parent) :
|
|||||||
// registerSetting(new Setting("StdErrColor", QColor(Qt::red)));
|
// registerSetting(new Setting("StdErrColor", QColor(Qt::red)));
|
||||||
|
|
||||||
// Window Size
|
// Window Size
|
||||||
registerSetting(new Setting("LaunchCompatMode", false));
|
|
||||||
registerSetting(new Setting("LaunchMaximized", false));
|
registerSetting(new Setting("LaunchMaximized", false));
|
||||||
registerSetting(new Setting("MinecraftWinWidth", 854));
|
registerSetting(new Setting("MinecraftWinWidth", 854));
|
||||||
registerSetting(new Setting("MinecraftWinHeight", 480));
|
registerSetting(new Setting("MinecraftWinHeight", 480));
|
||||||
|
@ -17,9 +17,9 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
Version Version::current(VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION, VERSION_BUILD);
|
AppVersion AppVersion::current(VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION, VERSION_BUILD);
|
||||||
|
|
||||||
Version::Version(int major, int minor, int revision, int build, QObject *parent) :
|
AppVersion::AppVersion(int major, int minor, int revision, int build, QObject *parent) :
|
||||||
QObject(parent)
|
QObject(parent)
|
||||||
{
|
{
|
||||||
this->major = major;
|
this->major = major;
|
||||||
@ -28,7 +28,7 @@ Version::Version(int major, int minor, int revision, int build, QObject *parent)
|
|||||||
this->build = build;
|
this->build = build;
|
||||||
}
|
}
|
||||||
|
|
||||||
Version::Version(const Version& ver)
|
AppVersion::AppVersion(const AppVersion& ver)
|
||||||
{
|
{
|
||||||
this->major = ver.major;
|
this->major = ver.major;
|
||||||
this->minor = ver.minor;
|
this->minor = ver.minor;
|
||||||
@ -36,7 +36,7 @@ Version::Version(const Version& ver)
|
|||||||
this->build = ver.build;
|
this->build = ver.build;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString Version::toString() const
|
QString AppVersion::toString() const
|
||||||
{
|
{
|
||||||
return QString("%1.%2.%3.%4").arg(
|
return QString("%1.%2.%3.%4").arg(
|
||||||
QString::number(major),
|
QString::number(major),
|
||||||
|
@ -20,14 +20,14 @@
|
|||||||
/*!
|
/*!
|
||||||
* \brief The Version class represents a MultiMC version number.
|
* \brief The Version class represents a MultiMC version number.
|
||||||
*/
|
*/
|
||||||
class Version : public QObject
|
class AppVersion : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit Version(int major = 0, int minor = 0, int revision = 0,
|
explicit AppVersion(int major = 0, int minor = 0, int revision = 0,
|
||||||
int build = 0, QObject *parent = 0);
|
int build = 0, QObject *parent = 0);
|
||||||
|
|
||||||
Version(const Version& ver);
|
AppVersion(const AppVersion& ver);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Converts the Version to a string.
|
* \brief Converts the Version to a string.
|
||||||
@ -60,6 +60,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
int build;
|
int build;
|
||||||
|
|
||||||
static Version current;
|
static AppVersion current;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "BaseInstance.h"
|
#include "BaseInstance.h"
|
||||||
|
#include "BaseInstance_p.h"
|
||||||
|
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
|
|
||||||
@ -24,56 +25,52 @@
|
|||||||
#include "pathutils.h"
|
#include "pathutils.h"
|
||||||
#include <lists/MinecraftVersionList.h>
|
#include <lists/MinecraftVersionList.h>
|
||||||
|
|
||||||
BaseInstance::BaseInstance(const QString &rootDir, QObject *parent) :
|
|
||||||
QObject(parent)
|
BaseInstance::BaseInstance( BaseInstancePrivate* d_in,
|
||||||
|
const QString& rootDir,
|
||||||
|
SettingsObject* settings_obj,
|
||||||
|
QObject* parent
|
||||||
|
)
|
||||||
|
:inst_d(d_in), QObject(parent)
|
||||||
{
|
{
|
||||||
m_rootDir = rootDir;
|
I_D(BaseInstance);
|
||||||
m_settings = new INISettingsObject(PathCombine(rootDir, "instance.cfg"), this);
|
d->m_settings = settings_obj;
|
||||||
|
d->m_rootDir = rootDir;
|
||||||
|
|
||||||
settings().registerSetting(new Setting("name", "Unnamed Instance"));
|
settings().registerSetting(new Setting("name", "Unnamed Instance"));
|
||||||
settings().registerSetting(new Setting("iconKey", "default"));
|
settings().registerSetting(new Setting("iconKey", "default"));
|
||||||
settings().registerSetting(new Setting("notes", ""));
|
settings().registerSetting(new Setting("notes", ""));
|
||||||
settings().registerSetting(new Setting("NeedsRebuild", true));
|
|
||||||
settings().registerSetting(new Setting("ShouldUpdate", false));
|
|
||||||
settings().registerSetting(new Setting("JarVersion", "Unknown"));
|
|
||||||
settings().registerSetting(new Setting("LwjglVersion", "2.9.0"));
|
|
||||||
settings().registerSetting(new Setting("IntendedJarVersion", ""));
|
|
||||||
settings().registerSetting(new Setting("lastLaunchTime", 0));
|
settings().registerSetting(new Setting("lastLaunchTime", 0));
|
||||||
|
|
||||||
// Java Settings
|
// Java Settings
|
||||||
|
settings().registerSetting(new Setting("OverrideJava", false));
|
||||||
settings().registerSetting(new OverrideSetting("JavaPath", globalSettings->getSetting("JavaPath")));
|
settings().registerSetting(new OverrideSetting("JavaPath", globalSettings->getSetting("JavaPath")));
|
||||||
settings().registerSetting(new OverrideSetting("JvmArgs", globalSettings->getSetting("JvmArgs")));
|
settings().registerSetting(new OverrideSetting("JvmArgs", globalSettings->getSetting("JvmArgs")));
|
||||||
|
|
||||||
// Custom Commands
|
// Custom Commands
|
||||||
settings().registerSetting(new OverrideSetting("PreLaunchCommand",
|
settings().registerSetting(new Setting("OverrideCommands", false));
|
||||||
globalSettings->getSetting("PreLaunchCommand")));
|
settings().registerSetting(new OverrideSetting("PreLaunchCommand", globalSettings->getSetting("PreLaunchCommand")));
|
||||||
settings().registerSetting(new OverrideSetting("PostExitCommand",
|
settings().registerSetting(new OverrideSetting("PostExitCommand", globalSettings->getSetting("PostExitCommand")));
|
||||||
globalSettings->getSetting("PostExitCommand")));
|
|
||||||
|
|
||||||
// Window Size
|
// Window Size
|
||||||
settings().registerSetting(new OverrideSetting("LaunchCompatMode", globalSettings->getSetting("LaunchCompatMode")));
|
settings().registerSetting(new Setting("OverrideWindow", false));
|
||||||
settings().registerSetting(new OverrideSetting("LaunchMaximized", globalSettings->getSetting("LaunchMaximized")));
|
settings().registerSetting(new OverrideSetting("LaunchMaximized", globalSettings->getSetting("LaunchMaximized")));
|
||||||
settings().registerSetting(new OverrideSetting("MinecraftWinWidth", globalSettings->getSetting("MinecraftWinWidth")));
|
settings().registerSetting(new OverrideSetting("MinecraftWinWidth", globalSettings->getSetting("MinecraftWinWidth")));
|
||||||
settings().registerSetting(new OverrideSetting("MinecraftWinHeight", globalSettings->getSetting("MinecraftWinHeight")));
|
settings().registerSetting(new OverrideSetting("MinecraftWinHeight", globalSettings->getSetting("MinecraftWinHeight")));
|
||||||
|
|
||||||
// Memory
|
// Memory
|
||||||
|
settings().registerSetting(new Setting("OverrideMemory", false));
|
||||||
settings().registerSetting(new OverrideSetting("MinMemAlloc", globalSettings->getSetting("MinMemAlloc")));
|
settings().registerSetting(new OverrideSetting("MinMemAlloc", globalSettings->getSetting("MinMemAlloc")));
|
||||||
settings().registerSetting(new OverrideSetting("MaxMemAlloc", globalSettings->getSetting("MaxMemAlloc")));
|
settings().registerSetting(new OverrideSetting("MaxMemAlloc", globalSettings->getSetting("MaxMemAlloc")));
|
||||||
|
|
||||||
// Auto login
|
// Auto login
|
||||||
|
settings().registerSetting(new Setting("OverrideLogin", false));
|
||||||
settings().registerSetting(new OverrideSetting("AutoLogin", globalSettings->getSetting("AutoLogin")));
|
settings().registerSetting(new OverrideSetting("AutoLogin", globalSettings->getSetting("AutoLogin")));
|
||||||
|
|
||||||
// Console
|
// Console
|
||||||
|
settings().registerSetting(new Setting("OverrideConsole", false));
|
||||||
settings().registerSetting(new OverrideSetting("ShowConsole", globalSettings->getSetting("ShowConsole")));
|
settings().registerSetting(new OverrideSetting("ShowConsole", globalSettings->getSetting("ShowConsole")));
|
||||||
settings().registerSetting(new OverrideSetting("AutoCloseConsole", globalSettings->getSetting("AutoCloseConsole")));
|
settings().registerSetting(new OverrideSetting("AutoCloseConsole", globalSettings->getSetting("AutoCloseConsole")));
|
||||||
|
|
||||||
// Overrides
|
|
||||||
settings().registerSetting(new Setting("OverrideConsole", false));
|
|
||||||
settings().registerSetting(new Setting("OverrideWindow", false));
|
|
||||||
settings().registerSetting(new Setting("OverrideLogin", false));
|
|
||||||
settings().registerSetting(new Setting("OverrideMemory", false));
|
|
||||||
settings().registerSetting(new Setting("OverrideJava", false));
|
|
||||||
settings().registerSetting(new Setting("OverrideCommands", false));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString BaseInstance::id() const
|
QString BaseInstance::id() const
|
||||||
@ -81,9 +78,17 @@ QString BaseInstance::id() const
|
|||||||
return QFileInfo(rootDir()).fileName();
|
return QFileInfo(rootDir()).fileName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString BaseInstance::instanceType() const
|
||||||
|
{
|
||||||
|
I_D(BaseInstance);
|
||||||
|
return d->m_settings->get("InstanceType").toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
QString BaseInstance::rootDir() const
|
QString BaseInstance::rootDir() const
|
||||||
{
|
{
|
||||||
return m_rootDir;
|
I_D(BaseInstance);
|
||||||
|
return d->m_rootDir;
|
||||||
}
|
}
|
||||||
|
|
||||||
InstanceList *BaseInstance::instList() const
|
InstanceList *BaseInstance::instList() const
|
||||||
@ -94,106 +99,72 @@ InstanceList *BaseInstance::instList() const
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString BaseInstance::minecraftDir() const
|
|
||||||
{
|
|
||||||
QFileInfo mcDir(PathCombine(rootDir(), "minecraft"));
|
|
||||||
QFileInfo dotMCDir(PathCombine(rootDir(), ".minecraft"));
|
|
||||||
|
|
||||||
if (dotMCDir.exists() && !mcDir.exists())
|
|
||||||
return dotMCDir.filePath();
|
|
||||||
else
|
|
||||||
return mcDir.filePath();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString BaseInstance::instModsDir() const
|
|
||||||
{
|
|
||||||
return PathCombine(rootDir(), "instMods");
|
|
||||||
}
|
|
||||||
|
|
||||||
QString BaseInstance::binDir() const
|
|
||||||
{
|
|
||||||
return PathCombine(minecraftDir(), "bin");
|
|
||||||
}
|
|
||||||
|
|
||||||
QString BaseInstance::savesDir() const
|
|
||||||
{
|
|
||||||
return PathCombine(minecraftDir(), "saves");
|
|
||||||
}
|
|
||||||
|
|
||||||
QString BaseInstance::mlModsDir() const
|
|
||||||
{
|
|
||||||
return PathCombine(minecraftDir(), "mods");
|
|
||||||
}
|
|
||||||
|
|
||||||
QString BaseInstance::coreModsDir() const
|
|
||||||
{
|
|
||||||
return PathCombine(minecraftDir(), "coremods");
|
|
||||||
}
|
|
||||||
|
|
||||||
QString BaseInstance::resourceDir() const
|
|
||||||
{
|
|
||||||
return PathCombine(minecraftDir(), "resources");
|
|
||||||
}
|
|
||||||
|
|
||||||
QString BaseInstance::screenshotsDir() const
|
|
||||||
{
|
|
||||||
return PathCombine(minecraftDir(), "screenshots");
|
|
||||||
}
|
|
||||||
|
|
||||||
QString BaseInstance::texturePacksDir() const
|
|
||||||
{
|
|
||||||
return PathCombine(minecraftDir(), "texturepacks");
|
|
||||||
}
|
|
||||||
|
|
||||||
QString BaseInstance::mcJar() const
|
|
||||||
{
|
|
||||||
return PathCombine(binDir(), "minecraft.jar");
|
|
||||||
}
|
|
||||||
|
|
||||||
QString BaseInstance::mcBackup() const
|
|
||||||
{
|
|
||||||
return PathCombine(binDir(), "mcbackup.jar");
|
|
||||||
}
|
|
||||||
|
|
||||||
QString BaseInstance::modListFile() const
|
|
||||||
{
|
|
||||||
return PathCombine(rootDir(), "modlist");
|
|
||||||
}
|
|
||||||
|
|
||||||
InstVersionList *BaseInstance::versionList() const
|
InstVersionList *BaseInstance::versionList() const
|
||||||
{
|
{
|
||||||
return &MinecraftVersionList::getMainList();
|
return &MinecraftVersionList::getMainList();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BaseInstance::shouldUpdateCurrentVersion() const
|
|
||||||
{
|
|
||||||
QFileInfo jar(mcJar());
|
|
||||||
return jar.lastModified().toUTC().toMSecsSinceEpoch() != lastCurrentVersionUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
void BaseInstance::updateCurrentVersion(bool keepCurrent)
|
|
||||||
{
|
|
||||||
QFileInfo jar(mcJar());
|
|
||||||
|
|
||||||
if(!jar.exists())
|
|
||||||
{
|
|
||||||
setLastCurrentVersionUpdate(0);
|
|
||||||
setCurrentVersion("Unknown");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
qint64 time = jar.lastModified().toUTC().toMSecsSinceEpoch();
|
|
||||||
|
|
||||||
setLastCurrentVersionUpdate(time);
|
|
||||||
if (!keepCurrent)
|
|
||||||
{
|
|
||||||
// TODO: Implement GetMinecraftJarVersion function.
|
|
||||||
QString newVersion = "Unknown";//javautils::GetMinecraftJarVersion(jar.absoluteFilePath());
|
|
||||||
setCurrentVersion(newVersion);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SettingsObject &BaseInstance::settings() const
|
SettingsObject &BaseInstance::settings() const
|
||||||
{
|
{
|
||||||
return *m_settings;
|
I_D(BaseInstance);
|
||||||
|
return *d->m_settings;
|
||||||
|
}
|
||||||
|
|
||||||
|
qint64 BaseInstance::lastLaunch() const
|
||||||
|
{
|
||||||
|
I_D(BaseInstance);
|
||||||
|
return d->m_settings->get ( "lastLaunchTime" ).value<qint64>();
|
||||||
|
}
|
||||||
|
void BaseInstance::setLastLaunch ( qint64 val )
|
||||||
|
{
|
||||||
|
I_D(BaseInstance);
|
||||||
|
d->m_settings->set ( "lastLaunchTime", val );
|
||||||
|
emit propertiesChanged ( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
void BaseInstance::setGroup ( QString val )
|
||||||
|
{
|
||||||
|
I_D(BaseInstance);
|
||||||
|
d->m_group = val;
|
||||||
|
emit propertiesChanged ( this );
|
||||||
|
}
|
||||||
|
QString BaseInstance::group() const
|
||||||
|
{
|
||||||
|
I_D(BaseInstance);
|
||||||
|
return d->m_group;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BaseInstance::setNotes ( QString val )
|
||||||
|
{
|
||||||
|
I_D(BaseInstance);
|
||||||
|
d->m_settings->set ( "notes", val );
|
||||||
|
}
|
||||||
|
QString BaseInstance::notes() const
|
||||||
|
{
|
||||||
|
I_D(BaseInstance);
|
||||||
|
return d->m_settings->get ( "notes" ).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
void BaseInstance::setIconKey ( QString val )
|
||||||
|
{
|
||||||
|
I_D(BaseInstance);
|
||||||
|
d->m_settings->set ( "iconKey", val );
|
||||||
|
emit propertiesChanged ( this );
|
||||||
|
}
|
||||||
|
QString BaseInstance::iconKey() const
|
||||||
|
{
|
||||||
|
I_D(BaseInstance);
|
||||||
|
return d->m_settings->get ( "iconKey" ).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
void BaseInstance::setName ( QString val )
|
||||||
|
{
|
||||||
|
I_D(BaseInstance);
|
||||||
|
d->m_settings->set ( "name", val );
|
||||||
|
emit propertiesChanged ( this );
|
||||||
|
}
|
||||||
|
QString BaseInstance::name() const
|
||||||
|
{
|
||||||
|
I_D(BaseInstance);
|
||||||
|
return d->m_settings->get ( "name" ).toString();
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,10 @@
|
|||||||
|
|
||||||
#include "libmmc_config.h"
|
#include "libmmc_config.h"
|
||||||
|
|
||||||
|
class MinecraftProcess;
|
||||||
|
class GameUpdateTask;
|
||||||
class InstanceList;
|
class InstanceList;
|
||||||
|
class BaseInstancePrivate;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Base class for instances.
|
* \brief Base class for instances.
|
||||||
@ -38,128 +41,21 @@ class InstanceList;
|
|||||||
class LIBMULTIMC_EXPORT BaseInstance : public QObject
|
class LIBMULTIMC_EXPORT BaseInstance : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
protected:
|
||||||
// Properties
|
/// no-touchy!
|
||||||
/*!
|
BaseInstance(BaseInstancePrivate * d, const QString &rootDir, SettingsObject * settings, QObject *parent = 0);
|
||||||
* The instance's ID.
|
|
||||||
* This is a unique identifier string that is, by default, set to the
|
|
||||||
* instance's folder name. It's not always the instance's folder name,
|
|
||||||
* however, as any class deriving from Instance can override the id()
|
|
||||||
* method and change how the ID is determined. The instance's ID should
|
|
||||||
* always remain constant. Undefined behavior results if an already loaded
|
|
||||||
* instance's ID changes.
|
|
||||||
*/
|
|
||||||
Q_PROPERTY(QString id READ id STORED false)
|
|
||||||
|
|
||||||
//! Path to the instance's root directory.
|
|
||||||
Q_PROPERTY(QString rootDir READ rootDir)
|
|
||||||
|
|
||||||
//! The name of the instance that is displayed to the user.
|
|
||||||
Q_PROPERTY(QString name READ name WRITE setName)
|
|
||||||
|
|
||||||
//! The instance's icon key.
|
|
||||||
Q_PROPERTY(QString iconKey READ iconKey WRITE setIconKey)
|
|
||||||
|
|
||||||
//! The instance's notes.
|
|
||||||
Q_PROPERTY(QString notes READ notes WRITE setNotes)
|
|
||||||
|
|
||||||
//! The instance's group.
|
|
||||||
Q_PROPERTY(QString group READ group WRITE setGroup)
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Gets the time that the instance was last launched.
|
|
||||||
* Stored in milliseconds since epoch.
|
|
||||||
* This value is usually used for things like sorting instances by the time
|
|
||||||
* they were last launched.
|
|
||||||
*/
|
|
||||||
Q_PROPERTY(qint64 lastLaunch READ lastLaunch WRITE setLastLaunch)
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* 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
|
|
||||||
* re-added to a fresh minecraft.jar file.
|
|
||||||
*/
|
|
||||||
Q_PROPERTY(bool shouldRebuild READ shouldRebuild WRITE setShouldRebuild)
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Whether or not Minecraft should be downloaded when the instance is launched.
|
|
||||||
* This returns true if shouldForceUpdate game is true or if the intended and
|
|
||||||
* current versions don't match.
|
|
||||||
*/
|
|
||||||
Q_PROPERTY(bool shouldUpdate READ shouldUpdate WRITE setShouldUpdate)
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* The instance's current version.
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
Q_PROPERTY(QString currentVersion READ currentVersion WRITE setCurrentVersion)
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* The version that the user has set for this instance to use.
|
|
||||||
* If this is not the same as currentVersion, the instance's game updater
|
|
||||||
* will be run on launch.
|
|
||||||
*/
|
|
||||||
Q_PROPERTY(QString intendedVersion READ intendedVersion WRITE setIntendedVersion)
|
|
||||||
|
|
||||||
//! The version of LWJGL that this instance uses.
|
|
||||||
Q_PROPERTY(QString lwjglVersion READ lwjglVersion WRITE setLWJGLVersion)
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Gets the last time that the current version was checked.
|
|
||||||
* This is checked against the last modified time on the jar file to see if
|
|
||||||
* the current version needs to be checked again.
|
|
||||||
*/
|
|
||||||
Q_PROPERTY(qint64 lastCurrentVersionUpdate READ lastCurrentVersionUpdate WRITE setLastCurrentVersionUpdate)
|
|
||||||
|
|
||||||
// Dirs
|
|
||||||
//! Path to the instance's .minecraft folder.
|
|
||||||
Q_PROPERTY(QString minecraftDir READ minecraftDir STORED false)
|
|
||||||
|
|
||||||
//! Path to the instance's instMods folder.
|
|
||||||
Q_PROPERTY(QString instModsDir READ instModsDir STORED false)
|
|
||||||
|
|
||||||
//! Path to the instance's bin folder.
|
|
||||||
Q_PROPERTY(QString binDir READ binDir STORED false)
|
|
||||||
|
|
||||||
//! Path to the instance's saves folder.
|
|
||||||
Q_PROPERTY(QString savesDir READ savesDir STORED false)
|
|
||||||
|
|
||||||
//! Path to the instance's mods folder (.minecraft/mods)
|
|
||||||
Q_PROPERTY(QString mlModsDir READ mlModsDir STORED false)
|
|
||||||
|
|
||||||
//! Path to the instance's coremods folder.
|
|
||||||
Q_PROPERTY(QString coreModsDir READ coreModsDir STORED false)
|
|
||||||
|
|
||||||
//! Path to the instance's resources folder.
|
|
||||||
Q_PROPERTY(QString resourceDir READ resourceDir STORED false)
|
|
||||||
|
|
||||||
//! Path to the instance's screenshots folder.
|
|
||||||
Q_PROPERTY(QString screenshotsDir READ screenshotsDir STORED false)
|
|
||||||
|
|
||||||
//! Path to the instance's texturepacks folder.
|
|
||||||
Q_PROPERTY(QString texturePacksDir READ texturePacksDir STORED false)
|
|
||||||
|
|
||||||
|
|
||||||
// Files
|
|
||||||
//! Path to the instance's minecraft.jar
|
|
||||||
Q_PROPERTY(QString mcJar READ mcJar STORED false)
|
|
||||||
|
|
||||||
//! Path to the instance's mcbackup.jar
|
|
||||||
Q_PROPERTY(QString mcBackup READ mcBackup STORED false)
|
|
||||||
|
|
||||||
//! Path to the instance's modlist file.
|
|
||||||
Q_PROPERTY(QString modListFile READ modListFile STORED false)
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit BaseInstance(const QString &rootDir, QObject *parent = 0);
|
/// virtual destructor to make sure the destruction is COMPLETE
|
||||||
|
virtual ~BaseInstance() {};
|
||||||
|
|
||||||
//////// STUFF ////////
|
/// The instance's ID. The ID SHALL be determined by MMC internally. The ID IS guaranteed to be unique.
|
||||||
virtual QString id() const;
|
QString id() const;
|
||||||
|
|
||||||
virtual QString rootDir() const;
|
/// get the type of this instance
|
||||||
|
QString instanceType() const;
|
||||||
|
|
||||||
|
/// Path to the instance's root directory.
|
||||||
|
QString rootDir() const;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Gets the instance list that this instance is a part of.
|
* \brief Gets the instance list that this instance is a part of.
|
||||||
@ -167,128 +63,52 @@ public:
|
|||||||
* (the parent is not an InstanceList).
|
* (the parent is not an InstanceList).
|
||||||
* \return A pointer to the InstanceList containing this instance.
|
* \return A pointer to the InstanceList containing this instance.
|
||||||
*/
|
*/
|
||||||
virtual InstanceList *instList() const;
|
InstanceList *instList() const;
|
||||||
|
|
||||||
|
|
||||||
//////// INSTANCE INFO ////////
|
//////// INSTANCE INFO ////////
|
||||||
|
|
||||||
//// General Info ////
|
/// The name of the instance that is displayed to the user.
|
||||||
virtual QString name() const { return settings().get("name").toString(); }
|
QString name() const;
|
||||||
virtual void setName(QString val)
|
|
||||||
{
|
|
||||||
settings().set("name", val);
|
|
||||||
emit propertiesChanged(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual QString iconKey() const { return settings().get("iconKey").toString(); }
|
/// Set the name of the instance that is displayed to the user.
|
||||||
virtual void setIconKey(QString val)
|
void setName(QString val);
|
||||||
{
|
|
||||||
settings().set("iconKey", val);
|
|
||||||
emit propertiesChanged(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual QString notes() const { return settings().get("notes").toString(); }
|
/// The instance's icon key.
|
||||||
virtual void setNotes(QString val) { settings().set("notes", val); }
|
QString iconKey() const;
|
||||||
|
|
||||||
virtual QString group() const { return m_group; }
|
/// Set the instance's icon key.
|
||||||
virtual void setGroup(QString val)
|
void setIconKey(QString val);
|
||||||
{
|
|
||||||
m_group = val;
|
|
||||||
emit propertiesChanged(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual bool shouldRebuild() const { return settings().get("NeedsRebuild").toBool(); }
|
//! The instance's notes.
|
||||||
virtual void setShouldRebuild(bool val) { settings().set("NeedsRebuild", val); }
|
QString notes() const;
|
||||||
|
|
||||||
|
/// set the instance notes text
|
||||||
|
void setNotes(QString val);
|
||||||
|
|
||||||
//// Version Stuff ////
|
//! The instance's group.
|
||||||
|
QString group() const;
|
||||||
|
|
||||||
virtual QString currentVersion() const { return settings().get("JarVersion").toString(); }
|
/// set the instance group
|
||||||
virtual void setCurrentVersion(QString val) { settings().set("JarVersion", val); }
|
void setGroup(QString val);
|
||||||
|
|
||||||
virtual QString lwjglVersion() const { return settings().get("LwjglVersion").toString(); }
|
|
||||||
virtual void setLWJGLVersion(QString val) { settings().set("LwjglVersion", val); }
|
|
||||||
|
|
||||||
virtual QString intendedVersion() const { return settings().get("IntendedJarVersion").toString(); }
|
|
||||||
virtual void setIntendedVersion(QString val) { settings().set("IntendedJarVersion", val); }
|
|
||||||
|
|
||||||
virtual bool shouldUpdate() const
|
|
||||||
{
|
|
||||||
QVariant var = settings().get("ShouldUpdate");
|
|
||||||
if(!var.isValid() || var.toBool() == false)
|
|
||||||
{
|
|
||||||
return intendedVersion() != currentVersion();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
virtual void setShouldUpdate(bool val) { settings().set("ShouldUpdate", val); }
|
|
||||||
|
|
||||||
//// Timestamps ////
|
//// Timestamps ////
|
||||||
|
|
||||||
virtual qint64 lastLaunch() const { return settings().get("lastLaunchTime").value<qint64>(); }
|
/**
|
||||||
virtual void setLastLaunch(qint64 val = QDateTime::currentMSecsSinceEpoch())
|
* Gets the time that the instance was last launched.
|
||||||
{
|
* Stored in milliseconds since epoch.
|
||||||
settings().set("lastLaunchTime", val);
|
*/
|
||||||
emit propertiesChanged(this);
|
qint64 lastLaunch() const;
|
||||||
}
|
/// Sets the last launched time to 'val' milliseconds since epoch
|
||||||
|
void setLastLaunch(qint64 val = QDateTime::currentMSecsSinceEpoch());
|
||||||
virtual qint64 lastCurrentVersionUpdate() const { return settings().get("lastVersionUpdate").value<qint64>(); }
|
|
||||||
virtual void setLastCurrentVersionUpdate(qint64 val) { settings().set("lastVersionUpdate", val); }
|
|
||||||
|
|
||||||
////// Directories //////
|
|
||||||
QString minecraftDir() const;
|
|
||||||
QString instModsDir() const;
|
|
||||||
QString binDir() const;
|
|
||||||
QString savesDir() const;
|
|
||||||
QString mlModsDir() const;
|
|
||||||
QString coreModsDir() const;
|
|
||||||
QString resourceDir() const;
|
|
||||||
QString screenshotsDir() const;
|
|
||||||
QString texturePacksDir() const;
|
|
||||||
|
|
||||||
|
|
||||||
////// Files //////
|
|
||||||
QString mcJar() const;
|
|
||||||
QString mcBackup() const;
|
|
||||||
QString modListFile() const;
|
|
||||||
|
|
||||||
|
|
||||||
//////// LISTS, LISTS, AND MORE LISTS ////////
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Gets a pointer to this instance's version list.
|
* \brief Gets a pointer to this instance's version list.
|
||||||
* \return A pointer to the available version list for this instance.
|
* \return A pointer to the available version list for this instance.
|
||||||
*/
|
*/
|
||||||
virtual InstVersionList *versionList() const;
|
virtual InstVersionList *versionList() const;
|
||||||
|
|
||||||
|
|
||||||
//////// OTHER FUNCTIONS ////////
|
|
||||||
|
|
||||||
//// Version System ////
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* \brief Checks whether or not the currentVersion of the instance needs to be updated.
|
|
||||||
* If this returns true, updateCurrentVersion is called. In the
|
|
||||||
* standard instance, this is determined by checking a timestamp
|
|
||||||
* stored in the instance config file against the last modified time of Minecraft.jar.
|
|
||||||
* \return True if updateCurrentVersion() should be called.
|
|
||||||
*/
|
|
||||||
virtual bool shouldUpdateCurrentVersion() const;
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* \brief Updates the current version.
|
|
||||||
* This function should first set the current version timestamp
|
|
||||||
* (setCurrentVersionTimestamp()) to the current time. Next, if
|
|
||||||
* keepCurrent is false, this function should check what the
|
|
||||||
* instance's current version is and call setCurrentVersion() to
|
|
||||||
* update it. This function will automatically be called when the
|
|
||||||
* instance is loaded if shouldUpdateCurrentVersion returns true.
|
|
||||||
* \param keepCurrent If true, only the version timestamp will be updated.
|
|
||||||
*/
|
|
||||||
virtual void updateCurrentVersion(bool keepCurrent = false);
|
|
||||||
|
|
||||||
|
|
||||||
//// Settings System ////
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Gets this instance's settings object.
|
* \brief Gets this instance's settings object.
|
||||||
* This settings object stores instance-specific settings.
|
* This settings object stores instance-specific settings.
|
||||||
@ -296,16 +116,20 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual SettingsObject &settings() const;
|
virtual SettingsObject &settings() const;
|
||||||
|
|
||||||
|
/// returns a valid update task if update is needed, NULL otherwise
|
||||||
|
virtual GameUpdateTask* doUpdate() = 0;
|
||||||
|
|
||||||
|
/// returns a valid minecraft process, ready for launch
|
||||||
|
virtual MinecraftProcess* prepareForLaunch(QString user, QString session) = 0;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
/*!
|
/*!
|
||||||
* \brief Signal emitted when properties relevant to the instance view change
|
* \brief Signal emitted when properties relevant to the instance view change
|
||||||
*/
|
*/
|
||||||
void propertiesChanged(BaseInstance * inst);
|
void propertiesChanged(BaseInstance * inst);
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
QString m_rootDir;
|
QSharedPointer<BaseInstancePrivate> inst_d;
|
||||||
QString m_group;
|
|
||||||
SettingsObject *m_settings;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// pointer for lazy people
|
// pointer for lazy people
|
||||||
|
14
backend/BaseInstance_p.h
Normal file
14
backend/BaseInstance_p.h
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <QString>
|
||||||
|
#include <settingsobject.h>
|
||||||
|
|
||||||
|
class BaseInstance;
|
||||||
|
|
||||||
|
#define I_D(Class) Class##Private * const d = (Class##Private * const) inst_d.data()
|
||||||
|
|
||||||
|
struct BaseInstancePrivate
|
||||||
|
{
|
||||||
|
QString m_rootDir;
|
||||||
|
QString m_group;
|
||||||
|
SettingsObject *m_settings;
|
||||||
|
};
|
@ -89,3 +89,5 @@ add_definitions(-DLIBMULTIMC_LIBRARY)
|
|||||||
add_library(backend SHARED ${LIBINST_SOURCES} ${LIBINST_HEADERS})
|
add_library(backend SHARED ${LIBINST_SOURCES} ${LIBINST_HEADERS})
|
||||||
qt5_use_modules(backend Core Network Xml)
|
qt5_use_modules(backend Core Network Xml)
|
||||||
target_link_libraries(backend libUtil libSettings)
|
target_link_libraries(backend libUtil libSettings)
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,8 +19,12 @@
|
|||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
|
|
||||||
#include "BaseInstance.h"
|
#include "BaseInstance.h"
|
||||||
|
#include "LegacyInstance.h"
|
||||||
|
#include "OneSixInstance.h"
|
||||||
|
|
||||||
#include "inifile.h"
|
#include "inifile.h"
|
||||||
|
#include <inisettingsobject.h>
|
||||||
|
#include <setting.h>
|
||||||
|
|
||||||
#include "pathutils.h"
|
#include "pathutils.h"
|
||||||
|
|
||||||
@ -34,12 +38,25 @@ InstanceFactory::InstanceFactory() :
|
|||||||
|
|
||||||
InstanceFactory::InstLoadError InstanceFactory::loadInstance(BaseInstance *&inst, const QString &instDir)
|
InstanceFactory::InstLoadError InstanceFactory::loadInstance(BaseInstance *&inst, const QString &instDir)
|
||||||
{
|
{
|
||||||
BaseInstance *loadedInst = new BaseInstance(instDir, this);
|
auto m_settings = new INISettingsObject(PathCombine(instDir, "instance.cfg"));
|
||||||
|
|
||||||
// TODO: Sanity checks to verify that the instance is valid.
|
m_settings->registerSetting(new Setting("InstanceType", "Legacy"));
|
||||||
|
|
||||||
inst = loadedInst;
|
QString inst_type = m_settings->get("InstanceType").toString();
|
||||||
|
|
||||||
|
//FIXME: replace with a map lookup, where instance classes register their types
|
||||||
|
if(inst_type == "Legacy")
|
||||||
|
{
|
||||||
|
inst = new LegacyInstance(instDir, m_settings, this);
|
||||||
|
}
|
||||||
|
else if(inst_type == "OneSix")
|
||||||
|
{
|
||||||
|
inst = new OneSixInstance(instDir, m_settings, this);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return InstanceFactory::UnknownLoadError;
|
||||||
|
}
|
||||||
return NoLoadError;
|
return NoLoadError;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,8 +70,8 @@ InstanceFactory::InstCreateError InstanceFactory::createInstance(BaseInstance *&
|
|||||||
{
|
{
|
||||||
return InstanceFactory::CantCreateDir;
|
return InstanceFactory::CantCreateDir;
|
||||||
}
|
}
|
||||||
|
return InstanceFactory::UnknownCreateError;
|
||||||
inst = new BaseInstance(instDir, this);
|
//inst = new BaseInstance(instDir, this);
|
||||||
|
|
||||||
//FIXME: really, how do you even know?
|
//FIXME: really, how do you even know?
|
||||||
return InstanceFactory::NoCreateError;
|
return InstanceFactory::NoCreateError;
|
||||||
|
@ -51,10 +51,9 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Creates an instance with the given type and stores it in inst.
|
* \brief Creates a stub instance
|
||||||
*
|
*
|
||||||
* \param inst Pointer to store the created instance in.
|
* \param inst Pointer to store the created instance in.
|
||||||
* \param type The type of instance to create.
|
|
||||||
* \param instDir The instance's directory.
|
* \param instDir The instance's directory.
|
||||||
* \return An InstCreateError error code.
|
* \return An InstCreateError error code.
|
||||||
* - InstExists if the given instance directory is already an instance.
|
* - InstExists if the given instance directory is already an instance.
|
||||||
|
@ -0,0 +1,233 @@
|
|||||||
|
#include "LegacyInstance.h"
|
||||||
|
#include "LegacyInstance_p.h"
|
||||||
|
#include "MinecraftProcess.h"
|
||||||
|
#include <setting.h>
|
||||||
|
#include <pathutils.h>
|
||||||
|
#include <cmdutils.h>
|
||||||
|
#include <QFileInfo>
|
||||||
|
#include <QDir>
|
||||||
|
#include <QImage>
|
||||||
|
|
||||||
|
#define LAUNCHER_FILE "MultiMCLauncher.jar"
|
||||||
|
|
||||||
|
LegacyInstance::LegacyInstance(const QString& rootDir, SettingsObject* settings, QObject* parent)
|
||||||
|
:BaseInstance( new LegacyInstancePrivate(),rootDir, settings, parent)
|
||||||
|
{
|
||||||
|
settings->registerSetting(new Setting("NeedsRebuild", true));
|
||||||
|
settings->registerSetting(new Setting("ShouldUpdate", false));
|
||||||
|
settings->registerSetting(new Setting("JarVersion", "Unknown"));
|
||||||
|
settings->registerSetting(new Setting("LwjglVersion", "2.9.0"));
|
||||||
|
settings->registerSetting(new Setting("IntendedJarVersion", ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
QString LegacyInstance::minecraftDir() const
|
||||||
|
{
|
||||||
|
QFileInfo mcDir(PathCombine(rootDir(), "minecraft"));
|
||||||
|
QFileInfo dotMCDir(PathCombine(rootDir(), ".minecraft"));
|
||||||
|
|
||||||
|
if (dotMCDir.exists() && !mcDir.exists())
|
||||||
|
return dotMCDir.filePath();
|
||||||
|
else
|
||||||
|
return mcDir.filePath();
|
||||||
|
}
|
||||||
|
|
||||||
|
GameUpdateTask* LegacyInstance::doUpdate()
|
||||||
|
{
|
||||||
|
// legacy instances no longer update
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
MinecraftProcess* LegacyInstance::prepareForLaunch(QString user, QString session)
|
||||||
|
{
|
||||||
|
MinecraftProcess * proc = new MinecraftProcess(this);
|
||||||
|
|
||||||
|
// FIXME: extract the icon
|
||||||
|
// QImage(":/icons/instances/" + iconKey()).save(PathCombine(minecraftDir(), "icon.png"));
|
||||||
|
|
||||||
|
// extract the legacy launcher
|
||||||
|
QFile(":/launcher/launcher.jar").copy(PathCombine(minecraftDir(), LAUNCHER_FILE));
|
||||||
|
|
||||||
|
// set the process arguments
|
||||||
|
{
|
||||||
|
QStringList args;
|
||||||
|
|
||||||
|
// window size
|
||||||
|
QString windowSize;
|
||||||
|
if (settings().get("LaunchMaximized").toBool())
|
||||||
|
windowSize = "max";
|
||||||
|
else
|
||||||
|
windowSize = QString("%1x%2").
|
||||||
|
arg(settings().get("MinecraftWinWidth").toInt()).
|
||||||
|
arg(settings().get("MinecraftWinHeight").toInt());
|
||||||
|
|
||||||
|
// window title
|
||||||
|
QString windowTitle;
|
||||||
|
windowTitle.append("MultiMC: ").append(name());
|
||||||
|
|
||||||
|
// Java arguments
|
||||||
|
args.append(Util::Commandline::splitArgs(settings().get("JvmArgs").toString()));
|
||||||
|
|
||||||
|
#ifdef OSX
|
||||||
|
// OSX dock icon and name
|
||||||
|
args << "-Xdock:icon=icon.png";
|
||||||
|
args << QString("-Xdock:name=\"%1\"").arg(windowTitle);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QString lwjgl = QDir(globalSettings->get("LWJGLDir").toString() + "/" + lwjglVersion()).absolutePath();
|
||||||
|
|
||||||
|
// launcher arguments
|
||||||
|
args << QString("-Xms%1m").arg(settings().get("MinMemAlloc").toInt());
|
||||||
|
args << QString("-Xmx%1m").arg(settings().get("MaxMemAlloc").toInt());
|
||||||
|
args << "-jar" << LAUNCHER_FILE;
|
||||||
|
args << user;
|
||||||
|
args << session;
|
||||||
|
args << windowTitle;
|
||||||
|
args << windowSize;
|
||||||
|
args << lwjgl;
|
||||||
|
proc->setMinecraftArguments(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
// set the process work path
|
||||||
|
proc->setMinecraftWorkdir(minecraftDir());
|
||||||
|
|
||||||
|
return proc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QString LegacyInstance::instModsDir() const
|
||||||
|
{
|
||||||
|
return PathCombine(rootDir(), "instMods");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString LegacyInstance::binDir() const
|
||||||
|
{
|
||||||
|
return PathCombine(minecraftDir(), "bin");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString LegacyInstance::savesDir() const
|
||||||
|
{
|
||||||
|
return PathCombine(minecraftDir(), "saves");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString LegacyInstance::mlModsDir() const
|
||||||
|
{
|
||||||
|
return PathCombine(minecraftDir(), "mods");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString LegacyInstance::coreModsDir() const
|
||||||
|
{
|
||||||
|
return PathCombine(minecraftDir(), "coremods");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString LegacyInstance::resourceDir() const
|
||||||
|
{
|
||||||
|
return PathCombine(minecraftDir(), "resources");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString LegacyInstance::mcJar() const
|
||||||
|
{
|
||||||
|
return PathCombine(binDir(), "minecraft.jar");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString LegacyInstance::mcBackup() const
|
||||||
|
{
|
||||||
|
return PathCombine(binDir(), "mcbackup.jar");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString LegacyInstance::modListFile() const
|
||||||
|
{
|
||||||
|
return PathCombine(rootDir(), "modlist");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool LegacyInstance::shouldUpdateCurrentVersion() const
|
||||||
|
{
|
||||||
|
QFileInfo jar(mcJar());
|
||||||
|
return jar.lastModified().toUTC().toMSecsSinceEpoch() != lastCurrentVersionUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LegacyInstance::updateCurrentVersion(bool keepCurrent)
|
||||||
|
{
|
||||||
|
QFileInfo jar(mcJar());
|
||||||
|
|
||||||
|
if(!jar.exists())
|
||||||
|
{
|
||||||
|
setLastCurrentVersionUpdate(0);
|
||||||
|
setCurrentVersion("Unknown");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
qint64 time = jar.lastModified().toUTC().toMSecsSinceEpoch();
|
||||||
|
|
||||||
|
setLastCurrentVersionUpdate(time);
|
||||||
|
if (!keepCurrent)
|
||||||
|
{
|
||||||
|
// TODO: Implement GetMinecraftJarVersion function.
|
||||||
|
QString newVersion = "Unknown";//javautils::GetMinecraftJarVersion(jar.absoluteFilePath());
|
||||||
|
setCurrentVersion(newVersion);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
qint64 LegacyInstance::lastCurrentVersionUpdate() const
|
||||||
|
{
|
||||||
|
I_D(LegacyInstance);
|
||||||
|
return d->m_settings->get ( "lastVersionUpdate" ).value<qint64>();
|
||||||
|
}
|
||||||
|
void LegacyInstance::setLastCurrentVersionUpdate ( qint64 val )
|
||||||
|
{
|
||||||
|
I_D(LegacyInstance);
|
||||||
|
d->m_settings->set ( "lastVersionUpdate", val );
|
||||||
|
}
|
||||||
|
bool LegacyInstance::shouldRebuild() const
|
||||||
|
{
|
||||||
|
I_D(LegacyInstance);
|
||||||
|
return d->m_settings->get ( "NeedsRebuild" ).toBool();
|
||||||
|
}
|
||||||
|
void LegacyInstance::setShouldRebuild ( bool val )
|
||||||
|
{
|
||||||
|
I_D(LegacyInstance);
|
||||||
|
d->m_settings->set ( "NeedsRebuild", val );
|
||||||
|
}
|
||||||
|
QString LegacyInstance::currentVersion() const
|
||||||
|
{
|
||||||
|
I_D(LegacyInstance);
|
||||||
|
return d->m_settings->get ( "JarVersion" ).toString();
|
||||||
|
}
|
||||||
|
void LegacyInstance::setCurrentVersion ( QString val )
|
||||||
|
{
|
||||||
|
I_D(LegacyInstance);
|
||||||
|
d->m_settings->set ( "JarVersion", val );
|
||||||
|
}
|
||||||
|
QString LegacyInstance::lwjglVersion() const
|
||||||
|
{
|
||||||
|
I_D(LegacyInstance);
|
||||||
|
return d->m_settings->get ( "LwjglVersion" ).toString();
|
||||||
|
}
|
||||||
|
void LegacyInstance::setLWJGLVersion ( QString val )
|
||||||
|
{
|
||||||
|
I_D(LegacyInstance);
|
||||||
|
d->m_settings->set ( "LwjglVersion", val );
|
||||||
|
}
|
||||||
|
QString LegacyInstance::intendedVersion() const
|
||||||
|
{
|
||||||
|
I_D(LegacyInstance);
|
||||||
|
return d->m_settings->get ( "IntendedJarVersion" ).toString();
|
||||||
|
}
|
||||||
|
void LegacyInstance::setIntendedVersion ( QString val )
|
||||||
|
{
|
||||||
|
I_D(LegacyInstance);
|
||||||
|
d->m_settings->set ( "IntendedJarVersion", val );
|
||||||
|
}
|
||||||
|
bool LegacyInstance::shouldUpdate() const
|
||||||
|
{
|
||||||
|
I_D(LegacyInstance);
|
||||||
|
QVariant var = d->m_settings->get ( "ShouldUpdate" );
|
||||||
|
if ( !var.isValid() || var.toBool() == false )
|
||||||
|
{
|
||||||
|
return intendedVersion() != currentVersion();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
void LegacyInstance::setShouldUpdate ( bool val )
|
||||||
|
{
|
||||||
|
I_D(LegacyInstance);
|
||||||
|
d->m_settings->set ( "ShouldUpdate", val );
|
||||||
|
}
|
@ -1 +1,103 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "BaseInstance.h"
|
||||||
|
|
||||||
|
class LIBMULTIMC_EXPORT LegacyInstance : public BaseInstance
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
|
||||||
|
explicit LegacyInstance(const QString &rootDir, SettingsObject * settings, QObject *parent = 0);
|
||||||
|
|
||||||
|
/// Path to the instance's minecraft.jar
|
||||||
|
QString mcJar() const;
|
||||||
|
|
||||||
|
//! Path to the instance's mcbackup.jar
|
||||||
|
QString mcBackup() const;
|
||||||
|
|
||||||
|
//! Path to the instance's modlist file.
|
||||||
|
QString modListFile() const;
|
||||||
|
|
||||||
|
////// Directories //////
|
||||||
|
QString minecraftDir() const;
|
||||||
|
QString instModsDir() const;
|
||||||
|
QString binDir() const;
|
||||||
|
QString savesDir() const;
|
||||||
|
QString mlModsDir() const;
|
||||||
|
QString coreModsDir() const;
|
||||||
|
QString resourceDir() const;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Checks whether or not the currentVersion of the instance needs to be updated.
|
||||||
|
* If this returns true, updateCurrentVersion is called. In the
|
||||||
|
* standard instance, this is determined by checking a timestamp
|
||||||
|
* stored in the instance config file against the last modified time of Minecraft.jar.
|
||||||
|
* \return True if updateCurrentVersion() should be called.
|
||||||
|
*/
|
||||||
|
bool shouldUpdateCurrentVersion() const;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Updates the current version.
|
||||||
|
* This function should first set the current version timestamp
|
||||||
|
* (setCurrentVersionTimestamp()) to the current time. Next, if
|
||||||
|
* keepCurrent is false, this function should check what the
|
||||||
|
* instance's current version is and call setCurrentVersion() to
|
||||||
|
* update it. This function will automatically be called when the
|
||||||
|
* instance is loaded if shouldUpdateCurrentVersion returns true.
|
||||||
|
* \param keepCurrent If true, only the version timestamp will be updated.
|
||||||
|
*/
|
||||||
|
void updateCurrentVersion(bool keepCurrent = false);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Gets the last time that the current version was checked.
|
||||||
|
* This is checked against the last modified time on the jar file to see if
|
||||||
|
* the current version needs to be checked again.
|
||||||
|
*/
|
||||||
|
qint64 lastCurrentVersionUpdate() const;
|
||||||
|
void setLastCurrentVersionUpdate(qint64 val);
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* 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
|
||||||
|
* re-added to a fresh minecraft.jar file.
|
||||||
|
*/
|
||||||
|
bool shouldRebuild() const;
|
||||||
|
void setShouldRebuild(bool val);
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* The instance's current version.
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
QString currentVersion() const;
|
||||||
|
void setCurrentVersion(QString val);
|
||||||
|
|
||||||
|
//! The version of LWJGL that this instance uses.
|
||||||
|
QString lwjglVersion() const;
|
||||||
|
void setLWJGLVersion(QString val);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* The version that the user has set for this instance to use.
|
||||||
|
* If this is not the same as currentVersion, the instance's game updater
|
||||||
|
* will be run on launch.
|
||||||
|
*/
|
||||||
|
QString intendedVersion() const;
|
||||||
|
void setIntendedVersion(QString val);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Whether or not Minecraft should be downloaded when the instance is launched.
|
||||||
|
* This returns true if shouldForceUpdate game is true or if the intended and
|
||||||
|
* current versions don't match.
|
||||||
|
*/
|
||||||
|
bool shouldUpdate() const;
|
||||||
|
void setShouldUpdate(bool val);
|
||||||
|
|
||||||
|
/// return a valid GameUpdateTask if an update is needed, return NULL otherwise
|
||||||
|
virtual GameUpdateTask* doUpdate();
|
||||||
|
|
||||||
|
/// prepare the instance for launch and return a constructed MinecraftProcess instance
|
||||||
|
virtual MinecraftProcess* prepareForLaunch( QString user, QString session );
|
||||||
|
};
|
10
backend/LegacyInstance_p.h
Normal file
10
backend/LegacyInstance_p.h
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <QString>
|
||||||
|
#include <settingsobject.h>
|
||||||
|
#include "BaseInstance_p.h"
|
||||||
|
|
||||||
|
class BaseInstance;
|
||||||
|
|
||||||
|
struct LegacyInstancePrivate: public BaseInstancePrivate
|
||||||
|
{
|
||||||
|
};
|
@ -29,29 +29,11 @@
|
|||||||
#include "pathutils.h"
|
#include "pathutils.h"
|
||||||
#include "cmdutils.h"
|
#include "cmdutils.h"
|
||||||
|
|
||||||
#define LAUNCHER_FILE "MultiMCLauncher.jar"
|
|
||||||
#define IBUS "@im=ibus"
|
#define IBUS "@im=ibus"
|
||||||
|
|
||||||
// prepare tools
|
|
||||||
inline void MinecraftProcess::extractIcon(BaseInstance *inst, QString destination)
|
|
||||||
{
|
|
||||||
// QImage(":/icons/instances/" + inst->iconKey()).save(destination);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void MinecraftProcess::extractLauncher(QString destination)
|
|
||||||
{
|
|
||||||
QFile(":/launcher/launcher.jar").copy(destination);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MinecraftProcess::prepare(BaseInstance *inst)
|
|
||||||
{
|
|
||||||
extractLauncher(PathCombine(inst->minecraftDir(), LAUNCHER_FILE));
|
|
||||||
extractIcon(inst, PathCombine(inst->minecraftDir(), "icon.png"));
|
|
||||||
}
|
|
||||||
|
|
||||||
// constructor
|
// constructor
|
||||||
MinecraftProcess::MinecraftProcess(BaseInstance *inst, QString user, QString session) :
|
MinecraftProcess::MinecraftProcess( BaseInstance* inst ) :
|
||||||
m_instance(inst), m_user(user), m_session(session)
|
m_instance(inst)
|
||||||
{
|
{
|
||||||
connect(this, SIGNAL(finished(int, QProcess::ExitStatus)), SLOT(finish(int, QProcess::ExitStatus)));
|
connect(this, SIGNAL(finished(int, QProcess::ExitStatus)), SLOT(finish(int, QProcess::ExitStatus)));
|
||||||
|
|
||||||
@ -72,16 +54,24 @@ MinecraftProcess::MinecraftProcess(BaseInstance *inst, QString user, QString ses
|
|||||||
this->setProcessEnvironment(env);
|
this->setProcessEnvironment(env);
|
||||||
m_prepostlaunchprocess.setProcessEnvironment(env);
|
m_prepostlaunchprocess.setProcessEnvironment(env);
|
||||||
|
|
||||||
// set the cwd
|
|
||||||
QDir mcDir(inst->minecraftDir());
|
|
||||||
this->setWorkingDirectory(mcDir.absolutePath());
|
|
||||||
m_prepostlaunchprocess.setWorkingDirectory(mcDir.absolutePath());
|
|
||||||
|
|
||||||
// std channels
|
// std channels
|
||||||
connect(this, SIGNAL(readyReadStandardError()), SLOT(on_stdErr()));
|
connect(this, SIGNAL(readyReadStandardError()), SLOT(on_stdErr()));
|
||||||
connect(this, SIGNAL(readyReadStandardOutput()), SLOT(on_stdOut()));
|
connect(this, SIGNAL(readyReadStandardOutput()), SLOT(on_stdOut()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MinecraftProcess::setMinecraftArguments ( QStringList args )
|
||||||
|
{
|
||||||
|
m_args = args;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MinecraftProcess::setMinecraftWorkdir ( QString path )
|
||||||
|
{
|
||||||
|
QDir mcDir(path);
|
||||||
|
this->setWorkingDirectory(mcDir.absolutePath());
|
||||||
|
m_prepostlaunchprocess.setWorkingDirectory(mcDir.absolutePath());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// console window
|
// console window
|
||||||
void MinecraftProcess::on_stdErr()
|
void MinecraftProcess::on_stdErr()
|
||||||
{
|
{
|
||||||
@ -144,10 +134,6 @@ void MinecraftProcess::finish(int code, ExitStatus status)
|
|||||||
//TODO: error handling
|
//TODO: error handling
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if (m_console != nullptr)
|
|
||||||
// m_console->setMayClose(true);
|
|
||||||
|
|
||||||
emit ended();
|
emit ended();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,64 +152,17 @@ void MinecraftProcess::launch()
|
|||||||
|
|
||||||
m_instance->setLastLaunch();
|
m_instance->setLastLaunch();
|
||||||
|
|
||||||
prepare(m_instance);
|
|
||||||
|
|
||||||
genArgs();
|
|
||||||
|
|
||||||
emit log(QString("Minecraft folder is: '%1'").arg(workingDirectory()));
|
emit log(QString("Minecraft folder is: '%1'").arg(workingDirectory()));
|
||||||
QString JavaPath = m_instance->settings().get("JavaPath").toString();
|
QString JavaPath = m_instance->settings().get("JavaPath").toString();
|
||||||
emit log(QString("Java path: '%1'").arg(JavaPath));
|
emit log(QString("Java path: '%1'").arg(JavaPath));
|
||||||
emit log(QString("Arguments: '%1'").arg(m_arguments.join("' '")));
|
emit log(QString("Arguments: '%1'").arg(m_args.join("' '")));
|
||||||
start(JavaPath, m_arguments);
|
start(JavaPath, m_args);
|
||||||
if (!waitForStarted())
|
if (!waitForStarted())
|
||||||
{
|
{
|
||||||
emit log("Could not launch minecraft!");
|
emit log("Could not launch minecraft!");
|
||||||
return;
|
return;
|
||||||
//TODO: error handling
|
//TODO: error handling
|
||||||
}
|
}
|
||||||
|
|
||||||
// if(m_console != nullptr)
|
|
||||||
// m_console->setMayClose(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MinecraftProcess::genArgs()
|
|
||||||
{
|
|
||||||
// start fresh
|
|
||||||
m_arguments.clear();
|
|
||||||
|
|
||||||
// window size
|
|
||||||
QString windowSize;
|
|
||||||
if (m_instance->settings().get("LaunchMaximized").toBool())
|
|
||||||
windowSize = "max";
|
|
||||||
else
|
|
||||||
windowSize = QString("%1x%2").
|
|
||||||
arg(m_instance->settings().get("MinecraftWinWidth").toInt()).
|
|
||||||
arg(m_instance->settings().get("MinecraftWinHeight").toInt());
|
|
||||||
|
|
||||||
// window title
|
|
||||||
QString windowTitle;
|
|
||||||
windowTitle.append("MultiMC: ").append(m_instance->name());
|
|
||||||
|
|
||||||
// Java arguments
|
|
||||||
m_arguments.append(Util::Commandline::splitArgs(m_instance->settings().get("JvmArgs").toString()));
|
|
||||||
|
|
||||||
#ifdef OSX
|
|
||||||
// OSX dock icon and name
|
|
||||||
m_arguments << "-Xdock:icon=icon.png";
|
|
||||||
m_arguments << QString("-Xdock:name=\"%1\"").arg(windowTitle);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// lwjgl
|
|
||||||
QString lwjgl = QDir(globalSettings->get("LWJGLDir").toString() + "/" +
|
|
||||||
m_instance->lwjglVersion()).absolutePath();
|
|
||||||
|
|
||||||
// launcher arguments
|
|
||||||
m_arguments << QString("-Xms%1m").arg(m_instance->settings().get("MinMemAlloc").toInt());
|
|
||||||
m_arguments << QString("-Xmx%1m").arg(m_instance->settings().get("MaxMemAlloc").toInt());
|
|
||||||
m_arguments << "-jar" << LAUNCHER_FILE;
|
|
||||||
m_arguments << m_user;
|
|
||||||
m_arguments << m_session;
|
|
||||||
m_arguments << windowTitle;
|
|
||||||
m_arguments << windowSize;
|
|
||||||
m_arguments << lwjgl;
|
|
||||||
}
|
|
||||||
|
@ -49,35 +49,17 @@ public:
|
|||||||
/**
|
/**
|
||||||
* @brief MinecraftProcess constructor
|
* @brief MinecraftProcess constructor
|
||||||
* @param inst the Instance pointer to launch
|
* @param inst the Instance pointer to launch
|
||||||
* @param user the minecraft username
|
|
||||||
* @param session the minecraft session id
|
|
||||||
* @param console the instance console window
|
|
||||||
*/
|
*/
|
||||||
MinecraftProcess(BaseInstance *inst, QString user, QString session);
|
MinecraftProcess(BaseInstance *inst);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief launch minecraft
|
* @brief launch minecraft
|
||||||
*/
|
*/
|
||||||
void launch();
|
void launch();
|
||||||
|
|
||||||
/**
|
void setMinecraftWorkdir(QString path);
|
||||||
* @brief extract the instance icon
|
|
||||||
* @param inst the instance
|
|
||||||
* @param destination the destination path
|
|
||||||
*/
|
|
||||||
static inline void extractIcon(BaseInstance *inst, QString destination);
|
|
||||||
|
|
||||||
/**
|
void setMinecraftArguments(QStringList args);
|
||||||
* @brief extract the MultiMC launcher.jar
|
|
||||||
* @param destination the destination path
|
|
||||||
*/
|
|
||||||
static inline void extractLauncher(QString destination);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief prepare the launch by extracting icon and launcher
|
|
||||||
* @param inst the instance
|
|
||||||
*/
|
|
||||||
static void prepare(BaseInstance *inst);
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
/**
|
/**
|
||||||
@ -94,18 +76,13 @@ signals:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
BaseInstance *m_instance;
|
BaseInstance *m_instance;
|
||||||
QString m_user;
|
QStringList m_args;
|
||||||
QString m_session;
|
|
||||||
QString m_err_leftover;
|
QString m_err_leftover;
|
||||||
QString m_out_leftover;
|
QString m_out_leftover;
|
||||||
QProcess m_prepostlaunchprocess;
|
QProcess m_prepostlaunchprocess;
|
||||||
QStringList m_arguments;
|
|
||||||
|
|
||||||
void genArgs();
|
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
void finish(int, QProcess::ExitStatus status);
|
void finish(int, QProcess::ExitStatus status);
|
||||||
void on_stdErr();
|
void on_stdErr();
|
||||||
void on_stdOut();
|
void on_stdOut();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -51,9 +51,6 @@ QString MinecraftVersion::typeName() const
|
|||||||
case Snapshot:
|
case Snapshot:
|
||||||
return "Snapshot";
|
return "Snapshot";
|
||||||
|
|
||||||
case MCNostalgia:
|
|
||||||
return "MCNostalgia";
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return QString("Unknown Type %1").arg(versionType());
|
return QString("Unknown Type %1").arg(versionType());
|
||||||
}
|
}
|
||||||
@ -84,21 +81,10 @@ QString MinecraftVersion::etag() const
|
|||||||
return m_etag;
|
return m_etag;
|
||||||
}
|
}
|
||||||
|
|
||||||
MinecraftVersion::VersionSource MinecraftVersion::versionSource() const
|
|
||||||
{
|
|
||||||
return m_versionSource;
|
|
||||||
};
|
|
||||||
|
|
||||||
void MinecraftVersion::setVersionSource(VersionSource launcherVersion)
|
|
||||||
{
|
|
||||||
m_versionSource = launcherVersion;
|
|
||||||
}
|
|
||||||
|
|
||||||
InstVersion *MinecraftVersion::copyVersion(InstVersionList *newParent) const
|
InstVersion *MinecraftVersion::copyVersion(InstVersionList *newParent) const
|
||||||
{
|
{
|
||||||
MinecraftVersion *version = new MinecraftVersion(
|
MinecraftVersion *version = new MinecraftVersion(
|
||||||
descriptor(), name(), timestamp(), downloadURL(), etag(), newParent);
|
descriptor(), name(), timestamp(), downloadURL(), etag(), newParent);
|
||||||
version->setVersionType(versionType());
|
version->setVersionType(versionType());
|
||||||
version->setVersionSource(VersionSource());
|
|
||||||
return version;
|
return version;
|
||||||
}
|
}
|
||||||
|
@ -39,14 +39,6 @@ public:
|
|||||||
Stable,
|
Stable,
|
||||||
CurrentStable,
|
CurrentStable,
|
||||||
Snapshot,
|
Snapshot,
|
||||||
MCNostalgia
|
|
||||||
};
|
|
||||||
|
|
||||||
enum VersionSource
|
|
||||||
{
|
|
||||||
Unknown = -1,
|
|
||||||
Legacy = 0, // the legacy launcher that's been around since ... forever
|
|
||||||
Launcher16 = 1, // current launcher as of 26/06/2013
|
|
||||||
};
|
};
|
||||||
|
|
||||||
virtual QString descriptor() const;
|
virtual QString descriptor() const;
|
||||||
@ -57,9 +49,6 @@ public:
|
|||||||
virtual VersionType versionType() const;
|
virtual VersionType versionType() const;
|
||||||
virtual void setVersionType(VersionType typeName);
|
virtual void setVersionType(VersionType typeName);
|
||||||
|
|
||||||
virtual VersionSource versionSource() const;
|
|
||||||
virtual void setVersionSource(VersionSource launcherVersion);
|
|
||||||
|
|
||||||
virtual QString downloadURL() const;
|
virtual QString downloadURL() const;
|
||||||
virtual QString etag() const;
|
virtual QString etag() const;
|
||||||
|
|
||||||
@ -74,7 +63,4 @@ private:
|
|||||||
|
|
||||||
/// This version's type. Used internally to identify what kind of version this is.
|
/// This version's type. Used internally to identify what kind of version this is.
|
||||||
VersionType m_type;
|
VersionType m_type;
|
||||||
|
|
||||||
/// Whete to get the full version info (or, where did we get this version from originally)
|
|
||||||
VersionSource m_versionSource;
|
|
||||||
};
|
};
|
||||||
|
@ -0,0 +1,18 @@
|
|||||||
|
#include "OneSixInstance.h"
|
||||||
|
#include "OneSixInstance_p.h"
|
||||||
|
|
||||||
|
OneSixInstance::OneSixInstance ( const QString& rootDir, SettingsObject* settings, QObject* parent )
|
||||||
|
: BaseInstance ( new OneSixInstancePrivate(), rootDir, settings, parent )
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
GameUpdateTask* OneSixInstance::doUpdate()
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
MinecraftProcess* OneSixInstance::prepareForLaunch ( QString user, QString session )
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
@ -1 +1,11 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "BaseInstance.h"
|
||||||
|
class LIBMULTIMC_EXPORT OneSixInstance : public BaseInstance
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit OneSixInstance(const QString &rootDir, SettingsObject * settings, QObject *parent = 0);
|
||||||
|
virtual GameUpdateTask* doUpdate();
|
||||||
|
virtual MinecraftProcess* prepareForLaunch ( QString user, QString session );
|
||||||
|
};
|
8
backend/OneSixInstance_p.h
Normal file
8
backend/OneSixInstance_p.h
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <QString>
|
||||||
|
#include <settingsobject.h>
|
||||||
|
#include "BaseInstance_p.h"
|
||||||
|
|
||||||
|
struct OneSixInstancePrivate: public BaseInstancePrivate
|
||||||
|
{
|
||||||
|
};
|
@ -181,14 +181,6 @@ void MCVListLoadTask::executeTask()
|
|||||||
{
|
{
|
||||||
qDebug() << "Failed to load from Mojang version list.";
|
qDebug() << "Failed to load from Mojang version list.";
|
||||||
}
|
}
|
||||||
if (!loadFromAssets())
|
|
||||||
{
|
|
||||||
qDebug() << "Failed to load assets version list.";
|
|
||||||
}
|
|
||||||
if (!loadMCNostalgia())
|
|
||||||
{
|
|
||||||
qDebug() << "Failed to load MCNostalgia version list.";
|
|
||||||
}
|
|
||||||
finalize();
|
finalize();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -295,7 +287,6 @@ bool MCVListLoadTask::loadFromVList()
|
|||||||
MinecraftVersion *mcVersion = new MinecraftVersion(
|
MinecraftVersion *mcVersion = new MinecraftVersion(
|
||||||
versionID, versionID, versionTime.toMSecsSinceEpoch(),
|
versionID, versionID, versionTime.toMSecsSinceEpoch(),
|
||||||
dlUrl, "");
|
dlUrl, "");
|
||||||
mcVersion->setVersionSource(MinecraftVersion::Launcher16);
|
|
||||||
mcVersion->setVersionType(versionType);
|
mcVersion->setVersionType(versionType);
|
||||||
tempList.append(mcVersion);
|
tempList.append(mcVersion);
|
||||||
}
|
}
|
||||||
@ -317,143 +308,6 @@ bool MCVListLoadTask::loadFromVList()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MCVListLoadTask::loadFromAssets()
|
|
||||||
{
|
|
||||||
setSubStatus("Loading versions from assets.minecraft.net...");
|
|
||||||
|
|
||||||
bool succeeded = false;
|
|
||||||
|
|
||||||
QNetworkReply *assetsReply = netMgr->get(QNetworkRequest(QUrl(ASSETS_URLBASE)));
|
|
||||||
NetUtils::waitForNetRequest(assetsReply);
|
|
||||||
|
|
||||||
switch (assetsReply->error())
|
|
||||||
{
|
|
||||||
case QNetworkReply::NoError:
|
|
||||||
{
|
|
||||||
// Get the XML string.
|
|
||||||
QString xmlString = assetsReply->readAll();
|
|
||||||
|
|
||||||
QString xmlErrorMsg;
|
|
||||||
|
|
||||||
QDomDocument doc;
|
|
||||||
if (!doc.setContent(xmlString, false, &xmlErrorMsg))
|
|
||||||
{
|
|
||||||
// TODO: Display error message to the user.
|
|
||||||
qDebug() << "Failed to process assets.minecraft.net. XML error:" <<
|
|
||||||
xmlErrorMsg << xmlString;
|
|
||||||
}
|
|
||||||
|
|
||||||
QDomNodeList contents = doc.elementsByTagName("Contents");
|
|
||||||
|
|
||||||
QRegExp mcRegex("/minecraft.jar$");
|
|
||||||
QRegExp snapshotRegex("[0-9][0-9]w[0-9][0-9][a-z]?|pre|rc");
|
|
||||||
|
|
||||||
for (int i = 0; i < contents.length(); i++)
|
|
||||||
{
|
|
||||||
QDomElement element = contents.at(i).toElement();
|
|
||||||
|
|
||||||
if (element.isNull())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
QDomElement keyElement = getDomElementByTagName(element, "Key");
|
|
||||||
QDomElement lastmodElement = getDomElementByTagName(element, "LastModified");
|
|
||||||
QDomElement etagElement = getDomElementByTagName(element, "ETag");
|
|
||||||
|
|
||||||
if (keyElement.isNull() || lastmodElement.isNull() || etagElement.isNull())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
QString key = keyElement.text();
|
|
||||||
QString lastModStr = lastmodElement.text();
|
|
||||||
QString etagStr = etagElement.text();
|
|
||||||
|
|
||||||
if (!key.contains(mcRegex))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
QString versionDirName = key.left(key.length() - 14);
|
|
||||||
QString dlUrl = QString("http://assets.minecraft.net/%1/").arg(versionDirName);
|
|
||||||
|
|
||||||
QString versionName = versionDirName.replace("_", ".");
|
|
||||||
|
|
||||||
QDateTime versionTimestamp = timeFromS3Time(lastModStr);
|
|
||||||
if (!versionTimestamp.isValid())
|
|
||||||
{
|
|
||||||
qDebug(QString("Failed to parse timestamp for version %1 %2").
|
|
||||||
arg(versionName, lastModStr).toUtf8());
|
|
||||||
versionTimestamp = QDateTime::currentDateTime();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_currentStable)
|
|
||||||
{
|
|
||||||
{
|
|
||||||
bool older = versionTimestamp.toMSecsSinceEpoch() < m_currentStable->timestamp();
|
|
||||||
bool newer = versionTimestamp.toMSecsSinceEpoch() > m_currentStable->timestamp();
|
|
||||||
bool isSnapshot = versionName.contains(snapshotRegex);
|
|
||||||
|
|
||||||
MinecraftVersion *version = new MinecraftVersion(
|
|
||||||
versionName, versionName,
|
|
||||||
versionTimestamp.toMSecsSinceEpoch(),
|
|
||||||
dlUrl, etagStr);
|
|
||||||
|
|
||||||
if (newer)
|
|
||||||
{
|
|
||||||
version->setVersionType(MinecraftVersion::Snapshot);
|
|
||||||
}
|
|
||||||
else if (older && isSnapshot)
|
|
||||||
{
|
|
||||||
version->setVersionType(MinecraftVersion::OldSnapshot);
|
|
||||||
}
|
|
||||||
else if (older)
|
|
||||||
{
|
|
||||||
version->setVersionType(MinecraftVersion::Stable);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Shouldn't happen, but just in case...
|
|
||||||
version->setVersionType(MinecraftVersion::CurrentStable);
|
|
||||||
}
|
|
||||||
|
|
||||||
assetsList.push_back(version);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else // If there isn't a current stable version.
|
|
||||||
{
|
|
||||||
bool isSnapshot = versionName.contains(snapshotRegex);
|
|
||||||
|
|
||||||
MinecraftVersion *version = new MinecraftVersion(
|
|
||||||
versionName, versionName,
|
|
||||||
versionTimestamp.toMSecsSinceEpoch(),
|
|
||||||
dlUrl, etagStr);
|
|
||||||
version->setVersionType(isSnapshot? MinecraftVersion::Snapshot :
|
|
||||||
MinecraftVersion::Stable);
|
|
||||||
assetsList.push_back(version);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
setSubStatus("Loaded assets.minecraft.net");
|
|
||||||
succeeded = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
// TODO: Network error handling.
|
|
||||||
qDebug() << "Failed to load assets.minecraft.net" << assetsReply->errorString();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
processedAssetsReply = true;
|
|
||||||
updateStuff();
|
|
||||||
return succeeded;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MCVListLoadTask::loadMCNostalgia()
|
|
||||||
{
|
|
||||||
QNetworkReply *mcnReply = netMgr->get(QNetworkRequest(QUrl(QString(MCN_URLBASE) + "?pversion=1&list=True")));
|
|
||||||
NetUtils::waitForNetRequest(mcnReply);
|
|
||||||
processedMCNReply = true;
|
|
||||||
updateStuff();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MCVListLoadTask::finalize()
|
bool MCVListLoadTask::finalize()
|
||||||
{
|
{
|
||||||
// First, we need to do some cleanup. We loaded assets versions into assetsList,
|
// First, we need to do some cleanup. We loaded assets versions into assetsList,
|
||||||
@ -509,15 +363,11 @@ bool MCVListLoadTask::finalize()
|
|||||||
|
|
||||||
void MCVListLoadTask::updateStuff()
|
void MCVListLoadTask::updateStuff()
|
||||||
{
|
{
|
||||||
const int totalReqs = 3;
|
const int totalReqs = 1;
|
||||||
int reqsComplete = 0;
|
int reqsComplete = 0;
|
||||||
|
|
||||||
if (processedMCVListReply)
|
if (processedMCVListReply)
|
||||||
reqsComplete++;
|
reqsComplete++;
|
||||||
if (processedAssetsReply)
|
|
||||||
reqsComplete++;
|
|
||||||
if (processedMCNReply)
|
|
||||||
reqsComplete++;
|
|
||||||
|
|
||||||
calcProgress(reqsComplete, totalReqs);
|
calcProgress(reqsComplete, totalReqs);
|
||||||
|
|
||||||
|
@ -79,12 +79,6 @@ protected:
|
|||||||
//! Loads versions from Mojang's official version list.
|
//! Loads versions from Mojang's official version list.
|
||||||
bool loadFromVList();
|
bool loadFromVList();
|
||||||
|
|
||||||
//! Loads versions from assets.minecraft.net. Any duplicates are ignored.
|
|
||||||
bool loadFromAssets();
|
|
||||||
|
|
||||||
//! Loads versions from MCNostalgia.
|
|
||||||
bool loadMCNostalgia();
|
|
||||||
|
|
||||||
//! Finalizes loading by updating the version list.
|
//! Finalizes loading by updating the version list.
|
||||||
bool finalize();
|
bool finalize();
|
||||||
|
|
||||||
|
@ -43,8 +43,8 @@ void GameUpdateTask::executeTask()
|
|||||||
updateStatus();
|
updateStatus();
|
||||||
|
|
||||||
// Get a pointer to the version object that corresponds to the instance's version.
|
// Get a pointer to the version object that corresponds to the instance's version.
|
||||||
targetVersion = (MinecraftVersion *)MinecraftVersionList::getMainList().
|
//FIXME: HACKERY
|
||||||
findVersion(m_inst->intendedVersion());
|
// targetVersion = (MinecraftVersion *)MinecraftVersionList::getMainList().findVersion(m_inst->intendedVersion());
|
||||||
if(targetVersion == NULL)
|
if(targetVersion == NULL)
|
||||||
{
|
{
|
||||||
//Q_ASSERT_X(targetVersion != NULL, "game update", "instance's intended version is not an actual version");
|
//Q_ASSERT_X(targetVersion != NULL, "game update", "instance's intended version is not an actual version");
|
||||||
@ -60,20 +60,6 @@ void GameUpdateTask::executeTask()
|
|||||||
|
|
||||||
setState(StateDetermineURLs);
|
setState(StateDetermineURLs);
|
||||||
|
|
||||||
if (targetVersion->versionSource() == MinecraftVersion::Launcher16)
|
|
||||||
{
|
|
||||||
determineNewVersion();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
getLegacyJar();
|
|
||||||
}
|
|
||||||
QEventLoop loop;
|
|
||||||
loop.exec();
|
|
||||||
}
|
|
||||||
|
|
||||||
void GameUpdateTask::determineNewVersion()
|
|
||||||
{
|
|
||||||
QString urlstr("http://s3.amazonaws.com/Minecraft.Download/versions/");
|
QString urlstr("http://s3.amazonaws.com/Minecraft.Download/versions/");
|
||||||
urlstr += targetVersion->descriptor() + "/" + targetVersion->descriptor() + ".json";
|
urlstr += targetVersion->descriptor() + "/" + targetVersion->descriptor() + ".json";
|
||||||
auto dljob = DownloadJob::create(QUrl(urlstr));
|
auto dljob = DownloadJob::create(QUrl(urlstr));
|
||||||
@ -83,6 +69,9 @@ void GameUpdateTask::determineNewVersion()
|
|||||||
connect(specificVersionDownloadJob.data(), SIGNAL(failed()), SLOT(versionFileFailed()));
|
connect(specificVersionDownloadJob.data(), SIGNAL(failed()), SLOT(versionFileFailed()));
|
||||||
connect(specificVersionDownloadJob.data(), SIGNAL(progress(qint64,qint64)), SLOT(updateDownloadProgress(qint64,qint64)));
|
connect(specificVersionDownloadJob.data(), SIGNAL(progress(qint64,qint64)), SLOT(updateDownloadProgress(qint64,qint64)));
|
||||||
download_queue.enqueue(specificVersionDownloadJob);
|
download_queue.enqueue(specificVersionDownloadJob);
|
||||||
|
|
||||||
|
QEventLoop loop;
|
||||||
|
loop.exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameUpdateTask::versionFileFinished()
|
void GameUpdateTask::versionFileFinished()
|
||||||
@ -98,15 +87,8 @@ void GameUpdateTask::versionFileFinished()
|
|||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(version->isLegacy)
|
|
||||||
{
|
|
||||||
getLegacyJar();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// save the version file in $instanceId/version.json and versions/$version/$version.json
|
// save the version file in $instanceId/version.json and versions/$version/$version.json
|
||||||
QString version_id = targetVersion->descriptor();
|
QString version_id = targetVersion->descriptor();
|
||||||
QString mc_dir = m_inst->minecraftDir();
|
|
||||||
QString inst_dir = m_inst->rootDir();
|
QString inst_dir = m_inst->rootDir();
|
||||||
QString version1 = PathCombine(inst_dir, "/version.json");
|
QString version1 = PathCombine(inst_dir, "/version.json");
|
||||||
QString version2 = QString("versions/") + version_id + "/" + version_id + ".json";
|
QString version2 = QString("versions/") + version_id + "/" + version_id + ".json";
|
||||||
@ -139,8 +121,9 @@ void GameUpdateTask::versionFileFinished()
|
|||||||
|
|
||||||
void GameUpdateTask::jarlibFinished()
|
void GameUpdateTask::jarlibFinished()
|
||||||
{
|
{
|
||||||
m_inst->setCurrentVersion(targetVersion->descriptor());
|
//FIXME: HACKERY
|
||||||
m_inst->setShouldUpdate(false);
|
// m_inst->setCurrentVersion(targetVersion->descriptor());
|
||||||
|
// m_inst->setShouldUpdate(false);
|
||||||
// m_inst->setIsForNewLauncher(true);
|
// m_inst->setIsForNewLauncher(true);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
@ -158,54 +141,6 @@ void GameUpdateTask::versionFileFailed()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// this is legacy minecraft...
|
|
||||||
void GameUpdateTask::getLegacyJar()
|
|
||||||
{
|
|
||||||
// Make directories
|
|
||||||
QDir binDir(m_inst->binDir());
|
|
||||||
if (!binDir.exists() && !binDir.mkpath("."))
|
|
||||||
{
|
|
||||||
error("Failed to create bin folder.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the URL for minecraft.jar
|
|
||||||
// This will be either 'minecraft' or the version number, depending on where
|
|
||||||
// we're downloading from.
|
|
||||||
QString jarFilename = "minecraft";
|
|
||||||
if (targetVersion->versionSource() == MinecraftVersion::Launcher16)
|
|
||||||
{
|
|
||||||
jarFilename = targetVersion->descriptor();
|
|
||||||
}
|
|
||||||
|
|
||||||
QUrl mcJarURL = targetVersion->downloadURL() + jarFilename + ".jar";
|
|
||||||
qDebug() << mcJarURL.toString();
|
|
||||||
auto dljob = DownloadJob::create(mcJarURL, PathCombine(m_inst->minecraftDir(), "bin/minecraft.jar"));
|
|
||||||
|
|
||||||
legacyDownloadJob.reset(new JobList());
|
|
||||||
legacyDownloadJob->add(dljob);
|
|
||||||
connect(legacyDownloadJob.data(), SIGNAL(finished()), SLOT(legacyJarFinished()));
|
|
||||||
connect(legacyDownloadJob.data(), SIGNAL(failed()), SLOT(legacyJarFailed()));
|
|
||||||
connect(legacyDownloadJob.data(), SIGNAL(progress(qint64,qint64)), SLOT(updateDownloadProgress(qint64,qint64)));
|
|
||||||
|
|
||||||
download_queue.enqueue(legacyDownloadJob);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void GameUpdateTask::legacyJarFinished()
|
|
||||||
{
|
|
||||||
setState(StateFinished);
|
|
||||||
emit gameUpdateComplete(m_response);
|
|
||||||
// m_inst->setIsForNewLauncher(true);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void GameUpdateTask::legacyJarFailed()
|
|
||||||
{
|
|
||||||
emit gameUpdateError("failed to download the minecraft.jar");
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int GameUpdateTask::state() const
|
int GameUpdateTask::state() const
|
||||||
{
|
{
|
||||||
return m_updateState;
|
return m_updateState;
|
||||||
|
@ -91,8 +91,6 @@ public slots:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void updateDownloadProgress(qint64 current, qint64 total);
|
void updateDownloadProgress(qint64 current, qint64 total);
|
||||||
void legacyJarFinished();
|
|
||||||
void legacyJarFailed();
|
|
||||||
|
|
||||||
void versionFileFinished();
|
void versionFileFinished();
|
||||||
void versionFileFailed();
|
void versionFileFailed();
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#include "instancemodel.h"
|
#include "instancemodel.h"
|
||||||
#include <instance.h>
|
#include <BaseInstance.h>
|
||||||
#include <QIcon>
|
#include <QIcon>
|
||||||
#include "iconcache.h"
|
#include "iconcache.h"
|
||||||
|
|
||||||
|
@ -72,14 +72,12 @@ void InstanceSettings::applySettings()
|
|||||||
m_obj->set("OverrideWindow", window);
|
m_obj->set("OverrideWindow", window);
|
||||||
if(window)
|
if(window)
|
||||||
{
|
{
|
||||||
m_obj->set("LaunchCompatMode", ui->compatModeCheckBox->isChecked());
|
|
||||||
m_obj->set("LaunchMaximized", ui->maximizedCheckBox->isChecked());
|
m_obj->set("LaunchMaximized", ui->maximizedCheckBox->isChecked());
|
||||||
m_obj->set("MinecraftWinWidth", ui->windowWidthSpinBox->value());
|
m_obj->set("MinecraftWinWidth", ui->windowWidthSpinBox->value());
|
||||||
m_obj->set("MinecraftWinHeight", ui->windowHeightSpinBox->value());
|
m_obj->set("MinecraftWinHeight", ui->windowHeightSpinBox->value());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_obj->reset("LaunchCompatMode");
|
|
||||||
m_obj->reset("LaunchMaximized");
|
m_obj->reset("LaunchMaximized");
|
||||||
m_obj->reset("MinecraftWinWidth");
|
m_obj->reset("MinecraftWinWidth");
|
||||||
m_obj->reset("MinecraftWinHeight");
|
m_obj->reset("MinecraftWinHeight");
|
||||||
@ -148,33 +146,33 @@ void InstanceSettings::applySettings()
|
|||||||
void InstanceSettings::loadSettings()
|
void InstanceSettings::loadSettings()
|
||||||
{
|
{
|
||||||
// Console
|
// Console
|
||||||
|
ui->consoleSettingsBox->setChecked(m_obj->get("OverrideConsole").toBool());
|
||||||
ui->showConsoleCheck->setChecked(m_obj->get("ShowConsole").toBool());
|
ui->showConsoleCheck->setChecked(m_obj->get("ShowConsole").toBool());
|
||||||
ui->autoCloseConsoleCheck->setChecked(m_obj->get("AutoCloseConsole").toBool());
|
ui->autoCloseConsoleCheck->setChecked(m_obj->get("AutoCloseConsole").toBool());
|
||||||
ui->consoleSettingsBox->setChecked(m_obj->get("OverrideConsole").toBool());
|
|
||||||
|
|
||||||
// Window Size
|
// Window Size
|
||||||
ui->compatModeCheckBox->setChecked(m_obj->get("LaunchCompatMode").toBool());
|
ui->windowSizeGroupBox->setChecked(m_obj->get("OverrideWindow").toBool());
|
||||||
ui->maximizedCheckBox->setChecked(m_obj->get("LaunchMaximized").toBool());
|
ui->maximizedCheckBox->setChecked(m_obj->get("LaunchMaximized").toBool());
|
||||||
ui->windowWidthSpinBox->setValue(m_obj->get("MinecraftWinWidth").toInt());
|
ui->windowWidthSpinBox->setValue(m_obj->get("MinecraftWinWidth").toInt());
|
||||||
ui->windowHeightSpinBox->setValue(m_obj->get("MinecraftWinHeight").toInt());
|
ui->windowHeightSpinBox->setValue(m_obj->get("MinecraftWinHeight").toInt());
|
||||||
ui->windowSizeGroupBox->setChecked(m_obj->get("OverrideWindow").toBool());
|
|
||||||
|
|
||||||
// Auto Login
|
// Auto Login
|
||||||
ui->autoLoginChecBox->setChecked(m_obj->get("AutoLogin").toBool());
|
|
||||||
ui->accountSettingsGroupBox->setChecked(m_obj->get("OverrideLogin").toBool());
|
ui->accountSettingsGroupBox->setChecked(m_obj->get("OverrideLogin").toBool());
|
||||||
|
ui->autoLoginChecBox->setChecked(m_obj->get("AutoLogin").toBool());
|
||||||
|
|
||||||
// Memory
|
// Memory
|
||||||
|
ui->memoryGroupBox->setChecked(m_obj->get("OverrideMemory").toBool());
|
||||||
ui->minMemSpinBox->setValue(m_obj->get("MinMemAlloc").toInt());
|
ui->minMemSpinBox->setValue(m_obj->get("MinMemAlloc").toInt());
|
||||||
ui->maxMemSpinBox->setValue(m_obj->get("MaxMemAlloc").toInt());
|
ui->maxMemSpinBox->setValue(m_obj->get("MaxMemAlloc").toInt());
|
||||||
ui->memoryGroupBox->setChecked(m_obj->get("OverrideMemory").toBool());
|
|
||||||
|
|
||||||
// Java Settings
|
// Java Settings
|
||||||
|
ui->javaSettingsGroupBox->setChecked(m_obj->get("OverrideJava").toBool());
|
||||||
ui->javaPathTextBox->setText(m_obj->get("JavaPath").toString());
|
ui->javaPathTextBox->setText(m_obj->get("JavaPath").toString());
|
||||||
ui->jvmArgsTextBox->setText(m_obj->get("JvmArgs").toString());
|
ui->jvmArgsTextBox->setText(m_obj->get("JvmArgs").toString());
|
||||||
ui->javaSettingsGroupBox->setChecked(m_obj->get("OverrideJava").toBool());
|
|
||||||
|
|
||||||
// Custom Commands
|
// Custom Commands
|
||||||
|
ui->customCommandsGroupBox->setChecked(m_obj->get("OverrideCommands").toBool());
|
||||||
ui->preLaunchCmdTextBox->setText(m_obj->get("PreLaunchCommand").toString());
|
ui->preLaunchCmdTextBox->setText(m_obj->get("PreLaunchCommand").toString());
|
||||||
ui->postExitCmdTextBox->setText(m_obj->get("PostExitCommand").toString());
|
ui->postExitCmdTextBox->setText(m_obj->get("PostExitCommand").toString());
|
||||||
ui->customCommandsGroupBox->setChecked(m_obj->get("OverrideCommands").toBool());
|
|
||||||
}
|
}
|
||||||
|
@ -125,7 +125,7 @@ MainWindow::MainWindow ( QWidget *parent ) :
|
|||||||
view->setFrameShape ( QFrame::NoFrame );
|
view->setFrameShape ( QFrame::NoFrame );
|
||||||
|
|
||||||
ui->horizontalLayout->addWidget ( view );
|
ui->horizontalLayout->addWidget ( view );
|
||||||
setWindowTitle ( QString ( "MultiMC %1" ).arg ( Version::current.toString() ) );
|
setWindowTitle ( QString ( "MultiMC %1" ).arg ( AppVersion::current.toString() ) );
|
||||||
// TODO: Make this work with the new settings system.
|
// TODO: Make this work with the new settings system.
|
||||||
// restoreGeometry(settings->getConfig().value("MainWindowGeometry", saveGeometry()).toByteArray());
|
// restoreGeometry(settings->getConfig().value("MainWindowGeometry", saveGeometry()).toByteArray());
|
||||||
// restoreState(settings->getConfig().value("MainWindowState", saveState()).toByteArray());
|
// restoreState(settings->getConfig().value("MainWindowState", saveState()).toByteArray());
|
||||||
@ -199,7 +199,8 @@ void MainWindow::on_actionAddInstance_triggered()
|
|||||||
{
|
{
|
||||||
case InstanceFactory::NoCreateError:
|
case InstanceFactory::NoCreateError:
|
||||||
newInstance->setName(newInstDlg->instName());
|
newInstance->setName(newInstDlg->instName());
|
||||||
newInstance->setIntendedVersion(newInstDlg->selectedVersion()->descriptor());
|
// FIXME:HACKERY
|
||||||
|
// newInstance->setIntendedVersion(newInstDlg->selectedVersion()->descriptor());
|
||||||
instList.add(InstancePtr(newInstance));
|
instList.add(InstancePtr(newInstance));
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -414,18 +415,18 @@ void MainWindow::doLogin(const QString& errorMsg)
|
|||||||
|
|
||||||
void MainWindow::onLoginComplete(LoginResponse response)
|
void MainWindow::onLoginComplete(LoginResponse response)
|
||||||
{
|
{
|
||||||
Q_ASSERT_X(m_activeInst != NULL, "onLoginComplete", "no active instance is set");
|
if(!m_activeInst)
|
||||||
|
return;
|
||||||
|
|
||||||
if (!m_activeInst->shouldUpdate())
|
GameUpdateTask *updateTask = m_activeInst->doUpdate();
|
||||||
|
if(!updateTask)
|
||||||
{
|
{
|
||||||
launchInstance(m_activeInst, response);
|
launchInstance(m_activeInst, response);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
TaskDialog *tDialog = new TaskDialog(this);
|
TaskDialog *tDialog = new TaskDialog(this);
|
||||||
GameUpdateTask *updateTask = new GameUpdateTask(response, m_activeInst);
|
connect(updateTask, SIGNAL(gameUpdateComplete(LoginResponse)),SLOT(onGameUpdateComplete(LoginResponse)));
|
||||||
connect(updateTask, SIGNAL(gameUpdateComplete(LoginResponse)),
|
|
||||||
SLOT(onGameUpdateComplete(LoginResponse)));
|
|
||||||
connect(updateTask, SIGNAL(gameUpdateError(QString)), SLOT(onGameUpdateError(QString)));
|
connect(updateTask, SIGNAL(gameUpdateError(QString)), SLOT(onGameUpdateError(QString)));
|
||||||
tDialog->exec(updateTask);
|
tDialog->exec(updateTask);
|
||||||
}
|
}
|
||||||
@ -433,37 +434,24 @@ void MainWindow::onLoginComplete(LoginResponse response)
|
|||||||
|
|
||||||
void MainWindow::onGameUpdateComplete(LoginResponse response)
|
void MainWindow::onGameUpdateComplete(LoginResponse response)
|
||||||
{
|
{
|
||||||
launchInstance(response);
|
launchInstance(m_activeInst, response);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::onGameUpdateError(QString error)
|
void MainWindow::onGameUpdateError(QString error)
|
||||||
{
|
{
|
||||||
QMessageBox::warning(this, "Error downloading instance", error);
|
QMessageBox::warning(this, "Error updating instance", error);
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MainWindow::launchInstance(LoginResponse response)
|
|
||||||
{
|
|
||||||
Q_ASSERT_X(m_activeInst != NULL, "onLoginComplete", "no active instance is set");
|
|
||||||
launchInstance(m_activeInst, response);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::launchInstance(QString instID, LoginResponse response)
|
|
||||||
{
|
|
||||||
BaseInstance *instance = instList.getInstanceById(instID).data();
|
|
||||||
Q_ASSERT_X(instance != NULL, "launchInstance", "instance ID does not correspond to a valid instance");
|
|
||||||
launchInstance(instance, response);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::launchInstance(BaseInstance *instance, LoginResponse response)
|
void MainWindow::launchInstance(BaseInstance *instance, LoginResponse response)
|
||||||
{
|
{
|
||||||
Q_ASSERT_X(instance != NULL, "launchInstance", "instance is NULL");
|
Q_ASSERT_X(instance != NULL, "launchInstance", "instance is NULL");
|
||||||
|
|
||||||
console = new ConsoleWindow();
|
proc = instance->prepareForLaunch(response.username(), response.sessionID());
|
||||||
proc = new MinecraftProcess(instance, response.username(), response.sessionID());
|
if(!proc)
|
||||||
|
return;
|
||||||
|
|
||||||
|
console = new ConsoleWindow();
|
||||||
console->show();
|
console->show();
|
||||||
//connect(proc, SIGNAL(ended()), SLOT(onTerminated()));
|
|
||||||
connect(proc, SIGNAL(log(QString, MessageLevel::Enum)),
|
connect(proc, SIGNAL(log(QString, MessageLevel::Enum)),
|
||||||
console, SLOT(write(QString, MessageLevel::Enum)));
|
console, SLOT(write(QString, MessageLevel::Enum)));
|
||||||
proc->launch();
|
proc->launch();
|
||||||
@ -536,7 +524,8 @@ void MainWindow::on_actionChangeInstMCVersion_triggered()
|
|||||||
VersionSelectDialog *vselect = new VersionSelectDialog(inst->versionList(), this);
|
VersionSelectDialog *vselect = new VersionSelectDialog(inst->versionList(), this);
|
||||||
if (vselect->exec() && vselect->selectedVersion())
|
if (vselect->exec() && vselect->selectedVersion())
|
||||||
{
|
{
|
||||||
inst->setIntendedVersion(vselect->selectedVersion()->descriptor());
|
// FIXME:HACKERY
|
||||||
|
// inst->setIntendedVersion(vselect->selectedVersion()->descriptor());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,8 +117,6 @@ public slots:
|
|||||||
|
|
||||||
void startTask(Task *task);
|
void startTask(Task *task);
|
||||||
|
|
||||||
void launchInstance(LoginResponse response);
|
|
||||||
void launchInstance(QString instID, LoginResponse response);
|
|
||||||
void launchInstance(BaseInstance *inst, LoginResponse response);
|
void launchInstance(BaseInstance *inst, LoginResponse response);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -122,7 +122,6 @@ void SettingsDialog::applySettings(SettingsObject *s)
|
|||||||
s->set("AutoCloseConsole", ui->autoCloseConsoleCheck->isChecked());
|
s->set("AutoCloseConsole", ui->autoCloseConsoleCheck->isChecked());
|
||||||
|
|
||||||
// Window Size
|
// Window Size
|
||||||
s->set("LaunchCompatMode", ui->compatModeCheckBox->isChecked());
|
|
||||||
s->set("LaunchMaximized", ui->maximizedCheckBox->isChecked());
|
s->set("LaunchMaximized", ui->maximizedCheckBox->isChecked());
|
||||||
s->set("MinecraftWinWidth", ui->windowWidthSpinBox->value());
|
s->set("MinecraftWinWidth", ui->windowWidthSpinBox->value());
|
||||||
s->set("MinecraftWinHeight", ui->windowHeightSpinBox->value());
|
s->set("MinecraftWinHeight", ui->windowHeightSpinBox->value());
|
||||||
@ -159,7 +158,6 @@ void SettingsDialog::loadSettings(SettingsObject *s)
|
|||||||
ui->autoCloseConsoleCheck->setChecked(s->get("AutoCloseConsole").toBool());
|
ui->autoCloseConsoleCheck->setChecked(s->get("AutoCloseConsole").toBool());
|
||||||
|
|
||||||
// Window Size
|
// Window Size
|
||||||
ui->compatModeCheckBox->setChecked(s->get("LaunchCompatMode").toBool());
|
|
||||||
ui->maximizedCheckBox->setChecked(s->get("LaunchMaximized").toBool());
|
ui->maximizedCheckBox->setChecked(s->get("LaunchMaximized").toBool());
|
||||||
ui->windowWidthSpinBox->setValue(s->get("MinecraftWinWidth").toInt());
|
ui->windowWidthSpinBox->setValue(s->get("MinecraftWinWidth").toInt());
|
||||||
ui->windowHeightSpinBox->setValue(s->get("MinecraftWinHeight").toInt());
|
ui->windowHeightSpinBox->setValue(s->get("MinecraftWinHeight").toInt());
|
||||||
|
11
main.cpp
11
main.cpp
@ -64,13 +64,18 @@ private slots:
|
|||||||
|
|
||||||
void onLoginComplete(QString instId, LoginResponse response)
|
void onLoginComplete(QString instId, LoginResponse response)
|
||||||
{
|
{
|
||||||
// TODO: console
|
proc = instance->prepareForLaunch(response.username(), response.sessionID());
|
||||||
|
if(!proc)
|
||||||
|
{
|
||||||
|
//FIXME: report error
|
||||||
|
return;
|
||||||
|
}
|
||||||
console = new ConsoleWindow();
|
console = new ConsoleWindow();
|
||||||
proc = new MinecraftProcess(instance.data(), response.username(), response.sessionID());
|
|
||||||
//if (instance->getShowConsole())
|
|
||||||
console->show();
|
console->show();
|
||||||
|
|
||||||
connect(proc, SIGNAL(ended()), SLOT(onTerminated()));
|
connect(proc, SIGNAL(ended()), SLOT(onTerminated()));
|
||||||
connect(proc, SIGNAL(log(QString,MessageLevel::Enum)), console, SLOT(write(QString,MessageLevel::Enum)));
|
connect(proc, SIGNAL(log(QString,MessageLevel::Enum)), console, SLOT(write(QString,MessageLevel::Enum)));
|
||||||
|
|
||||||
proc->launch();
|
proc->launch();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user