Ticket #3907: rangebasedfornetwork_v1.patch

File rangebasedfornetwork_v1.patch, 9.4 KB (added by elexis, 8 years ago)
  • binaries/data/mods/public/gui/common/network.js

    function addNetworkWarning(msg)  
    170170 */
    171171function getNetworkWarnings()
    172172{
    173173    // Remove outdated messages
    174174    for (let guid in g_NetworkWarnings)
    175     {
    176         if (Date.now() > g_NetworkWarnings[guid].added + g_NetworkWarningTimeout)
     175        if (Date.now() > g_NetworkWarnings[guid].added + g_NetworkWarningTimeout ||
     176            guid != "server" && !g_PlayerAssignments[guid])
    177177            delete g_NetworkWarnings[guid];
    178178
    179         if (guid != "server" && !g_PlayerAssignments[guid])
    180             delete g_NetworkWarnings[guid];
    181     }
    182 
    183179    // Show local messages first
    184180    let guids = Object.keys(g_NetworkWarnings).sort(guid => guid != "server");
    185181
    186182    let font = Engine.GetGUIObjectByName("gameStateNotifications").font;
    187183
  • source/network/NetClient.cpp

    bool CNetClient::OnPlayerAssignment(void  
    564564
    565565    CPlayerAssignmentMessage* message = (CPlayerAssignmentMessage*)event->GetParamRef();
    566566
    567567    // Unpack the message
    568568    PlayerAssignmentMap newPlayerAssignments;
    569     for (size_t i = 0; i < message->m_Hosts.size(); ++i)
     569    for (CPlayerAssignmentMessage::S_m_Hosts& host : message->m_Hosts)
    570570    {
    571571        PlayerAssignment assignment;
    572572        assignment.m_Enabled = true;
    573         assignment.m_Name = message->m_Hosts[i].m_Name;
    574         assignment.m_PlayerID = message->m_Hosts[i].m_PlayerID;
    575         assignment.m_Status = message->m_Hosts[i].m_Status;
    576         newPlayerAssignments[message->m_Hosts[i].m_GUID] = assignment;
     573        assignment.m_Name = host.m_Name;
     574        assignment.m_PlayerID = host.m_PlayerID;
     575        assignment.m_Status = host.m_Status;
     576        newPlayerAssignments[host.m_GUID] = assignment;
    577577    }
    578578
    579579    client->m_PlayerAssignments.swap(newPlayerAssignments);
    580580
    581581    client->PostPlayerAssignmentsToScript();
    bool CNetClient::OnClientPerformance(voi  
    707707
    708708    if (client->GetCurrState() == NCS_LOADING)
    709709        return true;
    710710
    711711    CClientPerformanceMessage* message = (CClientPerformanceMessage*)event->GetParamRef();
    712     std::vector<CClientPerformanceMessage::S_m_Clients> &clients = message->m_Clients;
    713712
    714713    // Display warnings for other clients with bad ping
    715     for (size_t i = 0; i < clients.size(); ++i)
     714    for (CClientPerformanceMessage::S_m_Clients& other_client : message->m_Clients)
    716715    {
    717         if (clients[i].m_MeanRTT < DEFAULT_TURN_LENGTH_MP || clients[i].m_GUID == client->m_GUID)
     716        if (other_client.m_MeanRTT < DEFAULT_TURN_LENGTH_MP || other_client.m_GUID == client->m_GUID)
    718717            continue;
    719718
    720719        JS::RootedValue msg(cx);
    721720        client->GetScriptInterface().Eval("({ 'type':'netwarn', 'warntype': 'client-latency' })", &msg);
    722         client->GetScriptInterface().SetProperty(msg, "guid", clients[i].m_GUID);
    723         client->GetScriptInterface().SetProperty(msg, "meanRTT", clients[i].m_MeanRTT);
     721        client->GetScriptInterface().SetProperty(msg, "guid", other_client.m_GUID);
     722        client->GetScriptInterface().SetProperty(msg, "meanRTT", other_client.m_MeanRTT);
    724723        client->PushGuiMessage(msg);
    725724    }
    726725
    727726    return true;
    728727}
  • source/network/NetServer.cpp

    public:  
    8888        // We've received the game state from an existing player - now
    8989        // we need to send it onwards to the newly rejoining player
    9090
    9191        // Find the session corresponding to the rejoining host (if any)
    9292        CNetServerSession* session = NULL;
    93         for (size_t i = 0; i < m_Server.m_Sessions.size(); ++i)
     93        for (CNetServerSession* sess : m_Server.m_Sessions)
    9494        {
    95             if (m_Server.m_Sessions[i]->GetHostID() == m_RejoinerHostID)
     95            if (sess->GetHostID() == m_RejoinerHostID)
    9696            {
    97                 session = m_Server.m_Sessions[i];
     97                session = sess;
    9898                break;
    9999            }
    100100        }
    101101
    102102        if (!session)
    CNetServerWorker::~CNetServerWorker()  
    155155
    156156    // Clean up resources
    157157
    158158    delete m_Stats;
    159159
    160     for (size_t i = 0; i < m_Sessions.size(); ++i)
     160    for (CNetServerSession* session : m_Sessions)
    161161    {
    162         m_Sessions[i]->DisconnectNow(NDR_SERVER_SHUTDOWN);
    163         delete m_Sessions[i];
     162        session->DisconnectNow(NDR_SERVER_SHUTDOWN);
     163        SAFE_DELETE(session);
    164164    }
    165165
    166166    if (m_Host)
    167167    {
    168168        enet_host_destroy(m_Host);
    bool CNetServerWorker::Broadcast(const C  
    344344    ENSURE(m_Host);
    345345
    346346    bool ok = true;
    347347
    348348    // Send to all sessions that are active and has finished authentication
    349     for (size_t i = 0; i < m_Sessions.size(); ++i)
     349    for (CNetServerSession* session : m_Sessions)
    350350    {
    351         if (m_Sessions[i]->GetCurrState() == NSS_PREGAME || m_Sessions[i]->GetCurrState() == NSS_INGAME)
     351        if (session->GetCurrState() == NSS_PREGAME || session->GetCurrState() == NSS_INGAME)
    352352        {
    353             if (!m_Sessions[i]->SendMessage(message))
     353            if (!session->SendMessage(message))
    354354                ok = false;
    355355
    356356            // TODO: this does lots of repeated message serialisation if we have lots
    357357            // of remote peers; could do it more efficiently if that's a real problem
    358358        }
    bool CNetServerWorker::RunStep()  
    430430        newAssignPlayer.swap(m_AssignPlayerQueue);
    431431        newGameAttributes.swap(m_GameAttributesQueue);
    432432        newTurnLength.swap(m_TurnLengthQueue);
    433433    }
    434434
    435     for (size_t i = 0; i < newAssignPlayer.size(); ++i)
    436         AssignPlayer(newAssignPlayer[i].first, newAssignPlayer[i].second);
     435    for (std::pair<int, CStr> player : newAssignPlayer)
     436        AssignPlayer(player.first, player.second);
    437437
    438     for (size_t i = 0; i < newPlayerReady.size(); ++i)
    439         SetPlayerReady(newPlayerReady[i].first, newPlayerReady[i].second);
     438    for (std::pair<CStr, int> player : newPlayerReady)
     439        SetPlayerReady(player.first, player.second);
    440440
    441441    if (!newPlayerResetReady.empty())
    442442        ClearAllPlayerReady();
    443443
    444444    if (!newGameAttributes.empty())
    bool CNetServerWorker::RunStep()  
    454454    // Do StartGame last, so we have the most up-to-date game attributes when we start
    455455    if (!newStartGame.empty())
    456456        StartGame();
    457457
    458458    // Perform file transfers
    459     for (size_t i = 0; i < m_Sessions.size(); ++i)
    460         m_Sessions[i]->GetFileTransferer().Poll();
     459    for (CNetServerSession* session : m_Sessions)
     460        session->GetFileTransferer().Poll();
    461461
    462462    CheckClientConnections();
    463463
    464464    // Process network events:
    465465
    void CNetServerWorker::CheckClientConnec  
    575575    if (now <= m_LastConnectionCheck)
    576576        return;
    577577
    578578    m_LastConnectionCheck = now;
    579579
    580     for (size_t i = 0; i < m_Sessions.size(); ++i)
     580    for (CNetServerSession* session : m_Sessions)
    581581    {
    582         u32 lastReceived = m_Sessions[i]->GetLastReceivedTime();
    583         u32 meanRTT = m_Sessions[i]->GetMeanRTT();
     582        u32 lastReceived = session->GetLastReceivedTime();
     583        u32 meanRTT = session->GetMeanRTT();
    584584
    585585        CNetMessage* message = nullptr;
    586586
    587587        // Report if we didn't hear from the client since few seconds
    588588        if (lastReceived > NETWORK_WARNING_TIMEOUT)
    589589        {
    590590            CClientTimeoutMessage* msg = new CClientTimeoutMessage();
    591             msg->m_GUID = m_Sessions[i]->GetGUID();
     591            msg->m_GUID = session->GetGUID();
    592592            msg->m_LastReceivedTime = lastReceived;
    593593            message = msg;
    594594        }
    595595        // Report if the client has bad ping
    596596        else if (meanRTT > DEFAULT_TURN_LENGTH_MP)
    597597        {
    598598            CClientPerformanceMessage* msg = new CClientPerformanceMessage();
    599599            CClientPerformanceMessage::S_m_Clients client;
    600             client.m_GUID = m_Sessions[i]->GetGUID();
     600            client.m_GUID = session->GetGUID();
    601601            client.m_MeanRTT = meanRTT;
    602602            msg->m_Clients.push_back(client);
    603603            message = msg;
    604604        }
    605605
    606606        // Send to all clients except the affected one
    607607        // (since that will show the locally triggered warning instead)
    608608        if (message)
    609             for (size_t j = 0; j < m_Sessions.size(); ++j)
    610                 if (i != j)
    611                     m_Sessions[j]->SendMessage(message);
     609            for (CNetServerSession* session2 : m_Sessions)
     610                if (session != session2)
     611                    session2->SendMessage(message);
    612612
    613613        SAFE_DELETE(message);
    614614    }
    615615}
    616616
    bool CNetServerWorker::OnDisconnect(void  
    12061206    return true;
    12071207}
    12081208
    12091209void CNetServerWorker::CheckGameLoadStatus(CNetServerSession* changedSession)
    12101210{
    1211     for (size_t i = 0; i < m_Sessions.size(); ++i)
    1212     {
    1213         if (m_Sessions[i] != changedSession && m_Sessions[i]->GetCurrState() != NSS_INGAME)
     1211    for (CNetServerSession* session : m_Sessions)
     1212        if (session != changedSession && session->GetCurrState() != NSS_INGAME)
    12141213            return;
    1215     }
    12161214
    12171215    CLoadedGameMessage loaded;
    12181216    loaded.m_CurrentTurn = 0;
    12191217    Broadcast(&loaded);
    12201218
    void CNetServerWorker::CheckGameLoadStat  
    12231221
    12241222void CNetServerWorker::StartGame()
    12251223{
    12261224    m_ServerTurnManager = new CNetServerTurnManager(*this);
    12271225
    1228     for (size_t i = 0; i < m_Sessions.size(); ++i)
    1229         m_ServerTurnManager->InitialiseClient(m_Sessions[i]->GetHostID(), 0); // TODO: only for non-observers
     1226    for (CNetServerSession* session : m_Sessions)
     1227        m_ServerTurnManager->InitialiseClient(session->GetHostID(), 0); // TODO: only for non-observers
    12301228
    12311229    m_State = SERVER_STATE_LOADING;
    12321230
    12331231    // Send the final setup state to all clients
    12341232    UpdateGameAttributes(&m_GameAttributes.get());
    CStrW CNetServerWorker::DeduplicatePlaye  
    12871285    // Try names "Foo", "Foo (2)", "Foo (3)", etc
    12881286    size_t id = 2;
    12891287    while (true)
    12901288    {
    12911289        bool unique = true;
    1292         for (size_t i = 0; i < m_Sessions.size(); ++i)
     1290        for (CNetServerSession* session : m_Sessions)
    12931291        {
    1294             if (m_Sessions[i]->GetUserName() == name)
     1292            if (session->GetUserName() == name)
    12951293            {
    12961294                unique = false;
    12971295                break;
    12981296            }
    12991297        }