]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'terencehill/automatic_sendcvar' into 'master'
authorMario <mario.mario@y7mail.com>
Sat, 24 Aug 2019 17:09:17 +0000 (17:09 +0000)
committerMario <mario.mario@y7mail.com>
Sat, 24 Aug 2019 17:09:17 +0000 (17:09 +0000)
Automatic sendcvar

Closes #2270

See merge request xonotic/xonotic-data.pk3dir!694

28 files changed:
commands.cfg
qcsrc/client/commands/cl_cmd.qc
qcsrc/client/defs.qh
qcsrc/client/main.qc
qcsrc/client/view.qc
qcsrc/common/effects/qc/casings.qc
qcsrc/common/mutators/mutator/buffs/cl_buffs.qh
qcsrc/common/mutators/mutator/dodging/_mod.inc
qcsrc/common/mutators/mutator/dodging/_mod.qh
qcsrc/common/mutators/mutator/dodging/cl_dodging.qc [new file with mode: 0644]
qcsrc/common/mutators/mutator/dodging/cl_dodging.qh [new file with mode: 0644]
qcsrc/common/mutators/mutator/dodging/sv_dodging.qc
qcsrc/common/mutators/mutator/multijump/multijump.qc
qcsrc/common/mutators/mutator/nades/nades.qc
qcsrc/common/mutators/mutator/nades/nades.qh
qcsrc/common/mutators/mutator/spawn_near_teammate/_mod.inc
qcsrc/common/mutators/mutator/spawn_near_teammate/_mod.qh
qcsrc/common/mutators/mutator/spawn_near_teammate/cl_spawn_near_teammate.qc [new file with mode: 0644]
qcsrc/common/mutators/mutator/spawn_near_teammate/cl_spawn_near_teammate.qh [new file with mode: 0644]
qcsrc/common/notifications/all.qh
qcsrc/common/state.qc
qcsrc/common/stats.qh
qcsrc/common/weapons/all.qh
qcsrc/lib/replicate.qh
qcsrc/server/command/cmd.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/mutators/events.qh
xonotic-client.cfg

index 798104a68c065d0d5dfd1c9265c02886f06c6237..d5da481b9794517a219a0879092a01bf01c64c0a 100644 (file)
@@ -134,7 +134,7 @@ alias debugmodel           "qc_cmd_cl     debugmodel           ${* ?}" // Spawn
 alias hud                  "qc_cmd_cl     hud                  ${* ?}" // Commands regarding/controlling the HUD system
 alias localprint           "qc_cmd_cl     localprint           ${* ?}" // Create your own centerprint sent to yourself
 //alias mv_download        "qc_cmd_cl     mv_download          ${* ?}" // Retrieve mapshot picture from the server
-alias sendcvar             "qc_cmd_cl     sendcvar             ${* ?}" // Send a cvar to the server (like weaponpriority)
+alias sendcvar             "qc_cmd_cl     sendcvar             ${* ?}" // Send a cvar to the server (like cl_weaponpriority)
 alias weapon_find          "qc_cmd_cl     weapon_find          ${* ?}" // Show spawn locations of a weapon
 
 alias exit                 "quit"
@@ -146,9 +146,6 @@ alias radar "qc_cmd_cl hud radar ${* ?}"
 alias scoreboard_columns_help "qc_cmd_cl hud scoreboard_columns_help"
 alias scoreboard_columns_set "qc_cmd_cl hud scoreboard_columns_set ${* ?}"
 
-// changes a cvar and reports it to the server (for the client to notify the server about changes)
-alias setreport "set \"$1\" \"$2\" ; sendcvar \"$1\""
-
 
 // ========================================================
 //  cmd (client-to-server command) - server/command/cmd.qc
