]> icculus.org git repositories - divverent/nexuiz.git/blob - qcsrc/gamec/cl_physics.c
added PRYDON_CLIENTCURSOR and moved and corrected DP_SV_BOTCLIENT
[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.crouch)
69                         wishspeed = wishspeed * 0.5;
70                 wishspeed = wishspeed * 0.6;
71                 // acceleration
72                 f = wishspeed - (self.velocity * wishdir);
73                 if (f > 0)
74                         self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);
75                 return;
76         }
77
78         if (time < self.ladder_time)
79         {
80                 // on a func_ladder or swimming in func_water
81                 wishvel = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;
82                 wishdir = normalize(wishvel);
83                 wishspeed = vlen(wishvel);
84                 if (wishspeed > sv_maxspeed)
85                         wishspeed = sv_maxspeed;
86                 if (self.crouch)
87                         wishspeed = wishspeed * 0.5;
88                 if (self.ladder_entity.classname == "func_water")
89                 {
90                         if (wishspeed > self.ladder_entity.speed)
91                                 wishspeed = self.ladder_entity.speed;
92                         self.watertype = self.ladder_entity.skin;
93                         f = self.ladder_entity.origin_z + self.ladder_entity.maxs_z;
94                         if ((self.origin_z + self.view_ofs_z) < f)
95                                 self.waterlevel = 3;
96                         else if ((self.origin_z + (self.mins_z + self.maxs_z) * 0.5) < f)
97                                 self.waterlevel = 2;
98                         else if ((self.origin_z + self.mins_z + 1) < f)
99                                 self.waterlevel = 1;
100                         else
101                         {
102                                 self.waterlevel = 0;
103                                 self.watertype = CONTENT_EMPTY;
104                         }
105                 }
106                 // friction
107                 self.velocity = self.velocity * (1 - frametime * sv_friction);
108                 // acceleration
109                 f = wishspeed - (self.velocity * wishdir);
110                 if (f > 0)
111                         self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);
112                 return;
113         }
114
115         // calculate wishvel/wishdir/wishspeed for normal walking
116         makevectors(self.v_angle_y * '0 1 0');
117         // hack to not let you back into teleporter
118         if (time < self.teleport_time && self.movement_x < 0)
119                 wishvel = v_right * self.movement_y;
120         else
121                 wishvel = v_forward * self.movement_x + v_right * self.movement_y;
122         wishdir = normalize(wishvel);
123         wishspeed = vlen(wishvel);
124         if (wishspeed > sv_maxspeed)
125                 wishspeed = sv_maxspeed;
126         if (self.crouch)
127                 wishspeed = wishspeed * 0.5;
128
129         if (self.flags & FL_ONGROUND) // walking
130         {
131                 // friction
132                 if (self.velocity_x || self.velocity_y)
133                 {
134                         v = self.velocity;
135                         v_z = 0;
136                         f = vlen(v);
137
138                         // apply friction
139                         if (f < sv_stopspeed)
140                                 f = 1 - frametime * (sv_stopspeed / f) * sv_friction;
141                         else
142                                 f = 1 - frametime * sv_friction;
143
144                         if (f < 0)
145                                 self.velocity = '0 0 0';
146                         else
147                                 self.velocity = self.velocity * f;
148                 }
149         }
150         else if (wishspeed > cvar("g_balance_maxairspeed"))
151                         wishspeed = cvar("g_balance_maxairspeed");
152                 //sv_accelerate = sv_accelerate * 0.1;
153
154         self.velocity = self.velocity + wishdir * sv_accelerate * frametime * wishspeed;
155 }