From 1dabe6a6728fd0da32cb86460f3eb3492136e503 Mon Sep 17 00:00:00 2001 From: LightCat Date: Mon, 28 Jan 2019 16:46:38 +0100 Subject: [PATCH] Improve auto backstab some more --- src/hacks/AutoBackstab.cpp | 79 ++++++++++++++++++++++++++++---------- 1 file changed, 59 insertions(+), 20 deletions(-) diff --git a/src/hacks/AutoBackstab.cpp b/src/hacks/AutoBackstab.cpp index 80701909..879cc774 100644 --- a/src/hacks/AutoBackstab.cpp +++ b/src/hacks/AutoBackstab.cpp @@ -68,7 +68,7 @@ static void doRageBackstab() float swingrange = re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W)); Vector newangle = g_pLocalPlayer->v_OrigViewangles; std::vector yangles; - for (newangle.y = -180.0f; newangle.y < 180.0f; newangle.y += 2.0f) + for (newangle.y = -180.0f; newangle.y < 180.0f; newangle.y += 1.0f) { trace_t trace; Ray_t ray; @@ -89,14 +89,31 @@ static void doRageBackstab() } if (!yangles.empty()) { - newangle.y = yangles.at(std::floor((float) yangles.size() / 2)); + std::sort(yangles.begin(), yangles.end(), [](float &a, float &b) { return a < b; }); + newangle.y = (yangles.at(0) + yangles.at(yangles.size() - 1)) / 2.0f; current_user_cmd->buttons |= IN_ATTACK; current_user_cmd->viewangles = newangle; g_pLocalPlayer->bUseSilentAngles = true; return; } } - +static float bestdist = FLT_MAX; +static hacks::shared::backtrack::BacktrackData besttick; +static void getClosestTick(CachedEntity *ent, std::vector blacklisted_tickcount) +{ + bestdist = FLT_MAX; + auto &btd = hacks::shared::backtrack::headPositions[ent->m_IDX]; + for (auto &i : btd) + { + if (!blacklisted_tickcount.empty() && std::find(blacklisted_tickcount.begin(), blacklisted_tickcount.end(), i.tickcount) != blacklisted_tickcount.end()) + continue; + if (i.entorigin.DistTo(g_pLocalPlayer->v_Eye) < bestdist) + { + besttick = i; + bestdist = i.entorigin.DistTo(g_pLocalPlayer->v_Eye); + } + } +} static void doBacktrackStab() { float swingrange = re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W)); @@ -106,33 +123,55 @@ static void doBacktrackStab() ent = ENTITY(hacks::shared::backtrack::iBestTarget); if (!ent->m_bEnemy() || !player_tools::shouldTarget(ent)) return; - - auto &btd = hacks::shared::backtrack::headPositions[ent->m_IDX]; Vector newangle = g_pLocalPlayer->v_OrigViewangles; - for (auto &i : btd) + static std::vector blacklisted_ticks; + besttick = {}; + getClosestTick(ent, blacklisted_ticks); + if (besttick.simtime <= 0.0f) + return; + std::vector yangles; + for (newangle.y = -180.0f; newangle.y < 180.0f; newangle.y += 1.0f) { - std::vector yangles; - for (newangle.y = -180.0f; newangle.y < 180.0f; newangle.y += 2.0f) + if (!hacks::shared::backtrack::ValidTick(besttick, ent)) + continue; + if (!angleCheck(ent, besttick.entorigin, newangle)) + continue; + Vector hit; + if (hacks::shared::triggerbot::CheckLineBox(besttick.collidable.min, besttick.collidable.max, g_pLocalPlayer->v_Eye, GetForwardVector(g_pLocalPlayer->v_Eye, newangle, swingrange), hit)) { - if (!hacks::shared::backtrack::ValidTick(i, ent)) + yangles.push_back(newangle.y); + } + } + int tries = 0; + while (yangles.empty() && tries < 10) + { + tries++; + blacklisted_ticks.push_back(besttick.tickcount); + getClosestTick(ent, blacklisted_ticks); + if (besttick.simtime <= 0.0f) + return; + for (newangle.y = -180.0f; newangle.y < 180.0f; newangle.y += 1.0f) + { + if (!hacks::shared::backtrack::ValidTick(besttick, ent)) continue; - if (!angleCheck(ent, i.entorigin, newangle)) + if (!angleCheck(ent, besttick.entorigin, newangle)) continue; Vector hit; - if (hacks::shared::triggerbot::CheckLineBox(i.collidable.min, i.collidable.max, g_pLocalPlayer->v_Eye, GetForwardVector(g_pLocalPlayer->v_Eye, newangle, swingrange), hit)) + if (hacks::shared::triggerbot::CheckLineBox(besttick.collidable.min, besttick.collidable.max, g_pLocalPlayer->v_Eye, GetForwardVector(g_pLocalPlayer->v_Eye, newangle, swingrange), hit)) { yangles.push_back(newangle.y); } } - if (!yangles.empty()) - { - newangle.y = yangles.at(std::floor((float) yangles.size() / 2)); - current_user_cmd->tick_count = i.tickcount; - current_user_cmd->viewangles = newangle; - current_user_cmd->buttons |= IN_ATTACK; - g_pLocalPlayer->bUseSilentAngles = true; - return; - } + } + if (!yangles.empty()) + { + std::sort(yangles.begin(), yangles.end(), [](float &a, float &b) { return a < b; }); + newangle.y = (yangles.at(0) + yangles.at(yangles.size() - 1)) / 2.0f; + current_user_cmd->tick_count = besttick.tickcount; + current_user_cmd->viewangles = newangle; + current_user_cmd->buttons |= IN_ATTACK; + g_pLocalPlayer->bUseSilentAngles = true; + return; } }