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"
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
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;
}
}
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()
{
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;
deactivate_minigame();
HUD_MinigameMenu_Close(NULL, NULL, NULL);
+
+ ReplicateVars(true); // destroy
}
.float has_team;
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
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))
#pragma once
#include "buffs.qh"
+
+float cvar_cl_buffs_autoreplace;
+REPLICATE(cvar_cl_buffs_autoreplace, bool, "cl_buffs_autoreplace");
// 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
// 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
--- /dev/null
+#include "cl_dodging.qh"
--- /dev/null
+#pragma once
+
+float cvar_cl_dodging_timeout;
+REPLICATE(cvar_cl_dodging_timeout, float, "cl_dodging_timeout");
#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
#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.
.bool multijump_ready;
#ifdef CSQC
+bool cvar_cl_multijump;
bool autocvar_cl_multijump = true;
#define PHYS_MULTIJUMP_CLIENT(s) autocvar_cl_multijump
}
}
-#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");
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)
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");
#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
// 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
// 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
--- /dev/null
+#include "cl_spawn_near_teammate.qh"
--- /dev/null
+#pragma once
+
+float cvar_cl_spawn_near_teammate;
+REPLICATE(cvar_cl_spawn_near_teammate, bool, "cl_spawn_near_teammate");
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"
{
this._cs = NEW(ClientState, this);
- GetCvars(this, CS(this), 0); // get other cvars from player
-
// TODO: fold all of these into ClientState
DecodeLevelParms(this);
#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))
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
#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
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;
}
{
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));
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) \
// 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"
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."