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:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user