1
This commit is contained in:
@@ -230,6 +230,7 @@
|
||||
<ClInclude Include="sdk\public\eiface.h" />
|
||||
<ClInclude Include="sdk\public\IAppSystem.h" />
|
||||
<ClInclude Include="sdk\public\icvar.h" />
|
||||
<ClInclude Include="sdk\public\igameeventsystem.h" />
|
||||
<ClInclude Include="sdk\public\irecipientfilter.h" />
|
||||
<ClInclude Include="sdk\public\iserver.h" />
|
||||
<ClInclude Include="sdk\public\mathlib.h" />
|
||||
|
||||
@@ -369,6 +369,9 @@
|
||||
<ClInclude Include="luaCjson\strbuf.h">
|
||||
<Filter>源文件\script_engine\lua_cjson</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="sdk\public\igameeventsystem.h">
|
||||
<Filter>头文件\sdk\public</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="dllmain.cpp">
|
||||
|
||||
@@ -35,9 +35,9 @@ auto init(void* ctx) -> bool {
|
||||
serverHandle = reinterpret_cast<uint64_t>(GetModuleHandleA("server.dll"));
|
||||
localizeHandle = reinterpret_cast<uint64_t>(GetModuleHandleA("localize.dll"));
|
||||
|
||||
Sleep(200);
|
||||
Sleep(100);
|
||||
}
|
||||
global::isMetaModInit = (GetModuleHandleA("metamod.2.cs2.dll") != nullptr);
|
||||
global::IsMetaModInit = (GetModuleHandleA("metamod.2.cs2.dll") != nullptr);
|
||||
if (Offset::Init() == false) {
|
||||
LOG("Offset::Init() == false !\n");
|
||||
return false;
|
||||
|
||||
@@ -7,5 +7,6 @@ namespace global {
|
||||
CGlobalVars* GlobalVars;
|
||||
float m_flUniversalTime;
|
||||
float m_flLastTickedTime;
|
||||
bool isMetaModInit;
|
||||
bool IsMetaModInit;
|
||||
bool IsDisableBlood;
|
||||
}
|
||||
@@ -10,5 +10,6 @@ namespace global {
|
||||
extern CGlobalVars* GlobalVars;
|
||||
extern float m_flUniversalTime;
|
||||
extern float m_flLastTickedTime;
|
||||
extern bool isMetaModInit;
|
||||
extern bool IsMetaModInit;
|
||||
extern bool IsDisableBlood;
|
||||
}
|
||||
@@ -6,6 +6,8 @@ namespace hooks {
|
||||
VMTHook* VMT_IServerGameClient;
|
||||
VMTHook* VMT_INetworkServerServiceInteFace;
|
||||
VMTHook* VMT_ISource2ServerInterFace;
|
||||
VMTHook* VMT_GameEventSystem;
|
||||
|
||||
FireEventServerSide_t original_FireEventServerSide = NULL;
|
||||
OnClientConnect_t original_OnClientConnected = NULL;
|
||||
OnClientDisconnect_t original_OnClientDisconnect = NULL;
|
||||
@@ -14,23 +16,45 @@ StartupServer_t origin_StartServer = NULL;
|
||||
GameFrame_t origin_GameFrame = NULL;
|
||||
CCSWeaponBase_Spawn_t origin_CCSWeaponBase_Spawn = NULL;
|
||||
UTIL_SayText2Filter_t origin_UTIL_SayText2Filter = NULL;
|
||||
PostEventAbstract_t origin_PostEventAbstract = NULL;
|
||||
void __fastcall hook_PostEventAbstract(
|
||||
void* rcx,
|
||||
CSplitScreenSlot nSlot,
|
||||
bool bLocalOnly,
|
||||
int nClientCount,
|
||||
const uint64* clients,
|
||||
INetworkSerializable* pEvent,
|
||||
const void* pData,
|
||||
unsigned long nSize,
|
||||
NetChannelBufType_t bufType)
|
||||
{
|
||||
/*
|
||||
if (global::IsDisableBlood == true) {
|
||||
NetMessageInfo_t* info = pEvent->GetNetMessageInfo();
|
||||
if (info) {
|
||||
if (info->m_MessageId == TE_WorldDecalId)
|
||||
{
|
||||
LOG("delete the blood in here \n");
|
||||
//*(uint64_t*)clients &= ~((uint64)1 << nSlot.Get());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
if (pEvent) {
|
||||
NetMessageInfo_t* info = pEvent->GetNetMessageInfo();
|
||||
if (info && info->m_MessageId != 0) {
|
||||
LOG("1111:%d \n", info->m_MessageId);
|
||||
}
|
||||
}
|
||||
return origin_PostEventAbstract(rcx, nSlot, bLocalOnly, nClientCount, clients, pEvent, pData, nSize, bufType);
|
||||
}
|
||||
void __fastcall hook_UTIL_SayText2Filter(
|
||||
IRecipientFilter& filter, CCSPlayerController* pEntity,
|
||||
uint64_t eMessageType, const char* messeageName, const char* param1,
|
||||
const char* param2, const char* param3, const char* param4) {
|
||||
const auto entIndex =
|
||||
PlayerSlot_to_EntityIndex(filter.GetRecipientIndex(0).Get());
|
||||
/*
|
||||
LOG("UTIL_SayText2Filter: %s\n", messeageName);
|
||||
LOG("entIndex: %d\n", entIndex);
|
||||
|
||||
LOG("param1: %s\n", param1);
|
||||
LOG("param2: %s\n", param2);
|
||||
|
||||
LOG("param3: %s\n", param3);
|
||||
LOG("param4: %s\n", param4);
|
||||
LOG("eMessageType: %d\n", eMessageType);
|
||||
*/
|
||||
const auto isHandle = ScriptCallBacks::luCall_onSayText2Filter(
|
||||
entIndex, eMessageType, messeageName, param1, param2, param3, param4);
|
||||
if (isHandle == false) {
|
||||
@@ -110,6 +134,9 @@ void __fastcall hook_GameFrame(void* rcx, bool simulating, bool bFirstTick,
|
||||
if (global::EntitySystem == nullptr) {
|
||||
global::EntitySystem = CGameEntitySystem::GetInstance();
|
||||
}
|
||||
if (global::GlobalVars == nullptr) {
|
||||
global::GlobalVars = GetGameGlobals();
|
||||
}
|
||||
return origin_GameFrame(rcx, simulating, bFirstTick, bLastTick);
|
||||
}
|
||||
void __fastcall hook_StartServer(void* rcx,
|
||||
@@ -300,7 +327,12 @@ auto initVmtHook() -> bool {
|
||||
VMT_ISource2ServerInterFace =
|
||||
new VMTHook(Memory::read<void*>(reinterpret_cast<uint64_t>(
|
||||
Offset::InterFaces::ISource2ServerInterFace)));
|
||||
VMT_GameEventSystem =
|
||||
new VMTHook(Memory::read<void*>(reinterpret_cast<uint64_t>(
|
||||
Offset::InterFaces::GameEventSystem)));
|
||||
|
||||
origin_PostEventAbstract = reinterpret_cast<PostEventAbstract_t>(
|
||||
VMT_GameEventSystem->Hook(16, hook_PostEventAbstract));
|
||||
original_OnClientConnected = reinterpret_cast<OnClientConnect_t>(
|
||||
VMT_IServerGameClient->Hook(11, hook_OnClientConnected));
|
||||
original_OnClientDisconnect = reinterpret_cast<OnClientDisconnect_t>(
|
||||
@@ -323,8 +355,14 @@ auto init() -> bool {
|
||||
}
|
||||
auto unload() -> void {
|
||||
VMT_IServerGameClient->ClearHooks();
|
||||
VMT_INetworkServerServiceInteFace->ClearHooks();
|
||||
VMT_ISource2ServerInterFace->ClearHooks();
|
||||
VMT_GameEventSystem->ClearHooks();
|
||||
|
||||
delete VMT_IServerGameClient;
|
||||
delete VMT_INetworkServerServiceInteFace;
|
||||
delete VMT_ISource2ServerInterFace;
|
||||
delete VMT_GameEventSystem;
|
||||
|
||||
MH_DisableHook(MH_ALL_HOOKS);
|
||||
MH_RemoveHook(MH_ALL_HOOKS);
|
||||
|
||||
@@ -19,7 +19,7 @@ typedef void(__fastcall* UTIL_SayText2Filter_t)(IRecipientFilter&,
|
||||
const char*, const char*,
|
||||
const char*, const char*,
|
||||
const char*);
|
||||
|
||||
typedef void(__fastcall* PostEventAbstract_t)(void*, CSplitScreenSlot, bool, int, const uint64_t*, INetworkSerializable*, const void*, unsigned long, NetChannelBufType_t);
|
||||
namespace hooks {
|
||||
extern Host_Say_t original_Host_Say;
|
||||
auto init() -> bool;
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
class InterfaceReg;
|
||||
//cancer fix me plz
|
||||
namespace global {
|
||||
extern bool isMetaModInit;
|
||||
extern bool IsMetaModInit;
|
||||
};
|
||||
// Pointer arithmetic utility class.
|
||||
struct UTILPtr {
|
||||
@@ -119,7 +119,7 @@ class CModule {
|
||||
|
||||
private:
|
||||
void InitializeHandle() {
|
||||
if (global::isMetaModInit == false) {
|
||||
if (global::IsMetaModInit == false) {
|
||||
this->m_handle = static_cast<void*>(GetModuleHandleA(this->GetName()));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ CLocalize* ILocalize;
|
||||
INetworkServerService* INetworkServerServiceInteFace;
|
||||
CCSGameRules* CCSGameRulesInterFace;
|
||||
ICvar* IVEngineCvar;
|
||||
IGameEventSystem* GameEventSystem;
|
||||
}; // namespace InterFaces
|
||||
auto SafeDelayInit(void* ctx) -> void {
|
||||
// <20><>Ҫ<EFBFBD><D2AA>Ϸ<EFBFBD><CFB7><EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
|
||||
@@ -108,10 +109,13 @@ auto Init() -> bool {
|
||||
InterFaces::INetworkServerServiceInteFace =
|
||||
reinterpret_cast<INetworkServerService*>(
|
||||
engine.FindInterface("NetworkServerService_001").Get());
|
||||
InterFaces::GameEventSystem = reinterpret_cast<IGameEventSystem*>(
|
||||
engine.FindInterface("GameEventSystemServerV001").Get());
|
||||
InterFaces::IServerGameClient = reinterpret_cast<IServerGameClients*>(
|
||||
server.FindInterface("Source2GameClients001").Get());
|
||||
InterFaces::ISource2ServerInterFace = reinterpret_cast<ISource2Server*>(
|
||||
server.FindInterface("Source2Server001").Get());
|
||||
|
||||
if (InterFaces::ISource2ServerInterFace) {
|
||||
InterFaces::GameEventManager =
|
||||
(IGameEventManager2*)(CALL_VIRTUAL(
|
||||
@@ -156,6 +160,8 @@ auto Init() -> bool {
|
||||
LOG("[huoji]InterFaces::ISource2ServerInterFace : %llx \n",
|
||||
InterFaces::ISource2ServerInterFace);
|
||||
LOG("[huoji]InterFaces::IVEngineCvar : %llx \n", InterFaces::IVEngineCvar);
|
||||
LOG("[huoji]InterFaces::GameEventSystem : %llx \n", InterFaces::GameEventSystem);
|
||||
|
||||
LOG("[huoji] CGameEntitySystem::GetInstance : %llx \n",
|
||||
CGameEntitySystem::GetInstance());
|
||||
LOG("init offset success !\n");
|
||||
@@ -166,6 +172,7 @@ auto Init() -> bool {
|
||||
// sizeof("here") - 1, 0x31415926));
|
||||
return FnPlayerChangeName && FnCCSWeaponBase_Spawn && FnEntityRemove &&
|
||||
FnRespawnPlayerInDeathMatch && FnGiveNamedItem && Host_SayPtr &&
|
||||
InterFaces::GameEventSystem &&
|
||||
InterFaces::IVEngineServer &&
|
||||
InterFaces::GameResourceServiceServer &&
|
||||
InterFaces::IServerGameClient && InterFaces::GameEventManager &&
|
||||
|
||||
@@ -6,6 +6,11 @@ class CCSPlayerPawn;
|
||||
class CGameEntitySystem;
|
||||
class CCSPlayerController;
|
||||
class CBaseEntity;
|
||||
class IGameEventSystem;
|
||||
class CSchemaSystem;
|
||||
class CGameResourceService;
|
||||
class CLocalize;
|
||||
class CCSGameRules;
|
||||
typedef uint64_t(__fastcall* HashFunction_t)(const char*, unsigned int,
|
||||
unsigned int);
|
||||
typedef void(__fastcall* StateChanged_t)(void* networkTransmitComponent,
|
||||
@@ -32,10 +37,7 @@ typedef void(__fastcall* ClientPrint_t)(CCSPlayerController* player,
|
||||
const char* param3, const char* param4);
|
||||
typedef void(__fastcall* CCSWeaponBase_Spawn_t)(CBaseEntity*, void*);
|
||||
typedef void(__fastcall* PlayerChangeName_t)(CBaseEntity*, char*);
|
||||
class CSchemaSystem;
|
||||
class CGameResourceService;
|
||||
class CLocalize;
|
||||
class CCSGameRules;
|
||||
|
||||
namespace Offset {
|
||||
namespace InterFaces {
|
||||
extern CSchemaSystem* SchemaSystem;
|
||||
@@ -49,6 +51,7 @@ extern INetworkServerService* INetworkServerServiceInteFace;
|
||||
extern ISource2Server* ISource2ServerInterFace;
|
||||
extern CCSGameRules* CCSGameRulesInterFace;
|
||||
extern ICvar* IVEngineCvar;
|
||||
extern IGameEventSystem* GameEventSystem;
|
||||
}; // namespace InterFaces
|
||||
static const auto pattern_FnUTIL_SayText2FilterPtr = THE_GAME_SIG(
|
||||
"48 89 5C 24 ?? 55 56 57 48 8D 6C 24 ?? 48 81 EC ?? ?? ?? ?? 41 0F B6 F8");
|
||||
|
||||
@@ -968,8 +968,17 @@ auto luaApi_GetConVarObject(lua_State* luaVm) -> int {
|
||||
const auto name = lua_tostring(luaVm, 1);
|
||||
lua_pushnumber(luaVm,
|
||||
Offset::InterFaces::IVEngineCvar->FindConVar(name).Get());
|
||||
lua_pop(luaVm, 1);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
auto luaApi_SetServerBloodStatus(lua_State* luaVm) -> int {
|
||||
// param: isEnableBoold:bool
|
||||
global::IsDisableBlood = !lua_toboolean(luaVm, 1);
|
||||
lua_pop(luaVm, 1);
|
||||
return 0;
|
||||
}
|
||||
auto initFunciton(lua_State* luaVm) -> void {
|
||||
lua_register(luaVm, "ListenToGameEvent", luaApi_ListenToGameEvent);
|
||||
lua_register(luaVm, "luaApi_SetPlayerCurrentWeaponAmmo",
|
||||
@@ -1029,6 +1038,7 @@ auto initFunciton(lua_State* luaVm) -> void {
|
||||
lua_register(luaVm, "luaApi_GetPlayerName", luaApi_GetPlayerName);
|
||||
lua_register(luaVm, "luaApi_SetPlayerNameSlient",
|
||||
luaApi_SetPlayerNameSlient);
|
||||
lua_register(luaVm, "luaApi_SetServerBloodStatus", luaApi_SetServerBloodStatus);
|
||||
|
||||
// lua_register(luaVm, "luaApi_TeleportPlayer", luaApi_TeleportPlayer);
|
||||
|
||||
|
||||
@@ -161,6 +161,7 @@ class EconControlPointInfo_t;
|
||||
struct EconItemInfo_t {
|
||||
|
||||
};
|
||||
class bf_read;
|
||||
class bf_write;
|
||||
typedef uint32_t SpawnGroupHandle_t;
|
||||
typedef uint32_t SwapChainHandle_t;
|
||||
|
||||
147
csgo2/sdk/public/igameeventsystem.h
Normal file
147
csgo2/sdk/public/igameeventsystem.h
Normal file
@@ -0,0 +1,147 @@
|
||||
#include "../sdk.h"
|
||||
class IAppSystem;
|
||||
class CUtlSlot;
|
||||
class CUtlAbstractDelegate;
|
||||
class CBaseHandle;
|
||||
typedef uint16 NetworkMessageId;
|
||||
typedef uint8 NetworkGroupId;
|
||||
typedef uint NetworkCategoryId;
|
||||
|
||||
enum NetChannelBufType_t
|
||||
{
|
||||
kFuckOffAss
|
||||
};
|
||||
|
||||
enum NetworkValidationMode_t
|
||||
{
|
||||
kFuckOffAss_NetworkValidationMode
|
||||
};
|
||||
class IProtobufBinding
|
||||
{
|
||||
public:
|
||||
virtual const char* GetName() = 0;
|
||||
virtual int GetSize() = 0;
|
||||
|
||||
virtual const char* ToString(const void* pData, CUtlString& sResult) = 0;
|
||||
|
||||
virtual const char* GetGroup() = 0;
|
||||
virtual Color GetGroupColor() = 0;
|
||||
virtual NetChannelBufType_t GetBufType() = 0;
|
||||
|
||||
virtual bool ReadFromBuffer(void* pData, bf_read& pBuf) = 0;
|
||||
virtual bool WriteToBuffer(const void* pData, bf_write& pBuf) = 0;
|
||||
|
||||
virtual void* AllocateMessage() = 0;
|
||||
virtual void DeallocateMessage(void* pMsg) = 0;
|
||||
virtual void* AllocateAndCopyConstructNetMessage(const void* pOther) = 0;
|
||||
|
||||
virtual bool OkToRedispatch() = 0;
|
||||
virtual void Copy(const void* pFrom, void* pTo) = 0;
|
||||
virtual bool unk001() = 0;
|
||||
};
|
||||
|
||||
struct NetMessageInfo_t
|
||||
{
|
||||
int m_nCategories;
|
||||
IProtobufBinding* m_pBinding;
|
||||
CUtlString m_szGroup;
|
||||
NetworkMessageId m_MessageId;
|
||||
NetworkGroupId m_GroupId;
|
||||
|
||||
// (1 << 0) - FLAG_RELIABLE
|
||||
// (1 << 6) - FLAG_AUTOASSIGNEDID
|
||||
// (1 << 7) - FLAG_UNK001
|
||||
uint8 m_nFlags;
|
||||
|
||||
int m_unk001;
|
||||
int m_unk002;
|
||||
bool m_bOkayToRedispatch;
|
||||
};
|
||||
enum NetworkSerializationMode_t
|
||||
{
|
||||
NET_SERIALIZATION_MODE_0 = 0x0,
|
||||
NET_SERIALIZATION_MODE_1 = 0x1,
|
||||
NET_SERIALIZATION_MODE_COUNT = 0x2,
|
||||
NET_SERIALIZATION_MODE_DEFAULT = 0x0,
|
||||
NET_SERIALIZATION_MODE_SERVER = 0x0,
|
||||
NET_SERIALIZATION_MODE_CLIENT = 0x1,
|
||||
};
|
||||
enum ETEProtobufIds_t {
|
||||
TE_EffectDispatchId = 400,
|
||||
TE_ArmorRicochetId = 401,
|
||||
TE_BeamEntPointId = 402,
|
||||
TE_BeamEntsId = 403,
|
||||
TE_BeamPointsId = 404,
|
||||
TE_BeamRingId = 405,
|
||||
TE_BSPDecalId = 407,
|
||||
TE_BubblesId = 408,
|
||||
TE_BubbleTrailId = 409,
|
||||
TE_DecalId = 410,
|
||||
TE_WorldDecalId = 411,
|
||||
TE_EnergySplashId = 412,
|
||||
TE_FizzId = 413,
|
||||
TE_ShatterSurfaceId = 414,
|
||||
TE_GlowSpriteId = 415,
|
||||
TE_ImpactId = 416,
|
||||
TE_MuzzleFlashId = 417,
|
||||
TE_BloodStreamId = 418,
|
||||
TE_ExplosionId = 419,
|
||||
TE_DustId = 420,
|
||||
TE_LargeFunnelId = 421,
|
||||
TE_SparksId = 422,
|
||||
TE_PhysicsPropId = 423,
|
||||
TE_PlayerDecalId = 424,
|
||||
TE_ProjectedDecalId = 425,
|
||||
TE_SmokeId = 426
|
||||
};
|
||||
class INetworkSerializable
|
||||
{
|
||||
public:
|
||||
virtual ~INetworkSerializable() = 0;
|
||||
|
||||
virtual const char* GetUnscopedName() = 0;
|
||||
virtual NetMessageInfo_t* GetNetMessageInfo() = 0;
|
||||
|
||||
virtual void SetMessageId(unsigned short nMessageId) = 0;
|
||||
|
||||
virtual void AddCategoryMask(int nMask, bool) = 0;
|
||||
|
||||
virtual void SwitchMode(NetworkValidationMode_t nMode) = 0;
|
||||
|
||||
virtual void* AllocateMessage() = 0;
|
||||
virtual void DeallocateMessage(void* pMsg) = 0;
|
||||
virtual void* AllocateAndCopyConstructNetMessage(void const* pOther) = 0;
|
||||
|
||||
virtual bool Serialize(bf_write& pBuf, void const* pData, NetworkSerializationMode_t unused) = 0;
|
||||
virtual bool Unserialize(bf_read& pBuf, void* pData, NetworkSerializationMode_t unused) = 0;
|
||||
};
|
||||
|
||||
class IGameEventSystem : public IAppSystem
|
||||
{
|
||||
public:
|
||||
//vmt index 11
|
||||
virtual void RegisterGameEvent(INetworkSerializable * pEvent) = 0;
|
||||
|
||||
virtual void RegisterGameEventHandlerAbstract(CUtlSlot* nSlot, const CUtlAbstractDelegate& delegate, INetworkSerializable* pEvent) = 0;
|
||||
virtual void UnregisterGameEventHandlerAbstract(CUtlSlot* nSlot, const CUtlAbstractDelegate& delegate, INetworkSerializable* pEvent) = 0;
|
||||
|
||||
// Providing nSize has no effect and is unused.
|
||||
virtual void PostEventAbstract_Local(CSplitScreenSlot nSlot, INetworkSerializable* pEvent, const void* pData, unsigned long nSize) = 0;
|
||||
|
||||
// Providing nSlot as -1 would select 0nth slot.
|
||||
// clients pointer is a masked uint64 value where (client index - 1) is mapped to each bit.
|
||||
// Providing nClientCount as -1 and clients pointer as NULL would post event to all available clients.
|
||||
// Providing nSize has no effect and is unused.
|
||||
virtual void PostEventAbstract(CSplitScreenSlot nSlot, bool bLocalOnly, int nClientCount, const uint64* clients,
|
||||
INetworkSerializable* pEvent, const void* pData, unsigned long nSize, NetChannelBufType_t bufType) = 0;
|
||||
virtual void PostEventAbstract(CSplitScreenSlot nSlot, bool bLocalOnly, IRecipientFilter* pFilter,
|
||||
INetworkSerializable* pEvent, const void* pData, unsigned long nSize) = 0;
|
||||
|
||||
// Posts the event to all clients, even tho the function name tells otherwise
|
||||
// Providing nSize has no effect and is unused.
|
||||
virtual void PostEntityEventAbstract(const CBaseHandle& hndl, INetworkSerializable* pEvent, const void* pData, unsigned long nSize, NetChannelBufType_t bufType) = 0;
|
||||
|
||||
virtual void ProcessQueuedEvents() = 0;
|
||||
virtual int GetEventSource() const = 0;
|
||||
virtual void PurgeQueuedEvents() = 0;
|
||||
};
|
||||
@@ -112,3 +112,4 @@ inline T AlignValue(T val, uintptr_t alignment) {
|
||||
#include "gameevent/IGameEvent.h"
|
||||
#include "tier1/bufferstring.h"
|
||||
#include "public/eiface.h"
|
||||
#include "public/igameeventsystem.h"
|
||||
|
||||
Reference in New Issue
Block a user