diff --git a/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.cpp b/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.cpp index 4c3d6ca8..0b169f80 100644 --- a/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.cpp +++ b/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.cpp @@ -35,7 +35,7 @@ bool CAimbotGlobal::PlayerBoneInFOV(CTFPlayer* pTarget, Vec3 vLocalPos, Vec3 vLo float flMinFOV = 180.f; for (int nHitbox = 0; nHitbox < pTarget->GetNumOfHitboxes(); nHitbox++) { - if (!IsHitboxValid(H::Entities.GetModel(pTarget->entindex()), nHitbox, iHitboxes)) + if (!IsHitboxValid(pTarget, nHitbox, iHitboxes)) continue; Vec3 vCurPos = pTarget->GetHitboxCenter(aBones, nHitbox); @@ -53,9 +53,9 @@ bool CAimbotGlobal::PlayerBoneInFOV(CTFPlayer* pTarget, Vec3 vLocalPos, Vec3 vLo return flMinFOV < Vars::Aimbot::General::AimFOV.Value; } -bool CAimbotGlobal::IsHitboxValid(uint32_t uHash, int nHitbox, int iHitboxes) +bool CAimbotGlobal::IsHitboxValid(CBaseEntity* pEntity, int nHitbox, int iHitboxes) { - switch (uHash) + switch (H::Entities.GetModel(pEntity->entindex())) { case FNV1A::Hash32Const("models/vsh/player/saxton_hale.mdl"): case FNV1A::Hash32Const("models/vsh/player/hell_hale.mdl"): @@ -128,6 +128,73 @@ bool CAimbotGlobal::IsHitboxValid(int nHitbox, int iHitboxes) return false; } +bool CAimbotGlobal::ShouldMultipoint(CBaseEntity* pEntity, int nHitbox, int iHitboxes) +{ + if (Vars::Aimbot::Hitscan::MultipointScale.Value <= 0.f) + return false; + + if (!iHitboxes) + return true; + + switch (H::Entities.GetModel(pEntity->entindex())) + { + case FNV1A::Hash32Const("models/vsh/player/saxton_hale.mdl"): + case FNV1A::Hash32Const("models/vsh/player/hell_hale.mdl"): + case FNV1A::Hash32Const("models/vsh/player/santa_hale.mdl"): + { + switch (nHitbox) + { + case HITBOX_SAXTON_HEAD: return iHitboxes & Vars::Aimbot::Hitscan::HitboxesEnum::Head; + case HITBOX_SAXTON_BODY: + case HITBOX_SAXTON_THORAX: + case HITBOX_SAXTON_CHEST: + case HITBOX_SAXTON_UPPER_CHEST: + case HITBOX_SAXTON_NECK: + case HITBOX_SAXTON_PELVIS: return iHitboxes & Vars::Aimbot::Hitscan::HitboxesEnum::Body; + case HITBOX_SAXTON_LEFT_UPPER_ARM: + case HITBOX_SAXTON_LEFT_FOREARM: + case HITBOX_SAXTON_LEFT_HAND: + case HITBOX_SAXTON_RIGHT_UPPER_ARM: + case HITBOX_SAXTON_RIGHT_FOREARM: + case HITBOX_SAXTON_RIGHT_HAND: return iHitboxes & Vars::Aimbot::Hitscan::HitboxesEnum::Arms; + case HITBOX_SAXTON_LEFT_THIGH: + case HITBOX_SAXTON_LEFT_CALF: + case HITBOX_SAXTON_LEFT_FOOT: + case HITBOX_SAXTON_RIGHT_THIGH: + case HITBOX_SAXTON_RIGHT_CALF: + case HITBOX_SAXTON_RIGHT_FOOT: return iHitboxes & Vars::Aimbot::Hitscan::HitboxesEnum::Legs; + } + break; + } + default: + { + switch (nHitbox) + { + case HITBOX_HEAD: return iHitboxes & Vars::Aimbot::Hitscan::HitboxesEnum::Head; + case HITBOX_BODY: + case HITBOX_THORAX: + case HITBOX_CHEST: + case HITBOX_UPPER_CHEST: + case HITBOX_PELVIS: return iHitboxes & Vars::Aimbot::Hitscan::HitboxesEnum::Body; + case HITBOX_LEFT_UPPER_ARM: + case HITBOX_LEFT_FOREARM: + case HITBOX_LEFT_HAND: + case HITBOX_RIGHT_UPPER_ARM: + case HITBOX_RIGHT_FOREARM: + case HITBOX_RIGHT_HAND: return iHitboxes & Vars::Aimbot::Hitscan::HitboxesEnum::Arms; + case HITBOX_LEFT_THIGH: + case HITBOX_LEFT_CALF: + case HITBOX_LEFT_FOOT: + case HITBOX_RIGHT_THIGH: + case HITBOX_RIGHT_CALF: + case HITBOX_RIGHT_FOOT: return iHitboxes & Vars::Aimbot::Hitscan::HitboxesEnum::Legs; + } + } + } + + return false; +} + bool CAimbotGlobal::ShouldIgnore(CBaseEntity* pEntity, CTFPlayer* pLocal, CTFWeaponBase* pWeapon) { if (pEntity->IsDormant()) diff --git a/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.h b/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.h index a93142bc..053a1741 100644 --- a/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.h +++ b/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.h @@ -31,8 +31,9 @@ public: void SortPriority(std::vector&); 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(uint32_t uHash, 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(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 ShouldIgnore(CBaseEntity* pTarget, CTFPlayer* pLocal, CTFWeaponBase* pWeapon); int GetPriority(int iIndex); diff --git a/Amalgam/src/Features/Aimbot/AimbotHitscan/AimbotHitscan.cpp b/Amalgam/src/Features/Aimbot/AimbotHitscan/AimbotHitscan.cpp index 113e65d0..9848a8e2 100644 --- a/Amalgam/src/Features/Aimbot/AimbotHitscan/AimbotHitscan.cpp +++ b/Amalgam/src/Features/Aimbot/AimbotHitscan/AimbotHitscan.cpp @@ -165,7 +165,7 @@ std::vector CAimbotHitscan::SortTargets(CTFPlayer* pLocal, CTFWeaponBa int CAimbotHitscan::GetHitboxPriority(int nHitbox, CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CBaseEntity* pTarget) { - if (!F::AimbotGlobal.IsHitboxValid(H::Entities.GetModel(pTarget->entindex()), nHitbox, Vars::Aimbot::Hitscan::Hitboxes.Value)) + if (!F::AimbotGlobal.IsHitboxValid(pTarget, nHitbox, Vars::Aimbot::Hitscan::Hitboxes.Value)) return -1; bool bHeadshot = false; @@ -228,7 +228,8 @@ int CAimbotHitscan::GetHitboxPriority(int nHitbox, CTFPlayer* pLocal, CTFWeaponB int iHeadPriority = bHeadOnly || bHeadshot ? 0 : 1; int iBodyPriority = bHeadOnly ? -1 : bHeadshot ? 1 : 0; - int iLimbPriority = bHeadOnly ? -1 : 2; + int iMiscPriority = bHeadOnly ? -1 : 2; + int iLimbPriority = bHeadOnly ? -1 : 3; switch (H::Entities.GetModel(pTarget->entindex())) { @@ -242,23 +243,9 @@ int CAimbotHitscan::GetHitboxPriority(int nHitbox, CTFPlayer* pLocal, CTFWeaponB case HITBOX_SAXTON_BODY: case HITBOX_SAXTON_THORAX: case HITBOX_SAXTON_CHEST: - case HITBOX_SAXTON_UPPER_CHEST: - /*case HITBOX_SAXTON_NECK: - case HITBOX_SAXTON_PELVIS:*/ return iBodyPriority; - /* - case HITBOX_SAXTON_LEFT_UPPER_ARM: - case HITBOX_SAXTON_LEFT_FOREARM: - case HITBOX_SAXTON_LEFT_HAND: - case HITBOX_SAXTON_RIGHT_UPPER_ARM: - case HITBOX_SAXTON_RIGHT_FOREARM: - case HITBOX_SAXTON_RIGHT_HAND: - case HITBOX_SAXTON_LEFT_THIGH: - case HITBOX_SAXTON_LEFT_CALF: - case HITBOX_SAXTON_LEFT_FOOT: - case HITBOX_SAXTON_RIGHT_THIGH: - case HITBOX_SAXTON_RIGHT_CALF: - case HITBOX_SAXTON_RIGHT_FOOT: - */ + case HITBOX_SAXTON_UPPER_CHEST: return iBodyPriority; + case HITBOX_SAXTON_NECK: + case HITBOX_SAXTON_PELVIS: return iMiscPriority; } break; } @@ -270,22 +257,8 @@ int CAimbotHitscan::GetHitboxPriority(int nHitbox, CTFPlayer* pLocal, CTFWeaponB case HITBOX_BODY: case HITBOX_THORAX: case HITBOX_CHEST: - case HITBOX_UPPER_CHEST: - /*case HITBOX_PELVIS:*/ return iBodyPriority; - /* - case HITBOX_LEFT_UPPER_ARM: - case HITBOX_LEFT_FOREARM: - case HITBOX_LEFT_HAND: - case HITBOX_RIGHT_UPPER_ARM: - case HITBOX_RIGHT_FOREARM: - case HITBOX_RIGHT_HAND: - case HITBOX_LEFT_THIGH: - case HITBOX_LEFT_CALF: - case HITBOX_LEFT_FOOT: - case HITBOX_RIGHT_THIGH: - case HITBOX_RIGHT_CALF: - case HITBOX_RIGHT_FOOT: - */ + case HITBOX_UPPER_CHEST: return iBodyPriority; + case HITBOX_PELVIS: return iMiscPriority; } } } @@ -366,7 +339,7 @@ int CAimbotHitscan::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBase* } F::MoveSim.Restore(tStorage); - float flBoneScale = std::max(Vars::Aimbot::Hitscan::BoneSizeMinimumScale.Value, Vars::Aimbot::Hitscan::PointScale.Value / 100.f); + 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(); @@ -407,16 +380,16 @@ int CAimbotHitscan::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBase* continue; std::vector> vHitboxes; - for (int i = 0; i < pSet->numhitboxes; i++) + for (int nHitbox = 0; nHitbox < pSet->numhitboxes; nHitbox++) { - int iPriority = GetHitboxPriority(i, pLocal, pWeapon, tTarget.m_pEntity); + int iPriority = GetHitboxPriority(nHitbox, pLocal, pWeapon, tTarget.m_pEntity); if (iPriority == -1) continue; - auto pBox = pSet->pHitbox(i); + auto pBox = pSet->pHitbox(nHitbox); if (!pBox) continue; - vHitboxes.emplace_back(pBox, i, iPriority); + vHitboxes.emplace_back(pBox, nHitbox, iPriority); } std::sort(vHitboxes.begin(), vHitboxes.end(), [&](const auto& a, const auto& b) -> bool { @@ -424,7 +397,7 @@ int CAimbotHitscan::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBase* }); float flModelScale = tTarget.m_pEntity->As()->m_flModelScale(); - float flBoneScale = std::max(Vars::Aimbot::Hitscan::BoneSizeMinimumScale.Value, Vars::Aimbot::Hitscan::PointScale.Value / 100.f); + float flBoneScale = Vars::Aimbot::Hitscan::BoneSizeMinimumScale.Value; float flBoneSubtract = Vars::Aimbot::Hitscan::BoneSizeSubtract.Value; auto pGameRules = I::TFGameRules(); @@ -434,7 +407,7 @@ int CAimbotHitscan::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBase* 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, iHitbox, _] : vHitboxes) + for (auto& [pBox, nHitbox, _] : vHitboxes) { Vec3 vAngle; Math::MatrixAngles(aBones[pBox->bone], vAngle); Vec3 vMins = pBox->bbmin; @@ -451,15 +424,16 @@ int CAimbotHitscan::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBase* } std::vector vPoints = { Vec3() }; - if (Vars::Aimbot::Hitscan::PointScale.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 = Vars::Aimbot::Hitscan::PointScale.Value / 100; + float flScale = Vars::Aimbot::Hitscan::MultipointScale.Value / 100; Vec3 vMinsS = (vMins - vMaxs) / 2 * flScale; Vec3 vMaxsS = (vMaxs - vMins) / 2 * flScale; @@ -506,7 +480,7 @@ int CAimbotHitscan::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBase* tTarget.m_vAngleTo = vAngles; tTarget.m_pRecord = pRecord; tTarget.m_vPos = vOrigin; - tTarget.m_nAimedHitbox = iHitbox; + tTarget.m_nAimedHitbox = nHitbox; tTarget.m_bBacktrack = true; return true; } @@ -522,7 +496,7 @@ int CAimbotHitscan::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBase* } else { - float flBoneScale = std::max(Vars::Aimbot::Hitscan::BoneSizeMinimumScale.Value, Vars::Aimbot::Hitscan::PointScale.Value / 100.f); + 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(); diff --git a/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.cpp b/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.cpp index b94d63f6..f5125971 100644 --- a/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.cpp +++ b/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.cpp @@ -1309,9 +1309,9 @@ bool CAimbotProjectile::TestAngle(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, Tar Vec3 vPos = trace.endpos + F::ProjSim.GetVelocity().Normalized() * 16 + vOffset; float flClosest = 0.f; int iClosest = -1; - for (int i = 0; i < pSet->numhitboxes; ++i) + for (int nHitbox = 0; nHitbox < pSet->numhitboxes; ++nHitbox) { - auto pBox = pSet->pHitbox(i); + auto pBox = pSet->pHitbox(nHitbox); if (!pBox) continue; Vec3 vCenter; Math::VectorTransform({}, aBones[pBox->bone], vCenter); @@ -1320,7 +1320,7 @@ bool CAimbotProjectile::TestAngle(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, Tar if (iClosest != -1 && flDist < flClosest || iClosest == -1) { flClosest = flDist; - iClosest = i; + iClosest = nHitbox; } } if (iClosest != HITBOX_HEAD) diff --git a/Amalgam/src/Features/Configs/Configs.cpp b/Amalgam/src/Features/Configs/Configs.cpp index b3d54864..4e261778 100644 --- a/Amalgam/src/Features/Configs/Configs.cpp +++ b/Amalgam/src/Features/Configs/Configs.cpp @@ -438,7 +438,11 @@ bool CConfigs::LoadConfig(const std::string& sConfigName, bool bNotify) if (!std::filesystem::exists(m_sConfigPath + sConfigName + m_sConfigExtension)) { if (sConfigName == std::string("default")) + { SaveConfig("default", false); + + H::Fonts.Reload(Vars::Menu::Scale[DEFAULT_BIND]); + } return false; } diff --git a/Amalgam/src/Features/ImGui/Menu/Menu.cpp b/Amalgam/src/Features/ImGui/Menu/Menu.cpp index 6b6ef012..939f832c 100644 --- a/Amalgam/src/Features/ImGui/Menu/Menu.cpp +++ b/Amalgam/src/Features/ImGui/Menu/Menu.cpp @@ -223,8 +223,9 @@ void CMenu::MenuAimbot(int iTab) if (Section("Hitscan")) { FDropdown(Vars::Aimbot::Hitscan::Hitboxes, FDropdownEnum::Left); - FDropdown(Vars::Aimbot::Hitscan::Modifiers, FDropdownEnum::Right); - FSlider(Vars::Aimbot::Hitscan::PointScale); + FDropdown(Vars::Aimbot::Hitscan::MultipointHitboxes, FDropdownEnum::Right); + FDropdown(Vars::Aimbot::Hitscan::Modifiers); + FSlider(Vars::Aimbot::Hitscan::MultipointScale); PushTransparent(!(Vars::Aimbot::Hitscan::Modifiers.Value & Vars::Aimbot::Hitscan::ModifiersEnum::Tapfire)); { FSlider(Vars::Aimbot::Hitscan::TapfireDistance); @@ -744,7 +745,7 @@ void CMenu::MenuVisuals(int iTab) SetNextWindowSize({ H::Draw.Scale(300), 0 }); if (FBeginPopup("OffscreenArrows")) { - FSlider("Offset", &tGroup.m_iOffscreenArrowsOffset, 0, 1000, 25, "%i", FSliderEnum::Min | FSliderEnum::Precision); + FSlider("Offset", &tGroup.m_iOffscreenArrowsOffset, 0, 1000, 25, "%i", FSliderEnum::Precision); FSlider("Max distance", &tGroup.m_flOffscreenArrowsMaxDistance, 0.f, 5000.f, 50.f, "%g", FSliderEnum::Min | FSliderEnum::Precision); EndPopup(); diff --git a/Amalgam/src/Features/Players/PlayerCore.cpp b/Amalgam/src/Features/Players/PlayerCore.cpp index 69b88a9a..d53e34a8 100644 --- a/Amalgam/src/Features/Players/PlayerCore.cpp +++ b/Amalgam/src/Features/Players/PlayerCore.cpp @@ -89,7 +89,10 @@ void CPlayerlistCore::LoadPlayerlist() try { if (!std::filesystem::exists(F::Configs.m_sCorePath + "Players.json")) + { + F::PlayerUtils.m_bLoad = false; return; + } boost::property_tree::ptree tRead; read_json(F::Configs.m_sCorePath + "Players.json", tRead); diff --git a/Amalgam/src/Features/Resolver/Resolver.cpp b/Amalgam/src/Features/Resolver/Resolver.cpp index 0483d6af..aca20078 100644 --- a/Amalgam/src/Features/Resolver/Resolver.cpp +++ b/Amalgam/src/Features/Resolver/Resolver.cpp @@ -249,7 +249,7 @@ void CResolver::CreateMove(CTFPlayer* pLocal) m_flLastViewCycle = 0.f; } -void CResolver::HitscanRan(CTFPlayer* pLocal, CTFPlayer* pTarget, CTFWeaponBase* pWeapon, int iHitbox) +void CResolver::HitscanRan(CTFPlayer* pLocal, CTFPlayer* pTarget, CTFWeaponBase* pWeapon, int nHitbox) { if (!Vars::Resolver::Enabled.Value || !Vars::Resolver::AutoResolve.Value || Vars::Aimbot::General::AimType.Value == Vars::Aimbot::General::AimTypeEnum::Smooth || pLocal->m_iTeamNum() == pTarget->m_iTeamNum()) @@ -258,7 +258,7 @@ void CResolver::HitscanRan(CTFPlayer* pLocal, CTFPlayer* pTarget, CTFWeaponBase* if (Vars::Resolver::AutoResolveCheatersOnly.Value && !F::PlayerUtils.HasTag(pTarget->entindex(), CHEATER_TAG)) return; - if (Vars::Resolver::AutoResolveHeadshotOnly.Value && (iHitbox != HITBOX_HEAD || !G::CanHeadshot)) + if (Vars::Resolver::AutoResolveHeadshotOnly.Value && (nHitbox != HITBOX_HEAD || !G::CanHeadshot)) return; if (pWeapon->GetWeaponSpread()) @@ -275,7 +275,7 @@ void CResolver::HitscanRan(CTFPlayer* pLocal, CTFPlayer* pTarget, CTFWeaponBase* m_iWaitingForTarget = pResource->m_iUserID(pTarget->entindex()); m_flWaitingForDamage = I::GlobalVars->curtime + F::Backtrack.GetReal(MAX_FLOWS, false) * 1.5f + 0.1f; - if (iHitbox == HITBOX_HEAD && G::CanHeadshot) + if (nHitbox == HITBOX_HEAD && G::CanHeadshot) { // not dealing with ambassador's range check right now switch (pWeapon->GetWeaponID()) diff --git a/Amalgam/src/Features/Resolver/Resolver.h b/Amalgam/src/Features/Resolver/Resolver.h index 44c24836..f7a2d76e 100644 --- a/Amalgam/src/Features/Resolver/Resolver.h +++ b/Amalgam/src/Features/Resolver/Resolver.h @@ -39,7 +39,7 @@ private: public: void FrameStageNotify(); void CreateMove(CTFPlayer* pLocal); - void HitscanRan(CTFPlayer* pLocal, CTFPlayer* pTarget, CTFWeaponBase* pWeapon, int iHitbox = HITBOX_MAX); + void HitscanRan(CTFPlayer* pLocal, CTFPlayer* pTarget, CTFWeaponBase* pWeapon, int nHitbox = HITBOX_MAX); void PlayerHurt(IGameEvent* pEvent); void SetYaw(int iUserID, float flValue, bool bAuto = false); void SetPitch(int iUserID, float flValue, bool bInverse = false, bool bAuto = false); diff --git a/Amalgam/src/Features/Visuals/ESP/ESP.cpp b/Amalgam/src/Features/Visuals/ESP/ESP.cpp index fb61faf7..7993dce3 100644 --- a/Amalgam/src/Features/Visuals/ESP/ESP.cpp +++ b/Amalgam/src/Features/Visuals/ESP/ESP.cpp @@ -679,16 +679,17 @@ static inline void StoreMisc(CBaseEntity* pEntity, CTFPlayer* pLocal, Group_t* p case ETFClassID::CZombie: sName = "Skeleton"; break; case ETFClassID::CBaseAnimating: { - if (H::Entities.IsHealth(H::Entities.GetModel(pEntity->entindex()))) + auto uHash = H::Entities.GetModel(pEntity->entindex()); + if (H::Entities.IsHealth(uHash)) sName = "Health"; - else if (H::Entities.IsAmmo(H::Entities.GetModel(pEntity->entindex()))) + else if (H::Entities.IsAmmo(uHash)) sName = "Ammo"; - else if (H::Entities.IsSpellbook(H::Entities.GetModel(pEntity->entindex()))) + else if (H::Entities.IsSpellbook(uHash)) sName = "Spellbook"; - else if (H::Entities.IsPowerup(H::Entities.GetModel(pEntity->entindex()))) + else if (H::Entities.IsPowerup(uHash)) { sName = "Powerup"; - switch (H::Entities.GetModel(pEntity->entindex())) + switch (uHash) { case FNV1A::Hash32Const("models/pickups/pickup_powerup_agility.mdl"): sName = "Agility"; break; case FNV1A::Hash32Const("models/pickups/pickup_powerup_crit.mdl"): sName = "Revenge"; break; diff --git a/Amalgam/src/Features/Visuals/Groups/Groups.cpp b/Amalgam/src/Features/Visuals/Groups/Groups.cpp index bea164a4..9ce7e9da 100644 --- a/Amalgam/src/Features/Visuals/Groups/Groups.cpp +++ b/Amalgam/src/Features/Visuals/Groups/Groups.cpp @@ -259,13 +259,14 @@ static inline bool ShouldTarget(Group_t& tGroup, CBaseEntity* pEntity, CTFPlayer // pickups case ETFClassID::CBaseAnimating: { - if (H::Entities.IsHealth(H::Entities.GetModel(pEntity->entindex()))) + auto uHash = H::Entities.GetModel(pEntity->entindex()); + if (H::Entities.IsHealth(uHash)) return tGroup.m_iTargets & TargetsEnum::Health; - else if (H::Entities.IsAmmo(H::Entities.GetModel(pEntity->entindex()))) + else if (H::Entities.IsAmmo(uHash)) return tGroup.m_iTargets & TargetsEnum::Ammo; - else if (H::Entities.IsPowerup(H::Entities.GetModel(pEntity->entindex()))) + else if (H::Entities.IsPowerup(uHash)) return tGroup.m_iTargets & TargetsEnum::Powerups; - else if (H::Entities.IsSpellbook(H::Entities.GetModel(pEntity->entindex()))) + else if (H::Entities.IsSpellbook(uHash)) return tGroup.m_iTargets & TargetsEnum::Spellbook; break; } diff --git a/Amalgam/src/Features/Visuals/Visuals.cpp b/Amalgam/src/Features/Visuals/Visuals.cpp index 461a980f..59a0e01d 100644 --- a/Amalgam/src/Features/Visuals/Visuals.cpp +++ b/Amalgam/src/Features/Visuals/Visuals.cpp @@ -450,16 +450,16 @@ std::vector CVisuals::GetHitboxes(matrix3x4* aBones, CBaseAnimating* if (vHitboxes.empty()) { - for (int i = 0; i < pSet->numhitboxes; i++) - vHitboxes.push_back(i); + for (int nHitbox = 0; nHitbox < pSet->numhitboxes; nHitbox++) + vHitboxes.push_back(nHitbox); } - for (int i : vHitboxes) + for (int nHitbox : vHitboxes) { - auto pBox = pSet->pHitbox(i); + auto pBox = pSet->pHitbox(nHitbox); if (!pBox) continue; - bool bTargeted = i == iTarget; + bool bTargeted = nHitbox == iTarget; Vec3 vAngle; Math::MatrixAngles(aBones[pBox->bone], vAngle); Vec3 vOrigin; Math::GetMatrixOrigin(aBones[pBox->bone], vOrigin); Vec3 vMins = pBox->bbmin * pEntity->m_flModelScale(); @@ -477,9 +477,12 @@ std::vector CVisuals::GetHitboxes(matrix3x4* aBones, CBaseAnimating* if (Vars::Debug::Info.Value) { - float flBoneScale = std::max(Vars::Aimbot::Hitscan::BoneSizeMinimumScale.Value, Vars::Aimbot::Hitscan::PointScale.Value / 100.f); + float flBoneScale = Vars::Aimbot::Hitscan::BoneSizeMinimumScale.Value; float flBoneSubtract = Vars::Aimbot::Hitscan::BoneSizeSubtract.Value; + if (F::AimbotGlobal.ShouldMultipoint(pEntity, nHitbox, Vars::Aimbot::Hitscan::MultipointHitboxes.Value)) + flBoneScale = std::max(flBoneScale, Vars::Aimbot::Hitscan::MultipointScale.Value / 100.f); + Vec3 vCheckMins = (pBox->bbmin + flBoneSubtract / pEntity->m_flModelScale()) * flBoneScale * pEntity->m_flModelScale(); Vec3 vCheckMaxs = (pBox->bbmax - flBoneSubtract / pEntity->m_flModelScale()) * flBoneScale * pEntity->m_flModelScale(); diff --git a/Amalgam/src/SDK/Helpers/TraceFilters/TraceFilters.cpp b/Amalgam/src/SDK/Helpers/TraceFilters/TraceFilters.cpp index d1180bc5..2982a4cf 100644 --- a/Amalgam/src/SDK/Helpers/TraceFilters/TraceFilters.cpp +++ b/Amalgam/src/SDK/Helpers/TraceFilters/TraceFilters.cpp @@ -72,7 +72,9 @@ bool CTraceFilterCollideable::ShouldHitEntity(IHandleEntity* pServerEntity, int case ETFClassID::CFunc_LOD: case ETFClassID::CObjectCartDispenser: case ETFClassID::CFuncTrackTrain: - case ETFClassID::CFuncConveyor: return true; + case ETFClassID::CFuncConveyor: + case ETFClassID::CTFGenericBomb: + case ETFClassID::CTFPumpkinBomb: return true; case ETFClassID::CFuncRespawnRoomVisualizer: if (nContentsMask & CONTENTS_PLAYERCLIP) return pEntity->m_iTeamNum() != iTeam; diff --git a/Amalgam/src/SDK/Vars.h b/Amalgam/src/SDK/Vars.h index b65eb865..0348b436 100644 --- a/Amalgam/src/SDK/Vars.h +++ b/Amalgam/src/SDK/Vars.h @@ -292,10 +292,12 @@ namespace Vars CVarEnum(Hitboxes, VA_LIST("Hitboxes", "Hitscan hitboxes"), 0b000111, DROPDOWN_MULTI, nullptr, VA_LIST("Head", "Body", "Pelvis", "Arms", "Legs", "##Divider", "Bodyaim if lethal", "Headshot only"), Head = 1 << 0, Body = 1 << 1, Pelvis = 1 << 2, Arms = 1 << 3, Legs = 1 << 4, BodyaimIfLethal = 1 << 5, HeadshotOnly = 1 << 6); + CVarValues(MultipointHitboxes, "Multipoint hitboxes", 0b00000, DROPDOWN_MULTI, "All", + VA_LIST("Head", "Body", "Pelvis", "Arms", "Legs")); CVarEnum(Modifiers, VA_LIST("Modifiers", "Hitscan modifiers"), 0b0100000, DROPDOWN_MULTI, nullptr, VA_LIST("Tapfire", "Wait for headshot", "Wait for charge", "Scoped only", "Auto scope", "Auto rev minigun", "Extinguish team"), Tapfire = 1 << 0, WaitForHeadshot = 1 << 1, WaitForCharge = 1 << 2, ScopedOnly = 1 << 3, AutoScope = 1 << 4, AutoRev = 1 << 5, ExtinguishTeam = 1 << 6); - CVar(PointScale, "Point scale", 0.f, SLIDER_CLAMP | SLIDER_PRECISION, 0.f, 100.f, 5.f, "%g%%"); + CVar(MultipointScale, "Multipoint scale", 0.f, SLIDER_CLAMP | SLIDER_PRECISION, 0.f, 100.f, 5.f, "%g%%"); CVar(TapfireDistance, "Tapfire distance", 1000.f, SLIDER_MIN | SLIDER_PRECISION, 250.f, 1000.f, 50.f); CVar(BoneSizeSubtract, "Bone size subtract", 1.f, NOSAVE | DEBUGVAR | SLIDER_MIN, 0.f, 4.f, 0.25f);