function ladder_event()
{
if(you)
{
if(you == player)
{
my.enable_impact = off; //prevent the event to be triggered again and again during climbing
vec_set(my.skill21,player.x); //store the players position
while(1)
{
proc_late();
climb = 1;
player.z = my.skill23;
my.skill30 = c_move(player,ladder_movement,nullvector,ignore_passable|ignore_passents|glide); //move the player up or down
if(camera.tilt > - 40)
{
ladder_movement.z = 25 * (key_w - key_s)*time_step;
}
if(camera.tilt < - 40)
{
ladder_movement.z = 25 * (key_s - key_w)*time_step;
}
ladder_movement.x = 0;
ladder_movement.y = 25*(key_a - key_d)*time_step;
vec_set(pos1,my.x);
vec_set(pos2,vector(1,0,0));
vec_rotate(pos2,my.pan);
vec_add(pos2,my.x);
vec_set(pos3,vector(0,0,1));
vec_rotate(pos3,my.pan);
vec_add(pos3,my.x);
vec_diff(dir1,pos1,pos2);
vec_diff(dir2,pos2,pos3);
vec_cross(ladder_normal,dir1,dir2);
vec_normalize(ladder_normal,1);
_result = (vec_dot(player.x,ladder_normal)-vec_dot(my.x,ladder_normal))/sqrt( vec_dot(ladder_normal,ladder_normal) );
vec_set(trace_coords.x, vector(400, 0, 0));
vec_rotate(trace_coords.x, player.pan);
vec_add(trace_coords.x, player.x);
c_trace(player.x, trace_coords.x, IGNORE_ME | GLIDE);
if(trace_hit){allow_climb = 1;}else{allow_climb = 0;}
if(vec_dist(vector(my.skill21,my.skill22,0),vector(player.x,player.y,0)) > 64 || key_space == 1)
{
climb = 0;
break;
}
my.skill23 = player.z;
wait(1);
}
climb = 0;
wait(-0.1);
my.enable_impact = on;
}
}
}