From 5db369bea3d0cdd3dbd3b5b8038a399f0dbf84b6 Mon Sep 17 00:00:00 2001 From: bones_was_here Date: Tue, 6 Feb 2024 08:59:24 +1000 Subject: [PATCH] fs: save files in the correct place when gamedir(s) are in use As per the description of the `gamedir` command, it's expected that a gamedir can be added without needing to re-add the primary (gamedirname1) or secondary/mod (gamedirname2) as the last gamedir just to ensure that files still get saved there as usual. Closes https://gitlab.com/xonotic/darkplaces/-/issues/210 Signed-off-by: bones_was_here --- fs.c | 21 ++++++++++++--------- fs.h | 2 +- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/fs.c b/fs.c index e1b22c46..ad69946f 100644 --- a/fs.c +++ b/fs.c @@ -1345,13 +1345,14 @@ Sets fs_gamedir, adds the directory to the head of the path, then loads and adds pak1.pak pak2.pak ... ================ */ -static void FS_AddGameDirectory (const char *dir) +static void FS_AddGameDirectory (const char *dir, qbool set_fs_gamedir) { int i; stringlist_t list; searchpath_t *search; - dp_strlcpy (fs_gamedir, dir, sizeof (fs_gamedir)); + if (set_fs_gamedir) + dp_strlcpy (fs_gamedir, dir, sizeof (fs_gamedir)); stringlistinit(&list); listdirectory(&list, "", dir); @@ -1392,14 +1393,14 @@ static void FS_AddGameDirectory (const char *dir) FS_AddGameHierarchy ================ */ -static void FS_AddGameHierarchy (const char *dir) +static void FS_AddGameHierarchy (const char *dir, qbool set_fs_gamedir) { char vabuf[1024]; // Add the common game directory - FS_AddGameDirectory (va(vabuf, sizeof(vabuf), "%s%s/", fs_basedir, dir)); + FS_AddGameDirectory (va(vabuf, sizeof(vabuf), "%s%s/", fs_basedir, dir), set_fs_gamedir); if (*fs_userdir) - FS_AddGameDirectory(va(vabuf, sizeof(vabuf), "%s%s/", fs_userdir, dir)); + FS_AddGameDirectory(va(vabuf, sizeof(vabuf), "%s%s/", fs_userdir, dir), set_fs_gamedir); } @@ -1560,30 +1561,32 @@ void FS_Rescan (void) // add the game-specific paths // gamedirname1 (typically id1) - FS_AddGameHierarchy (gamedirname1); + FS_AddGameHierarchy (gamedirname1, true); // update the com_modname (used for server info) if (gamedirname2 && gamedirname2[0]) dp_strlcpy(com_modname, gamedirname2, sizeof(com_modname)); else dp_strlcpy(com_modname, gamedirname1, sizeof(com_modname)); - // add the game-specific path, if any + // add the secondary game-specific path, if any // (only used for mission packs and the like, which should set fs_modified) if (gamedirname2 && gamedirname2[0]) { fs_modified = true; - FS_AddGameHierarchy (gamedirname2); + FS_AddGameHierarchy (gamedirname2, true); } // -game // Adds basedir/gamedir as an override game // LadyHavoc: now supports multiple -game directories // set the com_modname (reported in server info) + // bones_was_here: does NOT set fs_gamedir in FS_AddGameHierarchy() + // so that we still save files in the right place. *gamedirbuf = 0; for (i = 0;i < fs_numgamedirs;i++) { fs_modified = true; - FS_AddGameHierarchy (fs_gamedirs[i]); + FS_AddGameHierarchy (fs_gamedirs[i], false); // update the com_modname (used server info) dp_strlcpy (com_modname, fs_gamedirs[i], sizeof (com_modname)); if(i) diff --git a/fs.h b/fs.h index 7b7b18f9..30b4487f 100644 --- a/fs.h +++ b/fs.h @@ -38,7 +38,7 @@ typedef int64_t fs_offset_t; // ------ Variables ------ // -extern char fs_gamedir [MAX_OSPATH]; +extern char fs_gamedir [MAX_OSPATH]; ///< Files will be saved in this gamedir. extern char fs_basedir [MAX_OSPATH]; extern char fs_userdir [MAX_OSPATH]; -- 2.39.2