mirror of https://github.com/OpenRCT2/OpenRCT2.git
Merge pull request #3354 from zsilencer/bugfixes
Various bug fixes to multiplayer / network.
This commit is contained in:
commit
3dc2651742
|
@ -925,7 +925,6 @@ bool game_load_save(const utf8 *path)
|
|||
|
||||
if (result) {
|
||||
game_load_init();
|
||||
network_free_string_ids();
|
||||
if (network_get_mode() == NETWORK_MODE_SERVER) {
|
||||
network_send_map();
|
||||
}
|
||||
|
|
|
@ -105,6 +105,7 @@ enum {
|
|||
STR_CREDIT_SPARE_5 = 862,
|
||||
STR_CREDIT_SPARE_6 = 863,
|
||||
STR_CREDIT_SPARE_7 = 864,
|
||||
STR_STRINGID = 865,
|
||||
|
||||
STR_DROPDOWN_GLYPH = 876,
|
||||
STR_TOO_LOW = 877,
|
||||
|
@ -417,6 +418,7 @@ enum {
|
|||
|
||||
STR_OPTIONS_TITLE = 1168,
|
||||
STR_SOUND_NONE = 1169,
|
||||
STR_STRING = 1170,
|
||||
|
||||
STR_RIDE_ENTRANCE_CLOSED = 1171,
|
||||
STR_RIDE_ENTRANCE_NAME = 1172,
|
||||
|
@ -2364,9 +2366,9 @@ enum {
|
|||
STR_CHEAT_NEVERENDING_MARKETING = 5740,
|
||||
STR_CHEAT_TIP_NEVERENDING_MARKETING = 5741,
|
||||
|
||||
STR_MULTIPLAYER_RESOLVING = 5742,
|
||||
STR_MULTIPLAYER_AUTHENTICATING = 5742,
|
||||
STR_MULTIPLAYER_CONNECTING = 5743,
|
||||
STR_MULTIPLAYER_AUTHENTICATING = 5744,
|
||||
STR_MULTIPLAYER_RESOLVING = 5744,
|
||||
STR_MULTIPLAYER_DESYNC = 5745,
|
||||
STR_MULTIPLAYER_DISCONNECTED_NO_REASON = 5746,
|
||||
STR_MULTIPLAYER_DISCONNECTED_WITH_REASON = 5747,
|
||||
|
|
|
@ -237,13 +237,12 @@ int NetworkActions::FindCommand(int command)
|
|||
|
||||
NetworkGroup::NetworkGroup()
|
||||
{
|
||||
name_string_id = STR_NONE;
|
||||
actions_allowed = {0};
|
||||
}
|
||||
|
||||
NetworkGroup::~NetworkGroup()
|
||||
{
|
||||
FreeNameStringId();
|
||||
|
||||
}
|
||||
|
||||
void NetworkGroup::Read(NetworkPacket& packet)
|
||||
|
@ -264,14 +263,6 @@ void NetworkGroup::Write(NetworkPacket& packet)
|
|||
}
|
||||
}
|
||||
|
||||
void NetworkGroup::FreeNameStringId()
|
||||
{
|
||||
if (name_string_id != STR_NONE) {
|
||||
user_string_free(name_string_id);
|
||||
name_string_id = STR_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
void NetworkGroup::ToggleActionPermission(size_t index)
|
||||
{
|
||||
size_t byte = index / 8;
|
||||
|
@ -308,18 +299,9 @@ std::string& NetworkGroup::GetName()
|
|||
|
||||
void NetworkGroup::SetName(std::string name)
|
||||
{
|
||||
FreeNameStringId();
|
||||
NetworkGroup::name = name;
|
||||
}
|
||||
|
||||
rct_string_id NetworkGroup::GetNameStringId()
|
||||
{
|
||||
if (name_string_id == STR_NONE) {
|
||||
name_string_id = user_string_allocate(128, name.c_str());
|
||||
}
|
||||
return name_string_id;
|
||||
}
|
||||
|
||||
NetworkConnection::NetworkConnection()
|
||||
{
|
||||
authstatus = NETWORK_AUTH_NONE;
|
||||
|
@ -623,7 +605,7 @@ void Network::Close()
|
|||
mode = NETWORK_MODE_NONE;
|
||||
status = NETWORK_STATUS_NONE;
|
||||
server_connection.authstatus = NETWORK_AUTH_NONE;
|
||||
|
||||
server_connection.inboundpacket.Clear();
|
||||
server_connection.setLastDisconnectReason(nullptr);
|
||||
|
||||
client_connection_list.clear();
|
||||
|
@ -1302,13 +1284,6 @@ void Network::LoadGroups()
|
|||
SDL_RWclose(file);
|
||||
}
|
||||
|
||||
void Network::FreeStringIds()
|
||||
{
|
||||
for (auto it = group_list.begin(); it != group_list.end(); it++) {
|
||||
(*it)->FreeNameStringId();
|
||||
}
|
||||
}
|
||||
|
||||
void Network::Client_Send_AUTH(const char* name, const char* password)
|
||||
{
|
||||
std::unique_ptr<NetworkPacket> packet = std::move(NetworkPacket::Allocate());
|
||||
|
@ -1358,7 +1333,7 @@ void Network::Server_Send_MAP(NetworkConnection* connection)
|
|||
SDL_RWclose(rw);
|
||||
return;
|
||||
}
|
||||
size_t chunksize = 1024;
|
||||
size_t chunksize = 65000;
|
||||
size_t out_size = size;
|
||||
unsigned char *compressed = util_zlib_deflate(&buffer[0], size, &out_size);
|
||||
unsigned char *header;
|
||||
|
@ -1767,8 +1742,8 @@ void Network::Client_Handle_MAP(NetworkConnection& connection, NetworkPacket& pa
|
|||
if (chunksize <= 0) {
|
||||
return;
|
||||
}
|
||||
if (offset + chunksize > chunk_buffer.size()) {
|
||||
chunk_buffer.resize(offset + chunksize);
|
||||
if (size > chunk_buffer.size()) {
|
||||
chunk_buffer.resize(size);
|
||||
}
|
||||
char str_downloading_map[256];
|
||||
unsigned int downloading_map_args[2] = {(offset + chunksize) / 1024, size / 1024};
|
||||
|
@ -2217,11 +2192,6 @@ const char* network_get_group_name(unsigned int index)
|
|||
return gNetwork.group_list[index]->GetName().c_str();
|
||||
}
|
||||
|
||||
rct_string_id network_get_group_name_string_id(unsigned int index)
|
||||
{
|
||||
return gNetwork.group_list[index]->GetNameStringId();
|
||||
}
|
||||
|
||||
void network_chat_show_connected_message()
|
||||
{
|
||||
char *templateString = (char*)language_get_string(STR_INDIVIDUAL_KEYS_BASE);
|
||||
|
@ -2436,11 +2406,6 @@ int network_get_current_player_group_index()
|
|||
return network_get_group_index(gNetwork.GetPlayerByID(gNetwork.GetPlayerID())->group);
|
||||
}
|
||||
|
||||
void network_free_string_ids()
|
||||
{
|
||||
gNetwork.FreeStringIds();
|
||||
}
|
||||
|
||||
void network_send_map()
|
||||
{
|
||||
gNetwork.Server_Send_MAP();
|
||||
|
|
|
@ -214,19 +214,16 @@ public:
|
|||
~NetworkGroup();
|
||||
void Read(NetworkPacket& packet);
|
||||
void Write(NetworkPacket& packet);
|
||||
void FreeNameStringId();
|
||||
void ToggleActionPermission(size_t index);
|
||||
bool CanPerformAction(size_t index);
|
||||
bool CanPerformCommand(int command);
|
||||
std::string& GetName();
|
||||
void SetName(std::string name);
|
||||
rct_string_id GetNameStringId();
|
||||
std::array<uint8, 8> actions_allowed;
|
||||
uint8 id = 0;
|
||||
|
||||
private:
|
||||
std::string name;
|
||||
rct_string_id name_string_id;
|
||||
};
|
||||
|
||||
class NetworkConnection
|
||||
|
@ -320,7 +317,6 @@ public:
|
|||
void SetDefaultGroup(uint8 id);
|
||||
void SaveGroups();
|
||||
void LoadGroups();
|
||||
void FreeStringIds();
|
||||
|
||||
void Client_Send_AUTH(const char* name, const char* password);
|
||||
void Server_Send_AUTH(NetworkConnection& connection);
|
||||
|
@ -458,7 +454,6 @@ int network_get_current_player_group_index();
|
|||
uint8 network_get_group_id(unsigned int index);
|
||||
int network_get_num_groups();
|
||||
const char* network_get_group_name(unsigned int index);
|
||||
rct_string_id network_get_group_name_string_id(unsigned int index);
|
||||
void game_command_set_player_group(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp);
|
||||
void game_command_modify_groups(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp);
|
||||
void game_command_kick_player(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp);
|
||||
|
@ -467,7 +462,6 @@ int network_get_num_actions();
|
|||
rct_string_id network_get_action_name_string_id(unsigned int index);
|
||||
int network_can_perform_action(unsigned int groupindex, unsigned int index);
|
||||
int network_can_perform_command(unsigned int groupindex, unsigned int index);
|
||||
void network_free_string_ids();
|
||||
|
||||
void network_send_map();
|
||||
void network_send_chat(const char* text);
|
||||
|
|
|
@ -263,8 +263,8 @@ static void window_multiplayer_groups_show_group_dropdown(rct_window *w, rct_wid
|
|||
);
|
||||
|
||||
for (i = 0; i < network_get_num_groups(); i++) {
|
||||
gDropdownItemsFormat[i] = 1142;
|
||||
gDropdownItemsArgs[i] = network_get_group_name_string_id(i);
|
||||
gDropdownItemsFormat[i] = 2777;
|
||||
gDropdownItemsArgs[i] = (sint64)network_get_group_name(i);
|
||||
}
|
||||
if (widget == &window_multiplayer_groups_widgets[WIDX_DEFAULT_GROUP_DROPDOWN]) {
|
||||
dropdown_set_checked(network_get_group_index(network_get_default_group()), true);
|
||||
|
@ -617,10 +617,15 @@ static void window_multiplayer_groups_paint(rct_window *w, rct_drawpixelinfo *dp
|
|||
rct_widget* widget = &window_multiplayer_groups_widgets[WIDX_DEFAULT_GROUP];
|
||||
int group = network_get_group_index(network_get_default_group());
|
||||
if (group != -1) {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = network_get_group_name_string_id(group);
|
||||
char buffer[300] = {0};
|
||||
char* lineCh;
|
||||
lineCh = buffer;
|
||||
lineCh = utf8_write_codepoint(lineCh, FORMAT_WINDOW_COLOUR_2);
|
||||
strcpy(lineCh, network_get_group_name(group));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, const char *) = buffer;
|
||||
gfx_draw_string_centred_clipped(
|
||||
dpi,
|
||||
1193,
|
||||
STR_STRING,
|
||||
(void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS,
|
||||
0,
|
||||
w->x + (widget->left + widget->right - 11) / 2,
|
||||
|
@ -641,10 +646,15 @@ static void window_multiplayer_groups_paint(rct_window *w, rct_drawpixelinfo *dp
|
|||
widget = &window_multiplayer_groups_widgets[WIDX_SELECTED_GROUP];
|
||||
group = network_get_group_index(_selectedGroup);
|
||||
if (group != -1) {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = network_get_group_name_string_id(group);
|
||||
char buffer[300] = {0};
|
||||
char* lineCh;
|
||||
lineCh = buffer;
|
||||
lineCh = utf8_write_codepoint(lineCh, FORMAT_WINDOW_COLOUR_2);
|
||||
strcpy(lineCh, network_get_group_name(group));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, const char *) = buffer;
|
||||
gfx_draw_string_centred_clipped(
|
||||
dpi,
|
||||
1193,
|
||||
STR_STRING,
|
||||
(void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS,
|
||||
0,
|
||||
w->x + (widget->left + widget->right - 11) / 2,
|
||||
|
|
|
@ -66,7 +66,7 @@ enum WINDOW_PLAYER_WIDGET_IDX {
|
|||
|
||||
#define WINDOW_PLAYER_COMMON_WIDGETS \
|
||||
{ WWT_FRAME, 0, 0, 191, 0, 156, 0x0FFFFFFFF, STR_NONE }, /* Panel / Background */ \
|
||||
{ WWT_CAPTION, 0, 1, 190, 1, 14, 865, STR_WINDOW_TITLE_TIP }, /* Title */ \
|
||||
{ WWT_CAPTION, 0, 1, 190, 1, 14, STR_STRING, STR_WINDOW_TITLE_TIP }, /* Title */ \
|
||||
{ WWT_CLOSEBOX, 0, 179, 189, 2, 13, 824, STR_CLOSE_WINDOW_TIP }, /* Close x button */ \
|
||||
{ WWT_RESIZE, 1, 0, 191, 43, 156, 0x0FFFFFFFF, STR_NONE }, /* Resize */ \
|
||||
{ WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_NONE }, /* Tab 1 */ \
|
||||
|
@ -184,6 +184,7 @@ static rct_window_event_list *window_player_page_events[] = {
|
|||
static void window_player_set_page(rct_window* w, int page);
|
||||
static void window_player_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w);
|
||||
static void window_player_update_viewport(rct_window *w, bool scroll);
|
||||
static void window_player_update_title(rct_window* w);
|
||||
|
||||
uint32 window_player_page_enabled_widgets[] = {
|
||||
(1 << WIDX_CLOSE) |
|
||||
|
@ -222,7 +223,6 @@ void window_player_open(uint8 id)
|
|||
window->selected_list_item = -1;
|
||||
|
||||
window->viewport_focus_coordinates.y = -1;
|
||||
window->error.var_480 = user_string_allocate(128, network_get_player_name(player)); // repurposing var_480 to store this
|
||||
}
|
||||
|
||||
window->page = 0;
|
||||
|
@ -262,8 +262,8 @@ void window_player_overview_show_group_dropdown(rct_window *w, rct_widget *widge
|
|||
);
|
||||
|
||||
for (i = 0; i < network_get_num_groups(); i++) {
|
||||
gDropdownItemsFormat[i] = 1142;
|
||||
gDropdownItemsArgs[i] = network_get_group_name_string_id(i);
|
||||
gDropdownItemsFormat[i] = 2777;
|
||||
gDropdownItemsArgs[i] = (sint64)network_get_group_name(i);
|
||||
}
|
||||
|
||||
dropdown_set_checked(network_get_group_index(network_get_player_group(player)), true);
|
||||
|
@ -271,10 +271,7 @@ void window_player_overview_show_group_dropdown(rct_window *w, rct_widget *widge
|
|||
|
||||
void window_player_overview_close(rct_window *w)
|
||||
{
|
||||
if (w->error.var_480){
|
||||
user_string_free(w->error.var_480);
|
||||
w->error.var_480 = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void window_player_overview_mouse_up(rct_window *w, int widgetIndex)
|
||||
|
@ -369,11 +366,16 @@ void window_player_overview_paint(rct_window *w, rct_drawpixelinfo *dpi)
|
|||
int groupindex = network_get_group_index(network_get_player_group(player));
|
||||
if (groupindex != -1) {
|
||||
rct_widget* widget = &window_player_overview_widgets[WIDX_GROUP];
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = network_get_group_name_string_id(groupindex);
|
||||
char buffer[300] = {0};
|
||||
char* lineCh;
|
||||
lineCh = buffer;
|
||||
lineCh = utf8_write_codepoint(lineCh, FORMAT_WINDOW_COLOUR_2);
|
||||
strcpy(lineCh, network_get_group_name(groupindex));
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, const char *) = buffer;
|
||||
|
||||
gfx_draw_string_centred_clipped(
|
||||
dpi,
|
||||
1193,
|
||||
STR_STRING,
|
||||
(void*)RCT2_ADDRESS_COMMON_FORMAT_ARGS,
|
||||
0,
|
||||
w->x + (widget->left + widget->right - 11) / 2,
|
||||
|
@ -421,7 +423,7 @@ void window_player_overview_invalidate(rct_window *w)
|
|||
w->pressed_widgets &= ~(WIDX_TAB_2);
|
||||
w->pressed_widgets |= 1ULL << (w->page + WIDX_TAB_1);
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = w->error.var_480; // set title caption to player name
|
||||
window_player_update_title(w);
|
||||
|
||||
w->widgets[WIDX_BACKGROUND].right = w->width - 1;
|
||||
w->widgets[WIDX_BACKGROUND].bottom = w->height - 1;
|
||||
|
@ -507,7 +509,7 @@ void window_player_statistics_invalidate(rct_window *w)
|
|||
w->pressed_widgets &= ~(WIDX_TAB_2);
|
||||
w->pressed_widgets |= 1ULL << (w->page + WIDX_TAB_1);
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, uint16) = w->error.var_480; // set title caption to player name
|
||||
window_player_update_title(w);
|
||||
|
||||
w->widgets[WIDX_BACKGROUND].right = w->width - 1;
|
||||
w->widgets[WIDX_BACKGROUND].bottom = w->height - 1;
|
||||
|
@ -647,3 +649,13 @@ static void window_player_update_viewport(rct_window *w, bool scroll)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void window_player_update_title(rct_window* w)
|
||||
{
|
||||
int player = network_get_player_index((uint8)w->number);
|
||||
if (player != -1) {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, const char *) = network_get_player_name(player); // set title caption to player name
|
||||
} else {
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS, const char *) = "";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -217,7 +217,7 @@ 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(_serverEntries[serverIndex].version, NETWORK_STREAM_ID) != 0) {
|
||||
if (strcmp(_serverEntries[serverIndex].version, NETWORK_STREAM_ID) != 0 && strcmp(_serverEntries[serverIndex].version, "") != 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;
|
||||
|
@ -253,7 +253,7 @@ static void window_server_list_dropdown(rct_window *w, int widgetIndex, int drop
|
|||
|
||||
switch (dropdownIndex) {
|
||||
case DDIDX_JOIN:
|
||||
if (strcmp(_serverEntries[serverIndex].version, NETWORK_STREAM_ID) != 0) {
|
||||
if (strcmp(_serverEntries[serverIndex].version, NETWORK_STREAM_ID) != 0 && strcmp(_serverEntries[serverIndex].version, "") != 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;
|
||||
|
|
Loading…
Reference in New Issue