aboutsummaryrefslogtreecommitdiff
path: root/libs/game_bethesda/src/games/starfield/starfieldgameplugins.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/game_bethesda/src/games/starfield/starfieldgameplugins.cpp')
-rw-r--r--libs/game_bethesda/src/games/starfield/starfieldgameplugins.cpp74
1 files changed, 72 insertions, 2 deletions
diff --git a/libs/game_bethesda/src/games/starfield/starfieldgameplugins.cpp b/libs/game_bethesda/src/games/starfield/starfieldgameplugins.cpp
index 6b4e6ab..efd1bad 100644
--- a/libs/game_bethesda/src/games/starfield/starfieldgameplugins.cpp
+++ b/libs/game_bethesda/src/games/starfield/starfieldgameplugins.cpp
@@ -1,5 +1,9 @@
#include "starfieldgameplugins.h"
+#include <ipluginlist.h>
+#include <report.h>
+#include <safewritefile.h>
+
using namespace MOBase;
StarfieldGamePlugins::StarfieldGamePlugins(MOBase::IOrganizer* organizer)
@@ -19,10 +23,76 @@ bool StarfieldGamePlugins::blueprintPluginsAreSupported()
void StarfieldGamePlugins::writePluginList(const IPluginList* pluginList,
const QString& filePath)
{
- if (m_Organizer->managedGame()->loadOrderMechanism() ==
+ if (m_Organizer->managedGame()->loadOrderMechanism() !=
MOBase::IPluginGame::LoadOrderMechanism::PluginsTxt) {
- CreationGamePlugins::writePluginList(pluginList, filePath);
+ return;
+ }
+
+ SafeWriteFile file(filePath);
+
+ QStringEncoder encoder(QStringConverter::Encoding::System);
+
+ file->resize(0);
+
+ file->write(encoder.encode(
+ "# This file was automatically generated by Mod Organizer.\r\n"));
+
+ bool invalidFileNames = false;
+ int writtenCount = 0;
+
+ QStringList plugins = pluginList->pluginNames();
+ std::sort(plugins.begin(), plugins.end(),
+ [pluginList](const QString& lhs, const QString& rhs) {
+ return pluginList->priority(lhs) < pluginList->priority(rhs);
+ });
+
+ QStringList PrimaryPlugins = organizer()->managedGame()->primaryPlugins();
+ QStringList DLCPlugins = organizer()->managedGame()->DLCPlugins();
+ QSet<QString> ManagedMods =
+ QSet<QString>(PrimaryPlugins.begin(), PrimaryPlugins.end());
+ QSet<QString> DLCSet = QSet<QString>(DLCPlugins.begin(), DLCPlugins.end());
+ ManagedMods.subtract(DLCSet);
+ PrimaryPlugins.append(QList<QString>(ManagedMods.begin(), ManagedMods.end()));
+
+ // TODO: do not write plugins in OFFICIAL_FILES container
+ for (const QString& pluginName : plugins) {
+ if (!PrimaryPlugins.contains(pluginName, Qt::CaseInsensitive) &&
+ !pluginList->isBlueprintFlagged(pluginName) &&
+ !pluginName.startsWith(m_Organizer->managedGame()->blueprintPrefix(),
+ Qt::CaseInsensitive)) {
+ if (pluginList->state(pluginName) == IPluginList::STATE_ACTIVE) {
+ auto result = encoder.encode(pluginName);
+ if (encoder.hasError()) {
+ invalidFileNames = true;
+ qCritical("invalid plugin name %s", qUtf8Printable(pluginName));
+ } else {
+ file->write("*");
+ file->write(result);
+ }
+ file->write("\r\n");
+ ++writtenCount;
+ } else {
+ auto result = encoder.encode(pluginName);
+ if (encoder.hasError()) {
+ invalidFileNames = true;
+ qCritical("invalid plugin name %s", qUtf8Printable(pluginName));
+ } else {
+ file->write(result);
+ }
+ file->write("\r\n");
+ ++writtenCount;
+ }
+ }
}
+
+ if (invalidFileNames) {
+ reportError(QObject::tr("Some of your plugins have invalid names! These "
+ "plugins can not be loaded by the game. Please see "
+ "mo_interface.log for a list of affected plugins "
+ "and rename them."));
+ }
+
+ file->commit();
}
QStringList StarfieldGamePlugins::readPluginList(MOBase::IPluginList* pluginList)