From 67ab4b2c3c4842d64035e07db0c4a3688ba94eea Mon Sep 17 00:00:00 2001 From: whitehai11 Date: Wed, 5 Aug 2026 17:04:43 +0200 Subject: [PATCH] Add hitchance to triggerbot (spread simulation via GetInaccuracy/GetSpread) --- .../AndromedaClient/Features/CMisc/CMisc.cpp | 60 +++++++++++++++++++ .../AndromedaClient/Features/CMisc/CMisc.hpp | 5 ++ .../AndromedaClient/GUI/CAndromedaMenu.cpp | 7 +++ .../AndromedaClient/Settings/Settings.hpp | 2 + 4 files changed, 74 insertions(+) diff --git a/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Features/CMisc/CMisc.cpp b/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Features/CMisc/CMisc.cpp index ed50e5f..5639058 100644 --- a/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Features/CMisc/CMisc.cpp +++ b/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Features/CMisc/CMisc.cpp @@ -24,6 +24,9 @@ #include #include #include +#include + +#include #include @@ -296,6 +299,16 @@ auto CMisc::RunTriggerbot( CCSGOInput* pInput , CUserCmd* pUserCmd ) -> void case 7: bTargetValid = Settings::Triggerbot::Hitbox_Legs; break; default: bTargetValid = true; break; } + + if ( bTargetValid && Settings::Triggerbot::Hitchance > 0 ) + { + const QAngle ViewAngles = *CCSGOInput_GetViewAngles( pInput , 0 ); + + const float flHitchance = CalculateHitchance( pInput , pTargetPawn , ViewAngles , Settings::Triggerbot::HitchanceSamples ); + + if ( ( flHitchance * 100.f ) < static_cast( Settings::Triggerbot::Hitchance ) ) + bTargetValid = false; + } } } @@ -350,6 +363,53 @@ auto CMisc::RunTriggerbot( CCSGOInput* pInput , CUserCmd* pUserCmd ) -> void } } +static thread_local std::mt19937 g_TriggerRng( std::random_device{}() ); + +auto CMisc::CalculateHitchance( CCSGOInput* pInput , C_CSPlayerPawn* pTarget , const QAngle& ViewAngles , const int Samples ) -> float +{ + if ( !pTarget || Samples <= 0 ) + return 0.f; + + auto* pWeapon = GetCL_Weapons()->GetLocalActiveWeapon(); + + if ( !pWeapon ) + return 0.f; + + const float flInaccuracy = C_CSWeaponBaseGun_GetInaccuracy( pWeapon , nullptr , nullptr ); + const float flSpread = C_CSWeaponBaseGun_GetSpread( pWeapon ); + + const float flAccuracy = flInaccuracy + flSpread; + + if ( flAccuracy <= 0.f ) + return 1.f; + + Vector3 vForward , vRight , vUp; + + Math::AngleVectors( ViewAngles , vForward , vRight , vUp ); + + const auto vStart = GetCL_Players()->GetLocalEyeOrigin(); + + std::uniform_real_distribution distAngle( 0.f , 6.2831853f ); + std::uniform_real_distribution distRadius( 0.f , 1.f ); + + int Hits = 0; + + for ( int i = 0; i < Samples; i++ ) + { + const float flAngle = distAngle( g_TriggerRng ); + const float flRadius = flAccuracy * std::sqrt( distRadius( g_TriggerRng ) ); + + const Vector3 vDirection = ( vForward + vRight * ( std::cos( flAngle ) * flRadius ) + vUp * ( std::sin( flAngle ) * flRadius ) ).Normalized(); + + const Vector3 vEnd = vStart + vDirection * 8192.f; + + if ( GetCL_Trace()->TraceToEntityEndPos( &vEnd ) == reinterpret_cast( pTarget ) ) + Hits++; + } + + return static_cast( Hits ) / static_cast( Samples ); +} + auto CMisc::OnFrameStageNotify( int FrameStage ) -> void { if ( FrameStage != 6 ) diff --git a/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Features/CMisc/CMisc.hpp b/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Features/CMisc/CMisc.hpp index 5f0b80c..9ca816e 100644 --- a/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Features/CMisc/CMisc.hpp +++ b/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Features/CMisc/CMisc.hpp @@ -5,9 +5,13 @@ #include #include +#include +#include + class CCSGOInput; class CUserCmd; class IGameEvent; +class C_CSPlayerPawn; class IMisc { @@ -30,6 +34,7 @@ public: private: auto RunTriggerbot( CCSGOInput* pInput , CUserCmd* pUserCmd ) -> void; + auto CalculateHitchance( CCSGOInput* pInput , C_CSPlayerPawn* pTarget , const QAngle& ViewAngles , const int Samples ) -> float; private: std::chrono::steady_clock::time_point m_HitTime{}; diff --git a/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/GUI/CAndromedaMenu.cpp b/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/GUI/CAndromedaMenu.cpp index f59d6cc..fbb400c 100644 --- a/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/GUI/CAndromedaMenu.cpp +++ b/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/GUI/CAndromedaMenu.cpp @@ -393,6 +393,13 @@ auto CAndromedaMenu::RenderMiscPanel() -> void ImGui::Separator(); + SliderInt( "Hitchance (%)" , Settings::Triggerbot::Hitchance , 0 , 100 , Settings::Triggerbot::Hitchance > 0 ? "%d%%" : "%d (aus)" ); + + if ( Settings::Triggerbot::Hitchance > 0 ) + SliderInt( "Hitchance Samples" , Settings::Triggerbot::HitchanceSamples , 16 , 128 ); + + ImGui::Separator(); + Checkbox( "Nur gescoped (Sniper)" , Settings::Triggerbot::ScopedOnly ); Checkbox( "Teammates ignorieren" , Settings::Triggerbot::IgnoreTeammates ); Checkbox( "Fadenkreuz-Indikator" , Settings::Triggerbot::DrawIndicator ); diff --git a/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Settings/Settings.hpp b/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Settings/Settings.hpp index 47c4437..d1e8051 100644 --- a/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Settings/Settings.hpp +++ b/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Settings/Settings.hpp @@ -67,6 +67,8 @@ namespace Settings inline auto Hitbox_Arms = false; inline auto Hitbox_Legs = false; inline auto DrawIndicator = true; + inline auto Hitchance = 0; // percent, 0 = off + inline auto HitchanceSamples = 64; } namespace Colors {