leading aim mode

This commit is contained in:
rei-2
2026-05-03 21:30:36 -04:00
parent a261d81ff3
commit a1374783a2
7 changed files with 254 additions and 236 deletions
@@ -53,7 +53,20 @@ void CAimbotGlobal::SortTargetsPost(std::vector<Target_t>& 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())
@@ -32,10 +32,13 @@ public:
void SortTargetsPre(std::vector<Target_t>& vTargets, int iMethod);
void SortTargetsPost(std::vector<Target_t>& 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);
@@ -81,10 +81,8 @@ static inline std::vector<Target_t> 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<Target_t> 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<Target_t> 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<Target_t> 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<Vec3> 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<std::tuple<const mstudiobbox_t*, int, int>> 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<CBaseAnimating>()->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<std::tuple<const mstudiobbox_t*, int, int>> 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<CBaseAnimating>()->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<Vec3> 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<Vec3> 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;
}
}
}
@@ -69,10 +69,8 @@ static inline std::vector<Target_t> GetTargets(CTFPlayer* pLocal, CTFWeaponBase*
if (bTeam && (bWrench && !AimFriendlyBuilding(pEntity->As<CBaseObject>()) || bSapper && !pEntity->As<CBaseObject>()->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<Target_t> 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;
@@ -98,10 +98,8 @@ static inline std::vector<Target_t> GetTargets(CTFPlayer* pLocal, CTFWeaponBase*
if (bTeam && (pEntity->As<CBaseObject>()->m_iHealth() >= pEntity->As<CBaseObject>()->m_iMaxHealth() || pEntity->As<CBaseObject>()->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<Target_t> 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<Target_t> 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;
+8 -5
View File
@@ -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"))
+1
View File
@@ -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,