/* ============ Cvar_GetLatchedVars Any variables with latched values will now be updated ============ */ void Cvar_GetLatchedVars (void) { cvar_t *var; char *old_string; for (var = cvar_vars ; var ; var = var->next) { if (!var->latched_string) continue; old_string = var->string; var->string = var->latched_string; var->latched_string = NULL; var->value = (float)atof(var->string); var->intvalue = (int)var->value; //r1: fix 0 case if (!var->intvalue && FLOAT_NE_ZERO(var->value)) var->intvalue = 1; if (var->changed) var->changed (var, old_string, var->string); Z_Free (old_string); if (!strcmp(var->name, "game")) { FS_SetGamedir (var->string); if (!Cvar_IntValue ("dedicated")) FS_ExecConfig ("autoexec.cfg"); } } }
/* ============ Cvar_Set2 ============ */ static cvar_t *Cvar_Set2 (const char *var_name, const char *value, qboolean force) { cvar_t *var; char *old_string; Q_assert (var_name != NULL); Q_assert (value != NULL); if (var_name[0] == '$' && !force) { Com_Printf ("%s is write protected.\n", LOG_GENERAL, var_name); return NULL; } var = Cvar_FindVar (var_name); if (!var) { // create it return Cvar_Get (var_name, value, 0); } if (var->flags & (CVAR_USERINFO | CVAR_SERVERINFO)) { if (!Cvar_InfoValidate (value)) { Com_Printf("invalid info cvar value\n", LOG_GENERAL); return var; } } if (!force) { #ifdef _DEBUG if (var->flags & CVAR_NOSET && !Cvar_IntValue ("developer")) #else if (var->flags & CVAR_NOSET) #endif { Com_Printf ("%s is write protected.\n", LOG_GENERAL, var_name); return var; } if (var->flags & CVAR_LATCH) { if (var->latched_string) { if (strcmp(value, var->latched_string) == 0) return var; Z_Free (var->latched_string); } else { if (strcmp(value, var->string) == 0) return var; } if (Com_ServerState()) { Com_Printf ("%s will be changed for next map.\n", LOG_GENERAL, var_name); var->latched_string = CopyString(value, TAGMALLOC_CVAR); } else { //memleak fix, thanks Maniac- Z_Free (var->string); var->string = CopyString(value, TAGMALLOC_CVAR); var->value = (float)atof (var->string); var->intvalue = (int)var->value; //r1: fix 0 case if (!var->intvalue && FLOAT_NE_ZERO(var->value)) var->intvalue = 1; if (!strcmp(var->name, "game")) { FS_SetGamedir (var->string); if (!Cvar_IntValue ("dedicated")) FS_ExecConfig ("autoexec.cfg"); } } return var; } } else { if (var->latched_string) { Z_Free (var->latched_string); var->latched_string = NULL; } } if (!strcmp(value, var->string)) return var; // not changed old_string = var->string; var->string = CopyString(value, TAGMALLOC_CVAR); var->value = (float)atof (var->string); var->intvalue = (int)var->value; //r1: fix 0 case if (!var->intvalue && FLOAT_NE_ZERO(var->value)) var->intvalue = 1; var->modified = true; if (var->changed) var->changed (var, old_string, var->string); if (var->flags & CVAR_USERINFO) userinfo_modified = true; // transmit at next oportunity Z_Free (old_string); // free the old value string return var; }
/* ================= Qcommon_Init ================= */ void Qcommon_Init (int argc, char **argv) { static const char *apVersion = APPLICATION " v" VERSION " " CPUSTRING " " __DATE__ " " BUILDSTRING; if (setjmp (abortframe) ) Sys_Error ("Error during initialization"); z_chain.next = z_chain.prev = &z_chain; // prepare enough of the subsystems to handle // cvar and command buffer management COM_InitArgv (argc, argv); Swap_Init (); Cbuf_Init (); Cmd_Init (); Cvar_Init (); Key_Init (); // we need to add the early commands twice, because // a basedir or cddir needs to be set before execing // config files, but we want other parms to override // the settings of the config files Cbuf_AddEarlyCommands (false); Cbuf_Execute(); FS_InitFilesystem (); Cbuf_AddText ("exec default.cfg\n"); Cbuf_Execute(); Cbuf_AddText ("exec aprconfig.cfg\n"); Cbuf_Execute(); FS_ExecConfig("autoexec.cfg"); Cbuf_Execute(); Cbuf_AddEarlyCommands (true); Cbuf_Execute(); Cmd_AddCommand ("echo", Cmd_Echo_f); // init commands and vars Cmd_AddCommand ("z_stats", Z_Stats_f); Cmd_AddCommand( "z_check", Z_Check ); host_speeds = Cvar_Get ("host_speeds", "0", 0); developer = Cvar_Get ("developer", "0", 0); timescale = Cvar_Get ("timescale", "1", CVAR_CHEAT); fixedtime = Cvar_Get ("fixedtime", "0", CVAR_CHEAT); logfile_active = Cvar_Get ("logfile", "0", 0); showtrace = Cvar_Get ("showtrace", "0", 0); #ifdef DEDICATED_ONLY dedicated = Cvar_Get ("dedicated", "1", CVAR_ROM); #else dedicated = Cvar_Get ("dedicated", "0", CVAR_NOSET); #endif timescale->OnChange = OnChange_Timescale; OnChange_Timescale(timescale, timescale->resetString); Cvar_Get ("version", apVersion, CVAR_SERVERINFO|CVAR_ROM); Cmd_AddMacro( "date", Com_Date_m ); Cmd_AddMacro( "time", Com_Time_m ); if (dedicated->integer) Cmd_AddCommand ("quit", Com_Quit); #ifndef NDEBUG Cmd_AddCommand( "error", Com_Error_f ); Cmd_AddCommand( "errordrop", Com_ErrorDrop_f ); Cmd_AddCommand( "freeze", Com_Freeze_f ); Cmd_AddCommand( "crash", Com_Crash_f ); #endif Sys_Init (); srand(Sys_Milliseconds()); NET_Init (); Netchan_Init (); SV_Init (); CL_Init (); ComInitialized = true; Cbuf_InsertFromDefer(); //Execute commands which was initialized after loading autoexec (ignore, highlight etc) FS_ExecConfig ("postinit.cfg"); Cbuf_Execute(); // add + commands from command line if (!Cbuf_AddLateCommands ()) { // if the user didn't give any commands, run default action if (!dedicated->integer) Cbuf_AddText ("toggleconsole\n"); else Cbuf_AddText ("dedicated_start\n"); Cbuf_Execute(); } else { // the user asked for something explicit // so drop the loading plaque SCR_EndLoadingPlaque(); } Com_Printf ("====== " APPLICATION " Initialized ======\n\n"); }