From 4cea078340527c794c56954c2d4444eb7c57292b Mon Sep 17 00:00:00 2001 From: whitehai11 Date: Wed, 5 Aug 2026 16:08:53 +0200 Subject: [PATCH] Add Name/Weapon/Bomb ESP with menu toggles; add chams diagnostics --- .../Features/CChams/CChams.cpp | 24 ++++ .../Features/CVisual/CVisual.cpp | 120 +++++++++++++++--- .../Features/CVisual/CVisual.hpp | 4 + .../AndromedaClient/GUI/CAndromedaMenu.cpp | 8 ++ .../AndromedaClient/Settings/Settings.hpp | 4 + 5 files changed, 143 insertions(+), 17 deletions(-) diff --git a/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Features/CChams/CChams.cpp b/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Features/CChams/CChams.cpp index daa3e94..e156987 100644 --- a/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Features/CChams/CChams.cpp +++ b/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Features/CChams/CChams.cpp @@ -136,6 +136,8 @@ auto CChams::CreateMaterials() -> void if ( !m_pMaterialInvisible ) m_pMaterialInvisible = CreateMaterial( "chams_invisible" , szVMatInvisible ); + + DEV_LOG( "[Chams] CreateMaterials: visible=%p invisible=%p\n" , (void*)m_pMaterialVisible , (void*)m_pMaterialInvisible ); } auto CChams::OnDrawObject( void* pAnimatableSceneObjectDesc , void* pDx11 , void* pMeshData , int nDataCount , void* pSceneView , void* pSceneLayer , void* pUnk , void* pUnk2 ) -> bool @@ -151,6 +153,17 @@ auto CChams::OnDrawObject( void* pAnimatableSceneObjectDesc , void* pDx11 , void if ( !pLocalPawn ) return false; + { + static bool bLogged = false; + + if ( !bLogged ) + { + bLogged = true; + + DEV_LOG( "[Chams] OnDrawObject fired: meshData=%p count=%d IsReady=%d\n" , pMeshData , nDataCount , IsReady() ? 1 : 0 ); + } + } + const auto* pBytes = static_cast( pMeshData ); for ( int i = 0; i < nDataCount; i++ ) @@ -176,6 +189,17 @@ auto CChams::OnDrawObject( void* pAnimatableSceneObjectDesc , void* pDx11 , void if ( pPawn->m_iTeamNum() == pLocalPawn->m_iTeamNum() ) continue; + { + static bool bLoggedMatch = false; + + if ( !bLoggedMatch ) + { + bLoggedMatch = true; + + DEV_LOG( "[Chams] matched enemy mesh entry %d\n" , i ); + } + } + auto* pWN = const_cast( pEntry ); if ( Settings::Chams::IgnoreZ ) diff --git a/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Features/CVisual/CVisual.cpp b/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Features/CVisual/CVisual.cpp index 78773da..5c4a2a7 100644 --- a/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Features/CVisual/CVisual.cpp +++ b/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Features/CVisual/CVisual.cpp @@ -11,10 +11,13 @@ #include #include #include +#include #include #include #include +#include + static CVisual g_CVisual{}; auto CVisual::OnRender() -> void @@ -96,25 +99,25 @@ auto CVisual::OnRenderPlayerEsp( CCSPlayerController* pCCSPlayerController , con if ( Draw ) { + auto PlayerColor = ImColor( 255 , 255 , 255 ); + + if ( pCCSPlayerController->m_iTeamNum() == TEAM_TT ) + { + PlayerColor = Settings::Colors::Visual::PlayerBoxTT; + + if ( bVisible ) + PlayerColor = Settings::Colors::Visual::PlayerBoxTT_Visible; + } + else if ( pCCSPlayerController->m_iTeamNum() == TEAM_CT ) + { + PlayerColor = Settings::Colors::Visual::PlayerBoxCT; + + if ( bVisible ) + PlayerColor = Settings::Colors::Visual::PlayerBoxCT_Visible; + } + if ( Settings::Visual::PlayerBox ) { - auto PlayerColor = ImColor( 255 , 255 , 255 ); - - if ( pCCSPlayerController->m_iTeamNum() == TEAM_TT ) - { - PlayerColor = Settings::Colors::Visual::PlayerBoxTT; - - if ( bVisible ) - PlayerColor = Settings::Colors::Visual::PlayerBoxTT_Visible; - } - else if ( pCCSPlayerController->m_iTeamNum() == TEAM_CT ) - { - PlayerColor = Settings::Colors::Visual::PlayerBoxCT; - - if ( bVisible ) - PlayerColor = Settings::Colors::Visual::PlayerBoxCT_Visible; - } - if ( Settings::Visual::PlayerBoxType == EVisualBoxType_t::BOX ) GetRenderStackSystem()->DrawBox( min , max , PlayerColor ); else if ( Settings::Visual::PlayerBoxType == EVisualBoxType_t::OUTLINE_BOX ) @@ -151,9 +154,92 @@ auto CVisual::OnRenderPlayerEsp( CCSPlayerController* pCCSPlayerController , con DrawBoneESP( pC_CSPlayerPawn , bVisible , pCCSPlayerController->m_iTeamNum() ); } } + + OnRenderPlayerText( pCCSPlayerController , pC_CSPlayerPawn , min , max , PlayerColor , bVisible ); } } +auto CVisual::OnRenderPlayerText( CCSPlayerController* pCCSPlayerController , C_CSPlayerPawn* pPawn , const ImVec2& BoxMin , const ImVec2& BoxMax , const ImColor& PlayerColor , const bool bVisible ) -> void +{ + auto* pFont = &GetFontManager()->m_VerdanaFont; + + if ( !pFont ) + return; + + const float CenterX = ( BoxMin.x + BoxMax.x ) * 0.5f; + + if ( Settings::Visual::NameESP ) + { + const char* szName = pCCSPlayerController->m_sSanitizedPlayerName(); + + if ( szName && szName[ 0 ] ) + GetRenderStackSystem()->DrawString( pFont , ImVec2( CenterX , BoxMin.y - pFont->GetFontSize() - 6.f ) , FW1_CENTER | FW1_TOP , PlayerColor , "%s" , szName ); + } + + if ( Settings::Visual::WeaponESP ) + { + const char* szWeapon = GetPlayerWeaponName( pPawn ); + + if ( szWeapon && szWeapon[ 0 ] ) + GetRenderStackSystem()->DrawString( pFont , ImVec2( CenterX , BoxMax.y + 4.f ) , FW1_CENTER | FW1_TOP , ImColor( 255 , 255 , 255 ) , "%s" , szWeapon ); + } + + if ( Settings::Visual::BombESP && HasBomb( pPawn ) ) + { + const float BombY = BoxMax.y + ( Settings::Visual::WeaponESP ? pFont->GetFontSize() + 9.f : 4.f ); + + GetRenderStackSystem()->DrawString( pFont , ImVec2( CenterX , BombY ) , FW1_CENTER | FW1_TOP , ImColor( 255 , 80 , 80 ) , "[BOMB]" ); + } +} + +auto CVisual::GetPlayerWeaponName( C_CSPlayerPawn* pPawn ) -> const char* +{ + if ( !pPawn || !pPawn->m_pWeaponServices() ) + return ""; + + auto* pWeaponServices = pPawn->m_pWeaponServices(); + + const auto& hActiveWeapon = pWeaponServices->m_hActiveWeapon(); + + if ( !hActiveWeapon.IsValid() ) + return ""; + + auto* pWeapon = hActiveWeapon.Get(); + + if ( !pWeapon ) + return ""; + + const int iDefIdx = pWeapon->m_AttributeManager()->m_Item()->m_iItemDefinitionIndex(); + + return GetWeaponDescFromDefinitionIndex( iDefIdx ); +} + +auto CVisual::HasBomb( C_CSPlayerPawn* pPawn ) -> bool +{ + if ( !pPawn || !pPawn->m_pWeaponServices() ) + return false; + + auto* pWeaponServices = pPawn->m_pWeaponServices(); + + for ( int i = 0; i < pWeaponServices->m_hMyWeapons().Count(); i++ ) + { + const auto& hWeapon = pWeaponServices->m_hMyWeapons()[ i ]; + + if ( !hWeapon.IsValid() ) + continue; + + auto* pWeapon = hWeapon.Get(); + + if ( !pWeapon ) + continue; + + if ( pWeapon->m_AttributeManager()->m_Item()->m_iItemDefinitionIndex() == WEAPON_C4_EXPLOSIVE ) + return true; + } + + return false; +} + auto CVisual::OnClientOutput() -> void { OnRender(); diff --git a/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Features/CVisual/CVisual.hpp b/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Features/CVisual/CVisual.hpp index a304252..bce861e 100644 --- a/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Features/CVisual/CVisual.hpp +++ b/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Features/CVisual/CVisual.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include @@ -38,6 +39,9 @@ private: auto OnRenderPlayerEsp( CCSPlayerController* pCCSPlayerController , const Rect_t& bBox , const bool bVisible ) -> void; auto DrawBoneESP( C_CSPlayerPawn* pC_CSPlayerPawn , const bool bVisible , const int iTeamNum ) -> void; + auto OnRenderPlayerText( CCSPlayerController* pCCSPlayerController , C_CSPlayerPawn* pPawn , const ImVec2& BoxMin , const ImVec2& BoxMax , const ImColor& PlayerColor , const bool bVisible ) -> void; + auto GetPlayerWeaponName( C_CSPlayerPawn* pPawn ) -> const char*; + auto HasBomb( C_CSPlayerPawn* pPawn ) -> bool; public: auto CalculateBoundingBoxes() -> void; 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 8f34a05..69afb6a 100644 --- a/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/GUI/CAndromedaMenu.cpp +++ b/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/GUI/CAndromedaMenu.cpp @@ -292,6 +292,14 @@ auto CAndromedaMenu::RenderVisualPanel() -> void EndPanel(); + BeginPanel( "Player Info" ); + + Toggle( "Name ESP" , "##Visual.NameESP" , Settings::Visual::NameESP ); + Toggle( "Weapon ESP" , "##Visual.WeaponESP" , Settings::Visual::WeaponESP ); + Toggle( "Bomb ESP" , "##Visual.BombESP" , Settings::Visual::BombESP ); + + EndPanel(); + BeginPanel( "Player Box" ); Toggle( "Player Box" , "##Visual.PlayerBox" , Settings::Visual::PlayerBox ); 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 95cea73..4fa358d 100644 --- a/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Settings/Settings.hpp +++ b/Andromeda-CS2-Base/Andromeda-CS2-Base/AndromedaClient/Settings/Settings.hpp @@ -19,6 +19,10 @@ namespace Settings inline auto GlowTeam = true; inline auto GlowEnemy = true; + inline auto NameESP = true; + inline auto WeaponESP = true; + inline auto BombESP = true; + inline auto PlayerBoxType = 3; inline auto GlassyBox = false; inline auto GlassOpacity = 55;