Merge pull request #3354 from zsilencer/bugfixes

Various bug fixes to multiplayer / network.
This commit is contained in:
Ted John 2016-04-20 12:26:55 +01:00
commit 3dc2651742
7 changed files with 51 additions and 69 deletions

View File

@ -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();
}

View File

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

View File

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

View File

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

View File

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

View File

@ -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 *) = "";
}
}

View File

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