]> icculus.org git repositories - divverent/nexuiz.git/blob - qcsrc/gamec/cl_physics.c
Fixed a 'hanging ;' warning
[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;
15
16         MauveBot_AI();
17
18         if (self.movetype == MOVETYPE_NONE)
19                 return;
20
21         if (self.punchangle != '0 0 0')
22         {
23                 f = vlen(self.punchangle) - 10 * frametime;
24                 if (f > 0)
25                         self.punchangle = normalize(self.punchangle) * f;
26                 else
27                         self.punchangle = '0 0 0';
28         }
29
30         if (self.punchvector != '0 0 0')
31         {
32                 f = vlen(self.punchvector) - 30 * frametime;
33                 if (f > 0)
34                         self.punchvector = normalize(self.punchvector) * f;
35                 else
36                         self.punchvector = '0 0 0';
37         }
38
39         // if dead, behave differently
40         if (self.deadflag)
41                 return;
42
43         if (!self.fixangle)
44         {
45                 self.angles_x = 0;
46                 self.angles_y = self.v_angle_y;
47                 self.angles_z = 0;
48         }
49
50         if (self.flags & FL_WATERJUMP )
51         {
52                 self.velocity_x = self.movedir_x;
53                 self.velocity_y = self.movedir_y;
54                 if (time > self.teleport_time || self.waterlevel == 0)
55                 {
56                         self.flags = self.flags - (self.flags & FL_WATERJUMP);
57                         self.teleport_time = 0;
58                 }
59         }
60         else if (self.movetype == MOVETYPE_NOCLIP || self.movetype == MOVETYPE_FLY)
61         {
62                 // noclipping or flying
63                 self.flags = self.flags - (self.flags & FL_ONGROUND);
64
65                 self.velocity = self.velocity * (1 - frametime * sv_friction);
66                 makevectors(self.v_angle);
67                 //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z;
68                 wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;
69                 // acceleration
70                 wishdir = normalize(wishvel);
71                 wishspeed = vlen(wishvel);
72                 if (wishspeed > sv_maxspeed)
73                         wishspeed = sv_maxspeed;
74                 if (time >= self.teleport_time)
75                 {
76                         f = wishspeed - (self.velocity * wishdir);
77                         if (f > 0)
78                                 self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);
79                 }
80         }
81         else if (self.waterlevel >= 2)
82         {
83                 // swimming
84                 self.flags = self.flags - (self.flags & FL_ONGROUND);
85
86                 makevectors(self.v_angle);
87                 //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z;
88                 wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;
89                 if (wishvel == '0 0 0')
90                         wishvel = '0 0 -60'; // drift towards bottom
91
92                 wishdir = normalize(wishvel);
93                 wishspeed = vlen(wishvel);
94                 if (wishspeed > sv_maxspeed)
95                         wishspeed = sv_maxspeed;
96                 wishspeed = wishspeed * 0.7;
97
98                 // water friction
99                 self.velocity = self.velocity * (1 - frametime * sv_friction);
100
101                 // water acceleration
102                 f = wishspeed - (self.velocity * wishdir);
103                 if (f > 0)
104                         self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);
105         }
106         else if (time < self.ladder_time)
107         {
108                 // on a func_ladder or swimming in func_water
109                 self.flags = self.flags - (self.flags & FL_ONGROUND);
110
111                 self.velocity = self.velocity * (1 - frametime * sv_friction);
112                 makevectors(self.v_angle);
113                 //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z;
114                 wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;
115                 if (self.gravity)
116                         self.velocity_z = self.velocity_z + self.gravity * sv_gravity * frametime;
117                 else
118                         self.velocity_z = self.velocity_z + sv_gravity * frametime;
119                 if (self.ladder_entity.classname == "func_water")
120                 {
121                         f = vlen(wishvel);
122                         if (f > self.ladder_entity.speed)
123                                 wishvel = wishvel * (self.ladder_entity.speed / f);
124
125                         self.watertype = self.ladder_entity.skin;
126                         f = self.ladder_entity.origin_z + self.ladder_entity.maxs_z;
127                         if ((self.origin_z + self.view_ofs_z) < f)
128                                 self.waterlevel = 3;
129                         else if ((self.origin_z + (self.mins_z + self.maxs_z) * 0.5) < f)
130                                 self.waterlevel = 2;
131                         else if ((self.origin_z + self.mins_z + 1) < f)
132                                 self.waterlevel = 1;
133                         else
134                         {
135                                 self.waterlevel = 0;
136                                 self.watertype = CONTENT_EMPTY;
137                         }
138                 }
139                 // acceleration
140                 wishdir = normalize(wishvel);
141                 wishspeed = vlen(wishvel);
142                 if (wishspeed > sv_maxspeed)
143                         wishspeed = sv_maxspeed;
144                 if (time >= self.teleport_time)
145                 {
146                         f = wishspeed - (self.velocity * wishdir);
147                         if (f > 0)
148                                 self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);
149                 }
150         }
151         else if (self.flags & FL_ONGROUND)
152         {
153                 // walking
154                 makevectors(self.v_angle_y * '0 1 0');
155                 wishvel = v_forward * self.movement_x + v_right * self.movement_y;
156                 // friction
157                 if (self.velocity_x || self.velocity_y)
158                 {
159                         v = self.velocity;
160                         v_z = 0;
161                         f = vlen(v);
162                         if (f < sv_stopspeed)
163                                 f = 1 - frametime * (sv_stopspeed / f) * sv_friction;
164                         else
165                                 f = 1 - frametime * sv_friction;
166                         if (f > 0)
167                                 self.velocity = self.velocity * f;
168                         else
169                                 self.velocity = '0 0 0';
170                 }
171                 // acceleration
172                 wishdir = normalize(wishvel);
173                 wishspeed = vlen(wishvel);
174                 if (wishspeed > sv_maxspeed)
175                         wishspeed = sv_maxspeed;
176                 if (self.button5) // crouch
177                         wishspeed = wishspeed * 0.5;
178                 if (time >= self.teleport_time)
179                 {
180                         f = wishspeed - (self.velocity * wishdir);
181                         if (f > 0)
182                                 self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);
183                 }
184         }
185         else
186         {
187                 // airborn
188                 makevectors(self.v_angle_y * '0 1 0');
189                 wishvel = v_forward * self.movement_x + v_right * self.movement_y;
190                 // acceleration
191                 wishdir = normalize(wishvel);
192                 wishspeed = vlen(wishvel);
193                 if (wishspeed > sv_maxairspeed)
194                         wishspeed = sv_maxairspeed;
195                 if (self.button5) // crouch
196                         wishspeed = wishspeed * 0.5;
197                 if (time >= self.teleport_time)
198                 {
199                         f = wishspeed;// - (self.velocity * wishdir);
200                         if (f > 0)
201                                 self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);
202                 }
203         }
204 };