Ticket #1950: t1950_show_who_paused_v1.patch

File t1950_show_who_paused_v1.patch, 11.5 KB (added by elexis, 9 years ago)

Displays a chat notification if a player pauses or unpauses the game.

  • binaries/data/mods/public/gui/session/menu.js

     
    651651
    652652function togglePause()
    653653{
    654654    closeMenu();
    655655    closeOpenDialogs();
    656 
     656   
    657657    var pauseOverlay = Engine.GetGUIObjectByName("pauseOverlay");
    658658
    659659    if (pauseOverlay.hidden)
    660660    {
    661661        Engine.GetGUIObjectByName("pauseButtonText").caption = RESUME;
     
    666666        Engine.SetPaused(false);
    667667        Engine.GetGUIObjectByName("pauseButtonText").caption = PAUSE;
    668668    }
    669669
    670670    pauseOverlay.hidden = !pauseOverlay.hidden;
     671   
     672    Engine.SendNetworkPaused(pauseOverlay.hidden ? 0 : 1);
    671673}
    672674
    673675function openManual()
    674676{
    675677    closeMenu();
  • binaries/data/mods/public/gui/session/messages.js

     
    299299
    300300    case "rejoined":
    301301        addChatMessage({ "type": "rejoined", "guid": message.guid});
    302302        break;
    303303       
     304    case "paused":
     305        addChatMessage({ "type": "paused", "guid": message.guid, "paused": message.paused});
     306        break;
     307       
    304308    // To prevent errors, ignore these message types that occur during autostart
    305309    case "gamesetup":
    306310    case "start":
    307311        break;
    308312
     
    446450        formatted = sprintf(translate("%(player)s has left the game."), { player: "[color=\"" + playerColor + "\"]" + username + "[/color]" });
    447451        break;
    448452    case "rejoined":
    449453        formatted = sprintf(translate("%(player)s has rejoined the game."), { player: "[color=\"" + playerColor + "\"]" + username + "[/color]" });
    450454        break;
     455    case "paused":
     456        var pausedMsg = msg.paused > 0 ? "%(player)s has paused the game" : "%(player)s has unpaused the game.";
     457        formatted = sprintf(translate(pausedMsg), { player: "[color=\"" + playerColor + "\"]" + username + "[/color]" });
     458        break;
    451459    case "defeat":
    452460        // In singleplayer, the local player is "You". "You has" is incorrect.
    453461        if (!g_IsNetworked && msg.player == Engine.GetPlayerID())
    454462            formatted = translate("You have been defeated.");
    455463        else
  • source/gui/scripting/ScriptFunctions.cpp

     
    400400    ENSURE(g_NetClient);
    401401
    402402    g_NetClient->SendRejoinedMessage();
    403403}
    404404
     405void SendNetworkPaused(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), int paused)
     406{
     407    ENSURE(g_NetClient);
     408
     409    g_NetClient->SendPausedMessage(paused);
     410}
     411
    405412JS::Value GetAIs(ScriptInterface::CxPrivate* pCxPrivate)
    406413{
    407414    return ICmpAIManager::GetAIs(*(pCxPrivate->pScriptInterface));
    408415}
    409416
     
    962969    scriptInterface.RegisterFunction<void, std::string, int, &SetNetworkPlayerStatus>("SetNetworkPlayerStatus");
    963970    scriptInterface.RegisterFunction<void, &ClearAllPlayerReady>("ClearAllPlayerReady");
    964971    scriptInterface.RegisterFunction<void, std::wstring, &SendNetworkChat>("SendNetworkChat");
    965972    scriptInterface.RegisterFunction<void, int, &SendNetworkReady>("SendNetworkReady");
    966973    scriptInterface.RegisterFunction<void, &SendNetworkRejoined>("SendNetworkRejoined");
     974    scriptInterface.RegisterFunction<void, int, &SendNetworkPaused>("SendNetworkPaused");
    967975    scriptInterface.RegisterFunction<JS::Value, &GetAIs>("GetAIs");
    968976    scriptInterface.RegisterFunction<JS::Value, &GetEngineInfo>("GetEngineInfo");
    969977
    970978    // Saved games
    971979    scriptInterface.RegisterFunction<JS::Value, std::wstring, &StartSavedGame>("StartSavedGame");
  • source/network/NetClient.cpp

     
    108108    AddTransition(NCS_LOADING, (uint)NMT_GAME_SETUP, NCS_LOADING, (void*)&OnGameSetup, context);
    109109    AddTransition(NCS_LOADING, (uint)NMT_PLAYER_ASSIGNMENT, NCS_LOADING, (void*)&OnPlayerAssignment, context);
    110110    AddTransition(NCS_LOADING, (uint)NMT_LOADED_GAME, NCS_INGAME, (void*)&OnLoadedGame, context);
    111111
    112112    AddTransition(NCS_INGAME, (uint)NMT_REJOINED, NCS_INGAME, (void*)&OnRejoined, context);
     113    AddTransition(NCS_INGAME, (uint)NMT_PAUSED, NCS_INGAME, (void*)&OnPaused, context);
    113114    AddTransition(NCS_INGAME, (uint)NMT_CHAT, NCS_INGAME, (void*)&OnChat, context);
    114115    AddTransition(NCS_INGAME, (uint)NMT_GAME_SETUP, NCS_INGAME, (void*)&OnGameSetup, context);
    115116    AddTransition(NCS_INGAME, (uint)NMT_PLAYER_ASSIGNMENT, NCS_INGAME, (void*)&OnPlayerAssignment, context);
    116117    AddTransition(NCS_INGAME, (uint)NMT_SIMULATION_COMMAND, NCS_INGAME, (void*)&OnInGame, context);
    117118    AddTransition(NCS_INGAME, (uint)NMT_SYNC_ERROR, NCS_INGAME, (void*)&OnInGame, context);
     
    291292{
    292293    CRejoinedMessage rejoinedMessage;
    293294    SendMessage(&rejoinedMessage);
    294295}
    295296
     297void CNetClient::SendPausedMessage(const int paused)
     298{
     299    CPausedMessage pausedMessage;
     300    pausedMessage.m_Paused = paused;
     301    SendMessage(&pausedMessage);
     302}
     303
    296304bool CNetClient::HandleMessage(CNetMessage* message)
    297305{
    298306    // Handle non-FSM messages first
    299307
    300308    Status status = m_Session->GetFileTransferer().HandleMessageReceive(message);
     
    605613    client->PushGuiMessage(msg);
    606614
    607615    return true;
    608616}
    609617
     618bool CNetClient::OnPaused(void *context, CFsmEvent* event)
     619{
     620    ENSURE(event->GetType() == (uint)NMT_PAUSED);
     621
     622    CNetClient* client = (CNetClient*)context;
     623    JSContext* cx = client->GetScriptInterface().GetContext();
     624
     625    CPausedMessage* message = (CPausedMessage*)event->GetParamRef();
     626    JS::RootedValue msg(cx);
     627    client->GetScriptInterface().Eval("({'type':'paused'})", &msg);
     628    client->GetScriptInterface().SetProperty(msg, "guid", std::string(message->m_GUID), false);
     629    client->GetScriptInterface().SetProperty(msg, "paused", int(message->m_Paused), false);
     630
     631    client->PushGuiMessage(msg);
     632
     633    return true;
     634}
     635
    610636bool CNetClient::OnLoadedGame(void* context, CFsmEvent* event)
    611637{
    612638    ENSURE(event->GetType() == (uint)NMT_LOADED_GAME);
    613639
    614640    CNetClient* client = (CNetClient*)context;
  • source/network/NetClient.h

     
    184184     * Call when the client has rejoined a running match and finished
    185185     * the loading screen.
    186186     */
    187187    void SendRejoinedMessage();
    188188
     189    /**
     190     * Call when the client has paused or unpaused a running match.
     191     */
     192    void SendPausedMessage(const int paused);
     193
    189194private:
    190195    // Net message / FSM transition handlers
    191196    static bool OnConnect(void* context, CFsmEvent* event);
    192197    static bool OnHandshake(void* context, CFsmEvent* event);
    193198    static bool OnHandshakeResponse(void* context, CFsmEvent* event);
     
    199204    static bool OnInGame(void* context, CFsmEvent* event);
    200205    static bool OnGameStart(void* context, CFsmEvent* event);
    201206    static bool OnJoinSyncStart(void* context, CFsmEvent* event);
    202207    static bool OnJoinSyncEndCommandBatch(void* context, CFsmEvent* event);
    203208    static bool OnRejoined(void* context, CFsmEvent* event);
     209    static bool OnPaused(void* context, CFsmEvent* event);
    204210    static bool OnLoadedGame(void* context, CFsmEvent* event);
    205211
    206212    /**
    207213     * Take ownership of a session object, and use it for all network communication.
    208214     */
  • source/network/NetMessage.cpp

     
    133133
    134134    case NMT_REJOINED:
    135135        pNewMessage = new CRejoinedMessage;
    136136        break;
    137137
     138    case NMT_PAUSED:
     139        pNewMessage = new CPausedMessage;
     140        break;
     141
    138142    case NMT_LOADED_GAME:
    139143        pNewMessage = new CLoadedGameMessage;
    140144        break;
    141145
    142146    case NMT_SERVER_HANDSHAKE:
  • source/network/NetMessages.h

     
    5959
    6060    NMT_REJOINED,
    6161
    6262    NMT_LOADED_GAME,
    6363    NMT_GAME_START,
     64
     65    NMT_PAUSED,
     66
    6467    NMT_END_COMMAND_BATCH,
    6568    NMT_SYNC_CHECK, // OOS-detection hash checking
    6669    NMT_SYNC_ERROR, // OOS-detection error
    6770    NMT_SIMULATION_COMMAND,
    6871    NMT_LAST                // Last message in the list
     
    159162
    160163START_NMT_CLASS_(Rejoined, NMT_REJOINED)
    161164    NMT_FIELD(CStr8, m_GUID)
    162165END_NMT_CLASS()
    163166
     167START_NMT_CLASS_(Paused, NMT_PAUSED)
     168    NMT_FIELD(CStr8, m_GUID)
     169    NMT_FIELD_INT(m_Paused, u8, 1)
     170END_NMT_CLASS()
     171
    164172START_NMT_CLASS_(LoadedGame, NMT_LOADED_GAME)
    165173    NMT_FIELD_INT(m_CurrentTurn, u32, 4)
    166174END_NMT_CLASS()
    167175
    168176START_NMT_CLASS_(GameStart, NMT_GAME_START)
  • source/network/NetServer.cpp

     
    592592
    593593    session->AddTransition(NSS_JOIN_SYNCING, (uint)NMT_CONNECTION_LOST, NSS_UNCONNECTED, (void*)&OnDisconnect, context);
    594594    session->AddTransition(NSS_JOIN_SYNCING, (uint)NMT_LOADED_GAME, NSS_INGAME, (void*)&OnJoinSyncingLoadedGame, context);
    595595
    596596    session->AddTransition(NSS_INGAME, (uint)NMT_REJOINED, NSS_INGAME, (void*)&OnRejoined, context);
     597    session->AddTransition(NSS_INGAME, (uint)NMT_PAUSED, NSS_INGAME, (void*)&OnPaused, context);
    597598    session->AddTransition(NSS_INGAME, (uint)NMT_CONNECTION_LOST, NSS_UNCONNECTED, (void*)&OnDisconnect, context);
    598599    session->AddTransition(NSS_INGAME, (uint)NMT_CHAT, NSS_INGAME, (void*)&OnChat, context);
    599600    session->AddTransition(NSS_INGAME, (uint)NMT_SIMULATION_COMMAND, NSS_INGAME, (void*)&OnInGame, context);
    600601    session->AddTransition(NSS_INGAME, (uint)NMT_SYNC_CHECK, NSS_INGAME, (void*)&OnInGame, context);
    601602    session->AddTransition(NSS_INGAME, (uint)NMT_END_COMMAND_BATCH, NSS_INGAME, (void*)&OnInGame, context);
     
    10011002
    10021003    message->m_GUID = session->GetGUID();
    10031004
    10041005    server.Broadcast(message);
    10051006
     1007    return true;
     1008}
     1009
     1010bool CNetServerWorker::OnPaused(void* context, CFsmEvent* event)
     1011{
     1012    // A client has paused or unpaused the game.
     1013    ENSURE(event->GetType() == (uint)NMT_PAUSED);
     1014
     1015    CNetServerSession* session = (CNetServerSession*)context;
     1016    CNetServerWorker& server = session->GetServer();
     1017
     1018    CPausedMessage* message = (CPausedMessage*)event->GetParamRef();
     1019
     1020    message->m_GUID = session->GetGUID();
     1021
     1022    server.Broadcast(message);
     1023
    10061024    return true;
    10071025}
    10081026
    10091027bool CNetServerWorker::OnDisconnect(void* context, CFsmEvent* event)
    10101028{
  • source/network/NetServer.h

     
    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);
    265265    static bool OnRejoined(void* context, CFsmEvent* event);
     266    static bool OnPaused(void* context, CFsmEvent* event);
    266267    static bool OnDisconnect(void* context, CFsmEvent* event);
    267268
    268269    void CheckGameLoadStatus(CNetServerSession* changedSession);
    269270
    270271    void ConstructPlayerAssignmentMessage(CPlayerAssignmentMessage& message);