hybrid target selection mode

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