X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=fs.c;h=40ec10a61ee94461039914bbca8505b57824fcf4;hb=96d540597b34ca1510f92c706b135780cc16c251;hp=3e6b8a821ffe83e25c3404443278024d710a4814;hpb=791cbc1d5328a739883241938ed8c91ec04926bb;p=xonotic%2Fdarkplaces.git diff --git a/fs.c b/fs.c index 3e6b8a82..40ec10a6 100644 --- 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"); @@ -1396,6 +1404,10 @@ FS_Shutdown */ void FS_Shutdown (void) { + // close all pack files and such + // (hopefully there aren't any other open files, but they'll be cleaned up + // by the OS anyway) + FS_ClearSearchPath(); Mem_FreePool (&fs_mempool); }