summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetr Mrázek <peterix@gmail.com>2017-08-07 00:46:29 +0200
committerPetr Mrázek <peterix@gmail.com>2017-08-07 00:46:29 +0200
commit8cf88ffc580310e2e814d097358ff783cd5c4416 (patch)
tree4ed75860253ffa667af38664b4fd10e6d7bc29de
parent117bfef151c2083085025c32f96461f1c97dbec3 (diff)
downloadMultiMC-8cf88ffc580310e2e814d097358ff783cd5c4416.tar
MultiMC-8cf88ffc580310e2e814d097358ff783cd5c4416.tar.gz
MultiMC-8cf88ffc580310e2e814d097358ff783cd5c4416.tar.lz
MultiMC-8cf88ffc580310e2e814d097358ff783cd5c4416.tar.xz
MultiMC-8cf88ffc580310e2e814d097358ff783cd5c4416.zip
GH-1314 add UI for custom minecraft jar addition
Also changes the text of the jar mod addition button. It should be clearer what it does and hopefully will not confuse as many people.
-rw-r--r--api/logic/minecraft/MinecraftProfile.cpp6
-rw-r--r--api/logic/minecraft/MinecraftProfile.h3
-rw-r--r--api/logic/minecraft/ProfileStrategy.h3
-rw-r--r--api/logic/minecraft/ftb/FTBProfileStrategy.cpp5
-rw-r--r--api/logic/minecraft/ftb/FTBProfileStrategy.h15
-rw-r--r--api/logic/minecraft/onesix/OneSixInstance.cpp7
-rw-r--r--api/logic/minecraft/onesix/OneSixInstance.h3
-rw-r--r--api/logic/minecraft/onesix/OneSixProfileStrategy.cpp64
-rw-r--r--api/logic/minecraft/onesix/OneSixProfileStrategy.h15
-rw-r--r--api/logic/minecraft/onesix/update/FMLLibrariesTask.cpp6
-rw-r--r--application/GuiUtil.cpp21
-rw-r--r--application/GuiUtil.h1
-rw-r--r--application/MultiMC.cpp3
-rw-r--r--application/pages/VersionPage.cpp34
-rw-r--r--application/pages/VersionPage.h1
-rw-r--r--application/pages/VersionPage.ui12
16 files changed, 147 insertions, 52 deletions
diff --git a/api/logic/minecraft/MinecraftProfile.cpp b/api/logic/minecraft/MinecraftProfile.cpp
index 4c1ab818..f6e39f45 100644
--- a/api/logic/minecraft/MinecraftProfile.cpp
+++ b/api/logic/minecraft/MinecraftProfile.cpp
@@ -664,6 +664,12 @@ void MinecraftProfile::installJarMods(QStringList selectedFiles)
m_strategy->installJarMods(selectedFiles);
}
+void MinecraftProfile::installCustomJar(QString selectedFile)
+{
+ m_strategy->installCustomJar(selectedFile);
+}
+
+
/*
* TODO: get rid of this. Get rid of all order numbers.
*/
diff --git a/api/logic/minecraft/MinecraftProfile.h b/api/logic/minecraft/MinecraftProfile.h
index 192c77f9..e81ba499 100644
--- a/api/logic/minecraft/MinecraftProfile.h
+++ b/api/logic/minecraft/MinecraftProfile.h
@@ -58,6 +58,9 @@ public:
/// install more jar mods
void installJarMods(QStringList selectedFiles);
+ /// install more jar mods
+ void installCustomJar(QString selectedFile);
+
/// DEPRECATED, remove ASAP
int getFreeOrderNumber();
diff --git a/api/logic/minecraft/ProfileStrategy.h b/api/logic/minecraft/ProfileStrategy.h
index 26bdf661..09a09f24 100644
--- a/api/logic/minecraft/ProfileStrategy.h
+++ b/api/logic/minecraft/ProfileStrategy.h
@@ -23,6 +23,9 @@ public:
/// install a list of jar mods into the instance
virtual bool installJarMods(QStringList filepaths) = 0;
+ /// install a custom jar (replaces the one from the Minecraft component)
+ virtual bool installCustomJar(QString filepath) = 0;
+
/// remove any files or records that constitute the version patch
virtual bool removePatch(ProfilePatchPtr jarMod) = 0;
diff --git a/api/logic/minecraft/ftb/FTBProfileStrategy.cpp b/api/logic/minecraft/ftb/FTBProfileStrategy.cpp
index 9fa4e6a1..d5df7848 100644
--- a/api/logic/minecraft/ftb/FTBProfileStrategy.cpp
+++ b/api/logic/minecraft/ftb/FTBProfileStrategy.cpp
@@ -118,6 +118,11 @@ bool FTBProfileStrategy::installJarMods(QStringList filepaths)
return false;
}
+bool FTBProfileStrategy::installCustomJar(QString filepath)
+{
+ return false;
+}
+
bool FTBProfileStrategy::customizePatch(ProfilePatchPtr patch)
{
return false;
diff --git a/api/logic/minecraft/ftb/FTBProfileStrategy.h b/api/logic/minecraft/ftb/FTBProfileStrategy.h
index 522af098..4637d04b 100644
--- a/api/logic/minecraft/ftb/FTBProfileStrategy.h
+++ b/api/logic/minecraft/ftb/FTBProfileStrategy.h
@@ -9,13 +9,14 @@ class FTBProfileStrategy : public OneSixProfileStrategy
public:
FTBProfileStrategy(OneSixFTBInstance * instance);
virtual ~FTBProfileStrategy() {};
- virtual void load() override;
- virtual bool resetOrder() override;
- virtual bool saveOrder(ProfileUtils::PatchOrder order) override;
- virtual bool installJarMods(QStringList filepaths) override;
- virtual bool customizePatch (ProfilePatchPtr patch) override;
- virtual bool revertPatch (ProfilePatchPtr patch) override;
+ void load() override;
+ bool resetOrder() override;
+ bool saveOrder(ProfileUtils::PatchOrder order) override;
+ bool installJarMods(QStringList filepaths) override;
+ bool installCustomJar(QString filepath) override;
+ bool customizePatch (ProfilePatchPtr patch) override;
+ bool revertPatch (ProfilePatchPtr patch) override;
protected:
- virtual void loadDefaultBuiltinPatches() override;
+ void loadDefaultBuiltinPatches() override;
};
diff --git a/api/logic/minecraft/onesix/OneSixInstance.cpp b/api/logic/minecraft/onesix/OneSixInstance.cpp
index 107da04f..34253f02 100644
--- a/api/logic/minecraft/onesix/OneSixInstance.cpp
+++ b/api/logic/minecraft/onesix/OneSixInstance.cpp
@@ -637,11 +637,16 @@ QString OneSixInstance::jarModsDir() const
return FS::PathCombine(instanceRoot(), "jarmods");
}
-QString OneSixInstance::libDir() const
+QString OneSixInstance::FMLlibDir() const
{
return FS::PathCombine(minecraftRoot(), "lib");
}
+QString OneSixInstance::customLibrariesDir() const
+{
+ return FS::PathCombine(instanceRoot(), "libraries");
+}
+
QString OneSixInstance::worldDir() const
{
return FS::PathCombine(minecraftRoot(), "saves");
diff --git a/api/logic/minecraft/onesix/OneSixInstance.h b/api/logic/minecraft/onesix/OneSixInstance.h
index bf12160e..0cb4340b 100644
--- a/api/logic/minecraft/onesix/OneSixInstance.h
+++ b/api/logic/minecraft/onesix/OneSixInstance.h
@@ -48,7 +48,8 @@ public:
QString texturePacksDir() const;
QString loaderModsDir() const;
QString coreModsDir() const;
- QString libDir() const;
+ QString FMLlibDir() const;
+ QString customLibrariesDir() const;
QString worldDir() const;
virtual QString instanceConfigFolder() const override;
diff --git a/api/logic/minecraft/onesix/OneSixProfileStrategy.cpp b/api/logic/minecraft/onesix/OneSixProfileStrategy.cpp
index ef2a7294..39dd8343 100644
--- a/api/logic/minecraft/onesix/OneSixProfileStrategy.cpp
+++ b/api/logic/minecraft/onesix/OneSixProfileStrategy.cpp
@@ -405,3 +405,67 @@ bool OneSixProfileStrategy::installJarMods(QStringList filepaths)
return true;
}
+bool OneSixProfileStrategy::installCustomJar(QString filepath)
+{
+ QString patchDir = FS::PathCombine(m_instance->instanceRoot(), "patches");
+ if(!FS::ensureFolderPathExists(patchDir))
+ {
+ return false;
+ }
+
+ QString libDir = m_instance->customLibrariesDir();
+ if (!FS::ensureFolderPathExists(libDir))
+ {
+ return false;
+ }
+
+ auto specifier = GradleSpecifier("org.multimc:customjar:1");
+ QFileInfo sourceInfo(filepath);
+ QString target_filename = specifier.getFileName();
+ QString target_id = specifier.artifactId();
+ QString target_name = sourceInfo.completeBaseName() + " (custom jar)";
+ QString finalPath = FS::PathCombine(libDir, target_filename);
+
+ QFileInfo jarInfo(finalPath);
+ if (jarInfo.exists())
+ {
+ if(!QFile::remove(finalPath))
+ {
+ return false;
+ }
+ }
+ if (!QFile::copy(filepath, finalPath))
+ {
+ return false;
+ }
+
+ auto f = std::make_shared<VersionFile>();
+ auto jarMod = std::make_shared<Library>();
+ jarMod->setRawName(specifier);
+ jarMod->setDisplayName(sourceInfo.completeBaseName());
+ jarMod->setHint("local");
+ f->mainJar = jarMod;
+ f->name = target_name;
+ f->uid = target_id;
+ f->order = profile->getFreeOrderNumber();
+ QString patchFileName = FS::PathCombine(patchDir, target_id + ".json");
+
+ QFile file(patchFileName);
+ if (!file.open(QFile::WriteOnly))
+ {
+ qCritical() << "Error opening" << file.fileName()
+ << "for reading:" << file.errorString();
+ return false;
+ }
+ file.write(OneSixVersionFormat::versionFileToJson(f, true).toJson());
+ file.close();
+
+ auto patch = std::make_shared<ProfilePatch>(f, patchFileName);
+ patch->setMovable(true);
+ patch->setRemovable(true);
+ profile->appendPatch(patch);
+
+ profile->saveCurrentOrder();
+ profile->reapplyPatches();
+ return true;
+}
diff --git a/api/logic/minecraft/onesix/OneSixProfileStrategy.h b/api/logic/minecraft/onesix/OneSixProfileStrategy.h
index 96c1ba7b..e4eee4b2 100644
--- a/api/logic/minecraft/onesix/OneSixProfileStrategy.h
+++ b/api/logic/minecraft/onesix/OneSixProfileStrategy.h
@@ -8,13 +8,14 @@ class OneSixProfileStrategy : public ProfileStrategy
public:
OneSixProfileStrategy(OneSixInstance * instance);
virtual ~OneSixProfileStrategy() {};
- virtual void load() override;
- virtual bool resetOrder() override;
- virtual bool saveOrder(ProfileUtils::PatchOrder order) override;
- virtual bool installJarMods(QStringList filepaths) override;
- virtual bool removePatch(ProfilePatchPtr patch) override;
- virtual bool customizePatch(ProfilePatchPtr patch) override;
- virtual bool revertPatch(ProfilePatchPtr patch) override;
+ void load() override;
+ bool resetOrder() override;
+ bool saveOrder(ProfileUtils::PatchOrder order) override;
+ bool installJarMods(QStringList filepaths) override;
+ bool installCustomJar(QString filepath) override;
+ bool removePatch(ProfilePatchPtr patch) override;
+ bool customizePatch(ProfilePatchPtr patch) override;
+ bool revertPatch(ProfilePatchPtr patch) override;
protected:
virtual void loadDefaultBuiltinPatches();
diff --git a/api/logic/minecraft/onesix/update/FMLLibrariesTask.cpp b/api/logic/minecraft/onesix/update/FMLLibrariesTask.cpp
index 42148e67..13310e92 100644
--- a/api/logic/minecraft/onesix/update/FMLLibrariesTask.cpp
+++ b/api/logic/minecraft/onesix/update/FMLLibrariesTask.cpp
@@ -45,7 +45,7 @@ void FMLLibrariesTask::executeTask()
// now check the lib folder inside the instance for files.
for (auto &lib : libList)
{
- QFileInfo libInfo(FS::PathCombine(inst->libDir(), lib.filename));
+ QFileInfo libInfo(FS::PathCombine(inst->FMLlibDir(), lib.filename));
if (libInfo.exists())
continue;
fmlLibsToProcess.append(lib);
@@ -95,13 +95,13 @@ void FMLLibrariesTask::fmllibsFinished()
{
progress(index, fmlLibsToProcess.size());
auto entry = metacache->resolveEntry("fmllibs", lib.filename);
- auto path = FS::PathCombine(inst->libDir(), lib.filename);
+ auto path = FS::PathCombine(inst->FMLlibDir(), lib.filename);
if (!FS::ensureFilePathExists(path))
{
emitFailed(tr("Failed creating FML library folder inside the instance."));
return;
}
- if (!QFile::copy(entry->getFullPath(), FS::PathCombine(inst->libDir(), lib.filename)))
+ if (!QFile::copy(entry->getFullPath(), FS::PathCombine(inst->FMLlibDir(), lib.filename)))
{
emitFailed(tr("Failed copying Forge/FML library: %1.").arg(lib.filename));
return;
diff --git a/application/GuiUtil.cpp b/application/GuiUtil.cpp
index 26050488..b05fc57c 100644
--- a/application/GuiUtil.cpp
+++ b/application/GuiUtil.cpp
@@ -56,8 +56,7 @@ void GuiUtil::setClipboardText(const QString &text)
QApplication::clipboard()->setText(text);
}
-
-QStringList GuiUtil::BrowseForFiles(QString context, QString caption, QString filter, QString defaultPath, QWidget *parentWidget)
+static QStringList BrowseForFileInternal(QString context, QString caption, QString filter, QString defaultPath, QWidget *parentWidget, bool single)
{
static QMap<QString, QString> savedPaths;
@@ -82,7 +81,7 @@ QStringList GuiUtil::BrowseForFiles(QString context, QString caption, QString fi
}
urls.append(QUrl::fromLocalFile(defaultPath));
- w.setFileMode(QFileDialog::ExistingFiles);
+ w.setFileMode(single ? QFileDialog::ExistingFile : QFileDialog::ExistingFiles);
w.setAcceptMode(QFileDialog::AcceptOpen);
w.setNameFilter(filter);
@@ -114,3 +113,19 @@ QStringList GuiUtil::BrowseForFiles(QString context, QString caption, QString fi
savedPaths[context] = w.directory().absolutePath();
return {};
}
+
+QString GuiUtil::BrowseForFile(QString context, QString caption, QString filter, QString defaultPath, QWidget *parentWidget)
+{
+ auto resultList = BrowseForFileInternal(context, caption, filter, defaultPath, parentWidget, true);
+ if(resultList.size())
+ {
+ return resultList[0];
+ }
+ return QString();
+}
+
+
+QStringList GuiUtil::BrowseForFiles(QString context, QString caption, QString filter, QString defaultPath, QWidget *parentWidget)
+{
+ return BrowseForFileInternal(context, caption, filter, defaultPath, parentWidget, false);
+}
diff --git a/application/GuiUtil.h b/application/GuiUtil.h
index 52520c56..5e109383 100644
--- a/application/GuiUtil.h
+++ b/application/GuiUtil.h
@@ -7,4 +7,5 @@ namespace GuiUtil
QString uploadPaste(const QString &text, QWidget *parentWidget);
void setClipboardText(const QString &text);
QStringList BrowseForFiles(QString context, QString caption, QString filter, QString defaultPath, QWidget *parentWidget);
+QString BrowseForFile(QString context, QString caption, QString filter, QString defaultPath, QWidget *parentWidget);
}
diff --git a/application/MultiMC.cpp b/application/MultiMC.cpp
index 64e6bba2..4eec3927 100644
--- a/application/MultiMC.cpp
+++ b/application/MultiMC.cpp
@@ -501,9 +501,6 @@ MultiMC::MultiMC(int &argc, char **argv) : QApplication(argc, argv)
m_settings->registerSetting("UpdateDialogGeometry", "");
- // Jar mod nag dialog in version page
- m_settings->registerSetting("JarModNagSeen", false);
-
// paste.ee API key
m_settings->registerSetting("PasteEEAPIKey", "multimc");
diff --git a/application/pages/VersionPage.cpp b/application/pages/VersionPage.cpp
index 8c14818f..90fd3241 100644
--- a/application/pages/VersionPage.cpp
+++ b/application/pages/VersionPage.cpp
@@ -250,34 +250,20 @@ void VersionPage::on_modBtn_clicked()
void VersionPage::on_jarmodBtn_clicked()
{
- bool nagShown = false;
- if (!m_profile->hasTrait("legacyLaunch") && !m_profile->hasTrait("alphaLaunch"))
- {
- // not legacy launch... nag
- auto seenNag = MMC->settings()->get("JarModNagSeen").toBool();
- if(!seenNag)
- {
- auto result = QMessageBox::question(this,
- tr("Are you sure?"),
- tr("This will add mods directly to the Minecraft jar.\n"
- "Unless you KNOW that this is what NEEDS to be done, you should just use the mods folder (Loader mods).\n"
- "\n"
- "Do you want to continue?"),
- tr("I understand, continue."), tr("Cancel"), QString(), 1, 1
- );
- if(result != 0)
- return;
- nagShown = true;
- }
- }
auto list = GuiUtil::BrowseForFiles("jarmod", tr("Select jar mods"), tr("Minecraft.jar mods (*.zip *.jar)"), MMC->settings()->get("CentralModsDir").toString(), this->parentWidget());
if(!list.empty())
{
m_profile->installJarMods(list);
- if(nagShown)
- {
- MMC->settings()->set("JarModNagSeen", QVariant(true));
- }
+ }
+ updateButtons();
+}
+
+void VersionPage::on_jarBtn_clicked()
+{
+ auto jarPath = GuiUtil::BrowseForFile("jar", tr("Select jar"), tr("Minecraft.jar replacement (*.jar)"), MMC->settings()->get("CentralModsDir").toString(), this->parentWidget());
+ if(!jarPath.isEmpty())
+ {
+ m_profile->installCustomJar(jarPath);
}
updateButtons();
}
diff --git a/application/pages/VersionPage.h b/application/pages/VersionPage.h
index cc6c0b7b..12a699eb 100644
--- a/application/pages/VersionPage.h
+++ b/application/pages/VersionPage.h
@@ -58,6 +58,7 @@ private slots:
void on_moveUpBtn_clicked();
void on_moveDownBtn_clicked();
void on_jarmodBtn_clicked();
+ void on_jarBtn_clicked();
void on_revertBtn_clicked();
void on_editBtn_clicked();
void on_modBtn_clicked();
diff --git a/application/pages/VersionPage.ui b/application/pages/VersionPage.ui
index c16208db..afb33164 100644
--- a/application/pages/VersionPage.ui
+++ b/application/pages/VersionPage.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>693</width>
- <height>750</height>
+ <height>788</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
@@ -206,7 +206,14 @@
<string>Add a mod into the Minecraft jar file.</string>
</property>
<property name="text">
- <string>Add jar mod</string>
+ <string>Add to Minecraft.jar</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="jarBtn">
+ <property name="text">
+ <string>Replace Minecraft.jar</string>
</property>
</widget>
</item>
@@ -281,7 +288,6 @@
</customwidget>
</customwidgets>
<tabstops>
- <tabstop>tabWidget</tabstop>
<tabstop>packageView</tabstop>
<tabstop>changeVersionBtn</tabstop>
<tabstop>moveUpBtn</tabstop>