Add CChams feature + OnDrawObject hook; fix KeyValues3 init via SetTypeKV3

This commit is contained in:
2026-08-05 00:08:06 +02:00
parent 8a121f77a0
commit 9dae88ec38
22 changed files with 40882 additions and 148 deletions
@@ -23,6 +23,7 @@
#include <CS2/Hook/Hook_IsLoadoutAllowed.hpp>
#include <CS2/Hook/Hook_EquipItemInLoadout.hpp>
#include <CS2/Hook/Hook_DrawGlow.hpp>
#include <CS2/Hook/Hook_OnDrawObject.hpp>
static CHook_Loader g_CHook_Loader{};
@@ -76,6 +77,7 @@ auto CHook_Loader::InstallSecondHook() -> bool
{ { XorStr("Hook::IsLoadoutAllowed") , XorStr("48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 48 83 EC ? 48 8B E9 48 8B 0D ? ? ? ? ? ? ? FF 50") , CLIENT_DLL } ,&Hook_IsLoadoutAllowed , reinterpret_cast<LPVOID*>(&IsLoadoutAllowed_o) , true , true } ,
{ { XorStr( "Hook::EquipItemInLoadout" ) , XorStr( "48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 89 54 24 ? 57 41 54 41 55 41 56 41 57 48 83 EC ? 0F B7 FA" ) , CLIENT_DLL } ,& Hook_EquipItemInLoadout , reinterpret_cast<LPVOID*>( &EquipItemInLoadout_o ) },
{ { XorStr( "Hook::DrawGlow" ) , XorStr( "40 53 48 83 EC 20 48 8B 54" ) , CLIENT_DLL } , &Hook_DrawGlow , reinterpret_cast<LPVOID*>( &DrawGlow_o ) },
{ { XorStr( "Hook::OnDrawObject" ) , XorStr( "48 8B C4 48 89 50 ? 53" ) , SCENESYSTEM_DLL } , &Hook_OnDrawObject , reinterpret_cast<LPVOID*>( &OnDrawObject_o ) , true , true },
};
return InstallHooks();
@@ -0,0 +1,11 @@
#include "Hook_OnDrawObject.hpp"
#include <AndromedaClient/Features/CChams/CChams.hpp>
auto Hook_OnDrawObject( void* pAnimatableSceneObjectDesc , void* pDx11 , void* pMeshData , int nDataCount , void* pSceneView , void* pSceneLayer , void* pUnk , void* pUnk2 ) -> void
{
if ( GetChams()->OnDrawObject( pAnimatableSceneObjectDesc , pDx11 , pMeshData , nDataCount , pSceneView , pSceneLayer , pUnk , pUnk2 ) )
return;
OnDrawObject_o( pAnimatableSceneObjectDesc , pDx11 , pMeshData , nDataCount , pSceneView , pSceneLayer , pUnk , pUnk2 );
}
@@ -0,0 +1,8 @@
#pragma once
#include <Common/Common.hpp>
auto Hook_OnDrawObject( void* pAnimatableSceneObjectDesc , void* pDx11 , void* pMeshData , int nDataCount , void* pSceneView , void* pSceneLayer , void* pUnk , void* pUnk2 ) -> void;
using OnDrawObject_t = decltype( &Hook_OnDrawObject );
inline OnDrawObject_t OnDrawObject_o = nullptr;
@@ -27,6 +27,7 @@ auto CFunctionList::OnInit() -> bool
&C_BaseEntity_GetBoneIdByName,
&C_EconItemView_GetBasePlayerWeaponVData,
&KeyValues3_LoadKV3,
&ClientKeyValues3_SetTypeKV3,
&IGamePhysicsQuery_TraceShape,
&CCSGOInput_GetViewAngles,
&CCSGOInput_SetViewAngles,
@@ -97,6 +97,7 @@ public:
CBasePattern C_BaseEntity_GetBoneIdByName = { VmpStr( "C_BaseEntity::GetBoneIdByName" ) , VmpStr( "E8 ? ? ? ? 48 8B CF 85 C0 78 ? 44 8B C0" ) , CLIENT_DLL , 0 , SEARCH_TYPE_CALL };
CBasePattern C_EconItemView_GetBasePlayerWeaponVData = { VmpStr( "C_EconItemView::GetBasePlayerWeaponVData" ) , VmpStr( "48 81 EC ? ? ? ? 48 85 C9 75 ? 33 C0 48 81 C4 ? ? ? ? C3 48 89 9C 24" ) , CLIENT_DLL , 0 , SEARCH_TYPE_NONE };
CBasePattern KeyValues3_LoadKV3 = { VmpStr( "KeyValues3::LoadKV3" ) , VmpStr( "?LoadKV3@@YA_NPEAVKeyValues3@@PEAVCUtlString@@PEBDAEBUKV3ID_t@@2I@Z" ) , TIER0_DLL , 0 , SEARCH_TYPE_PROC };
CBasePattern ClientKeyValues3_SetTypeKV3 = { VmpStr( "CKeyValues3::SetTypeKV3" ) , VmpStr( "40 53 48 83 EC 20 48 8B 01 48 8B D9 44" ) , CLIENT_DLL , 0 , SEARCH_TYPE_NONE };
CBasePattern IGamePhysicsQuery_TraceShape = { VmpStr( "IGamePhysicsQuery::TraceShape" ) , VmpStr( "48 89 54 24 10 48 89 4C 24 08 55 53 56 57 41 56 41 57 48 8D AC 24 ? ? ? ? B8 E8 24 00 00 E8" ) , CLIENT_DLL , 0 , SEARCH_TYPE_NONE };
CBasePattern CCSGOInput_GetViewAngles = { VmpStr( "CCSGOInput::GetViewAngles" ) , VmpStr( "4C 8B C1 85 D2 74 ? 48 8D 05" ) , CLIENT_DLL , 0 , SEARCH_TYPE_NONE };
CBasePattern CCSGOInput_SetViewAngles = { VmpStr( "CCSGOInput::SetViewAngles" ) , VmpStr( "85 D2 75 ? 48 63 81" ) , CLIENT_DLL , 0 , SEARCH_TYPE_NONE };
@@ -76,6 +76,7 @@ DECLARATE_CS2_FUNCTION_SDK_FASTCALL( void , CSkeletonInstance_CalcWorldSpaceBone
DECLARATE_CS2_FUNCTION_SDK_FASTCALL( int , C_BaseEntity_GetBoneIdByName , ( C_BaseEntity* pC_BaseEntity , const char* szName ) , ( C_BaseEntity* , const char* ) , ( pC_BaseEntity , szName ) );
DECLARATE_CS2_FUNCTION_SDK_FASTCALL( CCSWeaponBaseVData* , C_EconItemView_GetBasePlayerWeaponVData , ( C_EconItemView* pC_EconItemView ) , ( C_EconItemView* ) , ( pC_EconItemView ) );
DECLARATE_CS2_FUNCTION_SDK_FASTCALL( bool , KeyValues3_LoadKV3 , ( KeyValues3* pKV3 , const char* vmatBuffer , KV3ID_t* pID ) , ( KeyValues3* , CUtlString* , const char* , KV3ID_t* , const char* , unsigned int ) , ( pKV3 , nullptr , vmatBuffer , pID , "" , 0 ) );
DECLARATE_CS2_FUNCTION_SDK_FASTCALL( KeyValues3* , ClientKeyValues3_SetTypeKV3 , ( KeyValues3* pKV3 , unsigned int iType , unsigned int iUnk ) , ( KeyValues3* , unsigned int , unsigned int ) , ( pKV3 , iType , iUnk ) );
DECLARATE_CS2_FUNCTION_SDK_FASTCALL( bool , IGamePhysicsQuery_TraceShape , ( IVPhysics2World** pIVPhysics2World , const Ray_t& ray , const Vector3& vecAbsStart , const Vector3& vecAbsEnd , const CTraceFilter* pFilter , CGameTrace* pTrace ) , ( IVPhysics2World** , const Ray_t& , const Vector3& , const Vector3& , const CTraceFilter* , CGameTrace* ) , ( pIVPhysics2World , ray , vecAbsStart , vecAbsEnd , pFilter , pTrace ) );
DECLARATE_CS2_FUNCTION_SDK_FASTCALL( QAngle* , CCSGOInput_GetViewAngles , ( CCSGOInput* pCCSGOInput , int32_t slot ) , ( CCSGOInput* , int32_t ) , ( pCCSGOInput , slot ) );
DECLARATE_CS2_FUNCTION_SDK_FASTCALL( void , CCSGOInput_SetViewAngles , ( CCSGOInput* pCCSGOInput , int32_t slot , QAngle& Angles ) , ( CCSGOInput* , int32_t , QAngle& ) , ( pCCSGOInput , slot , Angles ) );