From e43cea56f8fb260f23f3734bea38ce8ae4ebf835 Mon Sep 17 00:00:00 2001 From: Wizzard <25581244+Wizzard@users.noreply.toomuchslop.com> Date: Wed, 20 Sep 2023 09:17:50 -0400 Subject: [PATCH] Updated aim.c --- src/features/aim.c | 57 +++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/src/features/aim.c b/src/features/aim.c index 79324c6..9453e57 100644 --- a/src/features/aim.c +++ b/src/features/aim.c @@ -1,5 +1,6 @@ #include +#include #include "features.h" #include "../include/sdk.h" @@ -12,26 +13,20 @@ /* Scale factor for aim punch */ #define AIM_PUNCH_MULT 2 +static float vec_length(vec3_t v) { + return sqrt(v.x * v.x + v.y * v.y + v.z * v.z); +} + + static bool is_visible(vec3_t start, vec3_t end) { - /* Syntax: PM_TraceLine(start, end, flags, usehulll, ignore_pe); */ - pmtrace_t* tr = - i_engine->PM_TraceLine(start, end, PM_TRACELINE_PHYSENTSONLY, 2, -1); - - /* We didn't hit a valid entity */ - if (tr->ent <= 0) - return false; - - /* Get entity index from physents, check if we can't get a valid player */ + pmtrace_t* tr = i_engine->PM_TraceLine(start, end, PM_TRACELINE_PHYSENTSONLY, 2, -1); + if (tr->ent <= 0) return false; const int ent_idx = i_pmove->physents[tr->ent].info; - if (!get_player(ent_idx)) - return false; - - /* We hit a valid player */ - return true; + return get_player(ent_idx) != NULL; } static vec3_t get_closest_delta(vec3_t viewangles) { - /* Compensate aim punch. We get g_punchAngles from CalcRefdef hook */ + // Compensate for aim punch viewangles.x += g_punchAngles.x * AIM_PUNCH_MULT; viewangles.y += g_punchAngles.y * AIM_PUNCH_MULT; viewangles.z += g_punchAngles.z * AIM_PUNCH_MULT; @@ -40,38 +35,44 @@ static vec3_t get_closest_delta(vec3_t viewangles) { i_engine->pEventAPI->EV_LocalPlayerViewheight(view_height); vec3_t local_eyes = vec_add(localplayer->origin, view_height); - /* These 2 vars are used to store the best target across iterations. - * NOTE: The default value of best_fov will be the aimbot fov */ - float best_fov = dz_aimbot->value; + float min_distance = FLT_MAX; // For tracking the closest player + float best_fov = dz_aimbot->value; vec3_t best_delta = { 0, 0, 0 }; for (int i = 1; i <= i_engine->GetMaxClients(); i++) { cl_entity_t* ent = get_player(i); - if (!is_alive(ent) || is_friend(ent)) - continue; + if (!is_alive(ent) || is_friend(ent)) { + continue; // Skip if not alive or is a friend + } - /* TODO: Get bones origin instead of calculating from ent origin */ vec3_t head_pos = ent->origin; - if (ent->curstate.usehull != 1) /* Get head if not crouched */ + if (ent->curstate.usehull != 1) { // Get head if not crouched head_pos.z += HEAD_OFFSET; + } - if (!is_visible(local_eyes, head_pos)) /* We can't see player */ - continue; + float distance = vec_length(vec_sub(ent->origin, local_eyes)); + if (distance > min_distance) { + continue; // Skip players that are further than the current closest target + } const vec3_t enemy_angle = vec_to_ang(vec_sub(head_pos, local_eyes)); - const vec3_t delta = vec_sub(enemy_angle, viewangles); + const vec3_t delta = vec_sub(enemy_angle, viewangles); vec_norm(delta); float fov = hypotf(delta.x, delta.y); - if (fov > 360.0f) + if (fov > 360.0f) { fov = remainderf(fov, 360.0f); - if (fov > 180.0f) + } + if (fov > 180.0f) { fov = 360.0f - fov; + } - if (fov < best_fov) { + // Only check visibility for potential targets + if (fov < best_fov && is_visible(local_eyes, head_pos)) { best_fov = fov; vec_copy(best_delta, delta); + min_distance = distance; // Update the closest target's distance } }