From 8a10147bbb1fe6589c4205bcfd26d6d696512ced Mon Sep 17 00:00:00 2001 From: SulfurNitride Date: Wed, 11 Feb 2026 19:04:11 -0600 Subject: Add Root Builder plugin, Linux game detection, and OMOD installer fix - New native Root Builder plugin (src/plugins/rootbuilder.py) with copy and symlink deploy modes, auto-deploy hooks, backup/restore, and third-party conflict detection that moves incompatible plugins to DisabledPlugins/. In link mode, .exe/.dll are always copied to avoid Wine/Proton path resolution issues with symlinked executables. - Fix basic_games detection on Linux: steam_utils now checks native Steam paths (~/.local/share/Steam, Flatpak, Snap), epic_utils uses correct Linux Heroic config paths, gog_utils falls back to Heroic GOG installed.json when Windows registry is unavailable. - Fix OMOD installer crash: isArchiveSupported now handles both IFileTree (from mod list refresh) and string (from install check) arguments. - Add flatpak manifest step to copy source-tree Python plugins (src/plugins/*.py) into the build output. Co-Authored-By: Claude Opus 4.6 --- libs/installer_fomod/src/fomodinstallerdialog.cpp | 13 +++++++------ libs/installer_fomod/src/fomodinstallerdialog.h | 3 ++- libs/installer_fomod/src/installerfomod.cpp | 3 ++- 3 files changed, 11 insertions(+), 8 deletions(-) (limited to 'libs/installer_fomod/src') diff --git a/libs/installer_fomod/src/fomodinstallerdialog.cpp b/libs/installer_fomod/src/fomodinstallerdialog.cpp index ef6c44f..0fa6bfc 100644 --- a/libs/installer_fomod/src/fomodinstallerdialog.cpp +++ b/libs/installer_fomod/src/fomodinstallerdialog.cpp @@ -77,12 +77,13 @@ bool PagesDescending(QGroupBox* LHS, QGroupBox* RHS) FomodInstallerDialog::FomodInstallerDialog( InstallerFomod* installer, const GuessedValue& modName, - const QString& fomodPath, + const QString& fomodPath, const QString& fomodDirName, const std::function& fileCheck, QWidget* parent) : QDialog(parent), ui(new Ui::FomodInstallerDialog), m_Installer(installer), - m_ModName(modName), m_ModID(-1), m_FomodPath(fomodPath), m_Manual(false), - m_FileCheck(fileCheck), m_FileSystemItemSequence() + m_ModName(modName), m_ModID(-1), m_FomodPath(fomodPath), + m_FomodDirName(fomodDirName), m_Manual(false), m_FileCheck(fileCheck), + m_FileSystemItemSequence() { ui->setupUi(this); setWindowFlags(windowFlags() | Qt::WindowMaximizeButtonHint); @@ -235,7 +236,7 @@ void FomodInstallerDialog::readXml(QFile& file, void FomodInstallerDialog::readInfoXml() { - QFile file(QDir::tempPath() + "/" + m_FomodPath + "/fomod/info.xml"); + QFile file(QDir::tempPath() + "/" + m_FomodPath + "/" + m_FomodDirName + "/info.xml"); // We don't need a info.xml file, so we just return if we cannot open it: if (!file.open(QIODevice::ReadOnly)) { @@ -246,7 +247,7 @@ void FomodInstallerDialog::readInfoXml() void FomodInstallerDialog::readModuleConfigXml() { - QFile file(QDir::tempPath() + "/" + m_FomodPath + "/fomod/ModuleConfig.xml"); + QFile file(QDir::tempPath() + "/" + m_FomodPath + "/" + m_FomodDirName + "/ModuleConfig.xml"); if (!file.open(QIODevice::ReadOnly)) { throw Exception(tr("%1 missing.").arg(file.fileName())); } @@ -261,7 +262,7 @@ void FomodInstallerDialog::initData(IOrganizer* moInfo) readInfoXml(); QString screenshotPath = - QDir::tempPath() + "/" + m_FomodPath + "/fomod/screenshot.png"; + QDir::tempPath() + "/" + m_FomodPath + "/" + m_FomodDirName + "/screenshot.png"; if (!QImage(screenshotPath).isNull()) { ui->screenshotLabel->setScalableResource(screenshotPath); ui->screenshotExpand->setVisible(false); diff --git a/libs/installer_fomod/src/fomodinstallerdialog.h b/libs/installer_fomod/src/fomodinstallerdialog.h index bd9f975..1ebfe60 100644 --- a/libs/installer_fomod/src/fomodinstallerdialog.h +++ b/libs/installer_fomod/src/fomodinstallerdialog.h @@ -209,7 +209,7 @@ class FomodInstallerDialog : public QDialog, public IConditionTester public: explicit FomodInstallerDialog( InstallerFomod* installer, const MOBase::GuessedValue& modName, - const QString& fomodPath, + const QString& fomodPath, const QString& fomodDirName, const std::function& fileCheck, QWidget* parent = 0); ~FomodInstallerDialog(); @@ -453,6 +453,7 @@ private: int m_ModID; QString m_FomodPath; + QString m_FomodDirName; bool m_Manual; FileDescriptorList m_RequiredFiles; diff --git a/libs/installer_fomod/src/installerfomod.cpp b/libs/installer_fomod/src/installerfomod.cpp index 3558748..8be3ca3 100644 --- a/libs/installer_fomod/src/installerfomod.cpp +++ b/libs/installer_fomod/src/installerfomod.cpp @@ -217,8 +217,9 @@ InstallerFomod::install(GuessedValue& modName, std::shared_ptr fomodTree = findFomodDirectory(tree); QString fomodPath = fomodTree->parent()->path(); + QString fomodDirName = fomodTree->name(); FomodInstallerDialog dialog( - this, modName, fomodPath, + this, modName, fomodPath, fomodDirName, std::bind(&InstallerFomod::fileState, this, std::placeholders::_1)); dialog.initData(m_MOInfo); if (!dialog.getVersion().isEmpty()) { -- cgit v1.3.1