Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions launcher/Application.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@
#include <QAccessible>
#include <QDir>
#include <QFileInfo>
#include <QEventLoop>
#include <net/Download.h>
#include <minecraft/MinecraftInstance.h>
#include <QNetworkAccessManager>
#include <QTranslator>
#include <QLibraryInfo>
Expand Down Expand Up @@ -268,6 +271,12 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv)
parser.addOption("import");
parser.addShortOpt("import", 'I');
parser.addDocumentation("import", "Import instance from specified zip (local path or URL)");
// --list-mods
parser.addOption("list-mods");
parser.addDocumentation("list-mods", "List mods for the specified instance");
// --download-mod
parser.addOption("download-mod");
parser.addDocumentation("download-mod", "Download a mod from a URL for the specified instance");

// parse the arguments
try
Expand Down Expand Up @@ -311,6 +320,8 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv)
}
m_liveCheck = args["alive"].toBool();
m_zipToImport = args["import"].toUrl();
m_instanceIdToListMods = args["list-mods"].toString();
m_modToDownload = args["download-mod"].toUrl();

QString origcwdPath = QDir::currentPath();
QString binPath = applicationDirPath();
Expand Down Expand Up @@ -1108,6 +1119,66 @@ void Application::setupWizardFinished(int status)
void Application::performMainStartupAction()
{
m_status = Application::Initialized;
if(!m_instanceIdToListMods.isEmpty())
{
auto inst = instances()->getInstanceById(m_instanceIdToListMods);
if(inst)
{
auto mcInst = std::dynamic_pointer_cast<MinecraftInstance>(inst);
if(mcInst)
{
auto mods = mcInst->loaderModList();
QEventLoop loop;
connect(mods.get(), &ModFolderModel::updateFinished, &loop, &QEventLoop::quit);
mods->update();
loop.exec();

std::cout << "Mods for instance " << qPrintable(m_instanceIdToListMods) << ":" << std::endl;
for(auto & mod: mods->allMods())
{
std::cout << " " << qPrintable(mod.name()) << " (" << qPrintable(mod.filename().fileName()) << ")";
if(!mod.sourceUrl().isEmpty()) {
std::cout << " [Source: " << qPrintable(mod.sourceUrl()) << "]";
}
std::cout << std::endl;
}
}
}
m_status = Application::Succeeded;
return;
}

if(!m_modToDownload.isEmpty())
{
if(m_instanceIdToLaunch.isEmpty()) {
std::cerr << "--download-mod requires --launch (to specify instance)!" << std::endl;
m_status = Application::Failed;
return;
}
auto inst = instances()->getInstanceById(m_instanceIdToLaunch);
auto mcInst = std::dynamic_pointer_cast<MinecraftInstance>(inst);
if(mcInst) {
QString destDir = mcInst->modsRoot();
QString fileName = m_modToDownload.fileName();
QString destPath = FS::PathCombine(destDir, fileName);

auto download = Net::Download::makeFile(m_modToDownload, destPath);
QEventLoop loop;
connect(download.get(), &Net::Download::succeeded, &loop, &QEventLoop::quit);
connect(download.get(), &Net::Download::failed, &loop, &QEventLoop::quit);
download->start();
loop.exec();

if(download->status() == Net::Download::Succeeded) {
std::cout << "Downloaded mod to " << qPrintable(destPath) << std::endl;
} else {
std::cerr << "Failed to download mod." << std::endl;
}
}
m_status = Application::Succeeded;
return;
}

if(!m_instanceIdToLaunch.isEmpty())
{
auto inst = instances()->getInstanceById(m_instanceIdToLaunch);
Expand Down
4 changes: 4 additions & 0 deletions launcher/Application.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <QIcon>
#include <QDateTime>
#include <QUrl>
#include <iostream>
#include <updater/GoUpdate.h>

#include <BaseInstance.h>
Expand All @@ -26,6 +27,7 @@ class InstanceList;
class AccountList;
class IconList;
class QNetworkAccessManager;
class Download;
class JavaInstallList;
class UpdateChecker;
class BaseProfilerFactory;
Expand Down Expand Up @@ -242,5 +244,7 @@ private slots:
QString m_offlineName;
bool m_liveCheck = false;
QUrl m_zipToImport;
QString m_instanceIdToListMods;
QUrl m_modToDownload;
std::unique_ptr<QFile> logFile;
};
35 changes: 30 additions & 5 deletions launcher/minecraft/MinecraftInstance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1022,7 +1022,12 @@ std::shared_ptr<ModFolderModel> MinecraftInstance::loaderModList() const
{
if (!m_loader_mod_list)
{
m_loader_mod_list.reset(new ModFolderModel(modsRoot()));
QStringList dirs = {modsRoot()};
QString altMods = FS::PathCombine(instanceRoot(), "mods");
if (altMods != modsRoot()) {
dirs.append(altMods);
}
m_loader_mod_list.reset(new ModFolderModel(dirs, FS::PathCombine(instanceRoot(), "registered_mods.json")));
m_loader_mod_list->disableInteraction(isRunning());
connect(this, &BaseInstance::runningStatusChanged, m_loader_mod_list.get(), &ModFolderModel::disableInteraction);
}
Expand All @@ -1033,7 +1038,12 @@ std::shared_ptr<ModFolderModel> MinecraftInstance::coreModList() const
{
if (!m_core_mod_list)
{
m_core_mod_list.reset(new ModFolderModel(coreModsDir()));
QStringList dirs = {coreModsDir()};
QString altCoreMods = FS::PathCombine(instanceRoot(), "coremods");
if (altCoreMods != coreModsDir()) {
dirs.append(altCoreMods);
}
m_core_mod_list.reset(new ModFolderModel(dirs));
m_core_mod_list->disableInteraction(isRunning());
connect(this, &BaseInstance::runningStatusChanged, m_core_mod_list.get(), &ModFolderModel::disableInteraction);
}
Expand All @@ -1044,7 +1054,12 @@ std::shared_ptr<ModFolderModel> MinecraftInstance::resourcePackList() const
{
if (!m_resource_pack_list)
{
m_resource_pack_list.reset(new ResourcePackFolderModel(resourcePacksDir()));
QStringList dirs = {resourcePacksDir()};
QString altResourcePacks = FS::PathCombine(instanceRoot(), "resourcepacks");
if (altResourcePacks != resourcePacksDir()) {
dirs.append(altResourcePacks);
}
m_resource_pack_list.reset(new ResourcePackFolderModel(dirs));
m_resource_pack_list->disableInteraction(isRunning());
connect(this, &BaseInstance::runningStatusChanged, m_resource_pack_list.get(), &ModFolderModel::disableInteraction);
}
Expand All @@ -1055,7 +1070,12 @@ std::shared_ptr<ModFolderModel> MinecraftInstance::texturePackList() const
{
if (!m_texture_pack_list)
{
m_texture_pack_list.reset(new TexturePackFolderModel(texturePacksDir()));
QStringList dirs = {texturePacksDir()};
QString altTexturePacks = FS::PathCombine(instanceRoot(), "texturepacks");
if (altTexturePacks != texturePacksDir()) {
dirs.append(altTexturePacks);
}
m_texture_pack_list.reset(new TexturePackFolderModel(dirs));
m_texture_pack_list->disableInteraction(isRunning());
connect(this, &BaseInstance::runningStatusChanged, m_texture_pack_list.get(), &ModFolderModel::disableInteraction);
}
Expand All @@ -1066,7 +1086,12 @@ std::shared_ptr<ModFolderModel> MinecraftInstance::shaderPackList() const
{
if (!m_shader_pack_list)
{
m_shader_pack_list.reset(new ResourcePackFolderModel(shaderPacksDir()));
QStringList dirs = {shaderPacksDir()};
QString altShaderPacks = FS::PathCombine(instanceRoot(), "shaderpacks");
if (altShaderPacks != shaderPacksDir()) {
dirs.append(altShaderPacks);
}
m_shader_pack_list.reset(new ResourcePackFolderModel(dirs));
m_shader_pack_list->disableInteraction(isRunning());
connect(this, &BaseInstance::runningStatusChanged, m_shader_pack_list.get(), &ModFolderModel::disableInteraction);
}
Expand Down
12 changes: 12 additions & 0 deletions launcher/minecraft/mod/Mod.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include <QFileInfo>
#include <QDateTime>
#include <QList>
#include "ModManifest.h"
#include <memory>

#include "ModDetails.h"
Expand Down Expand Up @@ -46,6 +47,16 @@ class Mod
{
return m_mmc_id;
}

QString sourceUrl() const
{
return m_sourceUrl;
}

void setSourceUrl(const QString &url)
{
m_sourceUrl = url;
}
ModType type() const
{
return m_type;
Expand Down Expand Up @@ -106,6 +117,7 @@ class Mod
QDateTime m_changedDateTime;
QString m_mmc_id;
QString m_name;
QString m_sourceUrl;
bool m_enabled = true;
bool m_resolving = false;
bool m_resolved = false;
Expand Down
20 changes: 14 additions & 6 deletions launcher/minecraft/mod/ModFolderLoadTask.cpp
Original file line number Diff line number Diff line change
@@ -1,18 +1,26 @@
#include "ModFolderLoadTask.h"
#include <QDebug>

ModFolderLoadTask::ModFolderLoadTask(QDir dir) :
m_dir(dir), m_result(new Result())
ModFolderLoadTask::ModFolderLoadTask(QStringList dirs) :
m_dirs(dirs), m_result(new Result())
{
}

void ModFolderLoadTask::run()
{
m_dir.refresh();
for (auto entry : m_dir.entryInfoList())
for (auto & dirPath : m_dirs)
{
Mod m(entry);
m_result->mods[m.mmc_id()] = m;
QDir dir(dirPath);
if (!dir.exists())
continue;
dir.setFilter(QDir::Readable | QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs);
dir.setSorting(QDir::Name | QDir::IgnoreCase | QDir::LocaleAware);
dir.refresh();
for (auto entry : dir.entryInfoList())
{
Mod m(entry);
m_result->mods[m.mmc_id()] = m;
}
}
emit succeeded();
}
4 changes: 2 additions & 2 deletions launcher/minecraft/mod/ModFolderLoadTask.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@ class ModFolderLoadTask : public QObject, public QRunnable
}

public:
ModFolderLoadTask(QDir dir);
ModFolderLoadTask(QStringList dirs);
void run();
signals:
void succeeded();
private:
QDir m_dir;
QStringList m_dirs;
ResultPtr m_result;
};
Loading