]> icculus.org git repositories - divverent/nexuiz.git/blob - attic/TeamNexuiz/game/gamec/cl_physics.c
moved navnodeedit & TeamNexuiz to attic
[divverent/nexuiz.git] / attic / TeamNexuiz / game / gamec / cl_physics.c
1 float sv_accelerate;\r
2 float sv_maxairspeed;\r
3 float sv_friction;\r
4 float sv_maxspeed;\r
5 float sv_stopspeed;\r
6 float sv_gravity;\r
7 .float ladder_time;\r
8 .entity ladder_entity;\r
9 .float gravity;\r
10 .float slip_time;\r
11 .float slip_amount;\r
12 \r
13 vector HorizVelocity(vector vel)\r
14 {\r
15         vel_z = 0;\r
16         return vel;\r
17 }\r
18 \r
19 void CapPlayerVelocity(entity pl, float classmaxspeed)\r
20 {\r
21         if(self.jump_pad || self.hook.state)\r
22                 return;\r
23         vector wishvel;\r
24         // prevent bunnyhopping\r
25         wishvel = pl.velocity;\r
26         wishvel_z = 0;\r
27         if(vlen(wishvel) > classmaxspeed)\r
28         {\r
29                 wishvel = normalize(wishvel) * classmaxspeed;\r
30                 pl.velocity_x = wishvel_x;\r
31                 pl.velocity_y = wishvel_y;\r
32         }\r
33 }\r
34 \r
35 void MauveBot_AI();\r
36 \r
37 void SV_PlayerPhysics()\r
38 {\r
39         if (self.is_building == 1 || self.is_feigning == 1)\r
40         {\r
41                 self.velocity = '0 0 0';\r
42                 return;\r
43         }\r
44 \r
45         local vector wishvel, wishdir, v;\r
46         local float wishspeed, prevspeed, f;\r
47 \r
48         local float classmaxspeed, classmaxairspeed, classstopspeed;\r
49 \r
50         MauveBot_AI();\r
51 \r
52         if (self.movetype == MOVETYPE_NONE)\r
53                 return;\r
54 \r
55         if (self.punchangle != '0 0 0')\r
56         {\r
57                 f = vlen(self.punchangle) - 10 * frametime;\r
58                 if (f > 0)\r
59                         self.punchangle = normalize(self.punchangle) * f;\r
60                 else\r
61                         self.punchangle = '0 0 0';\r
62         }\r
63 \r
64         if (self.punchvector != '0 0 0')\r
65         {\r
66                 f = vlen(self.punchvector) - 30 * frametime;\r
67                 if (f > 0)\r
68                         self.punchvector = normalize(self.punchvector) * f;\r
69                 else\r
70                         self.punchvector = '0 0 0';\r
71         }\r
72 \r
73         // if dead, behave differently\r
74         if (self.deadflag)\r
75                 return;\r
76 \r
77         // determine the max speed this class can move at\r
78         SetPlayerSpeed(self);\r
79         classmaxspeed = self.speed;\r
80 \r
81         if (self.leg_damage)                    // Railgun does leg damage :D\r
82         {\r
83                 if ((self.leg_damage > 6))\r
84                 {\r
85                         self.leg_damage = 6;\r
86                 }\r
87                 classmaxspeed = (classmaxspeed * ((10 - self.leg_damage) / 10));\r
88         }\r
89 \r
90         if(classmaxspeed < 0)\r
91                 classmaxspeed = sv_maxspeed;\r
92 \r
93         // help the slower players climb slopes a little more easily\r
94         classstopspeed = sv_stopspeed * (self.speed / sv_maxspeed);\r
95 \r
96         if (!self.fixangle)\r
97         {\r
98                 self.angles_x = 0;\r
99                 self.angles_y = self.v_angle_y;\r
100                 self.angles_z = 0;\r
101         }\r
102 \r
103         if (self.flags & FL_WATERJUMP )\r
104         {\r
105                 self.velocity_x = self.movedir_x;\r
106                 self.velocity_y = self.movedir_y;\r
107                 if (time > self.teleport_time || self.waterlevel == 0)\r
108                 {\r
109                         self.flags = self.flags - (self.flags & FL_WATERJUMP);\r
110                         self.teleport_time = 0;\r
111                 }\r
112         }\r
113         else if (self.movetype == MOVETYPE_NOCLIP || (self.movetype == MOVETYPE_FLY && !self.hook.state))\r
114         {\r
115                 // noclipping or flying\r
116                 self.velocity = self.velocity * (1 - frametime * sv_friction);\r
117                 makevectors(self.v_angle);\r
118                 //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z;\r
119                 wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;\r
120                 // acceleration\r
121                 wishdir = normalize(wishvel);\r
122                 wishspeed = vlen(wishvel);\r
123                 if (wishspeed > classmaxspeed)//sv_maxspeed)\r
124                         wishspeed = classmaxspeed;//sv_maxspeed;\r
125                 if (time >= self.teleport_time)\r
126                 {\r
127                         f = wishspeed - (self.velocity * wishdir);\r
128                         if (f > 0)\r
129                                 self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);\r
130                 }\r
131         }\r
132         else if (self.waterlevel >= 2)\r
133         {\r
134                 // swimming\r
135                 makevectors(self.v_angle);\r
136                 //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z;\r
137                 wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;\r
138                 if (wishvel == '0 0 0')\r
139                         wishvel = '0 0 -60'; // drift towards bottom\r
140 \r
141                 wishdir = normalize(wishvel);\r
142                 wishspeed = vlen(wishvel);\r
143                 if (wishspeed > classmaxspeed)//sv_maxspeed)\r
144                         wishspeed = classmaxspeed;//sv_maxspeed;\r
145                 wishspeed = wishspeed * 0.7;\r
146 \r
147                 //if(self.jump_pad || self.hook.state)\r
148                 //{\r
149                 //      //wishspeed = wishspeed * cvar("sv_jumppad_control"); // give player limited control on a jump pad\r
150                 //      wishspeed = cvar("sv_jumppad_control"); // give player limited control on a jump pad\r
151                 //}\r
152 \r
153                 // water friction\r
154                 self.velocity = self.velocity * (1 - frametime * sv_friction);\r
155 \r
156                 // water acceleration\r
157                 f = wishspeed - (self.velocity * wishdir);\r
158                 if (f > 0)\r
159                         self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);\r
160                 CapPlayerVelocity(self, classmaxspeed);\r
161         }\r
162         else if (time < self.ladder_time)\r
163         {\r
164                 if (self.ladder_entity.classname == "scout_rope")\r
165                 {\r
166                         // friction\r
167                         self.velocity = self.velocity * (1 - frametime * sv_friction);\r
168 \r
169                         makevectors(self.v_angle);\r
170 \r
171                         // forward makes you move up, backward makes you move down.\r
172                         wishvel = '0 0 1' * self.movement_x + v_right * self.movement_y;\r
173                         // also push forward when reaching the top\r
174                         if(//self.movement_x > 0 && \r
175                                 (self.origin_z + self.mins_z*0.9 > self.ladder_entity.origin_z + self.ladder_entity.maxs_z))\r
176                                 wishvel = wishvel + v_forward * self.movement_x;\r
177 \r
178                         // negate gravity\r
179                         if (self.gravity)\r
180                                 self.velocity_z = self.velocity_z + self.gravity * sv_gravity * frametime;\r
181                         else\r
182                                 self.velocity_z = self.velocity_z + sv_gravity * frametime;\r
183 \r
184                         // acceleration\r
185                         wishdir = normalize(wishvel);\r
186                         wishspeed = vlen(wishvel);\r
187 \r
188 \r
189                         if (wishspeed > classmaxspeed)//sv_maxspeed)\r
190                                 wishspeed = classmaxspeed;//sv_maxspeed;\r
191                         if (time >= self.teleport_time)\r
192                         {\r
193                                 f = wishspeed - (self.velocity * wishdir);\r
194                                 if (f > 0)\r
195                                         self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);\r
196                         }\r
197                         CapPlayerVelocity(self, classmaxspeed);\r
198                 }\r
199                 else\r
200                 {\r
201                         // on a func_ladder or swimming in func_water\r
202                         self.velocity = self.velocity * (1 - frametime * sv_friction);\r
203                         makevectors(self.v_angle);\r
204                         //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z;\r
205                         wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;\r
206                         if (self.gravity)\r
207                                 self.velocity_z = self.velocity_z + self.gravity * sv_gravity * frametime;\r
208                         else\r
209                                 self.velocity_z = self.velocity_z + sv_gravity * frametime;\r
210                         if (self.ladder_entity.classname == "func_water")\r
211                         {\r
212                                 f = vlen(wishvel);\r
213                                 if (f > self.ladder_entity.speed)\r
214                                         wishvel = wishvel * (self.ladder_entity.speed / f);\r
215 \r
216                                 self.watertype = self.ladder_entity.skin;\r
217                                 f = self.ladder_entity.origin_z + self.ladder_entity.maxs_z;\r
218                                 if ((self.origin_z + self.view_ofs_z) < f)\r
219                                         self.waterlevel = 3;\r
220                                 else if ((self.origin_z + (self.mins_z + self.maxs_z) * 0.5) < f)\r
221                                         self.waterlevel = 2;\r
222                                 else if ((self.origin_z + self.mins_z + 1) < f)\r
223                                         self.waterlevel = 1;\r
224                                 else\r
225                                 {\r
226                                         self.waterlevel = 0;\r
227                                         self.watertype = CONTENT_EMPTY;\r
228                                 }\r
229                         }\r
230                         // acceleration\r
231                         wishdir = normalize(wishvel);\r
232                         wishspeed = vlen(wishvel);\r
233 \r
234 \r
235                         if (wishspeed > classmaxspeed)//sv_maxspeed)\r
236                                 wishspeed = classmaxspeed;//sv_maxspeed;\r
237                         if (time >= self.teleport_time)\r
238                         {\r
239                                 f = wishspeed - (self.velocity * wishdir);\r
240                                 if (f > 0)\r
241                                         self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);\r
242                         }\r
243                         CapPlayerVelocity(self, classmaxspeed);\r
244                 }\r
245         }\r
246         else if (self.flags & FL_ONGROUND)\r
247         {\r
248                 // walking\r
249                 makevectors(self.v_angle_y * '0 1 0');\r
250                 wishvel = v_forward * self.movement_x + v_right * self.movement_y;\r
251                 // friction\r
252                 if (self.velocity_x || self.velocity_y)\r
253                 {\r
254                         v = self.velocity;\r
255                         v_z = 0;\r
256                         f = vlen(v);\r
257                         if (self.slip_time > time)\r
258                                 sv_friction = sv_friction / self.slip_amount;\r
259                         if (f < classstopspeed)//sv_stopspeed)\r
260                                 f = 1 - frametime * (classstopspeed / f) * sv_friction;//sv_stopspeed / f) * sv_friction;\r
261                         else\r
262                                 f = 1 - frametime * sv_friction;\r
263                         if (f > 0)\r
264                                 self.velocity = self.velocity * f;\r
265                         else\r
266                                 self.velocity = '0 0 0';\r
267                 }\r
268                 // acceleration\r
269                 wishdir = normalize(wishvel);\r
270                 wishspeed = vlen(wishvel);\r
271                 if(self.jump_pad || self.hook.state)\r
272                 {\r
273                         //wishspeed = wishspeed * cvar("sv_jumppad_control"); // give player limited control on a jump pad\r
274                         wishspeed = cvar("sv_jumppad_control"); // give player limited control on a jump pad\r
275                 }\r
276 \r
277                 if (wishspeed > classmaxspeed)//sv_maxspeed)\r
278                         wishspeed = classmaxspeed;//sv_maxspeed;\r
279                 if (time >= self.teleport_time)\r
280                 {\r
281                         f = wishspeed - (self.velocity * wishdir);\r
282                         if (f > 0)\r
283                                 self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);\r
284                 }\r
285 \r
286                 CapPlayerVelocity(self, classmaxspeed);\r
287         }\r
288         else\r
289         {\r
290                 classmaxairspeed = classmaxspeed;//*0.8;\r
291                 if(self.jump_pad || self.hook.state) // allow limited air control and upper velocity when coming off a jump pad\r
292                         prevspeed = vlen(HorizVelocity(self.velocity));\r
293                 else\r
294                         prevspeed = classmaxairspeed;\r
295                 // airborn\r
296                 makevectors(self.v_angle_y * '0 1 0');\r
297                 wishvel = v_forward * self.movement_x + v_right * self.movement_y;\r
298                 // acceleration\r
299                 wishdir = normalize(wishvel);\r
300                 wishspeed = vlen(wishvel);\r
301 \r
302                 if(self.jump_pad || self.hook.state)\r
303                 {\r
304                         //wishspeed = wishspeed * cvar("sv_jumppad_control"); // give player limited control on a jump pad\r
305                         wishspeed = cvar("sv_jumppad_control"); // give player limited control on a jump pad\r
306                 }\r
307 \r
308                 if (wishspeed > classmaxairspeed)//sv_maxairspeed)\r
309                         wishspeed = classmaxairspeed;//sv_maxairspeed;\r
310                 if (time >= self.teleport_time)\r
311                 {\r
312                         f = wishspeed;// - (self.velocity * wishdir);\r
313                         if (f > 0)\r
314                                 self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);\r
315                 }\r
316                 CapPlayerVelocity(self, max(prevspeed, classmaxairspeed));\r
317         }\r
318 };\r