diff --git a/src/openrct2-ui/windows/ServerList.cpp b/src/openrct2-ui/windows/ServerList.cpp index 982ea95266..04c90cce80 100644 --- a/src/openrct2-ui/windows/ServerList.cpp +++ b/src/openrct2-ui/windows/ServerList.cpp @@ -405,8 +405,9 @@ static void window_server_list_paint(rct_window *w, rct_drawpixelinfo *dpi) window_draw_widgets(w, dpi); gfx_draw_string_left(dpi, STR_PLAYER_NAME, nullptr, COLOUR_WHITE, w->x + 6, w->y + w->widgets[WIDX_PLAYER_NAME_INPUT].top); - const char * version = NETWORK_STREAM_ID; - gfx_draw_string_left(dpi, STR_NETWORK_VERSION, (void*)&version, COLOUR_WHITE, w->x + 324, w->y + w->widgets[WIDX_START_SERVER].top); + std::string version = network_get_version(); + const char * versionCStr = version.c_str(); + gfx_draw_string_left(dpi, STR_NETWORK_VERSION, (void*)&versionCStr, COLOUR_WHITE, w->x + 324, w->y + w->widgets[WIDX_START_SERVER].top); gfx_draw_string_left(dpi, status_text, (void *)&_numPlayersOnline, COLOUR_WHITE, w->x + 8, w->y + w->height - 15); } @@ -458,7 +459,7 @@ static void window_server_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi compatibilitySpriteId = SPR_G2_RCT1_CLOSE_BUTTON_0; } else { // Server online... check version - bool correctVersion = serverDetails->version == NETWORK_STREAM_ID; + bool correctVersion = serverDetails->version == network_get_version(); compatibilitySpriteId = correctVersion ? SPR_G2_RCT1_OPEN_BUTTON_2 : SPR_G2_RCT1_CLOSE_BUTTON_2; } gfx_draw_sprite(dpi, compatibilitySpriteId, right, y + 1, 0); @@ -552,8 +553,8 @@ static bool server_compare(const server_entry &a, const server_entry &b) } // Then by version - bool serverACompatible = a.version == NETWORK_STREAM_ID; - bool serverBCompatible = b.version == NETWORK_STREAM_ID; + bool serverACompatible = a.version == network_get_version(); + bool serverBCompatible = b.version == network_get_version(); if (serverACompatible != serverBCompatible) { return serverACompatible; @@ -733,5 +734,5 @@ static void fetch_servers_callback(http_response_t* response) static bool is_version_valid(const std::string &version) { - return version.empty() || version == NETWORK_STREAM_ID; + return version.empty() || version == network_get_version(); } diff --git a/src/openrct2/network/Network.cpp b/src/openrct2/network/Network.cpp index 2cfea1e0fe..62a6457315 100644 --- a/src/openrct2/network/Network.cpp +++ b/src/openrct2/network/Network.cpp @@ -30,6 +30,12 @@ #define ACTION_COOLDOWN_TIME_PLACE_SCENERY 20 #define ACTION_COOLDOWN_TIME_DEMOLISH_RIDE 1000 +// This string specifies which version of network stream current build uses. +// It is used for making sure only compatible builds get connected, even within +// single OpenRCT2 version. +#define NETWORK_STREAM_VERSION "33" +#define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION + static rct_peep* _pickup_peep = nullptr; static sint32 _pickup_peep_old_x = LOCATION_NULL; @@ -1018,7 +1024,7 @@ void Network::Client_Send_AUTH(const char* name, const char* password, const cha { std::unique_ptr packet(NetworkPacket::Allocate()); *packet << (uint32)NETWORK_COMMAND_AUTH; - packet->WriteString(NETWORK_STREAM_ID); + packet->WriteString(network_get_version().c_str()); packet->WriteString(name); packet->WriteString(password); packet->WriteString(pubkey); @@ -1072,7 +1078,7 @@ void Network::Server_Send_AUTH(NetworkConnection& connection) std::unique_ptr packet(NetworkPacket::Allocate()); *packet << (uint32)NETWORK_COMMAND_AUTH << (uint32)connection.AuthStatus << new_playerid; if (connection.AuthStatus == NETWORK_AUTH_BADVERSION) { - packet->WriteString(NETWORK_STREAM_ID); + packet->WriteString(network_get_version().c_str()); } connection.QueuePacket(std::move(packet)); if (connection.AuthStatus != NETWORK_AUTH_OK && connection.AuthStatus != NETWORK_AUTH_REQUIREPASSWORD) { @@ -1313,7 +1319,7 @@ void Network::Server_Send_GAMEINFO(NetworkConnection& connection) json_t* obj = json_object(); json_object_set_new(obj, "name", json_string(gConfigNetwork.server_name)); json_object_set_new(obj, "requiresPassword", json_boolean(_password.size() > 0)); - json_object_set_new(obj, "version", json_string(NETWORK_STREAM_ID)); + json_object_set_new(obj, "version", json_string(network_get_version().c_str())); json_object_set_new(obj, "players", json_integer(player_list.size())); json_object_set_new(obj, "maxPlayers", json_integer(gConfigNetwork.maxplayers)); json_object_set_new(obj, "description", json_string(gConfigNetwork.server_description)); @@ -1930,7 +1936,7 @@ void Network::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacket& p const NetworkGroup * group = GetGroupByID(GetGroupIDByHash(connection.Key.PublicKeyHash())); passwordless = group->CanPerformCommand(MISC_COMMAND_PASSWORDLESS_LOGIN); } - if (!gameversion || strcmp(gameversion, NETWORK_STREAM_ID) != 0) { + if (!gameversion || network_get_version() != gameversion) { connection.AuthStatus = NETWORK_AUTH_BADVERSION; } else if (!name) { @@ -3238,6 +3244,11 @@ const utf8 * network_get_server_provider_name() { return gNetwork.ServerProvider const utf8 * network_get_server_provider_email() { return gNetwork.ServerProviderEmail.c_str(); } const utf8 * network_get_server_provider_website() { return gNetwork.ServerProviderWebsite.c_str(); } +std::string network_get_version() +{ + return NETWORK_STREAM_ID; +} + #else sint32 network_get_mode() { return NETWORK_MODE_NONE; } sint32 network_get_status() { return NETWORK_STATUS_NONE; } @@ -3301,4 +3312,5 @@ const utf8 * network_get_server_greeting() { return nullptr; } const utf8 * network_get_server_provider_name() { return nullptr; } const utf8 * network_get_server_provider_email() { return nullptr; } const utf8 * network_get_server_provider_website() { return nullptr; } +std::string network_get_version() { return "Multiplayer disabled"; } #endif /* DISABLE_NETWORK */ diff --git a/src/openrct2/network/network.h b/src/openrct2/network/network.h index bd3baea003..159b0d3877 100644 --- a/src/openrct2/network/network.h +++ b/src/openrct2/network/network.h @@ -47,12 +47,6 @@ struct GameAction; #ifndef DISABLE_NETWORK -// This define specifies which version of network stream current build uses. -// It is used for making sure only compatible builds get connected, even within -// single OpenRCT2 version. -#define NETWORK_STREAM_VERSION "33" -#define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION - #include #include #include @@ -293,8 +287,6 @@ private: std::ofstream _server_log_fs; }; -#else /* DISABLE_NETWORK */ -#define NETWORK_STREAM_ID "Multiplayer disabled" #endif /* DISABLE_NETWORK */ void network_set_env(void * env); @@ -365,3 +357,5 @@ const utf8 * network_get_server_greeting(); const utf8 * network_get_server_provider_name(); const utf8 * network_get_server_provider_email(); const utf8 * network_get_server_provider_website(); + +std::string network_get_version();