Here a simplified version of only the movement code. The funny thing is move_mode 1 (ducking) works! If I press shift I can turn the player (other movement is not supposed to be possible in this mode). Just move_mode 0 (walking,jumping,etc.) doesn't work.
Code:
while(my.skill3 > 0)
{
//////////////////////////////
// MOVEMENT
//////////////////////////////
if (move_mode == 0) { //standard move_mode
//get the keyboardinput
my.skill21 = (key_pressed(key_forwards)-(key_pressed(key_backwards)/2))*my.skill1;
if (my.skill 21 >= 0) {my.skill22 = (key_pressed(key_left)-key_pressed(key_right))*my.skill1;}
else {my.skill 22 = 0;}
//gravity
vec_set(temp, my.x);
temp.z -= 4000;
check_inair = c_trace(my.x, temp, ignore_me|use_box);
if (check_inair > 10) { // in air?
friction = 0.1;
fallforce = gravity;
anim_mode = 5;
}
else { // ground
if (normal.z < 0.2) //slide if too steep
{
fallforce = gravity;
vec_set(force,vector(0,0,0));
}
else
{
fallforce = 0;
vec_set(force,vector(my.skill21,my.skill22,0));
}
if (key_pressed(key_jump) == 0) && (space_press == 1) { space_press = 0; }
if (key_pressed(key_jump) == 1) && (space_press == 0) && (shooting_pose == 0) {
space_press = 1;
jump_speed = 130;
}
if (shooting_pose == 0) {fallforce += jump_speed*time_step;}
jump_speed = 0; //reset jump_speed
friction = 0.7;
}
//get the mousemovement
my.skill24 = -mouse_force.x*my.skill2*time_step*2;
my.skill25 = mouse_force.y*my.skill2*time_step*2;
//add physics
my.skill21 = time_step*force.x + max(1-time_step*friction,0)*my.skill21;
my.skill22 = time_step*force.y + max(1-time_step*friction,0)*my.skill22;
my.skill30 = time_step*fallforce + max(1-time_step*friction,0)*my.skill30;
vec_set(my.dist_rel,vector(my.skill21*time_step,my.skill22*time_step,0));
vec_set(my.dist_abs,vector(0,0,my.skill30));
//turn and move the player
move_min_z = 0.0;
c_rotate(me,vector(my.skill24,0,0),glide|ignore_passable|ignore_passents);
c_move(me,my.dist_rel,my.dist_abs,glide|ignore_passable|ignore_passents);
} //End of move_mode 0
if (key_pressed(key_duck)) {move_mode = 1;} else {move_mode = 0;} //has to be changed for later move_modes...
if (move_mode == 1) { //duck move_mode
anim_mode = 4;
//gravity
vec_set(temp, my.x);
temp.z -= 4000;
check_inair = c_trace(my.x, temp, ignore_me|use_box);
if (check_inair > 10) { // in air?
friction = 0.1;
fallforce = gravity;
anim_mode = 5;
}
else { // ground
if (normal.z < 0.9) //slide if too steep
{
fallforce = gravity;
}
else
{
fallforce = 0;
}
fallforce = -2 * check_inair;
friction = 0.7;
}
//get the mousemovement
my.skill24 = -mouse_force.x*my.skill2*time_step*2;
my.skill25 = mouse_force.y*my.skill2*time_step*2;
//add physics
my.skill30 = time_step*fallforce + max(1-time_step*friction,0)*my.skill30;
vec_set(my.dist_abs,vector(0,0,my.skill30));
//turn and move the player
move_min_z = 0;
c_rotate(me,vector(my.skill24,0,0),glide|ignore_passable|ignore_passents);
c_move(me,vector(0,0,0),my.dist_abs,glide|ignore_passable|ignore_passents);
} //End of move_mode 1
}