okay, get_user_aiming is great, but it seems to be ... bad too. You have to look at them in a certain way. Is there a way that you don't? I was thinking mabye a tace line, and if you happen to hit them.. But That still.
I was looking for a solution something along the lines of...
fm_find_user_in_view() (Returns entid). It would be the closet to where you are aiming. The person.
How would you go about doing something like this?
I looked at a few things VEN made, but they were.. per person.. Soo.. Yeah. How would you? Whats the best way even though It may be heavy on the server.
Exolent[jNr]
04-22-2008, 07:23
new Float:vOrigin[3];
pev(id, pev_origin, vOrigin);
new Float:vLook[3];
fm_get_aim_origin(id, vLook);
new Float:vReturn[3];
new ent = fm_trace_line(id, vOrigin, vLook, vReturn);
if(pev_valid(ent))
{
// vReturn contains where you are aiming at the entity
}
#include <fakemeta>
#include <xs>
stock find_closest_aim_target(id)
{
new aim;
get_user_aiming(id, aim);
if( is_user_alive(aim) )
return aim;
new players[32], pnum, temp_id, i;
get_players( players, pnum, "a" );
new temp_dist, last_dist = 9999;
new Float:origin[3], aimvec[3], Float:f_aimvec[3], Float:temp_origin[3];
pev( id, pev_origin, origin );
get_user_origin( id, aimvec, 1 );
IVecFVec( aimvec, f_aimvec );
for( i = 0; i < pnum; i++ ){
temp_id = players[i];
pev( temp_id, pev_origin, temp_origin );
temp_dist = get_distance_to_line( origin, f_aimvec, temp_origin );
if( temp_dist > -1 && temp_dist < last_dist ){
last_dist = temp_dist;
aim = temp_id;
}
}
return aim;
}
stock get_distance_to_line(Float:pos_start[3], Float:pos_end[3], Float:pos_object[3])
{
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 = vector_length(vec_start_object)
new Float:angle_start = floatacos(xs_vec_dot(vec_start_end, vec_start_object) / (vector_length(vec_start_end) * len_start_object), degrees)
new Float:angle_end = floatacos(xs_vec_dot(vec_end_start, vec_end_object) / (vector_length(vec_end_start) * vector_length(vec_end_object)), degrees)
if(angle_start <= 90.0 && angle_end <= 90.0)
return floatround(len_start_object * floatsin(angle_start, degrees))
return -1
}
vBulletin® v3.8.7, Copyright ©2000-2024, vBulletin Solutions, Inc.