Why do you use c_setminmax and then reset the boundingbox to an own size (vec_set(my.min_x,vector(-7,-7,-20));vec_set(my.max_x,vector(7,7,20));)?
And why does the code always use accelerate?
A gravity of 3 seems a bit too high.
c_move should also use IGNORE_PASSENTS and the c_rotate should also use the same modes as the c_trace...

This:
Code:

accelerate(move_to_vector.y, (key_d * strafe_speed * time_step * -1), 0.8); // strafe right
accelerate(move_to_vector.y, (key_a * strafe_speed * time_step), 0.8); // strafe left
accelerate(move_to_vector.x, (key_w * run_speed * time_step), 0.8); // go forward
accelerate(move_to_vector.x, (key_s * run_speed * time_step * -1), 0.8); // go back



could also be done in two lines:
Code:

accelerate(move_to_vector.y, (key_a-key_d) * strafe_speed * time_step, 0.8); // strafe
accelerate(move_to_vector.x, (key_w-key_s) * run_speed * time_step, 0.8); // go



But anyways this could be some good piece of code for beginners and for advanced 3DGS users that don´t want to code everything on their own

@ello: strafing already seems to be in there:
accelerate(move_to_vector.y, (key_d * strafe_speed * time_step * -1), 0.8); // strafe right
accelerate(move_to_vector.y, (key_a * strafe_speed * time_step), 0.8); // strafe left