]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/gamec/cl_physics.c
added minstagib mutator, killmessages and a first bunch of announcer messages (soundf...
[divverent/nexuiz.git] / data / qcsrc / gamec / cl_physics.c
1 float sv_accelerate;
2 float sv_maxairspeed;
3 float sv_friction;
4 float sv_maxspeed;
5 float sv_stopspeed;
6 float sv_gravity;
7 .float ladder_time;
8 .entity ladder_entity;
9 .float gravity;
10
11 void SV_PlayerPhysics()
12 {
13         local vector wishvel, wishdir, v;
14         local float wishspeed, f, maxspd_mod, spd, maxairspd, airaccel;
15         string temps;
16
17         MauveBot_AI();
18
19         if (self.movetype == MOVETYPE_NONE)
20                 return;
21
22         if (self.punchangle != '0 0 0')
23         {
24                 f = vlen(self.punchangle) - 10 * frametime;
25                 if (f > 0)
26                         self.punchangle = normalize(self.punchangle) * f;
27                 else
28                         self.punchangle = '0 0 0';
29         }
30
31         if (self.punchvector != '0 0 0')
32         {
33                 f = vlen(self.punchvector) - 30 * frametime;
34                 if (f > 0)
35                         self.punchvector = normalize(self.punchvector) * f;
36                 else
37                         self.punchvector = '0 0 0';
38         }
39
40         maxspd_mod = 1;
41
42         if(cvar("g_runematch"))
43         {
44                 if(self.runes & RUNE_SPEED)
45                 {
46                         if(self.runes & CURSE_SLOW)
47                                 maxspd_mod = maxspd_mod * cvar("g_balance_rune_speed_combo_moverate");
48                         else
49                                 maxspd_mod = maxspd_mod * cvar("g_balance_rune_speed_moverate");
50                 }
51                 else if(self.runes & CURSE_SLOW)
52                 {
53                         maxspd_mod = maxspd_mod * cvar("g_balance_curse_slow_moverate");
54                 }
55         }
56
57         if(cvar("g_minstagib") && (self.items & IT_INVINCIBLE))
58         {
59                 maxspd_mod = maxspd_mod * cvar("g_balance_rune_speed_moverate");
60         }
61
62         spd = sv_maxspeed * maxspd_mod;
63
64         if(self.speed != spd)
65         {
66                 self.speed = spd;
67                 temps = ftos(spd);
68                 stuffcmd(self, strcat("cl_forwardspeed ", temps, "\n"));
69                 stuffcmd(self, strcat("cl_backspeed ", temps, "\n"));
70                 stuffcmd(self, strcat("cl_sidespeed ", temps, "\n"));
71                 stuffcmd(self, strcat("cl_upspeed ", temps, "\n"));
72
73                 temps = ftos(sv_accelerate * maxspd_mod);
74                 stuffcmd(self, strcat("cl_movement_accelerate ", temps, "\n"));
75         }
76
77         // if dead, behave differently
78         if (self.deadflag)
79                 return;
80
81         if (!self.fixangle)
82         {
83                 self.angles_x = 0;
84                 self.angles_y = self.v_angle_y;
85                 self.angles_z = 0;
86         }
87
88         if (self.flags & FL_WATERJUMP )
89         {
90                 self.velocity_x = self.movedir_x;
91                 self.velocity_y = self.movedir_y;
92                 if (time > self.teleport_time || self.waterlevel == 0)
93                 {
94                         self.flags = self.flags - (self.flags & FL_WATERJUMP);
95                         self.teleport_time = 0;
96                 }
97         }
98         else if (self.movetype == MOVETYPE_NOCLIP || self.movetype == MOVETYPE_FLY)
99         {
100                 // noclipping or flying
101                 self.flags = self.flags - (self.flags & FL_ONGROUND);
102
103                 self.velocity = self.velocity * (1 - frametime * sv_friction);
104                 makevectors(self.v_angle);
105                 //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z;
106                 wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;
107                 // acceleration
108                 wishdir = normalize(wishvel);
109                 wishspeed = vlen(wishvel);
110                 if (wishspeed > sv_maxspeed*maxspd_mod)
111                         wishspeed = sv_maxspeed*maxspd_mod;
112                 if (time >= self.teleport_time)
113                 {
114                         f = wishspeed - (self.velocity * wishdir);
115                         if (f > 0)
116                                 self.velocity = self.velocity + wishdir * min(f, sv_accelerate*maxspd_mod * frametime * wishspeed);
117                 }
118         }
119         else if (self.waterlevel >= 2)
120         {
121                 // swimming
122                 self.flags = self.flags - (self.flags & FL_ONGROUND);
123
124                 makevectors(self.v_angle);
125                 //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z;
126                 wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;
127                 if (wishvel == '0 0 0')
128                         wishvel = '0 0 -60'; // drift towards bottom
129
130                 wishdir = normalize(wishvel);
131                 wishspeed = vlen(wishvel);
132                 if (wishspeed > sv_maxspeed*maxspd_mod)
133                         wishspeed = sv_maxspeed*maxspd_mod;
134                 wishspeed = wishspeed * 0.7;
135
136                 // water friction
137                 self.velocity = self.velocity * (1 - frametime * sv_friction);
138
139                 // water acceleration
140                 f = wishspeed - (self.velocity * wishdir);
141                 if (f > 0)
142                         self.velocity = self.velocity + wishdir * min(f, sv_accelerate*maxspd_mod * frametime * wishspeed);
143         }
144         else if (time < self.ladder_time)
145         {
146                 // on a func_ladder or swimming in func_water
147                 self.flags = self.flags - (self.flags & FL_ONGROUND);
148
149                 self.velocity = self.velocity * (1 - frametime * sv_friction);
150                 makevectors(self.v_angle);
151                 //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z;
152                 wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;
153                 if (self.gravity)
154                         self.velocity_z = self.velocity_z + self.gravity * sv_gravity * frametime;
155                 else
156                         self.velocity_z = self.velocity_z + sv_gravity * frametime;
157                 if (self.ladder_entity.classname == "func_water")
158                 {
159                         f = vlen(wishvel);
160                         if (f > self.ladder_entity.speed)
161                                 wishvel = wishvel * (self.ladder_entity.speed / f);
162
163                         self.watertype = self.ladder_entity.skin;
164                         f = self.ladder_entity.origin_z + self.ladder_entity.maxs_z;
165                         if ((self.origin_z + self.view_ofs_z) < f)
166                                 self.waterlevel = 3;
167                         else if ((self.origin_z + (self.mins_z + self.maxs_z) * 0.5) < f)
168                                 self.waterlevel = 2;
169                         else if ((self.origin_z + self.mins_z + 1) < f)
170                                 self.waterlevel = 1;
171                         else
172                         {
173                                 self.waterlevel = 0;
174                                 self.watertype = CONTENT_EMPTY;
175                         }
176                 }
177                 // acceleration
178                 wishdir = normalize(wishvel);
179                 wishspeed = vlen(wishvel);
180                 if (wishspeed > sv_maxspeed)
181                         wishspeed = sv_maxspeed;
182                 if (time >= self.teleport_time)
183                 {
184                         f = wishspeed - (self.velocity * wishdir);
185                         if (f > 0)
186                                 self.velocity = self.velocity + wishdir * min(f, sv_accelerate*maxspd_mod * frametime * wishspeed);
187                 }
188         }
189         else if (self.flags & FL_ONGROUND)
190         {
191                 // walking
192                 makevectors(self.v_angle_y * '0 1 0');
193                 wishvel = v_forward * self.movement_x + v_right * self.movement_y;
194                 // friction
195                 if (self.velocity_x || self.velocity_y)
196                 {
197                         v = self.velocity;
198                         v_z = 0;
199                         f = vlen(v);
200                         if (f < sv_stopspeed)
201                                 f = 1 - frametime * (sv_stopspeed / f) * sv_friction;
202                         else
203                                 f = 1 - frametime * sv_friction;
204                         if (f > 0)
205                                 self.velocity = self.velocity * f;
206                         else
207                                 self.velocity = '0 0 0';
208                 }
209                 // acceleration
210                 wishdir = normalize(wishvel);
211                 wishspeed = vlen(wishvel);
212                 if (wishspeed > sv_maxspeed*maxspd_mod)
213                         wishspeed = sv_maxspeed*maxspd_mod;
214                 if (self.button5) // crouch
215                         wishspeed = wishspeed * 0.5;
216                 if (time >= self.teleport_time)
217                 {
218                         f = wishspeed - (self.velocity * wishdir);
219                         if (f > 0)
220                                 self.velocity = self.velocity + wishdir * min(f, sv_accelerate*maxspd_mod * frametime * wishspeed);
221                 }
222         }
223         else
224         {
225                 if(maxspd_mod < 1)
226                 {
227                         maxairspd = sv_maxairspeed*maxspd_mod;
228                         airaccel = sv_accelerate*maxspd_mod;
229                 }
230                 else
231                 {
232                         maxairspd = sv_maxairspeed;
233                         airaccel = sv_accelerate;
234                 }
235                 // airborn
236                 makevectors(self.v_angle_y * '0 1 0');
237                 wishvel = v_forward * self.movement_x + v_right * self.movement_y;
238                 // acceleration
239                 wishdir = normalize(wishvel);
240                 wishspeed = vlen(wishvel);
241                 if (wishspeed > maxairspd)
242                         wishspeed = maxairspd;
243                 if (self.button5) // crouch
244                         wishspeed = wishspeed * 0.5;
245                 if (time >= self.teleport_time)
246                 {
247                         f = wishspeed;// - (self.velocity * wishdir);
248                         if (f > 0)
249                                 self.velocity = self.velocity + wishdir * min(f, airaccel * frametime * wishspeed);
250                 }
251         }
252 };