Ticket #3806: 3556_dedServer_v1.4.1.patch
File 3556_dedServer_v1.4.1.patch, 18.6 KB (added by , 8 years ago) |
---|
-
binaries/data/mods/public/gui/common/network.js
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."), { -
source/gui/scripting/ScriptFunctions.cpp
248 248 249 249 void StartNetworkGame(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) 250 250 { 251 ENSURE(g_Net Server);252 g_Net Server->StartGame();251 ENSURE(g_NetClient); 252 g_NetClient->SendStartGameMessage(); 253 253 } 254 254 255 255 void StartGame(ScriptInterface::CxPrivate* pCxPrivate, JS::HandleValue attribs, int playerID) … … 332 332 333 333 void SetNetworkGameAttributes(ScriptInterface::CxPrivate* pCxPrivate, JS::HandleValue attribs1) 334 334 { 335 ENSURE(g_Net Server);335 ENSURE(g_NetClient); 336 336 //TODO: This is a workaround because we need to pass a MutableHandle to a JSAPI functions somewhere 337 337 // (with no obvious reason). 338 338 JSContext* cx = pCxPrivate->pScriptInterface->GetContext(); … … 339 339 JSAutoRequest rq(cx); 340 340 JS::RootedValue attribs(cx, attribs1); 341 341 342 g_Net Server->UpdateGameAttributes(&attribs, *(pCxPrivate->pScriptInterface));342 g_NetClient->SendGameSetupMessage(&attribs, *(pCxPrivate->pScriptInterface)); 343 343 } 344 344 345 345 void StartNetworkHost(ScriptInterface::CxPrivate* pCxPrivate, const std::wstring& playerName) … … 402 402 return g_NetClient->GetGUID(); 403 403 } 404 404 405 boolKickPlayer(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const CStrW& playerName, bool ban)405 void KickPlayer(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const CStrW& playerName, bool ban) 406 406 { 407 if (!g_NetServer) 408 return false; 409 410 return g_NetServer->KickPlayer(playerName, ban); 407 ENSURE(g_NetClient); 408 g_NetClient->SendKickPlayerMessage(playerName, ban); 411 409 } 412 410 413 411 JS::Value PollNetworkClient(ScriptInterface::CxPrivate* pCxPrivate) … … 425 423 426 424 void AssignNetworkPlayer(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), int playerID, const std::string& guid) 427 425 { 428 ENSURE(g_Net Server);426 ENSURE(g_NetClient); 429 427 430 g_Net Server->AssignPlayer(playerID, guid);428 g_NetClient->SendAssignPlayerMessage(playerID, guid); 431 429 } 432 430 433 431 void SetNetworkPlayerStatus(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const std::string& guid, int ready) 434 432 { 435 ENSURE(g_Net Server);433 ENSURE(g_NetClient); 436 434 437 g_Net Server->SetPlayerReady(guid, ready);435 g_NetClient->SendSetPlayerStatusMessage(guid, ready); 438 436 } 439 437 440 438 void ClearAllPlayerReady (ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) 441 439 { 442 ENSURE(g_Net Server);440 ENSURE(g_NetClient); 443 441 444 g_Net Server->ClearAllPlayerReady();442 g_NetClient->SendClearAllReadyMessage(); 445 443 } 446 444 447 445 void SendNetworkChat(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const std::wstring& message) … … 1040 1038 scriptInterface.RegisterFunction<void, std::wstring, std::string, &StartNetworkJoin>("StartNetworkJoin"); 1041 1039 scriptInterface.RegisterFunction<void, &DisconnectNetworkGame>("DisconnectNetworkGame"); 1042 1040 scriptInterface.RegisterFunction<std::string, &GetPlayerGUID>("GetPlayerGUID"); 1043 scriptInterface.RegisterFunction< bool, CStrW, bool, &KickPlayer>("KickPlayer");1041 scriptInterface.RegisterFunction<void, CStrW, bool, &KickPlayer>("KickPlayer"); 1044 1042 scriptInterface.RegisterFunction<JS::Value, &PollNetworkClient>("PollNetworkClient"); 1045 1043 scriptInterface.RegisterFunction<void, JS::HandleValue, &SetNetworkGameAttributes>("SetNetworkGameAttributes"); 1046 1044 scriptInterface.RegisterFunction<void, int, std::string, &AssignNetworkPlayer>("AssignNetworkPlayer"); -
source/network/NetClient.cpp
323 323 SetCurrState(NCS_UNCONNECTED); 324 324 } 325 325 326 void CNetClient::SendGameSetupMessage(JS::MutableHandleValue attrs, ScriptInterface& scriptInterface) 327 { 328 JSContext* cx = scriptInterface.GetContext(); 329 JS::RootedValue attrsRooted(cx); 330 attrsRooted = attrs; 331 332 CGameSetupMessage gameSetup(scriptInterface); 333 gameSetup.m_Data = attrsRooted; 334 SendMessage(&gameSetup); 335 } 336 337 void CNetClient::SendAssignPlayerMessage(const int playerID, const CStr& guid) 338 { 339 CAssignPlayerMessage assignPlayer; 340 assignPlayer.m_PlayerID = playerID; 341 assignPlayer.m_GUID = guid; 342 SendMessage(&assignPlayer); 343 } 344 326 345 void CNetClient::SendChatMessage(const std::wstring& text) 327 346 { 328 347 CChatMessage chat; … … 337 356 SendMessage(&readyStatus); 338 357 } 339 358 359 void CNetClient::SendClearAllReadyMessage() 360 { 361 CClearAllReadyMessage clearAllReady; 362 SendMessage(&clearAllReady); 363 } 364 365 void CNetClient::SendSetPlayerStatusMessage(const CStr& guid, const int ready) 366 { 367 CReadyMessage setStatus; 368 setStatus.m_GUID = guid; 369 setStatus.m_Status = ready; 370 SendMessage(&setStatus); 371 } 372 373 void CNetClient::SendStartGameMessage() 374 { 375 CGameStartMessage gameStart; 376 SendMessage(&gameStart); 377 } 378 340 379 void CNetClient::SendRejoinedMessage() 341 380 { 342 381 CRejoinedMessage rejoinedMessage; … … 343 382 SendMessage(&rejoinedMessage); 344 383 } 345 384 385 void CNetClient::SendKickPlayerMessage(const CStrW& playerName, bool ban) 386 { 387 CKickedMessage kickPlayer; 388 kickPlayer.m_Name = playerName; 389 kickPlayer.m_Ban = ban; 390 SendMessage(&kickPlayer); 391 } 392 346 393 void CNetClient::SendPausedMessage(bool pause) 347 394 { 348 395 CClientPausedMessage pausedMessage; -
source/network/NetClient.h
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 SendSetPlayerStatusMessage(const CStr& guid, const int ready); 201 202 void SendStartGameMessage(); 203 194 204 /** 195 205 * Call when the client has rejoined a running match and finished 196 206 * the loading screen. … … 198 208 void SendRejoinedMessage(); 199 209 200 210 /** 211 * Call when a client kicks/ban a player 212 */ 213 void SendKickPlayerMessage(const CStrW& playerName, bool ban); 214 215 /** 201 216 * Call when the client has paused or unpaused the game. 202 217 */ 203 218 void SendPausedMessage(bool pause); -
source/network/NetMessage.cpp
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; -
source/network/NetMessages.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. … … 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, … … 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) … … 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 -
source/network/NetServer.cpp
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 … … 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); … … 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*)&OnClearAllReadyMessage, 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); … … 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(), … … 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 { 788 LOGERROR("Couldn't %s player", ban ? "ban" : "kick"); 789 return; 790 } 796 791 797 792 if (ban) 798 793 { … … 814 809 kickedMessage.m_Name = playerName; 815 810 kickedMessage.m_Ban = ban; 816 811 Broadcast(&kickedMessage); 817 818 return true;819 812 } 820 813 821 814 void CNetServerWorker::AssignPlayer(int playerID, const CStr& guid) … … 1105 1098 1106 1099 CReadyMessage* message = (CReadyMessage*)event->GetParamRef(); 1107 1100 1108 message->m_GUID = session->GetGUID(); 1101 if (session->GetGUID() != server.m_HostGUID) 1102 { 1103 message->m_GUID = session->GetGUID(); 1104 server.Broadcast(message); 1105 } 1106 else 1107 server.SetPlayerReady(message->m_GUID, message->m_Status); 1109 1108 1110 server.Broadcast(message); 1109 return true; 1110 } 1111 1111 1112 bool CNetServerWorker::OnClearAllReadyMessage(void* context, CFsmEvent* event) 1113 { 1114 ENSURE(event->GetType() == (uint)NMT_CLEAR_ALL_READY); 1115 1116 CNetServerSession* session = (CNetServerSession*)context; 1117 CNetServerWorker& server = session->GetServer(); 1118 1119 if (session->GetGUID() != server.m_HostGUID) 1120 return true; 1121 1122 server.ClearAllPlayerReady(); 1123 1112 1124 return true; 1113 1125 } 1114 1126 1127 bool CNetServerWorker::OnGameSetup(void* context, CFsmEvent* event) 1128 { 1129 ENSURE(event->GetType() == (uint)NMT_GAME_SETUP); 1130 1131 CNetServerSession* session = (CNetServerSession*)context; 1132 CNetServerWorker& server = session->GetServer(); 1133 1134 if (session->GetGUID() != server.m_HostGUID) 1135 return true; 1136 1137 CGameSetupMessage* message = (CGameSetupMessage*)event->GetParamRef(); 1138 1139 server.UpdateGameAttributes(&(message->m_Data)); 1140 return true; 1141 } 1142 1143 bool CNetServerWorker::OnAssignPlayer(void* context, CFsmEvent* event) 1144 { 1145 ENSURE(event->GetType() == (uint)NMT_ASSIGN_PLAYER); 1146 CNetServerSession* session = (CNetServerSession*)context; 1147 CNetServerWorker& server = session->GetServer(); 1148 1149 if (session->GetGUID() != server.m_HostGUID) 1150 return true; 1151 1152 CAssignPlayerMessage* message = (CAssignPlayerMessage*)event->GetParamRef(); 1153 server.AssignPlayer(message->m_PlayerID, message->m_GUID); 1154 return true; 1155 } 1156 1157 bool CNetServerWorker::OnStartGame(void* context, CFsmEvent* event) 1158 { 1159 ENSURE(event->GetType() == (uint)NMT_GAME_START); 1160 CNetServerSession* session = (CNetServerSession*)context; 1161 CNetServerWorker& server = session->GetServer(); 1162 1163 if (session->GetGUID() != server.m_HostGUID) 1164 return true; 1165 1166 server.StartGame(); 1167 return true; 1168 } 1169 1115 1170 bool CNetServerWorker::OnLoadedGame(void* context, CFsmEvent* event) 1116 1171 { 1117 1172 ENSURE(event->GetType() == (uint)NMT_LOADED_GAME); … … 1204 1259 return true; 1205 1260 } 1206 1261 1262 bool CNetServerWorker::OnKickPlayer(void* context, CFsmEvent* event) 1263 { 1264 ENSURE(event->GetType() == (uint)NMT_KICKED); 1265 1266 CNetServerSession* session = (CNetServerSession*)context; 1267 CNetServerWorker& server = session->GetServer(); 1268 1269 if (session->GetGUID() != server.m_HostGUID) 1270 return true; 1271 1272 CKickedMessage* message = (CKickedMessage*)event->GetParamRef(); 1273 server.KickPlayer(message->m_Name, message->m_Ban); 1274 return true; 1275 } 1276 1207 1277 bool CNetServerWorker::OnDisconnect(void* context, CFsmEvent* event) 1208 1278 { 1209 1279 ENSURE(event->GetType() == (uint)NMT_CONNECTION_LOST); … … 1372 1442 return m_Worker->SetupConnection(); 1373 1443 } 1374 1444 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 1445 void CNetServer::StartGame() 1400 1446 { 1401 1447 CScopeLock lock(m_Worker->m_WorkerMutex); -
source/network/NetServer.h
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(); … … 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 … … 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 OnClearAllReadyMessage(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 … … 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 };