]> icculus.org git repositories - divverent/nexuiz.git/blob - qcsrc/gamec/cl_physics.c
Adding mauvebib's bots
[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.velocity = self.velocity * (1 - frametime * sv_friction);
64                 makevectors(self.v_angle);
65                 //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z;
66                 wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;
67                 // acceleration
68                 wishdir = normalize(wishvel);
69                 wishspeed = vlen(wishvel);
70                 if (wishspeed > sv_maxspeed)
71                         wishspeed = sv_maxspeed;
72                 if (time >= self.teleport_time)
73                 {
74                         f = wishspeed - (self.velocity * wishdir);
75                         if (f > 0)
76                                 self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);
77                 }
78         }
79         else if (self.waterlevel >= 2)
80         {
81                 // swimming
82                 makevectors(self.v_angle);
83                 //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z;
84                 wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;
85                 if (wishvel == '0 0 0')
86                         wishvel = '0 0 -60'; // drift towards bottom
87
88                 wishdir = normalize(wishvel);
89                 wishspeed = vlen(wishvel);
90                 if (wishspeed > sv_maxspeed)
91                         wishspeed = sv_maxspeed;
92                 wishspeed = wishspeed * 0.7;
93
94                 // water friction
95                 self.velocity = self.velocity * (1 - frametime * sv_friction);
96
97                 // water acceleration
98                 f = wishspeed - (self.velocity * wishdir);
99                 if (f > 0)
100                         self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);
101         }
102         else if (time < self.ladder_time)
103         {
104                 // on a func_ladder or swimming in func_water
105                 self.velocity = self.velocity * (1 - frametime * sv_friction);
106                 makevectors(self.v_angle);
107                 //wishvel = v_forward * self.movement_x + v_right * self.movement_y + v_up * self.movement_z;
108                 wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;
109                 if (self.gravity)
110                         self.velocity_z = self.velocity_z + self.gravity * sv_gravity * frametime;
111                 else
112                         self.velocity_z = self.velocity_z + sv_gravity * frametime;
113                 if (self.ladder_entity.classname == "func_water")
114                 {
115                         f = vlen(wishvel);
116                         if (f > self.ladder_entity.speed)
117                                 wishvel = wishvel * (self.ladder_entity.speed / f);
118
119                         self.watertype = self.ladder_entity.skin;
120                         f = self.ladder_entity.origin_z + self.ladder_entity.maxs_z;
121                         if ((self.origin_z + self.view_ofs_z) < f)
122                                 self.waterlevel = 3;
123                         else if ((self.origin_z + (self.mins_z + self.maxs_z) * 0.5) < f)
124                                 self.waterlevel = 2;
125                         else if ((self.origin_z + self.mins_z + 1) < f)
126                                 self.waterlevel = 1;
127                         else
128                         {
129                                 self.waterlevel = 0;
130                                 self.watertype = CONTENT_EMPTY;
131                         }
132                 }
133                 // acceleration
134                 wishdir = normalize(wishvel);
135                 wishspeed = vlen(wishvel);
136                 if (wishspeed > sv_maxspeed)
137                         wishspeed = sv_maxspeed;
138                 if (time >= self.teleport_time)
139                 {
140                         f = wishspeed - (self.velocity * wishdir);
141                         if (f > 0)
142                                 self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);
143                 }
144         }
145         else if (self.flags & FL_ONGROUND)
146         {
147                 // walking
148                 makevectors(self.v_angle_y * '0 1 0');
149                 wishvel = v_forward * self.movement_x + v_right * self.movement_y;
150                 // friction
151                 if (self.velocity_x || self.velocity_y)
152                 {
153                         v = self.velocity;
154                         v_z = 0;
155                         f = vlen(v);
156                         if (f < sv_stopspeed)
157                                 f = 1 - frametime * (sv_stopspeed / f) * sv_friction;
158                         else
159                                 f = 1 - frametime * sv_friction;
160                         if (f > 0)
161                                 self.velocity = self.velocity * f;
162                         else
163                                 self.velocity = '0 0 0';
164                 }
165                 // acceleration
166                 wishdir = normalize(wishvel);
167                 wishspeed = vlen(wishvel);
168                 if (wishspeed > sv_maxspeed)
169                         wishspeed = sv_maxspeed;
170                 if (self.button5) // crouch
171                         wishspeed = wishspeed * 0.5;
172                 if (time >= self.teleport_time)
173                 {
174                         f = wishspeed - (self.velocity * wishdir);
175                         if (f > 0)
176                                 self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);
177                 }
178         }
179         else
180         {
181                 // airborn
182                 makevectors(self.v_angle_y * '0 1 0');
183                 wishvel = v_forward * self.movement_x + v_right * self.movement_y;
184                 // acceleration
185                 wishdir = normalize(wishvel);
186                 wishspeed = vlen(wishvel);
187                 if (wishspeed > sv_maxairspeed)
188                         wishspeed = sv_maxairspeed;
189                 if (self.button5) // crouch
190                         wishspeed = wishspeed * 0.5;
191                 if (time >= self.teleport_time)
192                 {
193                         f = wishspeed;// - (self.velocity * wishdir);
194                         if (f > 0)
195                                 self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);
196                 }
197         }
198 };