Skip to content

Commit 7770e14

Browse files
committed
Fixed #8744 (Player socket / slot override bug)
1 parent 215d31b commit 7770e14

File tree

7 files changed

+52
-24
lines changed

7 files changed

+52
-24
lines changed

MTA10_Server/mods/deathmatch/logic/CPlayer.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,6 @@ CPlayer::CPlayer ( CPlayerManager* pPlayerManager, class CScriptDebugging* pScri
5252

5353
m_uiScriptDebugLevel = 0;
5454

55-
m_ullTimeConnected = GetTickCount64_ ();
56-
5755
m_tNickChange = 0;
5856

5957
m_pPlayerTextManager = new CPlayerTextManager ( this );
@@ -106,7 +104,8 @@ CPlayer::CPlayer ( CPlayerManager* pPlayerManager, class CScriptDebugging* pScri
106104
m_pPlayerStatsPacket = new CPlayerStatsPacket ( );
107105

108106
m_UpdateNearListTimer.SetMaxIncrement ( 500, true );
109-
m_LastReceivedSyncTimer.SetMaxIncrement( 2000, true );
107+
m_LastReceivedSyncTimer.SetUseModuleTickCount( true );
108+
m_ConnectedTimer.SetUseModuleTickCount( true );
110109
}
111110

112111

MTA10_Server/mods/deathmatch/logic/CPlayer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ class CPlayer : public CPed, public CClient
101101
inline void SetDoNotSendEntities ( bool bDont ) { m_bDoNotSendEntities = bDont; };
102102

103103
inline int GetClientType ( void ) { return CClient::CLIENT_PLAYER; };
104-
inline unsigned long long GetTimeConnected ( void ) const { return m_ullTimeConnected; };
104+
unsigned long long GetTimeSinceConnected ( void ) { return m_ConnectedTimer.Get(); }
105105

106106
inline const char* GetNick ( void ) { return m_strNick; };
107107
void SetNick ( const char* szNick );
@@ -380,7 +380,7 @@ class CPlayer : public CPed, public CClient
380380

381381
bool m_bAkimboArmUp;
382382

383-
unsigned long long m_ullTimeConnected;
383+
CElapsedTime m_ConnectedTimer;
384384

385385
NetServerPlayerID m_PlayerSocket;
386386
uint m_uiPing;

MTA10_Server/mods/deathmatch/logic/CPlayerManager.cpp

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ CPlayerManager::CPlayerManager ( void )
1818
{
1919
// Init
2020
m_pScriptDebugging = NULL;
21+
m_ZombieCheckTimer.SetUseModuleTickCount( true );
2122
}
2223

2324

@@ -29,21 +30,7 @@ CPlayerManager::~CPlayerManager ( void )
2930

3031
void CPlayerManager::DoPulse ( void )
3132
{
32-
// TODO: Low Priorityy: No need to do this every frame. Could be done every minute or so.
33-
// Remove any players that have been connected for very long (90 sec) but hasn't reached the verifying step
34-
unsigned long long ullTimeNow = GetTickCount64_ ();
35-
for ( list < CPlayer* > ::const_iterator iter = m_Players.begin () ; iter != m_Players.end (); iter++ )
36-
{
37-
if ( (*iter)->GetStatus () == STATUS_CONNECTED && ullTimeNow > (*iter)->GetTimeConnected () + 90000 )
38-
{
39-
// Tell the console he timed out due during connect
40-
CLogger::LogPrintf ( "INFO: %s (%s) timed out during connect\n", (*iter)->GetNick (), (*iter)->GetSourceIP () );
41-
42-
// Remove him
43-
delete *iter;
44-
break;
45-
}
46-
}
33+
PulseZombieCheck();
4734

4835
list < CPlayer* > ::const_iterator iter = m_Players.begin ();
4936
for ( ; iter != m_Players.end (); iter++ )
@@ -53,6 +40,43 @@ void CPlayerManager::DoPulse ( void )
5340
}
5441

5542

43+
void CPlayerManager::PulseZombieCheck( void )
44+
{
45+
// Only check once a second
46+
if ( m_ZombieCheckTimer.Get() < 1000 )
47+
return;
48+
m_ZombieCheckTimer.Reset();
49+
50+
for ( std::list < CPlayer* > ::const_iterator iter = m_Players.begin() ; iter != m_Players.end(); iter++ )
51+
{
52+
CPlayer* pPlayer = *iter;
53+
54+
if ( pPlayer->GetStatus() == STATUS_CONNECTED )
55+
{
56+
// Remove any players that have been connected for very long (90 sec) but haven't reached the verifying step
57+
if ( pPlayer->GetTimeSinceConnected() > 90000 )
58+
{
59+
CLogger::LogPrintf( "INFO: %s (%s) timed out during connect\n", pPlayer->GetNick(), pPlayer->GetSourceIP() );
60+
g_pGame->QuitPlayer( *pPlayer, CClient::QUIT_QUIT, false );
61+
}
62+
}
63+
else
64+
{
65+
// Remove any players that are joined, but not sending sync and have incorrect connection info
66+
if ( pPlayer->GetTimeSinceReceivedSync() > 20000 )
67+
{
68+
if ( !g_pRealNetServer->IsValidSocket( pPlayer->GetSocket() ) )
69+
{
70+
CLogger::LogPrintf( "INFO: %s (%s) connection gone away\n", pPlayer->GetNick(), pPlayer->GetSourceIP() );
71+
pPlayer->Send( CPlayerDisconnectedPacket( CPlayerDisconnectedPacket::KICK, "hacky code" ) );
72+
g_pGame->QuitPlayer( *pPlayer, CClient::QUIT_TIMEOUT );
73+
}
74+
}
75+
}
76+
}
77+
}
78+
79+
5680
CPlayer* CPlayerManager::Create ( const NetServerPlayerID& PlayerSocket )
5781
{
5882
// Check socket is free

MTA10_Server/mods/deathmatch/logic/CPlayerManager.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class CPlayerManager
3030
~CPlayerManager ( void );
3131

3232
void DoPulse ( void );
33+
void PulseZombieCheck ( void );
3334

3435
inline void SetScriptDebugging ( class CScriptDebugging* pScriptDebugging ) { m_pScriptDebugging = pScriptDebugging; };
3536

@@ -70,6 +71,7 @@ class CPlayerManager
7071
CMappedList < CPlayer* > m_Players;
7172
std::map < NetServerPlayerID, CPlayer* > m_SocketPlayerMap;
7273
SString m_strLowestConnectedPlayerVersion;
74+
CElapsedTime m_ZombieCheckTimer;
7375
};
7476

7577
#endif

MTA10_Server/mods/deathmatch/logic/net/CNetBuffer.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ namespace
2222
bool ms_bNetStatisticsLastSavedValid = false;
2323
NetStatistics ms_NetStatisticsLastSaved;
2424
NetServerPlayerID ms_NetStatisticsLastFor;
25+
bool ms_bNetStatisticsLastResult;
2526
bool ms_bBandwidthStatisticsLastSavedValid = false;
2627
SBandwidthStatistics ms_BandwidthStatisticsLastSaved;
2728
bool ms_bPingStatusLastSavedValid = false;
@@ -310,8 +311,9 @@ bool CNetServerBuffer::GetNetworkStatistics ( NetStatistics* pDest, const NetSer
310311
// Save results
311312
ms_NetStatisticsLastSaved = *pDest;
312313
ms_NetStatisticsLastFor = PlayerID;
314+
ms_bNetStatisticsLastResult = pArgs->result;
313315
ms_bNetStatisticsLastSavedValid = true;
314-
return pArgs->result;
316+
return ms_bNetStatisticsLastResult;
315317
}
316318

317319
// Start a new async read,
@@ -321,7 +323,7 @@ bool CNetServerBuffer::GetNetworkStatistics ( NetStatistics* pDest, const NetSer
321323

322324
// but use results from previous
323325
*pDest = ms_NetStatisticsLastSaved;
324-
return true;
326+
return ms_bNetStatisticsLastResult;
325327
}
326328

327329

MTA10_Server/sdk/net/CNetServer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,8 @@ class CNetServer
145145
virtual bool GetScriptInfo ( const char* cpInBuffer, uint uiInSize, SScriptInfo* pOutInfo ) { return false; }
146146
virtual bool DecryptScript ( const char* cpInBuffer, uint uiInSize, const char** pcpOutBuffer, uint* puiOutSize, const char* szScriptName ) { return false; }
147147
virtual bool GetPlayerPacketUsageStats ( uchar* packetIdList, uint uiNumPacketIds, SPlayerPacketUsage* pOutStats, uint uiTopCount ) { return false; }
148-
virtual const char* GetLogOutput ( void ) { return NULL; }
148+
virtual const char* GetLogOutput ( void ) { return NULL; }
149+
virtual bool IsValidSocket ( const NetServerPlayerID& playerID ) { assert( 0 ); return false; }
149150
};
150151

151152
#endif

MTA10_Server/version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@
7878

7979
#define _ASE_VERSION QUOTE_DEFINE(MTASA_VERSION_MAJOR) "." QUOTE_DEFINE(MTASA_VERSION_MINOR)
8080
#define _NETCODE_VERSION_BRANCH_ID 0x4 // Use 0x1 - 0xF to indicate an incompatible branch is being used (0x0 is reserved, 0x4 is trunk)
81-
#define _SERVER_NET_MODULE_VERSION 0x090 // (0x000 - 0xfff) Lvl9 wizards only
81+
#define _SERVER_NET_MODULE_VERSION 0x091 // (0x000 - 0xfff) Lvl9 wizards only
8282
#define _NETCODE_VERSION 0x1D8 // (0x000 - 0xfff) Increment when net messages change (pre-release)
8383
#define MTA_DM_BITSTREAM_VERSION 0x060 // (0x000 - 0xfff) Increment when net messages change (post-release). (Changing will also require additional backward compatibility code).
8484

0 commit comments

Comments
 (0)