X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=fs.c;h=40ec10a61ee94461039914bbca8505b57824fcf4;hp=74329aaf779185b2c82ce6e165fa21144e357592;hb=5ac666c6a9a74413b1fd526d041db275708b19dd;hpb=09d3eabe1610af8dd0a5d8530d90adcc50d1083d diff --git a/fs.c b/fs.c index 74329aaf..40ec10a6 100644 --- a/fs.c +++ b/fs.c @@ -274,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]; @@ -1080,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); @@ -1216,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; @@ -1228,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(); @@ -1267,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"); @@ -1400,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); }