Ticket #1949: rejoined_message_v4.patch
File rejoined_message_v4.patch, 12.7 KB (added by , 9 years ago) |
---|
-
binaries/data/mods/public/gui/gamesetup/gamesetup_mp.js
109 109 110 110 case "start": 111 111 Engine.SwitchGuiPage("page_loading.xml", { 112 112 "attribs": g_GameAttributes, 113 113 "isNetworked" : true, 114 "isRejoining" : g_IsRejoining, 114 115 "playerAssignments": g_PlayerAssignments 115 116 }); 116 117 break; 117 118 118 119 case "chat": -
binaries/data/mods/public/gui/loading/loading.js
111 111 // Switch GUI from loading screen to game session. 112 112 Engine.SwitchGuiPage("page_session.xml", g_Data); 113 113 114 114 // Restore default cursor. 115 115 Engine.SetCursor("arrow-default"); 116 117 // Notify the other clients that we have finished the loading screen 118 if (g_Data.isNetworked && g_Data.isRejoining) 119 Engine.SendNetworkRejoined(); 116 120 } -
binaries/data/mods/public/gui/session/messages.js
298 298 299 299 case "aichat": 300 300 addChatMessage({ "type": "message", "guid": message.guid, "text": message.text, "translate": true }); 301 301 break; 302 302 303 case "rejoined": 304 addChatMessage({ "type": "rejoined", "guid": message.guid}); 305 break; 306 303 307 // To prevent errors, ignore these message types that occur during autostart 304 308 case "gamesetup": 305 309 case "start": 306 310 break; 307 311 … … 437 441 var formatted; 438 442 439 443 switch (msg.type) 440 444 { 441 445 case "connect": 442 formatted = sprintf(translate("%(player)s has joined the game."), { player: "[color=\"" + playerColor + "\"]" + username + "[/color]" });446 formatted = sprintf(translate("%(player)s is connecting..."), { player: "[color=\"" + playerColor + "\"]" + username + "[/color]" }); 443 447 break; 444 448 case "disconnect": 445 449 formatted = sprintf(translate("%(player)s has left the game."), { player: "[color=\"" + playerColor + "\"]" + username + "[/color]" }); 446 450 break; 451 case "rejoined": 452 formatted = sprintf(translate("%(player)s has rejoined the game."), { player: "[color=\"" + playerColor + "\"]" + username + "[/color]" }); 453 break; 447 454 case "defeat": 448 455 // In singleplayer, the local player is "You". "You has" is incorrect. 449 456 if (!g_IsNetworked && msg.player == Engine.GetPlayerID()) 450 457 formatted = translate("You have been defeated."); 451 458 else -
source/gui/scripting/ScriptFunctions.cpp
386 386 ENSURE(g_NetClient); 387 387 388 388 g_NetClient->SendChatMessage(message); 389 389 } 390 390 391 void SendNetworkRejoined(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) 392 { 393 ENSURE(g_NetClient); 394 395 g_NetClient->SendRejoinedMessage(); 396 } 397 391 398 void SendNetworkReady(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), int message) 392 399 { 393 400 ENSURE(g_NetClient); 394 401 395 402 g_NetClient->SendReadyMessage(message); … … 949 956 scriptInterface.RegisterFunction<void, int, std::string, &AssignNetworkPlayer>("AssignNetworkPlayer"); 950 957 scriptInterface.RegisterFunction<void, std::string, int, &SetNetworkPlayerStatus>("SetNetworkPlayerStatus"); 951 958 scriptInterface.RegisterFunction<void, &ClearAllPlayerReady>("ClearAllPlayerReady"); 952 959 scriptInterface.RegisterFunction<void, std::wstring, &SendNetworkChat>("SendNetworkChat"); 953 960 scriptInterface.RegisterFunction<void, int, &SendNetworkReady>("SendNetworkReady"); 961 scriptInterface.RegisterFunction<void, &SendNetworkRejoined>("SendNetworkRejoined"); 954 962 scriptInterface.RegisterFunction<JS::Value, &GetAIs>("GetAIs"); 955 963 scriptInterface.RegisterFunction<JS::Value, &GetEngineInfo>("GetEngineInfo"); 956 964 957 965 // Saved games 958 966 scriptInterface.RegisterFunction<JS::Value, std::wstring, &StartSavedGame>("StartSavedGame"); -
source/network/NetClient.cpp
113 113 AddTransition(NCS_INGAME, (uint)NMT_GAME_SETUP, NCS_INGAME, (void*)&OnGameSetup, context); 114 114 AddTransition(NCS_INGAME, (uint)NMT_PLAYER_ASSIGNMENT, NCS_INGAME, (void*)&OnPlayerAssignment, context); 115 115 AddTransition(NCS_INGAME, (uint)NMT_SIMULATION_COMMAND, NCS_INGAME, (void*)&OnInGame, context); 116 116 AddTransition(NCS_INGAME, (uint)NMT_SYNC_ERROR, NCS_INGAME, (void*)&OnInGame, context); 117 117 AddTransition(NCS_INGAME, (uint)NMT_END_COMMAND_BATCH, NCS_INGAME, (void*)&OnInGame, context); 118 AddTransition(NCS_INGAME, (uint)NMT_REJOINED, NCS_INGAME, (void*)&OnRejoined, context); 118 119 119 120 // Set first state 120 121 SetFirstState(NCS_UNCONNECTED); 121 122 } 122 123 … … 284 285 CReadyMessage readyStatus; 285 286 readyStatus.m_Status = status; 286 287 SendMessage(&readyStatus); 287 288 } 288 289 290 void CNetClient::SendRejoinedMessage() 291 { 292 CRejoinedMessage rejoinedMessage; 293 SendMessage(&rejoinedMessage); 294 } 295 289 296 bool CNetClient::HandleMessage(CNetMessage* message) 290 297 { 291 298 // Handle non-FSM messages first 292 299 293 300 Status status = m_Session->GetFileTransferer().HandleMessageReceive(message); … … 582 589 client->m_ClientTurnManager->UpdateFastForward(); 583 590 584 591 return true; 585 592 } 586 593 594 bool CNetClient::OnRejoined(void *context, CFsmEvent* event) 595 { 596 ENSURE(event->GetType() == (uint)NMT_REJOINED); 597 598 CNetClient* client = (CNetClient*)context; 599 JSContext* cx = client->GetScriptInterface().GetContext(); 600 601 CRejoinedMessage* message = (CRejoinedMessage*)event->GetParamRef(); 602 JS::RootedValue msg(cx); 603 client->GetScriptInterface().Eval("({'type':'rejoined'})", &msg); 604 client->GetScriptInterface().SetProperty(msg, "guid", std::string(message->m_GUID), false); 605 client->PushGuiMessage(msg); 606 607 return true; 608 } 609 587 610 bool CNetClient::OnLoadedGame(void* context, CFsmEvent* event) 588 611 { 589 612 ENSURE(event->GetType() == (uint)NMT_LOADED_GAME); 590 613 591 614 CNetClient* client = (CNetClient*)context; -
source/network/NetClient.h
178 178 179 179 void SendChatMessage(const std::wstring& text); 180 180 181 181 void SendReadyMessage(const int status); 182 182 183 /** 184 * Call when the client has rejoined a running match and finished 185 * the loading screen. 186 */ 187 void SendRejoinedMessage(); 188 183 189 private: 184 190 // Net message / FSM transition handlers 185 191 static bool OnConnect(void* context, CFsmEvent* event); 186 192 static bool OnHandshake(void* context, CFsmEvent* event); 187 193 static bool OnHandshakeResponse(void* context, CFsmEvent* event); … … 193 199 static bool OnInGame(void* context, CFsmEvent* event); 194 200 static bool OnGameStart(void* context, CFsmEvent* event); 195 201 static bool OnJoinSyncStart(void* context, CFsmEvent* event); 196 202 static bool OnJoinSyncEndCommandBatch(void* context, CFsmEvent* event); 197 203 static bool OnLoadedGame(void* context, CFsmEvent* event); 204 static bool OnRejoined(void* context, CFsmEvent* event); 198 205 199 206 /** 200 207 * Take ownership of a session object, and use it for all network communication. 201 208 */ 202 209 void SetAndOwnSession(CNetClientSession* session); -
source/network/NetMessage.cpp
129 129 130 130 case NMT_JOIN_SYNC_START: 131 131 pNewMessage = new CJoinSyncStartMessage; 132 132 break; 133 133 134 case NMT_REJOINED: 135 pNewMessage = new CRejoinedMessage; 136 break; 137 134 138 case NMT_LOADED_GAME: 135 139 pNewMessage = new CLoadedGameMessage; 136 140 break; 137 141 138 142 case NMT_SERVER_HANDSHAKE: … … 172 176 break; 173 177 174 178 case NMT_CHAT: 175 179 pNewMessage = new CChatMessage; 176 180 break; 177 181 178 182 case NMT_READY: 179 183 pNewMessage = new CReadyMessage; 180 184 break; 181 185 182 186 case NMT_SIMULATION_COMMAND: -
source/network/NetMessages.h
45 45 NMT_SERVER_HANDSHAKE_RESPONSE, 46 46 NMT_AUTHENTICATE, // Authentication stage 47 47 NMT_AUTHENTICATE_RESULT, 48 48 NMT_CHAT, // Common chat message 49 49 NMT_READY, 50 NMT_REJOINED, 50 51 NMT_GAME_SETUP, 51 52 NMT_PLAYER_ASSIGNMENT, 52 53 53 54 NMT_FILE_TRANSFER_REQUEST, 54 55 NMT_FILE_TRANSFER_RESPONSE, … … 153 154 END_NMT_CLASS() 154 155 155 156 START_NMT_CLASS_(JoinSyncStart, NMT_JOIN_SYNC_START) 156 157 END_NMT_CLASS() 157 158 159 START_NMT_CLASS_(Rejoined, NMT_REJOINED) 160 NMT_FIELD(CStr8, m_GUID) 161 END_NMT_CLASS() 162 158 163 START_NMT_CLASS_(LoadedGame, NMT_LOADED_GAME) 159 164 NMT_FIELD_INT(m_CurrentTurn, u32, 4) 160 165 END_NMT_CLASS() 161 166 162 167 START_NMT_CLASS_(GameStart, NMT_GAME_START) -
source/network/NetServer.cpp
596 596 session->AddTransition(NSS_INGAME, (uint)NMT_CONNECTION_LOST, NSS_UNCONNECTED, (void*)&OnDisconnect, context); 597 597 session->AddTransition(NSS_INGAME, (uint)NMT_CHAT, NSS_INGAME, (void*)&OnChat, context); 598 598 session->AddTransition(NSS_INGAME, (uint)NMT_SIMULATION_COMMAND, NSS_INGAME, (void*)&OnInGame, context); 599 599 session->AddTransition(NSS_INGAME, (uint)NMT_SYNC_CHECK, NSS_INGAME, (void*)&OnInGame, context); 600 600 session->AddTransition(NSS_INGAME, (uint)NMT_END_COMMAND_BATCH, NSS_INGAME, (void*)&OnInGame, context); 601 session->AddTransition(NSS_INGAME, (uint)NMT_REJOINED, NSS_INGAME, (void*)&OnRejoined, context); 601 602 602 603 // Set first state 603 604 session->SetFirstState(NSS_HANDSHAKE); 604 605 } 605 606 … … 986 987 session->SendMessage(&loaded); 987 988 988 989 return true; 989 990 } 990 991 992 bool CNetServerWorker::OnRejoined(void* context, CFsmEvent* event) 993 { 994 995 // A client has finished rejoining and his/her loading screen disappeared. 996 997 ENSURE(event->GetType() == (uint)NMT_REJOINED); 998 999 CNetServerSession* session = (CNetServerSession*)context; 1000 CNetServerWorker& server = session->GetServer(); 1001 1002 CRejoinedMessage* message = (CRejoinedMessage*)event->GetParamRef(); 1003 1004 message->m_GUID = session->GetGUID(); 1005 1006 server.Broadcast(message); 1007 1008 return true; 1009 } 1010 991 1011 bool CNetServerWorker::OnDisconnect(void* context, CFsmEvent* event) 992 1012 { 993 1013 ENSURE(event->GetType() == (uint)NMT_CONNECTION_LOST); 994 1014 995 1015 CNetServerSession* session = (CNetServerSession*)context; -
source/network/NetServer.h
260 260 static bool OnInGame(void* context, CFsmEvent* event); 261 261 static bool OnChat(void* context, CFsmEvent* event); 262 262 static bool OnReady(void* context, CFsmEvent* event); 263 263 static bool OnLoadedGame(void* context, CFsmEvent* event); 264 264 static bool OnJoinSyncingLoadedGame(void* context, CFsmEvent* event); 265 static bool OnRejoined(void* context, CFsmEvent* event); 265 266 static bool OnDisconnect(void* context, CFsmEvent* event); 266 267 267 268 void CheckGameLoadStatus(CNetServerSession* changedSession); 268 269 269 270 void ConstructPlayerAssignmentMessage(CPlayerAssignmentMessage& message); -
source/ps/Game.cpp
233 233 234 234 // Render a frame to begin loading assets 235 235 if (CRenderer::IsInitialised()) 236 236 Render(); 237 237 238 if (g_NetClient) 239 g_NetClient->LoadFinished(); 240 238 241 // Call the reallyStartGame GUI function, but only if it exists 239 242 if (g_GUI && g_GUI->HasPages()) 240 243 { 241 244 JS::RootedValue global(cx, g_GUI->GetActiveGUI()->GetGlobalObject()); 242 245 if (g_GUI->GetActiveGUI()->GetScriptInterface()->HasProperty(global, "reallyStartGame")) 243 246 g_GUI->GetActiveGUI()->GetScriptInterface()->CallFunctionVoid(global, "reallyStartGame"); 244 247 } 245 248 246 if (g_NetClient)247 g_NetClient->LoadFinished();248 249 249 debug_printf("GAME STARTED, ALL INIT COMPLETE\n"); 250 250 251 251 // The call tree we've built for pregame probably isn't useful in-game. 252 252 if (CProfileManager::IsInitialised()) 253 253 g_Profiler.StructuralReset();