//definitions:
#define player_move IGNORE_PASSABLE|GLIDE
#define player_trace IGNORE_PASSABLE|IGNORE_ME|USE_BOX|IGNORE_FLAG2
//Flag2 is used to allow player to collide with specific entities by walking over them.
//loop:
while (!dead)
{
// pan.x:
rsp.x -= key_force.x * aa;
rsp.x = sign(rsp.x) * maxv(0,minv(am,abs(rsp.x)) - (key_force.x == 0) * af);
rot.x = ang(rot.x + rsp.x);
// pan.y:
rsp.y += key_force.y * aa;
rsp.y = sign(rsp.y) * maxv(0,minv(am,abs(rsp.y)) - (key_force.y == 0) * af);
rot.y = clamp(rot.y + rsp.y, -90, 90);
// zspeed:
vec_set(mtv.x,my.x); mtv.z -= 4096;
dst = c_trace(my.x,mtv.x,player_trace);
if (dst > 16)
{
vv = maxv(vv-vg,-16);
}
else
{
vv = maxv(0,vv);
}
if (dst != 0)
{
if (dst < 50) if (key_space) vv = vj;
//c_move(me,nullvector,vector(0,0,vv),IGNORE_PASSABLE|GLIDE);
}
// debug:
//str_for_num((deb_txt.pstring)[0],dst);
// xyspeed:
vec_set(mtv.x,vector(va * (key_w - key_s), va * (key_a - key_d),0));
vec_rotate(mtv.x,vector(rot.x,0,0));
vec_add(vel.x,mtv.x);
vec_normalize(vel.x,maxv(0,minv(vec_length(vel),vm)-vf) );
// move:
c_move(me,nullvector,vector(vel.x,vel.y,vv),player_move);
// camera:
vec_set(camera.x,vector(my.x,my.y,my.z+48));
vec_set(camera.pan,rot.x);
wait(1);
}