1 float sv_maxspeed, sv_friction, sv_accelerate, sv_stopspeed;
5 void SV_PlayerPhysics()
7 local vector wishvel, wishdir, v;
8 local float wishspeed, f;
10 if (self.movetype == MOVETYPE_NONE)
13 if (self.punchangle != '0 0 0')
15 f = vlen(self.punchangle) - 10 * frametime;
17 self.punchangle = normalize(self.punchangle) * f;
19 self.punchangle = '0 0 0';
22 // if dead, behave differently
26 // show 1/3 the pitch angle and all the roll angle
28 self.angles_y = self.v_angle_y; // FIXME: rotate the models, not the entity!
31 /* if (!self.fixangle)
33 self.angles_x = (self.v_angle_x + self.punchangle_x) * -0.333;
34 self.angles_y = self.v_angle_y + self.punchangle_y;
37 if (self.flags & FL_WATERJUMP )
39 self.velocity_x = self.movedir_x;
40 self.velocity_y = self.movedir_y;
41 if (time > self.teleport_time || self.waterlevel == 0)
43 self.flags = self.flags - (self.flags & FL_WATERJUMP);
44 self.teleport_time = 0;
49 makevectors(self.v_angle);
51 if (self.movetype == MOVETYPE_NOCLIP)
54 self.velocity = v_forward * self.movement_x + v_right * self.movement_y + '0 0 1' * self.movement_z;
58 if (self.waterlevel >= 2)
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;
69 wishspeed = wishspeed * 0.5;
70 wishspeed = wishspeed * 0.6;
72 f = wishspeed - (self.velocity * wishdir);
74 self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);
78 if (time < self.ladder_time)
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;
87 wishspeed = wishspeed * 0.5;
88 if (self.ladder_entity.classname == "func_water")
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)
96 else if ((self.origin_z + (self.mins_z + self.maxs_z) * 0.5) < f)
98 else if ((self.origin_z + self.mins_z + 1) < f)
103 self.watertype = CONTENT_EMPTY;
107 self.velocity = self.velocity * (1 - frametime * sv_friction);
109 f = wishspeed - (self.velocity * wishdir);
111 self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);
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;
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;
127 wishspeed = wishspeed * 0.5;
129 if (self.flags & FL_ONGROUND) // walking
132 if (self.velocity_x || self.velocity_y)
139 if (f < sv_stopspeed)
140 f = 1 - frametime * (sv_stopspeed / f) * sv_friction;
142 f = 1 - frametime * sv_friction;
145 self.velocity = '0 0 0';
147 self.velocity = self.velocity * f;
150 else if (wishspeed > cvar("g_balance_maxairspeed"))
151 wishspeed = cvar("g_balance_maxairspeed");
152 //sv_accelerate = sv_accelerate * 0.1;
154 self.velocity = self.velocity + wishdir * sv_accelerate * frametime * wishspeed;