X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=fs.c;h=74329aaf779185b2c82ce6e165fa21144e357592;hb=9e883a148a3370e139b78a19d2ee645fba8db8d1;hp=0c6901b3823836002769d861e6bab239c75a3bc2;hpb=bff3b37695781143ae115f609ae69603ddd73a7e;p=xonotic%2Fdarkplaces.git diff --git a/fs.c b/fs.c index 0c6901b3..74329aaf 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 @@ -278,6 +279,7 @@ int fs_numgamedirs = 0; char fs_gamedirs[MAX_GAMEDIRS][MAX_QPATH]; cvar_t scr_screenshot_name = {0, "scr_screenshot_name","dp", "prefix name for saved screenshots (changes based on -game commandline, as well as which game mode is running)"}; +cvar_t fs_empty_files_in_pack_mark_deletions = {0, "fs_empty_files_in_pack_mark_deletions", "0", "if enabled, empty files in a pak/pk3 count as not existing but cancel the search in further packs, effectively allowing patch pak/pk3 files to 'delete' files"}; /* @@ -1156,6 +1158,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) @@ -1379,6 +1384,7 @@ void FS_Init (void) void FS_Init_Commands(void) { Cvar_RegisterVariable (&scr_screenshot_name); + Cvar_RegisterVariable (&fs_empty_files_in_pack_mark_deletions); Cmd_AddCommand ("gamedir", FS_GameDir_f, "changes active gamedir list (can take multiple arguments), not including base directory (example usage: gamedir ctf)"); Cmd_AddCommand ("fs_rescan", FS_Rescan_f, "rescans filesystem for new pack archives and any other changes"); @@ -1672,6 +1678,17 @@ static searchpath_t *FS_FindFile (const char *name, int* index, qboolean quiet) // Found it if (!diff) { + if (fs_empty_files_in_pack_mark_deletions.integer && pak->files[middle].realsize == 0) + { + // yes, but the first one is empty so we treat it as not being there + if (!quiet && developer.integer >= 10) + Con_Printf("FS_FindFile: %s is marked as deleted\n", name); + + if (index != NULL) + *index = -1; + return NULL; + } + if (!quiet && developer.integer >= 10) Con_Printf("FS_FindFile: %s in %s\n", pak->files[middle].name, pak->filename);