/* ============ Cvar_Get If the variable already exists, the value will not be set The flags will be or'ed in if the variable exists. ============ */ cvar_t * EXPORT Cvar_Get (const char *var_name, const char *var_value, int flags) { cvar_t *var; Q_assert (var_name != NULL); if (flags & (CVAR_USERINFO | CVAR_SERVERINFO)) { if (!Cvar_InfoValidate (var_name)) { Com_Printf("invalid info cvar name\n", LOG_GENERAL); return NULL; } } var = Cvar_FindVar (var_name); if (var) { var->flags |= flags; return var; } if (!var_value) return NULL; if (flags & (CVAR_USERINFO | CVAR_SERVERINFO)) { if (!Cvar_InfoValidate (var_value)) { Com_Printf("invalid info cvar value\n", LOG_GENERAL); return NULL; } } return Cvar_Add (var_name, var_value, flags); }
/** * @brief */ static cvar_t *Cvar_Set_(const char *name, const char *value, int32_t flags, _Bool force) { cvar_t *var = Cvar_Get(name); if (!var) { // create it return Cvar_Add(name, value, flags, NULL); } if (var->flags & (CVAR_USER_INFO | CVAR_SERVER_INFO)) { if (!Cvar_InfoValidate(value)) { Com_Print("Invalid info value for %s: %s\n", var->name, value); return var; } } // if not forced, honor flags-based logic if (!force) { // command line variables retain their value through initialization if (var->flags & CVAR_CLI) { if (!Com_WasInit(QUETOO_CLIENT) && !Com_WasInit(QUETOO_SERVER)) { Com_Debug(DEBUG_CONSOLE, "%s: retaining value \"%s\" from command line.\n", name, var->string); return var; } } // developer variables can not be modified when in multiplayer mode if (var->flags & CVAR_DEVELOPER) { if (!Com_WasInit(QUETOO_SERVER)) { Com_Print("%s is only available offline.\n", name); return var; } } // write-protected variables can never be modified if (var->flags & CVAR_NO_SET) { Com_Print("%s is write protected.\n", name); return var; } // while latched variables can only be changed on map load if (var->flags & CVAR_LATCH) { if (var->latched_string) { if (!g_strcmp0(value, var->latched_string)) { return var; } Mem_Free(var->latched_string); } else { if (!g_strcmp0(value, var->string)) { return var; } } if (Com_WasInit(QUETOO_SERVER)) { Com_Print("%s will be changed for next game.\n", name); var->latched_string = Mem_Link(Mem_TagCopyString(value, MEM_TAG_CVAR), var); } else { if (var->string) { Mem_Free(var->string); } var->string = Mem_Link(Mem_TagCopyString(value, MEM_TAG_CVAR), var); var->value = strtof(var->string, NULL); var->integer = (int32_t) strtol(var->string, NULL, 0); var->modified = true; } return var; } } else { if (var->latched_string) { Mem_Free(var->latched_string); var->latched_string = NULL; } } if (!g_strcmp0(var->string, value)) { return var; // not changed } if (!force) { if (var->flags & CVAR_R_MASK) { Com_Print("%s will be changed on ^3r_restart^7.\n", name); } if (var->flags & CVAR_S_MASK) { Com_Print("%s will be changed on ^3s_restart^7.\n", name); } } if (var->flags & CVAR_USER_INFO) { cvar_user_info_modified = true; // transmit at next opportunity } Mem_Free(var->string); var->string = Mem_Link(Mem_CopyString(value), var); var->value = strtof(var->string, NULL); var->integer = (int32_t) strtol(var->string, NULL, 0); var->modified = true; return var; }
/** * @brief */ static void Init(void) { SDL_Init(SDL_INIT_TIMER); Mem_Init(); Cmd_Init(); Cvar_Init(); verbose = Cvar_Add("verbose", "0", 0, "Print verbose debugging information"); dedicated = Cvar_Add("dedicated", "0", CVAR_NO_SET, "Run a dedicated server"); if (strstr(Sys_ExecutablePath(), "-dedicated")) { Cvar_ForceSet("dedicated", "1"); } if (dedicated->value) { Cvar_ForceSet("threads", "0"); } game = Cvar_Add("game", DEFAULT_GAME, CVAR_LATCH | CVAR_SERVER_INFO, "The game module name"); game->modified = g_strcmp0(game->string, DEFAULT_GAME); threads = Cvar_Add("threads", "0", CVAR_ARCHIVE, "Specifies the number of threads to create"); threads->modified = false; time_demo = Cvar_Add("time_demo", "0", CVAR_LO_ONLY, "Benchmark and stress test"); time_scale = Cvar_Add("time_scale", "1.0", CVAR_LO_ONLY, "Controls time lapse"); const char *s = va("Quetoo %s %s %s", VERSION, __DATE__, BUILD_HOST); Cvar_Add("version", s, CVAR_SERVER_INFO | CVAR_NO_SET, NULL); quetoo.Debug = Debug; quetoo.Error = Error; quetoo.Print = Print; quetoo.Verbose = Verbose; quetoo.Warn = Warn; Fs_Init(true); Thread_Init(threads->integer); Con_Init(); Cmd_Add("mem_stats", MemStats_f, CMD_SYSTEM, "Print memory stats"); Cmd_Add("debug", Debug_f, CMD_SYSTEM, "Control debugging output"); Cmd_Add("quit", Quit_f, CMD_SYSTEM, "Quit Quetoo"); Netchan_Init(); Sv_Init(); Cl_Init(); Com_Print("Quetoo %s %s %s initialized\n", VERSION, __DATE__, BUILD_HOST); // reset debug value since Cbuf may change it from Com's "all" init Com_SetDebug("0"); // execute any +commands specified on the command line Cbuf_InsertFromDefer(); Cbuf_Execute(); // dedicated server, nothing specified, use Edge if (dedicated->value && !Com_WasInit(QUETOO_SERVER)) { Cbuf_AddText("map edge\n"); Cbuf_Execute(); } }