From ca753b202af37bb97bf6edec0cb4d925b19335f1 Mon Sep 17 00:00:00 2001 From: julianacat Date: Sat, 15 Jul 2017 17:44:40 -0500 Subject: [PATCH] re-added triggerbot presision --- src/hacks/Aimbot.cpp | 31 +++++++++++++--- src/hacks/AutoSticky.cpp | 2 +- src/hacks/Trigger.cpp | 78 +++++++++++++++++++++++++++++++++++++++- src/hacks/Trigger.h | 1 + 4 files changed, 105 insertions(+), 7 deletions(-) diff --git a/src/hacks/Aimbot.cpp b/src/hacks/Aimbot.cpp index 0d4d672c..53d1893a 100644 --- a/src/hacks/Aimbot.cpp +++ b/src/hacks/Aimbot.cpp @@ -526,10 +526,12 @@ bool CanAutoShoot() { IF_GAME (IsTF2()) { - // Check if players current weapon is an ambasador - if (IsAmbassador(g_pLocalPlayer->weapon())) { - // Check if ambasador can headshot - if (!AmbassadorCanHeadshot()) return false; + if (wait_for_charge) { + // Check if players current weapon is an ambasador + if (IsAmbassador(g_pLocalPlayer->weapon())) { + // Check if ambasador can headshot + if (!AmbassadorCanHeadshot()) return false; + } } } @@ -551,6 +553,25 @@ bool CanAutoShoot() { // Return false due to setting not allowing autoshoot return false; } + static CatVar displace(CV_INT, "displace", "4", "Expand 2D Box", "Expand 2D box by N units"); +Vector SimpleThonkPrediction(CachedEntity* ent, int hb) { + if (!ent) return Vector(); + Vector result; + GetHitbox(ent, hb, result); + float latency = g_IEngine->GetNetChannelInfo()->GetLatency(FLOW_OUTGOING) + + g_IEngine->GetNetChannelInfo()->GetLatency(FLOW_INCOMING); + result -= CE_VECTOR(ent, netvar.vVelocity) * (int)displace; + return result; +} + +Vector SimpleDisplacementPrediction(CachedEntity* ent, int hb) { + if (!ent) return Vector(); + Vector result; + GetHitbox(ent, hb, result); + Vector displacement = RAW_ENT(ent)->GetAbsOrigin() - ent->m_vecOrigin; + result += displacement; + return result; +} // Grab a vector for a specific ent const Vector& PredictEntity(CachedEntity* entity) { @@ -571,7 +592,7 @@ const Vector& PredictEntity(CachedEntity* entity) { } else { // If using extrapolation, then predict a vector if (extrapolate) - result = SimpleLatencyPrediction(entity, cd.hitbox); + result = SimpleThonkPrediction(entity, cd.hitbox); // else just grab strait from the hitbox else GetHitbox(entity, cd.hitbox, result); diff --git a/src/hacks/AutoSticky.cpp b/src/hacks/AutoSticky.cpp index c5937a77..e0a66006 100644 --- a/src/hacks/AutoSticky.cpp +++ b/src/hacks/AutoSticky.cpp @@ -78,7 +78,7 @@ void CreateMove() { if (!enabled) return; // Check if game is a tf game - IF_GAME (!IsTF()) return; + //IF_GAME (!IsTF()) return; // Check if player is demoman if (g_pLocalPlayer->clazz != tf_demoman) return; diff --git a/src/hacks/Trigger.cpp b/src/hacks/Trigger.cpp index 892f7974..ab0af204 100644 --- a/src/hacks/Trigger.cpp +++ b/src/hacks/Trigger.cpp @@ -26,6 +26,8 @@ static CatVar trigger_key_mode(trigger_key_modes_enum, "trigger_key_mode", "1", static CatEnum hitbox_mode_enum({ "AUTO-HEAD", "AUTO-CLOSEST", "Head only" }); static CatVar hitbox_mode(hitbox_mode_enum, "trigger_hitboxmode", "0", "Hitbox Mode", "Defines hitbox selection mode"); + +static CatVar accuracy(CV_INT, "trigger_accuracy", "0", "Improve accuracy", "Improves triggerbot accuracy when aiming for specific hitbox"); static CatVar ignore_vaccinator(CV_SWITCH, "trigger_ignore_vaccinator", "1", "Ignore Vaccinator", "Hitscan weapons won't fire if enemy is vaccinated against bullets"); static CatVar ignore_hoovy(CV_SWITCH, "trigger_ignore_hoovy", "1", "Ignore Hoovies", "Triggerbot won't attack hoovies"); @@ -42,6 +44,7 @@ static CatVar max_range(CV_INT, "trigger_maxrange", "0", "Max distance", "900-1100 range is efficient for scout/widowmaker engineer", 4096.0f); int last_hb_traced = 0; +Vector forward; // The main "loop" of the triggerbot void CreateMove() { @@ -170,6 +173,35 @@ bool IsTargetStateGood(CachedEntity* entity) { if (last_hb_traced != hitbox_t::head) return false; } + // If usersettings tell us to use accuracy improvements and the cached hitbox isnt null, then we check if it hits here + if (accuracy) { + + // Get a cached hitbox for the one traced + hitbox_cache::CachedHitbox* hb = entity->hitboxes.GetHitbox(last_hb_traced); + + // Check for null + if (hb) { + + // Get the min and max for the hitbox + Vector minz(min(hb->min.x, hb->max.x), min(hb->min.y, hb->max.y), min(hb->min.z, hb->max.z)); + Vector maxz(max(hb->min.x, hb->max.x), max(hb->min.y, hb->max.y), max(hb->min.z, hb->max.z)); + + // Shrink the hitbox here + Vector size = maxz - minz; + Vector smod = size * 0.05f * (int)accuracy; + + // Save the changes to the vectors + minz += smod; + maxz -= smod; + + // Trace and test if it hits the smaller hitbox, if it fails we return false + Vector hit; + if (!CheckLineBox(minz, maxz, g_pLocalPlayer->v_Eye, forward, hit)) { + return false; + } + } + } + // Target passed the tests so return true return true; @@ -219,6 +251,7 @@ bool IsTargetStateGood(CachedEntity* entity) { // A function to return a potential entity in front of the player CachedEntity* FindEntInSight(float range) { + // We dont want to hit ourself so we set an ignore trace_t trace; trace::filter_default.SetSelf(RAW_ENT(g_pLocalPlayer->entity)); @@ -226,7 +259,6 @@ CachedEntity* FindEntInSight(float range) { // Use math to get a vector in front of the player float sp, sy, cp, cy; QAngle angle; - Vector forward; g_IEngine->GetViewAngles(angle); sy = sinf(DEG2RAD(angle[1])); cy = cosf(DEG2RAD(angle[1])); @@ -246,6 +278,7 @@ CachedEntity* FindEntInSight(float range) { // Return an ent if that is what we hit if (trace.m_pEnt) { + last_hb_traced = trace.hitbox; return ENTITY(((IClientEntity*)trace.m_pEnt)->entindex()); } @@ -384,6 +417,49 @@ float EffectiveTargetingRange() { } } +// Helper functions to trace for hitboxes + +// TEMPORARY CODE. +// TODO +bool GetIntersection(float fDst1, float fDst2, Vector P1, Vector P2, Vector& Hit) { + if ((fDst1 * fDst2) >= 0.0f) return false; + if (fDst1 == fDst2) return false; + Hit = P1 + (P2 - P1) * (-fDst1 / (fDst2 - fDst1)); + return true; +} + +bool InBox(Vector Hit, Vector B1, Vector B2, int Axis) { + if (Axis == 1 && Hit.z > B1.z && Hit.z < B2.z && Hit.y > B1.y && Hit.y < B2.y) return true; + if (Axis == 2 && Hit.z > B1.z && Hit.z < B2.z && Hit.x > B1.x && Hit.x < B2.x) return true; + if (Axis == 3 && Hit.x > B1.x && Hit.x < B2.x && Hit.y > B1.y && Hit.y < B2.y) return true; + return false; +} + +bool CheckLineBox(Vector B1, Vector B2, Vector L1, Vector L2, Vector& Hit) { + if (L2.x < B1.x && L1.x < B1.x) return false; + if (L2.x > B2.x && L1.x > B2.x) return false; + if (L2.y < B1.y && L1.y < B1.y) return false; + if (L2.y > B2.y && L1.y > B2.y) return false; + if (L2.z < B1.z && L1.z < B1.z) return false; + if (L2.z > B2.z && L1.z > B2.z) return false; + if (L1.x > B1.x && L1.x < B2.x && + L1.y > B1.y && L1.y < B2.y && + L1.z > B1.z && L1.z < B2.z) + { + Hit = L1; + return true; + } + if ((GetIntersection(L1.x - B1.x, L2.x - B1.x, L1, L2, Hit) && InBox(Hit, B1, B2, 1)) + || (GetIntersection(L1.y - B1.y, L2.y - B1.y, L1, L2, Hit) && InBox(Hit, B1, B2, 2)) + || (GetIntersection(L1.z - B1.z, L2.z - B1.z, L1, L2, Hit) && InBox(Hit, B1, B2, 3)) + || (GetIntersection(L1.x - B2.x, L2.x - B2.x, L1, L2, Hit) && InBox(Hit, B1, B2, 1)) + || (GetIntersection(L1.y - B2.y, L2.y - B2.y, L1, L2, Hit) && InBox(Hit, B1, B2, 2)) + || (GetIntersection(L1.z - B2.z, L2.z - B2.z, L1, L2, Hit) && InBox(Hit, B1, B2, 3))) + return true; + + return false; +} + void Draw() { } diff --git a/src/hacks/Trigger.h b/src/hacks/Trigger.h index f963678d..317a6b8b 100644 --- a/src/hacks/Trigger.h +++ b/src/hacks/Trigger.h @@ -22,6 +22,7 @@ bool HeadPreferable(CachedEntity* target); bool UpdateAimkey(); float EffectiveTargetingRange(); void Draw(); +bool CheckLineBox(Vector B1, Vector B2, Vector L1, Vector L2, Vector& Hit); }}}