@@ -92,9 +92,16 @@ std::string VectorToString(CUtlVector<std::string> &vector)
92
92
return result;
93
93
}
94
94
95
- typedef void * (FASTCALL *HostStateRequest_t)(void *a1, void **pRequest);
96
- void * FASTCALL Hook_HostStateRequest (void *a1, void **pRequest);
95
+ typedef bool (FASTCALL *SendNetMessage_t)(CServerSideClient *, CNetMessage*, NetChannelBufType_t);
96
+ typedef void *(FASTCALL *HostStateRequest_t)(void *, void **);
97
+
98
+ bool FASTCALL Hook_SendNetMessage (CServerSideClient *pClient, CNetMessage *pData, NetChannelBufType_t bufType);
99
+ void *FASTCALL Hook_HostStateRequest (void *a1, void **pRequest);
100
+
101
+ SendNetMessage_t g_pfnSendNetMessage = nullptr ;
97
102
HostStateRequest_t g_pfnHostStateRequest = nullptr ;
103
+
104
+ funchook_t *g_pSendNetMessageHook = nullptr ;
98
105
funchook_t *g_pHostStateRequestHook = nullptr ;
99
106
100
107
int g_iSendNetMessage;
@@ -107,9 +114,9 @@ SH_DECL_HOOK6(IServerGameClients, ClientConnect, SH_NOATTRIB, 0, bool, CPlayerSl
107
114
SH_DECL_HOOK3_void (IServerGameDLL, GameFrame, SH_NOATTRIB, 0 , bool , bool , bool );
108
115
109
116
#ifdef PLATFORM_WINDOWS
110
- SH_DECL_MANUALHOOK2 (SendNetMessage, 15 , 0 , 0 , bool , CNetMessage *, NetChannelBufType_t) ;
117
+ constexpr int g_iSendNetMessageOffset = 15 ;
111
118
#else
112
- SH_DECL_MANUALHOOK2 (SendNetMessage, 16 , 0 , 0 , bool , CNetMessage *, NetChannelBufType_t) ;
119
+ constexpr int g_iSendNetMessageOffset = 16 ;
113
120
#endif
114
121
115
122
struct ClientJoinInfo_t
@@ -171,17 +178,21 @@ bool MultiAddonManager::Load(PluginId id, ISmmAPI *ismm, char *error, size_t max
171
178
}
172
179
173
180
g_pHostStateRequestHook = funchook_create ();
174
- funchook_prepare (g_pHostStateRequestHook, (void **)&g_pfnHostStateRequest, (void *)Hook_HostStateRequest);
181
+ funchook_prepare (g_pHostStateRequestHook, (void **)&g_pfnHostStateRequest, (void *)Hook_HostStateRequest);
175
182
funchook_install (g_pHostStateRequestHook, 0 );
176
183
184
+ void **pServerSideClientVTable = (void **)engineModule.FindVirtualTable (" CServerSideClient" );
185
+ g_pfnSendNetMessage = (SendNetMessage_t)pServerSideClientVTable[g_iSendNetMessageOffset];
186
+
187
+ g_pSendNetMessageHook = funchook_create ();
188
+ funchook_prepare (g_pSendNetMessageHook, (void **)&g_pfnSendNetMessage, (void *)Hook_SendNetMessage);
189
+ funchook_install (g_pSendNetMessageHook, 0 );
190
+
177
191
SH_ADD_HOOK (IServerGameDLL, GameServerSteamAPIActivated, g_pSource2Server, SH_MEMBER (this , &MultiAddonManager::Hook_GameServerSteamAPIActivated), false );
178
192
SH_ADD_HOOK (INetworkServerService, StartupServer, g_pNetworkServerService, SH_MEMBER (this , &MultiAddonManager::Hook_StartupServer), true );
179
193
SH_ADD_HOOK (IServerGameClients, ClientConnect, g_pSource2GameClients, SH_MEMBER (this , &MultiAddonManager::Hook_ClientConnect), false );
180
194
SH_ADD_HOOK (IServerGameDLL, GameFrame, g_pSource2Server, SH_MEMBER (this , &MultiAddonManager::Hook_GameFrame), true );
181
195
182
- void *pServerSideClientVTable = engineModule.FindVirtualTable (" CServerSideClient" );
183
- g_iSendNetMessage = SH_ADD_MANUALDVPHOOK (SendNetMessage, pServerSideClientVTable, SH_MEMBER (&g_MultiAddonManager, &MultiAddonManager::Hook_SendNetMessage), false );
184
-
185
196
if (late)
186
197
{
187
198
g_pNetworkGameServer = g_pNetworkServerService->GetIGameServer ();
@@ -634,13 +645,13 @@ void MultiAddonManager::Hook_StartupServer(const GameSessionConfiguration_t &con
634
645
RefreshAddons ();
635
646
}
636
647
637
- bool MultiAddonManager:: Hook_SendNetMessage (CNetMessage *pData, NetChannelBufType_t bufType)
648
+ bool FASTCALL Hook_SendNetMessage (CServerSideClient *pClient, CNetMessage *pData, NetChannelBufType_t bufType)
638
649
{
639
650
NetMessageInfo_t *info = pData->GetNetMessage ()->GetNetMessageInfo ();
640
651
641
652
// 7 for signon messages
642
653
if (info->m_MessageId != net_SignonState || g_MultiAddonManager.m_ExtraAddons .Count () == 0 || !CommandLine ()->HasParm (" -dedicated" ))
643
- RETURN_META_VALUE (MRES_IGNORED, true );
654
+ return g_pfnSendNetMessage (pClient, pData, bufType );
644
655
645
656
auto pMsg = pData->ToPB <CNETMsg_SignonState>();
646
657
@@ -653,8 +664,6 @@ bool MultiAddonManager::Hook_SendNetMessage(CNetMessage *pData, NetChannelBufTyp
653
664
if (pMsg->signon_state () == SIGNONSTATE_CHANGELEVEL)
654
665
pMsg->set_addons (sMap .empty () ? g_MultiAddonManager.m_ExtraAddons [0 ].c_str () : sMap .c_str ()); // If we're on a default map send the first addon
655
666
656
- CServerSideClient *pClient = META_IFACEPTR (CServerSideClient);
657
-
658
667
ClientJoinInfo_t *pPendingClient = GetPendingClient (pClient->GetClientSteamID ()->ConvertToUint64 ());
659
668
660
669
if (pPendingClient)
@@ -669,7 +678,7 @@ bool MultiAddonManager::Hook_SendNetMessage(CNetMessage *pData, NetChannelBufTyp
669
678
pPendingClient->signon_timestamp = Plat_FloatTime ();
670
679
}
671
680
672
- RETURN_META_VALUE (MRES_HANDLED, true );
681
+ return g_pfnSendNetMessage (pClient, pData, bufType );
673
682
}
674
683
675
684
void * FASTCALL Hook_HostStateRequest (void *a1, void **pRequest)
0 commit comments