Ticket #1949: rejoined_message_wip_v2.patch
File rejoined_message_wip_v2.patch, 10.0 KB (added by , 9 years ago) |
---|
-
binaries/data/mods/public/gui/gamesetup/gamesetup_mp.js
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; -
binaries/data/mods/public/gui/loading/loading.js
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(); 120 } 116 121 } -
binaries/data/mods/public/gui/session/messages.js
291 291 case "aichat": 292 292 addChatMessage({ "type": "message", "guid": message.guid, "text": message.text, "translate": true }); 293 293 break; 294 294 295 case "rejoined": 296 addChatMessage({ "type": "rejoined", "guid": message.guid}); 297 break; 298 295 299 // To prevent errors, ignore these message types that occur during autostart 296 300 case "gamesetup": 297 301 case "start": … … 431 435 switch (msg.type) 432 436 { 433 437 case "connect": 434 formatted = sprintf(translate("%(player)s has joined the game."), { player: "[color=\"" + playerColor + "\"]" + username + "[/color]" });438 formatted = sprintf(translate("%(player)s is connecting..."), { player: "[color=\"" + playerColor + "\"]" + username + "[/color]" }); 435 439 break; 436 440 case "disconnect": 437 441 formatted = sprintf(translate("%(player)s has left the game."), { player: "[color=\"" + playerColor + "\"]" + username + "[/color]" }); 438 442 break; 443 case "rejoined": 444 formatted = sprintf(translate("%(player)s has rejoined the game."), { player: "[color=\"" + playerColor + "\"]" + username + "[/color]" }); 445 break; 439 446 case "defeat": 440 447 // In singleplayer, the local player is "You". "You has" is incorrect. 441 448 if (!g_IsNetworked && msg.player == Engine.GetPlayerID()) -
source/gui/scripting/ScriptFunctions.cpp
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); … … 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 -
source/network/NetClient.cpp
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); … … 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 … … 631 638 632 639 return true; 633 640 } 641 642 bool CNetClient::OnRejoined(void *context, CFsmEvent* event) 643 { 644 ENSURE(event->GetType() == (uint)NMT_REJOINED); 645 646 CNetClient* client = (CNetClient*)context; 647 JSContext* cx = client->GetScriptInterface().GetContext(); 648 649 CRejoinedMessage* message = (CRejoinedMessage*)event->GetParamRef(); 650 JS::RootedValue msg(cx); 651 client->GetScriptInterface().Eval("({'type':'rejoined'})", &msg); 652 client->GetScriptInterface().SetProperty(msg, "guid", std::string(message->m_GUID), false); 653 client->PushGuiMessage(msg); 654 655 return true; 656 } -
source/network/NetClient.h
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 189 183 190 private: 184 191 // Net message / FSM transition handlers 185 192 static bool OnConnect(void* context, CFsmEvent* event); … … 195 202 static bool OnJoinSyncStart(void* context, CFsmEvent* event); 196 203 static bool OnJoinSyncEndCommandBatch(void* context, CFsmEvent* event); 197 204 static bool OnLoadedGame(void* context, CFsmEvent* event); 205 static bool OnRejoined(void* context, CFsmEvent* event); 198 206 199 207 /** 200 208 * Take ownership of a session object, and use it for all network communication. -
source/network/NetMessage.cpp
174 174 case NMT_CHAT: 175 175 pNewMessage = new CChatMessage; 176 176 break; 177 177 178 178 case NMT_READY: 179 179 pNewMessage = new CReadyMessage; 180 180 break; 181 181 182 case NMT_REJOINED: 183 pNewMessage = new CRejoinedMessage; 184 break; 185 182 186 case NMT_SIMULATION_COMMAND: 183 187 pNewMessage = new CSimulationMessage(scriptInterface); 184 188 break; -
source/network/NetMessages.h
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 … … 124 125 NMT_FIELD_INT(m_Status, u8, 1) 125 126 END_NMT_CLASS() 126 127 128 START_NMT_CLASS_(Rejoined, NMT_REJOINED) 129 NMT_FIELD(CStr8, m_GUID) 130 END_NMT_CLASS() 131 127 132 START_NMT_CLASS_(PlayerAssignment, NMT_PLAYER_ASSIGNMENT) 128 133 NMT_START_ARRAY(m_Hosts) 129 134 NMT_FIELD(CStr8, m_GUID) -
source/network/NetServer.cpp
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); … … 922 923 return true; 923 924 } 924 925 926 bool CNetServerWorker::OnRejoined(void* context, CFsmEvent* event) 927 { 928 ENSURE(event->GetType() == (uint)NMT_REJOINED); 929 930 CNetServerSession* session = (CNetServerSession*)context; 931 CNetServerWorker& server = session->GetServer(); 932 933 CRejoinedMessage* message = (CRejoinedMessage*)event->GetParamRef(); 934 935 message->m_GUID = session->GetGUID(); 936 937 server.Broadcast(message); 938 939 return true; 940 } 941 925 942 bool CNetServerWorker::OnLoadedGame(void* context, CFsmEvent* event) 926 943 { 927 944 ENSURE(event->GetType() == (uint)NMT_LOADED_GAME); -
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 static bool OnRejoined(void* context, CFsmEvent* event); 263 264 static bool OnLoadedGame(void* context, CFsmEvent* event); 264 265 static bool OnJoinSyncingLoadedGame(void* context, CFsmEvent* event); 265 266 static bool OnDisconnect(void* context, CFsmEvent* event); -
source/ps/Game.cpp
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 { … … 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.