Implement missing client interfaces.

These are:
- CL_ResetPrecacheCheck(): Resets the precacher, forces it to reevaluate
  which assets are available and what needs to be downloaded.
- FS_FileInGamedir(): Checks if a file (and only a real file, not
  somthing in a pak) is available in fs_gamedir.
- FS_AddPAKFromGamedir(): Adds a pak in fs_gamedir to the search path.
This commit is contained in:
Yamagi Burmeister 2018-11-21 16:40:27 +01:00
parent 0a94a8ee92
commit 5d9aefd4ef
5 changed files with 119 additions and 22 deletions

View file

@ -442,8 +442,7 @@ void CL_CancelHTTPDownloads (qboolean permKill)
if (permKill) if (permKill)
{ {
// TODO CURL: Haben wir was ähnliches? CL_ResetPrecacheCheck();
//CL_ResetPrecacheCheck ();
abortDownloads = HTTPDL_ABORT_HARD; abortDownloads = HTTPDL_ABORT_HARD;
} }
else else
@ -676,9 +675,7 @@ static void CL_CheckAndQueueDownload (char *path)
} }
else else
{ {
// TODO CURL: Wir haben kein FS_LocalFileExists() exists = FS_FileInGamedir(path);
//exists = FS_LocalFileExists (path);
exists = true;
} }
@ -1019,18 +1016,14 @@ static void CL_FinishHTTPDownload (void)
//a pak file is very special... //a pak file is very special...
i = strlen (tempName); i = strlen (tempName);
if ( !strcmp (tempName + i - 4, ".pak") /*|| !strcmp (tempName + i - 4, ".pk3")*/ )
{
// FS_FlushCache ();
// FS_ReloadPAKs ();
// Knightmare- just add the pk3/ pak file
// if (!strcmp (tempName + i - 4, ".pk3"))
// FS_AddPK3File (tempName);
// else
// TODO CURL: Wir haben kein FS_AddPAKFile().
//FS_AddPAKFile (tempName);
// The list of file types must be consistent with fs_packtypes in filesystem.c.
if ( !strcmp (tempName + i - 4, ".pak") || !strcmp (tempName + i - 4, ".pk2") ||
!strcmp (tempName + i - 4, ".pk3") || !strcmp (tempName + i - 4, ".zip") )
{
FS_AddPAKFromGamedir(dl->queueEntry->quakePath);
CL_ReVerifyHTTPQueue (); CL_ReVerifyHTTPQueue ();
downloading_pak = false; downloading_pak = false;
} }
} }

View file

