📄 cvar.c
字号:
}
/*
============
Cvar_FindVar
============
*/
cvar_t *Cvar_FindVar (char *name)
{
cvar_t *var;
for ( var=cvar_list ; var ; var=var->next )
{
if (!Q_strcasecmp (name, var->name))
{
return var;
}
}
return NULL;
}
/*
============
Cvar_Set
============
*/
void Cvar_Set (cvar_t *var, char *value)
{
char *newvalue;
if (var->rangecheck)
{
newvalue = var->rangecheck (var, value, false);
}
else
{
newvalue = value;
}
if (var->string)
{
if (!strcmp (newvalue, var->string))
{
return; // do nothing on same value
}
Z_Free (mainzone, var->string); // 2001-09-20 Enhanced zone handling by Maddes
}
var->string = Z_Malloc (mainzone, strlen(newvalue) + 1); // 2001-09-20 Enhanced zone handling by Maddes
strcpy (var->string, newvalue);
var->value = Q_atof (var->string);
// notify clients of change
if (var->flags & CVAR_NOTIFY)
{
if (sv.active)
{
SV_BroadcastPrintf ("\"%s\" changed to \"%s\"\n", var->name, var->string);
}
}
if (var->callback)
{
var->callback (var);
}
}
/*
============
Cvar_SetValue
expands value to a string and calls Cvar_Set
============
*/
void Cvar_SetValue (cvar_t *var, float value)
{
char valstring[32];
// 1999-09-07 weird cvar zeros fix by Maddes start
int i;
if (value == (int)value)
{
sprintf (valstring, "%i", (int)value);
}
else
{
sprintf (valstring, "%1f", value); // no leading spaces
for (i=strlen(valstring)-1 ; i>0 && valstring[i]=='0' && valstring[i-1]!='.' ; i--) // no trailing zeroes
{
valstring[i] = 0;
}
}
// 1999-09-07 weird cvar zeros fix by Maddes end
Cvar_Set (var, valstring);
}
/*
============
Cvar_Command
Handles variable inspection and changing from the console
============
*/
qboolean Cvar_Command (void)
{
cvar_t *var;
var = Cvar_FindVar (Cmd_Argv(0));
if (!var)
{
return false;
}
if (Cmd_Argc() == 1) // just display the cvar
{
Cvar_Display (var, true);
}
else
{
if (var->flags & CVAR_ROM) // check for user-protected cvar
{
Con_Printf ("Variable \"%s\" is read-only\n", var->name);
}
else
{
Cvar_Set (var, Cmd_Argv(1));
}
}
return true;
}
/*
============
Cvar_WriteVariables
Writes lines containing "set variable value" for all variables
with the archive flag set to true.
============
*/
void Cvar_WriteVariables (FILE *f, qboolean new_rc_file)
{
cvar_t *var;
for (var=cvar_list ; var ; var=var->next)
{
if (!(var->flags & CVAR_ARCHIVE)) // only cvars that should be archived
{
continue;
}
if (new_rc_file)
{
fprintf (f, "seta %s \"%s\"\n", var->name, var->string);
}
else if (var->flags & CVAR_ORIGINAL) // original id cvars
{
fprintf (f, "%s \"%s\"\n", var->name, var->string);
}
}
}
/*
============
Cvar_CompleteVariable
attempts to match a partial variable name for command line completion
returns NULL if nothing fits
============
*/
char *Cvar_CompleteVariable (char *partial)
{
cvar_t *var;
int len;
len = strlen(partial);
if (!len)
{
return NULL;
}
// check variables
for (var=cvar_list ; var ; var=var->next)
{
if (!(Q_strncasecmp (partial,var->name, len)))
{
return var->name;
}
}
return NULL;
}
/*
============
Cvar_SetRangecheck
============
*/
void Cvar_SetRangecheck (cvar_t *var, cvar_rangecheck rangecheck, float minvalue, float maxvalue)
{
var->rangecheck = rangecheck;
var->minvalue = minvalue;
var->maxvalue = maxvalue;
}
/*
============
Cvar_SetCallback
============
*/
void Cvar_SetCallback (cvar_t *var, cvar_callback callback)
{
var->callback = callback;
}
/*
============
Cvar_RangecheckBool
============
*/
char *Cvar_RangecheckBool (cvar_t *var, char *value, qboolean showinfo)
{
float newvalue;
if (showinfo)
{
Con_Printf("Range: BOOL 0/1\n");
return value;
}
newvalue = Q_atof (value);
if (newvalue)
{
return "1";
}
return "0";
}
/*
============
Cvar_RangecheckInt
============
*/
char *Cvar_RangecheckInt (cvar_t *var, char *value, qboolean showinfo)
{
float newvalue;
if (showinfo)
{
Con_Printf("Range: INT %i - %i\n", (int)var->minvalue, (int)var->maxvalue);
return value;
}
newvalue = Q_atof (value);
if ( (newvalue != (int)newvalue)
|| (newvalue < var->minvalue)
|| (newvalue > var->maxvalue) )
{
if (newvalue < var->minvalue)
{
newvalue = var->minvalue;
}
else if (newvalue > var->maxvalue)
{
newvalue = var->maxvalue;
}
sprintf (new_valstring, "%i", (int)newvalue);
return new_valstring;
}
return value;
}
/*
============
Cvar_RangecheckFloat
============
*/
char *Cvar_RangecheckFloat (cvar_t *var, char *value, qboolean showinfo)
{
float newvalue;
int i;
if (showinfo)
{
Con_Printf("Range: FLOAT %1f - %1f\n", var->minvalue, var->maxvalue);
return value;
}
newvalue = Q_atof (value);
// check limits of new value
if ( (newvalue < var->minvalue)
|| (newvalue > var->maxvalue) )
{
if (newvalue < var->minvalue)
{
newvalue = var->minvalue;
}
else
{
newvalue = var->maxvalue;
}
if (newvalue == (int)newvalue)
{
sprintf (new_valstring, "%i", (int)newvalue);
}
else
{
sprintf (new_valstring, "%1f", newvalue);
for (i=strlen(new_valstring)-1 ; i>0 && new_valstring[i]=='0' && new_valstring[i-1]!='.' ; i--)
{
new_valstring[i] = 0;
}
}
return new_valstring;
}
return value;
}
/*
============
Cvar_SetDescription
============
*/
void Cvar_SetDescription (cvar_t *var, char *description)
{
var->description = description;
}
// 2001-12-15 Enhanced console command completion by Fett/Maddes start
/*
============
Cvar_CompleteCountPossible
============
*/
int Cvar_CompleteCountPossible (char *partial)
{
cvar_t *var;
int len;
int h;
h=0;
len = strlen(partial);
if (!len)
return 0;
// Loop through the cvars and count all partial matches
for (var=cvar_list ; var ; var=var->next)
if (!Q_strncasecmp (partial,var->name, len))
h++;
return h;
}
/*
============
Cvar_CompletePrintPossible
============
*/
void Cvar_CompletePrintPossible (char *partial)
{
cvar_t *var;
int len;
int maxcnt, cnt;
int con_linewidth;
char *sout;
len = strlen(partial);
// Determine the width of the console - 1
con_linewidth = (vid.width >> 3) - 3;
maxcnt = con_linewidth / 20; // entries per line
cnt = 0;
// Loop through the cvar list and print all matches
for (var=cvar_list ; var ; var=var->next)
{
if (!Q_strncasecmp (partial,var->name, len))
{
sout = Pad_CompletePrint(var->name);
Con_Printf ("%s", sout);
cnt++;
if (cnt >= maxcnt)
{
cnt = 0;
Con_Printf ("\n");
}
}
}
if (cnt)
{
Con_Printf ("\n");
}
Con_Printf ("\n");
}
// 2001-12-15 Enhanced console command completion by Fett/Maddes end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -