From 0adbd1f43a7bf21cc54847b45c0f9b23c410a2e8 Mon Sep 17 00:00:00 2001 From: Hielke Morsink Date: Wed, 20 Feb 2019 22:18:40 +0100 Subject: [PATCH 1/3] Enable kick button only when able to use it Now it's disabled: - When lacking the kick permission - The player is the host - You are the player --- src/openrct2-ui/windows/Player.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/openrct2-ui/windows/Player.cpp b/src/openrct2-ui/windows/Player.cpp index 8f8b32ce47..9e4d1a359d 100644 --- a/src/openrct2-ui/windows/Player.cpp +++ b/src/openrct2-ui/windows/Player.cpp @@ -445,6 +445,12 @@ void window_player_overview_invalidate(rct_window* w) viewport->view_width = viewport->width << viewport->zoom; viewport->view_height = viewport->height << viewport->zoom; } + + // Only enable kick button for other players + const bool canKick = network_can_perform_action(network_get_current_player_group_index(), 15); + const bool isServer = network_get_player_flags(w->number) & NETWORK_PLAYER_FLAG_ISSERVER; + const bool isOwnWindow = (network_get_current_player_id() == w->number); + widget_set_enabled(w, WIDX_KICK, canKick && !isOwnWindow && !isServer); } void window_player_statistics_close(rct_window* w) From d4604433054cb71f70f8a6ead320f31d4feca2bf Mon Sep 17 00:00:00 2001 From: Hielke Morsink Date: Wed, 20 Feb 2019 22:30:12 +0100 Subject: [PATCH 2/3] Introduce network permission enum This enum needs to match the vector. To make sure their sizes are equal, the vector has been changed to an std::array. --- src/openrct2-ui/windows/Player.cpp | 3 +- src/openrct2/network/Network.cpp | 22 +++++++----- src/openrct2/network/NetworkAction.cpp | 48 +++++++++++++------------- src/openrct2/network/NetworkAction.h | 35 +++++++++++++++++-- 4 files changed, 72 insertions(+), 36 deletions(-) diff --git a/src/openrct2-ui/windows/Player.cpp b/src/openrct2-ui/windows/Player.cpp index 9e4d1a359d..d2cfcda983 100644 --- a/src/openrct2-ui/windows/Player.cpp +++ b/src/openrct2-ui/windows/Player.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -447,7 +448,7 @@ void window_player_overview_invalidate(rct_window* w) } // Only enable kick button for other players - const bool canKick = network_can_perform_action(network_get_current_player_group_index(), 15); + const bool canKick = network_can_perform_action(network_get_current_player_group_index(), NETWORK_PERMISSION_KICK_PLAYER); const bool isServer = network_get_player_flags(w->number) & NETWORK_PLAYER_FLAG_ISSERVER; const bool isOwnWindow = (network_get_current_player_id() == w->number); widget_set_enabled(w, WIDX_KICK, canKick && !isOwnWindow && !isServer); diff --git a/src/openrct2/network/Network.cpp b/src/openrct2/network/Network.cpp index 77a73becea..b77db28048 100644 --- a/src/openrct2/network/Network.cpp +++ b/src/openrct2/network/Network.cpp @@ -1149,28 +1149,34 @@ void Network::SaveGroups() void Network::SetupDefaultGroups() { + // Admin group auto admin = std::make_unique(); admin->SetName("Admin"); admin->ActionsAllowed.fill(0xFF); admin->Id = 0; group_list.push_back(std::move(admin)); + + // Spectator group auto spectator = std::make_unique(); spectator->SetName("Spectator"); - spectator->ToggleActionPermission(0); // Chat + spectator->ToggleActionPermission(NETWORK_PERMISSION_CHAT); spectator->Id = 1; group_list.push_back(std::move(spectator)); + + // User group auto user = std::make_unique(); user->SetName("User"); user->ActionsAllowed.fill(0xFF); - user->ToggleActionPermission(15); // Kick Player - user->ToggleActionPermission(16); // Modify Groups - user->ToggleActionPermission(17); // Set Player Group - user->ToggleActionPermission(18); // Cheat - user->ToggleActionPermission(20); // Passwordless login - user->ToggleActionPermission(21); // Modify Tile - user->ToggleActionPermission(22); // Edit Scenario Options + user->ToggleActionPermission(NETWORK_PERMISSION_KICK_PLAYER); + user->ToggleActionPermission(NETWORK_PERMISSION_MODIFY_GROUPS); + user->ToggleActionPermission(NETWORK_PERMISSION_SET_PLAYER_GROUP); + user->ToggleActionPermission(NETWORK_PERMISSION_CHEAT); + user->ToggleActionPermission(NETWORK_PERMISSION_PASSWORDLESS_LOGIN); + user->ToggleActionPermission(NETWORK_PERMISSION_MODIFY_TILE); + user->ToggleActionPermission(NETWORK_PERMISSION_EDIT_SCENARIO_OPTIONS); user->Id = 2; group_list.push_back(std::move(user)); + SetDefaultGroup(1); } diff --git a/src/openrct2/network/NetworkAction.cpp b/src/openrct2/network/NetworkAction.cpp index 0557303d23..f89ac947a0 100644 --- a/src/openrct2/network/NetworkAction.cpp +++ b/src/openrct2/network/NetworkAction.cpp @@ -47,15 +47,15 @@ int32_t NetworkActions::FindCommandByPermissionName(const std::string& permissio return -1; } -const std::vector NetworkActions::Actions = { - { +const std::array NetworkActions::Actions = { + NetworkAction{ STR_ACTION_CHAT, "PERMISSION_CHAT", { MISC_COMMAND_CHAT, }, }, - { + NetworkAction{ STR_ACTION_TERRAFORM, "PERMISSION_TERRAFORM", { @@ -66,7 +66,7 @@ const std::vector NetworkActions::Actions = { GAME_COMMAND_CHANGE_SURFACE_STYLE, }, }, - { + NetworkAction{ STR_ACTION_SET_WATER_LEVEL, "PERMISSION_SET_WATER_LEVEL", { @@ -75,28 +75,28 @@ const std::vector NetworkActions::Actions = { GAME_COMMAND_LOWER_WATER, }, }, - { + NetworkAction{ STR_ACTION_TOGGLE_PAUSE, "PERMISSION_TOGGLE_PAUSE", { GAME_COMMAND_TOGGLE_PAUSE, }, }, - { + NetworkAction{ STR_ACTION_CREATE_RIDE, "PERMISSION_CREATE_RIDE", { GAME_COMMAND_CREATE_RIDE, }, }, - { + NetworkAction{ STR_ACTION_REMOVE_RIDE, "PERMISSION_REMOVE_RIDE", { GAME_COMMAND_DEMOLISH_RIDE, }, }, - { + NetworkAction{ STR_ACTION_BUILD_RIDE, "PERMISSION_BUILD_RIDE", { @@ -109,7 +109,7 @@ const std::vector NetworkActions::Actions = { GAME_COMMAND_REMOVE_RIDE_ENTRANCE_OR_EXIT, }, }, - { + NetworkAction{ STR_ACTION_RIDE_PROPERTIES, "PERMISSION_RIDE_PROPERTIES", { @@ -123,7 +123,7 @@ const std::vector NetworkActions::Actions = { GAME_COMMAND_SET_COLOUR_SCHEME, }, }, - { + NetworkAction{ STR_ACTION_SCENERY, "PERMISSION_SCENERY", { @@ -146,7 +146,7 @@ const std::vector NetworkActions::Actions = { GAME_COMMAND_SET_SIGN_STYLE, }, }, - { + NetworkAction{ STR_ACTION_PATH, "PERMISSION_PATH", { @@ -155,14 +155,14 @@ const std::vector NetworkActions::Actions = { GAME_COMMAND_REMOVE_PATH, }, }, - { + NetworkAction{ STR_ACTION_CLEAR_LANDSCAPE, "PERMISSION_CLEAR_LANDSCAPE", { GAME_COMMAND_CLEAR_SCENERY, }, }, - { + NetworkAction{ STR_ACTION_GUEST, "PERMISSION_GUEST", { @@ -171,7 +171,7 @@ const std::vector NetworkActions::Actions = { GAME_COMMAND_BALLOON_PRESS, }, }, - { + NetworkAction{ STR_ACTION_STAFF, "PERMISSION_STAFF", { @@ -185,7 +185,7 @@ const std::vector NetworkActions::Actions = { GAME_COMMAND_PICKUP_STAFF, }, }, - { + NetworkAction{ STR_ACTION_PARK_PROPERTIES, "PERMISSION_PARK_PROPERTIES", { @@ -199,7 +199,7 @@ const std::vector NetworkActions::Actions = { GAME_COMMAND_PLACE_PEEP_SPAWN, }, }, - { + NetworkAction{ STR_ACTION_PARK_FUNDING, "PERMISSION_PARK_FUNDING", { @@ -208,56 +208,56 @@ const std::vector NetworkActions::Actions = { GAME_COMMAND_START_MARKETING_CAMPAIGN, }, }, - { + NetworkAction{ STR_ACTION_KICK_PLAYER, "PERMISSION_KICK_PLAYER", { GAME_COMMAND_KICK_PLAYER, }, }, - { + NetworkAction{ STR_ACTION_MODIFY_GROUPS, "PERMISSION_MODIFY_GROUPS", { GAME_COMMAND_MODIFY_GROUPS, }, }, - { + NetworkAction{ STR_ACTION_SET_PLAYER_GROUP, "PERMISSION_SET_PLAYER_GROUP", { GAME_COMMAND_SET_PLAYER_GROUP, }, }, - { + NetworkAction{ STR_ACTION_CHEAT, "PERMISSION_CHEAT", { GAME_COMMAND_CHEAT, }, }, - { + NetworkAction{ STR_ACTION_TOGGLE_SCENERY_CLUSTER, "PERMISSION_TOGGLE_SCENERY_CLUSTER", { MISC_COMMAND_TOGGLE_SCENERY_CLUSTER, }, }, - { + NetworkAction{ STR_ACTION_PASSWORDLESS_LOGIN, "PERMISSION_PASSWORDLESS_LOGIN", { MISC_COMMAND_PASSWORDLESS_LOGIN, }, }, - { + NetworkAction{ STR_ACTION_MODIFY_TILE, "PERMISSION_MODIFY_TILE", { GAME_COMMAND_MODIFY_TILE, }, }, - { + NetworkAction{ STR_ACTION_EDIT_SCENARIO_OPTIONS, "PERMISSION_EDIT_SCENARIO_OPTIONS", { diff --git a/src/openrct2/network/NetworkAction.h b/src/openrct2/network/NetworkAction.h index 3bf5a4f58b..b3ba7277be 100644 --- a/src/openrct2/network/NetworkAction.h +++ b/src/openrct2/network/NetworkAction.h @@ -11,8 +11,8 @@ #include "../common.h" +#include #include -#include enum MISC_COMMAND { @@ -21,18 +21,47 @@ enum MISC_COMMAND MISC_COMMAND_PASSWORDLESS_LOGIN = -3, }; +enum NETWORK_PERMISSION +{ + NETWORK_PERMISSION_CHAT, + NETWORK_PERMISSION_TERRAFORM, + NETWORK_PERMISSION_SET_WATER_LEVEL, + NETWORK_PERMISSION_TOGGLE_PAUSE, + NETWORK_PERMISSION_CREATE_RIDE, + NETWORK_PERMISSION_REMOVE_RIDE, + NETWORK_PERMISSION_BUILD_RIDE, + NETWORK_PERMISSION_RIDE_PROPERTIES, + NETWORK_PERMISSION_SCENERY, + NETWORK_PERMISSION_PATH, + NETWORK_PERMISSION_CLEAR_LANDSCAPE, + NETWORK_PERMISSION_GUEST, + NETWORK_PERMISSION_STAFF, + NETWORK_PERMISSION_PARK_PROPERTIES, + NETWORK_PERMISSION_PARK_FUNDING, + NETWORK_PERMISSION_KICK_PLAYER, + NETWORK_PERMISSION_MODIFY_GROUPS, + NETWORK_PERMISSION_SET_PLAYER_GROUP, + NETWORK_PERMISSION_CHEAT, + NETWORK_PERMISSION_TOGGLE_SCENERY_CLUSTER, + NETWORK_PERMISSION_PASSWORDLESS_LOGIN, + NETWORK_PERMISSION_MODIFY_TILE, + NETWORK_PERMISSION_EDIT_SCENARIO_OPTIONS, + + NETWORK_PERMISSION_COUNT, +}; + class NetworkAction final { public: rct_string_id Name; std::string PermissionName; - std::vector Commands; + std::array Commands; }; class NetworkActions final { public: - static const std::vector Actions; + static const std::array Actions; static int32_t FindCommand(int32_t command); static int32_t FindCommandByPermissionName(const std::string& permission_name); From 5f77abba893591a826499a46933ea36774e046ab Mon Sep 17 00:00:00 2001 From: Hielke Morsink Date: Wed, 20 Feb 2019 22:37:29 +0100 Subject: [PATCH 3/3] Add changelog entry --- distribution/changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 17f1b84dcc..b567353d6b 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -24,6 +24,7 @@ - Change: [#8222] The climate setting has been moved from objective options to scenario options. - Change: [#8718] Allow TARMAC object to be removed when running the `remove_unused_objects` command. - Change: [#8718] No longer require the generic scenery groups and tarmac footpath to be checked when creating a scenario. +- Change: [#8734] Disable kick button in multiplayer window when unable to use it. - Fix: [#3832] Changing the colour scheme of track pieces does not work in multiplayer. - Fix: [#5684] Player list can desync between clients and server and can crash. - Fix: [#6191] OpenRCT2 fails to run when the path has an emoji in it.