This might be a helpful alternative:
PHP Code:
stock get_distance_to_line(Float:pos_start[3], Float:pos_end[3], Float:pos_object[3])
{ //credits to KoST
new Float:vec_start_end[3], Float:vec_start_object[3], Float:vec_end_object[3], Float:vec_end_start[3]
xs_vec_sub(pos_end, pos_start, vec_start_end) // vector from start to end
xs_vec_sub(pos_object, pos_start, vec_start_object) // vector from end to object
xs_vec_sub(pos_start, pos_end, vec_end_start) // vector from end to start
xs_vec_sub(pos_end, pos_object, vec_end_object) // vector object to end
new Float:len_start_object = getVecLen(vec_start_object)
new Float:angle_start = floatacos(xs_vec_dot(vec_start_end, vec_start_object) / (getVecLen(vec_start_end) * len_start_object), degrees)
new Float:angle_end = floatacos(xs_vec_dot(vec_end_start, vec_end_object) / (getVecLen(vec_end_start) * getVecLen(vec_end_object)), degrees)
if(angle_start <= 90.0 && angle_end <= 90.0)
return floatround(len_start_object * floatsin(angle_start, degrees))
return -1
}
SourcePawn version
PHP Code:
stock Float get_distance_to_line( Float vStart[3], Float vEnd[3], Float vObject[3] )
{
Float vStartEnd[3], vStartObject[3];
SubtractVectors( vEnd, vStart, vStartEnd );
SubtractVectors( vObject, vStart, vStartObject );
Float fStartObject = GetVectorLength( vStartObject );
Float fAngleStart = RadiansToDegrees( ArcCosine( GetVectorDotProduct( vStartEnd, vStartObject ) / ( GetVectorLength( vStartEnd ) * fStartObject ) ) );
if ( fAngleStart > 90.0 )
return fStartObject;
Float vEndObject[3], vEndStart[3];
SubtractVectors( vStart, vEnd, vEndStart );
SubtractVectors( vEnd, vObject, vEndObject );
Float fEndObject = GetVectorLength( vEndObject );
Float fAngleEnd = RadiansToDegrees( ArcCosine( GetVectorDotProduct( vEndStart, vEndObject ) / ( GetVectorLength( vEndStart ) * fEndObject ) ) );
if ( fAngleEnd > 90.0 )
return fEndObject;
return fStartObject * Sine( DegreesToRadians( fAngleStart ) );
}
Instead of using touch, use a loop to check if players are within distance.