Ticket #4036: 0001-Network-server-cleanup.patch

File 0001-Network-server-cleanup.patch, 6.0 KB (added by elexis, 7 years ago)

Removes the peculiarity of Broadcast.

  • source/network/NetServer.cpp

    From 6dba63b62270127cf8e3be2e3afa0fe2202b6e4f Mon Sep 17 00:00:00 2001
    From: elexis <elexis1@users.noreply.github.com>
    Date: Sat, 26 Nov 2016 02:09:32 +0100
    Subject: [PATCH 1/2] Network server cleanup.
    
    Require specifying the state of the target clients in Broadcast calls.
    Removes the peculiarity of skipping rejoining clients in that function,
    making it more versatile and less prone to errors.
    ---
     source/network/NetServer.cpp      | 29 +++++++++++++++--------------
     source/network/NetServer.h        |  5 ++---
     source/network/NetTurnManager.cpp |  4 ++--
     3 files changed, 19 insertions(+), 19 deletions(-)
    
    diff --git a/source/network/NetServer.cpp b/source/network/NetServer.cpp
    index 38680d8..e3fc12c 100644
    a b bool CNetServerWorker::SendMessage(ENetPeer* peer, const CNetMessage* message)  
    338338    return CNetHost::SendMessage(message, peer, DebugName(session).c_str());
    339339}
    340340
    341 bool CNetServerWorker::Broadcast(const CNetMessage* message)
     341bool CNetServerWorker::Broadcast(const CNetMessage* message, std::vector<NetServerSessionState> targetStates)
    342342{
    343343    ENSURE(m_Host);
    344344
    345345    bool ok = true;
    346346
    347     // Send to all sessions that are active and has finished authentication
    348347    // TODO: this does lots of repeated message serialisation if we have lots
    349348    // of remote peers; could do it more efficiently if that's a real problem
     349
    350350    for (CNetServerSession* session : m_Sessions)
    351         if (session->GetCurrState() == NSS_PREGAME || session->GetCurrState() == NSS_INGAME)
     351        if (std::find(targetStates.begin(), targetStates.end(), session->GetCurrState()) != targetStates.end())
    352352            if (!session->SendMessage(message))
    353353                ok = false;
    354354
    void CNetServerWorker::SendPlayerAssignments()  
    849849{
    850850    CPlayerAssignmentMessage message;
    851851    ConstructPlayerAssignmentMessage(message);
    852     Broadcast(&message);
     852    Broadcast(&message, { NSS_PREGAME, NSS_INGAME });
    853853}
    854854
    855855ScriptInterface& CNetServerWorker::GetScriptInterface()
    bool CNetServerWorker::OnInGame(void* context, CFsmEvent* event)  
    10501050        if (!cheatsEnabled && (it == server.m_PlayerAssignments.end() || it->second.m_PlayerID != simMessage->m_Player))
    10511051            return true;
    10521052
    1053         // Send it back to all clients immediately
    1054         server.Broadcast(simMessage);
     1053        // Send it back to all clients that have finished
     1054        // the loading screen (and the synchronization when rejoining)
     1055        server.Broadcast(simMessage, { NSS_INGAME });
    10551056
    10561057        // Save all the received commands
    10571058        if (server.m_SavedCommands.size() < simMessage->m_Turn + 1)
    bool CNetServerWorker::OnChat(void* context, CFsmEvent* event)  
    10861087
    10871088    message->m_GUID = session->GetGUID();
    10881089
    1089     server.Broadcast(message);
     1090    server.Broadcast(message, { NSS_PREGAME, NSS_INGAME} );
    10901091
    10911092    return true;
    10921093}
    bool CNetServerWorker::OnReady(void* context, CFsmEvent* event)  
    11021103
    11031104    message->m_GUID = session->GetGUID();
    11041105
    1105     server.Broadcast(message);
     1106    server.Broadcast(message, { NSS_PREGAME } );
    11061107    server.SetPlayerReady(message->m_GUID, message->m_Status);
    11071108
    11081109    return true;
    bool CNetServerWorker::OnRejoined(void* context, CFsmEvent* event)  
    12361237    CNetServerSession* session = (CNetServerSession*)context;
    12371238    CNetServerWorker& server = session->GetServer();
    12381239
     1240    // Inform everyone of the client having rejoined
    12391241    CRejoinedMessage* message = (CRejoinedMessage*)event->GetParamRef();
    1240 
    12411242    message->m_GUID = session->GetGUID();
    1242 
    1243     server.Broadcast(message);
     1243    server.Broadcast(message, { NSS_INGAME });
    12441244
    12451245    // Send all pausing players to the rejoined client.
    12461246    for (const CStr& guid : server.m_PausingPlayers)
    void CNetServerWorker::CheckGameLoadStatus(CNetServerSession* changedSession)  
    13261326        if (session != changedSession && session->GetCurrState() != NSS_INGAME)
    13271327            return;
    13281328
     1329    // Inform clients that everyone has loaded the map and that the game can start
    13291330    CLoadedGameMessage loaded;
    13301331    loaded.m_CurrentTurn = 0;
    1331     Broadcast(&loaded);
     1332    Broadcast(&loaded, { NSS_PREGAME });
    13321333
    13331334    m_State = SERVER_STATE_INGAME;
    13341335}
    void CNetServerWorker::StartGame()  
    13551356    SendPlayerAssignments();
    13561357
    13571358    CGameStartMessage gameStart;
    1358     Broadcast(&gameStart);
     1359    Broadcast(&gameStart, { NSS_PREGAME });
    13591360}
    13601361
    13611362void CNetServerWorker::UpdateGameAttributes(JS::MutableHandleValue attrs)
    void CNetServerWorker::UpdateGameAttributes(JS::MutableHandleValue attrs)  
    13671368
    13681369    CGameSetupMessage gameSetupMessage(GetScriptInterface());
    13691370    gameSetupMessage.m_Data = m_GameAttributes;
    1370     Broadcast(&gameSetupMessage);
     1371    Broadcast(&gameSetupMessage, { NSS_PREGAME });
    13711372}
    13721373
    13731374CStrW CNetServerWorker::SanitisePlayerName(const CStrW& original)
  • source/network/NetServer.h

    diff --git a/source/network/NetServer.h b/source/network/NetServer.h
    index 043b763..34f29a1 100644
    a b public:  
    168168    void KickPlayer(const CStrW& playerName, const bool ban);
    169169
    170170    /**
    171      * Send a message to all clients who have completed the full connection process
    172      * (i.e. are in the pre-game or in-game states).
     171     * Send a message to all clients who match one of the given states.
    173172     */
    174     bool Broadcast(const CNetMessage* message);
     173    bool Broadcast(const CNetMessage* message, std::vector<NetServerSessionState> targetStates);
    175174
    176175private:
    177176    friend class CNetServer;
  • source/network/NetTurnManager.cpp

    diff --git a/source/network/NetTurnManager.cpp b/source/network/NetTurnManager.cpp
    index 19bfb98..2dabb0f 100644
    a b void CNetServerTurnManager::CheckClientsReady()  
    617617    CEndCommandBatchMessage msg;
    618618    msg.m_TurnLength = m_TurnLength;
    619619    msg.m_Turn = m_ReadyTurn;
    620     m_NetServer.Broadcast(&msg);
     620    m_NetServer.Broadcast(&msg, { NSS_INGAME });
    621621
    622622    ENSURE(m_SavedTurnLengths.size() == m_ReadyTurn);
    623623    m_SavedTurnLengths.push_back(m_TurnLength);
    void CNetServerTurnManager::NotifyFinishedClientUpdate(int client, const CStrW&  
    676676                h.m_Name = playername;
    677677                msg.m_PlayerNames.push_back(h);
    678678            }
    679             m_NetServer.Broadcast(&msg);
     679            m_NetServer.Broadcast(&msg, { NSS_INGAME });
    680680            break;
    681681        }
    682682    }