1#pragma once
2
3#ifdef SVQC
4#include <server/client.qh>
5#endif
6
7// Full list of all stat constants, included in a single location for easy reference
8// 255 is the current limit (MAX_CL_STATS - 1), engine will need to be modified if you wish to add more stats
9
10const int MAX_CL_STATS = 256;
11
12// const int STAT_HEALTH = 0;
13// const int STAT_ARMOR = 4;
14// const int STAT_SHELLS = 6;
15// const int STAT_NAILS = 7;
16// const int STAT_ROCKETS = 8;
17// const int STAT_CELLS = 9;
18// const int STAT_ACTIVEWEAPON = 10;
19// const int STAT_ITEMS = 15; // .items | .items2 << 23 | serverflags << 28
20// const int STAT_VIEWHEIGHT = 16;
21
22#if defined(CSQC)
23    #define g_stat_HEALTH getstati(STAT_HEALTH)
24    #define g_stat_ARMOR getstat_int(STAT_ARMOR)
25    #define g_stat_SHELLS getstat_int(STAT_SHELLS)
26    #define g_stat_NAILS getstat_int(STAT_NAILS)
27    #define g_stat_ROCKETS getstat_int(STAT_ROCKETS)
28    #define g_stat_CELLS getstat_int(STAT_CELLS)
29    #define g_stat_ACTIVEWEAPON getstat_int(STAT_ACTIVEWEAPON)
30    #define g_stat_ITEMS getstat_int(STAT_ITEMS)
31    #define g_stat_VIEWHEIGHT getstati(STAT_VIEWHEIGHT)
32#elif defined(SVQC)
33    #define stat_HEALTH health
34    #define stat_ARMOR armorvalue
35    #define stat_SHELLS ammo_shells
36    #define stat_NAILS ammo_nails
37    #define stat_ROCKETS ammo_rockets
38    #define stat_CELLS ammo_cells
39    #define stat_ACTIVEWEAPON weapon
40    #define stat_ITEMS items
41    #define stat_VIEWHEIGHT view_ofs_z
42#endif
43
44REGISTER_STAT(WEAPONS, vectori)
45REGISTER_STAT(WEAPONSINMAP, vectori)
46
47REGISTER_STAT(PL_VIEW_OFS, vector)
48REGISTER_STAT(PL_CROUCH_VIEW_OFS, vector)
49
50REGISTER_STAT(PL_MIN, vector)
51REGISTER_STAT(PL_CROUCH_MIN, vector)
52
53REGISTER_STAT(PL_MAX, vector)
54REGISTER_STAT(PL_CROUCH_MAX, vector)
55
56REGISTER_STAT(KH_KEYS, int)
57
58#ifdef SVQC
59float W_WeaponRateFactor(entity this);
60float game_stopped;
61#endif
62REGISTER_STAT(WEAPONRATEFACTOR, float, W_WeaponRateFactor(this))
63REGISTER_STAT(GAME_STOPPED, int, game_stopped)
64REGISTER_STAT(GAMESTARTTIME, float)
65REGISTER_STAT(STRENGTH_FINISHED, float)
66REGISTER_STAT(INVINCIBLE_FINISHED, float)
67/** arc heat in [0,1] */
68REGISTER_STAT(ARC_HEAT, float)
69REGISTER_STAT(PRESSED_KEYS, int)
70/** this stat could later contain some other bits of info, like, more server-side particle config */
71REGISTER_STAT(ALLOW_OLDVORTEXBEAM, bool)
72REGISTER_STAT(FUEL, int)
73REGISTER_STAT(NB_METERSTART, float)
74/** compressShotOrigin */
75REGISTER_STAT(SHOTORG, int)
76REGISTER_STAT(LEADLIMIT, float)
77REGISTER_STAT(WEAPON_CLIPLOAD, int)
78REGISTER_STAT(WEAPON_CLIPSIZE, int)
79
80REGISTER_STAT(VORTEX_CHARGE, float)
81REGISTER_STAT(LAST_PICKUP, float)
82REGISTER_STAT(HUD, int)
83REGISTER_STAT(VORTEX_CHARGEPOOL, float)
84REGISTER_STAT(HIT_TIME, float)
85REGISTER_STAT(DAMAGE_DEALT_TOTAL, int)
86REGISTER_STAT(TYPEHIT_TIME, float)
87REGISTER_STAT(LAYED_MINES, int)
88REGISTER_STAT(HAGAR_LOAD, int)
89REGISTER_STAT(SUPERWEAPONS_FINISHED, float)
90REGISTER_STAT(VEHICLESTAT_HEALTH, int)
91REGISTER_STAT(VEHICLESTAT_SHIELD, int)
92REGISTER_STAT(VEHICLESTAT_ENERGY, int)
93REGISTER_STAT(VEHICLESTAT_AMMO1, int)
94REGISTER_STAT(VEHICLESTAT_RELOAD1, int)
95REGISTER_STAT(VEHICLESTAT_AMMO2, int)
96REGISTER_STAT(VEHICLESTAT_RELOAD2, int)
97REGISTER_STAT(VEHICLESTAT_W2MODE, int)
98REGISTER_STAT(NADE_TIMER, float)
99REGISTER_STAT(SECRETS_TOTAL, float)
100REGISTER_STAT(SECRETS_FOUND, float)
101REGISTER_STAT(RESPAWN_TIME, float)
102REGISTER_STAT(ROUNDSTARTTIME, float)
103REGISTER_STAT(MONSTERS_TOTAL, int)
104REGISTER_STAT(MONSTERS_KILLED, int)
105REGISTER_STAT(BUFFS, int)
106REGISTER_STAT(NADE_BONUS, float)
107REGISTER_STAT(NADE_BONUS_TYPE, int)
108REGISTER_STAT(NADE_BONUS_SCORE, float)
109REGISTER_STAT(HEALING_ORB, float)
110REGISTER_STAT(HEALING_ORB_ALPHA, float)
111REGISTER_STAT(PLASMA, int)
112REGISTER_STAT(FROZEN, int)
113REGISTER_STAT(REVIVE_PROGRESS, float)
114REGISTER_STAT(ROUNDLOST, int)
115REGISTER_STAT(BUFF_TIME, float)
116REGISTER_STAT(CTF_FLAGSTATUS, int)
117REGISTER_STAT(CAPTURE_PROGRESS, float)
118REGISTER_STAT(ENTRAP_ORB, float)
119REGISTER_STAT(ENTRAP_ORB_ALPHA, float)
120REGISTER_STAT(ITEMSTIME, int, autocvar_sv_itemstime)
121REGISTER_STAT(KILL_TIME, float)
122
123#ifdef SVQC
124bool autocvar_g_ctf_leaderboard;
125#endif
126REGISTER_STAT(CTF_SHOWLEADERBOARD, bool, autocvar_g_ctf_leaderboard)
127
128#ifdef SVQC
129int autocvar_g_multijump;
130float autocvar_g_multijump_add;
131float autocvar_g_multijump_speed;
132float autocvar_g_multijump_maxspeed;
133float autocvar_g_multijump_dodging = 1;
134#endif
135REGISTER_STAT(MULTIJUMP_DODGING, int, autocvar_g_multijump_dodging)
136REGISTER_STAT(MULTIJUMP_MAXSPEED, float, autocvar_g_multijump_maxspeed)
137REGISTER_STAT(MULTIJUMP_ADD, int, autocvar_g_multijump_add)
138REGISTER_STAT(MULTIJUMP_SPEED, float, autocvar_g_multijump_speed)
139.int multijump_count;
140REGISTER_STAT(MULTIJUMP_COUNT, int, this.multijump_count)
141REGISTER_STAT(MULTIJUMP, int, autocvar_g_multijump)
142REGISTER_STAT(DOUBLEJUMP, int, autocvar_sv_doublejump)
143
144#ifdef SVQC
145bool g_bugrigs;
146bool g_bugrigs_planar_movement;
147bool g_bugrigs_planar_movement_car_jumping;
148float g_bugrigs_reverse_spinning;
149float g_bugrigs_reverse_speeding;
150float g_bugrigs_reverse_stopping;
151float g_bugrigs_air_steering;
152float g_bugrigs_angle_smoothing;
153float g_bugrigs_friction_floor;
154float g_bugrigs_friction_brake;
155float g_bugrigs_friction_air;
156float g_bugrigs_accel;
157float g_bugrigs_speed_ref;
158float g_bugrigs_speed_pow;
159float g_bugrigs_steer;
160#endif
161REGISTER_STAT(BUGRIGS, int, g_bugrigs)
162REGISTER_STAT(BUGRIGS_ACCEL, float, g_bugrigs_accel)
163REGISTER_STAT(BUGRIGS_AIR_STEERING, int, g_bugrigs_air_steering)
164REGISTER_STAT(BUGRIGS_ANGLE_SMOOTHING, int, g_bugrigs_angle_smoothing)
165REGISTER_STAT(BUGRIGS_CAR_JUMPING, int, g_bugrigs_planar_movement_car_jumping)
166REGISTER_STAT(BUGRIGS_FRICTION_AIR, float, g_bugrigs_friction_air)
167REGISTER_STAT(BUGRIGS_FRICTION_BRAKE, float, g_bugrigs_friction_brake)
168REGISTER_STAT(BUGRIGS_FRICTION_FLOOR, float, g_bugrigs_friction_floor)
169REGISTER_STAT(BUGRIGS_PLANAR_MOVEMENT, int, g_bugrigs_planar_movement)
170REGISTER_STAT(BUGRIGS_REVERSE_SPEEDING, int, g_bugrigs_reverse_speeding)
171REGISTER_STAT(BUGRIGS_REVERSE_SPINNING, int, g_bugrigs_reverse_spinning)
172REGISTER_STAT(BUGRIGS_REVERSE_STOPPING, int, g_bugrigs_reverse_stopping)
173REGISTER_STAT(BUGRIGS_SPEED_POW, float, g_bugrigs_speed_pow)
174REGISTER_STAT(BUGRIGS_SPEED_REF, float, g_bugrigs_speed_ref)
175REGISTER_STAT(BUGRIGS_STEER, float, g_bugrigs_steer)
176
177#ifdef SVQC
178int autocvar_sv_gameplayfix_downtracesupportsongroundflag;
179int autocvar_sv_gameplayfix_easierwaterjump;
180int autocvar_sv_gameplayfix_stepdown;
181int autocvar_sv_gameplayfix_stepmultipletimes;
182int autocvar_sv_gameplayfix_unstickplayers;
183int autocvar_sv_gameplayfix_fixedcheckwatertransition;
184#endif
185REGISTER_STAT(GAMEPLAYFIX_DOWNTRACEONGROUND, int, autocvar_sv_gameplayfix_downtracesupportsongroundflag)
186REGISTER_STAT(GAMEPLAYFIX_EASIERWATERJUMP, int, autocvar_sv_gameplayfix_easierwaterjump)
187REGISTER_STAT(GAMEPLAYFIX_STEPDOWN, int, autocvar_sv_gameplayfix_stepdown)
188REGISTER_STAT(GAMEPLAYFIX_STEPMULTIPLETIMES, int, autocvar_sv_gameplayfix_stepmultipletimes)
189REGISTER_STAT(GAMEPLAYFIX_UNSTICKPLAYERS, int, autocvar_sv_gameplayfix_unstickplayers)
190REGISTER_STAT(GAMEPLAYFIX_UPVELOCITYCLEARSONGROUND, int, autocvar_sv_gameplayfix_upwardvelocityclearsongroundflag)
191REGISTER_STAT(GAMEPLAYFIX_WATERTRANSITION, int, autocvar_sv_gameplayfix_fixedcheckwatertransition)
192
193REGISTER_STAT(MOVEVARS_JUMPSTEP, int, cvar("sv_jumpstep"))
194REGISTER_STAT(NOSTEP, int, cvar("sv_nostep"))
195
196REGISTER_STAT(MOVEVARS_FRICTION, float)
197REGISTER_STAT(MOVEVARS_FRICTION_SLICK, float, autocvar_sv_friction_slick)
198REGISTER_STAT(MOVEVARS_FRICTION_ONLAND, float, autocvar_sv_friction_on_land)
199
200REGISTER_STAT(MOVEVARS_JUMPSPEEDCAP_DISABLE_ONRAMPS, int, autocvar_sv_jumpspeedcap_max_disable_on_ramps)
201REGISTER_STAT(MOVEVARS_TRACK_CANJUMP, int)
202/** cvar loopback */
203REGISTER_STAT(MOVEVARS_CL_TRACK_CANJUMP, int)
204
205#ifdef SVQC
206int g_dodging;
207float autocvar_sv_dodging_delay;
208float autocvar_sv_dodging_wall_distance_threshold;
209bool autocvar_sv_dodging_frozen;
210bool autocvar_sv_dodging_frozen_doubletap;
211float autocvar_sv_dodging_height_threshold;
212float autocvar_sv_dodging_horiz_speed;
213float autocvar_sv_dodging_horiz_speed_frozen;
214float autocvar_sv_dodging_ramp_time;
215float autocvar_sv_dodging_up_speed;
216bool autocvar_sv_dodging_wall_dodging;
217bool autocvar_sv_dodging_air_dodging;
218float autocvar_sv_dodging_maxspeed = 450;
219#endif
220
221#if 0
222REGISTER_STAT(DODGING, int, g_dodging)
223REGISTER_STAT(DODGING_DELAY, float, autocvar_sv_dodging_delay)
224REGISTER_STAT(DODGING_DISTANCE_THRESHOLD, float, autocvar_sv_dodging_wall_distance_threshold)
225REGISTER_STAT(DODGING_FROZEN_NO_DOUBLETAP, int, autocvar_sv_dodging_frozen_doubletap)
226REGISTER_STAT(DODGING_HEIGHT_THRESHOLD, float, autocvar_sv_dodging_height_threshold)
227REGISTER_STAT(DODGING_HORIZ_SPEED, float, autocvar_sv_dodging_horiz_speed)
228REGISTER_STAT(DODGING_HORIZ_SPEED_FROZEN, float, autocvar_sv_dodging_horiz_speed_frozen)
229REGISTER_STAT(DODGING_RAMP_TIME, float, autocvar_sv_dodging_ramp_time)
230REGISTER_STAT(DODGING_UP_SPEED, float, autocvar_sv_dodging_up_speed)
231REGISTER_STAT(DODGING_WALL, bool, autocvar_sv_dodging_wall_dodging)
232REGISTER_STAT(DODGING_AIR, bool, autocvar_sv_dodging_air_dodging)
233REGISTER_STAT(DODGING_MAXSPEED, float, autocvar_sv_dodging_maxspeed)
234#endif
235/** cvar loopback */
236REGISTER_STAT(DODGING_FROZEN, int, autocvar_sv_dodging_frozen)
237REGISTER_STAT(DODGING_TIMEOUT, float)
238
239REGISTER_STAT(JETPACK_ACCEL_SIDE, float, autocvar_g_jetpack_acceleration_side)
240REGISTER_STAT(JETPACK_ACCEL_UP, float, autocvar_g_jetpack_acceleration_up)
241REGISTER_STAT(JETPACK_ANTIGRAVITY, float, autocvar_g_jetpack_antigravity)
242REGISTER_STAT(JETPACK_FUEL, float, autocvar_g_jetpack_fuel)
243REGISTER_STAT(JETPACK_MAXSPEED_SIDE, float, autocvar_g_jetpack_maxspeed_side)
244REGISTER_STAT(JETPACK_MAXSPEED_UP, float, autocvar_g_jetpack_maxspeed_up)
245REGISTER_STAT(JETPACK_REVERSE_THRUST, float, autocvar_g_jetpack_reverse_thrust)
246
247REGISTER_STAT(MOVEVARS_HIGHSPEED, float)
248
249#ifdef SVQC
250AUTOCVAR(g_walljump, bool, false, "Enable wall jumping mutator");
251AUTOCVAR(g_walljump_delay, float, 1, "Minimum delay between wall jumps");
252AUTOCVAR(g_walljump_force, float, 300, "How far to bounce/jump off the wall");
253AUTOCVAR(g_walljump_velocity_xy_factor, float, 1.15, "How much to slow down along horizontal axis, higher value = higher deceleration, if factor is < 1, you accelerate by wall jumping");
254AUTOCVAR(g_walljump_velocity_z_factor, float, 0.5, "Upwards velocity factor, multiplied by normal jump velocity");
255#endif
256REGISTER_STAT(WALLJUMP, int, autocvar_g_walljump)
257REGISTER_STAT(WALLJUMP_VELOCITY_Z_FACTOR, float, autocvar_g_walljump_velocity_z_factor)
258REGISTER_STAT(WALLJUMP_VELOCITY_XY_FACTOR, float, autocvar_g_walljump_velocity_xy_factor)
259REGISTER_STAT(WALLJUMP_DELAY, float, autocvar_g_walljump_delay)
260REGISTER_STAT(WALLJUMP_FORCE, float, autocvar_g_walljump_force)
261REGISTER_STAT(LASTWJ, float)
262
263// freeze tag, clan arena
264REGISTER_STAT(REDALIVE, int)
265REGISTER_STAT(BLUEALIVE, int)
266REGISTER_STAT(YELLOWALIVE, int)
267REGISTER_STAT(PINKALIVE, int)
268
269// domination
270REGISTER_STAT(DOM_TOTAL_PPS, float)
271REGISTER_STAT(DOM_PPS_RED, float)
272REGISTER_STAT(DOM_PPS_BLUE, float)
273REGISTER_STAT(DOM_PPS_YELLOW, float)
274REGISTER_STAT(DOM_PPS_PINK, float)
275
276REGISTER_STAT(TELEPORT_MAXSPEED, float, autocvar_g_teleport_maxspeed)
277REGISTER_STAT(TELEPORT_TELEFRAG_AVOID, int, autocvar_g_telefrags_avoid)
278
279REGISTER_STAT(CAMERA_SPECTATOR, int)
280
281REGISTER_STAT(SPECTATORSPEED, float)
282
283#ifdef SVQC
284bool autocvar_sv_slick_applygravity;
285#endif
286REGISTER_STAT(SLICK_APPLYGRAVITY, bool, autocvar_sv_slick_applygravity)
287
288#ifdef SVQC
289#include "physics/movetypes/movetypes.qh"
290#endif
291
292REGISTER_STAT(MOVEVARS_AIRACCEL_QW_STRETCHFACTOR, float)
293REGISTER_STAT(MOVEVARS_AIRCONTROL_PENALTY, float)
294REGISTER_STAT(MOVEVARS_AIRSPEEDLIMIT_NONQW, float)
295REGISTER_STAT(MOVEVARS_AIRSTRAFEACCEL_QW, float)
296REGISTER_STAT(MOVEVARS_AIRCONTROL_POWER, float)
297REGISTER_STAT(MOVEVARS_AIRCONTROL_BACKWARDS, bool)
298noref bool autocvar_sv_gameplayfix_nogravityonground;
299REGISTER_STAT(MOVEFLAGS, int, MOVEFLAG_VALID
300                              | (autocvar_sv_gameplayfix_q2airaccelerate ? MOVEFLAG_Q2AIRACCELERATE : 0)
301                              | (autocvar_sv_gameplayfix_nogravityonground ? MOVEFLAG_NOGRAVITYONGROUND : 0)
302                              | (autocvar_sv_gameplayfix_gravityunaffectedbyticrate ? MOVEFLAG_GRAVITYUNAFFECTEDBYTICRATE : 0))
303
304REGISTER_STAT(MOVEVARS_WARSOWBUNNY_AIRFORWARDACCEL, float)
305REGISTER_STAT(MOVEVARS_WARSOWBUNNY_ACCEL, float)
306REGISTER_STAT(MOVEVARS_WARSOWBUNNY_TOPSPEED, float)
307REGISTER_STAT(MOVEVARS_WARSOWBUNNY_TURNACCEL, float)
308REGISTER_STAT(MOVEVARS_WARSOWBUNNY_BACKTOSIDERATIO, float)
309
310REGISTER_STAT(MOVEVARS_AIRSTOPACCELERATE, float)
311REGISTER_STAT(MOVEVARS_AIRSTRAFEACCELERATE, float)
312REGISTER_STAT(MOVEVARS_MAXAIRSTRAFESPEED, float)
313REGISTER_STAT(MOVEVARS_AIRCONTROL, float)
314REGISTER_STAT(FRAGLIMIT, float, autocvar_fraglimit)
315REGISTER_STAT(TIMELIMIT, float, autocvar_timelimit)
316REGISTER_STAT(WARMUP_TIMELIMIT, float, warmup_limit)
317#ifdef SVQC
318float autocvar_sv_wallfriction;
319#endif
320REGISTER_STAT(MOVEVARS_WALLFRICTION, int, autocvar_sv_wallfriction)
321REGISTER_STAT(MOVEVARS_TICRATE, float, autocvar_sys_ticrate)
322REGISTER_STAT(MOVEVARS_TIMESCALE, float, autocvar_slowmo)
323REGISTER_STAT(MOVEVARS_GRAVITY, float, autocvar_sv_gravity)
324REGISTER_STAT(MOVEVARS_STOPSPEED, float)
325REGISTER_STAT(MOVEVARS_MAXSPEED, float)
326REGISTER_STAT(MOVEVARS_ACCELERATE, float)
327REGISTER_STAT(MOVEVARS_AIRACCELERATE, float)
328.float gravity;
329// FIXME: Was 0 on server, 1 on client. Still want that?
330REGISTER_STAT(MOVEVARS_ENTGRAVITY, float, (this.gravity) ? this.gravity : 1)
331REGISTER_STAT(MOVEVARS_JUMPVELOCITY, float)
332REGISTER_STAT(MOVEVARS_MAXAIRSPEED, float)
333REGISTER_STAT(MOVEVARS_STEPHEIGHT, float, autocvar_sv_stepheight)
334REGISTER_STAT(MOVEVARS_AIRACCEL_QW, float)
335REGISTER_STAT(MOVEVARS_AIRACCEL_SIDEWAYS_FRICTION, float)
336
337
338#ifdef CSQC
339noref int autocvar_cl_gunalign;
340#endif
341#ifdef SVQC
342.int cvar_cl_gunalign;
343REPLICATE(cvar_cl_gunalign, int, "cl_gunalign");
344#endif
345REGISTER_STAT(GUNALIGN, int, this.cvar_cl_gunalign)
346#ifdef SVQC
347SPECTATE_COPYFIELD(_STAT(GUNALIGN))
348#endif
349