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 1/2] 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: From fb8646e66f88913f18a873a3eb25a0bce74174a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 19 Apr 2016 21:15:48 +0200 Subject: [PATCH 2/2] Fix typo in variable name --- src/windows/server_list.c | 58 +++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/src/windows/server_list.c b/src/windows/server_list.c index f16a2f88fe..4c1c8e36c2 100644 --- a/src/windows/server_list.c +++ b/src/windows/server_list.c @@ -50,7 +50,7 @@ typedef struct { } server_entry; static char _playerName[32 + 1]; -static server_entry *_severEntries = NULL; +static server_entry *_serverEntries = NULL; static int _numServerEntries = 0; static SDL_mutex *_mutex = 0; static uint32 _numPlayersOnline = 0; @@ -217,12 +217,12 @@ 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; + if (strcmp(_serverEntries[serverIndex].version, NETWORK_STREAM_ID) != 0) { + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, void *) = _serverEntries[serverIndex].version; window_error_open(STR_UNABLE_TO_CONNECT_TO_SERVER, STR_MULTIPLAYER_INCORRECT_SOFTWARE_VERSION); break; } - char *serverAddress = _severEntries[serverIndex].address; + char *serverAddress = _serverEntries[serverIndex].address; join_server(serverAddress); } }break; @@ -249,19 +249,19 @@ static void window_server_list_dropdown(rct_window *w, int widgetIndex, int drop if (serverIndex < 0) return; if (serverIndex >= _numServerEntries) return; - char *serverAddress = _severEntries[serverIndex].address; + char *serverAddress = _serverEntries[serverIndex].address; 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; + if (strcmp(_serverEntries[serverIndex].version, NETWORK_STREAM_ID) != 0) { + RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, void *) = _serverEntries[serverIndex].version; window_error_open(STR_UNABLE_TO_CONNECT_TO_SERVER, STR_MULTIPLAYER_INCORRECT_SOFTWARE_VERSION); break; } join_server(serverAddress); break; case DDIDX_FAVOURITE: - _severEntries[serverIndex].favourite = !_severEntries[serverIndex].favourite; + _serverEntries[serverIndex].favourite = !_serverEntries[serverIndex].favourite; server_list_save_server_entries(); break; } @@ -287,14 +287,14 @@ static void window_server_list_scroll_mousedown(rct_window *w, int scrollIndex, if (serverIndex < 0) return; if (serverIndex >= _numServerEntries) return; - char *serverAddress = _severEntries[serverIndex].address; + char *serverAddress = _serverEntries[serverIndex].address; rct_widget *listWidget = &w->widgets[WIDX_LIST]; int ddx = w->x + listWidget->left + x + 2 - w->scrolls[0].h_left; int ddy = w->y + listWidget->top + y + 2 - w->scrolls[0].v_top; gDropdownItemsFormat[0] = STR_JOIN_GAME; - if (_severEntries[serverIndex].favourite) { + if (_serverEntries[serverIndex].favourite) { gDropdownItemsFormat[1] = STR_REMOVE_FROM_FAVOURITES; } else { gDropdownItemsFormat[1] = STR_ADD_TO_FAVOURITES; @@ -434,7 +434,7 @@ static void window_server_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi if (y >= dpi->y + dpi->height) continue; // if (y + ITEM_HEIGHT < dpi->y) continue; - server_entry *serverDetails = &_severEntries[i]; + server_entry *serverDetails = &_serverEntries[i]; bool highlighted = i == w->selected_list_item; // Draw hover highlight @@ -541,11 +541,11 @@ static void server_list_load_server_entries() // Read number of server entries SDL_RWread(file, &_numServerEntries, sizeof(uint32), 1); - _severEntries = malloc(_numServerEntries * sizeof(server_entry)); + _serverEntries = malloc(_numServerEntries * sizeof(server_entry)); // Load each server entry for (int i = 0; i < _numServerEntries; i++) { - server_entry *serverInfo = &_severEntries[i]; + server_entry *serverInfo = &_serverEntries[i]; serverInfo->address = freadstralloc(file); serverInfo->name = freadstralloc(file); @@ -578,7 +578,7 @@ static void server_list_save_server_entries() SDL_LockMutex(_mutex); int count = 0; for (int i = 0; i < _numServerEntries; i++) { - server_entry *serverInfo = &_severEntries[i]; + server_entry *serverInfo = &_serverEntries[i]; if (serverInfo->favourite) { count++; } @@ -588,7 +588,7 @@ static void server_list_save_server_entries() // Write each server entry for (int i = 0; i < _numServerEntries; i++) { - server_entry *serverInfo = &_severEntries[i]; + server_entry *serverInfo = &_serverEntries[i]; if (serverInfo->favourite) { SDL_RWwrite(file, serverInfo->address, strlen(serverInfo->address) + 1, 1); SDL_RWwrite(file, serverInfo->name, strlen(serverInfo->name) + 1, 1); @@ -603,12 +603,12 @@ static void server_list_save_server_entries() static void dispose_server_entry_list() { SDL_LockMutex(_mutex); - if (_severEntries != NULL) { + if (_serverEntries != NULL) { for (int i = 0; i < _numServerEntries; i++) { - dispose_server_entry(&_severEntries[i]); + dispose_server_entry(&_serverEntries[i]); } - free(_severEntries); - _severEntries = NULL; + free(_serverEntries); + _serverEntries = NULL; } _numServerEntries = 0; SDL_UnlockMutex(_mutex); @@ -626,21 +626,21 @@ static server_entry* add_server_entry(char *address) { SDL_LockMutex(_mutex); for (int i = 0; i < _numServerEntries; i++) { - if (strcmp(_severEntries[i].address, address) == 0) { + if (strcmp(_serverEntries[i].address, address) == 0) { SDL_UnlockMutex(_mutex); - return &_severEntries[i]; + return &_serverEntries[i]; } } _numServerEntries++; - if (_severEntries == NULL) { - _severEntries = malloc(_numServerEntries * sizeof(server_entry)); + if (_serverEntries == NULL) { + _serverEntries = malloc(_numServerEntries * sizeof(server_entry)); } else { - _severEntries = realloc(_severEntries, _numServerEntries * sizeof(server_entry)); + _serverEntries = realloc(_serverEntries, _numServerEntries * sizeof(server_entry)); } int index = _numServerEntries - 1; - server_entry* newserver = &_severEntries[index]; + server_entry* newserver = &_serverEntries[index]; newserver->address = _strdup(address); newserver->name = _strdup(address); newserver->requiresPassword = false; @@ -658,10 +658,10 @@ static void remove_server_entry(int index) SDL_LockMutex(_mutex); if (_numServerEntries > index) { int serversToMove = _numServerEntries - index - 1; - memmove(&_severEntries[index], &_severEntries[index + 1], serversToMove * sizeof(server_entry)); + memmove(&_serverEntries[index], &_serverEntries[index + 1], serversToMove * sizeof(server_entry)); _numServerEntries--; - _severEntries = realloc(_severEntries, _numServerEntries * sizeof(server_entry)); + _serverEntries = realloc(_serverEntries, _numServerEntries * sizeof(server_entry)); } SDL_UnlockMutex(_mutex); } @@ -709,7 +709,7 @@ static uint32 get_total_player_count() { uint32 numPlayers = 0; for (int i = 0; i < _numServerEntries; i++) { - server_entry *serverDetails = &_severEntries[i]; + server_entry *serverDetails = &_serverEntries[i]; numPlayers += serverDetails->players; } return numPlayers; @@ -725,7 +725,7 @@ static void fetch_servers() SDL_LockMutex(_mutex); for (int i = 0; i < _numServerEntries; i++) { - if (!_severEntries[i].favourite) { + if (!_serverEntries[i].favourite) { remove_server_entry(i); i = 0; }