From aaf14f3b360f6345fc9ad1a2cf4b74c073f92e60 Mon Sep 17 00:00:00 2001 From: rei-2 <174158077+rei-2@users.noreply.github.com> Date: Sat, 10 Jan 2026 00:12:56 -0500 Subject: [PATCH] hybrid target selection mode --- .../Aimbot/AimbotGlobal/AimbotGlobal.cpp | 38 +++++- .../Aimbot/AimbotGlobal/AimbotGlobal.h | 6 +- .../Aimbot/AimbotHitscan/AimbotHitscan.cpp | 25 ++-- .../Aimbot/AimbotHitscan/AimbotHitscan.h | 3 - .../Aimbot/AimbotMelee/AimbotMelee.cpp | 49 +++----- .../Features/Aimbot/AimbotMelee/AimbotMelee.h | 4 - .../AimbotProjectile/AimbotProjectile.cpp | 39 +++--- .../AimbotProjectile/AimbotProjectile.h | 3 - ...CBaseHudChatLine_InsertAndColorizeText.cpp | 117 ++++++++---------- Amalgam/src/SDK/Vars.h | 4 +- 10 files changed, 133 insertions(+), 155 deletions(-) diff --git a/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.cpp b/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.cpp index 702e8106..eec08e31 100644 --- a/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.cpp +++ b/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.cpp @@ -4,16 +4,42 @@ #include "../../Players/PlayerUtils.h" #include "../../Ticks/Ticks.h" -void CAimbotGlobal::SortTargets(std::vector& vTargets, int iMethod) -{ // Sort by preference - std::sort(vTargets.begin(), vTargets.end(), [&](const Target_t& a, const Target_t& b) -> bool +std::vector CAimbotGlobal::ManageTargets(std::vector(*GetTargets)(CTFPlayer* pLocal, CTFWeaponBase* pWeapon), CTFPlayer* pLocal, CTFWeaponBase* pWeapon, + int iMethod, int iMaxTargets) { + auto vTargets = GetTargets(pLocal, pWeapon); + SortTargetsPre(vTargets, iMethod); + vTargets.resize(std::min(size_t(iMaxTargets), vTargets.size())); + SortTargetsPost(vTargets, iMethod); + return vTargets; +} + +void CAimbotGlobal::SortTargetsPre(std::vector& vTargets, int iMethod) +{ switch (iMethod) { - case Vars::Aimbot::General::TargetSelectionEnum::FOV: return a.m_flFOVTo < b.m_flFOVTo; - case Vars::Aimbot::General::TargetSelectionEnum::Distance: return a.m_flDistTo < b.m_flDistTo; - default: return false; + case Vars::Aimbot::General::TargetSelectionEnum::FOV: + return std::sort(vTargets.begin(), vTargets.end(), [&](const Target_t& a, const Target_t& b) -> bool + { + return a.m_flFOVTo < b.m_flFOVTo; + }); + case Vars::Aimbot::General::TargetSelectionEnum::Distance: + case Vars::Aimbot::General::TargetSelectionEnum::Hybrid: + return std::sort(vTargets.begin(), vTargets.end(), [&](const Target_t& a, const Target_t& b) -> bool + { + return a.m_flDistTo < b.m_flDistTo; + }); } +} + +void CAimbotGlobal::SortTargetsPost(std::vector& vTargets, int iMethod) +{ + switch (iMethod) + { + case Vars::Aimbot::General::TargetSelectionEnum::Hybrid: + return std::sort(vTargets.begin(), vTargets.end(), [&](const Target_t& a, const Target_t& b) -> bool + { + return a.m_flFOVTo < b.m_flFOVTo; }); } diff --git a/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.h b/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.h index 053a1741..293a0b8e 100644 --- a/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.h +++ b/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.h @@ -27,8 +27,10 @@ struct Target_t class CAimbotGlobal { public: - void SortTargets(std::vector&, int iMethod); - void SortPriority(std::vector&); + std::vector ManageTargets(std::vector(*GetTargets)(CTFPlayer* pLocal, CTFWeaponBase* pWeapon), CTFPlayer* pLocal, CTFWeaponBase* pWeapon, + int iMethod = Vars::Aimbot::General::TargetSelection.Value, int iMaxTargets = Vars::Aimbot::General::MaxTargets.Value); + void SortTargetsPre(std::vector& vTargets, int iMethod); + void SortTargetsPost(std::vector& vTargets, int iMethod); bool PlayerBoneInFOV(CTFPlayer* pTarget, Vec3 vLocalPos, Vec3 vLocalAngles, float& flFOVTo, Vec3& vPos, Vec3& vAngleTo, int iHitboxes = Vars::Aimbot::Hitscan::HitboxesEnum::Head | Vars::Aimbot::Hitscan::HitboxesEnum::Body | Vars::Aimbot::Hitscan::HitboxesEnum::Pelvis | Vars::Aimbot::Hitscan::HitboxesEnum::Arms | Vars::Aimbot::Hitscan::HitboxesEnum::Legs); bool IsHitboxValid(CBaseEntity* pEntity, int nHitbox, int iHitboxes = Vars::Aimbot::Hitscan::HitboxesEnum::Head | Vars::Aimbot::Hitscan::HitboxesEnum::Body | Vars::Aimbot::Hitscan::HitboxesEnum::Pelvis | Vars::Aimbot::Hitscan::HitboxesEnum::Arms | Vars::Aimbot::Hitscan::HitboxesEnum::Legs); diff --git a/Amalgam/src/Features/Aimbot/AimbotHitscan/AimbotHitscan.cpp b/Amalgam/src/Features/Aimbot/AimbotHitscan/AimbotHitscan.cpp index 1c05f049..bc502595 100644 --- a/Amalgam/src/Features/Aimbot/AimbotHitscan/AimbotHitscan.cpp +++ b/Amalgam/src/Features/Aimbot/AimbotHitscan/AimbotHitscan.cpp @@ -6,7 +6,7 @@ #include "../../Visuals/Visuals.h" #include "../../Simulation/MovementSimulation/MovementSimulation.h" -std::vector CAimbotHitscan::GetTargets(CTFPlayer* pLocal, CTFWeaponBase* pWeapon) +static inline std::vector GetTargets(CTFPlayer* pLocal, CTFWeaponBase* pWeapon) { std::vector vTargets; const auto iSort = Vars::Aimbot::General::TargetSelection.Value; @@ -53,6 +53,7 @@ std::vector CAimbotHitscan::GetTargets(CTFPlayer* pLocal, CTFWeaponBas if (!F::AimbotGlobal.PlayerBoneInFOV(pEntity->As(), vLocalPos, vLocalAngles, flFOVTo, vPos, vAngleTo, Vars::Aimbot::Hitscan::Hitboxes.Value)) continue; + float flDistTo = vLocalPos.DistTo(vPos); int iPriority = F::AimbotGlobal.GetPriority(pEntity->entindex()); if (bTeam && bHeal) { @@ -67,8 +68,6 @@ std::vector CAimbotHitscan::GetTargets(CTFPlayer* pLocal, CTFWeaponBas iPriority = std::numeric_limits::max(); } } - - float flDistTo = iSort == Vars::Aimbot::General::TargetSelectionEnum::Distance ? vLocalPos.DistTo(vPos) : 0.f; vTargets.emplace_back(pEntity, TargetEnum::Player, vPos, vAngleTo, flFOVTo, flDistTo, iPriority); } @@ -89,7 +88,7 @@ std::vector CAimbotHitscan::GetTargets(CTFPlayer* pLocal, CTFWeaponBas if (flFOVTo > Vars::Aimbot::General::AimFOV.Value) continue; - float flDistTo = iSort == Vars::Aimbot::General::TargetSelectionEnum::Distance ? vLocalPos.DistTo(vPos) : 0.f; + float flDistTo = vLocalPos.DistTo(vPos); vTargets.emplace_back(pEntity, pEntity->IsSentrygun() ? TargetEnum::Sentry : pEntity->IsDispenser() ? TargetEnum::Dispenser : TargetEnum::Teleporter, vPos, vAngleTo, flFOVTo, flDistTo); } } @@ -107,7 +106,7 @@ std::vector CAimbotHitscan::GetTargets(CTFPlayer* pLocal, CTFWeaponBas if (flFOVTo > Vars::Aimbot::General::AimFOV.Value) continue; - float flDistTo = iSort == Vars::Aimbot::General::TargetSelectionEnum::Distance ? vLocalPos.DistTo(vPos) : 0.f; + float flDistTo = vLocalPos.DistTo(vPos); vTargets.emplace_back(pEntity, TargetEnum::Sticky, vPos, vAngleTo, flFOVTo, flDistTo); } } @@ -125,7 +124,7 @@ std::vector CAimbotHitscan::GetTargets(CTFPlayer* pLocal, CTFWeaponBas if (flFOVTo > Vars::Aimbot::General::AimFOV.Value) continue; - float flDistTo = iSort == Vars::Aimbot::General::TargetSelectionEnum::Distance ? vLocalPos.DistTo(vPos) : 0.f; + float flDistTo = vLocalPos.DistTo(vPos); vTargets.emplace_back(pEntity, TargetEnum::NPC, vPos, vAngleTo, flFOVTo, flDistTo); } } @@ -143,7 +142,7 @@ std::vector CAimbotHitscan::GetTargets(CTFPlayer* pLocal, CTFWeaponBas if (flFOVTo > Vars::Aimbot::General::AimFOV.Value) continue; - float flDistTo = iSort == Vars::Aimbot::General::TargetSelectionEnum::Distance ? vLocalPos.DistTo(vPos) : 0.f; + float flDistTo = vLocalPos.DistTo(vPos); vTargets.emplace_back(pEntity, TargetEnum::Bomb, vPos, vAngleTo, flFOVTo, flDistTo); } } @@ -151,16 +150,6 @@ std::vector CAimbotHitscan::GetTargets(CTFPlayer* pLocal, CTFWeaponBas return vTargets; } -std::vector CAimbotHitscan::SortTargets(CTFPlayer* pLocal, CTFWeaponBase* pWeapon) -{ - auto vTargets = GetTargets(pLocal, pWeapon); - - F::AimbotGlobal.SortTargets(vTargets, Vars::Aimbot::General::TargetSelection.Value); - vTargets.resize(std::min(size_t(Vars::Aimbot::General::MaxTargets.Value), vTargets.size())); - F::AimbotGlobal.SortPriority(vTargets); - return vTargets; -} - int CAimbotHitscan::GetHitboxPriority(int nHitbox, CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CBaseEntity* pTarget) @@ -760,7 +749,7 @@ void CAimbotHitscan::Run(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCmd* pC break; } - auto vTargets = SortTargets(pLocal, pWeapon); + auto vTargets = F::AimbotGlobal.ManageTargets(GetTargets, pLocal, pWeapon); if (vTargets.empty()) return; diff --git a/Amalgam/src/Features/Aimbot/AimbotHitscan/AimbotHitscan.h b/Amalgam/src/Features/Aimbot/AimbotHitscan/AimbotHitscan.h index cbc13f67..f8d31d9c 100644 --- a/Amalgam/src/Features/Aimbot/AimbotHitscan/AimbotHitscan.h +++ b/Amalgam/src/Features/Aimbot/AimbotHitscan/AimbotHitscan.h @@ -6,9 +6,6 @@ class CAimbotHitscan { private: - std::vector GetTargets(CTFPlayer* pLocal, CTFWeaponBase* pWeapon); - std::vector SortTargets(CTFPlayer* pLocal, CTFWeaponBase* pWeapon); - int GetHitboxPriority(int nHitbox, CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CBaseEntity* pTarget); int CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBase* pWeapon); diff --git a/Amalgam/src/Features/Aimbot/AimbotMelee/AimbotMelee.cpp b/Amalgam/src/Features/Aimbot/AimbotMelee/AimbotMelee.cpp index 2ed3c8ae..e215a5ce 100644 --- a/Amalgam/src/Features/Aimbot/AimbotMelee/AimbotMelee.cpp +++ b/Amalgam/src/Features/Aimbot/AimbotMelee/AimbotMelee.cpp @@ -6,7 +6,22 @@ #include "../../Ticks/Ticks.h" #include "../../Visuals/Visuals.h" -std::vector CAimbotMelee::GetTargets(CTFPlayer* pLocal, CTFWeaponBase* pWeapon) +static inline bool AimFriendlyBuilding(CBaseObject* pBuilding) +{ + if (!pBuilding->m_bMiniBuilding() && pBuilding->m_iUpgradeLevel() != 3 || pBuilding->m_iHealth() < pBuilding->m_iMaxHealth() || pBuilding->m_bHasSapper()) + return true; + + if (pBuilding->IsSentrygun()) + { + int iShells, iMaxShells, iRockets, iMaxRockets; pBuilding->As()->GetAmmoCount(iShells, iMaxShells, iRockets, iMaxRockets); + if (iShells < iMaxShells || iRockets < iMaxRockets) + return true; + } + + return false; +} + +static inline std::vector GetTargets(CTFPlayer* pLocal, CTFWeaponBase* pWeapon) { std::vector vTargets; @@ -29,12 +44,11 @@ std::vector CAimbotMelee::GetTargets(CTFPlayer* pLocal, CTFWeaponBase* if (!F::AimbotGlobal.PlayerBoneInFOV(pEntity->As(), vLocalPos, vLocalAngles, flFOVTo, vPos, vAngleTo)) continue; + float flDistTo = vLocalPos.DistTo(vPos); bool bTeam = pEntity->m_iTeamNum() == pLocal->m_iTeamNum(); int iPriority = F::AimbotGlobal.GetPriority(pEntity->entindex()); if (bTeam && !F::AimbotGlobal.FriendlyFire()) iPriority = 0; - - float flDistTo = vLocalPos.DistTo(vPos); vTargets.emplace_back(pEntity, TargetEnum::Player, vPos, vAngleTo, flFOVTo, flDistTo, iPriority); } } @@ -102,31 +116,6 @@ std::vector CAimbotMelee::GetTargets(CTFPlayer* pLocal, CTFWeaponBase* return vTargets; } -bool CAimbotMelee::AimFriendlyBuilding(CBaseObject* pBuilding) -{ - if (!pBuilding->m_bMiniBuilding() && pBuilding->m_iUpgradeLevel() != 3 || pBuilding->m_iHealth() < pBuilding->m_iMaxHealth() || pBuilding->m_bHasSapper()) - return true; - - if (pBuilding->IsSentrygun()) - { - int iShells, iMaxShells, iRockets, iMaxRockets; pBuilding->As()->GetAmmoCount(iShells, iMaxShells, iRockets, iMaxRockets); - if (iShells < iMaxShells || iRockets < iMaxRockets) - return true; - } - - return false; -} - -std::vector CAimbotMelee::SortTargets(CTFPlayer* pLocal, CTFWeaponBase* pWeapon) -{ - auto vTargets = GetTargets(pLocal, pWeapon); - - F::AimbotGlobal.SortTargets(vTargets, Vars::Aimbot::General::TargetSelectionEnum::Distance); - vTargets.resize(std::min(size_t(Vars::Aimbot::General::MaxTargets.Value), vTargets.size())); - F::AimbotGlobal.SortPriority(vTargets); - return vTargets; -} - int CAimbotMelee::GetSwingTime(CTFWeaponBase* pWeapon, bool bVar) @@ -568,7 +557,7 @@ void CAimbotMelee::Run(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCmd* pCmd if (RunSapper(pLocal, pWeapon, pCmd)) return; - auto vTargets = SortTargets(pLocal, pWeapon); + auto vTargets = F::AimbotGlobal.ManageTargets(GetTargets, pLocal, pWeapon, Vars::Aimbot::General::TargetSelectionEnum::Distance); if (vTargets.empty()) return; @@ -684,7 +673,7 @@ bool CAimbotMelee::RunSapper(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCmd vTargets.emplace_back(pBuilding, TargetEnum::Unknown, vPoint, vAngleTo, flFOVTo, flDistTo); } - F::AimbotGlobal.SortTargets(vTargets, Vars::Aimbot::General::TargetSelectionEnum::Distance); + F::AimbotGlobal.SortTargetsPre(vTargets, Vars::Aimbot::General::TargetSelectionEnum::Distance); if (vTargets.empty()) return true; diff --git a/Amalgam/src/Features/Aimbot/AimbotMelee/AimbotMelee.h b/Amalgam/src/Features/Aimbot/AimbotMelee/AimbotMelee.h index 33ee94b2..d4527db4 100644 --- a/Amalgam/src/Features/Aimbot/AimbotMelee/AimbotMelee.h +++ b/Amalgam/src/Features/Aimbot/AimbotMelee/AimbotMelee.h @@ -6,10 +6,6 @@ class CAimbotMelee { private: - std::vector GetTargets(CTFPlayer* pLocal, CTFWeaponBase* pWeapon); - bool AimFriendlyBuilding(CBaseObject* pBuilding); - std::vector SortTargets(CTFPlayer* pLocal, CTFWeaponBase* pWeapon); - int GetSwingTime(CTFWeaponBase* pWeapon, bool bVar = true); void UpdateInfo(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCmd* pCmd, std::vector vTargets); bool CanBackstab(CBaseEntity* pTarget, CTFPlayer* pLocal, Vec3 vEyeAngles); diff --git a/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.cpp b/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.cpp index e2030a10..e7cf284d 100644 --- a/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.cpp +++ b/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.cpp @@ -19,7 +19,7 @@ static std::unordered_map s_mTraceCount = {}; #endif -std::vector CAimbotProjectile::GetTargets(CTFPlayer* pLocal, CTFWeaponBase* pWeapon) +static inline std::vector GetTargets(CTFPlayer* pLocal, CTFWeaponBase* pWeapon) { std::vector vTargets; const auto iSort = Vars::Aimbot::General::TargetSelection.Value; @@ -61,6 +61,7 @@ std::vector CAimbotProjectile::GetTargets(CTFPlayer* pLocal, CTFWeapon if (!F::AimbotGlobal.PlayerBoneInFOV(pEntity->As(), vLocalPos, vLocalAngles, flFOVTo, vPos, vAngleTo)) continue; + float flDistTo = vLocalPos.DistTo(vPos); int iPriority = F::AimbotGlobal.GetPriority(pEntity->entindex()); if (bTeam && bHeal) { @@ -75,8 +76,6 @@ std::vector CAimbotProjectile::GetTargets(CTFPlayer* pLocal, CTFWeapon iPriority = std::numeric_limits::max(); } } - - float flDistTo = iSort == Vars::Aimbot::General::TargetSelectionEnum::Distance ? vLocalPos.DistTo(vPos) : 0.f; vTargets.emplace_back(pEntity, TargetEnum::Player, vPos, vAngleTo, flFOVTo, flDistTo, iPriority); } @@ -120,7 +119,7 @@ std::vector CAimbotProjectile::GetTargets(CTFPlayer* pLocal, CTFWeapon } } - float flDistTo = iSort == Vars::Aimbot::General::TargetSelectionEnum::Distance ? vLocalPos.DistTo(vPos) : 0.f; + float flDistTo = vLocalPos.DistTo(vPos); vTargets.emplace_back(pEntity, pEntity->IsSentrygun() ? TargetEnum::Sentry : pEntity->IsDispenser() ? TargetEnum::Dispenser : TargetEnum::Teleporter, vPos, vAngleTo, flFOVTo, flDistTo, iPriority); } } @@ -153,7 +152,7 @@ std::vector CAimbotProjectile::GetTargets(CTFPlayer* pLocal, CTFWeapon if (flFOVTo > Vars::Aimbot::General::AimFOV.Value) continue; - float flDistTo = iSort == Vars::Aimbot::General::TargetSelectionEnum::Distance ? vLocalPos.DistTo(vPos) : 0.f; + float flDistTo = vLocalPos.DistTo(vPos); vTargets.emplace_back(pEntity, TargetEnum::Sticky, vPos, vAngleTo, flFOVTo, flDistTo); } } @@ -172,7 +171,7 @@ std::vector CAimbotProjectile::GetTargets(CTFPlayer* pLocal, CTFWeapon if (flFOVTo > Vars::Aimbot::General::AimFOV.Value) continue; - float flDistTo = iSort == Vars::Aimbot::General::TargetSelectionEnum::Distance ? vLocalPos.DistTo(vPos) : 0.f; + float flDistTo = vLocalPos.DistTo(vPos); vTargets.emplace_back(pEntity, TargetEnum::NPC, vPos, vAngleTo, flFOVTo, flDistTo); } } @@ -180,16 +179,6 @@ std::vector CAimbotProjectile::GetTargets(CTFPlayer* pLocal, CTFWeapon return vTargets; } -std::vector CAimbotProjectile::SortTargets(CTFPlayer* pLocal, CTFWeaponBase* pWeapon) -{ - auto vTargets = GetTargets(pLocal, pWeapon); - - F::AimbotGlobal.SortTargets(vTargets, Vars::Aimbot::General::TargetSelection.Value); - vTargets.resize(std::min(size_t(Vars::Aimbot::General::MaxTargets.Value), vTargets.size())); - F::AimbotGlobal.SortPriority(vTargets); - return vTargets; -} - float CAimbotProjectile::GetSplashRadius(CTFWeaponBase* pWeapon, CTFPlayer* pPlayer) @@ -1517,10 +1506,10 @@ int CAimbotProjectile::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBas m_flTimeTo = vPoint.m_tSolution.m_flTime + m_tInfo.m_flLatency; if (bVisuals) { - m_vPlayerPath = tStorage.m_vPath; - m_vPlayerPath.push_back(tStorage.m_MoveData.m_vecAbsOrigin); - m_vProjectilePath = vProjLines; - } + m_vPlayerPath = tStorage.m_vPath; + m_vPlayerPath.push_back(tStorage.m_MoveData.m_vecAbsOrigin); + m_vProjectilePath = vProjLines; + } } else switch (Vars::Aimbot::General::AimType.Value) { @@ -1542,8 +1531,8 @@ int CAimbotProjectile::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBas vAngleTo = vAngles, vPredicted = tTarget.m_vPos; if (bVisuals) { - m_vPlayerPath = tStorage.m_vPath; - m_vPlayerPath.push_back(tStorage.m_MoveData.m_vecAbsOrigin); + m_vPlayerPath = tStorage.m_vPath; + m_vPlayerPath.push_back(tStorage.m_MoveData.m_vecAbsOrigin); } iReturn = 2; } @@ -1763,7 +1752,7 @@ bool CAimbotProjectile::RunMain(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUser return false; } - auto vTargets = SortTargets(pLocal, pWeapon); + auto vTargets = F::AimbotGlobal.ManageTargets(GetTargets, pLocal, pWeapon); if (vTargets.empty()) return false; @@ -1838,7 +1827,7 @@ bool CAimbotProjectile::RunMain(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUser float flCharge = pWeapon->As()->m_flDetonateTime() - I::GlobalVars->curtime; flCharge = floorf(flCharge / GRENADE_CHECK_INTERVAL) * GRENADE_CHECK_INTERVAL + F::ProjSim.GetDesync(); if (flCharge > GRENADE_CHECK_INTERVAL) - { + { auto tTarget2 = tTarget; float flOldDetonateTime = pWeapon->As()->m_flDetonateTime(); @@ -2270,7 +2259,7 @@ bool CAimbotProjectile::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBa bool CAimbotProjectile::AutoAirblast(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCmd* pCmd, CBaseEntity* pProjectile) { - auto vTargets = SortTargets(pLocal, pWeapon); + auto vTargets = F::AimbotGlobal.ManageTargets(GetTargets, pLocal, pWeapon); if (vTargets.empty()) return false; diff --git a/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.h b/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.h index ad754843..43938f76 100644 --- a/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.h +++ b/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.h @@ -46,9 +46,6 @@ struct Info_t class CAimbotProjectile { private: - std::vector GetTargets(CTFPlayer* pLocal, CTFWeaponBase* pWeapon); - std::vector SortTargets(CTFPlayer* pLocal, CTFWeaponBase* pWeapon); - std::unordered_map GetDirectPoints(Target_t& tTarget, CBaseEntity* pProjectile = nullptr); std::vector GetSplashPoints(Target_t& tTarget, std::vector>& vSpherePoints, int iSimTime); void SetupSplashPoints(Target_t& tTarget, std::vector>& vSpherePoints, std::vector>& vSimplePoints); diff --git a/Amalgam/src/Hooks/CBaseHudChatLine_InsertAndColorizeText.cpp b/Amalgam/src/Hooks/CBaseHudChatLine_InsertAndColorizeText.cpp index e9a23f77..968370fa 100644 --- a/Amalgam/src/Hooks/CBaseHudChatLine_InsertAndColorizeText.cpp +++ b/Amalgam/src/Hooks/CBaseHudChatLine_InsertAndColorizeText.cpp @@ -12,88 +12,81 @@ MAKE_HOOK(CBaseHudChatLine_InsertAndColorizeText, S::CBaseHudChatLine_InsertAndC return CALL_ORIGINAL(rcx, buf, clientIndex); #endif + auto pResource = H::Entities.GetResource(); + if (!pResource || !pResource->IsValid(clientIndex)) + return CALL_ORIGINAL(rcx, buf, clientIndex); + std::string sMessage = SDK::ConvertWideToUTF8(buf); + const char* sName = pResource->GetName(clientIndex); + auto iFind = sMessage.find(sName); - if (clientIndex) + int iType; + if (const char* sReplace = F::PlayerUtils.GetPlayerName(clientIndex, nullptr, &iType)) { - auto pResource = H::Entities.GetResource(); - if (!pResource) - return CALL_ORIGINAL(rcx, buf, clientIndex); + if (iFind != std::string::npos) + sMessage = sMessage.replace(std::max(iFind - 1, 0ui64), strlen(sName) + 1, std::format("\x3{}\x1", sReplace)); + sName = sReplace; + } - const char* sName = pResource->GetName(clientIndex); - auto iFind = sMessage.find(sName); - - int iType; - if (const char* sReplace = F::PlayerUtils.GetPlayerName(clientIndex, nullptr, &iType)) + if (Vars::Visuals::UI::ChatTags.Value && !(iType & NameTypeEnum::Privacy)) + { + std::string sTag, cColor; + if (Vars::Visuals::UI::ChatTags.Value & Vars::Visuals::UI::ChatTagsEnum::Local && clientIndex == I::EngineClient->GetLocalPlayer()) + sTag = "You", cColor = Vars::Colors::Local.Value.ToHexA(); + else if (Vars::Visuals::UI::ChatTags.Value & Vars::Visuals::UI::ChatTagsEnum::Friends && H::Entities.IsFriend(clientIndex)) + sTag = "Friend", cColor = F::PlayerUtils.m_vTags[F::PlayerUtils.TagToIndex(FRIEND_TAG)].m_tColor.ToHexA(); + else if (Vars::Visuals::UI::ChatTags.Value & Vars::Visuals::UI::ChatTagsEnum::Party && H::Entities.InParty(clientIndex)) + sTag = "Party", cColor = F::PlayerUtils.m_vTags[F::PlayerUtils.TagToIndex(PARTY_TAG)].m_tColor.ToHexA(); + else if (Vars::Visuals::UI::ChatTags.Value & Vars::Visuals::UI::ChatTagsEnum::Assigned) { - if (iFind != std::string::npos) - sMessage = sMessage.replace(std::max(iFind - 1, 0ui64), strlen(sName) + 1, std::format("\x3{}\x1", sReplace)); - sName = sReplace; + if (auto pTag = F::PlayerUtils.GetSignificantTag(clientIndex, 0)) + sTag = pTag->m_sName, cColor = pTag->m_tColor.ToHexA(); } - if (Vars::Visuals::UI::ChatTags.Value && !(iType & NameTypeEnum::Privacy)) + if (!sTag.empty()) { - std::string sTag, cColor; - if (Vars::Visuals::UI::ChatTags.Value & Vars::Visuals::UI::ChatTagsEnum::Local && clientIndex == I::EngineClient->GetLocalPlayer()) - sTag = "You", cColor = Vars::Colors::Local.Value.ToHexA(); - else if (Vars::Visuals::UI::ChatTags.Value & Vars::Visuals::UI::ChatTagsEnum::Friends && H::Entities.IsFriend(clientIndex)) - sTag = "Friend", cColor = F::PlayerUtils.m_vTags[F::PlayerUtils.TagToIndex(FRIEND_TAG)].m_tColor.ToHexA(); - else if (Vars::Visuals::UI::ChatTags.Value & Vars::Visuals::UI::ChatTagsEnum::Party && H::Entities.InParty(clientIndex)) - sTag = "Party", cColor = F::PlayerUtils.m_vTags[F::PlayerUtils.TagToIndex(PARTY_TAG)].m_tColor.ToHexA(); - else if (Vars::Visuals::UI::ChatTags.Value & Vars::Visuals::UI::ChatTagsEnum::Assigned) - { - if (auto pTag = F::PlayerUtils.GetSignificantTag(clientIndex, 0)) - sTag = pTag->m_sName, cColor = pTag->m_tColor.ToHexA(); - } - - if (!sTag.empty()) - { - if (iFind != std::string::npos) - sMessage.insert(iFind + strlen(sName), "\x1"); - sMessage.insert(0, std::format("{}[{}] \x3", cColor, sTag)); - } + if (iFind != std::string::npos) + sMessage.insert(iFind + strlen(sName), "\x1"); + sMessage.insert(0, std::format("{}[{}] \x3", cColor, sTag)); } } if (Vars::Visuals::UI::StreamerMode.Value) { - if (auto pResource = H::Entities.GetResource()) + std::vector> vReplace; + for (int n = 1; n <= I::EngineClient->GetMaxClients(); n++) + { + if (!pResource->m_bValid(n)) + continue; + + int iType; const char* sReplace = F::PlayerUtils.GetPlayerName(n, nullptr, &iType); + if (!sReplace || !(iType & NameTypeEnum::Privacy)) + continue; + + vReplace.emplace_back(pResource->GetName(n), sReplace); + } + for (auto& [sFind, sReplace] : vReplace) { - std::vector> vReplace; - for (int n = 1; n <= I::EngineClient->GetMaxClients(); n++) { - if (!pResource->m_bValid(n)) + std::string sReplace2 = sReplace; + std::transform(sFind.begin(), sFind.end(), sFind.begin(), ::tolower); + std::transform(sReplace2.begin(), sReplace2.end(), sReplace2.begin(), ::tolower); + if (FNV1A::Hash32(sFind.c_str()) == FNV1A::Hash32(sReplace2.c_str())) continue; - - int iType; const char* sReplace = F::PlayerUtils.GetPlayerName(n, nullptr, &iType); - if (!sReplace || !(iType & NameTypeEnum::Privacy)) - continue; - - vReplace.emplace_back(pResource->GetName(n), sReplace); } - for (auto& [sFind, sReplace] : vReplace) + + size_t iPos = 0; + while (true) { - { - std::string sReplace2 = sReplace; - std::transform(sFind.begin(), sFind.end(), sFind.begin(), ::tolower); - std::transform(sReplace2.begin(), sReplace2.end(), sReplace2.begin(), ::tolower); - if (FNV1A::Hash32(sFind.c_str()) == FNV1A::Hash32(sReplace2.c_str())) - continue; - } + std::string sMessage2 = sMessage; + std::transform(sMessage2.begin(), sMessage2.end(), sMessage2.begin(), ::tolower); - size_t iPos = 0; - while (true) - { - std::string sMessage2 = sMessage; - std::transform(sMessage2.begin(), sMessage2.end(), sMessage2.begin(), ::tolower); + auto iFind = sMessage2.find(sFind, iPos); + if (iFind == std::string::npos) + break; - auto iFind = sMessage2.find(sFind, iPos); - if (iFind == std::string::npos) - break; - - iPos = iFind + sReplace.length(); - sMessage = sMessage.replace(iFind, sFind.length(), sReplace); - } + iPos = iFind + sReplace.length(); + sMessage = sMessage.replace(iFind, sFind.length(), sReplace); } } } diff --git a/Amalgam/src/SDK/Vars.h b/Amalgam/src/SDK/Vars.h index 5a930dfa..dc18a18d 100644 --- a/Amalgam/src/SDK/Vars.h +++ b/Amalgam/src/SDK/Vars.h @@ -260,8 +260,8 @@ namespace Vars VA_LIST("Off", "Plain", "Smooth", "Silent", "Locking", "Assistive"), Off, Plain, Smooth, Silent, Locking, Assistive); CVarEnum(TargetSelection, "Target selection", 0, NONE, nullptr, - VA_LIST("FOV", "Distance"), - FOV, Distance); + VA_LIST("FOV", "Distance", "Hybrid"), + FOV, Distance, Hybrid); CVarEnum(Target, "Target", 0b0000001, DROPDOWN_MULTI, nullptr, VA_LIST("Players", "Sentries", "Dispensers", "Teleporters", "Stickies", "NPCs", "Bombs"), Players = 1 << 0, Sentry = 1 << 1, Dispenser = 1 << 2, Teleporter = 1 << 3, Stickies = 1 << 4, NPCs = 1 << 5, Bombs = 1 << 6,