mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2025-12-24 00:03:11 +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:
@@ -4060,7 +4060,7 @@ STR_5751 :No Data
|
|||||||
STR_5752 :{OUTLINE}{RED}{STRING} has disconnected
|
STR_5752 :{OUTLINE}{RED}{STRING} has disconnected
|
||||||
STR_5753 :{OUTLINE}{RED}{STRING} has disconnected ({STRING})
|
STR_5753 :{OUTLINE}{RED}{STRING} has disconnected ({STRING})
|
||||||
STR_5754 :Bad Player Name
|
STR_5754 :Bad Player Name
|
||||||
STR_5755 :Incorrect Software Version
|
STR_5755 :Incorrect Software Version (Server is using {STRING})
|
||||||
STR_5756 :Bad Password
|
STR_5756 :Bad Password
|
||||||
STR_5757 :Server Full
|
STR_5757 :Server Full
|
||||||
STR_5758 :{OUTLINE}{GREEN}{STRING} has joined the game
|
STR_5758 :{OUTLINE}{GREEN}{STRING} has joined the game
|
||||||
|
|||||||
@@ -478,10 +478,10 @@ void NetworkConnection::setLastDisconnectReason(const char *src)
|
|||||||
strncpy(last_disconnect_reason, src, NETWORK_DISCONNECT_REASON_BUFFER_SIZE - 1);
|
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];
|
char buffer[NETWORK_DISCONNECT_REASON_BUFFER_SIZE];
|
||||||
format_string(buffer, string_id, NULL);
|
format_string(buffer, string_id, args);
|
||||||
setLastDisconnectReason(buffer);
|
setLastDisconnectReason(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1328,6 +1328,9 @@ void Network::Server_Send_AUTH(NetworkConnection& connection)
|
|||||||
}
|
}
|
||||||
std::unique_ptr<NetworkPacket> packet = std::move(NetworkPacket::Allocate());
|
std::unique_ptr<NetworkPacket> packet = std::move(NetworkPacket::Allocate());
|
||||||
*packet << (uint32)NETWORK_COMMAND_AUTH << (uint32)connection.authstatus << (uint8)new_playerid;
|
*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));
|
connection.QueuePacket(std::move(packet));
|
||||||
if (connection.authstatus != NETWORK_AUTH_OK && connection.authstatus != NETWORK_AUTH_REQUIREPASSWORD) {
|
if (connection.authstatus != NETWORK_AUTH_OK && connection.authstatus != NETWORK_AUTH_REQUIREPASSWORD) {
|
||||||
shutdown(connection.socket, SHUT_RD);
|
shutdown(connection.socket, SHUT_RD);
|
||||||
@@ -1696,9 +1699,12 @@ void Network::Client_Handle_AUTH(NetworkConnection& connection, NetworkPacket& p
|
|||||||
shutdown(connection.socket, SHUT_RDWR);
|
shutdown(connection.socket, SHUT_RDWR);
|
||||||
break;
|
break;
|
||||||
case NETWORK_AUTH_BADVERSION:
|
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);
|
shutdown(connection.socket, SHUT_RDWR);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case NETWORK_AUTH_BADPASSWORD:
|
case NETWORK_AUTH_BADPASSWORD:
|
||||||
connection.setLastDisconnectReason(STR_MULTIPLAYER_BAD_PASSWORD);
|
connection.setLastDisconnectReason(STR_MULTIPLAYER_BAD_PASSWORD);
|
||||||
shutdown(connection.socket, SHUT_RDWR);
|
shutdown(connection.socket, SHUT_RDWR);
|
||||||
|
|||||||
@@ -245,7 +245,7 @@ public:
|
|||||||
|
|
||||||
const char *getLastDisconnectReason() const;
|
const char *getLastDisconnectReason() const;
|
||||||
void setLastDisconnectReason(const char *src);
|
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;
|
SOCKET socket = INVALID_SOCKET;
|
||||||
NetworkPacket inboundpacket;
|
NetworkPacket inboundpacket;
|
||||||
|
|||||||
@@ -35,9 +35,9 @@ enum WINDOW_NETWORK_STATUS_WIDGET_IDX {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static rct_widget window_network_status_widgets[] = {
|
static rct_widget window_network_status_widgets[] = {
|
||||||
{ WWT_FRAME, 0, 0, 340, 0, 90, 0x0FFFFFFFF, STR_NONE }, // panel / background
|
{ WWT_FRAME, 0, 0, 440, 0, 90, 0x0FFFFFFFF, STR_NONE }, // panel / background
|
||||||
{ WWT_CAPTION, 0, 1, 338, 1, 14, STR_NONE, STR_WINDOW_TITLE_TIP }, // title bar
|
{ WWT_CAPTION, 0, 1, 438, 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_CLOSEBOX, 0, 427, 437, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button
|
||||||
{ WIDGETS_END },
|
{ WIDGETS_END },
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -93,7 +93,7 @@ void window_network_status_open(const char* text, close_callback onClose)
|
|||||||
if (window != NULL)
|
if (window != NULL)
|
||||||
return;
|
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->widgets = window_network_status_widgets;
|
||||||
window->enabled_widgets = 1 << WIDX_CLOSE;
|
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;
|
char* lineCh = buffer;
|
||||||
lineCh = utf8_write_codepoint(lineCh, FORMAT_BLACK);
|
lineCh = utf8_write_codepoint(lineCh, FORMAT_BLACK);
|
||||||
strcpy(lineCh, window_network_status_text);
|
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 x = w->x + (w->width / 2);
|
||||||
int y = w->y + (w->height / 2);
|
int y = w->y + (w->height / 2);
|
||||||
x -= gfx_get_string_width(buffer) / 2;
|
x -= gfx_get_string_width(buffer) / 2;
|
||||||
|
|||||||
@@ -217,6 +217,11 @@ static void window_server_list_mouseup(rct_window *w, int widgetIndex)
|
|||||||
case WIDX_LIST:{
|
case WIDX_LIST:{
|
||||||
int serverIndex = w->selected_list_item;
|
int serverIndex = w->selected_list_item;
|
||||||
if (serverIndex >= 0 && serverIndex < _numServerEntries) {
|
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;
|
char *serverAddress = _severEntries[serverIndex].address;
|
||||||
join_server(serverAddress);
|
join_server(serverAddress);
|
||||||
}
|
}
|
||||||
@@ -248,6 +253,11 @@ static void window_server_list_dropdown(rct_window *w, int widgetIndex, int drop
|
|||||||
|
|
||||||
switch (dropdownIndex) {
|
switch (dropdownIndex) {
|
||||||
case DDIDX_JOIN:
|
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);
|
join_server(serverAddress);
|
||||||
break;
|
break;
|
||||||
case DDIDX_FAVOURITE:
|
case DDIDX_FAVOURITE:
|
||||||
|
|||||||
Reference in New Issue
Block a user