Thanks...it's a cool snippet and I could translate it to c-script! Though it diden't solve my issue...the way I'm tracing probable causes the problem...
I post some more code here...hoping for a solution
Code:
function ang_lerp(&resultVec,&srcVec,&destVec,blendFactor)
{
var lerp_vec_ang[3];
vec_set(resultVec, srcVec); // Copy source into result
vec_diff(lerp_vec_ang.pan, destVec, resultVec); // Difference vector
lerp_vec_ang.pan = ang(lerp_vec_ang.pan); // Adjust angle validity
lerp_vec_ang.tilt = 0;//ang(lerp_vec_ang.tilt);
lerp_vec_ang.roll = 0;//ang(lerp_vec_ang.roll);
vec_scale(lerp_vec_ang.pan, blendFactor); // Interpolate the rotation
vec_add(resultVec, lerp_vec_ang.pan); // Apply interpolated angle
return(resultVec); // Return result angle
}
function trace_angle(dist,ang_dist)
{
my.check_x = my.x + fcos(my.pan+ang_dist,dist);
my.check_y = my.y + fsin(my.pan+ang_dist,dist);
my.check_z = my.z + 10;
return(c_trace(my.x,my.check_x,ignore_me + ignore_passable + ignore_passents + ignore_sprites));
}
function avoid_obstacle(&vec)
{
var face_pos[3];//used to set position then distance
var dist1;
var dist2;
var dist3;
var turn_state;
turn_state = 0;
// this is for normal turning to the player
if(turn_state == 0){
vec_diff(face_pos,my.x, vec.x);
dist1 = trace_angle(my.obj_avoid_trace_dist,-my.obj_avoid_ang_dist); // right angle checking
dist2 = trace_angle(my.obj_avoid_trace_dist,my.obj_avoid_ang_dist); // left angle checking
if(dist1 == 0 && dist2 == 0){
dist3 = (c_trace(vector((my.x + cos(my.pan) * (my.max_x + (my.obj_avoid_trace_dist/2))),(my.y + sin(my.pan) * (my.max_x + (my.obj_avoid_trace_dist/2))),my.z + (my.max_z)),vector((my.x + cos(my.pan) * (my.max_x + (my.obj_avoid_trace_dist/2))),(my.y + sin(my.pan) * (my.max_x + (my.obj_avoid_trace_dist/2))),my.z - (my.max_z + (my.max_z/1.5))),ignore_me + ignore_passable + ignore_passents + ignore_sprites + use_box));
vec_diff(temp,vector((my.x + cos(my.pan) * (my.max_x + (my.obj_avoid_trace_dist/2))),(my.y + sin(my.pan) * (my.max_x + (my.obj_avoid_trace_dist/2))),my.z + (my.max_z)),vector((my.x + cos(my.pan) * (my.max_x + (my.obj_avoid_trace_dist/2))),(my.y + sin(my.pan) * (my.max_x + (my.obj_avoid_trace_dist/2))),my.z - (my.max_z + (my.max_z/1.5))));//store difference of distance in temp
if(dist3 > (my.max_z * 2) && normal.z < 0.8 || normal.z > 1.2){
if (my.f_animblend != f_stand)
{
my.f_blendframe = f_stand;
}
my.speed_x = 0;
}
if(dist3 > ((my.max_z - my.min_z)/4) && dist3 < ((my.max_z - my.min_z)/2.75) && you != player){
jumping();
}
}
}
// alter states if dist1 or dist2 returns > 0
if(dist1 > 0 && turn_state == 0){turn_state = 1;}
if(dist2 > 0 && turn_state == 0){turn_state = 2;}
if(turn_state == 1){
dist1 = trace_angle(my.obj_avoid_trace_dist,my.obj_avoid_ang_dist);
vec_diff(face_pos,my.x,my.check_x);
if(dist1 == 0){turn_state = 0;} // back to normal state
}
if(turn_state == 2){
dist1 = 0;
dist2 = trace_angle(my.obj_avoid_trace_dist,-my.obj_avoid_ang_dist);
vec_diff(face_pos,my.x,my.check_x);
if(dist2 == 0){turn_state = 0;} // back to normal state
}
//do the turning
vec_to_angle(temp.pan, face_pos.x); // Angle from me to you
ang_lerp(my.ang_force_pan, my.pan, temp.pan, 0.8 * time_step); // Turn to you softly
}
The "my.ang_force_pan" is then used in c_rotate of the enemy action