Ticket #1949: rejoined_message_v4.patch

File rejoined_message_v4.patch, 12.7 KB (added by elexis, 9 years ago)

Cleaned 1 or 2 unnecessary whitespace changes in the previous patch. Fixes a whitespace change in r15006 in NetMessage.cpp. Still dont know how you want those functions grouped. Tested with r16533.

  • binaries/data/mods/public/gui/gamesetup/gamesetup_mp.js

     
    109109
    110110            case "start":
    111111                Engine.SwitchGuiPage("page_loading.xml", {
    112112                    "attribs": g_GameAttributes,
    113113                    "isNetworked" : true,
     114                    "isRejoining" : g_IsRejoining,
    114115                    "playerAssignments": g_PlayerAssignments
    115116                });
    116117                break;
    117118
    118119            case "chat":
  • binaries/data/mods/public/gui/loading/loading.js

     
    111111    // Switch GUI from loading screen to game session.
    112112    Engine.SwitchGuiPage("page_session.xml", g_Data);
    113113
    114114    // Restore default cursor.
    115115    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();
    116120}
  • binaries/data/mods/public/gui/session/messages.js

     
    298298
    299299    case "aichat":
    300300        addChatMessage({ "type": "message", "guid": message.guid, "text": message.text, "translate": true });
    301301        break;
    302302
     303    case "rejoined":
     304        addChatMessage({ "type": "rejoined", "guid": message.guid});
     305        break;
     306       
    303307    // To prevent errors, ignore these message types that occur during autostart
    304308    case "gamesetup":
    305309    case "start":
    306310        break;
    307311
     
    437441    var formatted;
    438442
    439443    switch (msg.type)
    440444    {
    441445    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]" });
    443447        break;
    444448    case "disconnect":
    445449        formatted = sprintf(translate("%(player)s has left the game."), { player: "[color=\"" + playerColor + "\"]" + username + "[/color]" });
    446450        break;
     451    case "rejoined":
     452        formatted = sprintf(translate("%(player)s has rejoined the game."), { player: "[color=\"" + playerColor + "\"]" + username + "[/color]" });
     453        break;
    447454    case "defeat":
    448455        // In singleplayer, the local player is "You". "You has" is incorrect.
    449456        if (!g_IsNetworked && msg.player == Engine.GetPlayerID())
    450457            formatted = translate("You have been defeated.");
    451458        else
  • source/gui/scripting/ScriptFunctions.cpp

     
    386386    ENSURE(g_NetClient);
    387387
    388388    g_NetClient->SendChatMessage(message);
    389389}
    390390
     391void SendNetworkRejoined(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
     392{
     393    ENSURE(g_NetClient);
     394
     395    g_NetClient->SendRejoinedMessage();
     396}
     397
    391398void SendNetworkReady(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), int message)
    392399{
    393400    ENSURE(g_NetClient);
    394401
    395402    g_NetClient->SendReadyMessage(message);
     
    949956    scriptInterface.RegisterFunction<void, int, std::string, &AssignNetworkPlayer>("AssignNetworkPlayer");
    950957    scriptInterface.RegisterFunction<void, std::string, int, &SetNetworkPlayerStatus>("SetNetworkPlayerStatus");
    951958    scriptInterface.RegisterFunction<void, &ClearAllPlayerReady>("ClearAllPlayerReady");
    952959    scriptInterface.RegisterFunction<void, std::wstring, &SendNetworkChat>("SendNetworkChat");
    953960    scriptInterface.RegisterFunction<void, int, &SendNetworkReady>("SendNetworkReady");
     961    scriptInterface.RegisterFunction<void, &SendNetworkRejoined>("SendNetworkRejoined");
    954962    scriptInterface.RegisterFunction<JS::Value, &GetAIs>("GetAIs");
    955963    scriptInterface.RegisterFunction<JS::Value, &GetEngineInfo>("GetEngineInfo");
    956964
    957965    // Saved games
    958966    scriptInterface.RegisterFunction<JS::Value, std::wstring, &StartSavedGame>("StartSavedGame");
  • source/network/NetClient.cpp

     
    113113    AddTransition(NCS_INGAME, (uint)NMT_GAME_SETUP, NCS_INGAME, (void*)&OnGameSetup, context);
    114114    AddTransition(NCS_INGAME, (uint)NMT_PLAYER_ASSIGNMENT, NCS_INGAME, (void*)&OnPlayerAssignment, context);
    115115    AddTransition(NCS_INGAME, (uint)NMT_SIMULATION_COMMAND, NCS_INGAME, (void*)&OnInGame, context);
    116116    AddTransition(NCS_INGAME, (uint)NMT_SYNC_ERROR, NCS_INGAME, (void*)&OnInGame, context);
    117117    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);
    118119
    119120    // Set first state
    120121    SetFirstState(NCS_UNCONNECTED);
    121122}
    122123
     
    284285    CReadyMessage readyStatus;
    285286    readyStatus.m_Status = status;
    286287    SendMessage(&readyStatus);
    287288}
    288289
     290void CNetClient::SendRejoinedMessage()
     291{
     292    CRejoinedMessage rejoinedMessage;
     293    SendMessage(&rejoinedMessage);
     294}
     295
    289296bool CNetClient::HandleMessage(CNetMessage* message)
    290297{
    291298    // Handle non-FSM messages first
    292299
    293300    Status status = m_Session->GetFileTransferer().HandleMessageReceive(message);
     
    582589    client->m_ClientTurnManager->UpdateFastForward();
    583590
    584591    return true;
    585592}
    586593
     594bool 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
    587610bool CNetClient::OnLoadedGame(void* context, CFsmEvent* event)
    588611{
    589612    ENSURE(event->GetType() == (uint)NMT_LOADED_GAME);
    590613
    591614    CNetClient* client = (CNetClient*)context;
  • source/network/NetClient.h

     
    178178
    179179    void SendChatMessage(const std::wstring& text);
    180180   
    181181    void SendReadyMessage(const int status);
    182182
     183    /**
     184     * Call when the client has rejoined a running match and finished
     185     * the loading screen.
     186     */
     187    void SendRejoinedMessage();
     188
    183189private:
    184190    // Net message / FSM transition handlers
    185191    static bool OnConnect(void* context, CFsmEvent* event);
    186192    static bool OnHandshake(void* context, CFsmEvent* event);
    187193    static bool OnHandshakeResponse(void* context, CFsmEvent* event);
     
    193199    static bool OnInGame(void* context, CFsmEvent* event);
    194200    static bool OnGameStart(void* context, CFsmEvent* event);
    195201    static bool OnJoinSyncStart(void* context, CFsmEvent* event);
    196202    static bool OnJoinSyncEndCommandBatch(void* context, CFsmEvent* event);
    197203    static bool OnLoadedGame(void* context, CFsmEvent* event);
     204    static bool OnRejoined(void* context, CFsmEvent* event);
    198205
    199206    /**
    200207     * Take ownership of a session object, and use it for all network communication.
    201208     */
    202209    void SetAndOwnSession(CNetClientSession* session);
  • source/network/NetMessage.cpp

     
    129129
    130130    case NMT_JOIN_SYNC_START:
    131131        pNewMessage = new CJoinSyncStartMessage;
    132132        break;
    133133
     134    case NMT_REJOINED:
     135        pNewMessage = new CRejoinedMessage;
     136        break;
     137
    134138    case NMT_LOADED_GAME:
    135139        pNewMessage = new CLoadedGameMessage;
    136140        break;
    137141
    138142    case NMT_SERVER_HANDSHAKE:
     
    172176        break;
    173177
    174178    case NMT_CHAT:
    175179        pNewMessage = new CChatMessage;
    176180        break;
    177    
     181
    178182    case NMT_READY:
    179183        pNewMessage = new CReadyMessage;
    180184        break;
    181185
    182186    case NMT_SIMULATION_COMMAND:
  • source/network/NetMessages.h

     
    4545    NMT_SERVER_HANDSHAKE_RESPONSE,
    4646    NMT_AUTHENTICATE,       // Authentication stage
    4747    NMT_AUTHENTICATE_RESULT,
    4848    NMT_CHAT,       // Common chat message
    4949    NMT_READY,
     50    NMT_REJOINED,
    5051    NMT_GAME_SETUP,
    5152    NMT_PLAYER_ASSIGNMENT,
    5253
    5354    NMT_FILE_TRANSFER_REQUEST,
    5455    NMT_FILE_TRANSFER_RESPONSE,
     
    153154END_NMT_CLASS()
    154155
    155156START_NMT_CLASS_(JoinSyncStart, NMT_JOIN_SYNC_START)
    156157END_NMT_CLASS()
    157158
     159START_NMT_CLASS_(Rejoined, NMT_REJOINED)
     160    NMT_FIELD(CStr8, m_GUID)
     161END_NMT_CLASS()
     162
    158163START_NMT_CLASS_(LoadedGame, NMT_LOADED_GAME)
    159164    NMT_FIELD_INT(m_CurrentTurn, u32, 4)
    160165END_NMT_CLASS()
    161166
    162167START_NMT_CLASS_(GameStart, NMT_GAME_START)
  • source/network/NetServer.cpp

     
    596596    session->AddTransition(NSS_INGAME, (uint)NMT_CONNECTION_LOST, NSS_UNCONNECTED, (void*)&OnDisconnect, context);
    597597    session->AddTransition(NSS_INGAME, (uint)NMT_CHAT, NSS_INGAME, (void*)&OnChat, context);
    598598    session->AddTransition(NSS_INGAME, (uint)NMT_SIMULATION_COMMAND, NSS_INGAME, (void*)&OnInGame, context);
    599599    session->AddTransition(NSS_INGAME, (uint)NMT_SYNC_CHECK, NSS_INGAME, (void*)&OnInGame, context);
    600600    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);
    601602
    602603    // Set first state
    603604    session->SetFirstState(NSS_HANDSHAKE);
    604605}
    605606
     
    986987    session->SendMessage(&loaded);
    987988
    988989    return true;
    989990}
    990991
     992bool 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
    9911011bool CNetServerWorker::OnDisconnect(void* context, CFsmEvent* event)
    9921012{
    9931013    ENSURE(event->GetType() == (uint)NMT_CONNECTION_LOST);
    9941014
    9951015    CNetServerSession* session = (CNetServerSession*)context;
  • source/network/NetServer.h

     
    260260    static bool OnInGame(void* context, CFsmEvent* event);
    261261    static bool OnChat(void* context, CFsmEvent* event);
    262262    static bool OnReady(void* context, CFsmEvent* event);
    263263    static bool OnLoadedGame(void* context, CFsmEvent* event);
    264264    static bool OnJoinSyncingLoadedGame(void* context, CFsmEvent* event);
     265    static bool OnRejoined(void* context, CFsmEvent* event);
    265266    static bool OnDisconnect(void* context, CFsmEvent* event);
    266267
    267268    void CheckGameLoadStatus(CNetServerSession* changedSession);
    268269
    269270    void ConstructPlayerAssignmentMessage(CPlayerAssignmentMessage& message);
  • source/ps/Game.cpp

     
    233233   
    234234    // Render a frame to begin loading assets
    235235    if (CRenderer::IsInitialised())
    236236        Render();
    237237
     238    if (g_NetClient)
     239        g_NetClient->LoadFinished();
     240
    238241    // Call the reallyStartGame GUI function, but only if it exists
    239242    if (g_GUI && g_GUI->HasPages())
    240243    {
    241244        JS::RootedValue global(cx, g_GUI->GetActiveGUI()->GetGlobalObject());
    242245        if (g_GUI->GetActiveGUI()->GetScriptInterface()->HasProperty(global, "reallyStartGame"))
    243246            g_GUI->GetActiveGUI()->GetScriptInterface()->CallFunctionVoid(global, "reallyStartGame");
    244247    }
    245248
    246     if (g_NetClient)
    247         g_NetClient->LoadFinished();
    248 
    249249    debug_printf("GAME STARTED, ALL INIT COMPLETE\n");
    250250
    251251    // The call tree we've built for pregame probably isn't useful in-game.
    252252    if (CProfileManager::IsInitialised())
    253253        g_Profiler.StructuralReset();