View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0002996 | DarkRadiant | General | public | 25.01.2012 14:21 | 27.08.2013 14:32 |
| Reporter | dersaidin | Assigned To | greebo | ||
| Priority | normal | Severity | normal | Reproducibility | always |
| Status | closed | Resolution | fixed | ||
| Target Version | 1.8.0 | Fixed in Version | 1.8.0 | ||
| Summary | 0002996: GameManager adds duplicates VFS search dirs | ||||
| Description | The game manager is adding duplicate search directories. I see some logic in Manager::updateEnginePath() to try to avoid duplicate paths, but only in one specific case. Apparently in whatever configuration I have this is not enough to stop duplicates. Is this a configuration problem? Should we prevent duplicates more thoroughly anyway? | ||||
| Additional Information | GameManager: Selected game type: XreaL GameManager: Map path set to C:/weaver2/base/maps/ GameManager: Prefab path set to C:/weaver2/base/prefabs/ VFS Search Path priority is: - C:/weaver2/base/ - C:/weaver2/base/ => Module GameManager initialised. VirtualFileSystem needs dependency XMLRegistry ModuleRegistry: dependencies satisfied, invoking initialiser for VirtualFileSystem VFS::initialiseModule called filesystem initialised [vfs] searched directory: C:/weaver2/base/ [vfs] pak file: C:/weaver2/base/textures-trak_2011-01-23.pk3 [vfs] pak file: C:/weaver2/base/models-players-fallen_2010-11-24.pk3 [vfs] pak file: C:/weaver2/base/map-bow_BLOCK-20120124.pk3 [vfs] searched directory: C:/weaver2/base/ [vfs] pak file: C:/weaver2/base/textures-trak_2011-01-23.pk3 [vfs] pak file: C:/weaver2/base/models-players-fallen_2010-11-24.pk3 [vfs] pak file: C:/weaver2/base/map-bow_BLOCK-20120124.pk3 | ||||
| Tags | No tags attached. | ||||
| Attached Files | darkradiant6981_vfs_pathdup.patch (2,892 bytes)
Index: radiant/settings/GameManager.cpp
===================================================================
--- radiant/settings/GameManager.cpp (revision 6981)
+++ radiant/settings/GameManager.cpp (working copy)
@@ -339,6 +339,18 @@
);
}
+void Manager::addVFSSearchPath(const std::string &path)
+{
+ // If this path is searched earlier then the file would be found the first time.
+ for (PathList::iterator i = _vfsSearchPaths.begin();
+ i != _vfsSearchPaths.end(); ++i) {
+ if (*i == path) {
+ return;
+ }
+ }
+ _vfsSearchPaths.push_back(path);
+}
+
bool Manager::settingsValid() const
{
if (os::fileOrDirExists(_enginePath)) {
@@ -436,23 +448,23 @@
{
if (!_fsGame.empty()) {
// We have a MOD, register this directory first
- _vfsSearchPaths.push_back(_modPath);
+ addVFSSearchPath(_modPath);
#if defined(POSIX)
// On Linux, the above was in ~/.doom3/, search the engine mod path as well
std::string baseModPath = os::standardPathWithSlash(_enginePath + _fsGame);
- _vfsSearchPaths.push_back(baseModPath);
+ addVFSSearchPath(baseModPath);
#endif
}
if (!_fsGameBase.empty()) {
// We have a MOD base, register this directory as second
- _vfsSearchPaths.push_back(_modBasePath);
+ addVFSSearchPath(_modBasePath);
#if defined(POSIX)
// On Linux, the above was in ~/.doom3/, search the engine mod path as well
std::string baseModPath = os::standardPathWithSlash(_enginePath + _fsGameBase);
- _vfsSearchPaths.push_back(baseModPath);
+ addVFSSearchPath(baseModPath);
#endif
}
@@ -462,20 +474,15 @@
getUserEnginePath() + // ~/.doom3
currentGame()->getKeyValue("basegame") // base
);
- _vfsSearchPaths.push_back(userBasePath);
+ addVFSSearchPath(userBasePath);
// Register the base game folder (/usr/local/games/doom3/<basegame>) last
// This will always be searched, but *after* the other paths
std::string baseGame = os::standardPathWithSlash(
_enginePath + currentGame()->getKeyValue("basegame")
);
+ addVFSSearchPath(baseGame);
- // greebo: Avoid double-registering the same path (in Windows)
- if (baseGame != userBasePath)
- {
- _vfsSearchPaths.push_back(baseGame);
- }
-
// Update map and prefab paths
setMapAndPrefabPaths(userBasePath);
Index: radiant/settings/GameManager.h
===================================================================
--- radiant/settings/GameManager.h (revision 6981)
+++ radiant/settings/GameManager.h (working copy)
@@ -73,6 +73,11 @@
*/
void constructPaths();
+ /** DerSaidin: Adds a path to the VFS search list, skipping any duplicates.
+ * Note that the order of search paths must be preserved.
+ */
+ void addVFSSearchPath(const std::string &path);
+
/** greebo: Adds the EnginePath and fs_game widgets to the Preference dialog
*/
void constructPreferences();
| ||||
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 25.01.2012 14:21 | dersaidin | New Issue | |
| 25.01.2012 14:21 | dersaidin | File Added: darkradiant6981_vfs_pathdup.patch | |
| 25.01.2012 14:21 | dersaidin | Note Added: 0004277 | |
| 26.01.2012 13:17 | greebo | Status | new => acknowledged |
| 12.10.2012 19:06 | greebo | Assigned To | => greebo |
| 12.10.2012 19:06 | greebo | Status | acknowledged => assigned |
| 12.10.2012 19:06 | greebo | Note Added: 0004912 | |
| 12.10.2012 19:06 | greebo | Status | assigned => resolved |
| 12.10.2012 19:06 | greebo | Fixed in Version | => 1.8.0 |
| 12.10.2012 19:06 | greebo | Resolution | open => fixed |
| 12.10.2012 19:07 | greebo | Target Version | => 1.8.0 |
| 27.08.2013 14:32 | greebo | Status | resolved => closed |