Ticket #3907: rangebasedfornetwork_v1.patch
File rangebasedfornetwork_v1.patch, 9.4 KB (added by , 8 years ago) |
---|
-
binaries/data/mods/public/gui/common/network.js
function addNetworkWarning(msg) 170 170 */ 171 171 function getNetworkWarnings() 172 172 { 173 173 // Remove outdated messages 174 174 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]) 177 177 delete g_NetworkWarnings[guid]; 178 178 179 if (guid != "server" && !g_PlayerAssignments[guid])180 delete g_NetworkWarnings[guid];181 }182 183 179 // Show local messages first 184 180 let guids = Object.keys(g_NetworkWarnings).sort(guid => guid != "server"); 185 181 186 182 let font = Engine.GetGUIObjectByName("gameStateNotifications").font; 187 183 -
source/network/NetClient.cpp
bool CNetClient::OnPlayerAssignment(void 564 564 565 565 CPlayerAssignmentMessage* message = (CPlayerAssignmentMessage*)event->GetParamRef(); 566 566 567 567 // Unpack the message 568 568 PlayerAssignmentMap newPlayerAssignments; 569 for ( size_t i = 0; i < message->m_Hosts.size(); ++i)569 for (CPlayerAssignmentMessage::S_m_Hosts& host : message->m_Hosts) 570 570 { 571 571 PlayerAssignment assignment; 572 572 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; 577 577 } 578 578 579 579 client->m_PlayerAssignments.swap(newPlayerAssignments); 580 580 581 581 client->PostPlayerAssignmentsToScript(); … … bool CNetClient::OnClientPerformance(voi 707 707 708 708 if (client->GetCurrState() == NCS_LOADING) 709 709 return true; 710 710 711 711 CClientPerformanceMessage* message = (CClientPerformanceMessage*)event->GetParamRef(); 712 std::vector<CClientPerformanceMessage::S_m_Clients> &clients = message->m_Clients;713 712 714 713 // 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) 716 715 { 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) 718 717 continue; 719 718 720 719 JS::RootedValue msg(cx); 721 720 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); 724 723 client->PushGuiMessage(msg); 725 724 } 726 725 727 726 return true; 728 727 } -
source/network/NetServer.cpp
public: 88 88 // We've received the game state from an existing player - now 89 89 // we need to send it onwards to the newly rejoining player 90 90 91 91 // Find the session corresponding to the rejoining host (if any) 92 92 CNetServerSession* session = NULL; 93 for ( size_t i = 0; i < m_Server.m_Sessions.size(); ++i)93 for (CNetServerSession* sess : m_Server.m_Sessions) 94 94 { 95 if ( m_Server.m_Sessions[i]->GetHostID() == m_RejoinerHostID)95 if (sess->GetHostID() == m_RejoinerHostID) 96 96 { 97 session = m_Server.m_Sessions[i];97 session = sess; 98 98 break; 99 99 } 100 100 } 101 101 102 102 if (!session) … … CNetServerWorker::~CNetServerWorker() 155 155 156 156 // Clean up resources 157 157 158 158 delete m_Stats; 159 159 160 for ( size_t i = 0; i < m_Sessions.size(); ++i)160 for (CNetServerSession* session : m_Sessions) 161 161 { 162 m_Sessions[i]->DisconnectNow(NDR_SERVER_SHUTDOWN);163 delete m_Sessions[i];162 session->DisconnectNow(NDR_SERVER_SHUTDOWN); 163 SAFE_DELETE(session); 164 164 } 165 165 166 166 if (m_Host) 167 167 { 168 168 enet_host_destroy(m_Host); … … bool CNetServerWorker::Broadcast(const C 344 344 ENSURE(m_Host); 345 345 346 346 bool ok = true; 347 347 348 348 // 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) 350 350 { 351 if ( m_Sessions[i]->GetCurrState() == NSS_PREGAME || m_Sessions[i]->GetCurrState() == NSS_INGAME)351 if (session->GetCurrState() == NSS_PREGAME || session->GetCurrState() == NSS_INGAME) 352 352 { 353 if (! m_Sessions[i]->SendMessage(message))353 if (!session->SendMessage(message)) 354 354 ok = false; 355 355 356 356 // TODO: this does lots of repeated message serialisation if we have lots 357 357 // of remote peers; could do it more efficiently if that's a real problem 358 358 } … … bool CNetServerWorker::RunStep() 430 430 newAssignPlayer.swap(m_AssignPlayerQueue); 431 431 newGameAttributes.swap(m_GameAttributesQueue); 432 432 newTurnLength.swap(m_TurnLengthQueue); 433 433 } 434 434 435 for (s ize_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); 437 437 438 for (s ize_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); 440 440 441 441 if (!newPlayerResetReady.empty()) 442 442 ClearAllPlayerReady(); 443 443 444 444 if (!newGameAttributes.empty()) … … bool CNetServerWorker::RunStep() 454 454 // Do StartGame last, so we have the most up-to-date game attributes when we start 455 455 if (!newStartGame.empty()) 456 456 StartGame(); 457 457 458 458 // 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(); 461 461 462 462 CheckClientConnections(); 463 463 464 464 // Process network events: 465 465 … … void CNetServerWorker::CheckClientConnec 575 575 if (now <= m_LastConnectionCheck) 576 576 return; 577 577 578 578 m_LastConnectionCheck = now; 579 579 580 for ( size_t i = 0; i < m_Sessions.size(); ++i)580 for (CNetServerSession* session : m_Sessions) 581 581 { 582 u32 lastReceived = m_Sessions[i]->GetLastReceivedTime();583 u32 meanRTT = m_Sessions[i]->GetMeanRTT();582 u32 lastReceived = session->GetLastReceivedTime(); 583 u32 meanRTT = session->GetMeanRTT(); 584 584 585 585 CNetMessage* message = nullptr; 586 586 587 587 // Report if we didn't hear from the client since few seconds 588 588 if (lastReceived > NETWORK_WARNING_TIMEOUT) 589 589 { 590 590 CClientTimeoutMessage* msg = new CClientTimeoutMessage(); 591 msg->m_GUID = m_Sessions[i]->GetGUID();591 msg->m_GUID = session->GetGUID(); 592 592 msg->m_LastReceivedTime = lastReceived; 593 593 message = msg; 594 594 } 595 595 // Report if the client has bad ping 596 596 else if (meanRTT > DEFAULT_TURN_LENGTH_MP) 597 597 { 598 598 CClientPerformanceMessage* msg = new CClientPerformanceMessage(); 599 599 CClientPerformanceMessage::S_m_Clients client; 600 client.m_GUID = m_Sessions[i]->GetGUID();600 client.m_GUID = session->GetGUID(); 601 601 client.m_MeanRTT = meanRTT; 602 602 msg->m_Clients.push_back(client); 603 603 message = msg; 604 604 } 605 605 606 606 // Send to all clients except the affected one 607 607 // (since that will show the locally triggered warning instead) 608 608 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); 612 612 613 613 SAFE_DELETE(message); 614 614 } 615 615 } 616 616 … … bool CNetServerWorker::OnDisconnect(void 1206 1206 return true; 1207 1207 } 1208 1208 1209 1209 void CNetServerWorker::CheckGameLoadStatus(CNetServerSession* changedSession) 1210 1210 { 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) 1214 1213 return; 1215 }1216 1214 1217 1215 CLoadedGameMessage loaded; 1218 1216 loaded.m_CurrentTurn = 0; 1219 1217 Broadcast(&loaded); 1220 1218 … … void CNetServerWorker::CheckGameLoadStat 1223 1221 1224 1222 void CNetServerWorker::StartGame() 1225 1223 { 1226 1224 m_ServerTurnManager = new CNetServerTurnManager(*this); 1227 1225 1228 for ( size_t i = 0; i < m_Sessions.size(); ++i)1229 m_ServerTurnManager->InitialiseClient( m_Sessions[i]->GetHostID(), 0); // TODO: only for non-observers1226 for (CNetServerSession* session : m_Sessions) 1227 m_ServerTurnManager->InitialiseClient(session->GetHostID(), 0); // TODO: only for non-observers 1230 1228 1231 1229 m_State = SERVER_STATE_LOADING; 1232 1230 1233 1231 // Send the final setup state to all clients 1234 1232 UpdateGameAttributes(&m_GameAttributes.get()); … … CStrW CNetServerWorker::DeduplicatePlaye 1287 1285 // Try names "Foo", "Foo (2)", "Foo (3)", etc 1288 1286 size_t id = 2; 1289 1287 while (true) 1290 1288 { 1291 1289 bool unique = true; 1292 for ( size_t i = 0; i < m_Sessions.size(); ++i)1290 for (CNetServerSession* session : m_Sessions) 1293 1291 { 1294 if ( m_Sessions[i]->GetUserName() == name)1292 if (session->GetUserName() == name) 1295 1293 { 1296 1294 unique = false; 1297 1295 break; 1298 1296 } 1299 1297 }