diff --git a/data/menu/nullifiedcat/weapons/aimbot.xml b/data/menu/nullifiedcat/weapons/aimbot.xml index 1031ed31..d6fff332 100755 --- a/data/menu/nullifiedcat/weapons/aimbot.xml +++ b/data/menu/nullifiedcat/weapons/aimbot.xml @@ -123,6 +123,7 @@ + @@ -140,7 +141,7 @@ - + diff --git a/src/hacks/Aimbot.cpp b/src/hacks/Aimbot.cpp index 76d04a1a..25ea3471 100644 --- a/src/hacks/Aimbot.cpp +++ b/src/hacks/Aimbot.cpp @@ -61,6 +61,7 @@ static settings::Boolean auto_zoom{ "aimbot.auto.zoom", "0" }; static settings::Boolean auto_unzoom{ "aimbot.auto.unzoom", "0" }; static settings::Boolean backtrackAimbot{ "aimbot.backtrack", "0" }; +static settings::Boolean backtrackLastTickOnly("aimbot.backtrack.only-last-tick", "true"); static bool force_backtrack_aimbot = false; static settings::Boolean backtrackVischeckAll{ "aimbot.backtrack.vischeck-all", "0" }; @@ -175,6 +176,27 @@ bool shouldBacktrack(CachedEntity *ent) return true; } +// Reduce Backtrack lag by checking if the ticks hitboxes are within a reasonable FOV range +bool validateTickFOV(tf2::backtrack::BacktrackData &tick) +{ + if (fov) + { + bool valid_fov = false; + for (auto &hitbox : tick.hitboxes) + { + float score = GetFov(g_pLocalPlayer->v_OrigViewangles, g_pLocalPlayer->v_Eye, hitbox.center); + // Check if the FOV is within a 2.0f threshhold + if (score < fov + 2.0f) + { + valid_fov = true; + break; + } + } + return valid_fov; + } + return true; +} + // Am I holding Hitman's Heatmaker ? static bool CarryingHeatmaker() { @@ -514,16 +536,26 @@ CachedEntity *RetrieveBestTarget(bool aimkey_state) { if (shouldBacktrack(target_last)) { - auto good_ticks = hacks::tf2::backtrack::getGoodTicks(target_last); - if (good_ticks) - for (auto &bt_tick : *good_ticks) + auto good_ticks_tmp = hacks::tf2::backtrack::getGoodTicks(target_last); + if (good_ticks_tmp) + { + auto good_ticks = *good_ticks_tmp; + if (backtrackLastTickOnly) { + good_ticks.clear(); + good_ticks.push_back(good_ticks_tmp->back()); + } + for (auto &bt_tick : good_ticks) + { + if (!validateTickFOV(bt_tick)) + continue; hacks::tf2::backtrack::MoveToTick(bt_tick); if (IsTargetStateGood(target_last)) return target_last; // Restore if bad target hacks::tf2::backtrack::RestoreEntity(target_last->m_IDX); } + } } // Check if previous target is still good @@ -551,10 +583,19 @@ CachedEntity *RetrieveBestTarget(bool aimkey_state) static std::optional temp_bt_tick = std::nullopt; if (shouldBacktrack(ent)) { - auto good_ticks = tf2::backtrack::getGoodTicks(ent); - if (good_ticks) - for (auto &bt_tick : *good_ticks) + auto good_ticks_tmp = tf2::backtrack::getGoodTicks(ent); + if (good_ticks_tmp) + { + auto good_ticks = *good_ticks_tmp; + if (backtrackLastTickOnly) { + good_ticks.clear(); + good_ticks.push_back(good_ticks_tmp->back()); + } + for (auto &bt_tick : good_ticks) + { + if (!validateTickFOV(bt_tick)) + continue; hacks::tf2::backtrack::MoveToTick(bt_tick); if (IsTargetStateGood(ent)) { @@ -564,6 +605,7 @@ CachedEntity *RetrieveBestTarget(bool aimkey_state) } hacks::tf2::backtrack::RestoreEntity(ent->m_IDX); } + } } else isTargetGood = IsTargetStateGood(ent);