summaryrefslogtreecommitdiff
path: root/src/organizercore.cpp
diff options
context:
space:
mode:
authorJeremy Rimpo <jeremy.rimpo@servermonkey.com>2025-05-23 14:08:01 -0500
committerGitHub <noreply@github.com>2025-05-23 14:08:01 -0500
commit3a8ea3cccee06397e90305e1e39a305f8b7c3cb3 (patch)
tree6c16bf9825bf3f1613a8536d4702f24667fc4c80 /src/organizercore.cpp
parent5d766e94a7a3b3fa861d57d3ad6ae619d98dd5d8 (diff)
Oblivion Remastered Meta PR (#2241)
* Allow for mod directory maps - Set main data files based on game - Mapped mod directories to VFS - Update overwrite setup * Skip if mod contains no 'data' dir * More mod directory compatibility fixes * Workaround for Obl:Rem save location - SLocalSavePath does nothing yet MO2 wants to use it to override the default save location - This only applies to BGS games anyway, we should move this logic * First pass for overwrite mod directory support * More overwrite move / delete restrictions * Fix issue with moving directories that are not required * Formatting pass * More modDataDirectory updates * Formatting --------- Co-authored-by: Mikaƫl Capelle <capelle.mikael@gmail.com>
Diffstat (limited to 'src/organizercore.cpp')
-rw-r--r--src/organizercore.cpp53
1 files changed, 37 insertions, 16 deletions
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index 19439d76..4eac3d66 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -462,6 +462,16 @@ void OrganizerCore::createDefaultProfile()
}
}
+void OrganizerCore::createOverwriteDirectories()
+{
+ QString overwritePath = settings().paths().overwrite();
+ for (auto modDirectory : managedGame()->getModMappings().keys()) {
+ if (!modDirectory.isEmpty()) {
+ QDir(overwritePath).mkdir(modDirectory);
+ }
+ }
+}
+
void OrganizerCore::prepareVFS()
{
m_USVFS.updateMapping(fileMapping(m_CurrentProfile->name(), QString()));
@@ -1396,8 +1406,11 @@ void OrganizerCore::updateModsInDirectoryStructure(
std::vector<DirectoryRefresher::EntryInfo> entries;
for (auto idx : modInfo.keys()) {
+ QString path = modInfo[idx]->absolutePath();
+ QString modDataDir = managedGame()->modDataDirectory();
+ path = modDataDir.isEmpty() ? path : path + "/" + modDataDir;
entries.push_back({modInfo[idx]->name(),
- modInfo[idx]->absolutePath(),
+ path,
modInfo[idx]->stealFiles(),
{},
m_CurrentProfile->getModPriority(idx)});
@@ -1426,10 +1439,12 @@ void OrganizerCore::updateModsInDirectoryStructure(
// finally also add files from bsas to the directory structure
for (auto idx : modInfo.keys()) {
+ QString path = modInfo[idx]->absolutePath();
+ QString modDataDir = managedGame()->modDataDirectory();
+ path = modDataDir.isEmpty() ? path : path + "/" + modDataDir;
m_DirectoryRefresher->addModBSAToStructure(
m_DirectoryStructure, modInfo[idx]->name(),
- m_CurrentProfile->getModPriority(idx), modInfo[idx]->absolutePath(),
- modInfo[idx]->archives());
+ m_CurrentProfile->getModPriority(idx), path, modInfo[idx]->archives());
}
}
@@ -2034,12 +2049,7 @@ std::vector<Mapping> OrganizerCore::fileMapping(const QString& profileName,
MappingType result;
- QStringList dataPaths;
- dataPaths.append(QDir::toNativeSeparators(game->dataDirectory().absolutePath()));
-
- for (auto directory : game->secondaryDataDirectories()) {
- dataPaths.append(directory.absolutePath());
- }
+ auto dataMaps = game->getModMappings();
bool overwriteActive = false;
@@ -2052,13 +2062,19 @@ std::vector<Mapping> OrganizerCore::fileMapping(const QString& profileName,
ModInfo::Ptr modPtr = ModInfo::getByIndex(modIndex);
bool createTarget = customOverwrite == std::get<0>(mod);
+ QDir modDir = QDir(std::get<1>(mod));
overwriteActive |= createTarget;
if (modPtr->isRegular()) {
- for (auto dataPath : dataPaths) {
- result.insert(result.end(), {QDir::toNativeSeparators(std::get<1>(mod)),
- dataPath, true, createTarget});
+ for (auto dataMap : dataMaps.asKeyValueRange()) {
+ auto mapDir = QDir(modDir.absoluteFilePath(dataMap.first));
+ if (mapDir.exists()) {
+ for (auto dir : dataMap.second) {
+ result.insert(result.end(),
+ {mapDir.absolutePath(), dir, true, createTarget});
+ }
+ }
}
}
}
@@ -2080,10 +2096,15 @@ std::vector<Mapping> OrganizerCore::fileMapping(const QString& profileName,
}
}
- for (auto dataPath : dataPaths) {
- result.insert(result.end(),
- {QDir::toNativeSeparators(m_Settings.paths().overwrite()), dataPath,
- true, customOverwrite.isEmpty()});
+ QDir overwriteDir(m_Settings.paths().overwrite());
+ for (auto dataMap : dataMaps.asKeyValueRange()) {
+ auto overwriteSubpath = overwriteDir.absoluteFilePath(dataMap.first);
+ if (QDir(overwriteSubpath).exists()) {
+ for (auto dir : dataMap.second) {
+ result.insert(result.end(),
+ {overwriteSubpath, dir, true, customOverwrite.isEmpty()});
+ }
+ }
}
for (MOBase::IPluginFileMapper* mapper :