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