ESP + GLOW + MENU

This commit is contained in:
Erque
2025-11-03 18:38:47 +03:00
parent c52ce7664d
commit 1ffde57be6
5 changed files with 256 additions and 2 deletions
@@ -127,7 +127,7 @@
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary> <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<LanguageStandard>stdcpplatest</LanguageStandard> <LanguageStandard>stdcpplatest</LanguageStandard>
<LanguageStandard_C>stdclatest</LanguageStandard_C> <LanguageStandard_C>stdc17</LanguageStandard_C>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
@@ -10,6 +10,10 @@
#include <GameClient/CEntityCache/CEntityCache.hpp> #include <GameClient/CEntityCache/CEntityCache.hpp>
#include <GameClient/CL_Players.hpp> #include <GameClient/CL_Players.hpp>
#include <GameClient/CL_VisibleCheck.hpp> #include <GameClient/CL_VisibleCheck.hpp>
#include <GameClient/CL_Bones.hpp>
#include <CS2/SDK/Math/Math.hpp>
#include <CS2/SDK/Types/CEntityData.hpp>
#include <CS2/SDK/Types/Color.hpp>
static CVisual g_CVisual{}; static CVisual g_CVisual{};
@@ -114,7 +118,125 @@ auto CVisual::OnRenderPlayerEsp( CCSPlayerController* pCCSPlayerController , con
else if ( Settings::Visual::PlayerBoxType == EVisualBoxType_t::OUTLINE_COAL_BOX ) else if ( Settings::Visual::PlayerBoxType == EVisualBoxType_t::OUTLINE_COAL_BOX )
GetRenderStackSystem()->DrawOutlineCoalBox( min , max , PlayerColor ); GetRenderStackSystem()->DrawOutlineCoalBox( min , max , PlayerColor );
} }
if ( Settings::Visual::BoneESP )
{
auto ShouldDrawBone = false;
if ( Settings::Visual::BoneESPTeam && !IsEnemy )
ShouldDrawBone = true;
if ( Settings::Visual::BoneESPEnemy && IsEnemy )
ShouldDrawBone = true;
if ( Settings::Visual::OnlyVisible && !bVisible )
ShouldDrawBone = false;
if ( ShouldDrawBone )
{
DrawBoneESP( pC_CSPlayerPawn , bVisible , pCCSPlayerController->m_iTeamNum() );
} }
}
}
}
auto CVisual::ApplyGlow( C_CSPlayerPawn* pC_CSPlayerPawn , const bool bVisible , const int iTeamNum ) -> void
{
if ( !pC_CSPlayerPawn || !pC_CSPlayerPawn->IsPlayerPawn() )
return;
auto IsEnemy = false;
C_CSPlayerPawn* pLocalPawn = nullptr;
if ( auto* pLocalPlayerController = GetCL_Players()->GetLocalPlayerController(); pLocalPlayerController )
{
pLocalPawn = pLocalPlayerController->m_hPawn().Get<C_CSPlayerPawn>();
if ( pLocalPawn )
{
IsEnemy = iTeamNum != pLocalPawn->m_iTeamNum();
// Local player'dan glow'u kaldır
if ( pC_CSPlayerPawn == pLocalPawn )
{
auto& Glow = pC_CSPlayerPawn->m_Glow();
Glow.m_bGlowing() = false;
return;
}
}
}
auto DrawGlow = false;
if ( Settings::Visual::GlowTeam && !IsEnemy )
DrawGlow = true;
if ( Settings::Visual::GlowEnemy && IsEnemy )
DrawGlow = true;
if ( Settings::Visual::OnlyVisible && !bVisible )
DrawGlow = false;
if ( !DrawGlow )
{
// Glow'u kapat
auto& Glow = pC_CSPlayerPawn->m_Glow();
Glow.m_bGlowing() = false;
return;
}
auto GlowColor = Color( 255 , 255 , 255 , 255 );
if ( iTeamNum == TEAM_TT )
{
const auto& ColorVec = Settings::Colors::Visual::GlowTT;
if ( bVisible )
{
const auto& VisibleColorVec = Settings::Colors::Visual::GlowTT_Visible;
GlowColor = Color(
static_cast<BYTE>( VisibleColorVec.x * 255.f ) ,
static_cast<BYTE>( VisibleColorVec.y * 255.f ) ,
static_cast<BYTE>( VisibleColorVec.z * 255.f ) ,
static_cast<BYTE>( VisibleColorVec.w * 255.f )
);
}
else
{
GlowColor = Color(
static_cast<BYTE>( ColorVec.x * 255.f ) ,
static_cast<BYTE>( ColorVec.y * 255.f ) ,
static_cast<BYTE>( ColorVec.z * 255.f ) ,
static_cast<BYTE>( ColorVec.w * 255.f )
);
}
}
else if ( iTeamNum == TEAM_CT )
{
const auto& ColorVec = Settings::Colors::Visual::GlowCT;
if ( bVisible )
{
const auto& VisibleColorVec = Settings::Colors::Visual::GlowCT_Visible;
GlowColor = Color(
static_cast<BYTE>( VisibleColorVec.x * 255.f ) ,
static_cast<BYTE>( VisibleColorVec.y * 255.f ) ,
static_cast<BYTE>( VisibleColorVec.z * 255.f ) ,
static_cast<BYTE>( VisibleColorVec.w * 255.f )
);
}
else
{
GlowColor = Color(
static_cast<BYTE>( ColorVec.x * 255.f ) ,
static_cast<BYTE>( ColorVec.y * 255.f ) ,
static_cast<BYTE>( ColorVec.z * 255.f ) ,
static_cast<BYTE>( ColorVec.w * 255.f )
);
}
}
// Glow'u uygula
auto& Glow = pC_CSPlayerPawn->m_Glow();
Glow.m_bGlowing() = true;
Glow.m_glowColorOverride() = GlowColor;
} }
auto CVisual::OnClientOutput() -> void auto CVisual::OnClientOutput() -> void
@@ -148,6 +270,15 @@ auto CVisual::OnCreateMove() -> void
auto* pCCSPlayerController = reinterpret_cast<CCSPlayerController*>( pEntity ); auto* pCCSPlayerController = reinterpret_cast<CCSPlayerController*>( pEntity );
CachedEntity.m_bVisible = GetCL_VisibleCheck()->IsPlayerControllerVisible( pCCSPlayerController ); CachedEntity.m_bVisible = GetCL_VisibleCheck()->IsPlayerControllerVisible( pCCSPlayerController );
if ( Settings::Visual::Glow && pCCSPlayerController->m_bPawnIsAlive() )
{
auto* pC_CSPlayerPawn = pCCSPlayerController->m_hPawn().Get<C_CSPlayerPawn>();
if ( pC_CSPlayerPawn && pC_CSPlayerPawn->IsPlayerPawn() )
{
ApplyGlow( pC_CSPlayerPawn , CachedEntity.m_bVisible , pCCSPlayerController->m_iTeamNum() );
}
}
} }
break; break;
default: default:
@@ -192,6 +323,84 @@ auto CVisual::CalculateBoundingBoxes() -> void
} }
} }
auto CVisual::DrawBoneESP( C_CSPlayerPawn* pC_CSPlayerPawn , const bool bVisible , const int iTeamNum ) -> void
{
if ( !pC_CSPlayerPawn || !pC_CSPlayerPawn->IsPlayerPawn() )
return;
auto BoneColor = ImColor( 255 , 255 , 255 );
if ( iTeamNum == TEAM_TT )
{
BoneColor = Settings::Colors::Visual::BoneESPTT;
if ( bVisible )
BoneColor = Settings::Colors::Visual::BoneESPTT_Visible;
}
else if ( iTeamNum == TEAM_CT )
{
BoneColor = Settings::Colors::Visual::BoneESPCT;
if ( bVisible )
BoneColor = Settings::Colors::Visual::BoneESPCT_Visible;
}
// Bone connections structure for CS2 skeleton
struct BoneConnection_t
{
const char* szFrom;
const char* szTo;
};
static const BoneConnection_t BoneConnections[] =
{
// Head to spine chain
{ "head_0" , "neck_0" },
{ "neck_0" , "spine_1" },
{ "spine_1" , "spine_2" },
{ "spine_2" , "spine_3" },
{ "spine_3" , "pelvis" },
// Left arm
{ "neck_0" , "clavicle_l" },
{ "clavicle_l" , "arm_upper_l" },
{ "arm_upper_l" , "arm_lower_l" },
{ "arm_lower_l" , "hand_l" },
// Right arm
{ "neck_0" , "clavicle_r" },
{ "clavicle_r" , "arm_upper_r" },
{ "arm_upper_r" , "arm_lower_r" },
{ "arm_lower_r" , "hand_r" },
// Left leg
{ "pelvis" , "leg_upper_l" },
{ "leg_upper_l" , "leg_lower_l" },
{ "leg_lower_l" , "ankle_l" },
// Right leg
{ "pelvis" , "leg_upper_r" },
{ "leg_upper_r" , "leg_lower_r" },
{ "leg_lower_r" , "ankle_r" },
};
for ( const auto& Connection : BoneConnections )
{
const Vector3 FromBone = GetCL_Bones()->GetBonePositionByName( pC_CSPlayerPawn , Connection.szFrom );
const Vector3 ToBone = GetCL_Bones()->GetBonePositionByName( pC_CSPlayerPawn , Connection.szTo );
if ( FromBone.IsZero() || ToBone.IsZero() )
continue;
ImVec2 FromScreen , ToScreen;
if ( Math::WorldToScreen( FromBone , FromScreen ) && Math::WorldToScreen( ToBone , ToScreen ) )
{
GetRenderStackSystem()->DrawLine( FromScreen , ToScreen , BoneColor , 1.5f );
}
}
}
auto GetVisual() -> CVisual* auto GetVisual() -> CVisual*
{ {
return &g_CVisual; return &g_CVisual;
@@ -5,6 +5,7 @@
#include <CS2/SDK/Math/Rect_t.hpp> #include <CS2/SDK/Math/Rect_t.hpp>
class CCSPlayerController; class CCSPlayerController;
class C_CSPlayerPawn;
class IVisual class IVisual
{ {
@@ -32,6 +33,8 @@ private:
}; };
auto OnRenderPlayerEsp( CCSPlayerController* pCCSPlayerController , const Rect_t& bBox , const bool bVisible ) -> void; 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 ApplyGlow( C_CSPlayerPawn* pC_CSPlayerPawn , const bool bVisible , const int iTeamNum ) -> void;
public: public:
auto CalculateBoundingBoxes() -> void; auto CalculateBoundingBoxes() -> void;
@@ -31,6 +31,24 @@ auto CAndromedaMenu::OnRenderMenu() -> void
}; };
RenderComboBox( XorStr( "PlayerBox Type" ) , XorStr( "##Visual.PlayerBoxType" ) , Settings::Visual::PlayerBoxType , PlayerBoxTypeItems , IM_ARRAYSIZE( PlayerBoxTypeItems ) ); RenderComboBox( XorStr( "PlayerBox Type" ) , XorStr( "##Visual.PlayerBoxType" ) , Settings::Visual::PlayerBoxType , PlayerBoxTypeItems , IM_ARRAYSIZE( PlayerBoxTypeItems ) );
RenderCheckBox( XorStr( "Bone ESP" ) , XorStr( "##Visual.BoneESP" ) , Settings::Visual::BoneESP );
if ( Settings::Visual::BoneESP )
{
ImGui::Indent();
RenderCheckBox( XorStr( " Bone ESP Team" ) , XorStr( "##Visual.BoneESPTeam" ) , Settings::Visual::BoneESPTeam );
RenderCheckBox( XorStr( " Bone ESP Enemy" ) , XorStr( "##Visual.BoneESPEnemy" ) , Settings::Visual::BoneESPEnemy );
ImGui::Unindent();
}
RenderCheckBox( XorStr( "Glow" ) , XorStr( "##Visual.Glow" ) , Settings::Visual::Glow );
if ( Settings::Visual::Glow )
{
ImGui::Indent();
RenderCheckBox( XorStr( " Glow Team" ) , XorStr( "##Visual.GlowTeam" ) , Settings::Visual::GlowTeam );
RenderCheckBox( XorStr( " Glow Enemy" ) , XorStr( "##Visual.GlowEnemy" ) , Settings::Visual::GlowEnemy );
ImGui::Unindent();
}
} }
if ( ImGui::CollapsingHeader( XorStr( "Colors" ) ) ) if ( ImGui::CollapsingHeader( XorStr( "Colors" ) ) )
@@ -39,11 +57,21 @@ auto CAndromedaMenu::OnRenderMenu() -> void
RenderColorEdit( XorStr( "Player Box TT Visible" ) , XorStr( "##Colors.Visual.PlayerBoxTT_Visible" ) , &Settings::Colors::Visual::PlayerBoxTT_Visible.x ); RenderColorEdit( XorStr( "Player Box TT Visible" ) , XorStr( "##Colors.Visual.PlayerBoxTT_Visible" ) , &Settings::Colors::Visual::PlayerBoxTT_Visible.x );
RenderColorEdit( XorStr( "Player Box CT" ) , XorStr( "##Colors.Visual.PlayerBoxCT" ) , &Settings::Colors::Visual::PlayerBoxCT.x ); RenderColorEdit( XorStr( "Player Box CT" ) , XorStr( "##Colors.Visual.PlayerBoxCT" ) , &Settings::Colors::Visual::PlayerBoxCT.x );
RenderColorEdit( XorStr( "Player Box CT Visible" ) , XorStr( "##Colors.Visual.PlayerBoxCT_Visible" ) , &Settings::Colors::Visual::PlayerBoxCT_Visible.x ); RenderColorEdit( XorStr( "Player Box CT Visible" ) , XorStr( "##Colors.Visual.PlayerBoxCT_Visible" ) , &Settings::Colors::Visual::PlayerBoxCT_Visible.x );
RenderColorEdit( XorStr( "Bone ESP TT" ) , XorStr( "##Colors.Visual.BoneESPTT" ) , &Settings::Colors::Visual::BoneESPTT.x );
RenderColorEdit( XorStr( "Bone ESP TT Visible" ) , XorStr( "##Colors.Visual.BoneESPTT_Visible" ) , &Settings::Colors::Visual::BoneESPTT_Visible.x );
RenderColorEdit( XorStr( "Bone ESP CT" ) , XorStr( "##Colors.Visual.BoneESPCT" ) , &Settings::Colors::Visual::BoneESPCT.x );
RenderColorEdit( XorStr( "Bone ESP CT Visible" ) , XorStr( "##Colors.Visual.BoneESPCT_Visible" ) , &Settings::Colors::Visual::BoneESPCT_Visible.x );
RenderColorEdit( XorStr( "Glow TT" ) , XorStr( "##Colors.Visual.GlowTT" ) , &Settings::Colors::Visual::GlowTT.x );
RenderColorEdit( XorStr( "Glow TT Visible" ) , XorStr( "##Colors.Visual.GlowTT_Visible" ) , &Settings::Colors::Visual::GlowTT_Visible.x );
RenderColorEdit( XorStr( "Glow CT" ) , XorStr( "##Colors.Visual.GlowCT" ) , &Settings::Colors::Visual::GlowCT.x );
RenderColorEdit( XorStr( "Glow CT Visible" ) , XorStr( "##Colors.Visual.GlowCT_Visible" ) , &Settings::Colors::Visual::GlowCT_Visible.x );
} }
if ( ImGui::CollapsingHeader( XorStr( "Menu" ) ) ) if ( ImGui::CollapsingHeader( XorStr( "Menu" ) ) )
{ {
RenderSliderInt( XorStr( "Menu Alpha" ) , XorStr( "##Menu.MenuAlpha" ) , Settings::Menu::MenuAlpha , 0 , 255 ); RenderSliderInt( XorStr( "Menu Alpha" ) , XorStr( "##Menu.MenuAlpha" ) , Settings::Menu::MenuAlpha , 100 , 255 );
const char* MenuStyleItems[] = const char* MenuStyleItems[] =
{ {
@@ -12,6 +12,12 @@ namespace Settings
inline auto Enemy = true; inline auto Enemy = true;
inline auto OnlyVisible = false; inline auto OnlyVisible = false;
inline auto PlayerBox = true; inline auto PlayerBox = true;
inline auto BoneESP = true;
inline auto BoneESPTeam = true;
inline auto BoneESPEnemy = true;
inline auto Glow = true;
inline auto GlowTeam = true;
inline auto GlowEnemy = true;
inline auto PlayerBoxType = 3; inline auto PlayerBoxType = 3;
} }
@@ -28,6 +34,14 @@ namespace Settings
inline ImVec4 PlayerBoxTT_Visible = { 0 , 1.f , 0.f , 1.f }; inline ImVec4 PlayerBoxTT_Visible = { 0 , 1.f , 0.f , 1.f };
inline ImVec4 PlayerBoxCT = { 65.f / 255.f , 200 / 255.f , 255.f / 255.f , 1.f }; inline ImVec4 PlayerBoxCT = { 65.f / 255.f , 200 / 255.f , 255.f / 255.f , 1.f };
inline ImVec4 PlayerBoxCT_Visible = { 0 , 1.f , 0.f , 1.f }; inline ImVec4 PlayerBoxCT_Visible = { 0 , 1.f , 0.f , 1.f };
inline ImVec4 BoneESPTT = { 255.f / 255.f , 75.f / 255.f , 75.f / 255.f , 1.f };
inline ImVec4 BoneESPTT_Visible = { 0 , 1.f , 0.f , 1.f };
inline ImVec4 BoneESPCT = { 65.f / 255.f , 200 / 255.f , 255.f / 255.f , 1.f };
inline ImVec4 BoneESPCT_Visible = { 0 , 1.f , 0.f , 1.f };
inline ImVec4 GlowTT = { 255.f / 255.f , 75.f / 255.f , 75.f / 255.f , 1.f };
inline ImVec4 GlowTT_Visible = { 0 , 1.f , 0.f , 1.f };
inline ImVec4 GlowCT = { 65.f / 255.f , 200 / 255.f , 255.f / 255.f , 1.f };
inline ImVec4 GlowCT_Visible = { 0 , 1.f , 0.f , 1.f };
} }
} }
} }