]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cvar.c
Use double for cvar values. Fixes a number of bugs caused by atof precision loss
[xonotic/darkplaces.git] / cvar.c
diff --git a/cvar.c b/cvar.c
index fcd5062b3f408dc4238e60d779336fd5e1552e9f..aff7672ac3894629770ec98fabd0d6850ff53149 100644 (file)
--- a/cvar.c
+++ b/cvar.c
@@ -111,7 +111,7 @@ match:
 Cvar_VariableValue
 ============
 */
-float Cvar_VariableValueOr(cvar_state_t *cvars, const char *var_name, float def, int neededflags)
+float Cvar_VariableValueOr(cvar_state_t *cvars, const char *var_name, double def, int neededflags)
 {
        cvar_t *var;
 
@@ -373,10 +373,8 @@ Cvar_Set
 extern cvar_t sv_disablenotify;
 static void Cvar_SetQuick_Internal (cvar_t *var, const char *value)
 {
-       cvar_state_t *cvars = &cvars_all;
        qboolean changed;
        size_t valuelen;
-       char vabuf[1024];
        char new_value[MAX_INPUTLINE];
 
        changed = strcmp(var->string, value) != 0;
@@ -402,7 +400,7 @@ static void Cvar_SetQuick_Internal (cvar_t *var, const char *value)
        var->value = atof (var->string);
        var->integer = (int) var->value;
        if ((var->flags & CVAR_NOTIFY) && changed && sv.active && !sv_disablenotify.integer)
-               SV_BroadcastPrintf("\001^3Server cvar \"%s\" changed to \"%s\"\n", var->name, var->string);
+               SV_BroadcastPrintf("\003^3Server cvar \"%s\" changed to \"%s\"\n", var->name, var->string);
 #if 0
        // TODO: add infostring support to the server?
        if ((var->flags & CVAR_SERVERINFO) && changed && sv.active)
@@ -416,50 +414,8 @@ static void Cvar_SetQuick_Internal (cvar_t *var, const char *value)
                }
        }
 #endif
-       if ((var->flags & CVAR_USERINFO) && cls.state != ca_dedicated)
+       if (var->flags & CVAR_USERINFO)
                CL_SetInfo(var->name, var->string, true, false, false, false);
-       else if ((var->flags & CVAR_NQUSERINFOHACK) && cls.state != ca_dedicated)
-       {
-               // update the cls.userinfo to have proper values for the
-               // silly nq config variables.
-               //
-               // this is done when these variables are changed rather than at
-               // connect time because if the user or code checks the userinfo and it
-               // holds weird values it may cause confusion...
-               if (!strcmp(var->name, "_cl_color"))
-               {
-                       int top = (var->integer >> 4) & 15, bottom = var->integer & 15;
-                       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(vabuf, sizeof(vabuf), "color %i %i", top, bottom));
-                       }
-               }
-               else if (!strcmp(var->name, "_cl_rate"))
-                       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"))
-                       CL_SetInfo("playermodel", var->string, true, false, false, false);
-               else if (!strcmp(var->name, "_cl_name"))
-                       CL_SetInfo("name", var->string, true, false, false, false);
-               else if (!strcmp(var->name, "rcon_secure"))
-               {
-                       // whenever rcon_secure is changed to 0, clear rcon_password for
-                       // security reasons (prevents a send-rcon-password-as-plaintext
-                       // attack based on NQ protocol session takeover and svc_stufftext)
-                       if(var->integer <= 0)
-                               Cvar_Set(cvars, "rcon_password", "");
-               }
-#ifdef CONFIG_MENU
-               else if (!strcmp(var->name, "net_slist_favorites"))
-                       NetConn_UpdateFavorites();
-#endif
-       }
 
        Cvar_UpdateAutoCvar(var);
 }
@@ -490,27 +446,35 @@ void Cvar_Set(cvar_state_t *cvars, const char *var_name, const char *value)
        Cvar_SetQuick(var, value);
 }
 
+void Cvar_Set_NoCallback(cvar_t *var, const char *value)
+{
+       void (*callback_save)(char *) = var->callback;
+       var->callback = NULL;
+       Cvar_SetQuick_Internal(var, value);
+       var->callback = callback_save;
+}
+
 /*
 ============
 Cvar_SetValue
 ============
 */
-void Cvar_SetValueQuick(cvar_t *var, float value)
+void Cvar_SetValueQuick(cvar_t *var, double value)
 {
        char val[MAX_INPUTLINE];
 
-       if ((float)((int)value) == value)
+       if ((double)((int)value) == value)
                dpsnprintf(val, sizeof(val), "%i", (int)value);
        else
                dpsnprintf(val, sizeof(val), "%f", value);
        Cvar_SetQuick(var, val);
 }
 
-void Cvar_SetValue(cvar_state_t *cvars, const char *var_name, float value)
+void Cvar_SetValue(cvar_state_t *cvars, const char *var_name, double value)
 {
        char val[MAX_INPUTLINE];
 
-       if ((float)((int)value) == value)
+       if ((double)((int)value) == value)
                dpsnprintf(val, sizeof(val), "%i", (int)value);
        else
                dpsnprintf(val, sizeof(val), "%f", value);