index 56709642026df191ce3c5c3eea00cb300d838ce5..f0c1e789ab9407037d383e651e6cfe27f0be6922 100644 (file)
@@ -434,7 +434,7 @@ void LocalCommand_sendcvar(int request, int argc)
                case CMD_REQUEST_USAGE:
                {
                        LOG_INFO("Usage:^3 cl_cmd sendcvar <cvar>");
-                       LOG_INFO("  Where 'cvar' is the cvar plus arguments to send to the server.");
+                       LOG_INFO("  Where 'cvar' is the cvar to send to the server.");
                        return;
                }
        }
@@ -477,7 +477,7 @@ CLIENT_COMMAND(handlevote, "System to handle selecting a vote or option") { Loca
 CLIENT_COMMAND(hud, "Commands regarding/controlling the HUD system") { LocalCommand_hud(request, arguments); }
 CLIENT_COMMAND(localprint, "Create your own centerprint sent to yourself") { LocalCommand_localprint(request, arguments); }
 CLIENT_COMMAND(mv_download, "Retrieve mapshot picture from the server") { LocalCommand_mv_download(request, arguments); }
-CLIENT_COMMAND(sendcvar, "Send a cvar to the server (like weaponpriority)") { LocalCommand_sendcvar(request, arguments); }
+CLIENT_COMMAND(sendcvar, "Send a cvar to the server (like cl_weaponpriority)") { LocalCommand_sendcvar(request, arguments); }
 
 void LocalCommand_macro_help()
 {
index 1fa2fd42be0cff70f91729c08153f3858467972b..7720f071b912a57c8e4cc2f0088bc689271f5b17 100644 (file)
@@ -109,6 +109,69 @@ int w_deathtype;
 float w_issilent, w_random;
 vector w_org, w_backoff;
 
+float autoswitch;
+bool cvar_cl_allow_uid2name;
+float cvar_cl_autoscreenshot;
+float cvar_cl_autotaunt;
+float cvar_cl_clippedspectating;
+float cvar_cl_handicap;
+float cvar_cl_jetpack_jump;
+float cvar_cl_movement_track_canjump;
+float cvar_cl_noantilag;
+string cvar_cl_physics;
+float cvar_cl_voice_directional;
+float cvar_cl_voice_directional_taunt_attenuation;
+float cvar_cl_weaponimpulsemode;
+string cvar_g_xonoticversion;
+float cvar_cl_cts_noautoswitch;
+bool cvar_cl_weapon_switch_reload;
+bool cvar_cl_weapon_switch_fallback_to_impulse;
+
+REPLICATE(autoswitch, bool, "cl_autoswitch");
+REPLICATE(cvar_cl_allow_uid2name, bool, "cl_allow_uid2name");
+REPLICATE(cvar_cl_autoscreenshot, int, "cl_autoscreenshot");
+REPLICATE(cvar_cl_autotaunt, float, "cl_autotaunt");
+REPLICATE(cvar_cl_clippedspectating, bool, "cl_clippedspectating");
+REPLICATE(cvar_cl_handicap, float, "cl_handicap");
+REPLICATE(cvar_cl_jetpack_jump, bool, "cl_jetpack_jump");
+REPLICATE(cvar_cl_movement_track_canjump, bool, "cl_movement_track_canjump");
+REPLICATE(cvar_cl_noantilag, bool, "cl_noantilag");
+REPLICATE(cvar_cl_physics, string, "cl_physics");
+REPLICATE(cvar_cl_voice_directional, int, "cl_voice_directional");
+REPLICATE(cvar_cl_voice_directional_taunt_attenuation, float, "cl_voice_directional_taunt_attenuation");
+REPLICATE(cvar_cl_weaponimpulsemode, int, "cl_weaponimpulsemode");
+REPLICATE(cvar_g_xonoticversion, string, "g_xonoticversion");
+REPLICATE(cvar_cl_cts_noautoswitch, bool, "cl_cts_noautoswitch");
+REPLICATE(cvar_cl_weapon_switch_reload, bool, "cl_weapon_switch_reload");
+REPLICATE(cvar_cl_weapon_switch_fallback_to_impulse, bool, "cl_weapon_switch_fallback_to_impulse");
+/*
+// this is also a STAT
+// pointless sending this cvars since server can't change gun alignment during the match
+int cvar_cl_gunalign;
+REPLICATE(cvar_cl_gunalign, int, "cl_gunalign");
+
+// cvar cl_newusekeysupported doesn't exist
+float cvar_cl_newusekeysupported;
+REPLICATE(cvar_cl_newusekeysupported, bool, "cl_newusekeysupported");
+*/
+string cvar_cl_allow_uidtracking;
+REPLICATE(cvar_cl_allow_uidtracking, string, "cl_allow_uidtracking");
+
+string cvar_cl_weaponpriority;
+REPLICATE(cvar_cl_weaponpriority, string, "cl_weaponpriority");
+
+string cvar_cl_weaponpriorities[10];
+REPLICATE(cvar_cl_weaponpriorities[0], string, "cl_weaponpriority0");
+REPLICATE(cvar_cl_weaponpriorities[1], string, "cl_weaponpriority1");
+REPLICATE(cvar_cl_weaponpriorities[2], string, "cl_weaponpriority2");
+REPLICATE(cvar_cl_weaponpriorities[3], string, "cl_weaponpriority3");
+REPLICATE(cvar_cl_weaponpriorities[4], string, "cl_weaponpriority4");
+REPLICATE(cvar_cl_weaponpriorities[5], string, "cl_weaponpriority5");
+REPLICATE(cvar_cl_weaponpriorities[6], string, "cl_weaponpriority6");
+REPLICATE(cvar_cl_weaponpriorities[7], string, "cl_weaponpriority7");
+REPLICATE(cvar_cl_weaponpriorities[8], string, "cl_weaponpriority8");
+REPLICATE(cvar_cl_weaponpriorities[9], string, "cl_weaponpriority9");
+
 float bgmtime;
 
 string weaponorder_byimpulse;
index 04cafebbd3a341786d40a29acc313c9b321620c0..c8274fe62641070f01f4448acce41d07080b0e9a 100644 (file)
@@ -230,6 +230,8 @@ void Shutdown()
 
        deactivate_minigame();
        HUD_MinigameMenu_Close(NULL, NULL, NULL);
+
+       ReplicateVars(true); // destroy
 }
 
 .float has_team;
index 7c3c1068b1dff2a6a0d096405cdc7d531c307552..7385b4c3a9ae82be08d7d96806636daa470392c5 100644 (file)
@@ -1562,6 +1562,10 @@ void CSQC_UpdateView(entity this, float w, float h)
 
        lasthud = hud;
 
+       ReplicateVars(false);
+       if (ReplicateVars_NOT_SENDING())
+               ReplicateVars_DELAY(0.8 + random() * 0.4); // no need to check cvars every frame
+
        HUD_Scale_Disable();
 
        if(autocvar__hud_showbinds_reload) // menu can set this one
index 304552961c1a4a5ce1af56b8ee11f77de1ad7cf4..589e343c8df91ae795a94c1375903c429ae17296 100644 (file)
@@ -9,11 +9,14 @@
 
 REGISTER_NET_TEMP(casings)
 
-#ifdef SVQC
-
+#if defined(SVQC)
 .bool cvar_cl_casings;
+#elif defined(CSQC)
+bool cvar_cl_casings;
+#endif
 REPLICATE(cvar_cl_casings, bool, "cl_casings");
 
+#ifdef SVQC
 void SpawnCasing(vector vel, float randomvel, vector ang, vector avel, float randomavel, int casingtype, entity casingowner, .entity weaponentity)
 {
        if (!(CS(casingowner).cvar_cl_casings))
index c93902291da2383ca99ee6cabda85463009ac3b3..c9dbe5add1674f004a82bff50a180f9649172c1d 100644 (file)
@@ -1,3 +1,6 @@
 #pragma once
 
 #include "buffs.qh"
+
+float cvar_cl_buffs_autoreplace;
+REPLICATE(cvar_cl_buffs_autoreplace, bool, "cl_buffs_autoreplace");
index 80a7828a703f409a707d36aac3b0e59fc8f02831..99b822d42aa134bd0a029c8273ea1a6b6b0fb379 100644 (file)
@@ -1,4 +1,7 @@
 // generated file; do not modify
+#ifdef CSQC
+    #include <common/mutators/mutator/dodging/cl_dodging.qc>
+#endif
 #ifdef SVQC
     #include <common/mutators/mutator/dodging/sv_dodging.qc>
 #endif
index fef7b8e6e4e7f289ea505ba469708bc116e3a280..d2c0d05c7acf80c030e2f1210c9494196674aec4 100644 (file)
@@ -1,4 +1,7 @@
 // generated file; do not modify
+#ifdef CSQC
+    #include <common/mutators/mutator/dodging/cl_dodging.qh>
+#endif
 #ifdef SVQC
     #include <common/mutators/mutator/dodging/sv_dodging.qh>
 #endif
diff --git a/qcsrc/common/mutators/mutator/dodging/cl_dodging.qc b/qcsrc/common/mutators/mutator/dodging/cl_dodging.qc
new file mode 100644 (file)
index 0000000..a9d10ef
--- /dev/null
@@ -0,0 +1 @@
+#include "cl_dodging.qh"
diff --git a/qcsrc/common/mutators/mutator/dodging/cl_dodging.qh b/qcsrc/common/mutators/mutator/dodging/cl_dodging.qh
new file mode 100644 (file)
index 0000000..84f7731
--- /dev/null
@@ -0,0 +1,4 @@
+#pragma once
+
+float cvar_cl_dodging_timeout;
+REPLICATE(cvar_cl_dodging_timeout, float, "cl_dodging_timeout");
index 6640cb8bf23a51a48c08cdd4662fbd89a4fcefcf..c97308d58ab1f8cd8a7db8adcd738c277baa739e 100644 (file)
 #endif
 
 #ifdef CSQC
+       float cvar_cl_dodging_timeout;
        #define PHYS_DODGING_FRAMETIME                          (1 / (frametime <= 0 ? 60 : frametime))
        #define PHYS_DODGING_TIMEOUT(s)                         STAT(DODGING_TIMEOUT)
        #define PHYS_DODGING_PRESSED_KEYS(s)            (s).pressedkeys
 #elif defined(SVQC)
+       .float cvar_cl_dodging_timeout;
        #define PHYS_DODGING_FRAMETIME                          sys_frametime
        #define PHYS_DODGING_TIMEOUT(s)                         CS(s).cvar_cl_dodging_timeout
        #define PHYS_DODGING_PRESSED_KEYS(s)            CS(s).pressedkeys
@@ -56,8 +58,6 @@ bool autocvar_sv_dodging_sound;
 #include <common/animdecide.qh>
 #include <common/physics/player.qh>
 
-.float cvar_cl_dodging_timeout;
-
 REGISTER_MUTATOR(dodging, cvar("g_dodging"))
 {
        // this just turns on the cvar.
index 081a1fdb6fd69d7767de22b0ebecd8c8445e93b4..0efd85635cc88503b9998675c59eaf2369fd347c 100644 (file)
@@ -24,6 +24,7 @@ REGISTER_MUTATOR(multijump, true);
 .bool multijump_ready;
 
 #ifdef CSQC
+bool cvar_cl_multijump;
 bool autocvar_cl_multijump = true;
 
        #define PHYS_MULTIJUMP_CLIENT(s)        autocvar_cl_multijump
@@ -114,10 +115,10 @@ MUTATOR_HOOKFUNCTION(multijump, PlayerJump)
        }
 }
 
-#ifdef SVQC
-
 REPLICATE(cvar_cl_multijump, bool, "cl_multijump");
 
+#ifdef SVQC
+
 MUTATOR_HOOKFUNCTION(multijump, BuildMutatorsString)
 {
        M_ARGV(0, string) = strcat(M_ARGV(0, string), ":multijump");
index 8dc82dbcf9c200633a7361f42a8100c025edf881..d48319a421fa599861a11ba4aaabe1dabe71ac1b 100644 (file)
@@ -10,6 +10,9 @@ float autocvar_g_nades_spread = 0.04;
 REGISTER_STAT(NADES_SMALL, int, autocvar_g_nades_nade_small)
 
 #ifdef GAMEQC
+REPLICATE(cvar_cl_nade_type, int, "cl_nade_type");
+REPLICATE(cvar_cl_pokenade_type, string, "cl_pokenade_type");
+
 entity Nade_TrailEffect(int proj, int nade_team)
 {
     switch (proj)
@@ -1546,9 +1549,6 @@ MUTATOR_HOOKFUNCTION(nades, SpectateCopy)
        STAT(VEIL_ORB_ALPHA, client) = STAT(VEIL_ORB_ALPHA, spectatee);
 }
 
-REPLICATE(cvar_cl_nade_type, int, "cl_nade_type");
-REPLICATE(cvar_cl_pokenade_type, string, "cl_pokenade_type");
-
 MUTATOR_HOOKFUNCTION(nades, BuildMutatorsString)
 {
        M_ARGV(0, string) = strcat(M_ARGV(0, string), ":Nades");
index 2729316a88b4fd8c95eb24f1afc1580b3d7126f3..d76eb941450274fb626b8f1732ef4ecebf88e4f1 100644 (file)
@@ -101,6 +101,8 @@ MUTATOR_HOOKABLE(Nade_Damage, EV_Nade_Damage);
 #endif
 
 #ifdef CSQC
+float cvar_cl_nade_type;
+string cvar_cl_pokenade_type;
 bool Projectile_isnade(int proj); // TODO: remove
 
 void DrawAmmoNades(vector myPos, vector mySize, bool draw_expanding, float expand_time); // TODO: mutator
index fe3a6ebc5d612cd64ff0fd96d5df502f956176d2..46496895afea6dd3bd9abc45cdaf2cb8db5fb452 100644 (file)
@@ -1,4 +1,7 @@
 // generated file; do not modify
+#ifdef CSQC
+    #include <common/mutators/mutator/spawn_near_teammate/cl_spawn_near_teammate.qc>
+#endif
 #ifdef SVQC
     #include <common/mutators/mutator/spawn_near_teammate/sv_spawn_near_teammate.qc>
 #endif
index b34f8f8f164c22c2bb724817ee2ca77fc3710453..c4cfe5ada918e1968cd7a713ecab726d99cf2656 100644 (file)
@@ -1,4 +1,7 @@
 // generated file; do not modify
+#ifdef CSQC
+    #include <common/mutators/mutator/spawn_near_teammate/cl_spawn_near_teammate.qh>
+#endif
 #ifdef SVQC
     #include <common/mutators/mutator/spawn_near_teammate/sv_spawn_near_teammate.qh>
 #endif
diff --git a/qcsrc/common/mutators/mutator/spawn_near_teammate/cl_spawn_near_teammate.qc b/qcsrc/common/mutators/mutator/spawn_near_teammate/cl_spawn_near_teammate.qc
new file mode 100644 (file)
index 0000000..11774ca
--- /dev/null
@@ -0,0 +1 @@
+#include "cl_spawn_near_teammate.qh"
diff --git a/qcsrc/common/mutators/mutator/spawn_near_teammate/cl_spawn_near_teammate.qh b/qcsrc/common/mutators/mutator/spawn_near_teammate/cl_spawn_near_teammate.qh
new file mode 100644 (file)
index 0000000..640a725
--- /dev/null
@@ -0,0 +1,4 @@
+#pragma once
+
+float cvar_cl_spawn_near_teammate;
+REPLICATE(cvar_cl_spawn_near_teammate, bool, "cl_spawn_near_teammate");
index dc63a70803963ceb4c7c8f2e9b49066a6dca225e..2d775d4f219386fe82fc31ab3cc09ef52c53f827 100644 (file)
@@ -856,4 +856,17 @@ REGISTRY_END(Notifications)
                LOG_SEVERE("Notification initialization failed! Read above and fix the errors!");
 }
 
+#ifdef CSQC
+.int cvar_value;
+void ReplicateVars(bool would_destroy)
+{
+       if (!would_destroy)
+               FOREACH(Notifications, it.nent_type == MSG_CHOICE, {
+                       string cvarname = sprintf("notification_%s", Get_Notif_CvarName(it));
+                       // NOTE: REPLICATE_SIMPLE can return;
+                       REPLICATE_SIMPLE(it.cvar_value, cvarname);
+               });
+}
+#endif
+
 #include "all.inc"
index 1ffb45178d86684bbabd7f9c86cce1a8507d1229..0f40acfc6856b65ad68446091b5a9142d3d16e13 100644 (file)
@@ -41,8 +41,6 @@ void ClientState_attach(entity this)
 {
        this._cs = NEW(ClientState, this);
 
-    GetCvars(this, CS(this), 0);  // get other cvars from player
-
        // TODO: fold all of these into ClientState
 
        DecodeLevelParms(this);
index cf51ea66b3ebf7b24d86c16c89756347fa5bca0c..e35115d3e54a51d8d81fc9e2c7cafd0e89f39f4b 100644 (file)
@@ -376,8 +376,8 @@ noref int autocvar_cl_gunalign;
 #endif
 #ifdef SVQC
 .int cvar_cl_gunalign;
-REPLICATE(cvar_cl_gunalign, int, "cl_gunalign");
 #endif
+
 REGISTER_STAT(GUNALIGN, int)
 #ifdef SVQC
 SPECTATE_COPYFIELD(_STAT(GUNALIGN))
index 43398e6a5de5b539b9c9cea2b2bf187e10e63fcf..0be413f0fb0071fad8974f2022e50cea7a1bf838 100644 (file)
@@ -384,6 +384,13 @@ ENUMCLASS_END(WFRAME)
 vector shotorg_adjust_values(vector vecs, bool y_is_right, bool visual, int algn);
 void CL_WeaponEntity_SetModel(entity this, string name, bool _anim);
 
+#ifdef CSQC
+bool cvar_cl_accuracy_data_share;
+REPLICATE(cvar_cl_accuracy_data_share, bool, "cl_accuracy_data_share");
+bool cvar_cl_accuracy_data_receive;
+REPLICATE(cvar_cl_accuracy_data_receive, bool, "cl_accuracy_data_receive");
+#endif
+
 #ifdef SVQC
 void wframe_send(entity actor, entity weaponentity, vector a, bool restartanim);
 #endif
index 656989782672e60c948199c0b8deb94f2f10b0a6..a88bde462934134f3585707eff76e81303e8d6c2 100644 (file)
        #define REPLICATE(...) EVAL_REPLICATE(OVERLOAD(REPLICATE, __VA_ARGS__))
        #define EVAL_REPLICATE(...) __VA_ARGS__
 
+       #if defined(SVQC)
        ACCUMULATE void ReplicateVars(entity this, entity store, string thisname, int i) {}
+       #elif defined(CSQC)
+       ACCUMULATE void ReplicateVars(bool would_destroy) {}
+       #endif
 
        #define REPLICATE_3(fld, type, var) REPLICATE_4(fld, type, var, )
        #define REPLICATE_4(fld, type, var, func) REPLICATE_##type(fld, var, func)
-       #define REPLICATE_string(fld, var, func) \
-               REPLICATE_7(fld, string, var, , \
-       { strcpy(field, it); }, \
-       { strfree(field); }, \
-       { \
-               /* also initialize to the default value of func when requesting cvars */ \
-               string s = func(field); \
-               if (s != field) \
+       #if defined(SVQC)
+               #define REPLICATE_string(fld, var, func) \
+                       REPLICATE_7(fld, string, var, , \
+               { strcpy(field, it); }, \
+               { strfree(field); }, \
                { \
-                   strcpy(field, s); \
-               } \
-       })
-       #define REPLICATE_float(fld, var, func) REPLICATE_7(fld, float, var, func,  { field = stof(it); },          , )
-       #define REPLICATE_bool(fld, var, func) REPLICATE_7(fld, bool, var, func,   { field = boolean(stoi(it)); }, , )
-       #define REPLICATE_int(fld, var, func) REPLICATE_7(fld, int, var, func,    { field = stoi(it); },          , )
+                       /* also initialize to the default value of func when requesting cvars */ \
+                       string s = func(field); \
+                       if (s != field) \
+                       { \
+                               strcpy(field, s); \
+                       } \
+               })
+               #define REPLICATE_float(fld, var, func) REPLICATE_7(fld, float, var, func,  { field = stof(it); },          , )
+               #define REPLICATE_bool(fld, var, func) REPLICATE_7(fld, bool, var, func,   { field = boolean(stoi(it)); }, , )
+               #define REPLICATE_int(fld, var, func) REPLICATE_7(fld, int, var, func,    { field = stoi(it); },          , )
 
-       #if defined(SVQC)
                #define REPLICATE_7(fld, type, var, func, create, destroy, after) \
                        void ReplicateVars(entity this, entity store, string thisname, int i) \
                        { \
                                        } \
                                        else \
                                        { \
-                                               stuffcmd(this, "cl_cmd sendcvar " var "\n"); \
+                                               stuffcmd(this, strcat("cl_cmd sendcvar ", var, "\n")); \
                                        } \
                                        if (current) { after } \
                                } \
                                store.fld = field; \
                        }
        #elif defined(CSQC)
