forked from mirrors/0ad
Don't throw FSM update errors (type=16 state=6) when kicking clients while others haven't finished the authentication, loading screen or synchronization yet, refs #3241.
This was SVN commit r18859.
This commit is contained in:
@@ -105,6 +105,7 @@ CNetClient::CNetClient(CGame* game, bool isLocalClient) :
|
|||||||
AddTransition(NCS_JOIN_SYNCING, (uint)NMT_CHAT, NCS_JOIN_SYNCING, (void*)&OnChat, context);
|
AddTransition(NCS_JOIN_SYNCING, (uint)NMT_CHAT, NCS_JOIN_SYNCING, (void*)&OnChat, context);
|
||||||
AddTransition(NCS_JOIN_SYNCING, (uint)NMT_GAME_SETUP, NCS_JOIN_SYNCING, (void*)&OnGameSetup, context);
|
AddTransition(NCS_JOIN_SYNCING, (uint)NMT_GAME_SETUP, NCS_JOIN_SYNCING, (void*)&OnGameSetup, context);
|
||||||
AddTransition(NCS_JOIN_SYNCING, (uint)NMT_PLAYER_ASSIGNMENT, NCS_JOIN_SYNCING, (void*)&OnPlayerAssignment, context);
|
AddTransition(NCS_JOIN_SYNCING, (uint)NMT_PLAYER_ASSIGNMENT, NCS_JOIN_SYNCING, (void*)&OnPlayerAssignment, context);
|
||||||
|
AddTransition(NCS_JOIN_SYNCING, (uint)NMT_KICKED, NCS_JOIN_SYNCING, (void*)&OnKicked, context);
|
||||||
AddTransition(NCS_JOIN_SYNCING, (uint)NMT_CLIENT_TIMEOUT, NCS_JOIN_SYNCING, (void*)&OnClientTimeout, context);
|
AddTransition(NCS_JOIN_SYNCING, (uint)NMT_CLIENT_TIMEOUT, NCS_JOIN_SYNCING, (void*)&OnClientTimeout, context);
|
||||||
AddTransition(NCS_JOIN_SYNCING, (uint)NMT_CLIENT_PERFORMANCE, NCS_JOIN_SYNCING, (void*)&OnClientPerformance, context);
|
AddTransition(NCS_JOIN_SYNCING, (uint)NMT_CLIENT_PERFORMANCE, NCS_JOIN_SYNCING, (void*)&OnClientPerformance, context);
|
||||||
AddTransition(NCS_JOIN_SYNCING, (uint)NMT_GAME_START, NCS_JOIN_SYNCING, (void*)&OnGameStart, context);
|
AddTransition(NCS_JOIN_SYNCING, (uint)NMT_GAME_START, NCS_JOIN_SYNCING, (void*)&OnGameStart, context);
|
||||||
@@ -115,6 +116,7 @@ CNetClient::CNetClient(CGame* game, bool isLocalClient) :
|
|||||||
AddTransition(NCS_LOADING, (uint)NMT_CHAT, NCS_LOADING, (void*)&OnChat, context);
|
AddTransition(NCS_LOADING, (uint)NMT_CHAT, NCS_LOADING, (void*)&OnChat, context);
|
||||||
AddTransition(NCS_LOADING, (uint)NMT_GAME_SETUP, NCS_LOADING, (void*)&OnGameSetup, context);
|
AddTransition(NCS_LOADING, (uint)NMT_GAME_SETUP, NCS_LOADING, (void*)&OnGameSetup, context);
|
||||||
AddTransition(NCS_LOADING, (uint)NMT_PLAYER_ASSIGNMENT, NCS_LOADING, (void*)&OnPlayerAssignment, context);
|
AddTransition(NCS_LOADING, (uint)NMT_PLAYER_ASSIGNMENT, NCS_LOADING, (void*)&OnPlayerAssignment, context);
|
||||||
|
AddTransition(NCS_LOADING, (uint)NMT_KICKED, NCS_LOADING, (void*)&OnKicked, context);
|
||||||
AddTransition(NCS_LOADING, (uint)NMT_CLIENT_TIMEOUT, NCS_LOADING, (void*)&OnClientTimeout, context);
|
AddTransition(NCS_LOADING, (uint)NMT_CLIENT_TIMEOUT, NCS_LOADING, (void*)&OnClientTimeout, context);
|
||||||
AddTransition(NCS_LOADING, (uint)NMT_CLIENT_PERFORMANCE, NCS_LOADING, (void*)&OnClientPerformance, context);
|
AddTransition(NCS_LOADING, (uint)NMT_CLIENT_PERFORMANCE, NCS_LOADING, (void*)&OnClientPerformance, context);
|
||||||
AddTransition(NCS_LOADING, (uint)NMT_LOADED_GAME, NCS_INGAME, (void*)&OnLoadedGame, context);
|
AddTransition(NCS_LOADING, (uint)NMT_LOADED_GAME, NCS_INGAME, (void*)&OnLoadedGame, context);
|
||||||
|
|||||||
@@ -808,7 +808,9 @@ void CNetServerWorker::KickPlayer(const CStrW& playerName, const bool ban)
|
|||||||
CKickedMessage kickedMessage;
|
CKickedMessage kickedMessage;
|
||||||
kickedMessage.m_Name = playerName;
|
kickedMessage.m_Name = playerName;
|
||||||
kickedMessage.m_Ban = ban;
|
kickedMessage.m_Ban = ban;
|
||||||
Broadcast(&kickedMessage);
|
for (CNetServerSession* session : m_Sessions)
|
||||||
|
if (session->GetCurrState() > NSS_AUTHENTICATE)
|
||||||
|
session->SendMessage(&kickedMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CNetServerWorker::AssignPlayer(int playerID, const CStr& guid)
|
void CNetServerWorker::AssignPlayer(int playerID, const CStr& guid)
|
||||||
@@ -1321,10 +1323,8 @@ bool CNetServerWorker::OnClientPaused(void* context, CFsmEvent* event)
|
|||||||
void CNetServerWorker::CheckGameLoadStatus(CNetServerSession* changedSession)
|
void CNetServerWorker::CheckGameLoadStatus(CNetServerSession* changedSession)
|
||||||
{
|
{
|
||||||
for (const CNetServerSession* session : m_Sessions)
|
for (const CNetServerSession* session : m_Sessions)
|
||||||
{
|
|
||||||
if (session != changedSession && session->GetCurrState() != NSS_INGAME)
|
if (session != changedSession && session->GetCurrState() != NSS_INGAME)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
CLoadedGameMessage loaded;
|
CLoadedGameMessage loaded;
|
||||||
loaded.m_CurrentTurn = 0;
|
loaded.m_CurrentTurn = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user