|
Senior Member
Join Date: Apr 2012
Location: NY, USA
|
07-21-2017
, 15:39
Re: [INC] Beam Entities
|
#39
|
Spoiler
Quote:
Originally Posted by Emp`
This might be a helpful alternative:
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
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.
|
This is a great alternative, especially when only using one beam.
However you need to be careful if using this with multiple beams, i.e. if you have 10 beams and 10 players, you'd have to call this stock 100 times.
Last edited by vitorrossi; 07-21-2017 at 15:40.
|
|
|
|