11 void SV_PlayerPhysics()
13 local vector wishvel, wishdir, v;
14 local float wishspeed, f;
18 if (self.movetype == MOVETYPE_NONE)
21 if (self.punchangle != '0 0 0')
23 f = vlen(self.punchangle) - 10 * frametime;
25 self.punchangle = normalize(self.punchangle) * f;
27 self.punchangle = '0 0 0';
30 if (self.punchvector != '0 0 0')
32 f = vlen(self.punchvector) - 30 * frametime;
34 self.punchvector = normalize(self.punchvector) * f;
36 self.punchvector = '0 0 0';
39 // if dead, behave differently
46 self.angles_y = self.v_angle_y;
50 if (self.flags & FL_WATERJUMP )
52 self.velocity_x = self.movedir_x;
53 self.velocity_y = self.movedir_y;
54 if (time > self.teleport_time || self.waterlevel == 0)
56 self.flags = self.flags - (self.flags & FL_WATERJUMP);
57 self.teleport_time = 0;
60 else if (self.movetype == MOVETYPE_NOCLIP || self.movetype == MOVETYPE_FLY)
62 // noclipping or flying
63 self.flags = self.flags - (self.flags & FL_ONGROUND);
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;
70 wishdir = normalize(wishvel);
71 wishspeed = vlen(wishvel);
72 if (wishspeed > sv_maxspeed)
73 wishspeed = sv_maxspeed;
74 if (time >= self.teleport_time)
76 f = wishspeed - (self.velocity * wishdir);
78 self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);
81 else if (self.waterlevel >= 2)
84 self.flags = self.flags - (self.flags & FL_ONGROUND);
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
92 wishdir = normalize(wishvel);
93 wishspeed = vlen(wishvel);
94 if (wishspeed > sv_maxspeed)
95 wishspeed = sv_maxspeed;
96 wishspeed = wishspeed * 0.7;
99 self.velocity = self.velocity * (1 - frametime * sv_friction);
101 // water acceleration
102 f = wishspeed - (self.velocity * wishdir);
104 self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);
106 else if (time < self.ladder_time)
108 // on a func_ladder or swimming in func_water
109 self.flags = self.flags - (self.flags & FL_ONGROUND);
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;
116 self.velocity_z = self.velocity_z + self.gravity * sv_gravity * frametime;
118 self.velocity_z = self.velocity_z + sv_gravity * frametime;
119 if (self.ladder_entity.classname == "func_water")
122 if (f > self.ladder_entity.speed)
123 wishvel = wishvel * (self.ladder_entity.speed / f);
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)
129 else if ((self.origin_z + (self.mins_z + self.maxs_z) * 0.5) < f)
131 else if ((self.origin_z + self.mins_z + 1) < f)
136 self.watertype = CONTENT_EMPTY;
140 wishdir = normalize(wishvel);
141 wishspeed = vlen(wishvel);
142 if (wishspeed > sv_maxspeed)
143 wishspeed = sv_maxspeed;
144 if (time >= self.teleport_time)
146 f = wishspeed - (self.velocity * wishdir);
148 self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);
151 else if (self.flags & FL_ONGROUND)
154 makevectors(self.v_angle_y * '0 1 0');
155 wishvel = v_forward * self.movement_x + v_right * self.movement_y;
157 if (self.velocity_x || self.velocity_y)
162 if (f < sv_stopspeed)
163 f = 1 - frametime * (sv_stopspeed / f) * sv_friction;
165 f = 1 - frametime * sv_friction;
167 self.velocity = self.velocity * f;
169 self.velocity = '0 0 0';
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)
180 f = wishspeed - (self.velocity * wishdir);
182 self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);
188 makevectors(self.v_angle_y * '0 1 0');
189 wishvel = v_forward * self.movement_x + v_right * self.movement_y;
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)
199 f = wishspeed;// - (self.velocity * wishdir);
201 self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);