]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/physics.qh
Merge branch 'master' into TimePath/stats
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / physics.qh
1 #ifndef COMMON_PHYSICS_H
2 #define COMMON_PHYSICS_H
3
4 // Client/server mappings
5
6 .entity conveyor;
7
8 .float race_penalty;
9
10 .float gravity;
11 .float swamp_slowdown;
12 .float lastflags;
13 .float lastground;
14 .float wasFlying;
15 .float spectatorspeed;
16
17 .vector movement_old;
18 .float buttons_old;
19 .vector v_angle_old;
20 .string lastclassname;
21
22 .float() PlayerPhysplug;
23 float AdjustAirAccelQW(float accelqw, float factor);
24
25 bool IsFlying(entity a);
26
27 #define BUFFS_STAT(s)                       STAT(BUFFS, s)
28
29 #define GAMEPLAYFIX_DOWNTRACEONGROUND       STAT(GAMEPLAYFIX_DOWNTRACEONGROUND, this)
30 #define GAMEPLAYFIX_EASIERWATERJUMP         STAT(GAMEPLAYFIX_EASIERWATERJUMP, this)
31 #define GAMEPLAYFIX_STEPDOWN                STAT(GAMEPLAYFIX_STEPDOWN, this)
32 #define GAMEPLAYFIX_STEPMULTIPLETIMES       STAT(GAMEPLAYFIX_STEPMULTIPLETIMES, this)
33 #define GAMEPLAYFIX_UNSTICKPLAYERS          STAT(GAMEPLAYFIX_UNSTICKPLAYERS, this)
34
35 #define PHYS_ACCELERATE                     STAT(MOVEVARS_ACCELERATE, this)
36 #define PHYS_AIRACCELERATE                  STAT(MOVEVARS_AIRACCELERATE, this)
37 #define PHYS_AIRACCEL_QW(s)                 STAT(MOVEVARS_AIRACCEL_QW, s)
38 #define PHYS_AIRACCEL_QW_STRETCHFACTOR(s)   STAT(MOVEVARS_AIRACCEL_QW_STRETCHFACTOR, s)
39 #define PHYS_AIRACCEL_SIDEWAYS_FRICTION     STAT(MOVEVARS_AIRACCEL_SIDEWAYS_FRICTION, this)
40 #define PHYS_AIRCONTROL                     STAT(MOVEVARS_AIRCONTROL, this)
41 #define PHYS_AIRCONTROL_PENALTY             STAT(MOVEVARS_AIRCONTROL_PENALTY, this)
42 #define PHYS_AIRCONTROL_POWER               STAT(MOVEVARS_AIRCONTROL_POWER, this)
43 #define PHYS_AIRSPEEDLIMIT_NONQW(s)         STAT(MOVEVARS_AIRSPEEDLIMIT_NONQW, s)
44 #define PHYS_AIRSTOPACCELERATE              STAT(MOVEVARS_AIRSTOPACCELERATE, this)
45 #define PHYS_AIRSTRAFEACCELERATE(s)         STAT(MOVEVARS_AIRSTRAFEACCELERATE, this)
46 #define PHYS_AIRSTRAFEACCEL_QW(s)           STAT(MOVEVARS_AIRSTRAFEACCEL_QW, s)
47
48 #define PHYS_AMMO_FUEL(s)                   STAT(FUEL, s)
49
50 #define PHYS_BUGRIGS                        STAT(BUGRIGS, this)
51 #define PHYS_BUGRIGS_ACCEL                  STAT(BUGRIGS_ACCEL, this)
52 #define PHYS_BUGRIGS_AIR_STEERING           STAT(BUGRIGS_AIR_STEERING, this)
53 #define PHYS_BUGRIGS_ANGLE_SMOOTHING        STAT(BUGRIGS_ANGLE_SMOOTHING, this)
54 #define PHYS_BUGRIGS_CAR_JUMPING            STAT(BUGRIGS_CAR_JUMPING, this)
55 #define PHYS_BUGRIGS_FRICTION_AIR           STAT(BUGRIGS_FRICTION_AIR, this)
56 #define PHYS_BUGRIGS_FRICTION_BRAKE         STAT(BUGRIGS_FRICTION_BRAKE, this)
57 #define PHYS_BUGRIGS_FRICTION_FLOOR         STAT(BUGRIGS_FRICTION_FLOOR, this)
58 #define PHYS_BUGRIGS_PLANAR_MOVEMENT        STAT(BUGRIGS_PLANAR_MOVEMENT, this)
59 #define PHYS_BUGRIGS_REVERSE_SPEEDING       STAT(BUGRIGS_REVERSE_SPEEDING, this)
60 #define PHYS_BUGRIGS_REVERSE_SPINNING       STAT(BUGRIGS_REVERSE_SPINNING, this)
61 #define PHYS_BUGRIGS_REVERSE_STOPPING       STAT(BUGRIGS_REVERSE_STOPPING, this)
62 #define PHYS_BUGRIGS_SPEED_POW              STAT(BUGRIGS_SPEED_POW, this)
63 #define PHYS_BUGRIGS_SPEED_REF              STAT(BUGRIGS_SPEED_REF, this)
64 #define PHYS_BUGRIGS_STEER                  STAT(BUGRIGS_STEER, this)
65
66 #define PHYS_DODGING_FROZEN                                     STAT(DODGING_FROZEN, this)
67
68 #define PHYS_DOUBLEJUMP                     STAT(DOUBLEJUMP, this)
69
70 #define PHYS_FRICTION                       STAT(MOVEVARS_FRICTION, this)
71 #define PHYS_FRICTION_ONLAND                STAT(MOVEVARS_FRICTION_ONLAND, this)
72 #define PHYS_FRICTION_SLICK                 STAT(MOVEVARS_FRICTION_SLICK, this)
73
74 #define PHYS_FROZEN(s)                      STAT(FROZEN, s)
75
76 #define PHYS_GRAVITY(s)                     STAT(MOVEVARS_GRAVITY, s)
77
78 #define PHYS_HIGHSPEED                      STAT(MOVEVARS_HIGHSPEED, this)
79
80 #define PHYS_JETPACK_ACCEL_SIDE                         STAT(JETPACK_ACCEL_SIDE, this)
81 #define PHYS_JETPACK_ACCEL_UP                           STAT(JETPACK_ACCEL_UP, this)
82 #define PHYS_JETPACK_ANTIGRAVITY                        STAT(JETPACK_ANTIGRAVITY, this)
83 #define PHYS_JETPACK_FUEL                                       STAT(JETPACK_FUEL, this)
84 #define PHYS_JETPACK_MAXSPEED_SIDE                      STAT(JETPACK_MAXSPEED_SIDE, this)
85 #define PHYS_JETPACK_MAXSPEED_UP                        STAT(JETPACK_MAXSPEED_UP, this)
86
87 #define PHYS_JUMPSPEEDCAP_DISABLE_ONRAMPS   STAT(MOVEVARS_JUMPSPEEDCAP_DISABLE_ONRAMPS, this)
88 #define PHYS_JUMPSTEP                                           STAT(MOVEVARS_JUMPSTEP, this)
89 #define PHYS_JUMPVELOCITY                   STAT(MOVEVARS_JUMPVELOCITY, this)
90
91 #define PHYS_MAXAIRSPEED(s)                 STAT(MOVEVARS_MAXAIRSPEED, s)
92 #define PHYS_MAXAIRSTRAFESPEED              STAT(MOVEVARS_MAXAIRSTRAFESPEED, this)
93 #define PHYS_MAXSPEED(s)                    STAT(MOVEVARS_MAXSPEED, s)
94
95 #define PHYS_NOSTEP                                                     STAT(NOSTEP, this)
96 #define PHYS_STEPHEIGHT                     STAT(MOVEVARS_STEPHEIGHT, this)
97
98 #define PHYS_STOPSPEED                      STAT(MOVEVARS_STOPSPEED, this)
99
100 #define PHYS_TRACK_CANJUMP(s)               STAT(MOVEVARS_TRACK_CANJUMP, s)
101
102 #define PHYS_WALLFRICTION                                       STAT(MOVEVARS_WALLFRICTION, this)
103
104 #define PHYS_WARSOWBUNNY_ACCEL              STAT(MOVEVARS_WARSOWBUNNY_ACCEL, this)
105 #define PHYS_WARSOWBUNNY_AIRFORWARDACCEL    STAT(MOVEVARS_WARSOWBUNNY_AIRFORWARDACCEL, this)
106 #define PHYS_WARSOWBUNNY_BACKTOSIDERATIO    STAT(MOVEVARS_WARSOWBUNNY_BACKTOSIDERATIO, this)
107 #define PHYS_WARSOWBUNNY_TOPSPEED           STAT(MOVEVARS_WARSOWBUNNY_TOPSPEED, this)
108 #define PHYS_WARSOWBUNNY_TURNACCEL          STAT(MOVEVARS_WARSOWBUNNY_TURNACCEL, this)
109
110 #define UPWARD_VELOCITY_CLEARS_ONGROUND     STAT(GAMEPLAYFIX_UPVELOCITYCLEARSONGROUND, this)
111
112 #ifdef CSQC
113
114         const int FL_WATERJUMP = 2048;  // player jumping out of water
115         const int FL_JUMPRELEASED = 4096;       // for jump debouncing
116
117         float PM_multijump_checkjump();
118         void PM_multijump();
119
120         .float watertype;
121         .float waterlevel;
122         .int items;
123
124         .vector movement;
125         .vector v_angle;
126
127 // TODO
128         #define IS_CLIENT(s)                                            (s).isplayermodel
129         #define IS_PLAYER(s)                                            (s).isplayermodel
130         #define isPushable(s)                                           (s).isplayermodel
131
132         //float player_multijump;
133         //float player_jumpheight;
134
135         #define TICRATE ticrate
136
137         #define PHYS_INPUT_ANGLES(s)                            input_angles
138 // TODO
139         #define PHYS_WORLD_ANGLES(s)                            input_angles
140
141         #define PHYS_INPUT_TIMELENGTH                           input_timelength
142         #define PHYS_INPUT_FRAMETIME                            serverdeltatime
143
144         #define PHYS_INPUT_MOVEVALUES(s)                        input_movevalues
145
146         #define PHYS_INPUT_BUTTON_MASK(s)               (input_buttons | BIT(7) * (input_movevalues.x < 0) | BIT(8) * (input_movevalues.x > 0) | BIT(9) * (input_movevalues.y < 0) | BIT(10) * (input_movevalues.y > 0))
147         #define PHYS_INPUT_BUTTON_ATCK(s)                       boolean(input_buttons & BIT(0))
148         #define PHYS_INPUT_BUTTON_JUMP(s)                       boolean(input_buttons & BIT(1))
149         #define PHYS_INPUT_BUTTON_ATCK2(s)                      boolean(input_buttons & BIT(2))
150         #define PHYS_INPUT_BUTTON_ZOOM(s)                       boolean(input_buttons & BIT(3))
151         #define PHYS_INPUT_BUTTON_CROUCH(s)                     boolean(input_buttons & BIT(4))
152         #define PHYS_INPUT_BUTTON_HOOK(s)                       boolean(input_buttons & BIT(5))
153         #define PHYS_INPUT_BUTTON_USE(s)                        boolean(input_buttons & BIT(6))
154         #define PHYS_INPUT_BUTTON_BACKWARD(s)           boolean(input_buttons & BIT(7))
155         #define PHYS_INPUT_BUTTON_FORWARD(s)            boolean(input_buttons & BIT(8))
156         #define PHYS_INPUT_BUTTON_LEFT(s)                       boolean(input_buttons & BIT(9))
157         #define PHYS_INPUT_BUTTON_RIGHT(s)                      boolean(input_buttons & BIT(10))
158         #define PHYS_INPUT_BUTTON_JETPACK(s)            boolean(input_buttons & BIT(12))
159
160         #define PHYS_DEAD(s)                                            s.csqcmodel_isdead
161
162         #define GAMEPLAYFIX_GRAVITYUNAFFECTEDBYTICRATE  (boolean(moveflags & MOVEFLAG_GRAVITYUNAFFECTEDBYTICRATE))
163         #define GAMEPLAYFIX_NOGRAVITYONGROUND                   (boolean(moveflags & MOVEFLAG_NOGRAVITYONGROUND))
164         #define GAMEPLAYFIX_Q2AIRACCELERATE                             (boolean(moveflags & MOVEFLAG_Q2AIRACCELERATE))
165
166         #define IS_DUCKED(s)                                            boolean(s.flags & FL_DUCKED)
167         #define SET_DUCKED(s)                                           s.flags |= FL_DUCKED
168         #define UNSET_DUCKED(s)                                         s.flags &= ~FL_DUCKED
169
170         #define IS_JUMP_HELD(s)                                         !(s.flags & FL_JUMPRELEASED)
171         #define SET_JUMP_HELD(s)                                        s.flags &= ~FL_JUMPRELEASED
172         #define UNSET_JUMP_HELD(s)                                      s.flags |= FL_JUMPRELEASED
173
174         #define IS_ONGROUND(s)                                          boolean(s.flags & FL_ONGROUND)
175         #define SET_ONGROUND(s)                                         s.flags |= FL_ONGROUND
176         #define UNSET_ONGROUND(s)                                       s.flags &= ~FL_ONGROUND
177
178         #define WAS_ONGROUND(s)                                         boolean(s.lastflags & FL_ONGROUND)
179
180         #define ITEMS_STAT(s)                                           (s).items
181
182         #define PHYS_JUMPSPEEDCAP_MIN                           cvar_string("cl_jumpspeedcap_min")
183         #define PHYS_JUMPSPEEDCAP_MAX                           cvar_string("cl_jumpspeedcap_max")
184
185         #define PHYS_CL_TRACK_CANJUMP(s)            STAT(MOVEVARS_CL_TRACK_CANJUMP, s)
186         // FIXME: 0 doesn't mean zero gravity
187         #define PHYS_ENTGRAVITY(s)                  STAT(MOVEVARS_ENTGRAVITY, s)
188
189 #elif defined(SVQC)
190
191         bool Physics_Valid(string thecvar);
192
193         .float stat_sv_airspeedlimit_nonqw = _STAT(MOVEVARS_AIRSPEEDLIMIT_NONQW);
194         .float stat_sv_maxspeed = _STAT(MOVEVARS_MAXSPEED);
195
196         /** Not real stats */
197         .string stat_jumpspeedcap_min, stat_jumpspeedcap_max;
198
199         #define TICRATE sys_frametime
200
201         #define PHYS_INPUT_ANGLES(s)                            s.v_angle
202         #define PHYS_WORLD_ANGLES(s)                            s.angles
203
204         #define PHYS_INPUT_TIMELENGTH                           frametime
205         #define PHYS_INPUT_FRAMETIME                            sys_frametime
206
207         #define PHYS_INPUT_MOVEVALUES(s)                        s.movement
208         // TODO: cache
209         #define PHYS_INPUT_BUTTON_MASK(s)               (s.BUTTON_ATCK | 2 * s.BUTTON_JUMP | 4 * s.BUTTON_ATCK2 | 8 * s.BUTTON_ZOOM | 16 * s.BUTTON_CROUCH | 32 * s.BUTTON_HOOK | 64 * s.BUTTON_USE | 128 * (s.movement_x < 0) | 256 * (s.movement_x > 0) | 512 * (s.movement_y < 0) | 1024 * (s.movement_y > 0))
210         #define PHYS_INPUT_BUTTON_ATCK(s)                       s.BUTTON_ATCK
211         #define PHYS_INPUT_BUTTON_JUMP(s)                       s.BUTTON_JUMP
212         #define PHYS_INPUT_BUTTON_ATCK2(s)                      s.BUTTON_ATCK2
213         #define PHYS_INPUT_BUTTON_ZOOM(s)                       s.BUTTON_ZOOM
214         #define PHYS_INPUT_BUTTON_CROUCH(s)                     s.BUTTON_CROUCH
215         #define PHYS_INPUT_BUTTON_HOOK(s)                       s.BUTTON_HOOK
216         #define PHYS_INPUT_BUTTON_USE(s)                        s.BUTTON_USE
217         #define PHYS_INPUT_BUTTON_BACKWARD(s)           (s.movement_x < 0)
218         #define PHYS_INPUT_BUTTON_FORWARD(s)            (s.movement_x > 0)
219         #define PHYS_INPUT_BUTTON_LEFT(s)                       (s.movement_y < 0)
220         #define PHYS_INPUT_BUTTON_RIGHT(s)                      (s.movement_y > 0)
221         #define PHYS_INPUT_BUTTON_JETPACK(s)            s.BUTTON_JETPACK
222
223         #define PHYS_DEAD(s)                                            s.deadflag != DEAD_NO
224
225         #define GAMEPLAYFIX_GRAVITYUNAFFECTEDBYTICRATE  autocvar_sv_gameplayfix_gravityunaffectedbyticrate
226         #define GAMEPLAYFIX_NOGRAVITYONGROUND                   autocvar_sv_gameplayfix_nogravityonground
227         #define GAMEPLAYFIX_Q2AIRACCELERATE                             autocvar_sv_gameplayfix_q2airaccelerate
228
229         #define IS_DUCKED(s)                                            s.crouch
230         #define SET_DUCKED(s)                                           s.crouch = true
231         #define UNSET_DUCKED(s)                                         s.crouch = false
232
233         #define IS_JUMP_HELD(s)                                         !(s.flags & FL_JUMPRELEASED)
234         #define SET_JUMP_HELD(s)                                        s.flags &= ~FL_JUMPRELEASED
235         #define UNSET_JUMP_HELD(s)                                      s.flags |= FL_JUMPRELEASED
236
237         #define IS_ONGROUND(s)                                          boolean(s.flags & FL_ONGROUND)
238         #define SET_ONGROUND(s)                                         s.flags |= FL_ONGROUND
239         #define UNSET_ONGROUND(s)                                       s.flags &= ~FL_ONGROUND
240
241         #define WAS_ONGROUND(s)                                         boolean((s).lastflags & FL_ONGROUND)
242
243         #define ITEMS_STAT(s)                                           s.items
244
245         #define PHYS_JUMPSPEEDCAP_MIN                           autocvar_sv_jumpspeedcap_min
246         #define PHYS_JUMPSPEEDCAP_MAX                           autocvar_sv_jumpspeedcap_max
247
248         #define PHYS_CL_TRACK_CANJUMP(s)                        s.cvar_cl_movement_track_canjump
249         #define PHYS_ENTGRAVITY(s)                                      s.gravity
250
251 #endif
252 #endif