@ -434,9 +434,15 @@ int precache_check;
int precache_spawncount; int precache_spawncount;
int precache_tex; int precache_tex;
int precache_model_skin; int precache_model_skin;
byte *precache_model; byte *precache_model;
void CL_ResetPrecacheCheck (void)
{
precache_check = CS_MODELS;
precache_model = 0;
precache_model_skin = 0;
}
/* /*
* The server will send this command right * The server will send this command right
* before allowing the client into the server * before allowing the client into the server

View file

@ -442,6 +442,7 @@ void CL_GetChallengePacket (void);
void CL_PingServers_f (void); void CL_PingServers_f (void);
void CL_Snd_Restart_f (void); void CL_Snd_Restart_f (void);
void CL_RequestNextDownload (void); void CL_RequestNextDownload (void);
void CL_ResetPrecacheCheck (void);
typedef struct typedef struct
{ {

View file

@ -1273,21 +1273,114 @@ FS_Dir_f(void)
// -------- // --------
/*
* This function returns true if a real file (e.g. not something
* in a pak, somthing in the file system itself) exists in the
* current gamedir.
*/
qboolean
FS_FileInGamedir(const char *file)
{
char path[MAX_OSPATH];
FILE *fd;
Com_sprintf(path, sizeof(path), "%s/%s", fs_gamedir, file);
if ((fd = Q_fopen(path, "rb")) != NULL)
{
fclose(fd);
return true;
}
else
{
return false;
}
}
/*
* This function loads the given .pak / .pk3 File from the
* fs_gamedir. There's no need to load from other dirs since
* fs_gamedir is the only dir written to at runtime.
*/
qboolean
FS_AddPAKFromGamedir(const char *pak)
{
char path[MAX_OSPATH];
Com_sprintf(path, sizeof(path), "%s/%s", fs_gamedir, pak);
// Check of the file really exists.
FILE *fd;
if ((fd = Q_fopen(path, "rb")) == NULL)
{
assert(fd && "FS_AddPAKfromGamedir() called with nonexisting file");;
}
else
{
fclose(fd);
}
// Depending on filetype we must load it as .pak or .pk3.
for (int i = 0; i < sizeof(fs_packtypes) / sizeof(fs_packtypes[0]); i++)
{
// Not the current filetype, next one please.
if (strncmp(pak + strlen(pak) - strlen(fs_packtypes[i].suffix), fs_packtypes[i].suffix, strlen(fs_packtypes[i].suffix)))
{
continue;
}
fsPack_t *pakfile = NULL;
switch (fs_packtypes[i].format)
{
case PAK:
pakfile = FS_LoadPAK(path);
break;
case PK3:
pakfile = FS_LoadPK3(path);
break;
}
if (pakfile == NULL)
{
// Couldn't load it.
return false;
}
else
{
// Add it.
fsSearchPath_t *search = Z_Malloc(sizeof(fsSearchPath_t));
search->pack = pakfile;
search->next = fs_searchPaths;
fs_searchPaths = search;
return true;
}
}
// Apparently we didn't load anything.
return false;
}
const char* const char*
FS_GetNextRawPath(const char* lastRawPath) FS_GetNextRawPath(const char* lastRawPath)
{ {
assert(fs_rawPath != NULL && "Don't call this if before FS_InitFilesystem()"); assert(fs_rawPath != NULL && "Don't call this if before FS_InitFilesystem()");
if(lastRawPath == NULL)
if (lastRawPath == NULL)
{ {
return fs_rawPath->path; return fs_rawPath->path;
} }
for(fsRawPath_t* rp = fs_rawPath; rp != NULL; rp = rp->next)
for (fsRawPath_t* rp = fs_rawPath; rp != NULL; rp = rp->next)
{ {
if(rp->path == lastRawPath) if (rp->path == lastRawPath)
{ {
return (rp->next != NULL) ? rp->next->path : NULL; return (rp->next != NULL) ? rp->next->path : NULL;
} }
} }
return NULL; return NULL;
} }
@ -1326,7 +1419,7 @@ FS_AddDirToSearchPath(char *dir, qboolean create) {
search->next = fs_searchPaths; search->next = fs_searchPaths;
fs_searchPaths = search; fs_searchPaths = search;
// We need to add numbered paks in te directory in // We need to add numbered paks in the directory in
// sequence and all other paks after them. Otherwise // sequence and all other paks after them. Otherwise
// the gamedata may break. // the gamedata may break.
for (i = 0; i < sizeof(fs_packtypes) / sizeof(fs_packtypes[0]); i++) { for (i = 0; i < sizeof(fs_packtypes) / sizeof(fs_packtypes[0]); i++) {
@ -1531,8 +1624,10 @@ FS_BuildGameSpecificSearchPath(char *dir)
Qcommon_ExecConfigs(false); Qcommon_ExecConfigs(false);
#ifndef DEDICATED_ONLY #ifndef DEDICATED_ONLY
// this function is called whenever the game cvar changes => the player wants to switch to another mod // This function is called whenever the game cvar changes =>
// in that case the list of music tracks needs to be loaded again (=> tracks are possibly from the new mod dir) // the player wants to switch to another mod. In that case the
// list of music tracks needs to be loaded again (=> tracks
// are possibly from the new mod dir)
OGG_InitTrackList(); OGG_InitTrackList();
#endif #endif
} }

View file

@ -676,6 +676,8 @@ void FS_BuildGameSpecificSearchPath(char *dir);
char *FS_Gamedir(void); char *FS_Gamedir(void);
char *FS_NextPath(char *prevpath); char *FS_NextPath(char *prevpath);
int FS_LoadFile(char *path, void **buffer); int FS_LoadFile(char *path, void **buffer);
qboolean FS_FileInGamedir(const char *file);
qboolean FS_AddPAKFromGamedir(const char *pak);
const char* FS_GetNextRawPath(const char* lastRawPath); const char* FS_GetNextRawPath(const char* lastRawPath);
/* a null buffer will just return the file length without loading */ /* a null buffer will just return the file length without loading */