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