From 037969a06daeaaccfc29f9836e8de906531c6a03 Mon Sep 17 00:00:00 2001 From: Huoji's <1296564236@qq.com> Date: Sun, 8 Oct 2023 02:29:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=AD=A6=E5=99=A8=E5=B4=A9=E6=BA=83=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- csgo2/hooks.cpp | 40 +++++++++++++++++++++++++ csgo2/native_sdk.h | 13 ++++++-- csgo2/offset.cpp | 6 +++- csgo2/offset.h | 4 +++ csgo2/weapon.h | 75 +++++++++++++++++++++++----------------------- 5 files changed, 97 insertions(+), 41 deletions(-) diff --git a/csgo2/hooks.cpp b/csgo2/hooks.cpp index 6c61e9e..42d0ccd 100644 --- a/csgo2/hooks.cpp +++ b/csgo2/hooks.cpp @@ -12,6 +12,39 @@ OnClientDisconnect_t original_OnClientDisconnect = NULL; Host_Say_t original_Host_Say = NULL; StartupServer_t origin_StartServer = NULL; GameFrame_t origin_GameFrame = NULL; +CCSWeaponBase_Spawn_t origin_CCSWeaponBase_Spawn = NULL; + +void __fastcall hook_CCSWeaponBase_Spawn(CBaseEntity* pThis, void* a2) { + const char* pszClassName = pThis->m_pEntity()->m_designerName; + LOG("Weapon spawn: %s\n", pszClassName); + + origin_CCSWeaponBase_Spawn(pThis, a2); + + do { + auto pWeapon = reinterpret_cast(pThis); + // Weapon could be already initialized with the correct data from + // GiveNamedItem, in that case we don't need to do anything + if (!pWeapon || + pWeapon->m_AttributeManager()->m_Item()->m_bInitialized()) { + break; + } + if (GameWeapons::WeaponMap.find(pszClassName) == + GameWeapons::WeaponMap.end()) { + break; + } + const auto [fullWeaponName, weaponiItemDefIndex] = + GameWeapons::WeaponMap.at(pszClassName); + + LOG("Fixing a %s with index = %d and initialized = %d\n", pszClassName, + pWeapon->m_AttributeManager()->m_Item()->m_iItemDefinitionIndex(), + pWeapon->m_AttributeManager()->m_Item()->m_bInitialized()); + + pWeapon->m_AttributeManager()->m_Item()->m_bInitialized(true); + pWeapon->m_AttributeManager()->m_Item()->m_iItemDefinitionIndex( + weaponiItemDefIndex); + } while (false); +} + void __fastcall hook_GameFrame(void* rcx, bool simulating, bool bFirstTick, bool bLastTick) { /** @@ -180,6 +213,13 @@ auto initMinHook() -> bool { LOG("MH_CreateHook original_Host_Say\n"); break; } + if (MH_CreateHook((LPVOID)Offset::FnCCSWeaponBase_Spawn, + &hook_CCSWeaponBase_Spawn, + reinterpret_cast( + &origin_CCSWeaponBase_Spawn)) != MH_OK) { + LOG("MH_CreateHook origin_CCSWeaponBase_Spawn\n"); + break; + } // ÆôÓù³×Ó if (MH_EnableHook(MH_ALL_HOOKS) != MH_OK) { LOG("MH_EnableHook \n"); diff --git a/csgo2/native_sdk.h b/csgo2/native_sdk.h index e032999..2b0b812 100644 --- a/csgo2/native_sdk.h +++ b/csgo2/native_sdk.h @@ -205,14 +205,16 @@ class CUtlVector_NativeSdk { }; class CBaseEntity; + + class CEntityIdentity { public: CBaseEntity* entity; // 0 void* dunno; // 8 int64_t unk0; // 12 int64_t unk1; // 16 - const char* internalName; - const char* entityName; + const char* m_name; + const char* m_designerName; void* unk2; void* unk3; void* unk4; @@ -407,6 +409,8 @@ class CEconItemView { auto GetStaticData() { return CALL_VIRTUAL(CEconItemDefinition*, 13, this); } + SCHEMA_FIELD(uint16_t, m_iItemDefinitionIndex) + SCHEMA_FIELD(bool, m_bInitialized) }; class CAttributeContainer { public: @@ -421,6 +425,11 @@ class CEconEntity { PSCHEMA_FIELD(CAttributeContainer, m_AttributeManager); }; +class CCSWeaponBase : public CEconEntity +{ +public: + DECLARE_CLASS(CCSWeaponBase) +}; class CBasePlayerWeapon : public CEconEntity { public: DECLARE_CLASS(CBasePlayerWeapon); diff --git a/csgo2/offset.cpp b/csgo2/offset.cpp index 6d8a00b..0b8de55 100644 --- a/csgo2/offset.cpp +++ b/csgo2/offset.cpp @@ -17,6 +17,7 @@ EntityRemove_t FnEntityRemove; UTIL_SayTextFilter_t FnUTIL_SayTextFilter; UTIL_ClientPrintAll_t FnUTIL_ClientPrintAll; ClientPrint_t FnClientPrint; +CCSWeaponBase_Spawn_t FnCCSWeaponBase_Spawn; // CreateGameRuleInterFace_t FnCreateCCSGameRulesInterFace; bool InitOffsetSuccess = false; namespace InterFaces { @@ -79,6 +80,8 @@ auto Init() -> bool { server.FindPattern(pattern_FnClientPrint).Get(FnClientPrint); server.FindPattern(pattern_FnUTIL_SayTextFilter).Get(FnUTIL_SayTextFilter); + server.FindPattern(pattern_CCSWeaponBase_Spawn).Get(FnCCSWeaponBase_Spawn); + InterFaces::SchemaSystem = reinterpret_cast( schemasystem.FindInterface("SchemaSystem_001").Get()); // InterFaces::GameEventManager = reinterpret_cast( @@ -124,6 +127,7 @@ auto Init() -> bool { LOG("[huoji]FnGiveNamedItem : %llx \n", FnGiveNamedItem); LOG("[huoji]FnClientPrint : %llx \n", FnClientPrint); LOG("[huoji]FnUTIL_ClientPrintAll : %llx \n", FnUTIL_ClientPrintAll); + LOG("[huoji]FnCCSWeaponBase_Spawn : %llx \n", FnCCSWeaponBase_Spawn); LOG("[huoji]MaxGlobals : %d \n", global::MaxPlayers); @@ -150,7 +154,7 @@ auto Init() -> bool { 0, NULL); // LOG("FnServerHashFunction: %llx \n", FnServerHashFunction("here", // sizeof("here") - 1, 0x31415926)); - return FnEntityRemove && FnRespawnPlayer && FnGiveNamedItem && + return FnCCSWeaponBase_Spawn && FnEntityRemove && FnRespawnPlayer && FnGiveNamedItem && FnServerHashFunction && Host_SayPtr && InterFaces::IVEngineServer && InterFaces::GameResourceServiceServer && InterFaces::IServerGameClient && InterFaces::GameEventManager && diff --git a/csgo2/offset.h b/csgo2/offset.h index 0186e05..17487ed 100644 --- a/csgo2/offset.h +++ b/csgo2/offset.h @@ -5,6 +5,7 @@ class CEntityInstance; class CCSPlayerPawn; class CGameEntitySystem; class CCSPlayerController; +class CBaseEntity; typedef uint64_t(__fastcall* HashFunction_t)(const char*, unsigned int, unsigned int); typedef void(__fastcall* StateChanged_t)(void* networkTransmitComponent, @@ -24,6 +25,7 @@ typedef void*(__fastcall* UTIL_SayTextFilter_t)(IRecipientFilter&, const char*, CCSPlayerController*, uint64_t); typedef void(__fastcall* UTIL_ClientPrintAll_t)(int msg_dest, const char* msg_name, const char* param1, const char* param2, const char* param3, const char* param4); typedef void(__fastcall* ClientPrint_t)(CCSPlayerController* player, int msg_dest, const char* msg_name, const char* param1, const char* param2, const char* param3, const char* param4); +typedef void(__fastcall* CCSWeaponBase_Spawn_t)(CBaseEntity*, void*); class CSchemaSystem; class CGameResourceService; @@ -91,6 +93,7 @@ static const auto pattern_UTIL_ClientPrintAll = THE_GAME_SIG( "48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 57 48 81 EC 70 01 ?? ?? 8B E9"); static const auto pattern_FnClientPrint = THE_GAME_SIG( "48 85 C9 0F 84 ?? ?? ?? ?? 48 8B C4 48 89 58 18"); +static const auto pattern_CCSWeaponBase_Spawn = THE_GAME_SIG("48 89 5C 24 08 48 89 6C 24 18 48 89 74 24 20 57 48 83 EC 30 48 8B DA 48 8B E9 E8 ?? ?? ?? ??"); extern uint64_t GameResourceServicePtr; extern uint64_t FireEventServerSidePtr; extern uint64_t Module_tier0; @@ -105,6 +108,7 @@ extern EntityRemove_t FnEntityRemove; extern UTIL_SayTextFilter_t FnUTIL_SayTextFilter; extern UTIL_ClientPrintAll_t FnUTIL_ClientPrintAll; extern ClientPrint_t FnClientPrint; +extern CCSWeaponBase_Spawn_t FnCCSWeaponBase_Spawn; extern bool InitOffsetSuccess; auto Init() -> bool; }; // namespace Offset diff --git a/csgo2/weapon.h b/csgo2/weapon.h index 38c02b6..dbeb97c 100644 --- a/csgo2/weapon.h +++ b/csgo2/weapon.h @@ -5,44 +5,43 @@ namespace GameWeapons { static const std::unordered_map> WeaponMap = { - {"bizon", {"weapon_bizon", 1400}}, - {"mac10", {"weapon_mac10", 1400}}, - {"mp7", {"weapon_mp7", 1700}}, - {"mp9", {"weapon_mp9", 1250}}, - {"p90", {"weapon_p90", 2350}}, - {"ump45", {"weapon_ump45", 1700}}, - {"ak47", {"weapon_ak47", 2500}}, - {"aug", {"weapon_aug", 3500}}, - {"famas", {"weapon_famas", 2250}}, - {"galilar", {"weapon_galilar", 2000}}, - {"m4a4", {"weapon_m4a4", 3100}}, - {"m4a1_silencer", {"weapon_m4a1_silencer", 3100}}, - {"m4a1", {"weapon_m4a1_silencer", 3100}}, - {"a1", {"weapon_m4a1_silencer", 3100}}, - {"sg556", {"weapon_sg556", 3500}}, - {"awp", {"weapon_awp", 4750}}, - {"g3sg1", {"weapon_g3sg1", 5000}}, - {"scar20", {"weapon_scar20", 5000}}, - {"ssg08", {"weapon_ssg08", 2500}}, - {"mag7", {"weapon_mag7", 2000}}, - {"nova", {"weapon_nova", 1500}}, - {"sawedoff", {"weapon_sawedoff", 1500}}, - {"xm1014", {"weapon_xm1014", 3000}}, - {"m249", {"weapon_m249", 5750}}, - {"negev", {"weapon_negev", 5750}}, - {"deagle", {"weapon_deagle", 700}}, - {"elite", {"weapon_elite", 800}}, - {"fiveseven", {"weapon_fiveseven", 500}}, - {"glock", {"weapon_glock", 200}}, - {"hkp2000", {"weapon_hkp2000", 200}}, - {"p250", {"weapon_p250", 300}}, - {"tec9", {"weapon_tec9", 500}}, - {"usp_silencer", {"weapon_usp_silencer", 200}}, - {"cz75a", {"weapon_cz75a", 500}}, - {"revolver", {"weapon_revolver", 600}}, - {"kevlar", {"item_kevlar", 600}}, - {"he", {"weapon_hegrenade", 300}}, - {"molotov", {"weapon_hegrenade", 850}}, + {"bizon", {"weapon_bizon", 26}}, + {"mac10", {"weapon_mac10", 27}}, + {"mp7", {"weapon_mp7", 23}}, + {"mp9", {"weapon_mp9", 34}}, + {"p90", {"weapon_p90", 19}}, + {"ump45", {"weapon_ump45", 24}}, + {"ak47", {"weapon_ak47", 7}}, + {"aug", {"weapon_aug", 8}}, + {"famas", {"weapon_famas", 10}}, + {"galilar", {"weapon_galilar", 13}}, + {"m4a4", {"weapon_m4a1", 16}}, + {"m4a1", {"weapon_m4a1_silencer", 60}}, + {"sg556", {"weapon_sg556", 39}}, + {"awp", {"weapon_awp", 9}}, + {"g3sg1", {"weapon_g3sg1", 11}}, + {"scar20", {"weapon_scar20", 38}}, + {"ssg08", {"weapon_ssg08", 40}}, + {"mag7", {"weapon_mag7", 29}}, + {"nova", {"weapon_nova", 35}}, + {"sawedoff", {"weapon_sawedoff", 29}}, + {"xm1014", {"weapon_xm1014", 25}}, + {"m249", {"weapon_m249", 14}}, + {"negev", {"weapon_negev", 28}}, + {"deagle", {"weapon_deagle", 1}}, + {"elite", {"weapon_elite", 2}}, + {"fiveseven", {"weapon_fiveseven", 3}}, + {"glock", {"weapon_glock", 4}}, + {"hkp2000", {"weapon_hkp2000", 32}}, + {"p250", {"weapon_p250", 36}}, + {"tec9", {"weapon_tec9", 30}}, + {"usp_silencer", {"weapon_usp_silencer", 61}}, + {"cz75a", {"weapon_cz75a", 63}}, + {"revolver", {"weapon_revolver", 64}}, + {"he", {"weapon_hegrenade", 44}}, + {"molotov", {"weapon_molotov", 46}}, + {"knife", {"weapon_knife", 42}}, // default CT knife + {"kevlar", {"item_kevlar", 50}}, }; auto ParseWeaponCommand(CCSPlayerController* pController, std::string pszWeaponName) -> bool;