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: