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