]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - fs.c
close packs when clearing search path
[xonotic/darkplaces.git] / fs.c
diff --git a/fs.c b/fs.c
index 3e6b8a821ffe83e25c3404443278024d710a4814..916bb960f98d21e4bfbe54f6a7f31aba0667cdf9 100644 (file)
--- a/fs.c
+++ b/fs.c
@@ -40,6 +40,7 @@
 #endif
 
 #include "fs.h"
+#include "wad.h"
 
 // Win32 requires us to add O_BINARY, but the other OSes don't have it
 #ifndef O_BINARY
@@ -273,7 +274,6 @@ char fs_gamedir[MAX_OSPATH];
 char fs_basedir[MAX_OSPATH];
 
 // list of active game directories (empty if not running a mod)
-#define MAX_GAMEDIRS 16
 int fs_numgamedirs = 0;
 char fs_gamedirs[MAX_GAMEDIRS][MAX_QPATH];
 
@@ -1079,12 +1079,18 @@ FS_ClearSearchPath
 */
 void FS_ClearSearchPath (void)
 {
+       // unload all packs and directory information, close all pack files
+       // (if a qfile is still reading a pack it won't be harmed because it used
+       //  dup() to get its own handle already)
        while (fs_searchpaths)
        {
                searchpath_t *search = fs_searchpaths;
                fs_searchpaths = search->next;
                if (search->pack)
                {
+                       // close the file
+                       close(search->pack->handle);
+                       // free any memory associated with it
                        if (search->pack->files)
                                Mem_Free(search->pack->files);
                        Mem_Free(search->pack);
@@ -1157,6 +1163,9 @@ void FS_Rescan (void)
                if (gamemode == GAME_NORMAL || gamemode == GAME_HIPNOTIC || gamemode == GAME_ROGUE)
                        Con_Print("Playing registered version.\n");
        }
+
+       // unload all wads so that future queries will return the new data
+       W_UnloadAll();
 }
 
 void FS_Rescan_f(void)
@@ -1212,6 +1221,9 @@ qboolean FS_ChangeGameDirs(int numgamedirs, char gamedirs[][MAX_QPATH], qboolean
                }
        }
 
+       // halt demo playback to close the file
+       CL_Disconnect();
+
        Host_SaveConfig_f();
 
        fs_numgamedirs = numgamedirs;
@@ -1224,8 +1236,8 @@ qboolean FS_ChangeGameDirs(int numgamedirs, char gamedirs[][MAX_QPATH], qboolean
        // exec the new config
        Host_LoadConfig_f();
 
-       // reinitialize the loaded sounds
-       S_Reload_f();
+       // unload all sounds so they will be reloaded from the new files as needed
+       S_UnloadAllSounds_f();
 
        // reinitialize renderer (this reloads hud/console background/etc)
        R_Modules_Restart();
@@ -1263,11 +1275,7 @@ void FS_GameDir_f (void)
        for (i = 0;i < numgamedirs;i++)
                strlcpy(gamedirs[i], Cmd_Argv(i+1), sizeof(gamedirs[i]));
 
-       // allow gamedir change during demo loop
-       if (cls.demoplayback)
-               CL_Disconnect();
-
-       if (cls.state == ca_connected || sv.active)
+       if ((cls.state == ca_connected && !cls.demoplayback) || sv.active)
        {
                // actually, changing during game would work fine, but would be stupid
                Con_Printf("Can not change gamedir while client is connected or server is running!\n");