summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetr Mrázek <peterix@gmail.com>2016-03-18 15:02:54 +0100
committerPetr Mrázek <peterix@gmail.com>2016-03-26 17:05:27 +0100
commitb7d8e512f4184a755809fe9a964a04921f8abf7c (patch)
tree2d67f30a2c57743dac5fc9dc819e6c5d58b41962
parentfb9dfcb951d9cf9c19fc868703cb66e15aa9a1e6 (diff)
downloadMultiMC-b7d8e512f4184a755809fe9a964a04921f8abf7c.tar
MultiMC-b7d8e512f4184a755809fe9a964a04921f8abf7c.tar.gz
MultiMC-b7d8e512f4184a755809fe9a964a04921f8abf7c.tar.lz
MultiMC-b7d8e512f4184a755809fe9a964a04921f8abf7c.tar.xz
MultiMC-b7d8e512f4184a755809fe9a964a04921f8abf7c.zip
NOISSUE Use patch problems and problem levels instead of exceptions for minecraft profiles.
-rw-r--r--application/MainWindow.cpp9
-rw-r--r--logic/minecraft/MinecraftProfile.cpp162
-rw-r--r--logic/minecraft/MinecraftProfile.h51
-rw-r--r--logic/minecraft/MinecraftVersion.cpp1
-rw-r--r--logic/minecraft/ProfileUtils.cpp45
-rw-r--r--logic/minecraft/VersionFile.cpp1
-rw-r--r--logic/minecraft/forge/ForgeInstaller.cpp11
-rw-r--r--logic/minecraft/onesix/OneSixInstance.cpp20
-rw-r--r--logic/minecraft/onesix/OneSixProfileStrategy.cpp2
-rw-r--r--logic/minecraft/onesix/OneSixUpdate.cpp15
10 files changed, 171 insertions, 146 deletions
diff --git a/application/MainWindow.cpp b/application/MainWindow.cpp
index 4fc4d173..1633cc39 100644
--- a/application/MainWindow.cpp
+++ b/application/MainWindow.cpp
@@ -1529,6 +1529,10 @@ void MainWindow::on_actionLaunchInstanceOffline_triggered()
void MainWindow::launch(InstancePtr instance, bool online, BaseProfilerFactory *profiler)
{
+ if(!instance->canLaunch())
+ {
+ return;
+ }
m_launchController.reset(new LaunchController());
m_launchController->setInstance(instance);
m_launchController->setOnline(online);
@@ -1565,7 +1569,9 @@ void MainWindow::instanceChanged(const QModelIndex &current, const QModelIndex &
m_selectedInstance = MMC->instances()->getInstanceById(id);
if (m_selectedInstance)
{
- ui->instanceToolBar->setEnabled(m_selectedInstance->canLaunch());
+ ui->instanceToolBar->setEnabled(true);
+ ui->actionLaunchInstance->setEnabled(m_selectedInstance->canLaunch());
+ ui->actionLaunchInstanceOffline->setEnabled(m_selectedInstance->canLaunch());
renameButton->setText(m_selectedInstance->name());
m_statusLeft->setText(m_selectedInstance->getStatusbarDescription());
updateInstanceToolIcon(m_selectedInstance->iconKey());
@@ -1576,6 +1582,7 @@ void MainWindow::instanceChanged(const QModelIndex &current, const QModelIndex &
}
else
{
+ ui->instanceToolBar->setEnabled(false);
MMC->settings()->set("SelectedInstance", QString());
selectionBad();
return;
diff --git a/logic/minecraft/MinecraftProfile.cpp b/logic/minecraft/MinecraftProfile.cpp
index 80021672..5fd700f2 100644
--- a/logic/minecraft/MinecraftProfile.cpp
+++ b/logic/minecraft/MinecraftProfile.cpp
@@ -54,36 +54,38 @@ void MinecraftProfile::reload()
{
beginResetModel();
m_strategy->load();
- reapplySafe();
+ reapplyPatches();
endResetModel();
}
void MinecraftProfile::clear()
{
- id.clear();
- type.clear();
- assets.clear();
- minecraftArguments.clear();
- mainClass.clear();
- appletClass.clear();
- libraries.clear();
- tweakers.clear();
- jarMods.clear();
- traits.clear();
+ m_minecraftVersion.clear();
+ m_minecraftVersionType.clear();
+ m_minecraftAssets.clear();
+ m_minecraftArguments.clear();
+ m_tweakers.clear();
+ m_mainClass.clear();
+ m_appletClass.clear();
+ m_libraries.clear();
+ m_nativeLibraries.clear();
+ m_traits.clear();
+ m_jarMods.clear();
+ m_problemSeverity = ProblemSeverity::PROBLEM_NONE;
}
void MinecraftProfile::clearPatches()
{
beginResetModel();
- VersionPatches.clear();
+ m_patches.clear();
endResetModel();
}
void MinecraftProfile::appendPatch(ProfilePatchPtr patch)
{
- int index = VersionPatches.size();
+ int index = m_patches.size();
beginInsertRows(QModelIndex(), index, index);
- VersionPatches.append(patch);
+ m_patches.append(patch);
endInsertRows();
}
@@ -103,9 +105,9 @@ bool MinecraftProfile::remove(const int index)
}
beginRemoveRows(QModelIndex(), index, index);
- VersionPatches.removeAt(index);
+ m_patches.removeAt(index);
endRemoveRows();
- reapplySafe();
+ reapplyPatches();
saveCurrentOrder();
return true;
}
@@ -113,7 +115,7 @@ bool MinecraftProfile::remove(const int index)
bool MinecraftProfile::remove(const QString id)
{
int i = 0;
- for (auto patch : VersionPatches)
+ for (auto patch : m_patches)
{
if (patch->getID() == id)
{
@@ -137,7 +139,7 @@ bool MinecraftProfile::customize(int index)
qCritical() << "Patch" << patch->getID() << "could not be customized";
return false;
}
- reapplySafe();
+ reapplyPatches();
saveCurrentOrder();
// FIXME: maybe later in unstable
// emit dataChanged(createIndex(index, 0), createIndex(index, columnCount(QModelIndex()) - 1));
@@ -157,25 +159,16 @@ bool MinecraftProfile::revertToBase(int index)
qCritical() << "Patch" << patch->getID() << "could not be reverted";
return false;
}
- reapplySafe();
+ reapplyPatches();
saveCurrentOrder();
// FIXME: maybe later in unstable
// emit dataChanged(createIndex(index, 0), createIndex(index, columnCount(QModelIndex()) - 1));
return true;
}
-QString MinecraftProfile::versionFileId(const int index) const
-{
- if (index < 0 || index >= VersionPatches.size())
- {
- return QString();
- }
- return VersionPatches.at(index)->getID();
-}
-
ProfilePatchPtr MinecraftProfile::versionPatch(const QString &id)
{
- for (auto file : VersionPatches)
+ for (auto file : m_patches)
{
if (file->getID() == id)
{
@@ -187,14 +180,14 @@ ProfilePatchPtr MinecraftProfile::versionPatch(const QString &id)
ProfilePatchPtr MinecraftProfile::versionPatch(int index)
{
- if(index < 0 || index >= VersionPatches.size())
+ if(index < 0 || index >= m_patches.size())
return nullptr;
- return VersionPatches[index];
+ return m_patches[index];
}
bool MinecraftProfile::isVanilla()
{
- for(auto patchptr: VersionPatches)
+ for(auto patchptr: m_patches)
{
if(patchptr->isCustom())
return false;
@@ -205,7 +198,7 @@ bool MinecraftProfile::isVanilla()
bool MinecraftProfile::revertToVanilla()
{
// remove patches, if present
- auto VersionPatchesCopy = VersionPatches;
+ auto VersionPatchesCopy = m_patches;
for(auto & it: VersionPatchesCopy)
{
if (!it->isCustom())
@@ -217,13 +210,13 @@ bool MinecraftProfile::revertToVanilla()
if(!remove(it->getID()))
{
qWarning() << "Couldn't remove" << it->getID() << "from profile!";
- reapplySafe();
+ reapplyPatches();
saveCurrentOrder();
return false;
}
}
}
- reapplySafe();
+ reapplyPatches();
saveCurrentOrder();
return true;
}
@@ -236,17 +229,17 @@ QVariant MinecraftProfile::data(const QModelIndex &index, int role) const
int row = index.row();
int column = index.column();
- if (row < 0 || row >= VersionPatches.size())
+ if (row < 0 || row >= m_patches.size())
return QVariant();
- auto patch = VersionPatches.at(row);
+ auto patch = m_patches.at(row);
if (role == Qt::DisplayRole)
{
switch (column)
{
case 0:
- return VersionPatches.at(row)->getName();
+ return m_patches.at(row)->getName();
case 1:
{
if(patch->isCustom())
@@ -315,7 +308,7 @@ Qt::ItemFlags MinecraftProfile::flags(const QModelIndex &index) const
int MinecraftProfile::rowCount(const QModelIndex &parent) const
{
- return VersionPatches.size();
+ return m_patches.size();
}
int MinecraftProfile::columnCount(const QModelIndex &parent) const
@@ -326,7 +319,7 @@ int MinecraftProfile::columnCount(const QModelIndex &parent) const
void MinecraftProfile::saveCurrentOrder() const
{
ProfileUtils::PatchOrder order;
- for(auto item: VersionPatches)
+ for(auto item: m_patches)
{
if(!item->isMoveable())
continue;
@@ -347,7 +340,7 @@ void MinecraftProfile::move(const int index, const MoveDirection direction)
theirIndex = index + 1;
}
- if (index < 0 || index >= VersionPatches.size())
+ if (index < 0 || index >= m_patches.size())
return;
if (theirIndex >= rowCount())
theirIndex = rowCount() - 1;
@@ -365,9 +358,9 @@ void MinecraftProfile::move(const int index, const MoveDirection direction)
return;
}
beginMoveRows(QModelIndex(), index, index, QModelIndex(), togap);
- VersionPatches.swap(index, theirIndex);
+ m_patches.swap(index, theirIndex);
endMoveRows();
- reapplySafe();
+ reapplyPatches();
saveCurrentOrder();
}
void MinecraftProfile::resetOrder()
@@ -376,20 +369,15 @@ void MinecraftProfile::resetOrder()
reload();
}
-void MinecraftProfile::reapply()
-{
- clear();
- for(auto file: VersionPatches)
- {
- file->applyTo(this);
- }
-}
-
-bool MinecraftProfile::reapplySafe()
+bool MinecraftProfile::reapplyPatches()
{
try
{
- reapply();
+ clear();
+ for(auto file: m_patches)
+ {
+ file->applyTo(this);
+ }
}
catch (Exception & error)
{
@@ -409,37 +397,37 @@ static void applyString(const QString & from, QString & to)
void MinecraftProfile::applyMinecraftVersion(const QString& id)
{
- applyString(id, this->id);
+ applyString(id, this->m_minecraftVersion);
}
void MinecraftProfile::applyAppletClass(const QString& appletClass)
{
- applyString(appletClass, this->appletClass);
+ applyString(appletClass, this->m_appletClass);
}
void MinecraftProfile::applyMainClass(const QString& mainClass)
{
- applyString(mainClass, this->mainClass);
+ applyString(mainClass, this->m_mainClass);
}
void MinecraftProfile::applyMinecraftArguments(const QString& minecraftArguments)
{
- applyString(minecraftArguments, this->minecraftArguments);
+ applyString(minecraftArguments, this->m_minecraftArguments);
}
void MinecraftProfile::applyMinecraftVersionType(const QString& type)
{
- applyString(type, this->type);
+ applyString(type, this->m_minecraftVersionType);
}
void MinecraftProfile::applyMinecraftAssets(const QString& assets)
{
- applyString(assets, this->assets);
+ applyString(assets, this->m_minecraftAssets);
}
void MinecraftProfile::applyTraits(const QSet<QString>& traits)
{
- this->traits.unite(traits);
+ this->m_traits.unite(traits);
}
void MinecraftProfile::applyTweakers(const QStringList& tweakers)
@@ -448,13 +436,13 @@ void MinecraftProfile::applyTweakers(const QStringList& tweakers)
// FIXME: does order matter?
for (auto tweaker : tweakers)
{
- this->tweakers += tweaker;
+ this->m_tweakers += tweaker;
}
}
void MinecraftProfile::applyJarMods(const QList<JarmodPtr>& jarMods)
{
- this->jarMods.append(jarMods);
+ this->m_jarMods.append(jarMods);
}
static int findLibraryByName(QList<LibraryPtr> haystack, const GradleSpecifier &needle)
@@ -499,49 +487,61 @@ void MinecraftProfile::applyLibrary(LibraryPtr library)
}
if(library->isNative())
{
- insert(nativeLibraries);
+ insert(m_nativeLibraries);
}
else
{
- insert(libraries);
+ insert(m_libraries);
+ }
+}
+
+void MinecraftProfile::applyProblemSeverity(ProblemSeverity severity)
+{
+ if (m_problemSeverity < severity)
+ {
+ m_problemSeverity = severity;
}
}
QString MinecraftProfile::getMinecraftVersion() const
{
- return id;
+ return m_minecraftVersion;
}
QString MinecraftProfile::getAppletClass() const
{
- return appletClass;
+ return m_appletClass;
}
QString MinecraftProfile::getMainClass() const
{
- return mainClass;
+ return m_mainClass;
}
const QSet<QString> &MinecraftProfile::getTraits() const
{
- return traits;
+ return m_traits;
}
const QStringList & MinecraftProfile::getTweakers() const
{
- return tweakers;
+ return m_tweakers;
}
bool MinecraftProfile::hasTrait(const QString& trait) const
{
- return traits.contains(trait);
+ return m_traits.contains(trait);
}
+ProblemSeverity MinecraftProfile::getProblemSeverity() const
+{
+ return m_problemSeverity;
+}
QString MinecraftProfile::getMinecraftVersionType() const
{
- return type;
+ return m_minecraftVersionType;
}
QString MinecraftProfile::getMinecraftAssets() const
@@ -549,35 +549,35 @@ QString MinecraftProfile::getMinecraftAssets() const
// HACK: deny april fools. my head hurts enough already.
QDate now = QDate::currentDate();
bool isAprilFools = now.month() == 4 && now.day() == 1;
- if (assets.endsWith("_af") && !isAprilFools)
+ if (m_minecraftAssets.endsWith("_af") && !isAprilFools)
{
- return assets.left(assets.length() - 3);
+ return m_minecraftAssets.left(m_minecraftAssets.length() - 3);
}
- if (assets.isEmpty())
+ if (m_minecraftAssets.isEmpty())
{
return QLatin1Literal("legacy");
}
- return assets;
+ return m_minecraftAssets;
}
QString MinecraftProfile::getMinecraftArguments() const
{
- return minecraftArguments;
+ return m_minecraftArguments;
}
const QList<JarmodPtr> & MinecraftProfile::getJarMods() const
{
- return jarMods;
+ return m_jarMods;
}
const QList<LibraryPtr> & MinecraftProfile::getLibraries() const
{
- return libraries;
+ return m_libraries;
}
const QList<LibraryPtr> & MinecraftProfile::getNativeLibraries() const
{
- return nativeLibraries;
+ return m_nativeLibraries;
}
@@ -593,7 +593,7 @@ int MinecraftProfile::getFreeOrderNumber()
{
int largest = 100;
// yes, I do realize this is dumb. The order thing itself is dumb. and to be removed next.
- for(auto thing: VersionPatches)
+ for(auto thing: m_patches)
{
int order = thing->getOrder();
if(order > largest)
diff --git a/logic/minecraft/MinecraftProfile.h b/logic/minecraft/MinecraftProfile.h
index 529274d6..6e7e8f74 100644
--- a/logic/minecraft/MinecraftProfile.h
+++ b/logic/minecraft/MinecraftProfile.h
@@ -34,7 +34,6 @@ class OneSixInstance;
class MULTIMC_LOGIC_EXPORT MinecraftProfile : public QAbstractListModel
{
Q_OBJECT
- friend class ProfileStrategy;
public:
explicit MinecraftProfile(ProfileStrategy *strategy);
@@ -82,13 +81,10 @@ public:
/// clear the profile
void clear();
- /// apply the patches. Throws all sorts of errors.
- void reapply();
-
/// apply the patches. Catches all the errors and returns true/false for success/failure
- bool reapplySafe();
+ bool reapplyPatches();
-public:
+public: /* application of profile variables from patches */
void applyMinecraftVersion(const QString& id);
void applyMainClass(const QString& mainClass);
void applyAppletClass(const QString& appletClass);
@@ -99,26 +95,24 @@ public:
void applyTweakers(const QStringList &tweakers);
void applyJarMods(const QList<JarmodPtr> &jarMods);
void applyLibrary(LibraryPtr library);
+ void applyProblemSeverity(ProblemSeverity severity);
-public:
+public: /* getters for proifile variables */
QString getMinecraftVersion() const;
QString getMainClass() const;
QString getAppletClass() const;
QString getMinecraftVersionType() const;
QString getMinecraftAssets() const;
QString getMinecraftArguments() const;
- QString getVanillaMinecraftArguments() const;
const QSet<QString> & getTraits() const;
const QStringList & getTweakers() const;
const QList<JarmodPtr> & getJarMods() const;
const QList<LibraryPtr> & getLibraries() const;
const QList<LibraryPtr> & getNativeLibraries() const;
bool hasTrait(const QString & trait) const;
+ ProblemSeverity getProblemSeverity() const;
public:
- /// get file ID of the patch file at #
- QString versionFileId(const int index) const;
-
/// get the profile patch by id
ProfilePatchPtr versionPatch(const QString &id);
@@ -134,15 +128,15 @@ public:
/// Add the patch object to the internal list of patches
void appendPatch(ProfilePatchPtr patch);
-protected: /* data */
- /// the ID - determines which jar to use! ACTUALLY IMPORTANT!
- QString id;
+private: /* data */
+ /// the version of Minecraft - jar to use
+ QString m_minecraftVersion;
/// Release type - "release" or "snapshot"
- QString type;
+ QString m_minecraftVersionType;
/// Assets type - "legacy" or a version ID
- QString assets;
+ QString m_minecraftAssets;
/**
* arguments that should be used for launching minecraft
@@ -150,28 +144,30 @@ protected: /* data */
* ex: "--username ${auth_player_name} --session ${auth_session}
* --version ${version_name} --gameDir ${game_directory} --assetsDir ${game_assets}"
*/
- QString minecraftArguments;
+ QString m_minecraftArguments;
/// A list of all tweaker classes
- QStringList tweakers;
+ QStringList m_tweakers;
/// The main class to load first
- QString mainClass;
+ QString m_mainClass;
/// The applet class, for some very old minecraft releases
- QString appletClass;
+ QString m_appletClass;
/// the list of libraries
- QList<LibraryPtr> libraries;
+ QList<LibraryPtr> m_libraries;
/// the list of native libraries
- QList<LibraryPtr> nativeLibraries;
+ QList<LibraryPtr> m_nativeLibraries;
/// traits, collected from all the version files (version files can only add)
- QSet<QString> traits;
+ QSet<QString> m_traits;
/// A list of jar mods. version files can add those.
- QList<JarmodPtr> jarMods;
+ QList<JarmodPtr> m_jarMods;
+
+ ProblemSeverity m_problemSeverity = PROBLEM_NONE;
/*
FIXME: add support for those rules here? Looks like a pile of quick hacks to me though.
@@ -193,7 +189,10 @@ protected: /* data */
}
*/
// QList<Rule> rules;
-private:
- QList<ProfilePatchPtr> VersionPatches;
+
+ /// list of attached profile patches
+ QList<ProfilePatchPtr> m_patches;
+
+ /// strategy used for profile operations
ProfileStrategy *m_strategy = nullptr;
};
diff --git a/logic/minecraft/MinecraftVersion.cpp b/logic/minecraft/MinecraftVersion.cpp
index a2897950..a3855481 100644
--- a/logic/minecraft/MinecraftVersion.cpp
+++ b/logic/minecraft/MinecraftVersion.cpp
@@ -169,6 +169,7 @@ void MinecraftVersion::applyTo(MinecraftProfile *profile)
profile->applyMinecraftArguments(" ${auth_player_name} ${auth_session}"); // all builtin versions are legacy
profile->applyMinecraftVersionType(m_type);
profile->applyTraits(m_traits);
+ profile->applyProblemSeverity(m_problemSeverity);
}
int MinecraftVersion::getOrder()
diff --git a/logic/minecraft/ProfileUtils.cpp b/logic/minecraft/ProfileUtils.cpp
index a1ca4507..ef9b3b28 100644
--- a/logic/minecraft/ProfileUtils.cpp
+++ b/logic/minecraft/ProfileUtils.cpp
@@ -99,20 +99,42 @@ bool readOverrideOrders(QString path, PatchOrder &order)
return true;
}
+static VersionFilePtr createErrorVersionFile(QString fileId, QString filepath, QString error)
+{
+ auto outError = std::make_shared<VersionFile>();
+ outError->fileId = outError->name = fileId;
+ outError->filename = filepath;
+ outError->addProblem(PROBLEM_ERROR, error);
+ return outError;
+}
+
+static VersionFilePtr guardedParseJson(const QJsonDocument & doc,const QString &fileId,const QString &filepath,const bool &requireOrder)
+{
+ try
+ {
+ return OneSixVersionFormat::versionFileFromJson(doc, filepath, requireOrder);
+ }
+ catch (Exception & e)
+ {
+ return createErrorVersionFile(fileId, filepath, e.cause());
+ }
+}
+
VersionFilePtr parseJsonFile(const QFileInfo &fileInfo, const bool requireOrder)
{
QFile file(fileInfo.absoluteFilePath());
if (!file.open(QFile::ReadOnly))
{
- throw JSONValidationError(QObject::tr("Unable to open the version file %1: %2.")
- .arg(fileInfo.fileName(), file.errorString()));
+ auto errorStr = QObject::tr("Unable to open the version file %1: %2.").arg(fileInfo.fileName(), file.errorString());
+ return createErrorVersionFile(fileInfo.completeBaseName(), fileInfo.absoluteFilePath(), errorStr);
}
QJsonParseError error;
auto data = file.readAll();
QJsonDocument doc = QJsonDocument::fromJson(data, &error);
+ file.close();
if (error.error != QJsonParseError::NoError)
{
- int line = 0;
+ int line = 1;
int column = 0;
for(int i = 0; i < error.offset; i++)
{
@@ -124,12 +146,12 @@ VersionFilePtr parseJsonFile(const QFileInfo &fileInfo, const bool requireOrder)
}
column++;
}
- throw JSONValidationError(
- QObject::tr("Unable to process the version file %1: %2 at line %3 column %4.")
+ auto errorStr = QObject::tr("Unable to process the version file %1: %2 at line %3 column %4.")
.arg(fileInfo.fileName(), error.errorString())
- .arg(line).arg(column));
+ .arg(line).arg(column);
+ return createErrorVersionFile(fileInfo.completeBaseName(), fileInfo.absoluteFilePath(), errorStr);
}
- return OneSixVersionFormat::versionFileFromJson(doc, file.fileName(), requireOrder);
+ return guardedParseJson(doc, fileInfo.completeBaseName(), fileInfo.absoluteFilePath(), requireOrder);
}
VersionFilePtr parseBinaryJsonFile(const QFileInfo &fileInfo)
@@ -137,18 +159,17 @@ VersionFilePtr parseBinaryJsonFile(const QFileInfo &fileInfo)
QFile file(fileInfo.absoluteFilePath());
if (!file.open(QFile::ReadOnly))
{
- throw JSONValidationError(QObject::tr("Unable to open the version file %1: %2.")
- .arg(fileInfo.fileName(), file.errorString()));
+ auto errorStr = QObject::tr("Unable to open the version file %1: %2.").arg(fileInfo.fileName(), file.errorString());
+ return createErrorVersionFile(fileInfo.completeBaseName(), fileInfo.absoluteFilePath(), errorStr);
}
QJsonDocument doc = QJsonDocument::fromBinaryData(file.readAll());
file.close();
if (doc.isNull())
{
file.remove();
- throw JSONValidationError(
- QObject::tr("Unable to process the version file %1.").arg(fileInfo.fileName()));
+ throw JSONValidationError(QObject::tr("Unable to process the version file %1.").arg(fileInfo.fileName()));
}
- return OneSixVersionFormat::versionFileFromJson(doc, file.fileName(), false);
+ return guardedParseJson(doc, fileInfo.completeBaseName(), fileInfo.absoluteFilePath(), false);
}
void removeLwjglFromPatch(VersionFilePtr patch)
diff --git a/logic/minecraft/VersionFile.cpp b/logic/minecraft/VersionFile.cpp
index de6eff4c..9cda717e 100644
--- a/logic/minecraft/VersionFile.cpp
+++ b/logic/minecraft/VersionFile.cpp
@@ -50,4 +50,5 @@ void VersionFile::applyTo(MinecraftProfile *profile)
{
profile->applyLibrary(library);
}
+ profile->applyProblemSeverity(getProblemSeverity());
}
diff --git a/logic/minecraft/forge/ForgeInstaller.cpp b/logic/minecraft/forge/ForgeInstaller.cpp
index 9ed040de..86ba6176 100644
--- a/logic/minecraft/forge/ForgeInstaller.cpp
+++ b/logic/minecraft/forge/ForgeInstaller.cpp
@@ -82,6 +82,17 @@ void ForgeInstaller::prepare(const QString &filename, const QString &universalUr
}
catch(Exception &err)
{
+ qWarning() << "Forge: Fatal error while parsing version file:" << err.what();
+ return;
+ }
+
+ for(auto problem: newVersion->getProblems())
+ {
+ qWarning() << "Forge: Problem found: " << problem.getDescription();
+ }
+ if(newVersion->getProblemSeverity() == ProblemSeverity::PROBLEM_ERROR)
+ {
+ qWarning() << "Forge: Errors found while parsing version file";
return;
}
diff --git a/logic/minecraft/onesix/OneSixInstance.cpp b/logic/minecraft/onesix/OneSixInstance.cpp
index 3e83ff1c..f8b274ff 100644
--- a/logic/minecraft/onesix/OneSixInstance.cpp
+++ b/logic/minecraft/onesix/OneSixInstance.cpp
@@ -463,23 +463,17 @@ QString OneSixInstance::currentVersionId() const
void OneSixInstance::reloadProfile()
{
- try
- {
- m_profile->reload();
- unsetFlag(VersionBrokenFlag);
- emit versionReloaded();
- }
- catch (VersionIncomplete &error)
+ m_profile->reload();
+ auto severity = m_profile->getProblemSeverity();
+ if(severity == ProblemSeverity::PROBLEM_ERROR)
{
+ setFlag(VersionBrokenFlag);
}
- catch (Exception &error)
+ else
{
- m_profile->clear();
- setFlag(VersionBrokenFlag);
- // TODO: rethrow to show some error message(s)?
- emit versionReloaded();
- throw;
+ unsetFlag(VersionBrokenFlag);
}
+ emit versionReloaded();
}
void OneSixInstance::clearProfile()
diff --git a/logic/minecraft/onesix/OneSixProfileStrategy.cpp b/logic/minecraft/onesix/OneSixProfileStrategy.cpp
index baec635e..3ae055c0 100644
--- a/logic/minecraft/onesix/OneSixProfileStrategy.cpp
+++ b/logic/minecraft/onesix/OneSixProfileStrategy.cpp
@@ -407,7 +407,7 @@ bool OneSixProfileStrategy::installJarMods(QStringList filepaths)
profile->appendPatch(f);
}
profile->saveCurrentOrder();
- profile->reapplySafe();
+ profile->reapplyPatches();
return true;
}
diff --git a/logic/minecraft/onesix/OneSixUpdate.cpp b/logic/minecraft/onesix/OneSixUpdate.cpp
index 814cde18..b49f09b6 100644
--- a/logic/minecraft/onesix/OneSixUpdate.cpp
+++ b/logic/minecraft/onesix/OneSixUpdate.cpp
@@ -174,19 +174,10 @@ void OneSixUpdate::jarlibStart()
setStatus(tr("Getting the library files from Mojang..."));
qDebug() << m_inst->name() << ": downloading libraries";
OneSixInstance *inst = (OneSixInstance *)m_inst;
- try
+ inst->reloadProfile();
+ if(inst->flags() & BaseInstance::VersionBrokenFlag)
{
- inst->reloadProfile();
- }
- catch (Exception &e)
- {
- emitFailed(e.cause());
- return;
- }
- catch (...)
- {
- emitFailed(tr("Failed to load the version description file for reasons unknown."));
- return;
+ emitFailed(tr("Failed to load the version description files - check the instance for errors."));
}
// Build a list of URLs that will need to be downloaded.