sorry for double posting..... just remembered...

The following code in the first if(movement_mode==0) branch:

IF (z_force < -2) { //are we falling?

vec_set(temp,my.x); //scan in front of player to see if he has hit a wall
temp.x += 30 * cos(my.pan);
temp.y += 30 * sin(my.pan);
temp.z = my.z + player_head_height; //scan at head height
trace_mode = ignore_me+ignore_sprites+ignore_models;
result = trace(my.x,temp);
IF(result == 0) {
ledge_grab_test = 0;
} ELSE {
IF (result > 0) && (ledge_grab_test == 0) {
vec_to_angle(temp,normal.x);
IF (abs(ang(my.pan - (temp.pan - 180))) < 30) {
temp2.pan = (temp.pan - 180); //make player face towards ladder
vec_set(temp,target.x); //scan to see if there is space up above player for it to grab onto ledge
temp.x += 10 * cos(temp2.pan);
temp.y += 10 * sin(temp2.pan);
temp.z += player_head_height - 2; //scan at head height
target.z += 10;
trace_mode = ignore_me+ignore_sprites+ignore_models;
result = trace(temp.x,target.x);
// vec_to_angle(temp,target.x);
IF (result > 0) { //if we have a wall in the way, and the surface above is less than a 10 degree slant
vec_set(temp,my.x); //scan to see if there is space up above player for it to grab onto ledge
temp.z += player_head_height - 2; //scan at head height
trace_mode = ignore_me+ignore_sprites+ignore_models;
result = trace(temp.x,target.x);
IF (result == 0) { //scan above head to make sure we didn't hit a roof
ledge_grab_test = 1;
movement_mode = 10;
my.pan = temp2.pan; //make player face towards ladder
}
}
}
}
}


can be safely replaced by the following with NO problems at all. tested it out myself.... Asu can see, the code is much shorter and easier to execute...

IF (z_force < -2) { //are we falling?

vec_set(temp, my.x);//trace straight from belly
temp.x += 30 * cos(my.pan);
temp.y += 30 * sin(my.pan);
temp.z += 30;
vec_set(temp3, my.x);
temp3.z += 30;
trace_mode = ignore_me+ignore_sprites+ignore_models;
result = trace(temp3, temp);
if(result> 0 && ledge_grab_test == 0)
{
//IF (abs(ang(my.pan - (temp.pan - 180))) < 30)
//{
vec_to_angle(temp,normal.x);
temp2.pan = (temp.pan - 180);
vec_set(temp, my.x);
temp.z += 42;
vec_set(temp3.x, my.x);
temp3.z += 42;
temp3.x += 30 * cos(my.pan);
temp3.y += 30 * sin(my.pan);
trace_mode = ignore_me+ignore_sprites+ignore_models;
result = trace(temp, temp3);
if(result ==0)
{
vec_set(temp,my.x); //scan to see if there is space up above player for it to grab onto ledge
temp.z += 50; //scan at head height
trace_mode = ignore_me+ignore_sprites+ignore_models;
result = trace(temp.x,target.x);
if(result == 0)
{
ledge_grab_test = 1;
movement_mode = 10;
//move_vec.z =0;
my.pan = temp2.pan; //make player face towards ladder
}






}
}

//IF (abs(ang(my.pan - (temp.pan - 180))) < 30)
//}
else
{
ledge_grab_test = 0;
}

}
else
{
ledge_grab_test = 0;
}