1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2025-12-23 15:52:55 +01:00

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.
This commit is contained in:
Michał Janiszewski
2016-04-19 00:08:01 +02:00
parent 423844c2fb
commit b2a3b82d08
5 changed files with 26 additions and 10 deletions

View File

@@ -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

View File

@@ -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<NetworkPacket> 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);

View File

@@ -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;

View File

@@ -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;

View File

@@ -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: