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