]> icculus.org git repositories - divverent/nexuiz.git/blob - qcsrc/gamec/cl_physics.c
missing newline in stuffcmd
[divverent/nexuiz.git] / qcsrc / gamec / cl_physics.c
1 float sv_accelerate;
2 float sv_maxairspeed;
3 float sv_friction;
4 float sv_maxspeed;
5 float sv_stopspeed;
6 float sv_gravity;
7 .float ladder_time;
8 .entity ladder_entity;
9 .float gravity;
10
11 void SV_PlayerPhysics()
12 {
13         local vector wishvel, wishdir, v;
14         local float wishspeed, f, maxspd_mod, spd, maxairspd, airaccel;
15         string temps;
16
17         MauveBot_AI();
18
19         if (self.movetype == MOVETYPE_NONE)
20                 return;
21
22         if (self.punchangle != '0 0 0')
23         {
24                 f = vlen(self.punchangle) - 10 * frametime;
25                 if (f > 0)
26                         self.punchangle = normalize(self.punchangle) * f;
27                 else
28                         self.punchangle = '0 0 0';
29         }
30
31         if (self.punchvector != '0 0 0')
32         {
33                 f = vlen(self.punchvector) - 30 * frametime;
34                 if (f > 0)
35                         self.punchvector = normalize(self.punchvector) * f;
36                 else
37                         self.punchvector = '0 0 0';
38         }
39
40         maxspd_mod = 1;
41
42         if(cvar("g_runematch"))
43         {
44                 if(self.runes & RUNE_SPEED)
45                 {
46                         if(self.runes & CURSE_SLOW)
47                                 maxspd_mod = maxspd_mod * cvar("g_balance_rune_speed_combo_moverate");
48                         else
49                                 maxspd_mod = maxspd_mod * cvar("g_balance_rune_speed_moverate");
50                 }
51                 else if(self.runes & CURSE_SLOW)
52                 {
53                         maxspd_mod = maxspd_mod * cvar("g_balance_curse_slow_moverate");
54                 }
55         }
56
57         spd = sv_maxspeed * maxspd_mod;
58
59         if(self.speed != spd)
60         {
61                 self.speed = spd;
62                 temps = ftos(spd);
63                 stuffcmd(self, strcat("cl_forwardspeed ", temps, "\n"));
64                 stuffcmd(self, strcat("cl_backspeed ", temps, "\n"));
65                 stuffcmd(self, strcat("cl_sidespeed ", temps, "\n"));
66                 stuffcmd(self, strcat("cl_upspeed ", temps, "\n"));
67
68                 temps = ftos(sv_accelerate * maxspd_mod);
69                 stuffcmd(self, strcat("cl_movement_accelerate ", temps, "\n"));
70         }
71
72         // if dead, behave differently
73         if (self.deadflag)
74                 return;
75
76         if (!self.fixangle)
77         {
78                 self.angles_x = 0;
79                 self.angles_y = self.v_angle_y;
80                 self.angles_z = 0;
81         }
82
83         if (self.flags & FL_WATERJUMP )
84         {
85                 self.velocity_x = self.movedir_x;
86                 self.velocity_y = self.movedir_y;
87                 if (time > self.teleport_time || self.waterlevel == 0)
88                 {
89                         self.flags = self.flags - (self.flags & FL_WATERJUMP);
90                         self.teleport_time = 0;
91                 }
92         }
93         else if (self.movetype == MOVETYPE_NOCLIP || self.movetype == MOVETYPE_FLY)
94         {
95                 // noclipping or flying
96                 self.flags = self.flags - (self.flags & FL_ONGROUND);
97
98                 self.velocity = self.velocity * (1 - frametime * sv_friction);
99                 makevectors(self.v_angle);
100                 //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z;
101                 wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;
102                 // acceleration
103                 wishdir = normalize(wishvel);
104                 wishspeed = vlen(wishvel);
105                 if (wishspeed > sv_maxspeed*maxspd_mod)
106                         wishspeed = sv_maxspeed*maxspd_mod;
107                 if (time >= self.teleport_time)
108                 {
109                         f = wishspeed - (self.velocity * wishdir);
110                         if (f > 0)
111                                 self.velocity = self.velocity + wishdir * min(f, sv_accelerate*maxspd_mod * frametime * wishspeed);
112                 }
113         }
114         else if (self.waterlevel >= 2)
115         {
116                 // swimming
117                 self.flags = self.flags - (self.flags & FL_ONGROUND);
118
119                 makevectors(self.v_angle);
120                 //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z;
121                 wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;
122                 if (wishvel == '0 0 0')
123                         wishvel = '0 0 -60'; // drift towards bottom
124
125                 wishdir = normalize(wishvel);
126                 wishspeed = vlen(wishvel);
127                 if (wishspeed > sv_maxspeed*maxspd_mod)
128                         wishspeed = sv_maxspeed*maxspd_mod;
129                 wishspeed = wishspeed * 0.7;
130
131                 // water friction
132                 self.velocity = self.velocity * (1 - frametime * sv_friction);
133
134                 // water acceleration
135                 f = wishspeed - (self.velocity * wishdir);
136                 if (f > 0)
137                         self.velocity = self.velocity + wishdir * min(f, sv_accelerate*maxspd_mod * frametime * wishspeed);
138         }
139         else if (time < self.ladder_time)
140         {
141                 // on a func_ladder or swimming in func_water
142                 self.flags = self.flags - (self.flags & FL_ONGROUND);
143
144                 self.velocity = self.velocity * (1 - frametime * sv_friction);
145                 makevectors(self.v_angle);
146                 //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z;
147                 wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;
148                 if (self.gravity)
149                         self.velocity_z = self.velocity_z + self.gravity * sv_gravity * frametime;
150                 else
151                         self.velocity_z = self.velocity_z + sv_gravity * frametime;
152                 if (self.ladder_entity.classname == "func_water")
153                 {
154                         f = vlen(wishvel);
155                         if (f > self.ladder_entity.speed)
156                                 wishvel = wishvel * (self.ladder_entity.speed / f);
157
158                         self.watertype = self.ladder_entity.skin;
159                         f = self.ladder_entity.origin_z + self.ladder_entity.maxs_z;
160                         if ((self.origin_z + self.view_ofs_z) < f)
161                                 self.waterlevel = 3;
162                         else if ((self.origin_z + (self.mins_z + self.maxs_z) * 0.5) < f)
163                                 self.waterlevel = 2;
164                         else if ((self.origin_z + self.mins_z + 1) < f)
165                                 self.waterlevel = 1;
166                         else
167                         {
168                                 self.waterlevel = 0;
169                                 self.watertype = CONTENT_EMPTY;
170                         }
171                 }
172                 // acceleration
173                 wishdir = normalize(wishvel);
174                 wishspeed = vlen(wishvel);
175                 if (wishspeed > sv_maxspeed)
176                         wishspeed = sv_maxspeed;
177                 if (time >= self.teleport_time)
178                 {
179                         f = wishspeed - (self.velocity * wishdir);
180                         if (f > 0)
181                                 self.velocity = self.velocity + wishdir * min(f, sv_accelerate*maxspd_mod * frametime * wishspeed);
182                 }
183         }
184         else if (self.flags & FL_ONGROUND)
185         {
186                 // walking
187                 makevectors(self.v_angle_y * '0 1 0');
188                 wishvel = v_forward * self.movement_x + v_right * self.movement_y;
189                 // friction
190                 if (self.velocity_x || self.velocity_y)
191                 {
192                         v = self.velocity;
193                         v_z = 0;
194                         f = vlen(v);
195                         if (f < sv_stopspeed)
196                                 f = 1 - frametime * (sv_stopspeed / f) * sv_friction;
197                         else
198                                 f = 1 - frametime * sv_friction;
199                         if (f > 0)
200                                 self.velocity = self.velocity * f;
201                         else
202                                 self.velocity = '0 0 0';
203                 }
204                 // acceleration
205                 wishdir = normalize(wishvel);
206                 wishspeed = vlen(wishvel);
207                 if (wishspeed > sv_maxspeed*maxspd_mod)
208                         wishspeed = sv_maxspeed*maxspd_mod;
209                 if (self.button5) // crouch
210                         wishspeed = wishspeed * 0.5;
211                 if (time >= self.teleport_time)
212                 {
213                         f = wishspeed - (self.velocity * wishdir);
214                         if (f > 0)
215                                 self.velocity = self.velocity + wishdir * min(f, sv_accelerate*maxspd_mod * frametime * wishspeed);
216                 }
217         }
218         else
219         {
220                 if(maxspd_mod < 1)
221                 {
222                         maxairspd = sv_maxairspeed*maxspd_mod;
223                         airaccel = sv_accelerate*maxspd_mod;
224                 }
225                 else
226                 {
227                         maxairspd = sv_maxairspeed;
228                         airaccel = sv_accelerate;
229                 }
230                 // airborn
231                 makevectors(self.v_angle_y * '0 1 0');
232                 wishvel = v_forward * self.movement_x + v_right * self.movement_y;
233                 // acceleration
234                 wishdir = normalize(wishvel);
235                 wishspeed = vlen(wishvel);
236                 if (wishspeed > maxairspd)
237                         wishspeed = maxairspd;
238                 if (self.button5) // crouch
239                         wishspeed = wishspeed * 0.5;
240                 if (time >= self.teleport_time)
241                 {
242                         f = wishspeed;// - (self.velocity * wishdir);
243                         if (f > 0)
244                                 self.velocity = self.velocity + wishdir * min(f, airaccel * frametime * wishspeed);
245                 }
246         }
247 };