88 AnticheatPlugInterface::Functions.fn##funcName = (FuncDef##funcName)GetProcAddress(g_hACPluginModule, #funcName); \
99 if (!AnticheatPlugInterface::Functions.fn##funcName) \
1010 { \
11- NetworkLog (ELogVerbosity::LOG_RELEASE, " Failed to find " #funcName " function" , MB_OK ); \
11+ NetworkLog (ELogVerbosity::LOG_RELEASE, " Failed to find " #funcName " function" ); \
1212 FreeLibrary (g_hACPluginModule); \
13+ g_hACPluginModule = nullptr ; \
1314 return ; \
1415 }
1516
1617bool AnticheatPlugInterface::IsExternalProcessRunning ()
1718{
18- if (IsPluginLoaded ())
19+ if (IsPluginLoaded () && Functions. fnIsExternalProcessRunning != nullptr )
1920 {
2021 return Functions.fnIsExternalProcessRunning ();
2122 }
@@ -25,7 +26,7 @@ bool AnticheatPlugInterface::IsExternalProcessRunning()
2526
2627int AnticheatPlugInterface::GetAnticheatIdentifier ()
2728{
28- if (IsPluginLoaded ())
29+ if (IsPluginLoaded () && Functions. fnGetAnticheatIdentifier != nullptr )
2930 {
3031 return Functions.fnGetAnticheatIdentifier ();
3132 }
@@ -35,6 +36,13 @@ int AnticheatPlugInterface::GetAnticheatIdentifier()
3536
3637void AnticheatPlugInterface::LoadPlugin (const char * szPluginName)
3738{
39+ if (szPluginName == nullptr )
40+ {
41+ NetworkLog (ELogVerbosity::LOG_RELEASE, " [AC] ERROR: Plugin name is null" );
42+ m_bPluginLoadFailed = true ;
43+ return ;
44+ }
45+
3846 NetworkLog (ELogVerbosity::LOG_RELEASE, " [AC] Attempting to load plugin from %s" , szPluginName);
3947
4048 m_bPluginLoadFailed = false ;
@@ -71,7 +79,10 @@ void AnticheatPlugInterface::LoadPlugin(const char* szPluginName)
7179 AC_PLUGIN_LOAD_FUNCTION (GetAnticheatIdentifier);
7280
7381#if _DEBUG
74- SetWindowText (ApplicationHWnd, Functions.fnIsExternalProcessRunning () ? " SECURED" : " INSECURE" );
82+ if (ApplicationHWnd != nullptr )
83+ {
84+ SetWindowText (ApplicationHWnd, Functions.fnIsExternalProcessRunning () ? " SECURED" : " INSECURE" );
85+ }
7586#endif
7687
7788 // integrity callback
@@ -111,7 +122,8 @@ void AnticheatPlugInterface::LoadPlugin(const char* szPluginName)
111122 }
112123
113124 // If it's us, leave, if its someone else, d/c them
114- if (pAuthInterface->GetUserID () == userID)
125+ uint32_t localUserID = pAuthInterface->GetUserID ();
126+ if (localUserID == userID)
115127 {
116128 NetworkLog (ELogVerbosity::LOG_RELEASE, " [AC] Leaving lobby, lobby isn't secure, action was requested against local user." );
117129 g_bPendingExitLobby = true ;
@@ -144,14 +156,45 @@ void AnticheatPlugInterface::LoadPlugin(const char* szPluginName)
144156 return ;
145157 }
146158
147- NetworkMesh* pMesh = NGMP_OnlineServicesManager::GetNetworkMesh ();
148- if (pMesh != nullptr )
159+ // prefer websocket if we have it, otherwise fall back to p2p mesh
160+ bool bFallbackToP2P = false ;
161+ std::shared_ptr<WebSocket> pWS = NGMP_OnlineServicesManager::GetWebSocket ();
162+ if (pWS != nullptr )
149163 {
150- pMesh->SendACPacket (goUserID, pData, dataLen);
164+ if (pWS->IsConnected ())
165+ {
166+ if (dataLen > 0 )
167+ {
168+ std::vector<uint8_t > vecPayload ((uint8_t *)pData, (uint8_t *)pData + dataLen);
169+ pWS->SendData_ACMessage (goUserID, vecPayload);
170+ }
171+ else
172+ {
173+ bFallbackToP2P = true ;
174+ }
175+ }
176+ else
177+ {
178+ bFallbackToP2P = true ;
179+ }
151180 }
152181 else
153182 {
154- NetworkLog (ELogVerbosity::LOG_RELEASE, " [AC] ERROR: Cannot send AC packet - NetworkMesh is null" );
183+ bFallbackToP2P = true ;
184+ }
185+
186+ if (bFallbackToP2P)
187+ {
188+ NetworkLog (ELogVerbosity::LOG_RELEASE, " [AC] AC Packets - WebSocket unavailable, falling back to P2P" );
189+ NetworkMesh* pMesh = NGMP_OnlineServicesManager::GetNetworkMesh ();
190+ if (pMesh != nullptr )
191+ {
192+ pMesh->SendACPacket (goUserID, pData, dataLen);
193+ }
194+ else
195+ {
196+ NetworkLog (ELogVerbosity::LOG_RELEASE, " [AC] ERROR: Cannot send AC packet - NetworkMesh is null" );
197+ }
155198 }
156199 });
157200
@@ -206,7 +249,8 @@ void AnticheatPlugInterface::Authenticate()
206249 return ;
207250 }
208251
209- Functions.fnLogin (pAuthInterface->GetAuthToken ().c_str (),
252+ std::string authToken = pAuthInterface->GetAuthToken ();
253+ Functions.fnLogin (authToken.c_str (),
210254 [](bool bSuccess)
211255 {
212256 if (!bSuccess)
@@ -226,12 +270,14 @@ void AnticheatPlugInterface::Authenticate()
226270
227271 // Now we can begin login
228272 NGMP_OnlineServices_AuthInterface* pAuthInterface = NGMP_OnlineServicesManager::GetInterface<NGMP_OnlineServices_AuthInterface>();
229- if (pAuthInterface = = nullptr )
273+ if (pAuthInterface ! = nullptr )
230274 {
231- return ;
275+ pAuthInterface->SendMiddlewareToken (std::string (buf));
276+ }
277+ else
278+ {
279+ NetworkLog (ELogVerbosity::LOG_RELEASE, " [AC] ERROR: Auth interface became null during login callback" );
232280 }
233-
234- pAuthInterface->SendMiddlewareToken (std::string (buf));
235281 }
236282 }
237283 else
@@ -289,7 +335,7 @@ bool AnticheatPlugInterface::RegisterPlayer(std::string mwUserID, uint32_t goUse
289335
290336 if (IsPluginLoaded () && Functions.fnRegisterPlayer != nullptr )
291337 {
292- NetworkLog (ELogVerbosity::LOG_RELEASE, " RegisterPlayer: %s to %" PRIu64 , mwUserID.c_str (), goUserID);
338+ NetworkLog (ELogVerbosity::LOG_RELEASE, " RegisterPlayer: %s to %" PRIu32 , mwUserID.c_str (), goUserID);
293339
294340 bool bReg = Functions.fnRegisterPlayer (mwUserID.c_str (), goUserID);
295341 NetworkLog (ELogVerbosity::LOG_RELEASE, " RegisterPlayerFunc result: %d" , bReg);
@@ -304,7 +350,7 @@ bool AnticheatPlugInterface::DeregisterPlayer(std::string mwUserID, uint32_t goU
304350{
305351 if (IsPluginLoaded () && Functions.fnDeregisterPlayer != nullptr )
306352 {
307- NetworkLog (ELogVerbosity::LOG_RELEASE, " DeregisterPlayer: %s to %" PRIu64 , mwUserID.c_str (), goUserID);
353+ NetworkLog (ELogVerbosity::LOG_RELEASE, " DeregisterPlayer: %s to %" PRIu32 , mwUserID.c_str (), goUserID);
308354
309355 bool bReg = Functions.fnDeregisterPlayer (mwUserID.c_str (), goUserID);
310356 NetworkLog (ELogVerbosity::LOG_RELEASE, " DeregisterPlayerFunc result: %d" , bReg);
@@ -346,12 +392,14 @@ void AnticheatPlugInterface::RefreshToken()
346392
347393 m_tokenCreationTime = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::utc_clock::now ().time_since_epoch ()).count ();
348394
349- Functions.fnRefreshToken (pAuthInterface->GetAuthToken ().c_str (),
395+ std::string authToken = pAuthInterface->GetAuthToken ();
396+ Functions.fnRefreshToken (authToken.c_str (),
350397 [](bool bSuccess)
351398 {
352399 NetworkLog (ELogVerbosity::LOG_RELEASE, " [AC] Refreshed token: %d" , bSuccess);
353400 if (!bSuccess)
354401 {
402+ NetworkLog (ELogVerbosity::LOG_RELEASE, " [AC] ERROR: Token refresh failed" );
355403 // TODO_AC: Handle this, its a fatal error
356404 return ;
357405 }
0 commit comments