Ticket #3806: 3556_dedServer_v1.5.2.patch
File 3556_dedServer_v1.5.2.patch, 22.7 KB (added by , 8 years ago) |
---|
-
binaries/data/mods/public/gui/common/network.js
function reportDisconnect(reason, wasCon 87 87 ); 88 88 } 89 89 90 90 function kickPlayer(username, ban) 91 91 { 92 if (!Engine.KickPlayer(username, ban)) 92 if (g_IsController) 93 Engine.KickPlayer(username, ban); 94 else 93 95 addChatMessage({ 94 96 "type": "system", 95 97 "text": sprintf(ban ? translate("Could not ban %(name)s.") : translate("Could not kick %(name)s."), { 96 98 "name": username 97 99 }) -
binaries/data/mods/public/gui/gamesetup/gamesetup.js
function handleReadyMessage(message) 654 654 655 655 if (!g_IsController) 656 656 return; 657 657 658 658 g_PlayerAssignments[message.guid].status = +message.status == 1; 659 Engine.SetNetworkPlayerStatus(message.guid, +message.status);660 659 updateReadyUI(); 661 660 } 662 661 663 662 /** 664 663 * Called after every player is ready and the host decided to finally start the game. -
source/gui/scripting/ScriptFunctions.cpp
JS::Value GetEngineInfo(ScriptInterface: 244 244 return SavedGames::GetEngineInfo(*(pCxPrivate->pScriptInterface)); 245 245 } 246 246 247 247 void StartNetworkGame(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) 248 248 { 249 ENSURE(g_Net Server);250 g_Net Server->StartGame();249 ENSURE(g_NetClient); 250 g_NetClient->SendStartGameMessage(); 251 251 } 252 252 253 253 void StartGame(ScriptInterface::CxPrivate* pCxPrivate, JS::HandleValue attribs, int playerID) 254 254 { 255 255 ENSURE(!g_NetServer); … … void SaveGamePrefix(ScriptInterface::CxP 328 328 LOGERROR("Failed to save game"); 329 329 } 330 330 331 331 void SetNetworkGameAttributes(ScriptInterface::CxPrivate* pCxPrivate, JS::HandleValue attribs1) 332 332 { 333 ENSURE(g_NetServer); 333 ENSURE(g_NetClient); 334 334 335 //TODO: This is a workaround because we need to pass a MutableHandle to a JSAPI functions somewhere 335 336 // (with no obvious reason). 336 337 JSContext* cx = pCxPrivate->pScriptInterface->GetContext(); 337 338 JSAutoRequest rq(cx); 338 339 JS::RootedValue attribs(cx, attribs1); 339 340 340 g_Net Server->UpdateGameAttributes(&attribs, *(pCxPrivate->pScriptInterface));341 g_NetClient->SendGameSetupMessage(&attribs, *(pCxPrivate->pScriptInterface)); 341 342 } 342 343 343 344 void StartNetworkHost(ScriptInterface::CxPrivate* pCxPrivate, const std::wstring& playerName) 344 345 { 345 346 ENSURE(!g_NetClient); … … std::string GetPlayerGUID(ScriptInterfac 398 399 return std::string(); 399 400 400 401 return g_NetClient->GetGUID(); 401 402 } 402 403 403 boolKickPlayer(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const CStrW& playerName, bool ban)404 void KickPlayer(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const CStrW& playerName, bool ban) 404 405 { 405 if (!g_NetServer) 406 return false; 406 ENSURE(g_NetClient); 407 407 408 return g_NetServer->KickPlayer(playerName, ban);408 g_NetClient->SendKickPlayerMessage(playerName, ban); 409 409 } 410 410 411 411 JS::Value PollNetworkClient(ScriptInterface::CxPrivate* pCxPrivate) 412 412 { 413 413 if (!g_NetClient) … … JS::Value PollNetworkClient(ScriptInterf 421 421 return pCxPrivate->pScriptInterface->CloneValueFromOtherContext(g_NetClient->GetScriptInterface(), pollNet); 422 422 } 423 423 424 424 void AssignNetworkPlayer(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), int playerID, const std::string& guid) 425 425 { 426 ENSURE(g_NetServer); 427 428 g_NetServer->AssignPlayer(playerID, guid); 429 } 430 431 void SetNetworkPlayerStatus(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const std::string& guid, int ready) 432 { 433 ENSURE(g_NetServer); 426 ENSURE(g_NetClient); 434 427 435 g_Net Server->SetPlayerReady(guid, ready);428 g_NetClient->SendAssignPlayerMessage(playerID, guid); 436 429 } 437 430 438 431 void ClearAllPlayerReady (ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) 439 432 { 440 ENSURE(g_Net Server);433 ENSURE(g_NetClient); 441 434 442 g_Net Server->ClearAllPlayerReady();435 g_NetClient->SendClearAllReadyMessage(); 443 436 } 444 437 445 438 void SendNetworkChat(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const std::wstring& message) 446 439 { 447 440 ENSURE(g_NetClient); … … void GuiScriptingInit(ScriptInterface& s 1036 1029 scriptInterface.RegisterFunction<void, &Script_EndGame>("EndGame"); 1037 1030 scriptInterface.RegisterFunction<void, std::wstring, &StartNetworkHost>("StartNetworkHost"); 1038 1031 scriptInterface.RegisterFunction<void, std::wstring, std::string, &StartNetworkJoin>("StartNetworkJoin"); 1039 1032 scriptInterface.RegisterFunction<void, &DisconnectNetworkGame>("DisconnectNetworkGame"); 1040 1033 scriptInterface.RegisterFunction<std::string, &GetPlayerGUID>("GetPlayerGUID"); 1041 scriptInterface.RegisterFunction< bool, CStrW, bool, &KickPlayer>("KickPlayer");1034 scriptInterface.RegisterFunction<void, CStrW, bool, &KickPlayer>("KickPlayer"); 1042 1035 scriptInterface.RegisterFunction<JS::Value, &PollNetworkClient>("PollNetworkClient"); 1043 1036 scriptInterface.RegisterFunction<void, JS::HandleValue, &SetNetworkGameAttributes>("SetNetworkGameAttributes"); 1044 1037 scriptInterface.RegisterFunction<void, int, std::string, &AssignNetworkPlayer>("AssignNetworkPlayer"); 1045 scriptInterface.RegisterFunction<void, std::string, int, &SetNetworkPlayerStatus>("SetNetworkPlayerStatus");1046 1038 scriptInterface.RegisterFunction<void, &ClearAllPlayerReady>("ClearAllPlayerReady"); 1047 1039 scriptInterface.RegisterFunction<void, std::wstring, &SendNetworkChat>("SendNetworkChat"); 1048 1040 scriptInterface.RegisterFunction<void, int, &SendNetworkReady>("SendNetworkReady"); 1049 1041 scriptInterface.RegisterFunction<JS::Value, &GetAIs>("GetAIs"); 1050 1042 scriptInterface.RegisterFunction<JS::Value, &GetEngineInfo>("GetEngineInfo"); -
source/network/NetClient.cpp
void CNetClient::HandleDisconnect(u32 re 321 321 // Update the state immediately to UNCONNECTED (don't bother with FSM transitions since 322 322 // we'd need one for every single state, and we don't need to use per-state actions) 323 323 SetCurrState(NCS_UNCONNECTED); 324 324 } 325 325 326 void CNetClient::SendGameSetupMessage(JS::MutableHandleValue attrs, ScriptInterface& scriptInterface) 327 { 328 CGameSetupMessage gameSetup(scriptInterface); 329 gameSetup.m_Data = attrs; 330 SendMessage(&gameSetup); 331 } 332 333 void CNetClient::SendAssignPlayerMessage(const int playerID, const CStr& guid) 334 { 335 CAssignPlayerMessage assignPlayer; 336 assignPlayer.m_PlayerID = playerID; 337 assignPlayer.m_GUID = guid; 338 SendMessage(&assignPlayer); 339 } 340 326 341 void CNetClient::SendChatMessage(const std::wstring& text) 327 342 { 328 343 CChatMessage chat; 329 344 chat.m_Message = text; 330 345 SendMessage(&chat); … … void CNetClient::SendReadyMessage(const 335 350 CReadyMessage readyStatus; 336 351 readyStatus.m_Status = status; 337 352 SendMessage(&readyStatus); 338 353 } 339 354 355 void CNetClient::SendClearAllReadyMessage() 356 { 357 CClearAllReadyMessage clearAllReady; 358 SendMessage(&clearAllReady); 359 } 360 361 void CNetClient::SendStartGameMessage() 362 { 363 CGameStartMessage gameStart; 364 SendMessage(&gameStart); 365 } 366 340 367 void CNetClient::SendRejoinedMessage() 341 368 { 342 369 CRejoinedMessage rejoinedMessage; 343 370 SendMessage(&rejoinedMessage); 344 371 } 345 372 373 void CNetClient::SendKickPlayerMessage(const CStrW& playerName, bool ban) 374 { 375 CKickedMessage kickPlayer; 376 kickPlayer.m_Name = playerName; 377 kickPlayer.m_Ban = ban; 378 SendMessage(&kickPlayer); 379 } 380 346 381 void CNetClient::SendPausedMessage(bool pause) 347 382 { 348 383 CClientPausedMessage pausedMessage; 349 384 pausedMessage.m_Pause = pause; 350 385 SendMessage(&pausedMessage); -
source/network/NetClient.h
public: 185 185 * Call when the game has started and all data files have been loaded, 186 186 * to signal to the server that we are ready to begin the game. 187 187 */ 188 188 void LoadFinished(); 189 189 190 void SendGameSetupMessage(JS::MutableHandleValue attrs, ScriptInterface& scriptInterface); 191 192 void SendAssignPlayerMessage(const int playerID, const CStr& guid); 193 190 194 void SendChatMessage(const std::wstring& text); 191 195 192 196 void SendReadyMessage(const int status); 193 197 198 void SendClearAllReadyMessage(); 199 200 void SendStartGameMessage(); 201 194 202 /** 195 203 * Call when the client has rejoined a running match and finished 196 204 * the loading screen. 197 205 */ 198 206 void SendRejoinedMessage(); 199 207 200 208 /** 209 * Call to kick/ban a client 210 */ 211 void SendKickPlayerMessage(const CStrW& playerName, bool ban); 212 213 /** 201 214 * Call when the client has paused or unpaused the game. 202 215 */ 203 216 void SendPausedMessage(bool pause); 204 217 205 218 private: -
source/network/NetMessage.cpp
CNetMessage* CNetMessageFactory::CreateM 201 201 202 202 case NMT_SIMULATION_COMMAND: 203 203 pNewMessage = new CSimulationMessage(scriptInterface); 204 204 break; 205 205 206 case NMT_CLEAR_ALL_READY: 207 pNewMessage = new CClearAllReadyMessage; 208 break; 209 210 case NMT_ASSIGN_PLAYER: 211 pNewMessage = new CAssignPlayerMessage; 212 break; 213 206 214 default: 207 215 LOGERROR("CNetMessageFactory::CreateMessage(): Unknown message type '%d' received", header.GetType()); 208 216 break; 209 217 } 210 218 -
source/network/NetMessages.h
26 26 #include "ps/CStr.h" 27 27 #include "scriptinterface/ScriptVal.h" 28 28 29 29 #define PS_PROTOCOL_MAGIC 0x5073013f // 'P', 's', 0x01, '?' 30 30 #define PS_PROTOCOL_MAGIC_RESPONSE 0x50630121 // 'P', 'c', 0x01, '!' 31 #define PS_PROTOCOL_VERSION 0x0101001 3// Arbitrary protocol31 #define PS_PROTOCOL_VERSION 0x01010014 // Arbitrary protocol 32 32 #define PS_DEFAULT_PORT 0x5073 // 'P', 's' 33 33 34 34 // Defines the list of message types. The order of the list must not change. 35 35 // The message types having a negative value are used internally and not sent 36 36 // over the network. The message types used for network communication have … … enum NetMessageType 48 48 NMT_AUTHENTICATE, 49 49 NMT_AUTHENTICATE_RESULT, 50 50 51 51 NMT_CHAT, 52 52 NMT_READY, 53 NMT_CLEAR_ALL_READY, 53 54 NMT_GAME_SETUP, 55 NMT_ASSIGN_PLAYER, 54 56 NMT_PLAYER_ASSIGNMENT, 55 57 56 58 NMT_FILE_TRANSFER_REQUEST, 57 59 NMT_FILE_TRANSFER_RESPONSE, 58 60 NMT_FILE_TRANSFER_DATA, … … END_NMT_CLASS() 134 136 START_NMT_CLASS_(Ready, NMT_READY) 135 137 NMT_FIELD(CStr, m_GUID) 136 138 NMT_FIELD_INT(m_Status, u8, 1) 137 139 END_NMT_CLASS() 138 140 141 START_NMT_CLASS_(ClearAllReady, NMT_CLEAR_ALL_READY) 142 END_NMT_CLASS() 143 139 144 START_NMT_CLASS_(PlayerAssignment, NMT_PLAYER_ASSIGNMENT) 140 145 NMT_START_ARRAY(m_Hosts) 141 146 NMT_FIELD(CStr, m_GUID) 142 147 NMT_FIELD(CStrW, m_Name) 143 148 NMT_FIELD_INT(m_PlayerID, i8, 1) … … START_NMT_CLASS_(SyncError, NMT_SYNC_ERR 216 221 NMT_START_ARRAY(m_PlayerNames) 217 222 NMT_FIELD(CStrW, m_Name) 218 223 NMT_END_ARRAY() 219 224 END_NMT_CLASS() 220 225 226 START_NMT_CLASS_(AssignPlayer, NMT_ASSIGN_PLAYER) 227 NMT_FIELD_INT(m_PlayerID, i8, 1) 228 NMT_FIELD(CStr, m_GUID) 229 END_NMT_CLASS() 230 221 231 END_NMTS() 222 232 223 233 #else 224 234 #ifndef ALLNETMSGS_DONT_CREATE_NMTS 225 235 -
source/network/NetServer.cpp
bool CNetServerWorker::RunStep() 402 402 m_ScriptInterface->GetRuntime()->MaybeIncrementalGC(0.5f); 403 403 404 404 JSContext* cx = m_ScriptInterface->GetContext(); 405 405 JSAutoRequest rq(cx); 406 406 407 std::vector<std::pair<int, CStr>> newAssignPlayer;408 407 std::vector<bool> newStartGame; 409 std::vector<std::pair<CStr, int>> newPlayerReady;410 std::vector<bool> newPlayerResetReady;411 408 std::vector<std::string> newGameAttributes; 412 409 std::vector<u32> newTurnLength; 413 410 414 411 { 415 412 CScopeLock lock(m_WorkerMutex); 416 413 417 414 if (m_Shutdown) 418 415 return false; 419 416 420 417 newStartGame.swap(m_StartGameQueue); 421 newPlayerReady.swap(m_PlayerReadyQueue);422 newPlayerResetReady.swap(m_PlayerResetReadyQueue);423 newAssignPlayer.swap(m_AssignPlayerQueue);424 418 newGameAttributes.swap(m_GameAttributesQueue); 425 419 newTurnLength.swap(m_TurnLengthQueue); 426 420 } 427 421 428 for (const std::pair<int, CStr8>& p : newAssignPlayer)429 AssignPlayer(p.first, p.second);430 431 for (const std::pair<CStr8, int>& p : newPlayerReady)432 SetPlayerReady(p.first, p.second);433 434 if (!newPlayerResetReady.empty())435 ClearAllPlayerReady();436 437 422 if (!newGameAttributes.empty()) 438 423 { 439 424 JS::RootedValue gameAttributesVal(cx); 440 425 GetScriptInterface().ParseJSON(newGameAttributes.back(), &gameAttributesVal); 441 426 UpdateGameAttributes(&gameAttributesVal); … … void CNetServerWorker::SetupSession(CNet 647 632 session->AddTransition(NSS_AUTHENTICATE, (uint)NMT_AUTHENTICATE, NSS_PREGAME, (void*)&OnAuthenticate, context); 648 633 649 634 session->AddTransition(NSS_PREGAME, (uint)NMT_CONNECTION_LOST, NSS_UNCONNECTED, (void*)&OnDisconnect, context); 650 635 session->AddTransition(NSS_PREGAME, (uint)NMT_CHAT, NSS_PREGAME, (void*)&OnChat, context); 651 636 session->AddTransition(NSS_PREGAME, (uint)NMT_READY, NSS_PREGAME, (void*)&OnReady, context); 637 session->AddTransition(NSS_PREGAME, (uint)NMT_CLEAR_ALL_READY, NSS_PREGAME, (void*)&OnClearAllReady, context); 638 session->AddTransition(NSS_PREGAME, (uint)NMT_GAME_SETUP, NSS_PREGAME, (void*)&OnGameSetup, context); 639 session->AddTransition(NSS_PREGAME, (uint)NMT_ASSIGN_PLAYER, NSS_PREGAME, (void*)&OnAssignPlayer, context); 640 session->AddTransition(NSS_PREGAME, (uint)NMT_KICKED, NSS_PREGAME, (void*)&OnKickPlayer, context); 641 session->AddTransition(NSS_PREGAME, (uint)NMT_GAME_START, NSS_PREGAME, (void*)&OnStartGame, context); 652 642 session->AddTransition(NSS_PREGAME, (uint)NMT_LOADED_GAME, NSS_INGAME, (void*)&OnLoadedGame, context); 653 643 644 session->AddTransition(NSS_JOIN_SYNCING, (uint)NMT_KICKED, NSS_JOIN_SYNCING, (void*)&OnKickPlayer, context); 654 645 session->AddTransition(NSS_JOIN_SYNCING, (uint)NMT_CONNECTION_LOST, NSS_UNCONNECTED, (void*)&OnDisconnect, context); 655 646 session->AddTransition(NSS_JOIN_SYNCING, (uint)NMT_LOADED_GAME, NSS_INGAME, (void*)&OnJoinSyncingLoadedGame, context); 656 647 657 648 session->AddTransition(NSS_INGAME, (uint)NMT_REJOINED, NSS_INGAME, (void*)&OnRejoined, context); 649 session->AddTransition(NSS_INGAME, (uint)NMT_KICKED, NSS_INGAME, (void*)&OnKickPlayer, context); 658 650 session->AddTransition(NSS_INGAME, (uint)NMT_CLIENT_PAUSED, NSS_INGAME, (void*)&OnClientPaused, context); 659 651 session->AddTransition(NSS_INGAME, (uint)NMT_CONNECTION_LOST, NSS_UNCONNECTED, (void*)&OnDisconnect, context); 660 652 session->AddTransition(NSS_INGAME, (uint)NMT_CHAT, NSS_INGAME, (void*)&OnChat, context); 661 653 session->AddTransition(NSS_INGAME, (uint)NMT_SIMULATION_COMMAND, NSS_INGAME, (void*)&OnInGame, context); 662 654 session->AddTransition(NSS_INGAME, (uint)NMT_SYNC_CHECK, NSS_INGAME, (void*)&OnInGame, context); … … void CNetServerWorker::ClearAllPlayerRea 782 774 it->second.m_Status = 0; 783 775 784 776 SendPlayerAssignments(); 785 777 } 786 778 787 boolCNetServerWorker::KickPlayer(const CStrW& playerName, const bool ban)779 void CNetServerWorker::KickPlayer(const CStrW& playerName, const bool ban) 788 780 { 789 781 // Find the user with that name 790 782 std::vector<CNetServerSession*>::iterator it = std::find_if(m_Sessions.begin(), m_Sessions.end(), 791 783 [&](CNetServerSession* session) { return session->GetUserName() == playerName; }); 792 784 793 785 // and return if no one or the host has that name 794 786 if (it == m_Sessions.end() || (*it)->GetGUID() == m_HostGUID) 795 return false;787 return; 796 788 797 789 if (ban) 798 790 { 799 791 // Remember name 800 792 if (std::find(m_BannedPlayers.begin(), m_BannedPlayers.end(), playerName) == m_BannedPlayers.end()) … … bool CNetServerWorker::KickPlayer(const 812 804 // Send message notifying other clients 813 805 CKickedMessage kickedMessage; 814 806 kickedMessage.m_Name = playerName; 815 807 kickedMessage.m_Ban = ban; 816 808 Broadcast(&kickedMessage); 817 818 return true;819 809 } 820 810 821 811 void CNetServerWorker::AssignPlayer(int playerID, const CStr& guid) 822 812 { 823 813 // Remove anyone who's already assigned to this player … … bool CNetServerWorker::OnReady(void* con 1106 1096 CReadyMessage* message = (CReadyMessage*)event->GetParamRef(); 1107 1097 1108 1098 message->m_GUID = session->GetGUID(); 1109 1099 1110 1100 server.Broadcast(message); 1101 server.SetPlayerReady(message->m_GUID, message->m_Status); 1102 1103 return true; 1104 } 1105 1106 bool CNetServerWorker::OnClearAllReady(void* context, CFsmEvent* event) 1107 { 1108 ENSURE(event->GetType() == (uint)NMT_CLEAR_ALL_READY); 1109 1110 CNetServerSession* session = (CNetServerSession*)context; 1111 CNetServerWorker& server = session->GetServer(); 1112 1113 if (session->GetGUID() == server.m_HostGUID) 1114 server.ClearAllPlayerReady(); 1115 1116 return true; 1117 } 1118 1119 bool CNetServerWorker::OnGameSetup(void* context, CFsmEvent* event) 1120 { 1121 ENSURE(event->GetType() == (uint)NMT_GAME_SETUP); 1122 1123 CNetServerSession* session = (CNetServerSession*)context; 1124 CNetServerWorker& server = session->GetServer(); 1125 1126 if (session->GetGUID() == server.m_HostGUID) 1127 { 1128 CGameSetupMessage* message = (CGameSetupMessage*)event->GetParamRef(); 1129 server.UpdateGameAttributes(&(message->m_Data)); 1130 } 1131 return true; 1132 } 1133 1134 bool CNetServerWorker::OnAssignPlayer(void* context, CFsmEvent* event) 1135 { 1136 ENSURE(event->GetType() == (uint)NMT_ASSIGN_PLAYER); 1137 CNetServerSession* session = (CNetServerSession*)context; 1138 CNetServerWorker& server = session->GetServer(); 1139 1140 if (session->GetGUID() == server.m_HostGUID) 1141 { 1142 CAssignPlayerMessage* message = (CAssignPlayerMessage*)event->GetParamRef(); 1143 server.AssignPlayer(message->m_PlayerID, message->m_GUID); 1144 } 1145 return true; 1146 } 1147 1148 bool CNetServerWorker::OnStartGame(void* context, CFsmEvent* event) 1149 { 1150 ENSURE(event->GetType() == (uint)NMT_GAME_START); 1151 CNetServerSession* session = (CNetServerSession*)context; 1152 CNetServerWorker& server = session->GetServer(); 1153 1154 if (session->GetGUID() == server.m_HostGUID) 1155 server.StartGame(); 1111 1156 1112 1157 return true; 1113 1158 } 1114 1159 1115 1160 bool CNetServerWorker::OnLoadedGame(void* context, CFsmEvent* event) … … bool CNetServerWorker::OnRejoined(void* 1202 1247 } 1203 1248 1204 1249 return true; 1205 1250 } 1206 1251 1252 bool CNetServerWorker::OnKickPlayer(void* context, CFsmEvent* event) 1253 { 1254 ENSURE(event->GetType() == (uint)NMT_KICKED); 1255 1256 CNetServerSession* session = (CNetServerSession*)context; 1257 CNetServerWorker& server = session->GetServer(); 1258 1259 if (session->GetGUID() == server.m_HostGUID) 1260 { 1261 CKickedMessage* message = (CKickedMessage*)event->GetParamRef(); 1262 server.KickPlayer(message->m_Name, message->m_Ban); 1263 } 1264 return true; 1265 } 1266 1207 1267 bool CNetServerWorker::OnDisconnect(void* context, CFsmEvent* event) 1208 1268 { 1209 1269 ENSURE(event->GetType() == (uint)NMT_CONNECTION_LOST); 1210 1270 1211 1271 CNetServerSession* session = (CNetServerSession*)context; … … CNetServer::~CNetServer() 1370 1430 bool CNetServer::SetupConnection() 1371 1431 { 1372 1432 return m_Worker->SetupConnection(); 1373 1433 } 1374 1434 1375 bool CNetServer::KickPlayer(const CStrW& playerName, const bool ban)1376 {1377 CScopeLock lock(m_Worker->m_WorkerMutex);1378 return m_Worker->KickPlayer(playerName, ban);1379 }1380 1381 void CNetServer::AssignPlayer(int playerID, const CStr& guid)1382 {1383 CScopeLock lock(m_Worker->m_WorkerMutex);1384 m_Worker->m_AssignPlayerQueue.emplace_back(playerID, guid);1385 }1386 1387 void CNetServer::SetPlayerReady(const CStr& guid, int ready)1388 {1389 CScopeLock lock(m_Worker->m_WorkerMutex);1390 m_Worker->m_PlayerReadyQueue.emplace_back(guid, ready);1391 }1392 1393 void CNetServer::ClearAllPlayerReady()1394 {1395 CScopeLock lock(m_Worker->m_WorkerMutex);1396 m_Worker->m_PlayerResetReadyQueue.push_back(false);1397 }1398 1399 1435 void CNetServer::StartGame() 1400 1436 { 1401 1437 CScopeLock lock(m_Worker->m_WorkerMutex); 1402 1438 m_Worker->m_StartGameQueue.push_back(true); 1403 1439 } -
source/network/NetServer.h
public: 114 114 * @return true on success, false on error (e.g. port already in use) 115 115 */ 116 116 bool SetupConnection(); 117 117 118 118 /** 119 * Call from the GUI to update the player assignments.120 * The given GUID will be (re)assigned to the given player ID.121 * Any player currently using that ID will be unassigned.122 * The changes will be asynchronously propagated to all clients.123 */124 void AssignPlayer(int playerID, const CStr& guid);125 126 /**127 * Call from the GUI to update the player readiness.128 * The changes will be asynchronously propagated to all clients.129 */130 void SetPlayerReady(const CStr& guid, int ready);131 132 /**133 * Call from the GUI to set the all player readiness to 0.134 * The changes will be asynchronously propagated to all clients.135 */136 void ClearAllPlayerReady();137 138 /**139 * Disconnects a player from gamesetup or session.140 */141 bool KickPlayer(const CStrW& playerName, const bool ban);142 143 /**144 119 * Call from the GUI to asynchronously notify all clients that they should start loading the game. 145 120 */ 146 121 void StartGame(); 147 122 148 123 /** … … public: 188 163 bool SendMessage(ENetPeer* peer, const CNetMessage* message); 189 164 190 165 /** 191 166 * Disconnects a player from gamesetup or session. 192 167 */ 193 boolKickPlayer(const CStrW& playerName, const bool ban);168 void KickPlayer(const CStrW& playerName, const bool ban); 194 169 195 170 /** 196 171 * Send a message to all clients who have completed the full connection process 197 172 * (i.e. are in the pre-game or in-game states). 198 173 */ … … private: 268 243 static bool OnClientHandshake(void* context, CFsmEvent* event); 269 244 static bool OnAuthenticate(void* context, CFsmEvent* event); 270 245 static bool OnInGame(void* context, CFsmEvent* event); 271 246 static bool OnChat(void* context, CFsmEvent* event); 272 247 static bool OnReady(void* context, CFsmEvent* event); 248 static bool OnClearAllReady(void* context, CFsmEvent* event); 249 static bool OnGameSetup(void* context, CFsmEvent* event); 250 static bool OnAssignPlayer(void* context, CFsmEvent* event); 251 static bool OnStartGame(void* context, CFsmEvent* event); 273 252 static bool OnLoadedGame(void* context, CFsmEvent* event); 274 253 static bool OnJoinSyncingLoadedGame(void* context, CFsmEvent* event); 275 254 static bool OnRejoined(void* context, CFsmEvent* event); 255 static bool OnKickPlayer(void* context, CFsmEvent* event); 276 256 static bool OnDisconnect(void* context, CFsmEvent* event); 277 257 static bool OnClientPaused(void* context, CFsmEvent* event); 278 258 279 259 void CheckGameLoadStatus(CNetServerSession* changedSession); 280 260 … … private: 365 345 CMutex m_WorkerMutex; 366 346 367 347 bool m_Shutdown; // protected by m_WorkerMutex 368 348 369 349 // Queues for messages sent by the game thread: 370 std::vector<std::pair<int, CStr>> m_AssignPlayerQueue; // protected by m_WorkerMutex371 350 std::vector<bool> m_StartGameQueue; // protected by m_WorkerMutex 372 std::vector<std::pair<CStr, int>> m_PlayerReadyQueue; // protected by m_WorkerMutex373 std::vector<bool> m_PlayerResetReadyQueue; // protected by m_WorkerMutex374 351 std::vector<std::string> m_GameAttributesQueue; // protected by m_WorkerMutex 375 352 std::vector<u32> m_TurnLengthQueue; // protected by m_WorkerMutex 376 353 }; 377 354 378 355 /// Global network server for the standard game