From a1374783a21ec020876de468e9ce61f1ecba203d Mon Sep 17 00:00:00 2001 From: rei-2 <174158077+rei-2@users.noreply.github.com> Date: Sun, 3 May 2026 21:30:36 -0400 Subject: [PATCH] leading aim mode --- .../Aimbot/AimbotGlobal/AimbotGlobal.cpp | 25 +- .../Aimbot/AimbotGlobal/AimbotGlobal.h | 3 + .../Aimbot/AimbotHitscan/AimbotHitscan.cpp | 401 +++++++++--------- .../Aimbot/AimbotMelee/AimbotMelee.cpp | 27 +- .../AimbotProjectile/AimbotProjectile.cpp | 20 +- Amalgam/src/Features/ImGui/Menu/Menu.cpp | 13 +- Amalgam/src/SDK/Vars.h | 1 + 7 files changed, 254 insertions(+), 236 deletions(-) diff --git a/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.cpp b/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.cpp index 61a5c37d..9c6c4e2a 100644 --- a/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.cpp +++ b/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.cpp @@ -53,7 +53,20 @@ void CAimbotGlobal::SortTargetsPost(std::vector& vTargets, int iMethod }); } -// this won't prevent shooting bones outside of fov +float CAimbotGlobal::GetAimFOV() +{ // restrict now vs later + return Vars::Aimbot::General::LeadAndRestrict.Value ? 180.f : Vars::Aimbot::General::AimFOV.Value; +} + +bool CAimbotGlobal::EntityCenterInFOV(CBaseEntity* pTarget, Vec3 vLocalPos, Vec3 vLocalAngles, float& flFOVTo, Vec3& vPos, Vec3& vAngleTo) +{ + vPos = pTarget->GetCenter(); + vAngleTo = Math::CalcAngle(vLocalPos, vPos); + flFOVTo = Math::CalcFov(vLocalAngles, vAngleTo); + + return flFOVTo < GetAimFOV(); +} + bool CAimbotGlobal::PlayerBoneInFOV(CTFPlayer* pTarget, Vec3 vLocalPos, Vec3 vLocalAngles, float& flFOVTo, Vec3& vPos, Vec3& vAngleTo, int iHitboxes) { matrix3x4* aBones = F::Backtrack.GetBones(pTarget); @@ -94,7 +107,7 @@ bool CAimbotGlobal::PlayerBoneInFOV(CTFPlayer* pTarget, Vec3 vLocalPos, Vec3 vLo } } - return flMinFOV < Vars::Aimbot::General::AimFOV.Value; + return flMinFOV < GetAimFOV(); } bool CAimbotGlobal::IsHitboxValid(CBaseEntity* pEntity, int nHitbox, int iHitboxes) @@ -170,6 +183,14 @@ bool CAimbotGlobal::ShouldMultipoint(CBaseEntity* pEntity, int nHitbox, int iHit return false; } +bool CAimbotGlobal::ShouldAimAtAngle(Vec3 vAngles) +{ + if (!Vars::Aimbot::General::LeadAndRestrict.Value) + return true; + + return Math::CalcFov(I::EngineClient->GetViewAngles(), vAngles) < Vars::Aimbot::General::AimFOV.Value; +} + bool CAimbotGlobal::ShouldIgnore(CBaseEntity* pEntity, CTFPlayer* pLocal, CTFWeaponBase* pWeapon) { if (pEntity->IsDormant()) diff --git a/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.h b/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.h index 293a0b8e..ca584ee1 100644 --- a/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.h +++ b/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.h @@ -32,10 +32,13 @@ public: void SortTargetsPre(std::vector& vTargets, int iMethod); void SortTargetsPost(std::vector& vTargets, int iMethod); + float GetAimFOV(); + bool EntityCenterInFOV(CBaseEntity* pTarget, Vec3 vLocalPos, Vec3 vLocalAngles, float& flFOVTo, Vec3& vPos, Vec3& vAngleTo); 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); bool IsHitboxValid(int nHitbox, int iHitboxes = Vars::Aimbot::Projectile::HitboxesEnum::Head | Vars::Aimbot::Projectile::HitboxesEnum::Body | Vars::Aimbot::Projectile::HitboxesEnum::Feet); bool ShouldMultipoint(CBaseEntity* pEntity = nullptr, int nHitbox = -1, 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 ShouldAimAtAngle(Vec3 vAngles); bool ShouldIgnore(CBaseEntity* pTarget, CTFPlayer* pLocal, CTFWeaponBase* pWeapon); int GetPriority(int iIndex); diff --git a/Amalgam/src/Features/Aimbot/AimbotHitscan/AimbotHitscan.cpp b/Amalgam/src/Features/Aimbot/AimbotHitscan/AimbotHitscan.cpp index 8a002783..69c77cde 100644 --- a/Amalgam/src/Features/Aimbot/AimbotHitscan/AimbotHitscan.cpp +++ b/Amalgam/src/Features/Aimbot/AimbotHitscan/AimbotHitscan.cpp @@ -81,10 +81,8 @@ static inline std::vector GetTargets(CTFPlayer* pLocal, CTFWeaponBase* if (F::AimbotGlobal.ShouldIgnore(pEntity, pLocal, pWeapon)) continue; - Vec3 vPos = pEntity->GetCenter(); - Vec3 vAngleTo = Math::CalcAngle(vLocalPos, vPos); - float flFOVTo = Math::CalcFov(vLocalAngles, vAngleTo); - if (flFOVTo > Vars::Aimbot::General::AimFOV.Value) + float flFOVTo; Vec3 vPos, vAngleTo; + if (!F::AimbotGlobal.EntityCenterInFOV(pEntity, vLocalPos, vLocalAngles, flFOVTo, vPos, vAngleTo)) continue; float flDistTo = vLocalPos.DistToSqr(vPos); @@ -99,10 +97,8 @@ static inline std::vector GetTargets(CTFPlayer* pLocal, CTFWeaponBase* if (F::AimbotGlobal.ShouldIgnore(pEntity, pLocal, pWeapon)) continue; - Vec3 vPos = pEntity->m_vecOrigin(); - Vec3 vAngleTo = Math::CalcAngle(vLocalPos, vPos); - float flFOVTo = Math::CalcFov(vLocalAngles, vAngleTo); - if (flFOVTo > Vars::Aimbot::General::AimFOV.Value) + float flFOVTo; Vec3 vPos, vAngleTo; + if (!F::AimbotGlobal.EntityCenterInFOV(pEntity, vLocalPos, vLocalAngles, flFOVTo, vPos, vAngleTo)) continue; float flDistTo = vLocalPos.DistToSqr(vPos); @@ -117,10 +113,8 @@ static inline std::vector GetTargets(CTFPlayer* pLocal, CTFWeaponBase* if (F::AimbotGlobal.ShouldIgnore(pEntity, pLocal, pWeapon)) continue; - Vec3 vPos = pEntity->GetCenter(); - Vec3 vAngleTo = Math::CalcAngle(vLocalPos, vPos); - float flFOVTo = Math::CalcFov(vLocalAngles, vAngleTo); - if (flFOVTo > Vars::Aimbot::General::AimFOV.Value) + float flFOVTo; Vec3 vPos, vAngleTo; + if (!F::AimbotGlobal.EntityCenterInFOV(pEntity, vLocalPos, vLocalAngles, flFOVTo, vPos, vAngleTo)) continue; float flDistTo = vLocalPos.DistToSqr(vPos); @@ -135,10 +129,8 @@ static inline std::vector GetTargets(CTFPlayer* pLocal, CTFWeaponBase* if (F::AimbotGlobal.ShouldIgnore(pEntity, pLocal, pWeapon)) continue; - Vec3 vPos = pEntity->GetCenter(); - Vec3 vAngleTo = Math::CalcAngle(vLocalPos, vPos); - float flFOVTo = Math::CalcFov(vLocalAngles, vAngleTo); - if (flFOVTo > Vars::Aimbot::General::AimFOV.Value) + float flFOVTo; Vec3 vPos, vAngleTo; + if (!F::AimbotGlobal.EntityCenterInFOV(pEntity, vLocalPos, vLocalAngles, flFOVTo, vPos, vAngleTo)) continue; float flDistTo = vLocalPos.DistToSqr(vPos); @@ -238,7 +230,7 @@ int CAimbotHitscan::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBase* return false; m_vEyePos = pLocal->GetShootPos(); - const float flMaxRange = powf(pWeapon->GetRange(), 2.f); + const float flMaxRangeSqr = powf(pWeapon->GetRange(), 2.f); auto pModel = tTarget.m_pEntity->GetModel(); if (!pModel) return false; @@ -263,6 +255,7 @@ int CAimbotHitscan::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBase* vRecords = { &F::Backtrack.m_tRecord }; } + int iReturn = false; bool bPeekCheck = false; if (Vars::Aimbot::Hitscan::PeekAmount.Value && pWeapon->GetWeaponSpread()) { @@ -290,205 +283,196 @@ int CAimbotHitscan::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBase* }); } - int iReturn = false; - for (auto pRecord : vRecords) + // wrangler + if (pWeapon->GetWeaponID() == TF_WEAPON_LASER_POINTER) { - bool bRunPeekCheck = bPeekCheck; - - if (pWeapon->GetWeaponID() == TF_WEAPON_LASER_POINTER) + tTarget.m_vPos = tTarget.m_pEntity->m_vecOrigin(); + + MoveStorage tMoveStorage; // run movesim based on ping + F::MoveSim.Initialize(tTarget.m_pEntity, tMoveStorage); + if (!tMoveStorage.m_bFailed) { - tTarget.m_vPos = tTarget.m_pEntity->m_vecOrigin(); - - // not lag compensated (i assume) so run movesim based on ping - MoveStorage tMoveStorage; - F::MoveSim.Initialize(tTarget.m_pEntity, tMoveStorage); - if (!tMoveStorage.m_bFailed) + for (int i = 1 - TIME_TO_TICKS(F::Backtrack.GetReal()); i <= 0; i++) { - for (int i = 1 - TIME_TO_TICKS(F::Backtrack.GetReal()); i <= 0; i++) - { - F::MoveSim.RunTick(tMoveStorage); - tTarget.m_vPos = tMoveStorage.m_vPredictedOrigin; - } + F::MoveSim.RunTick(tMoveStorage); + tTarget.m_vPos = tMoveStorage.m_vPredictedOrigin; } - F::MoveSim.Restore(tMoveStorage); + } + F::MoveSim.Restore(tMoveStorage); - float flBoneScale = std::max(Vars::Aimbot::Hitscan::BoneSizeMinimumScale.Value, Vars::Aimbot::Hitscan::MultipointScale.Value / 100.f); - float flBoneSubtract = Vars::Aimbot::Hitscan::BoneSizeSubtract.Value; + float flBoneScale = std::max(Vars::Aimbot::Hitscan::BoneSizeMinimumScale.Value, Vars::Aimbot::Hitscan::MultipointScale.Value / 100.f); + float flBoneSubtract = Vars::Aimbot::Hitscan::BoneSizeSubtract.Value; - Vec3 vMins = tTarget.m_pEntity->m_vecMins(); - Vec3 vMaxs = tTarget.m_pEntity->m_vecMaxs(); - Vec3 vCheckMins = (vMins + flBoneSubtract) * flBoneScale; - Vec3 vCheckMaxs = (vMaxs - flBoneSubtract) * flBoneScale; + Vec3 vMins = tTarget.m_pEntity->m_vecMins(); + Vec3 vMaxs = tTarget.m_pEntity->m_vecMaxs(); + Vec3 vCheckMins = (vMins + flBoneSubtract) * flBoneScale; + Vec3 vCheckMaxs = (vMaxs - flBoneSubtract) * flBoneScale; - const matrix3x4 mTransform = { { 1, 0, 0, tTarget.m_vPos.x }, { 0, 1, 0, tTarget.m_vPos.y }, { 0, 0, 1, tTarget.m_vPos.z } }; + const matrix3x4 mTransform = { { 1, 0, 0, tTarget.m_vPos.x }, { 0, 1, 0, tTarget.m_vPos.y }, { 0, 0, 1, tTarget.m_vPos.z } }; - tTarget.m_vPos += tTarget.m_pEntity->GetOffset() / 2; - if (m_vEyePos.DistToSqr(tTarget.m_vPos) > flMaxRange) - break; + tTarget.m_vPos += tTarget.m_pEntity->GetOffset() / 2; + if (m_vEyePos.DistToSqr(tTarget.m_vPos) > flMaxRangeSqr) + return false; - if (SDK::VisPosWorld(pLocal, tTarget.m_pEntity, m_vEyePos, tTarget.m_vPos)) + if (SDK::VisPosWorld(pLocal, tTarget.m_pEntity, m_vEyePos, tTarget.m_vPos)) + { + Vec3 vAngles; bool bChanged = Aim(G::CurrentUserCmd->viewangles, Math::CalcAngle(m_vEyePos, tTarget.m_vPos), vAngles); + Vec3 vForward; Math::AngleVectors(vAngles, &vForward); + float flDist = m_vEyePos.DistTo(tTarget.m_vPos); + + if (!F::AimbotGlobal.ShouldAimAtAngle(vAngles)) + return false; + + if (!bChanged || Math::RayToOBB(m_vEyePos, vForward, vCheckMins, vCheckMaxs, mTransform) && SDK::VisPos(pLocal, tTarget.m_pEntity, m_vEyePos, m_vEyePos + vForward * flDist)) { - Vec3 vAngles; bool bChanged = Aim(G::CurrentUserCmd->viewangles, Math::CalcAngle(m_vEyePos, tTarget.m_vPos), vAngles); - Vec3 vForward; Math::AngleVectors(vAngles, &vForward); - float flDist = m_vEyePos.DistTo(tTarget.m_vPos); + tTarget.m_vAngleTo = vAngles; + tTarget.m_pRecord = vRecords.front(); + return true; + } + else + tTarget.m_vAngleTo = vAngles; + iReturn = 2; + } - if (!bChanged || Math::RayToOBB(m_vEyePos, vForward, vCheckMins, vCheckMaxs, mTransform) && SDK::VisPos(pLocal, tTarget.m_pEntity, m_vEyePos, m_vEyePos + vForward * flDist)) - { - tTarget.m_vAngleTo = vAngles; - tTarget.m_pRecord = pRecord; - return true; - } - else if (iReturn == 2 ? vAngles.DeltaAngle(G::CurrentUserCmd->viewangles).Length2D() < tTarget.m_vAngleTo.DeltaAngle(G::CurrentUserCmd->viewangles).Length2D() : true) + return iReturn; + } + + // non player + if (tTarget.m_iTargetType != TargetEnum::Player) + { + float flBoneScale = std::max(Vars::Aimbot::Hitscan::BoneSizeMinimumScale.Value, Vars::Aimbot::Hitscan::MultipointScale.Value / 100.f); + float flBoneSubtract = Vars::Aimbot::Hitscan::BoneSizeSubtract.Value; + + Vec3 vMins = tTarget.m_pEntity->m_vecMins(); + Vec3 vMaxs = tTarget.m_pEntity->m_vecMaxs(); + Vec3 vCheckMins = (vMins + flBoneSubtract) * flBoneScale; + Vec3 vCheckMaxs = (vMaxs - flBoneSubtract) * flBoneScale; + + const matrix3x4& mTransform = tTarget.m_pEntity->m_Collision()->CollisionToWorldTransform(); + + std::vector vPoints = { Vec3() }; + //if (Vars::Aimbot::Hitscan::MultipointScale.Value > 0.f) + { + bool bTriggerbot = (Vars::Aimbot::General::AimType.Value == Vars::Aimbot::General::AimTypeEnum::Smooth + || Vars::Aimbot::General::AimType.Value == Vars::Aimbot::General::AimTypeEnum::Assistive) + && !Vars::Aimbot::General::AssistStrength.Value; + + if (!bTriggerbot) + { + float flScale = 0.5f; //Vars::Aimbot::Hitscan::MultipointScale.Value / 100; + Vec3 vMinsS = (vMins - vMaxs) / 2 * flScale; + Vec3 vMaxsS = (vMaxs - vMins) / 2 * flScale; + + vPoints = { + Vec3(), + Vec3(vMinsS.x, vMinsS.y, vMaxsS.z), + Vec3(vMaxsS.x, vMinsS.y, vMaxsS.z), + Vec3(vMinsS.x, vMaxsS.y, vMaxsS.z), + Vec3(vMaxsS.x, vMaxsS.y, vMaxsS.z), + Vec3(vMinsS.x, vMinsS.y, vMinsS.z), + Vec3(vMaxsS.x, vMinsS.y, vMinsS.z), + Vec3(vMinsS.x, vMaxsS.y, vMinsS.z), + Vec3(vMaxsS.x, vMaxsS.y, vMinsS.z) + }; + } + } + + for (auto& vPoint : vPoints) + { + Vec3 vOrigin = tTarget.m_pEntity->GetCenter() + vPoint; + + if (m_vEyePos.DistToSqr(vOrigin) > flMaxRangeSqr) + continue; + + Vec3 vAngles; bool bChanged = Aim(G::CurrentUserCmd->viewangles, Math::CalcAngle(m_vEyePos, vOrigin), vAngles); + Vec3 vForward; Math::AngleVectors(vAngles, &vForward); + float flDist = m_vEyePos.DistTo(vOrigin); + + if (!F::AimbotGlobal.ShouldAimAtAngle(vAngles) || !bChanged && !SDK::VisPos(pLocal, tTarget.m_pEntity, m_vEyePos, vOrigin)) + continue; + + if (!bChanged || Math::RayToOBB(m_vEyePos, vForward, vCheckMins, vCheckMaxs, mTransform) && SDK::VisPos(pLocal, tTarget.m_pEntity, m_vEyePos, m_vEyePos + vForward * flDist)) + { + tTarget.m_vAngleTo = vAngles; + tTarget.m_pRecord = vRecords.front();; + tTarget.m_vPos = vOrigin; + return true; + } + else if (bChanged && SDK::VisPos(pLocal, tTarget.m_pEntity, m_vEyePos, vOrigin)) + { + if (iReturn != 2 || vAngles.DeltaAngle(G::CurrentUserCmd->viewangles).Length2D() < tTarget.m_vAngleTo.DeltaAngle(G::CurrentUserCmd->viewangles).Length2D()) tTarget.m_vAngleTo = vAngles; iReturn = 2; } - - break; } - if (tTarget.m_iTargetType == TargetEnum::Player) + return iReturn; + } + + // player + std::vector> vHitboxes; + for (int nHitbox = 0; nHitbox < pSet->numhitboxes; nHitbox++) + { + int iPriority = GetHitboxPriority(nHitbox, pLocal, pWeapon, tTarget.m_pEntity); + if (iPriority == -1) + continue; + + auto pBox = pSet->pHitbox(nHitbox); + if (!pBox) continue; + + vHitboxes.emplace_back(pBox, nHitbox, iPriority); + } + std::sort(vHitboxes.begin(), vHitboxes.end(), [&](const auto& a, const auto& b) -> bool + { + return std::get<2>(a) < std::get<2>(b); + }); + + float flModelScale = tTarget.m_pEntity->As()->m_flModelScale(); + float flBoneScale = Vars::Aimbot::Hitscan::BoneSizeMinimumScale.Value; + float flBoneSubtract = Vars::Aimbot::Hitscan::BoneSizeSubtract.Value; + + auto pGameRules = I::TFGameRules(); + auto pViewVectors = pGameRules ? pGameRules->GetViewVectors() : nullptr; + Vec3 vHullMins = (pViewVectors ? pViewVectors->m_vHullMin : Vec3(-24, -24, 0)) * flModelScale; + Vec3 vHullMaxs = (pViewVectors ? pViewVectors->m_vHullMax : Vec3(24, 24, 82)) * flModelScale; + + for (auto pRecord : vRecords) + { + bool bRunPeekCheck = bPeekCheck; + + auto aBones = pRecord->m_aBones; + if (!aBones) + continue; + + const matrix3x4 mTransform = { { 1, 0, 0, pRecord->m_vOrigin.x }, { 0, 1, 0, pRecord->m_vOrigin.y }, { 0, 0, 1, pRecord->m_vOrigin.z } }; + + for (auto& [pBox, nHitbox, _] : vHitboxes) { - auto aBones = pRecord->m_aBones; - if (!aBones) - continue; + Vec3 vMins = pBox->bbmin; + Vec3 vMaxs = pBox->bbmax; + Vec3 vCheckMins = (vMins + flBoneSubtract / flModelScale) * flBoneScale; + Vec3 vCheckMaxs = (vMaxs - flBoneSubtract / flModelScale) * flBoneScale; + Vec3 vAngle; Math::MatrixAngles(aBones[pBox->bone], vAngle); - std::vector> vHitboxes; - for (int nHitbox = 0; nHitbox < pSet->numhitboxes; nHitbox++) + Vec3 vOffset; { - int iPriority = GetHitboxPriority(nHitbox, pLocal, pWeapon, tTarget.m_pEntity); - if (iPriority == -1) - continue; - - auto pBox = pSet->pHitbox(nHitbox); - if (!pBox) continue; - - vHitboxes.emplace_back(pBox, nHitbox, iPriority); + Vec3 vOrigin, vCenter; + Math::VectorTransform({}, aBones[pBox->bone], vOrigin); + Math::VectorTransform((vMins + vMaxs) / 2, aBones[pBox->bone], vCenter); + vOffset = vCenter - vOrigin; } - std::sort(vHitboxes.begin(), vHitboxes.end(), [&](const auto& a, const auto& b) -> bool - { - return std::get<2>(a) < std::get<2>(b); - }); - - float flModelScale = tTarget.m_pEntity->As()->m_flModelScale(); - float flBoneScale = Vars::Aimbot::Hitscan::BoneSizeMinimumScale.Value; - float flBoneSubtract = Vars::Aimbot::Hitscan::BoneSizeSubtract.Value; - - auto pGameRules = I::TFGameRules(); - auto pViewVectors = pGameRules ? pGameRules->GetViewVectors() : nullptr; - Vec3 vHullMins = (pViewVectors ? pViewVectors->m_vHullMin : Vec3(-24, -24, 0)) * flModelScale; - Vec3 vHullMaxs = (pViewVectors ? pViewVectors->m_vHullMax : Vec3(24, 24, 82)) * flModelScale; - - const matrix3x4 mTransform = { { 1, 0, 0, pRecord->m_vOrigin.x }, { 0, 1, 0, pRecord->m_vOrigin.y }, { 0, 0, 1, pRecord->m_vOrigin.z } }; - - for (auto& [pBox, nHitbox, _] : vHitboxes) - { - Vec3 vMins = pBox->bbmin; - Vec3 vMaxs = pBox->bbmax; - Vec3 vCheckMins = (vMins + flBoneSubtract / flModelScale) * flBoneScale; - Vec3 vCheckMaxs = (vMaxs - flBoneSubtract / flModelScale) * flBoneScale; - Vec3 vAngle; Math::MatrixAngles(aBones[pBox->bone], vAngle); - - Vec3 vOffset; - { - Vec3 vOrigin, vCenter; - Math::VectorTransform({}, aBones[pBox->bone], vOrigin); - Math::VectorTransform((vMins + vMaxs) / 2, aBones[pBox->bone], vCenter); - vOffset = vCenter - vOrigin; - } - - std::vector vPoints = { Vec3() }; - if (F::AimbotGlobal.ShouldMultipoint(tTarget.m_pEntity, nHitbox, Vars::Aimbot::Hitscan::MultipointHitboxes.Value)) - { - flBoneScale = std::max(flBoneScale, Vars::Aimbot::Hitscan::MultipointScale.Value / 100.f); - bool bTriggerbot = (Vars::Aimbot::General::AimType.Value == Vars::Aimbot::General::AimTypeEnum::Smooth - || Vars::Aimbot::General::AimType.Value == Vars::Aimbot::General::AimTypeEnum::Assistive) - && !Vars::Aimbot::General::AssistStrength.Value; - - if (!bTriggerbot) - { - float flScale = Vars::Aimbot::Hitscan::MultipointScale.Value / 100; - Vec3 vMinsS = (vMins - vMaxs) / 2 * flScale; - Vec3 vMaxsS = (vMaxs - vMins) / 2 * flScale; - - vPoints = { - Vec3(), - Vec3(vMinsS.x, vMinsS.y, vMaxsS.z), - Vec3(vMaxsS.x, vMinsS.y, vMaxsS.z), - Vec3(vMinsS.x, vMaxsS.y, vMaxsS.z), - Vec3(vMaxsS.x, vMaxsS.y, vMaxsS.z), - Vec3(vMinsS.x, vMinsS.y, vMinsS.z), - Vec3(vMaxsS.x, vMinsS.y, vMinsS.z), - Vec3(vMinsS.x, vMaxsS.y, vMinsS.z), - Vec3(vMaxsS.x, vMaxsS.y, vMinsS.z) - }; - } - } - - for (auto& vPoint : vPoints) - { - Vec3 vOrigin; Math::VectorTransform(vPoint, aBones[pBox->bone], vOrigin); vOrigin += vOffset; - - if (m_vEyePos.DistToSqr(vOrigin) > flMaxRange) - continue; - - if (bRunPeekCheck) - { - bRunPeekCheck = false; - if (!SDK::VisPos(pLocal, tTarget.m_pEntity, vPeekPos, vOrigin)) - goto nextTick; // if we can't hit our primary hitbox, don't bother - } - - Vec3 vAngles; bool bChanged = Aim(G::CurrentUserCmd->viewangles, Math::CalcAngle(m_vEyePos, vOrigin), vAngles); - Vec3 vForward; Math::AngleVectors(vAngles, &vForward); - float flDist = m_vEyePos.DistTo(vOrigin); - - if (bChanged || SDK::VisPos(pLocal, tTarget.m_pEntity, m_vEyePos, vOrigin)) - { - // for the time being, no vischecks against other hitboxes - if ((!bChanged || Math::RayToOBB(m_vEyePos, vForward, vCheckMins, vCheckMaxs, aBones[pBox->bone], flModelScale) && SDK::VisPos(pLocal, tTarget.m_pEntity, m_vEyePos, m_vEyePos + vForward * flDist)) - && Math::RayToOBB(m_vEyePos, vForward, vHullMins, vHullMaxs, mTransform)) - { - iTargetBone = pBox->bone; - - tTarget.m_vAngleTo = vAngles; - tTarget.m_pRecord = pRecord; - tTarget.m_vPos = vOrigin; - tTarget.m_nAimedHitbox = nHitbox; - tTarget.m_bBacktrack = true; - return true; - } - else if (bChanged && SDK::VisPos(pLocal, tTarget.m_pEntity, m_vEyePos, vOrigin)) - { - if (iReturn != 2 || vAngles.DeltaAngle(G::CurrentUserCmd->viewangles).Length2D() < tTarget.m_vAngleTo.DeltaAngle(G::CurrentUserCmd->viewangles).Length2D()) - tTarget.m_vAngleTo = vAngles; - iReturn = 2; - } - } - } - } - } - else - { - float flBoneScale = std::max(Vars::Aimbot::Hitscan::BoneSizeMinimumScale.Value, Vars::Aimbot::Hitscan::MultipointScale.Value / 100.f); - float flBoneSubtract = Vars::Aimbot::Hitscan::BoneSizeSubtract.Value; - - Vec3 vMins = tTarget.m_pEntity->m_vecMins(); - Vec3 vMaxs = tTarget.m_pEntity->m_vecMaxs(); - Vec3 vCheckMins = (vMins + flBoneSubtract) * flBoneScale; - Vec3 vCheckMaxs = (vMaxs - flBoneSubtract) * flBoneScale; - - const matrix3x4& mTransform = tTarget.m_pEntity->m_Collision()->CollisionToWorldTransform(); std::vector vPoints = { Vec3() }; - //if (Vars::Aimbot::Hitscan::MultipointScale.Value > 0.f) + if (F::AimbotGlobal.ShouldMultipoint(tTarget.m_pEntity, nHitbox, Vars::Aimbot::Hitscan::MultipointHitboxes.Value)) { + flBoneScale = std::max(flBoneScale, Vars::Aimbot::Hitscan::MultipointScale.Value / 100.f); bool bTriggerbot = (Vars::Aimbot::General::AimType.Value == Vars::Aimbot::General::AimTypeEnum::Smooth || Vars::Aimbot::General::AimType.Value == Vars::Aimbot::General::AimTypeEnum::Assistive) && !Vars::Aimbot::General::AssistStrength.Value; if (!bTriggerbot) { - float flScale = 0.5f; //Vars::Aimbot::Hitscan::MultipointScale.Value / 100; + float flScale = Vars::Aimbot::Hitscan::MultipointScale.Value / 100; Vec3 vMinsS = (vMins - vMaxs) / 2 * flScale; Vec3 vMaxsS = (vMaxs - vMins) / 2 * flScale; @@ -508,30 +492,43 @@ int CAimbotHitscan::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBase* for (auto& vPoint : vPoints) { - Vec3 vOrigin = tTarget.m_pEntity->GetCenter() + vPoint; + Vec3 vOrigin; Math::VectorTransform(vPoint, aBones[pBox->bone], vOrigin); vOrigin += vOffset; - if (m_vEyePos.DistToSqr(vOrigin) > flMaxRange) + if (m_vEyePos.DistToSqr(vOrigin) > flMaxRangeSqr) continue; + if (bRunPeekCheck) + { + bRunPeekCheck = false; + if (!SDK::VisPos(pLocal, tTarget.m_pEntity, vPeekPos, vOrigin)) + goto nextTick; // if we can't hit our primary hitbox, don't bother + } + Vec3 vAngles; bool bChanged = Aim(G::CurrentUserCmd->viewangles, Math::CalcAngle(m_vEyePos, vOrigin), vAngles); Vec3 vForward; Math::AngleVectors(vAngles, &vForward); float flDist = m_vEyePos.DistTo(vOrigin); - if (bChanged || SDK::VisPos(pLocal, tTarget.m_pEntity, m_vEyePos, vOrigin)) + if (!F::AimbotGlobal.ShouldAimAtAngle(vAngles) || !bChanged && !SDK::VisPos(pLocal, tTarget.m_pEntity, m_vEyePos, vOrigin)) + continue; + + // for the time being, no vischecks against other hitboxes + if ((!bChanged || Math::RayToOBB(m_vEyePos, vForward, vCheckMins, vCheckMaxs, aBones[pBox->bone], flModelScale) && SDK::VisPos(pLocal, tTarget.m_pEntity, m_vEyePos, m_vEyePos + vForward * flDist)) + && Math::RayToOBB(m_vEyePos, vForward, vHullMins, vHullMaxs, mTransform)) { - if (!bChanged || Math::RayToOBB(m_vEyePos, vForward, vCheckMins, vCheckMaxs, mTransform) && SDK::VisPos(pLocal, tTarget.m_pEntity, m_vEyePos, m_vEyePos + vForward * flDist)) - { + iTargetBone = pBox->bone; + + tTarget.m_vAngleTo = vAngles; + tTarget.m_pRecord = pRecord; + tTarget.m_vPos = vOrigin; + tTarget.m_nAimedHitbox = nHitbox; + tTarget.m_bBacktrack = true; + return true; + } + else if (bChanged && SDK::VisPos(pLocal, tTarget.m_pEntity, m_vEyePos, vOrigin)) + { + if (iReturn != 2 || vAngles.DeltaAngle(G::CurrentUserCmd->viewangles).Length2D() < tTarget.m_vAngleTo.DeltaAngle(G::CurrentUserCmd->viewangles).Length2D()) tTarget.m_vAngleTo = vAngles; - tTarget.m_pRecord = pRecord; - tTarget.m_vPos = vOrigin; - return true; - } - else if (bChanged && SDK::VisPos(pLocal, tTarget.m_pEntity, m_vEyePos, vOrigin)) - { - if (iReturn != 2 || vAngles.DeltaAngle(G::CurrentUserCmd->viewangles).Length2D() < tTarget.m_vAngleTo.DeltaAngle(G::CurrentUserCmd->viewangles).Length2D()) - tTarget.m_vAngleTo = vAngles; - iReturn = 2; - } + iReturn = 2; } } } diff --git a/Amalgam/src/Features/Aimbot/AimbotMelee/AimbotMelee.cpp b/Amalgam/src/Features/Aimbot/AimbotMelee/AimbotMelee.cpp index d2407e5e..bfa157e8 100644 --- a/Amalgam/src/Features/Aimbot/AimbotMelee/AimbotMelee.cpp +++ b/Amalgam/src/Features/Aimbot/AimbotMelee/AimbotMelee.cpp @@ -69,10 +69,8 @@ static inline std::vector GetTargets(CTFPlayer* pLocal, CTFWeaponBase* if (bTeam && (bWrench && !AimFriendlyBuilding(pEntity->As()) || bSapper && !pEntity->As()->m_bHasSapper())) continue; - Vec3 vPos = pEntity->GetCenter(); - Vec3 vAngleTo = Math::CalcAngle(vLocalPos, vPos); - float flFOVTo = Math::CalcFov(vLocalAngles, vAngleTo); - if (flFOVTo > Vars::Aimbot::General::AimFOV.Value) + float flFOVTo; Vec3 vPos, vAngleTo; + if (!F::AimbotGlobal.EntityCenterInFOV(pEntity, vLocalPos, vLocalAngles, flFOVTo, vPos, vAngleTo)) continue; int iPriority = 0; @@ -102,10 +100,8 @@ static inline std::vector GetTargets(CTFPlayer* pLocal, CTFWeaponBase* if (F::AimbotGlobal.ShouldIgnore(pEntity, pLocal, pWeapon)) continue; - Vec3 vPos = pEntity->GetCenter(); - Vec3 vAngleTo = Math::CalcAngle(vLocalPos, vPos); - float flFOVTo = Math::CalcFov(vLocalAngles, vAngleTo); - if (flFOVTo > Vars::Aimbot::General::AimFOV.Value) + float flFOVTo; Vec3 vPos, vAngleTo; + if (!F::AimbotGlobal.EntityCenterInFOV(pEntity, vLocalPos, vLocalAngles, flFOVTo, vPos, vAngleTo)) continue; float flDistTo = vLocalPos.DistToSqr(vPos); @@ -361,6 +357,14 @@ int CAimbotMelee::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBase* pW for (auto pRecord : vRecords) { + // possibly account melee bounds as well? + tTarget.m_vPos = m_vEyePos.Clamp(pRecord->m_vOrigin + pRecord->m_vMins, pRecord->m_vOrigin + pRecord->m_vMaxs); + if (Vars::Aimbot::Melee::AutoBackstab.Value && pWeapon->GetWeaponID() == TF_WEAPON_KNIFE) + tTarget.m_vPos.x = pRecord->m_vOrigin.x, tTarget.m_vPos.y = pRecord->m_vOrigin.y; + Aim(G::CurrentUserCmd->viewangles, Math::CalcAngle(m_vEyePos, tTarget.m_vPos), tTarget.m_vAngleTo); + if (!F::AimbotGlobal.ShouldAimAtAngle(tTarget.m_vAngleTo)) + continue; + Vec3 vRestoreOrigin = tTarget.m_pEntity->GetAbsOrigin(); Vec3 vRestoreMins = tTarget.m_pEntity->m_vecMins(); Vec3 vRestoreMaxs = tTarget.m_pEntity->m_vecMaxs(); @@ -369,12 +373,6 @@ int CAimbotMelee::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBase* pW tTarget.m_pEntity->m_vecMins() = pRecord->m_vMins + PLAYER_ORIGIN_COMPRESSION; tTarget.m_pEntity->m_vecMaxs() = pRecord->m_vMaxs - PLAYER_ORIGIN_COMPRESSION; - // possibly account melee bounds as well? - tTarget.m_vPos = m_vEyePos.Clamp(pRecord->m_vOrigin + tTarget.m_pEntity->m_vecMins(), pRecord->m_vOrigin + tTarget.m_pEntity->m_vecMaxs()); - if (Vars::Aimbot::Melee::AutoBackstab.Value && pWeapon->GetWeaponID() == TF_WEAPON_KNIFE) - tTarget.m_vPos.x = pRecord->m_vOrigin.x, tTarget.m_vPos.y = pRecord->m_vOrigin.y; - Aim(G::CurrentUserCmd->viewangles, Math::CalcAngle(m_vEyePos, tTarget.m_vPos), tTarget.m_vAngleTo); - Vec3 vForward; Math::AngleVectors(tTarget.m_vAngleTo, &vForward); Vec3 vTraceEnd = m_vEyePos + vForward * flRange; @@ -673,7 +671,6 @@ bool CAimbotMelee::RunSapper(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCmd Vec3 vAngleTo = Math::CalcAngle(vLocalPos, vPoint); const float flFOVTo = Math::CalcFov(vLocalAngles, vAngleTo); const float flDistTo = vLocalPos.DistToSqr(vPoint); - if (flFOVTo > Vars::Aimbot::General::AimFOV.Value) continue; diff --git a/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.cpp b/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.cpp index 5442ea55..451d505b 100644 --- a/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.cpp +++ b/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.cpp @@ -98,10 +98,8 @@ static inline std::vector GetTargets(CTFPlayer* pLocal, CTFWeaponBase* if (bTeam && (pEntity->As()->m_iHealth() >= pEntity->As()->m_iMaxHealth() || pEntity->As()->m_bBuilding())) continue; - Vec3 vPos = pEntity->GetCenter(); - Vec3 vAngleTo = Math::CalcAngle(vLocalPos, vPos); - float flFOVTo = Math::CalcFov(vLocalAngles, vAngleTo); - if (flFOVTo > Vars::Aimbot::General::AimFOV.Value) + float flFOVTo; Vec3 vPos, vAngleTo; + if (!F::AimbotGlobal.EntityCenterInFOV(pEntity, vLocalPos, vLocalAngles, flFOVTo, vPos, vAngleTo)) continue; int iPriority = 0; @@ -146,10 +144,8 @@ static inline std::vector GetTargets(CTFPlayer* pLocal, CTFWeaponBase* if (F::AimbotGlobal.ShouldIgnore(pEntity, pLocal, pWeapon)) continue; - Vec3 vPos = pEntity->GetCenter(); - Vec3 vAngleTo = Math::CalcAngle(vLocalPos, vPos); - float flFOVTo = Math::CalcFov(vLocalAngles, vAngleTo); - if (flFOVTo > Vars::Aimbot::General::AimFOV.Value) + float flFOVTo; Vec3 vPos, vAngleTo; + if (!F::AimbotGlobal.EntityCenterInFOV(pEntity, vLocalPos, vLocalAngles, flFOVTo, vPos, vAngleTo)) continue; float flDistTo = vLocalPos.DistToSqr(vPos); @@ -165,10 +161,8 @@ static inline std::vector GetTargets(CTFPlayer* pLocal, CTFWeaponBase* if (F::AimbotGlobal.ShouldIgnore(pEntity, pLocal, pWeapon)) continue; - Vec3 vPos = pEntity->GetCenter(); - Vec3 vAngleTo = Math::CalcAngle(vLocalPos, vPos); - float flFOVTo = Math::CalcFov(vLocalAngles, vAngleTo); - if (flFOVTo > Vars::Aimbot::General::AimFOV.Value) + float flFOVTo; Vec3 vPos, vAngleTo; + if (!F::AimbotGlobal.EntityCenterInFOV(pEntity, vLocalPos, vLocalAngles, flFOVTo, vPos, vAngleTo)) continue; float flDistTo = vLocalPos.DistToSqr(vPos); @@ -1692,6 +1686,8 @@ int CAimbotProjectile::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBas splash: if (HandleSplash(mSplashHistory)) break; } F::MoveSim.Restore(m_tMoveStorage); + if (!F::AimbotGlobal.ShouldAimAtAngle(m_vAngleTo)) + return false; if (!bUpdate) return m_iResult; diff --git a/Amalgam/src/Features/ImGui/Menu/Menu.cpp b/Amalgam/src/Features/ImGui/Menu/Menu.cpp index 95307395..54bf1603 100644 --- a/Amalgam/src/Features/ImGui/Menu/Menu.cpp +++ b/Amalgam/src/Features/ImGui/Menu/Menu.cpp @@ -17,8 +17,7 @@ void CMenu::DrawMenu() { using namespace ImGui; - static bool bSetPosition = false; - if (!bSetPosition) + if (static bool bSetPosition = false; !bSetPosition) { SetNextWindowPos((GetIO().DisplaySize - ImVec2(H::Draw.Scale(750), H::Draw.Scale(500))) / 2, ImGuiCond_FirstUseEver); SetNextWindowSize({ H::Draw.Scale(750), H::Draw.Scale(500) }, ImGuiCond_FirstUseEver); @@ -173,9 +172,7 @@ void CMenu::MenuAimbot(int iTab) FColorPicker(Vars::Colors::FOVCircle); FToggle(Vars::Aimbot::General::AutoShoot, FToggleEnum::Left); FToggle(Vars::Aimbot::General::FOVCircle, FToggleEnum::Right); - FToggle(Vars::CritHack::ForceCrits, FToggleEnum::Left); - FToggle(Vars::CritHack::AvoidRandomCrits, FToggleEnum::Right); - FToggle(Vars::CritHack::AlwaysMeleeCrit, FToggleEnum::Left); + FToggle(Vars::Aimbot::General::LeadAndRestrict, FToggleEnum::Left); FToggle(Vars::Aimbot::General::NoSpread, FToggleEnum::Right); } EndSection(); if (Vars::Debug::Options.Value) @@ -202,6 +199,12 @@ void CMenu::MenuAimbot(int iTab) FSlider(Vars::Backtrack::Window); //FToggle(Vars::Backtrack::PreferOnShot); } EndSection(); + if (Section("Crit Hack", 8)) + { + FToggle(Vars::CritHack::ForceCrits, FToggleEnum::Left); + FToggle(Vars::CritHack::AvoidRandomCrits, FToggleEnum::Right); + FToggle(Vars::CritHack::AlwaysMeleeCrit); + } EndSection(); if (Vars::Debug::Options.Value) { if (Section("##Debug Backtrack")) diff --git a/Amalgam/src/SDK/Vars.h b/Amalgam/src/SDK/Vars.h index 8314f3f3..9e07c1f1 100644 --- a/Amalgam/src/SDK/Vars.h +++ b/Amalgam/src/SDK/Vars.h @@ -272,6 +272,7 @@ NAMESPACE_BEGIN(Vars) CVar(TickTolerance, "Tick tolerance", 4, SLIDER_CLAMP, 0, 21); CVar(AutoShoot, "Auto shoot", true); CVar(FOVCircle, "FOV Circle", true, VISUAL); + CVar(LeadAndRestrict, "Lead and restrict", false, VISUAL); CVar(NoSpread, "No spread", false); CVarEnum(AimHoldsFire, "Aim holds fire", 2, NOSAVE | DEBUGVAR, nullptr,