From b2a3b82d0854fff7a0a80c7c28df0a93427d5c7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 19 Apr 2016 00:08:01 +0200 Subject: [PATCH] Show network version to client if mismatched This will let players know which version should they be using to connect to server. Also prevents users from even trying to join servers running versions we already know are incompatible. --- data/language/english_uk.txt | 2 +- src/network/network.cpp | 12 +++++++++--- src/network/network.h | 2 +- src/windows/network_status.c | 10 +++++----- src/windows/server_list.c | 10 ++++++++++ 5 files changed, 26 insertions(+), 10 deletions(-) diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 4434c3abdd..cfa357f84e 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -4060,7 +4060,7 @@ STR_5751 :No Data STR_5752 :{OUTLINE}{RED}{STRING} has disconnected STR_5753 :{OUTLINE}{RED}{STRING} has disconnected ({STRING}) STR_5754 :Bad Player Name -STR_5755 :Incorrect Software Version +STR_5755 :Incorrect Software Version (Server is using {STRING}) STR_5756 :Bad Password STR_5757 :Server Full STR_5758 :{OUTLINE}{GREEN}{STRING} has joined the game diff --git a/src/network/network.cpp b/src/network/network.cpp index 8752fb944a..01e3c7ba4f 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -478,10 +478,10 @@ void NetworkConnection::setLastDisconnectReason(const char *src) strncpy(last_disconnect_reason, src, NETWORK_DISCONNECT_REASON_BUFFER_SIZE - 1); } -void NetworkConnection::setLastDisconnectReason(const rct_string_id string_id) +void NetworkConnection::setLastDisconnectReason(const rct_string_id string_id, void *args) { char buffer[NETWORK_DISCONNECT_REASON_BUFFER_SIZE]; - format_string(buffer, string_id, NULL); + format_string(buffer, string_id, args); setLastDisconnectReason(buffer); } @@ -1328,6 +1328,9 @@ void Network::Server_Send_AUTH(NetworkConnection& connection) } std::unique_ptr packet = std::move(NetworkPacket::Allocate()); *packet << (uint32)NETWORK_COMMAND_AUTH << (uint32)connection.authstatus << (uint8)new_playerid; + if (connection.authstatus == NETWORK_AUTH_BADVERSION) { + packet->WriteString(NETWORK_STREAM_ID); + } connection.QueuePacket(std::move(packet)); if (connection.authstatus != NETWORK_AUTH_OK && connection.authstatus != NETWORK_AUTH_REQUIREPASSWORD) { shutdown(connection.socket, SHUT_RD); @@ -1696,9 +1699,12 @@ void Network::Client_Handle_AUTH(NetworkConnection& connection, NetworkPacket& p shutdown(connection.socket, SHUT_RDWR); break; case NETWORK_AUTH_BADVERSION: - connection.setLastDisconnectReason(STR_MULTIPLAYER_INCORRECT_SOFTWARE_VERSION); + { + const char *version = packet.ReadString(); + connection.setLastDisconnectReason(STR_MULTIPLAYER_INCORRECT_SOFTWARE_VERSION, &version); shutdown(connection.socket, SHUT_RDWR); break; + } case NETWORK_AUTH_BADPASSWORD: connection.setLastDisconnectReason(STR_MULTIPLAYER_BAD_PASSWORD); shutdown(connection.socket, SHUT_RDWR); diff --git a/src/network/network.h b/src/network/network.h index 8a80808a22..019a5bf09a 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -245,7 +245,7 @@ public: const char *getLastDisconnectReason() const; void setLastDisconnectReason(const char *src); - void setLastDisconnectReason(const rct_string_id string_id); + void setLastDisconnectReason(const rct_string_id string_id, void *args = nullptr); SOCKET socket = INVALID_SOCKET; NetworkPacket inboundpacket; diff --git a/src/windows/network_status.c b/src/windows/network_status.c index da2b84d988..346cb6a09d 100644 --- a/src/windows/network_status.c +++ b/src/windows/network_status.c @@ -35,9 +35,9 @@ enum WINDOW_NETWORK_STATUS_WIDGET_IDX { }; static rct_widget window_network_status_widgets[] = { - { WWT_FRAME, 0, 0, 340, 0, 90, 0x0FFFFFFFF, STR_NONE }, // panel / background - { WWT_CAPTION, 0, 1, 338, 1, 14, STR_NONE, STR_WINDOW_TITLE_TIP }, // title bar - { WWT_CLOSEBOX, 0, 327, 337, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button + { WWT_FRAME, 0, 0, 440, 0, 90, 0x0FFFFFFFF, STR_NONE }, // panel / background + { WWT_CAPTION, 0, 1, 438, 1, 14, STR_NONE, STR_WINDOW_TITLE_TIP }, // title bar + { WWT_CLOSEBOX, 0, 427, 437, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button { WIDGETS_END }, }; @@ -93,7 +93,7 @@ void window_network_status_open(const char* text, close_callback onClose) if (window != NULL) return; - window = window_create_centred(320, 90, &window_network_status_events, WC_NETWORK_STATUS, WF_10 | WF_TRANSPARENT); + window = window_create_centred(420, 90, &window_network_status_events, WC_NETWORK_STATUS, WF_10 | WF_TRANSPARENT); window->widgets = window_network_status_widgets; window->enabled_widgets = 1 << WIDX_CLOSE; @@ -182,7 +182,7 @@ static void window_network_status_paint(rct_window *w, rct_drawpixelinfo *dpi) char* lineCh = buffer; lineCh = utf8_write_codepoint(lineCh, FORMAT_BLACK); strcpy(lineCh, window_network_status_text); - gfx_clip_string(buffer, 230); + gfx_clip_string(buffer, w->widgets[WIDX_BACKGROUND].right - 50); int x = w->x + (w->width / 2); int y = w->y + (w->height / 2); x -= gfx_get_string_width(buffer) / 2; diff --git a/src/windows/server_list.c b/src/windows/server_list.c index a029c2661e..f16a2f88fe 100644 --- a/src/windows/server_list.c +++ b/src/windows/server_list.c @@ -217,6 +217,11 @@ static void window_server_list_mouseup(rct_window *w, int widgetIndex) case WIDX_LIST:{ int serverIndex = w->selected_list_item; if (serverIndex >= 0 && serverIndex < _numServerEntries) { + if (strcmp(_severEntries[serverIndex].version, NETWORK_STREAM_ID) != 0) { + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, void *) = _severEntries[serverIndex].version; + window_error_open(STR_UNABLE_TO_CONNECT_TO_SERVER, STR_MULTIPLAYER_INCORRECT_SOFTWARE_VERSION); + break; + } char *serverAddress = _severEntries[serverIndex].address; join_server(serverAddress); } @@ -248,6 +253,11 @@ static void window_server_list_dropdown(rct_window *w, int widgetIndex, int drop switch (dropdownIndex) { case DDIDX_JOIN: + if (strcmp(_severEntries[serverIndex].version, NETWORK_STREAM_ID) != 0) { + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, void *) = _severEntries[serverIndex].version; + window_error_open(STR_UNABLE_TO_CONNECT_TO_SERVER, STR_MULTIPLAYER_INCORRECT_SOFTWARE_VERSION); + break; + } join_server(serverAddress); break; case DDIDX_FAVOURITE: