2023-10-01 02:28:13 +08:00
|
|
|
|
#include "hooks.h"
|
|
|
|
|
|
#include "native_sdk/entity/cbaseentity.h"
|
|
|
|
|
|
#include "sdk/convar/convar.hpp"
|
2023-10-01 22:13:20 +08:00
|
|
|
|
#include "player_manager.h"
|
|
|
|
|
|
#include "native_sdk/entity/cbaseplayercontroller.h"
|
2023-10-01 02:28:13 +08:00
|
|
|
|
FireEventServerSide_t original_FireEventServerSide = NULL;
|
|
|
|
|
|
OnClientConnect_t original_OnClientConnected = NULL;
|
2023-10-01 22:13:20 +08:00
|
|
|
|
OnClientDisconnect_t original_OnClientDisconnect = NULL;
|
2023-10-01 02:28:13 +08:00
|
|
|
|
Host_Say_t original_Host_Say = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
namespace hooks {
|
2023-10-01 22:13:20 +08:00
|
|
|
|
// "player_connect"
|
|
|
|
|
|
VMTHook* VMT_IServerGameClient;
|
|
|
|
|
|
void __fastcall hook_ClientDisconnect(void* rcx, CPlayerSlot slot, int reason,
|
|
|
|
|
|
const char* pszName, uint64_t xuid,
|
|
|
|
|
|
const char* pszNetworkID) {
|
2023-10-02 05:03:37 +08:00
|
|
|
|
if (pszNetworkID != NULL && *pszNetworkID == '[') {
|
|
|
|
|
|
ExtendPlayerManager::RemovePlayerSlotBySteamId(
|
|
|
|
|
|
ExtendPlayerManager::SteamIDStringToUInt64(pszNetworkID));
|
|
|
|
|
|
}
|
2023-10-01 22:13:20 +08:00
|
|
|
|
return original_OnClientDisconnect(rcx, slot, reason, pszName, xuid,
|
|
|
|
|
|
pszNetworkID);
|
|
|
|
|
|
}
|
|
|
|
|
|
void __fastcall hook_OnClientConnected(void* rcx, CPlayerSlot slot,
|
|
|
|
|
|
const char* pszName, uint64_t xuid,
|
|
|
|
|
|
const char* pszNetworkID,
|
|
|
|
|
|
const char* pszAddress,
|
|
|
|
|
|
bool bFakePlayer) {
|
|
|
|
|
|
if (bFakePlayer == false) {
|
2023-10-02 05:03:37 +08:00
|
|
|
|
ExtendPlayerManager::AddSteamIdToPlayerSteamIdWithNameTable(
|
|
|
|
|
|
ExtendPlayerManager::SteamIDStringToUInt64(pszNetworkID),
|
|
|
|
|
|
slot.Get());
|
2023-10-01 02:28:13 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-01 22:13:20 +08:00
|
|
|
|
return original_OnClientConnected(rcx, slot, pszName, xuid, pszNetworkID,
|
|
|
|
|
|
pszAddress, bFakePlayer);
|
|
|
|
|
|
}
|
|
|
|
|
|
void __fastcall hook_Host_Say(void* pEntity, void* args, bool teamonly,
|
|
|
|
|
|
int unk1, const char* unk2) {
|
|
|
|
|
|
const auto theArgs = reinterpret_cast<CCommand*>(args);
|
|
|
|
|
|
const auto theEntity = reinterpret_cast<CCSPlayerController*>(pEntity);
|
2023-10-01 02:28:13 +08:00
|
|
|
|
|
2023-10-01 22:13:20 +08:00
|
|
|
|
char* pos = nullptr;
|
|
|
|
|
|
do {
|
|
|
|
|
|
if (theArgs == nullptr || theEntity == nullptr) {
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
auto message = std::string(theArgs->GetCommandString());
|
2023-10-02 05:03:37 +08:00
|
|
|
|
printf("player[%d][%p] %s : %s \n", theEntity->GetRefEHandle().GetEntryIndex(),theEntity, &theEntity->m_iszPlayerName(),
|
|
|
|
|
|
message.c_str());
|
2023-10-01 22:13:20 +08:00
|
|
|
|
} while (false);
|
|
|
|
|
|
/*
|
|
|
|
|
|
if (*pMessage == '!' || *pMessage == '/')
|
|
|
|
|
|
ParseChatCommand(pMessage, pEntity);
|
2023-10-01 02:28:13 +08:00
|
|
|
|
|
2023-10-01 22:13:20 +08:00
|
|
|
|
if (*pMessage == '/')
|
|
|
|
|
|
return;
|
|
|
|
|
|
*/
|
|
|
|
|
|
return original_Host_Say(pEntity, args, teamonly, unk1, unk2);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool __fastcall hook_FireEventServerSide(CGameEventManager* rcx,
|
|
|
|
|
|
IGameEvent* event, bool serverSide) {
|
|
|
|
|
|
do {
|
|
|
|
|
|
if (!event) {
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const char* eventName = event->GetName();
|
|
|
|
|
|
if (!eventName) {
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
static constexpr auto player_death =
|
|
|
|
|
|
hash_32_fnv1a_const("player_death");
|
|
|
|
|
|
static constexpr auto player_chat = hash_32_fnv1a_const("player_chat");
|
|
|
|
|
|
switch (hash_32_fnv1a_const(eventName)) {
|
2023-10-01 02:28:13 +08:00
|
|
|
|
case player_death:
|
|
|
|
|
|
events::OnPlayerDeathEvent(event);
|
|
|
|
|
|
break;
|
2023-10-01 22:13:20 +08:00
|
|
|
|
// V<><56>bug,<2C>ⲻ<EFBFBD><E2B2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2023-10-01 02:28:13 +08:00
|
|
|
|
/*
|
|
|
|
|
|
case player_chat:
|
|
|
|
|
|
events::OnPlayerChat(event);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
*/
|
2023-10-01 22:13:20 +08:00
|
|
|
|
}
|
2023-10-01 02:28:13 +08:00
|
|
|
|
|
2023-10-01 22:13:20 +08:00
|
|
|
|
} while (false);
|
|
|
|
|
|
return original_FireEventServerSide(rcx, event, serverSide);
|
|
|
|
|
|
}
|
|
|
|
|
|
auto initMinHook() -> bool {
|
|
|
|
|
|
bool isSuccess = false;
|
|
|
|
|
|
// <20><>ʼ<EFBFBD><CABC>MiniHook
|
|
|
|
|
|
do {
|
|
|
|
|
|
if (MH_Initialize() != MH_OK) {
|
|
|
|
|
|
LOG("MH_Initialize() != MH_OK\n");
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (MH_CreateHook((LPVOID)Offset::FireEventServerSidePtr,
|
|
|
|
|
|
&hook_FireEventServerSide,
|
|
|
|
|
|
reinterpret_cast<LPVOID*>(
|
|
|
|
|
|
&original_FireEventServerSide)) != MH_OK) {
|
|
|
|
|
|
LOG("MH_CreateHook original_FireEventServerSide\n");
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (MH_CreateHook((LPVOID)Offset::Host_SayPtr, &hook_Host_Say,
|
|
|
|
|
|
reinterpret_cast<LPVOID*>(&original_Host_Say)) !=
|
|
|
|
|
|
MH_OK) {
|
|
|
|
|
|
LOG("MH_CreateHook original_Host_Say\n");
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
// <20><><EFBFBD>ù<EFBFBD><C3B9><EFBFBD>
|
|
|
|
|
|
if (MH_EnableHook(MH_ALL_HOOKS) != MH_OK) {
|
|
|
|
|
|
LOG("MH_EnableHook \n");
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
isSuccess = true;
|
|
|
|
|
|
} while (false);
|
|
|
|
|
|
return isSuccess;
|
|
|
|
|
|
}
|
|
|
|
|
|
auto initVmtHook() -> bool {
|
|
|
|
|
|
VMT_IServerGameClient = new VMTHook(Memory::read<void*>(
|
|
|
|
|
|
reinterpret_cast<uint64_t>(Offset::InterFaces::IServerGameClient)));
|
|
|
|
|
|
original_OnClientConnected = reinterpret_cast<OnClientConnect_t>(
|
|
|
|
|
|
VMT_IServerGameClient->Hook(11, hook_OnClientConnected));
|
|
|
|
|
|
original_OnClientDisconnect = reinterpret_cast<OnClientDisconnect_t>(
|
|
|
|
|
|
VMT_IServerGameClient->Hook(16, hook_ClientDisconnect));
|
|
|
|
|
|
return original_OnClientConnected && original_OnClientDisconnect;
|
|
|
|
|
|
}
|
|
|
|
|
|
auto init() -> bool {
|
|
|
|
|
|
bool isSuccess = initMinHook() && initVmtHook();
|
|
|
|
|
|
// bool isSuccess = initVmtHook();
|
|
|
|
|
|
return isSuccess;
|
|
|
|
|
|
}
|
|
|
|
|
|
auto unload() -> void {
|
|
|
|
|
|
VMT_IServerGameClient->ClearHooks();
|
2023-10-01 04:57:41 +08:00
|
|
|
|
|
2023-10-01 22:13:20 +08:00
|
|
|
|
delete VMT_IServerGameClient;
|
2023-10-01 04:57:41 +08:00
|
|
|
|
|
2023-10-01 22:13:20 +08:00
|
|
|
|
MH_DisableHook(MH_ALL_HOOKS);
|
|
|
|
|
|
MH_RemoveHook(MH_ALL_HOOKS);
|
|
|
|
|
|
MH_Uninitialize();
|
|
|
|
|
|
}
|
|
|
|
|
|
} // namespace hooks
|