/** * @brief After receiving a valid game state, we validate the cgame and * local zip files here and determine if we need to download them */ void Com_InitDownloads(void) { char missingfiles[1024]; // init some of the www dl data dld.bWWWDl = qfalse; dld.bWWWDlAborting = qfalse; dld.bWWWDlDisconnected = qfalse; Com_ClearStaticDownload(); if (!Com_InitUpdateDownloads()) { // whatever auto download configuration, store missing files in a cvar, use later in the ui maybe if (FS_ComparePaks(missingfiles, sizeof(missingfiles), qfalse)) { Cvar_Set("com_missingFiles", missingfiles); } else { Cvar_Set("com_missingFiles", ""); } // reset the redirect checksum tracking dld.redirectedList[0] = '\0'; #ifdef DEDICATED Com_NextDownload(); #else if (cl_allowDownload->integer && FS_ComparePaks(dld.downloadList, sizeof(dld.downloadList), qtrue)) { // this gets printed to UI, i18n Com_Printf(CL_TranslateStringBuf("Need paks: %s\n"), dld.downloadList); if (*dld.downloadList) { // if autodownloading is not enabled on the server cls.state = CA_CONNECTED; Com_NextDownload(); return; } } #endif } else { return; } Com_DownloadsComplete(); }
cvar_t *Cvar_Set2(const char *var_name, const char *value, qboolean force) { cvar_t *var; Com_DPrintf("Cvar_Set2: %s %s\n", var_name, value); if (!Cvar_ValidateString(var_name)) { Com_Printf("invalid cvar name string: %s\n", var_name); var_name = "BADNAME"; } var = Cvar_FindVar(var_name); if (!var) { if (!value) { return NULL; } // create it if (!force) { return Cvar_Get(var_name, value, CVAR_USER_CREATED); } else { return Cvar_Get(var_name, value, 0); } } if (!value) { value = var->resetString; } if (var->flags & CVAR_USERINFO) { char *cleaned = Cvar_ClearForeignCharacters(value); if (strcmp(value, cleaned)) { #ifdef DEDICATED Com_Printf(FOREIGN_MSG); #else Com_Printf("%s", CL_TranslateStringBuf(FOREIGN_MSG)); #endif Com_Printf("Using %s instead of %s\n", cleaned, value); return Cvar_Set2(var_name, cleaned, force); } } if (!strcmp(value, var->string)) { if ((var->flags & CVAR_LATCH) && var->latchedString) { if (!strcmp(value, var->latchedString)) { return var; } } else { return var; } } // note what types of cvars have been modified (userinfo, archive, serverinfo, systeminfo) cvar_modifiedFlags |= var->flags; if (!force) { // don't set unsafe variables when com_crashed is set if ((var->flags & CVAR_UNSAFE) && com_crashed != NULL && com_crashed->integer) { Com_Printf("%s is unsafe. Check com_crashed.\n", var_name); return var; } if (var->flags & CVAR_ROM) { Com_Printf("%s is read only.\n", var_name); return var; } if (var->flags & CVAR_INIT) { Com_Printf("%s is write protected.\n", var_name); return var; } if ((var->flags & CVAR_CHEAT) && !cvar_cheats->integer) { Com_Printf("%s is cheat protected.\n", var_name); return var; } if (var->flags & CVAR_LATCH) { if (var->latchedString) { if (strcmp(value, var->latchedString) == 0) { return var; } Z_Free(var->latchedString); } else { if (strcmp(value, var->string) == 0) { return var; } } Com_Printf("%s will be changed upon restarting.\n", var_name); var->latchedString = CopyString(value); var->modified = qtrue; var->modificationCount++; return var; } } else { if (var->latchedString) { Z_Free(var->latchedString); var->latchedString = NULL; } } if (!strcmp(value, var->string)) { return var; // not changed } var->modified = qtrue; var->modificationCount++; Z_Free(var->string); // free the old value string var->string = CopyString(value); var->value = atof(var->string); var->integer = atoi(var->string); return var; }
/** * @brief Key_KeynumToStringBuf * @param[in] keynum * @param[out] buf * @param[in] buflen */ void Key_KeynumToStringBuf(int keynum, char *buf, size_t buflen) { Q_strncpyz(buf, CL_TranslateStringBuf(Key_KeynumToString(keynum)), buflen); }