]> icculus.org git repositories - divverent/nexuiz.git/blob - qcsrc/gamec/cl_physics.c
Got rid of the gamecfgs stuff, added timing for the weapon switch, add savage's secre...
[divverent/nexuiz.git] / qcsrc / gamec / cl_physics.c
1 float sv_maxspeed, sv_friction, sv_accelerate, sv_stopspeed;
2 .float ladder_time;
3 .entity ladder_entity;
4
5 void SV_PlayerPhysics()
6 {
7         local vector wishvel, wishdir, v;
8         local float wishspeed, f;
9
10         if (self.movetype == MOVETYPE_NONE)
11                 return;
12
13         if (self.punchangle != '0 0 0')
14         {
15                 f = vlen(self.punchangle) - 10 * frametime;
16                 if (f > 0)
17                         self.punchangle = normalize(self.punchangle) * f;
18                 else
19                         self.punchangle = '0 0 0';
20         }
21
22         // if dead, behave differently
23         if (self.health <= 0)
24                 return;
25
26         // show 1/3 the pitch angle and all the roll angle
27         self.angles_x = 0;
28         self.angles_y = self.v_angle_y; // FIXME: rotate the models, not the entity!
29         self.angles_z = 0;
30
31 /*      if (!self.fixangle)
32         {
33                 self.angles_x = (self.v_angle_x + self.punchangle_x) * -0.333;
34                 self.angles_y = self.v_angle_y + self.punchangle_y;
35         }*/
36         
37         if (self.flags & FL_WATERJUMP )
38         {
39                 self.velocity_x = self.movedir_x;
40                 self.velocity_y = self.movedir_y;
41                 if (time > self.teleport_time || self.waterlevel == 0)
42                 {
43                         self.flags = self.flags - (self.flags & FL_WATERJUMP);
44                         self.teleport_time = 0;
45                 }
46                 return;
47         }
48
49         makevectors(self.v_angle);
50
51         if (self.movetype == MOVETYPE_NOCLIP)
52         {
53                 // noclip
54                 self.velocity = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;
55                 return;
56         }
57
58         if (self.waterlevel >= 2)
59         {
60                 // swimming
61                 // friction
62                 self.velocity = self.velocity * (1 - frametime * sv_friction);
63                 wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;
64                 wishdir = normalize(wishvel);
65                 wishspeed = vlen(wishvel);
66                 if (wishspeed > sv_maxspeed)
67                         wishspeed = sv_maxspeed;
68                 if (self.items & IT_SPEED)
69                         wishspeed = wishspeed * POWERUP_SPEED_MOVEMENT;
70                 if (self.crouch)
71                         wishspeed = wishspeed * 0.5;
72                 wishspeed = wishspeed * 0.6;
73                 // acceleration
74                 f = wishspeed - (self.velocity * wishdir);
75                 if (f > 0)
76                         self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);
77                 return;
78         }
79
80         if (time < self.ladder_time)
81         {
82                 // on a func_ladder or swimming in func_water
83                 wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;
84                 wishdir = normalize(wishvel);
85                 wishspeed = vlen(wishvel);
86                 if (wishspeed > sv_maxspeed)
87                         wishspeed = sv_maxspeed;
88                 if (self.items & IT_SPEED)
89                         wishspeed = wishspeed * POWERUP_SPEED_MOVEMENT;
90                 if (self.crouch)
91                         wishspeed = wishspeed * 0.5;
92                 if (self.ladder_entity.classname == "func_water")
93                 {
94                         if (wishspeed > self.ladder_entity.speed)
95                                 wishspeed = self.ladder_entity.speed;
96                         self.watertype = self.ladder_entity.skin;
97                         f = self.ladder_entity.origin_z + self.ladder_entity.maxs_z;
98                         if ((self.origin_z + self.view_ofs_z) < f)
99                                 self.waterlevel = 3;
100                         else if ((self.origin_z + (self.mins_z + self.maxs_z) * 0.5) < f)
101                                 self.waterlevel = 2;
102                         else if ((self.origin_z + self.mins_z + 1) < f)
103                                 self.waterlevel = 1;
104                         else
105                         {
106                                 self.waterlevel = 0;
107                                 self.watertype = CONTENT_EMPTY;
108                         }
109                 }
110                 // friction
111                 self.velocity = self.velocity * (1 - frametime * sv_friction);
112                 // acceleration
113                 f = wishspeed - (self.velocity * wishdir);
114                 if (f > 0)
115                         self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);
116                 return;
117         }
118
119         // calculate wishvel/wishdir/wishspeed for normal walking
120         makevectors(self.v_angle_y * '0 1 0');
121         // hack to not let you back into teleporter
122         if (time < self.teleport_time && self.movement_x < 0)
123                 wishvel = v_right * self.movement_y;
124         else
125                 wishvel = v_forward * self.movement_x + v_right * self.movement_y;
126         wishdir = normalize(wishvel);
127         wishspeed = vlen(wishvel);
128         if (wishspeed > sv_maxspeed)
129                 wishspeed = sv_maxspeed;
130         if (self.items & IT_SPEED)
131                 wishspeed = wishspeed * POWERUP_SPEED_MOVEMENT;
132         if (self.crouch)
133                 wishspeed = wishspeed * 0.5;
134
135         if (self.flags & FL_ONGROUND) // walking
136         {
137                 // friction
138                 if (self.velocity_x || self.velocity_y)
139                 {
140                         v = self.velocity;
141                         v_z = 0;
142                         f = vlen(v);
143
144                         // apply friction
145                         if (f < sv_stopspeed)
146                                 f = 1 - frametime * (sv_stopspeed / f) * sv_friction;
147                         else
148                                 f = 1 - frametime * sv_friction;
149
150                         if (f < 0)
151                                 self.velocity = '0 0 0';
152                         else
153                                 self.velocity = self.velocity * f;
154                 }
155         }
156         else if (wishspeed > cvar("g_balance_maxairspeed"))
157                         wishspeed = cvar("g_balance_maxairspeed");
158                 //sv_accelerate = sv_accelerate * 0.1;
159
160         self.velocity = self.velocity + wishdir * sv_accelerate * frametime * wishspeed;
161 }