targetting/priority changes

more customizeable healing options
ability to ignore unprioritized
mp_friendlyfire support
This commit is contained in:
rei-2
2025-08-15 21:39:51 -04:00
parent cb14f8aac6
commit 5e8c17d5ba
19 changed files with 178 additions and 74 deletions
@@ -123,7 +123,7 @@ bool CAimbotGlobal::ShouldIgnore(CBaseEntity* pEntity, CTFPlayer* pLocal, CTFWea
if (auto pGameRules = I::TFGameRules())
{
if (pGameRules->m_bTruceActive() && pLocal->m_iTeamNum() != pEntity->m_iTeamNum())
if (pGameRules->m_bTruceActive() && (FriendlyFire() || pLocal->m_iTeamNum() != pEntity->m_iTeamNum()))
return true;
}
@@ -135,16 +135,17 @@ bool CAimbotGlobal::ShouldIgnore(CBaseEntity* pEntity, CTFPlayer* pLocal, CTFWea
if (pPlayer == pLocal || !pPlayer->IsAlive() || pPlayer->IsAGhost())
return true;
if (pLocal->m_iTeamNum() == pEntity->m_iTeamNum())
if (!FriendlyFire() && pLocal->m_iTeamNum() == pEntity->m_iTeamNum())
return false;
if (F::PlayerUtils.IsIgnored(pPlayer->entindex()))
if (F::PlayerUtils.IsIgnored(pPlayer->entindex())
|| Vars::Aimbot::General::Ignore.Value & Vars::Aimbot::General::IgnoreEnum::Unprioritized && !F::PlayerUtils.IsPrioritized(pPlayer->entindex()))
return true;
if (Vars::Aimbot::General::Ignore.Value & Vars::Aimbot::General::IgnoreEnum::Friends && H::Entities.IsFriend(pPlayer->entindex())
|| Vars::Aimbot::General::Ignore.Value & Vars::Aimbot::General::IgnoreEnum::Party && H::Entities.InParty(pPlayer->entindex())
|| Vars::Aimbot::General::Ignore.Value & Vars::Aimbot::General::IgnoreEnum::Invulnerable && pPlayer->IsInvulnerable() && SDK::AttribHookValue(0, "crit_forces_victim_to_laugh", pWeapon) <= 0
|| Vars::Aimbot::General::Ignore.Value & Vars::Aimbot::General::IgnoreEnum::Cloaked && pPlayer->m_flInvisibility() && pPlayer->m_flInvisibility() >= Vars::Aimbot::General::IgnoreCloak.Value / 100.f
|| Vars::Aimbot::General::Ignore.Value & Vars::Aimbot::General::IgnoreEnum::Invisible && pPlayer->m_flInvisibility() && pPlayer->m_flInvisibility() >= Vars::Aimbot::General::IgnoreInvisible.Value / 100.f
|| Vars::Aimbot::General::Ignore.Value & Vars::Aimbot::General::IgnoreEnum::DeadRinger && pPlayer->m_bFeignDeathReady()
|| Vars::Aimbot::General::Ignore.Value & Vars::Aimbot::General::IgnoreEnum::Taunting && pPlayer->IsTaunting()
|| Vars::Aimbot::General::Ignore.Value & Vars::Aimbot::General::IgnoreEnum::Disguised && pPlayer->InCond(TF_COND_DISGUISED))
@@ -259,6 +260,12 @@ int CAimbotGlobal::GetPriority(int iIndex)
return F::PlayerUtils.GetPriority(iIndex);
}
bool CAimbotGlobal::FriendlyFire()
{
static auto mp_friendlyfire = U::ConVars.FindVar("mp_friendlyfire");
return mp_friendlyfire->GetBool();
}
bool CAimbotGlobal::ShouldAim()
{
switch (Vars::Aimbot::General::AimType.Value)
@@ -302,7 +309,8 @@ bool CAimbotGlobal::ValidBomb(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CBaseEn
pEntity = sphere.GetCurrentEntity();
sphere.NextEntity())
{
if (pEntity == pLocal || pEntity->IsPlayer() && (!pEntity->As<CTFPlayer>()->IsAlive() || pEntity->As<CTFPlayer>()->IsAGhost()) || pEntity->m_iTeamNum() == pLocal->m_iTeamNum())
if (pEntity == pLocal || pEntity->IsPlayer() && (!pEntity->As<CTFPlayer>()->IsAlive() || pEntity->As<CTFPlayer>()->IsAGhost())
|| !FriendlyFire() && pEntity->m_iTeamNum() == pLocal->m_iTeamNum())
continue;
Vec3 vPos; reinterpret_cast<CCollisionProperty*>(pEntity->GetCollideable())->CalcNearestPoint(vOrigin, &vPos);
@@ -30,6 +30,7 @@ public:
bool ShouldIgnore(CBaseEntity* pTarget, CTFPlayer* pLocal, CTFWeaponBase* pWeapon);
int GetPriority(int iIndex);
bool FriendlyFire();
bool ShouldAim();
bool ShouldHoldAttack(CTFWeaponBase* pWeapon);
@@ -17,29 +17,34 @@ std::vector<Target_t> CAimbotHitscan::GetTargets(CTFPlayer* pLocal, CTFWeaponBas
{
auto eGroupType = EGroupType::GROUP_INVALID;
if (Vars::Aimbot::General::Target.Value & Vars::Aimbot::General::TargetEnum::Players)
eGroupType = EGroupType::PLAYERS_ENEMIES;
if (SDK::AttribHookValue(0, "jarate_duration", pWeapon) > 0 && Vars::Aimbot::Hitscan::Modifiers.Value & Vars::Aimbot::Hitscan::ModifiersEnum::ExtinguishTeam)
eGroupType = EGroupType::PLAYERS_ALL;
{
eGroupType = !F::AimbotGlobal.FriendlyFire() || Vars::Aimbot::General::Ignore.Value & Vars::Aimbot::General::IgnoreEnum::Team ? EGroupType::PLAYERS_ENEMIES : EGroupType::PLAYERS_ALL;
if (Vars::Aimbot::Hitscan::Modifiers.Value & Vars::Aimbot::Hitscan::ModifiersEnum::ExtinguishTeam &&
!F::AimbotGlobal.FriendlyFire() && SDK::AttribHookValue(0, "jarate_duration", pWeapon) > 0)
eGroupType = EGroupType::PLAYERS_ALL;
}
if (pWeapon->GetWeaponID() == TF_WEAPON_MEDIGUN)
eGroupType = Vars::Aimbot::Healing::AutoHeal.Value ? EGroupType::PLAYERS_TEAMMATES : EGroupType::GROUP_INVALID;
bool bHeal = pWeapon->GetWeaponID() == TF_WEAPON_MEDIGUN;
for (auto pEntity : H::Entities.GetGroup(eGroupType))
{
bool bTeammate = pEntity->m_iTeamNum() == pLocal->m_iTeamNum();
if (F::AimbotGlobal.ShouldIgnore(pEntity, pLocal, pWeapon))
continue;
if (bTeammate)
bool bTeam = pEntity->m_iTeamNum() == pLocal->m_iTeamNum();
if (bTeam)
{
if (SDK::AttribHookValue(0, "jarate_duration", pWeapon) > 0)
{
if (!pEntity->As<CTFPlayer>()->InCond(TF_COND_BURNING))
continue;
}
else if (pWeapon->GetWeaponID() == TF_WEAPON_MEDIGUN)
if (bHeal)
{
if (pEntity->As<CTFPlayer>()->InCond(TF_COND_STEALTHED)
|| Vars::Aimbot::Healing::FriendsOnly.Value && !H::Entities.IsFriend(pEntity->entindex()) && !H::Entities.InParty(pEntity->entindex()))
|| Vars::Aimbot::Healing::HealPriority.Value == Vars::Aimbot::Healing::HealPriorityEnum::FriendsOnly
&& !H::Entities.IsFriend(pEntity->entindex()) && !H::Entities.InParty(pEntity->entindex()))
continue;
}
if (!F::AimbotGlobal.FriendlyFire() && SDK::AttribHookValue(0, "jarate_duration", pWeapon) > 0)
{
if (!pEntity->As<CTFPlayer>()->InCond(TF_COND_BURNING))
continue;
}
}
@@ -48,8 +53,23 @@ std::vector<Target_t> CAimbotHitscan::GetTargets(CTFPlayer* pLocal, CTFWeaponBas
if (!F::AimbotGlobal.PlayerBoneInFOV(pEntity->As<CTFPlayer>(), vLocalPos, vLocalAngles, flFOVTo, vPos, vAngleTo, Vars::Aimbot::Hitscan::Hitboxes.Value))
continue;
int iPriority = F::AimbotGlobal.GetPriority(pEntity->entindex());
if (bTeam && bHeal)
{
iPriority = 0;
switch (Vars::Aimbot::Healing::HealPriority.Value)
{
case Vars::Aimbot::Healing::HealPriorityEnum::PrioritizeFriends:
if (!H::Entities.IsFriend(pEntity->entindex()) && !H::Entities.InParty(pEntity->entindex()))
break;
[[fallthrough]];
case Vars::Aimbot::Healing::HealPriorityEnum::PrioritizeTeam:
iPriority = std::numeric_limits<int>::max();
}
}
float flDistTo = iSort == Vars::Aimbot::General::TargetSelectionEnum::Distance ? vLocalPos.DistTo(vPos) : 0.f;
vTargets.emplace_back(pEntity, TargetEnum::Player, vPos, vAngleTo, flFOVTo, flDistTo, bTeammate ? 0 : F::AimbotGlobal.GetPriority(pEntity->entindex()));
vTargets.emplace_back(pEntity, TargetEnum::Player, vPos, vAngleTo, flFOVTo, flDistTo, iPriority);
}
if (pWeapon->GetWeaponID() == TF_WEAPON_MEDIGUN)
@@ -14,10 +14,17 @@ std::vector<Target_t> CAimbotMelee::GetTargets(CTFPlayer* pLocal, CTFWeaponBase*
if (Vars::Aimbot::General::Target.Value & Vars::Aimbot::General::TargetEnum::Players)
{
bool bDisciplinary = Vars::Aimbot::Melee::WhipTeam.Value && SDK::AttribHookValue(0, "speed_buff_ally", pWeapon) > 0;
for (auto pEntity : H::Entities.GetGroup(bDisciplinary ? EGroupType::PLAYERS_ALL : EGroupType::PLAYERS_ENEMIES))
auto eGroupType = EGroupType::GROUP_INVALID;
if (Vars::Aimbot::General::Target.Value & Vars::Aimbot::General::TargetEnum::Players)
{
eGroupType = !F::AimbotGlobal.FriendlyFire() || Vars::Aimbot::General::Ignore.Value & Vars::Aimbot::General::IgnoreEnum::Team ? EGroupType::PLAYERS_ENEMIES : EGroupType::PLAYERS_ALL;
if (Vars::Aimbot::Melee::WhipTeam.Value &&
!F::AimbotGlobal.FriendlyFire() && SDK::AttribHookValue(0, "speed_buff_ally", pWeapon) > 0)
eGroupType = EGroupType::PLAYERS_ALL;
}
for (auto pEntity : H::Entities.GetGroup(eGroupType))
{
bool bTeammate = pEntity->m_iTeamNum() == pLocal->m_iTeamNum();
if (F::AimbotGlobal.ShouldIgnore(pEntity, pLocal, pWeapon))
continue;
@@ -25,8 +32,13 @@ std::vector<Target_t> CAimbotMelee::GetTargets(CTFPlayer* pLocal, CTFWeaponBase*
if (!F::AimbotGlobal.PlayerBoneInFOV(pEntity->As<CTFPlayer>(), vLocalPos, vLocalAngles, flFOVTo, vPos, vAngleTo))
continue;
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, bTeammate ? 0 : F::AimbotGlobal.GetPriority(pEntity->entindex()));
vTargets.emplace_back(pEntity, TargetEnum::Player, vPos, vAngleTo, flFOVTo, flDistTo, iPriority);
}
}
@@ -40,7 +52,8 @@ std::vector<Target_t> CAimbotMelee::GetTargets(CTFPlayer* pLocal, CTFWeaponBase*
if (F::AimbotGlobal.ShouldIgnore(pEntity, pLocal, pWeapon))
continue;
if (pEntity->m_iTeamNum() == pLocal->m_iTeamNum() && (bWrench && !AimFriendlyBuilding(pEntity->As<CBaseObject>()) || bDestroySapper && !pEntity->As<CBaseObject>()->m_bHasSapper()))
bool bTeam = pEntity->m_iTeamNum() == pLocal->m_iTeamNum();
if (bTeam && (bWrench && !AimFriendlyBuilding(pEntity->As<CBaseObject>()) || bDestroySapper && !pEntity->As<CBaseObject>()->m_bHasSapper()))
continue;
Vec3 vPos = pEntity->GetCenter();
@@ -202,9 +215,9 @@ void CAimbotMelee::UpdateInfo(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCm
m_bShouldSwing = m_iDoubletapTicks <= (iSwingTicks) || Vars::Doubletap::AntiWarp.Value && pLocal->m_hGroundEntity();
}
bool CAimbotMelee::CanBackstab(CBaseEntity* pTarget, Vec3 vEyeAngles)
bool CAimbotMelee::CanBackstab(CBaseEntity* pTarget, CTFPlayer* pLocal, Vec3 vEyeAngles)
{
if (!pTarget->IsPlayer())
if (!pTarget->IsPlayer() || pTarget->m_iTeamNum() == pLocal->m_iTeamNum())
return false;
if (Vars::Aimbot::Melee::IgnoreRazorback.Value)
@@ -303,7 +316,8 @@ int CAimbotMelee::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBase* pW
}
CGameTrace trace = {};
CTraceFilterHitscan filter = {}; filter.pSkip = pLocal;
CTraceFilterHitscan filter = {};
filter.pSkip = pLocal;
for (auto pRecord : vRecords)
{
Vec3 vRestoreOrigin = tTarget.m_pEntity->GetAbsOrigin();
@@ -330,7 +344,7 @@ int CAimbotMelee::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBase* pW
}
if (bReturn && Vars::Aimbot::Melee::AutoBackstab.Value && pWeapon->GetWeaponID() == TF_WEAPON_KNIFE)
bReturn = CanBackstab(tTarget.m_pEntity, tTarget.m_vAngleTo);
bReturn = CanBackstab(tTarget.m_pEntity, pLocal, tTarget.m_vAngleTo);
tTarget.m_pEntity->SetAbsOrigin(vRestoreOrigin);
tTarget.m_pEntity->m_vecMins() = vRestoreMins;
@@ -12,7 +12,7 @@ private:
int GetSwingTime(CTFWeaponBase* pWeapon, bool bVar = true);
void UpdateInfo(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCmd* pCmd, std::vector<Target_t> vTargets);
bool CanBackstab(CBaseEntity* pTarget, Vec3 vEyeAngles);
bool CanBackstab(CBaseEntity* pTarget, CTFPlayer* pLocal, Vec3 vEyeAngles);
int CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBase* pWeapon);
bool Aim(Vec3 vCurAngle, Vec3 vToAngle, Vec3& vOut, int iMethod = Vars::Aimbot::General::AimType.Value);
@@ -8,7 +8,7 @@
#include "../AutoAirblast/AutoAirblast.h"
//#define SPLASH_DEBUG1 // normal splash visualization
#define SPLASH_DEBUG2 // obstructed splash visualization
//#define SPLASH_DEBUG2 // obstructed splash visualization
//#define SPLASH_DEBUG3 // simple splash visualization
//#define SPLASH_DEBUG4 // points visualization
//#define SPLASH_DEBUG5 // trace visualization
@@ -29,26 +29,27 @@ std::vector<Target_t> CAimbotProjectile::GetTargets(CTFPlayer* pLocal, CTFWeapon
{
EGroupType eGroupType = EGroupType::GROUP_INVALID;
if (Vars::Aimbot::General::Target.Value & Vars::Aimbot::General::TargetEnum::Players)
eGroupType = EGroupType::PLAYERS_ENEMIES;
if (Vars::Aimbot::Healing::AutoHeal.Value)
eGroupType = !F::AimbotGlobal.FriendlyFire() || Vars::Aimbot::General::Ignore.Value & Vars::Aimbot::General::IgnoreEnum::Team ? EGroupType::PLAYERS_ENEMIES : EGroupType::PLAYERS_ALL;
if (Vars::Aimbot::Healing::AutoArrow.Value)
{
switch (pWeapon->GetWeaponID())
{
case TF_WEAPON_CROSSBOW: eGroupType = eGroupType == EGroupType::PLAYERS_ENEMIES ? EGroupType::PLAYERS_ALL : EGroupType::PLAYERS_TEAMMATES; break;
case TF_WEAPON_CROSSBOW: eGroupType = eGroupType != EGroupType::GROUP_INVALID ? EGroupType::PLAYERS_ALL : EGroupType::PLAYERS_TEAMMATES; break;
case TF_WEAPON_LUNCHBOX: eGroupType = EGroupType::PLAYERS_TEAMMATES; break;
}
}
bool bHeal = pWeapon->GetWeaponID() == TF_WEAPON_CROSSBOW || pWeapon->GetWeaponID() == TF_WEAPON_LUNCHBOX;
for (auto pEntity : H::Entities.GetGroup(eGroupType))
{
bool bTeammate = pEntity->m_iTeamNum() == pLocal->m_iTeamNum();
if (F::AimbotGlobal.ShouldIgnore(pEntity, pLocal, pWeapon))
continue;
if (bTeammate)
bool bTeam = pEntity->m_iTeamNum() == pLocal->m_iTeamNum();
if (bTeam && bHeal)
{
if (pEntity->As<CTFPlayer>()->m_iHealth() >= pEntity->As<CTFPlayer>()->GetMaxHealth()
|| Vars::Aimbot::Healing::FriendsOnly.Value && !H::Entities.IsFriend(pEntity->entindex()) && !H::Entities.InParty(pEntity->entindex()))
|| Vars::Aimbot::Healing::HealPriority.Value == Vars::Aimbot::Healing::HealPriorityEnum::FriendsOnly && !H::Entities.IsFriend(pEntity->entindex()) && !H::Entities.InParty(pEntity->entindex()))
continue;
}
@@ -56,8 +57,23 @@ std::vector<Target_t> CAimbotProjectile::GetTargets(CTFPlayer* pLocal, CTFWeapon
if (!F::AimbotGlobal.PlayerBoneInFOV(pEntity->As<CTFPlayer>(), vLocalPos, vLocalAngles, flFOVTo, vPos, vAngleTo))
continue;
int iPriority = F::AimbotGlobal.GetPriority(pEntity->entindex());
if (bTeam && bHeal)
{
iPriority = 0;
switch (Vars::Aimbot::Healing::HealPriority.Value)
{
case Vars::Aimbot::Healing::HealPriorityEnum::PrioritizeFriends:
if (!H::Entities.IsFriend(pEntity->entindex()) && !H::Entities.InParty(pEntity->entindex()))
break;
[[fallthrough]];
case Vars::Aimbot::Healing::HealPriorityEnum::PrioritizeTeam:
iPriority = std::numeric_limits<int>::max();
}
}
float flDistTo = iSort == Vars::Aimbot::General::TargetSelectionEnum::Distance ? vLocalPos.DistTo(vPos) : 0.f;
vTargets.emplace_back(pEntity, TargetEnum::Player, vPos, vAngleTo, flFOVTo, flDistTo, bTeammate ? 0 : F::AimbotGlobal.GetPriority(pEntity->entindex()));
vTargets.emplace_back(pEntity, TargetEnum::Player, vPos, vAngleTo, flFOVTo, flDistTo, iPriority);
}
if (pWeapon->GetWeaponID() == TF_WEAPON_LUNCHBOX)
@@ -72,7 +88,8 @@ std::vector<Target_t> CAimbotProjectile::GetTargets(CTFPlayer* pLocal, CTFWeapon
if (F::AimbotGlobal.ShouldIgnore(pEntity, pLocal, pWeapon))
continue;
if (pEntity->m_iTeamNum() == pLocal->m_iTeamNum() && pEntity->As<CBaseObject>()->m_iHealth() >= pEntity->As<CBaseObject>()->m_iMaxHealth())
bool bTeam = pEntity->m_iTeamNum() == pLocal->m_iTeamNum();
if (bTeam && pEntity->As<CBaseObject>()->m_iHealth() >= pEntity->As<CBaseObject>()->m_iMaxHealth())
continue;
Vec3 vPos = pEntity->GetCenter();
@@ -471,7 +488,7 @@ static inline void TracePoint(Vec3& vPoint, int& iType, Vec3& vTargetEye, Info_t
#ifdef SPLASH_DEBUG6
s_mTraceCount["Splash rocket (2, 2)"]++;
#endif
bNormal = trace.fraction == 1.f || trace.allsolid || (trace.startpos - trace.endpos).IsZero() || trace.surface.flags & (SURF_NODRAW | SURF_SKY);
bNormal = trace.fraction == 1.f || trace.allsolid || (trace.startpos - trace.endpos).IsZero() || trace.surface.flags & (/*SURF_NODRAW |*/ SURF_SKY);
#ifdef SPLASH_DEBUG2
{
Vec3 vMins = Vec3(-1, -1, -1) * (bNormal ? 0.5f : 1.f), vMaxs = Vec3(1, 1, 1) * (bNormal ? 0.5f : 1.f);
@@ -1145,8 +1162,24 @@ bool CAimbotProjectile::TestAngle(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, Tar
return false;
CGameTrace trace = {};
CTraceFilterCollideable filter = {}; filter.pSkip = bSplash ? tTarget.m_pEntity : pLocal; filter.iPlayer = bSplash ? PLAYER_NONE : PLAYER_DEFAULT; filter.bMisc = !bSplash;
CTraceFilterCollideable filter = {};
filter.pSkip = bSplash ? tTarget.m_pEntity : pLocal;
filter.iPlayer = bSplash ? PLAYER_NONE : PLAYER_DEFAULT;
filter.bMisc = !bSplash;
int nMask = MASK_SOLID;
if (!bSplash && F::AimbotGlobal.FriendlyFire())
{
switch (pWeapon->GetWeaponID())
{ // only weapons that actually hit teammates properly
case TF_WEAPON_ROCKETLAUNCHER:
case TF_WEAPON_ROCKETLAUNCHER_DIRECTHIT:
case TF_WEAPON_PARTICLE_CANNON:
case TF_WEAPON_DRG_POMSON:
case TF_WEAPON_FLAREGUN:
case TF_WEAPON_SYRINGEGUN_MEDIC:
filter.iPlayer = PLAYER_ALL;
}
}
F::ProjSim.SetupTrace(filter, nMask, pWeapon);
#ifdef SPLASH_DEBUG5
@@ -1924,7 +1957,9 @@ bool CAimbotProjectile::TestAngle(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CBa
if (!F::ProjSim.Initialize(tProjInfo, false, true))
return false;
CTraceFilterCollideable filter = {}; filter.pSkip = bSplash ? tTarget.m_pEntity : pLocal; filter.iPlayer = bSplash ? PLAYER_NONE : PLAYER_DEFAULT;
CTraceFilterCollideable filter = {};
filter.pSkip = bSplash ? tTarget.m_pEntity : pLocal;
filter.iPlayer = bSplash ? PLAYER_NONE : PLAYER_DEFAULT;
int nMask = MASK_SOLID;
F::ProjSim.SetupTrace(filter, nMask, pProjectile);
@@ -2145,7 +2180,7 @@ bool CAimbotProjectile::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBa
float flDist = bSplash ? tTarget.m_vPos.DistTo(vPoint.m_vPoint) : flLowestDist;
bool bPriority = bSplash ? iPriority <= iLowestPriority : iPriority < iLowestPriority;
bool bTime = bSplash || m_tInfo.m_iPrimeTime < i || tStorage.m_MoveData.m_vecVelocity.IsZero();
bool bTime = bSplash || tStorage.m_MoveData.m_vecVelocity.IsZero();
bool bDist = !bSplash || flDist < flLowestDist;
if (!bSplash && !bPriority)
mDirectPoints.erase(iIndex);
@@ -72,7 +72,8 @@ static inline bool CheckEntities(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUse
pEntity = sphere.GetCurrentEntity();
sphere.NextEntity())
{
if (pEntity == pLocal || pEntity->IsPlayer() && (!pEntity->As<CTFPlayer>()->IsAlive() || pEntity->As<CTFPlayer>()->IsAGhost()) || pEntity->m_iTeamNum() == pLocal->m_iTeamNum())
if (pEntity == pLocal || pEntity->IsPlayer() && (!pEntity->As<CTFPlayer>()->IsAlive() || pEntity->As<CTFPlayer>()->IsAGhost())
|| !F::AimbotGlobal.FriendlyFire() && pEntity->m_iTeamNum() == pLocal->m_iTeamNum())
continue;
// CEntitySphereQuery actually does a box test so we need to make sure the distance is less than the radius first
@@ -83,10 +84,10 @@ static inline bool CheckEntities(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUse
if (F::AimbotGlobal.ShouldIgnore(pEntity, pLocal, pWeapon))
continue;
if (Vars::Aimbot::Projectile::AutoDetonate.Value & Vars::Aimbot::Projectile::AutoDetonateEnum::IgnoreCloak && pEntity->IsPlayer())
if (Vars::Aimbot::Projectile::AutoDetonate.Value & Vars::Aimbot::Projectile::AutoDetonateEnum::IgnoreInvisible && pEntity->IsPlayer())
{
auto pPlayer = pEntity->As<CTFPlayer>();
if (pPlayer->m_flInvisibility() && pPlayer->m_flInvisibility() >= Vars::Aimbot::General::IgnoreCloak.Value / 100.f)
if (pPlayer->m_flInvisibility() && pPlayer->m_flInvisibility() >= Vars::Aimbot::General::IgnoreInvisible.Value / 100.f)
continue;
}
@@ -12,7 +12,9 @@ void CAutoHeal::ActivateOnVoice(CTFPlayer* pLocal, CWeaponMedigun* pWeapon, CUse
return;
auto pTarget = pWeapon->m_hHealingTarget().Get();
if (!pTarget || Vars::Aimbot::Healing::FriendsOnly.Value && !H::Entities.IsFriend(pTarget->entindex()) && !H::Entities.InParty(pTarget->entindex()))
if (!pTarget
|| Vars::Aimbot::Healing::HealPriority.Value == Vars::Aimbot::Healing::HealPriorityEnum::FriendsOnly
&& !H::Entities.IsFriend(pTarget->entindex()) && !H::Entities.InParty(pTarget->entindex()))
return;
if (m_mMedicCallers.contains(pTarget->entindex()))
@@ -436,7 +438,9 @@ void CAutoHeal::GetDangers(CTFPlayer* pTarget, bool bVaccinator, float& flBullet
pWeapon = pEntity->As<CTFBaseProjectile>()->m_hLauncher()->As<CTFWeaponBase>();
pOwner = pWeapon ? pWeapon->m_hOwner()->As<CTFPlayer>() : nullptr;
}
if (!pOwner || pOwner->m_iTeamNum() == pTarget->m_iTeamNum() || pWeapon && !pWeapon->GetDamage())
if (!pOwner
|| (!F::AimbotGlobal.FriendlyFire() || pEntity->GetClassID() == ETFClassID::CTFProjectile_HealingBolt) && pOwner->m_iTeamNum() == pTarget->m_iTeamNum()
|| pWeapon && !pWeapon->GetDamage())
continue;
Vec3 vVelocity = F::ProjSim.GetVelocity(pEntity);
@@ -557,7 +561,8 @@ void CAutoHeal::AutoVaccinator(CTFPlayer* pLocal, CWeaponMedigun* pWeapon, CUser
std::vector<CTFPlayer*> vTargets = { pLocal };
if (auto pTarget = pWeapon->m_hHealingTarget()->As<CTFPlayer>(); pTarget &&
(!Vars::Aimbot::Healing::FriendsOnly.Value || H::Entities.IsFriend(pTarget->entindex()) || H::Entities.InParty(pTarget->entindex())))
(Vars::Aimbot::Healing::HealPriority.Value <= Vars::Aimbot::Healing::HealPriorityEnum::FriendsOnly
|| H::Entities.IsFriend(pTarget->entindex()) || H::Entities.InParty(pTarget->entindex())))
vTargets.push_back(pTarget);
for (auto pTarget : vTargets)
@@ -626,7 +631,10 @@ void CAutoHeal::Event(IGameEvent* pEvent, uint32_t uHash)
bool bMinicrit = pEvent->GetBool("minicrit");
int iTarget = pWeapon->m_hHealingTarget().GetEntryIndex();
if (iVictim == iAttacker || iVictim != I::EngineClient->GetLocalPlayer() && (iVictim != iTarget || Vars::Aimbot::Healing::FriendsOnly.Value && !H::Entities.IsFriend(iTarget) && !H::Entities.InParty(iTarget)))
if (iVictim == iAttacker || iVictim != I::EngineClient->GetLocalPlayer()
&& (iVictim != iTarget
|| Vars::Aimbot::Healing::HealPriority.Value == Vars::Aimbot::Healing::HealPriorityEnum::FriendsOnly
&& !H::Entities.IsFriend(iTarget) && !H::Entities.InParty(iTarget)))
return;
auto pEntity = I::ClientEntityList->GetClientEntity(iAttacker)->As<CTFPlayer>();
@@ -159,7 +159,8 @@ void CAutoRocketJump::Run(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCmd* p
Vec3 New = F::ProjSim.GetOrigin();
CGameTrace trace = {};
CTraceFilterCollideable filter = {}; filter.pSkip = pLocal;
CTraceFilterCollideable filter = {};
filter.pSkip = pLocal;
SDK::Trace(Old, New, MASK_SOLID, &filter, &trace);
if (trace.DidHit())
{
+1 -1
View File
@@ -1196,7 +1196,7 @@ namespace ImGui
#ifdef ALTERNATE_FULL_SLIDER
auto vWrapped = WrapText(StripDoubleHash(sLabel), bFull ? vSize.x / 2 - H::Draw.Scale(24) : vSize.x - flEntryWidth - H::Draw.Scale(20));
#else
auto vWrapped = WrapText(StripDoubleHash(sLabel), vSize.x - H::Draw.Scale(20) - flEntryWidth);
auto vWrapped = WrapText(StripDoubleHash(sLabel), vSize.x - H::Draw.Scale(14) - flEntryWidth);
#endif
int iWraps = std::min(int(vWrapped.size()), 2); // prevent too many wraps
#ifdef ALTERNATE_FULL_SLIDER
+5 -4
View File
@@ -150,9 +150,9 @@ void CMenu::MenuAimbot(int iTab)
FDropdown(Vars::Aimbot::General::Ignore, FDropdownEnum::Right);
FSlider(Vars::Aimbot::General::AimFOV);
FSlider(Vars::Aimbot::General::MaxTargets, FSliderEnum::Left);
PushTransparent(!(Vars::Aimbot::General::Ignore.Value & Vars::Aimbot::General::IgnoreEnum::Cloaked));
PushTransparent(!(Vars::Aimbot::General::Ignore.Value & Vars::Aimbot::General::IgnoreEnum::Invisible));
{
FSlider(Vars::Aimbot::General::IgnoreCloak, FSliderEnum::Right);
FSlider(Vars::Aimbot::General::IgnoreInvisible, FSliderEnum::Right);
}
PopTransparent();
FSlider(Vars::Aimbot::General::AssistStrength, FSliderEnum::Left);
@@ -196,10 +196,11 @@ void CMenu::MenuAimbot(int iTab)
FSlider(Vars::Backtrack::Offset);
} EndSection();
}
if (Section("Healing", 8))
if (Section("Healing"))
{
FDropdown(Vars::Aimbot::Healing::HealPriority);
FToggle(Vars::Aimbot::Healing::AutoHeal, FToggleEnum::Left);
FToggle(Vars::Aimbot::Healing::FriendsOnly, FToggleEnum::Right);
FToggle(Vars::Aimbot::Healing::AutoArrow, FToggleEnum::Right);
FToggle(Vars::Aimbot::Healing::AutoVaccinator, FToggleEnum::Left);
FToggle(Vars::Aimbot::Healing::ActivateOnVoice, FToggleEnum::Right);
} EndSection();
+1 -1
View File
@@ -190,10 +190,10 @@ void COutput::UserMessage(bf_read& msgData)
char sTarget[256]; msgData.ReadString(sTarget, sizeof(sTarget));
int iTarget = msgData.ReadByte() >> 1;
msgData.Seek(0);
bool bSameTeam = iTeam == pLocal->m_iTeamNum();
if (!iCaller || !iTarget)
return;
bool bSameTeam = iTeam == pLocal->m_iTeamNum();
auto sCallerName = F::PlayerUtils.GetPlayerName(iCaller, pResource->GetName(iCaller));
auto sTargetName = F::PlayerUtils.GetPlayerName(iTarget, pResource->GetName(iTarget));
OutputInfo(Vars::Logging::VoteStart::LogTo.Value, "Vote Start",
@@ -268,9 +268,8 @@ bool CProjectileSimulation::GetInfo(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon,
return bReturn;
CGameTrace trace = {};
CTraceFilterCollideable filter = {}; filter.pSkip = pPlayer;
if (pWeapon->GetWeaponID() == TF_WEAPON_RAYGUN)
filter.iObject = OBJECT_DEFAULT;
CTraceFilterWorldAndPropsOnly filter = {};
filter.pSkip = pPlayer;
Vec3 vStart = bQuick ? pPlayer->GetEyePosition() : pPlayer->GetShootPos();
Vec3 vEnd = tProjInfo.m_vPos;
+4 -2
View File
@@ -72,7 +72,8 @@ void CVisuals::ProjectileTrace(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon, const
return;
CGameTrace trace = {};
CTraceFilterCollideable filter = {}; filter.pSkip = pPlayer;
CTraceFilterCollideable filter = {};
filter.pSkip = pPlayer;
int nMask = MASK_SOLID;
F::ProjSim.SetupTrace(filter, nMask, pWeapon, 0, bQuick);
@@ -842,7 +843,8 @@ void CVisuals::Store(CTFPlayer* pLocal)
Vec3 vShootEnd = mDots.contains(pPlayer) ? mDots[pPlayer] : vShootPos + (vForward * 8192.f);
CGameTrace trace = {};
CTraceFilterHitscan filter = {}; filter.pSkip = pPlayer;
CTraceFilterHitscan filter = {};
filter.pSkip = pPlayer;
SDK::Trace(vShootPos, vShootEnd, MASK_SHOT, &filter, &trace);
m_vSightLines.emplace_back(vShootPos, trace.endpos, F::Groups.GetColor(pPlayer, pGroup), !pGroup->m_bSightlinesIgnoreZ);
@@ -41,7 +41,8 @@ MAKE_HOOK(CHudCrosshair_GetDrawPosition, S::CHudCrosshair_GetDrawPosition(), voi
Vec3 vEndPos = vStartPos + vForward * 8192;
CGameTrace trace = {};
CTraceFilterHitscan filter = {}; filter.pSkip = pLocal;
CTraceFilterHitscan filter = {};
filter.pSkip = pLocal;
SDK::Trace(vStartPos, vEndPos, MASK_SHOT, &filter, &trace);
Vec3 vScreen;
+2 -1
View File
@@ -26,7 +26,8 @@ MAKE_HOOK(CTFPlayer_FireBullet, S::CTFPlayer_FireBullet(), void,
const Vec3 vStart = info.m_vecSrc;
const Vec3 vEnd = vStart + info.m_vecDirShooting * info.m_flDistance;
CGameTrace trace = {};
CTraceFilterHitscan filter = {}; filter.pSkip = pLocal;
CTraceFilterHitscan filter = {};
filter.pSkip = pLocal;
SDK::Trace(vStart, vEnd, MASK_SHOT | CONTENTS_GRATE, &filter, &trace);
int iIndex = I::EngineClient->GetLocalPlayer();
@@ -69,6 +69,7 @@ bool CTraceFilterCollideable::ShouldHitEntity(IHandleEntity* pServerEntity, int
case ETFClassID::CDynamicProp:
case ETFClassID::CPhysicsProp:
case ETFClassID::CPhysicsPropMultiplayer:
case ETFClassID::CFunc_LOD:
case ETFClassID::CObjectCartDispenser:
case ETFClassID::CFuncTrackTrain:
case ETFClassID::CFuncConveyor: return true;
@@ -128,6 +129,7 @@ bool CTraceFilterWorldAndPropsOnly::ShouldHitEntity(IHandleEntity* pServerEntity
case ETFClassID::CDynamicProp:
case ETFClassID::CPhysicsProp:
case ETFClassID::CPhysicsPropMultiplayer:
case ETFClassID::CFunc_LOD:
case ETFClassID::CObjectCartDispenser:
case ETFClassID::CFuncTrackTrain:
case ETFClassID::CFuncConveyor: return true;
+12 -5
View File
@@ -330,7 +330,8 @@ void SDK::TraceHull(const Vec3& vecStart, const Vec3& vecEnd, const Vec3& vecHul
bool SDK::VisPos(CBaseEntity* pSkip, const CBaseEntity* pEntity, const Vec3& vFrom, const Vec3& vTo, unsigned int nMask)
{
CGameTrace trace = {};
CTraceFilterHitscan filter = {}; filter.pSkip = pSkip;
CTraceFilterHitscan filter = {};
filter.pSkip = pSkip;
Trace(vFrom, vTo, nMask, &filter, &trace);
if (trace.DidHit())
return trace.m_pEnt && trace.m_pEnt == pEntity;
@@ -339,7 +340,9 @@ bool SDK::VisPos(CBaseEntity* pSkip, const CBaseEntity* pEntity, const Vec3& vFr
bool SDK::VisPosCollideable(CBaseEntity* pSkip, const CBaseEntity* pEntity, const Vec3& vFrom, const Vec3& vTo, unsigned int nMask)
{
CGameTrace trace = {};
CTraceFilterCollideable filter = {}; filter.pSkip = pSkip; filter.iType = SKIP_CHECK;
CTraceFilterCollideable filter = {};
filter.pSkip = pSkip;
filter.iType = SKIP_CHECK;
Trace(vFrom, vTo, nMask, &filter, &trace);
if (trace.DidHit())
return trace.m_pEnt && trace.m_pEnt == pEntity;
@@ -348,7 +351,8 @@ bool SDK::VisPosCollideable(CBaseEntity* pSkip, const CBaseEntity* pEntity, cons
bool SDK::VisPosWorld(CBaseEntity* pSkip, const CBaseEntity* pEntity, const Vec3& vFrom, const Vec3& vTo, unsigned int nMask)
{
CGameTrace trace = {};
CTraceFilterWorldAndPropsOnly filter = {}; filter.pSkip = pSkip;
CTraceFilterWorldAndPropsOnly filter = {};
filter.pSkip = pSkip;
Trace(vFrom, vTo, nMask, &filter, &trace);
if (trace.DidHit())
return trace.m_pEnt && trace.m_pEnt == pEntity;
@@ -599,7 +603,8 @@ int SDK::IsAttacking(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, const CUserCmd*
Vec3 vForward; Math::AngleVectors(vAngle, &vForward);
CGameTrace trace = {};
CTraceFilterHitscan filter = {}; filter.pSkip = pLocal;
CTraceFilterHitscan filter = {};
filter.pSkip = pLocal;
static auto tf_grapplinghook_max_distance = U::ConVars.FindVar("tf_grapplinghook_max_distance");
const float flGrappleDistance = tf_grapplinghook_max_distance->GetFloat();
Trace(vPos, vPos + vForward * flGrappleDistance, MASK_SOLID, &filter, &trace);
@@ -782,7 +787,9 @@ void SDK::GetProjectileFireSetup(CTFPlayer* pPlayer, const Vec3& vAngIn, Vec3 vO
Vec3 vEndPos = vShootPos + vForward * 2000.f;
CGameTrace trace = {};
CTraceFilterCollideable filter = {}; filter.pSkip = pPlayer; filter.iType = SKIP_CHECK;
CTraceFilterCollideable filter = {};
filter.pSkip = pPlayer;
filter.iType = SKIP_CHECK;
Trace(vShootPos, vEndPos, MASK_SOLID, &filter, &trace);
if (trace.DidHit() && trace.fraction > 0.1f)
vEndPos = trace.endpos;
+10 -7
View File
@@ -265,13 +265,13 @@ namespace Vars
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);
CVarEnum(Ignore, "Ignore", 0b000000000, DROPDOWN_MULTI, nullptr,
VA_LIST("Friends", "Party", "Invulnerable", "Cloaked", "Unsimulated players", "Dead Ringer", "Vaccinator", "Disguised", "Taunting"),
Friends = 1 << 0, Party = 1 << 1, Invulnerable = 1 << 2, Cloaked = 1 << 3, Unsimulated = 1 << 4, DeadRinger = 1 << 5, Vaccinator = 1 << 6, Disguised = 1 << 7, Taunting = 1 << 8);
VA_LIST("Friends", "Party", "Unprioritized", "Invulnerable", "Invisible", "Unsimulated", "Dead ringer", "Vaccinator", "Disguised", "Taunting", "Team"),
Friends = 1 << 0, Party = 1 << 1, Unprioritized = 1 << 2, Invulnerable = 1 << 3, Invisible = 1 << 4, Unsimulated = 1 << 5, DeadRinger = 1 << 6, Vaccinator = 1 << 7, Disguised = 1 << 8, Taunting = 1 << 9, Team = 1 << 10);
CVar(AimFOV, "Aim FOV", 30.f, SLIDER_CLAMP | SLIDER_PRECISION, 0.f, 180.f);
CVar(MaxTargets, "Max targets", 2, SLIDER_MIN, 1, 6);
CVar(IgnoreCloak, "Ignore cloak", 100.f, SLIDER_CLAMP | SLIDER_PRECISION, 0.f, 100.f, 10.f, "%g%%");
CVar(IgnoreInvisible, "Ignore invisible", 50.f, SLIDER_CLAMP | SLIDER_PRECISION, 0.f, 100.f, 10.f, "%g%%");
CVar(AssistStrength, "Assist strength", 25.f, SLIDER_CLAMP | SLIDER_PRECISION, 0.f, 100.f, 1.f, "%g%%");
CVar(TickTolerance, "Tick tolerance", 7, SLIDER_CLAMP, 0, 21);
CVar(TickTolerance, "Tick tolerance", 4, SLIDER_CLAMP, 0, 21);
CVar(AutoShoot, "Auto shoot", true);
CVar(FOVCircle, "FOV Circle", true, VISUAL);
CVar(NoSpread, "No spread", false);
@@ -309,8 +309,8 @@ namespace Vars
VA_LIST("Off", "Include", "Prefer", "Only"),
Off, Include, Prefer, Only);
CVarEnum(AutoDetonate, "Auto detonate", 0b00, DROPDOWN_MULTI, "Off",
VA_LIST("Stickies", "Flares", "##Divider", "Prevent self damage", "Ignore cloak"),
Stickies = 1 << 0, Flares = 1 << 1, PreventSelfDamage = 1 << 2, IgnoreCloak = 1 << 3);
VA_LIST("Stickies", "Flares", "##Divider", "Prevent self damage", "Ignore invisible"),
Stickies = 1 << 0, Flares = 1 << 1, PreventSelfDamage = 1 << 2, IgnoreInvisible = 1 << 3);
CVarEnum(AutoAirblast, "Auto airblast", 0b000, DROPDOWN_MULTI, "Off", // todo: implement advanced redirect!!
VA_LIST("Enabled", "##Divider", "Redirect", "Ignore FOV"),
Enabled = 1 << 0, Redirect = 1 << 1, IgnoreFOV = 1 << 2);
@@ -391,8 +391,11 @@ namespace Vars
SUBNAMESPACE_END(Melee);
SUBNAMESPACE_BEGIN(Healing)
CVarEnum(HealPriority, "Heal Priority", 0, NONE, nullptr,
VA_LIST("None", "Prioritize team", "Prioritize friends", "Friends only"),
None, PrioritizeTeam, PrioritizeFriends, FriendsOnly);
CVar(AutoHeal, "Auto heal", false);
CVar(FriendsOnly, VA_LIST("Friends only", "Heal friends only"), false);
CVar(AutoArrow, "Auto arrow", false);
CVar(AutoVaccinator, "Auto vaccinator", false);
CVar(ActivateOnVoice, "Activate on voice", false);