diff --git a/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.cpp b/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.cpp index 54f299e6..a00df9a4 100644 --- a/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.cpp +++ b/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.cpp @@ -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()->IsAlive() || pEntity->As()->IsAGhost()) || pEntity->m_iTeamNum() == pLocal->m_iTeamNum()) + if (pEntity == pLocal || pEntity->IsPlayer() && (!pEntity->As()->IsAlive() || pEntity->As()->IsAGhost()) + || !FriendlyFire() && pEntity->m_iTeamNum() == pLocal->m_iTeamNum()) continue; Vec3 vPos; reinterpret_cast(pEntity->GetCollideable())->CalcNearestPoint(vOrigin, &vPos); diff --git a/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.h b/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.h index b729c188..b2d06019 100644 --- a/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.h +++ b/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.h @@ -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); diff --git a/Amalgam/src/Features/Aimbot/AimbotHitscan/AimbotHitscan.cpp b/Amalgam/src/Features/Aimbot/AimbotHitscan/AimbotHitscan.cpp index f63a557c..533d378f 100644 --- a/Amalgam/src/Features/Aimbot/AimbotHitscan/AimbotHitscan.cpp +++ b/Amalgam/src/Features/Aimbot/AimbotHitscan/AimbotHitscan.cpp @@ -17,29 +17,34 @@ std::vector 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()->InCond(TF_COND_BURNING)) - continue; - } - else if (pWeapon->GetWeaponID() == TF_WEAPON_MEDIGUN) + if (bHeal) { if (pEntity->As()->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()->InCond(TF_COND_BURNING)) continue; } } @@ -48,8 +53,23 @@ std::vector CAimbotHitscan::GetTargets(CTFPlayer* pLocal, CTFWeaponBas if (!F::AimbotGlobal.PlayerBoneInFOV(pEntity->As(), 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::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) diff --git a/Amalgam/src/Features/Aimbot/AimbotMelee/AimbotMelee.cpp b/Amalgam/src/Features/Aimbot/AimbotMelee/AimbotMelee.cpp index 29045579..bb82c465 100644 --- a/Amalgam/src/Features/Aimbot/AimbotMelee/AimbotMelee.cpp +++ b/Amalgam/src/Features/Aimbot/AimbotMelee/AimbotMelee.cpp @@ -14,10 +14,17 @@ std::vector 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 CAimbotMelee::GetTargets(CTFPlayer* pLocal, CTFWeaponBase* if (!F::AimbotGlobal.PlayerBoneInFOV(pEntity->As(), 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 CAimbotMelee::GetTargets(CTFPlayer* pLocal, CTFWeaponBase* if (F::AimbotGlobal.ShouldIgnore(pEntity, pLocal, pWeapon)) continue; - if (pEntity->m_iTeamNum() == pLocal->m_iTeamNum() && (bWrench && !AimFriendlyBuilding(pEntity->As()) || bDestroySapper && !pEntity->As()->m_bHasSapper())) + bool bTeam = pEntity->m_iTeamNum() == pLocal->m_iTeamNum(); + if (bTeam && (bWrench && !AimFriendlyBuilding(pEntity->As()) || bDestroySapper && !pEntity->As()->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; diff --git a/Amalgam/src/Features/Aimbot/AimbotMelee/AimbotMelee.h b/Amalgam/src/Features/Aimbot/AimbotMelee/AimbotMelee.h index d00519f6..33ee94b2 100644 --- a/Amalgam/src/Features/Aimbot/AimbotMelee/AimbotMelee.h +++ b/Amalgam/src/Features/Aimbot/AimbotMelee/AimbotMelee.h @@ -12,7 +12,7 @@ private: int GetSwingTime(CTFWeaponBase* pWeapon, bool bVar = true); void UpdateInfo(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCmd* pCmd, std::vector 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); diff --git a/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.cpp b/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.cpp index 19e65df8..aef756dd 100644 --- a/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.cpp +++ b/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.cpp @@ -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 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()->m_iHealth() >= pEntity->As()->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 CAimbotProjectile::GetTargets(CTFPlayer* pLocal, CTFWeapon if (!F::AimbotGlobal.PlayerBoneInFOV(pEntity->As(), 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::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 CAimbotProjectile::GetTargets(CTFPlayer* pLocal, CTFWeapon if (F::AimbotGlobal.ShouldIgnore(pEntity, pLocal, pWeapon)) continue; - if (pEntity->m_iTeamNum() == pLocal->m_iTeamNum() && pEntity->As()->m_iHealth() >= pEntity->As()->m_iMaxHealth()) + bool bTeam = pEntity->m_iTeamNum() == pLocal->m_iTeamNum(); + if (bTeam && pEntity->As()->m_iHealth() >= pEntity->As()->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); diff --git a/Amalgam/src/Features/Aimbot/AutoDetonate/AutoDetonate.cpp b/Amalgam/src/Features/Aimbot/AutoDetonate/AutoDetonate.cpp index 25859f67..2575595d 100644 --- a/Amalgam/src/Features/Aimbot/AutoDetonate/AutoDetonate.cpp +++ b/Amalgam/src/Features/Aimbot/AutoDetonate/AutoDetonate.cpp @@ -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()->IsAlive() || pEntity->As()->IsAGhost()) || pEntity->m_iTeamNum() == pLocal->m_iTeamNum()) + if (pEntity == pLocal || pEntity->IsPlayer() && (!pEntity->As()->IsAlive() || pEntity->As()->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(); - 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; } diff --git a/Amalgam/src/Features/Aimbot/AutoHeal/AutoHeal.cpp b/Amalgam/src/Features/Aimbot/AutoHeal/AutoHeal.cpp index a41b91f3..ba895453 100644 --- a/Amalgam/src/Features/Aimbot/AutoHeal/AutoHeal.cpp +++ b/Amalgam/src/Features/Aimbot/AutoHeal/AutoHeal.cpp @@ -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()->m_hLauncher()->As(); pOwner = pWeapon ? pWeapon->m_hOwner()->As() : 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 vTargets = { pLocal }; if (auto pTarget = pWeapon->m_hHealingTarget()->As(); 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(); diff --git a/Amalgam/src/Features/Aimbot/AutoRocketJump/AutoRocketJump.cpp b/Amalgam/src/Features/Aimbot/AutoRocketJump/AutoRocketJump.cpp index a5bdb19e..61508e73 100644 --- a/Amalgam/src/Features/Aimbot/AutoRocketJump/AutoRocketJump.cpp +++ b/Amalgam/src/Features/Aimbot/AutoRocketJump/AutoRocketJump.cpp @@ -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()) { diff --git a/Amalgam/src/Features/ImGui/Menu/Components.h b/Amalgam/src/Features/ImGui/Menu/Components.h index eabad0d2..207f012f 100644 --- a/Amalgam/src/Features/ImGui/Menu/Components.h +++ b/Amalgam/src/Features/ImGui/Menu/Components.h @@ -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 diff --git a/Amalgam/src/Features/ImGui/Menu/Menu.cpp b/Amalgam/src/Features/ImGui/Menu/Menu.cpp index 20ce9528..54654241 100644 --- a/Amalgam/src/Features/ImGui/Menu/Menu.cpp +++ b/Amalgam/src/Features/ImGui/Menu/Menu.cpp @@ -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(); diff --git a/Amalgam/src/Features/Output/Output.cpp b/Amalgam/src/Features/Output/Output.cpp index 472a2f09..33e49409 100644 --- a/Amalgam/src/Features/Output/Output.cpp +++ b/Amalgam/src/Features/Output/Output.cpp @@ -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", diff --git a/Amalgam/src/Features/Simulation/ProjectileSimulation/ProjectileSimulation.cpp b/Amalgam/src/Features/Simulation/ProjectileSimulation/ProjectileSimulation.cpp index 5cda9940..f3abbdba 100644 --- a/Amalgam/src/Features/Simulation/ProjectileSimulation/ProjectileSimulation.cpp +++ b/Amalgam/src/Features/Simulation/ProjectileSimulation/ProjectileSimulation.cpp @@ -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; diff --git a/Amalgam/src/Features/Visuals/Visuals.cpp b/Amalgam/src/Features/Visuals/Visuals.cpp index 987bd3ac..461a980f 100644 --- a/Amalgam/src/Features/Visuals/Visuals.cpp +++ b/Amalgam/src/Features/Visuals/Visuals.cpp @@ -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); diff --git a/Amalgam/src/Hooks/CHudCrosshair_GetDrawPosition.cpp b/Amalgam/src/Hooks/CHudCrosshair_GetDrawPosition.cpp index c51e752f..13755f29 100644 --- a/Amalgam/src/Hooks/CHudCrosshair_GetDrawPosition.cpp +++ b/Amalgam/src/Hooks/CHudCrosshair_GetDrawPosition.cpp @@ -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; diff --git a/Amalgam/src/Hooks/CTFPlayer_FireBullet.cpp b/Amalgam/src/Hooks/CTFPlayer_FireBullet.cpp index 19a2036e..6e21fe33 100644 --- a/Amalgam/src/Hooks/CTFPlayer_FireBullet.cpp +++ b/Amalgam/src/Hooks/CTFPlayer_FireBullet.cpp @@ -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(); diff --git a/Amalgam/src/SDK/Helpers/TraceFilters/TraceFilters.cpp b/Amalgam/src/SDK/Helpers/TraceFilters/TraceFilters.cpp index 76ff298a..d1180bc5 100644 --- a/Amalgam/src/SDK/Helpers/TraceFilters/TraceFilters.cpp +++ b/Amalgam/src/SDK/Helpers/TraceFilters/TraceFilters.cpp @@ -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; diff --git a/Amalgam/src/SDK/SDK.cpp b/Amalgam/src/SDK/SDK.cpp index 761fbe13..6e0e832e 100644 --- a/Amalgam/src/SDK/SDK.cpp +++ b/Amalgam/src/SDK/SDK.cpp @@ -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; diff --git a/Amalgam/src/SDK/Vars.h b/Amalgam/src/SDK/Vars.h index c866455f..1ebf3f87 100644 --- a/Amalgam/src/SDK/Vars.h +++ b/Amalgam/src/SDK/Vars.h @@ -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);