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;
68 if (self.items & IT_SPEED)
69 wishspeed = wishspeed * POWERUP_SPEED_MOVEMENT;
71 wishspeed = wishspeed * 0.5;
72 wishspeed = wishspeed * 0.6;
74 f = wishspeed - (self.velocity * wishdir);
76 self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);
80 if (time < self.ladder_time)
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;
91 wishspeed = wishspeed * 0.5;
92 if (self.ladder_entity.classname == "func_water")
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)
100 else if ((self.origin_z + (self.mins_z + self.maxs_z) * 0.5) < f)
102 else if ((self.origin_z + self.mins_z + 1) < f)
107 self.watertype = CONTENT_EMPTY;
111 self.velocity = self.velocity * (1 - frametime * sv_friction);
113 f = wishspeed - (self.velocity * wishdir);
115 self.velocity = self.velocity + wishdir * min(f, sv_accelerate * frametime * wishspeed);
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;
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;
133 wishspeed = wishspeed * 0.5;
135 if (self.flags & FL_ONGROUND) // walking
138 if (self.velocity_x || self.velocity_y)
145 if (f < sv_stopspeed)
146 f = 1 - frametime * (sv_stopspeed / f) * sv_friction;
148 f = 1 - frametime * sv_friction;
151 self.velocity = '0 0 0';
153 self.velocity = self.velocity * f;
156 else if (wishspeed > cvar("g_balance_maxairspeed"))
157 wishspeed = cvar("g_balance_maxairspeed");
158 //sv_accelerate = sv_accelerate * 0.1;
160 self.velocity = self.velocity + wishdir * sv_accelerate * frametime * wishspeed;