PDA

View Full Version : get_user_aiming help


Styles
04-22-2008, 03:14
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
}

Emp`
04-22-2008, 10:05
#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
}