3#include <igameevents.h>
5#include <CS2Kit/Sdk/GameData.hpp>
6#include <CS2Kit/Sdk/GameInterfaces.hpp>
7#include <CS2Kit/Sdk/UserMessage.hpp>
8#include <CS2Kit/Utils/Log.hpp>
9#include <engine/igameeventsystem.h>
10#include <irecipientfilter.h>
11#include <networksystem/inetworkmessages.h>
12#include <networksystem/netmessage.h>
13#include <usermessages.pb.h>
20bool MessageSystem::Initialize()
22 auto& interfaces = GameInterfaces::Instance();
24 if (!interfaces.GameEventSystem)
26 Log::Error(
"IGameEventSystem not available.");
30 if (!interfaces.NetworkMessages)
32 Log::Error(
"INetworkMessages not available.");
36 Log::Info(
"Message system initialized.");
40bool MessageSystem::InitGameEventManager()
42 auto& interfaces = GameInterfaces::Instance();
43 auto& gameData = GameData::Instance();
45 void* eventManagerAddr = gameData.ResolveSignature(
"GameEventManager");
48 interfaces.GameEventManager =
49 *
reinterpret_cast<IGameEventManager2**
>(
reinterpret_cast<uintptr_t
>(eventManagerAddr));
51 if (interfaces.GameEventManager)
53 Log::Info(
"Game event manager resolved at {:#x}.",
54 reinterpret_cast<uintptr_t
>(interfaces.GameEventManager));
58 Log::Warn(
"Game event manager pointer is null after resolve.");
63 Log::Warn(
"GameEventManager signature not found.");
66 void* legacyListenerAddr = gameData.FindSignature(
"LegacyGameEventListener");
67 if (legacyListenerAddr)
69 _getLegacyListener =
reinterpret_cast<GetLegacyGameEventListenerFn
>(legacyListenerAddr);
70 Log::Info(
"LegacyGameEventListener resolved.");
74 Log::Warn(
"LegacyGameEventListener signature not found (will use broadcast fallback).");
77 return interfaces.GameEventManager !=
nullptr;
80void MessageSystem::SendCenterHtml(
int slot,
const std::string& html)
82 auto* gameEventManager = GameInterfaces::Instance().GameEventManager;
83 if (!gameEventManager || slot < 0 || slot >= 64)
86 IGameEvent* pEvent = gameEventManager->CreateEvent(
"show_survival_respawn_status");
90 pEvent->SetString(
"loc_token", html.c_str());
91 pEvent->SetInt(
"userid", slot);
92 pEvent->SetInt(
"duration", 5);
94 if (_getLegacyListener)
96 IGameEventListener2* pListener = _getLegacyListener(CPlayerSlot(slot));
99 pListener->FireGameEvent(pEvent);
100 gameEventManager->FreeEvent(pEvent);
105 gameEventManager->FireEvent(pEvent);
108void MessageSystem::SendChatMessage(
int slot,
const std::string& message)
110 auto& interfaces = GameInterfaces::Instance();
111 if (!interfaces.GameEventSystem || !interfaces.NetworkMessages || slot < 0 || slot >= 64)
117 if (!_textMsgInternal)
119 _textMsgInternal = interfaces.NetworkMessages->FindNetworkMessage(
"CUserMessageTextMsg");
120 if (!_textMsgInternal)
121 _textMsgInternal = interfaces.NetworkMessages->FindNetworkMessagePartial(
"TextMsg");
124 if (!_textMsgInternal)
127 CNetMessage* pMsg = _textMsgInternal->AllocateMessage();
131 auto* pTextMsg = pMsg->ToPB<CUserMessageTextMsg>();
134 interfaces.NetworkMessages->DeallocateNetMessageAbstract(_textMsgInternal, pMsg);
137 pTextMsg->set_dest(HudPrintTalk);
138 pTextMsg->add_param(message.c_str());
140 uint64_t clients = (1ULL << slot);
142 interfaces.GameEventSystem->PostEventAbstract(-1,
false, 1, &clients, _textMsgInternal, pMsg, 0,
143 NetChannelBufType_t::BUF_RELIABLE);
145 interfaces.NetworkMessages->DeallocateNetMessageAbstract(_textMsgInternal, pMsg);
148void MessageSystem::ClearCenterHtml(
int slot)
150 SendCenterHtml(slot,
" ");