From 2a1cab4d46260dfe7930503ca0c3e45f1679269f Mon Sep 17 00:00:00 2001 From: rubidium Date: Thu, 12 Nov 2009 20:33:30 +0000 Subject: (svn r18052) -Codechange/Fix: make the 'pause' chat message when actually executing the pause command. This to prevent showing paused and especially unpaused to be shown when the state doesn't change. Output now mentions whether pause changes keep the game paused and what reasons for pausing there 'currently' are. --- src/network/network.cpp | 52 +++++++++++++++++++++++++++++++++++++----- src/network/network_func.h | 2 ++ src/network/network_server.cpp | 3 --- src/network/network_type.h | 9 -------- 4 files changed, 48 insertions(+), 18 deletions(-) (limited to 'src/network') diff --git a/src/network/network.cpp b/src/network/network.cpp index 957e764fe..b8d79d327 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -35,6 +35,7 @@ #include "../landscape_type.h" #include "../rev.h" #include "../core/pool_func.hpp" +#include "../gfx_func.h" #ifdef DEBUG_DUMP_COMMANDS #include "../fileio_func.h" #endif /* DEBUG_DUMP_COMMANDS */ @@ -216,11 +217,8 @@ void NetworkTextMessage(NetworkAction action, ConsoleColour colour, bool self_se switch (action) { case NETWORK_ACTION_SERVER_MESSAGE: /* Ignore invalid messages */ - if (data >= NETWORK_SERVER_MESSAGE_END) return; - strid = STR_NETWORK_SERVER_MESSAGE; colour = CC_DEFAULT; - data = STR_NETWORK_SERVER_MESSAGE_GAME_PAUSED_PLAYERS + data; break; case NETWORK_ACTION_COMPANY_SPECTATOR: colour = CC_DEFAULT; @@ -352,6 +350,51 @@ StringID GetNetworkErrorMsg(NetworkErrorCode err) return network_error_strings[err]; } +/** + * Handle the pause mode change so we send the right messages to the chat. + * @param prev_mode The previous pause mode. + * @param changed_mode The pause mode that got changed. + */ +void NetworkHandlePauseChange(PauseMode prev_mode, PauseMode changed_mode) +{ + if (!_networking) return; + + switch (changed_mode) { + case PM_PAUSED_NORMAL: + case PM_PAUSED_JOIN: + case PM_PAUSED_ACTIVE_CLIENTS: { + bool changed = ((_pause_mode == PM_UNPAUSED) != (prev_mode == PM_UNPAUSED)); + bool paused = (_pause_mode != PM_UNPAUSED); + if (!paused && !changed) return; + + StringID str; + if (!changed) { + int i = -1; + if ((_pause_mode & PM_PAUSED_NORMAL) != PM_UNPAUSED) SetDParam(++i, STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL); + if ((_pause_mode & PM_PAUSED_JOIN) != PM_UNPAUSED) SetDParam(++i, STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS); + if ((_pause_mode & PM_PAUSED_ACTIVE_CLIENTS) != PM_UNPAUSED) SetDParam(++i, STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS); + str = STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_1 + i; + } else { + switch (changed_mode) { + case PM_PAUSED_NORMAL: SetDParam(0, STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL); break; + case PM_PAUSED_JOIN: SetDParam(0, STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS); break; + case PM_PAUSED_ACTIVE_CLIENTS: SetDParam(0, STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS); break; + default: NOT_REACHED(); + } + str = paused ? STR_NETWORK_SERVER_MESSAGE_GAME_PAUSED : STR_NETWORK_SERVER_MESSAGE_GAME_UNPAUSED; + } + + char buffer[DRAW_STRING_BUFFER]; + GetString(buffer, str, lastof(buffer)); + NetworkTextMessage(NETWORK_ACTION_SERVER_MESSAGE, CC_DEFAULT, false, NULL, buffer); + } break; + + default: + return; + } +} + + /** * Counts the number of active clients connected. * It has to be in STATUS_ACTIVE and not a spectator @@ -380,12 +423,10 @@ static void CheckMinActiveClients() if ((_pause_mode & PM_PAUSED_ACTIVE_CLIENTS) != 0) return; DoCommandP(0, PM_PAUSED_ACTIVE_CLIENTS, 1, CMD_PAUSE); - NetworkServerSendChat(NETWORK_ACTION_SERVER_MESSAGE, DESTTYPE_BROADCAST, 0, "", CLIENT_ID_SERVER, NETWORK_SERVER_MESSAGE_GAME_PAUSED_PLAYERS); } else { if ((_pause_mode & PM_PAUSED_ACTIVE_CLIENTS) == 0) return; DoCommandP(0, PM_PAUSED_ACTIVE_CLIENTS, 0, CMD_PAUSE); - NetworkServerSendChat(NETWORK_ACTION_SERVER_MESSAGE, DESTTYPE_BROADCAST, 0, "", CLIENT_ID_SERVER, NETWORK_SERVER_MESSAGE_GAME_UNPAUSED_PLAYERS); } } @@ -488,7 +529,6 @@ void NetworkCloseClient(NetworkClientSocket *cs, bool error) /* When the client was PRE_ACTIVE, the server was in pause mode, so unpause */ if (cs->status == STATUS_PRE_ACTIVE && (_pause_mode & PM_PAUSED_JOIN)) { DoCommandP(0, PM_PAUSED_JOIN, 0, CMD_PAUSE); - NetworkServerSendChat(NETWORK_ACTION_SERVER_MESSAGE, DESTTYPE_BROADCAST, 0, "", CLIENT_ID_SERVER, NETWORK_SERVER_MESSAGE_GAME_UNPAUSED_CONNECT); } if (_network_server) { diff --git a/src/network/network_func.h b/src/network/network_func.h index d1b9187bc..e6e6a30fd 100644 --- a/src/network/network_func.h +++ b/src/network/network_func.h @@ -17,6 +17,7 @@ #include "../console_type.h" #include "../gfx_type.h" #include "../core/smallvec_type.hpp" +#include "../openttd.h" #ifdef ENABLE_NETWORK @@ -56,6 +57,7 @@ bool NetworkCompanyIsPassworded(CompanyID company_id); bool NetworkMaxCompaniesReached(); bool NetworkMaxSpectatorsReached(); void NetworkPrintClients(); +void NetworkHandlePauseChange(PauseMode prev_mode, PauseMode changed_mode); /*** Commands ran by the server ***/ void NetworkServerMonthlyLoop(); diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 887b6da72..efb005935 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -832,8 +832,6 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_MAP_OK) if (_settings_client.network.pause_on_join) { /* Now pause the game till the client is in sync */ DoCommandP(0, PM_PAUSED_JOIN, 1, CMD_PAUSE); - - NetworkServerSendChat(NETWORK_ACTION_SERVER_MESSAGE, DESTTYPE_BROADCAST, 0, "", CLIENT_ID_SERVER, NETWORK_SERVER_MESSAGE_GAME_PAUSED_CONNECT); } /* also update the new client with our max values */ @@ -1026,7 +1024,6 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_ACK) if (_pause_mode & PM_PAUSED_JOIN) { DoCommandP(0, PM_PAUSED_JOIN, 0, CMD_PAUSE); - NetworkServerSendChat(NETWORK_ACTION_SERVER_MESSAGE, DESTTYPE_BROADCAST, 0, "", CLIENT_ID_SERVER, NETWORK_SERVER_MESSAGE_GAME_UNPAUSED_CONNECT); } /* Execute script for, e.g. MOTD */ diff --git a/src/network/network_type.h b/src/network/network_type.h index 0daaca0e0..4d5fcee69 100644 --- a/src/network/network_type.h +++ b/src/network/network_type.h @@ -86,15 +86,6 @@ enum NetworkAction { NETWORK_ACTION_COMPANY_NEW, }; -/** Messages the server can give */ -enum NetworkServerMessage { - NETWORK_SERVER_MESSAGE_GAME_PAUSED_PLAYERS, ///< Game paused (not enough players) - NETWORK_SERVER_MESSAGE_GAME_UNPAUSED_PLAYERS, ///< Game unpaused (enough players) - NETWORK_SERVER_MESSAGE_GAME_PAUSED_CONNECT, ///< Game paused (connecting clients) - NETWORK_SERVER_MESSAGE_GAME_UNPAUSED_CONNECT, ///< Game unpaused (no connecting clients) - NETWORK_SERVER_MESSAGE_END -}; - enum NetworkErrorCode { NETWORK_ERROR_GENERAL, // Try to use this one like never -- cgit v1.2.3-54-g00ecf