return var;
}
-cvar_t *Cvar_FindVarLink (const char *var_name, cvar_t **parent, cvar_t ***link, cvar_t **prev_alpha)
+static cvar_t *Cvar_FindVarLink (const char *var_name, cvar_t **parent, cvar_t ***link, cvar_t **prev_alpha)
{
int hashindex;
cvar_t *var;
Con_Printf ("^3%s^7 is \"%s\" [\"%s\"] %s\n", cvar->name, cvar->string, cvar->defstring, cvar->description);
}
+// check if a cvar is held by some progs
+static qboolean Cvar_IsAutoCvar(cvar_t *var)
+{
+ int i;
+ prvm_prog_t *prog;
+ for (i = 0;i < PRVM_PROG_MAX;i++)
+ {
+ prog = &prvm_prog_list[i];
+ if (prog->loaded && var->globaldefindex[i] >= 0)
+ return true;
+ }
+ return false;
+}
+
// we assume that prog is already set to the target progs
static void Cvar_UpdateAutoCvar(cvar_t *var)
{
int i;
- if(!prog)
- Host_Error("Cvar_UpdateAutoCvar: no prog set");
- i = PRVM_GetProgNr();
- if(var->globaldefindex_progid[i] == prog->id)
+ int j;
+ const char *s;
+ vec3_t v;
+ prvm_prog_t *prog;
+ for (i = 0;i < PRVM_PROG_MAX;i++)
{
- // MUST BE SYNCED WITH prvm_edict.c PRVM_LoadProgs
- int j;
- const char *s;
- vec3_t v;
- switch(prog->globaldefs[var->globaldefindex[i]].type & ~DEF_SAVEGLOBAL)
+ prog = &prvm_prog_list[i];
+ if (prog->loaded && var->globaldefindex[i] >= 0)
{
+ // MUST BE SYNCED WITH prvm_edict.c PRVM_LoadProgs
+ switch(prog->globaldefs[var->globaldefindex[i]].type & ~DEF_SAVEGLOBAL)
+ {
case ev_float:
PRVM_GLOBALFIELDFLOAT(prog->globaldefs[var->globaldefindex[i]].ofs) = var->value;
break;
VectorCopy(v, PRVM_GLOBALFIELDVECTOR(prog->globaldefs[var->globaldefindex[i]].ofs));
break;
case ev_string:
- PRVM_ChangeEngineString(var->globaldefindex_stringno[i], var->string);
+ PRVM_ChangeEngineString(prog, var->globaldefindex_stringno[i], var->string);
PRVM_GLOBALFIELDSTRING(prog->globaldefs[var->globaldefindex[i]].ofs) = var->globaldefindex_stringno[i];
break;
+ }
}
}
}
============
*/
extern cvar_t sv_disablenotify;
-void Cvar_SetQuick_Internal (cvar_t *var, const char *value)
+static void Cvar_SetQuick_Internal (cvar_t *var, const char *value)
{
qboolean changed;
size_t valuelen;
- prvm_prog_t *tmpprog;
- int i;
+ char vabuf[1024];
changed = strcmp(var->string, value) != 0;
// LordHavoc: don't reallocate when there is no change
if (!strcmp(var->name, "_cl_color"))
{
int top = (var->integer >> 4) & 15, bottom = var->integer & 15;
- CL_SetInfo("topcolor", va("%i", top), true, false, false, false);
- CL_SetInfo("bottomcolor", va("%i", bottom), true, false, false, false);
+ CL_SetInfo("topcolor", va(vabuf, sizeof(vabuf), "%i", top), true, false, false, false);
+ CL_SetInfo("bottomcolor", va(vabuf, sizeof(vabuf), "%i", bottom), true, false, false, false);
if (cls.protocol != PROTOCOL_QUAKEWORLD && cls.netcon)
{
MSG_WriteByte(&cls.netcon->message, clc_stringcmd);
- MSG_WriteString(&cls.netcon->message, va("color %i %i", top, bottom));
+ MSG_WriteString(&cls.netcon->message, va(vabuf, sizeof(vabuf), "color %i %i", top, bottom));
}
}
else if (!strcmp(var->name, "_cl_rate"))
- CL_SetInfo("rate", va("%i", var->integer), true, false, false, false);
+ CL_SetInfo("rate", va(vabuf, sizeof(vabuf), "%i", var->integer), true, false, false, false);
+ else if (!strcmp(var->name, "_cl_rate_burstsize"))
+ CL_SetInfo("rate_burstsize", va(vabuf, sizeof(vabuf), "%i", var->integer), true, false, false, false);
else if (!strcmp(var->name, "_cl_playerskin"))
CL_SetInfo("playerskin", var->string, true, false, false, false);
else if (!strcmp(var->name, "_cl_playermodel"))
if(var->integer <= 0)
Cvar_Set("rcon_password", "");
}
+#ifdef CONFIG_MENU
else if (!strcmp(var->name, "net_slist_favorites"))
NetConn_UpdateFavorites();
+#endif
}
- tmpprog = prog;
- for(i = 0; i < PRVM_MAXPROGS; ++i)
- {
- if(PRVM_ProgLoaded(i))
- {
- PRVM_SetProg(i);
- Cvar_UpdateAutoCvar(var);
- }
- }
- prog = tmpprog;
+ Cvar_UpdateAutoCvar(var);
}
void Cvar_SetQuick (cvar_t *var, const char *value)
cvar_t *current, *next, *cvar;
char *oldstr;
size_t alloclen;
+ int i;
if (developer_extra.integer)
Con_DPrintf("Cvar_RegisterVariable({\"%s\", \"%s\", %i});\n", variable->name, variable->string, variable->flags);
variable->defstring = cvar->defstring;
variable->value = atof (variable->string);
variable->integer = (int) variable->value;
+ // Preserve autocvar status.
+ memcpy(variable->globaldefindex, cvar->globaldefindex, sizeof(variable->globaldefindex));
+ memcpy(variable->globaldefindex_stringno, cvar->globaldefindex_stringno, sizeof(variable->globaldefindex_stringno));
// replace cvar with this one...
variable->next = cvar->next;
if (cvar_vars == cvar)
variable->value = atof (variable->string);
variable->integer = (int) variable->value;
+ // Mark it as not an autocvar.
+ for (i = 0;i < PRVM_PROG_MAX;i++)
+ variable->globaldefindex[i] = -1;
+
// link the variable in
// alphanumerical order
for( current = NULL, next = cvar_vars ; next && strcmp( next->name, variable->name ) < 0 ; current = next, next = next->next )
{
int hashindex;
cvar_t *current, *next, *cvar;
+ int i;
if (developer_extra.integer)
Con_DPrintf("Cvar_Get(\"%s\", \"%s\", %i);\n", name, value, flags);
else
cvar->description = cvar_dummy_description; // actually checked by VM_cvar_type
+ // Mark it as not an autocvar.
+ for (i = 0;i < PRVM_PROG_MAX;i++)
+ cvar->globaldefindex[i] = -1;
+
// link the variable in
// alphanumerical order
for( current = NULL, next = cvar_vars ; next && strcmp( next->name, cvar->name ) < 0 ; current = next, next = next->next )
if (!(c->flags & CVAR_ALLOCATED))
{
Con_DPrintf("Cvar_RestoreInitState: Unable to destroy cvar \"%s\", it was registered after init!\n", c->name);
+ // In this case, at least reset it to the default.
+ if((c->flags & CVAR_NORESETTODEFAULTS) == 0)
+ Cvar_SetQuick(c, c->defstring);
+ cp = &c->next;
+ continue;
+ }
+ if (Cvar_IsAutoCvar(c))
+ {
+ Con_DPrintf("Cvar_RestoreInitState: Unable to destroy cvar \"%s\", it is an autocvar used by running progs!\n", c->name);
+ // In this case, at least reset it to the default.
+ if((c->flags & CVAR_NORESETTODEFAULTS) == 0)
+ Cvar_SetQuick(c, c->defstring);
+ cp = &c->next;
continue;
}
// remove this cvar, it did not exist at init
{
partial = Cmd_Argv (1);
len = strlen(partial);
+ ispattern = (strchr(partial, '*') || strchr(partial, '?'));
}
else
{
partial = NULL;
len = 0;
+ ispattern = false;
}
- ispattern = partial && (strchr(partial, '*') || strchr(partial, '?'));
-
count = 0;
for (cvar = cvar_vars; cvar; cvar = cvar->next)
{