-               // TODO
-               #define REPLICATE_7(fld, type, var, func, create, destroy, after)
+               float ReplicateVars_time;
+               #define ReplicateVars_NOT_SENDING() (time > ReplicateVars_time)
+               #define ReplicateVars_DELAY(t) ReplicateVars_time = time + t
+               #define ReplicateVars_DELAY_1FRAME() ReplicateVars_time = time
+               #define REPLICATE_string(fld, var, func) REPLICATE_7(fld, float, var, func, (fld != cvar_string(var)), { strcpy(fld, cvar_string(var)); }, { strfree(fld); })
+               #define REPLICATE_float(fld, var, func) REPLICATE_7(fld, float, var, func, (fld != cvar(var)), { fld = cvar(var); }, )
+               #define REPLICATE_bool(fld, var, func) REPLICATE_7(fld, bool, var, func, (fld != cvar(var)), { fld = cvar(var); }, )
+               #define REPLICATE_int(fld, var, func) REPLICATE_7(fld, int, var, func, (fld != cvar(var)), { fld = cvar(var); }, )
+
+               #define REPLICATE_7(fld, type, var, func, check, update, destroy) \
+                       void ReplicateVars(bool would_destroy) \
+                       { \
+                               if (would_destroy) { destroy } \
+                               else if (ReplicateVars_NOT_SENDING() && check) \
+                               { \
+                                       localcmd(strcat("cl_cmd sendcvar ", var, "\n")); \
+                                       ReplicateVars_DELAY_1FRAME(); \
+                                       update \
+                                       return; \
+                               } \
+                       }
+
+               #define REPLICATE_SIMPLE(field, cvarname) MACRO_BEGIN \
+                       if (ReplicateVars_NOT_SENDING() && field != cvar(cvarname)) \
+                       { \
+                               localcmd(strcat("cl_cmd sendcvar ", cvarname, "\n")); \
+                               ReplicateVars_DELAY_1FRAME(); \
+                               field = cvar(cvarname); \
+                               return; \
+                       } \
+               MACRO_END
        #endif
 
 #endif
