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