index 1395986b97bd3a463ab33c16e8508da381f992ca..911012a8566856b02c10fb4769a721be3876b129 100644 (file)
@@ -328,7 +328,7 @@ void ClientCommand_physics(entity caller, int request, int argc)
 
                        if (Physics_Valid(command) || command == "default")
                        {
-                               stuffcmd(caller, strcat("\nseta cl_physics ", command, "\nsendcvar cl_physics\n"));
+                               stuffcmd(caller, strcat("\nseta cl_physics ", command, "\n"));
                                sprint(caller, strcat("^2Physics set successfully changed to ^3", command, "\n"));
                                return;
                        }
index 522840e763679681c641ccd3f271122db8012ea3..854e39781f11794e7c3aca8c3065f8761d8630b5 100644 (file)
@@ -429,6 +429,9 @@ void GetCvars(entity this, entity store, int f)
 {
        string s = string_null;
 
+       if (f == 0)
+               LOG_INFO("Warning: requesting cvar values is deprecated. Client should send them automatically using REPLICATE.\n");
+
        if (f > 0)
                s = strcat1(argv(f));
 
index cd09b1defd7ff9051dd5d96e041fd9c303561d0d..1ca629078e4a99d27076c5292e1aade918bf5996 100644 (file)
@@ -306,6 +306,7 @@ MUTATOR_HOOKABLE(PlayerPreThink, EV_PlayerPreThink);
 MUTATOR_HOOKABLE(GetPressedKeys, EV_GetPressedKeys);
 
 /** is meant to call GetCvars_handle*(get_cvars_s, get_cvars_f, cvarfield, "cvarname") for cvars this mutator needs from the client */
+// NOTE: requesting cvar values (get_cvars_f 0) is deprecated
 #define EV_GetCvars(i, o) \
     /**/ i(float, get_cvars_f) \
     /**/ i(string, get_cvars_s) \
index c9a49f924a330b15c327e566d9617ecad3247eeb..fc57c520fd3d94584ffc4990871b8f276e7e4c22 100644 (file)
@@ -2,8 +2,8 @@
 // if you want to reset your client to defaults, it's probably a better idea to delete (parts of) config.cfg and restart
 
 
-// changes a cvar and reports it to the server (for the menu to notify the
-// server about changes)
+// changes a cvar and reports it to the server (for the client to notify the server about changes)
+// DEPRECATED, cvars can be set in the client code to be sent automatically (using REPLICATE)
 alias setreport "set \"$1\" \"$2\" ; sendcvar \"$1\""
 
 seta cl_firststart "" "how many times the client has been run"
@@ -648,9 +648,9 @@ alias _gl_flashblend_update_01 "gl_flashblend 0"
 alias _gl_flashblend_update_11 "gl_flashblend 0"
 alias gl_flashblend_update "_gl_flashblend_update_$r_shadow_realtime_dlight$r_showsurfaces"
 
-set cl_handicap 1      "multiplies damage received and divides damage dealt NOTE: reconnect or use 'sendcvar cl_handicap' to update the choice."
+set cl_handicap 1      "multiplies damage received and divides damage dealt"
 
-seta cl_clippedspectating 1 "movement collision for spectators so that you can't pass through walls and such. (client setting) NOTE: reconnect or use sendcvar command to update the choice."
+seta cl_clippedspectating 1 "movement collision for spectators so that you can't pass through walls and such"
 
 seta cl_autoscreenshot 1 "Take a screenshot upon the end of a match... 0 = Disable completely, 1 = Allow sv_autoscreenshot to take a screenshot when requested, 2 = Always take an autoscreenshot anyway."