From 1eb7f4d8c657360b730067202327078e5c45428a Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 12 May 2019 18:54:41 +0100 Subject: [PATCH 1/4] Implement Modify Group and Kick Player Actions. Further work on the Game Actions porting --- src/openrct2-ui/windows/Multiplayer.cpp | 41 ++-- src/openrct2-ui/windows/Player.cpp | 8 +- src/openrct2/Game.cpp | 4 +- src/openrct2/Game.h | 6 +- .../actions/GameActionRegistration.cpp | 4 + .../actions/NetworkModifyGroupAction.hpp | 81 ++++++++ src/openrct2/actions/PlayerKickAction.hpp | 50 +++++ src/openrct2/network/Network.cpp | 182 +++++++----------- src/openrct2/network/network.h | 10 +- 9 files changed, 245 insertions(+), 141 deletions(-) create mode 100644 src/openrct2/actions/NetworkModifyGroupAction.hpp create mode 100644 src/openrct2/actions/PlayerKickAction.hpp diff --git a/src/openrct2-ui/windows/Multiplayer.cpp b/src/openrct2-ui/windows/Multiplayer.cpp index a9db4551f3..de0d4f77f5 100644 --- a/src/openrct2-ui/windows/Multiplayer.cpp +++ b/src/openrct2-ui/windows/Multiplayer.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -741,11 +742,17 @@ static void window_multiplayer_groups_mouseup(rct_window* w, rct_widgetindex wid } break; case WIDX_ADD_GROUP: - game_do_command(0, GAME_COMMAND_FLAG_APPLY, 0, 0, GAME_COMMAND_MODIFY_GROUPS, 0, 0); - break; + { + auto networkModifyGroup = NetworkModifyGroupAction(ModifyGroupType::AddGroup); + GameActions::Execute(&networkModifyGroup); + } + break; case WIDX_REMOVE_GROUP: - game_do_command(1 | (_selectedGroup << 8), GAME_COMMAND_FLAG_APPLY, 0, 0, GAME_COMMAND_MODIFY_GROUPS, 0, 0); - break; + { + auto networkModifyGroup = NetworkModifyGroupAction(ModifyGroupType::RemoveGroup, _selectedGroup); + GameActions::Execute(&networkModifyGroup); + } + break; case WIDX_RENAME_GROUP:; int32_t groupIndex = network_get_group_index(_selectedGroup); const utf8* groupName = network_get_group_name(groupIndex); @@ -788,10 +795,12 @@ static void window_multiplayer_groups_dropdown(rct_window* w, rct_widgetindex wi switch (widgetIndex) { case WIDX_DEFAULT_GROUP_DROPDOWN: - game_do_command( - 4 | (network_get_group_id(dropdownIndex) << 8), GAME_COMMAND_FLAG_APPLY, 0, 0, GAME_COMMAND_MODIFY_GROUPS, 0, - 0); - break; + { + auto networkModifyGroup = NetworkModifyGroupAction( + ModifyGroupType::SetDefault, network_get_group_id(dropdownIndex)); + GameActions::Execute(&networkModifyGroup); + } + break; case WIDX_SELECTED_GROUP_DROPDOWN: _selectedGroup = network_get_group_id(dropdownIndex); break; @@ -838,7 +847,8 @@ static void window_multiplayer_groups_scrollmousedown(rct_window* w, int32_t scr w->selected_list_item = index; window_invalidate(w); - game_do_command(2 | (_selectedGroup << 8), GAME_COMMAND_FLAG_APPLY, index, 0, GAME_COMMAND_MODIFY_GROUPS, 0, 0); + auto networkModifyGroup = NetworkModifyGroupAction(ModifyGroupType::SetPermissions, _selectedGroup, "", index, PermissionState::Toggle); + GameActions::Execute(&networkModifyGroup); } static void window_multiplayer_groups_scrollmouseover(rct_window* w, int32_t scrollIndex, int32_t x, int32_t y) @@ -861,15 +871,10 @@ static void window_multiplayer_groups_text_input(rct_window* w, rct_widgetindex if (text == nullptr) return; - game_do_command( - 3 | (_selectedGroup << 8) | (1 << 16), GAME_COMMAND_FLAG_APPLY, w->number, *((int32_t*)(text + 0)), - GAME_COMMAND_MODIFY_GROUPS, *((int32_t*)(text + 8)), *((int32_t*)(text + 4))); - game_do_command( - 3 | (_selectedGroup << 8) | (2 << 16), GAME_COMMAND_FLAG_APPLY, w->number, *((int32_t*)(text + 12)), - GAME_COMMAND_MODIFY_GROUPS, *((int32_t*)(text + 20)), *((int32_t*)(text + 16))); - game_do_command( - 3 | (_selectedGroup << 8) | (0 << 16), GAME_COMMAND_FLAG_APPLY, w->number, *((int32_t*)(text + 24)), - GAME_COMMAND_MODIFY_GROUPS, *((int32_t*)(text + 32)), *((int32_t*)(text + 28))); + + auto networkModifyGroup = NetworkModifyGroupAction( + ModifyGroupType::SetName, _selectedGroup, text); + GameActions::Execute(&networkModifyGroup); } static void window_multiplayer_groups_invalidate(rct_window* w) diff --git a/src/openrct2-ui/windows/Player.cpp b/src/openrct2-ui/windows/Player.cpp index ec560a8009..a1794e3167 100644 --- a/src/openrct2-ui/windows/Player.cpp +++ b/src/openrct2-ui/windows/Player.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -284,8 +285,11 @@ void window_player_overview_mouse_up(rct_window* w, rct_widgetindex widgetIndex) } break; case WIDX_KICK: - game_do_command(w->number, GAME_COMMAND_FLAG_APPLY, 0, 0, GAME_COMMAND_KICK_PLAYER, 0, 0); - break; + { + auto kickPlayerAction = PlayerKickAction(w->number); + GameActions::Execute(&kickPlayerAction); + } + break; } } diff --git a/src/openrct2/Game.cpp b/src/openrct2/Game.cpp index 2fb6fc2489..d9ccf3738a 100644 --- a/src/openrct2/Game.cpp +++ b/src/openrct2/Game.cpp @@ -1219,8 +1219,8 @@ GAME_COMMAND_POINTER* new_game_command_table[GAME_COMMAND_COUNT] = { nullptr, nullptr, nullptr, - game_command_modify_groups, - game_command_kick_player, + nullptr, + nullptr, nullptr, game_command_pickup_guest, game_command_pickup_staff, diff --git a/src/openrct2/Game.h b/src/openrct2/Game.h index 266e1dc925..4a897eda5b 100644 --- a/src/openrct2/Game.h +++ b/src/openrct2/Game.h @@ -82,9 +82,9 @@ enum GAME_COMMAND GAME_COMMAND_SET_BANNER_STYLE, // GA GAME_COMMAND_SET_SIGN_STYLE, // GA GAME_COMMAND_SET_PLAYER_GROUP, // GA - GAME_COMMAND_MODIFY_GROUPS, - GAME_COMMAND_KICK_PLAYER, - GAME_COMMAND_CHEAT, + GAME_COMMAND_MODIFY_GROUPS, // GA + GAME_COMMAND_KICK_PLAYER, // GA + GAME_COMMAND_CHEAT, // GA GAME_COMMAND_PICKUP_GUEST, GAME_COMMAND_PICKUP_STAFF, GAME_COMMAND_BALLOON_PRESS, // GA diff --git a/src/openrct2/actions/GameActionRegistration.cpp b/src/openrct2/actions/GameActionRegistration.cpp index 8bd8e40d2c..9da6c6dffe 100644 --- a/src/openrct2/actions/GameActionRegistration.cpp +++ b/src/openrct2/actions/GameActionRegistration.cpp @@ -34,6 +34,7 @@ #include "LargeScenerySetColourAction.hpp" #include "LoadOrQuitAction.hpp" #include "MazeSetTrackAction.hpp" +#include "NetworkModifyGroupAction.hpp" #include "ParkEntranceRemoveAction.hpp" #include "ParkMarketingAction.hpp" #include "ParkSetDateAction.hpp" @@ -44,6 +45,7 @@ #include "PauseToggleAction.hpp" #include "PlaceParkEntranceAction.hpp" #include "PlacePeepSpawnAction.hpp" +#include "PlayerKickAction.hpp" #include "PlayerSetGroupAction.hpp" #include "RideCreateAction.hpp" #include "RideDemolishAction.hpp" @@ -99,6 +101,7 @@ namespace GameActions Register(); Register(); Register(); + Register(); Register(); Register(); Register(); @@ -107,6 +110,7 @@ namespace GameActions Register(); Register(); Register(); + Register(); Register(); Register(); Register(); diff --git a/src/openrct2/actions/NetworkModifyGroupAction.hpp b/src/openrct2/actions/NetworkModifyGroupAction.hpp new file mode 100644 index 0000000000..ec01c6d357 --- /dev/null +++ b/src/openrct2/actions/NetworkModifyGroupAction.hpp @@ -0,0 +1,81 @@ +/***************************************************************************** + * Copyright (c) 2014-2019 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + +#pragma once + +#include "../network/network.h" +#include "GameAction.h" + +enum class ModifyGroupType : uint8_t +{ + AddGroup, + RemoveGroup, + SetPermissions, + SetName, + SetDefault, + Count +}; + +enum class PermissionState : uint8_t +{ + Toggle, + SetAll, + ClearAll, + Count +}; + +DEFINE_GAME_ACTION(NetworkModifyGroupAction, GAME_COMMAND_MODIFY_GROUPS, GameActionResult) +{ +private: + uint8_t _type{ static_cast(ModifyGroupType::Count) }; + uint8_t _groupId{ std::numeric_limits::max() }; + std::string _name; + uint32_t _permissionIndex{ std::numeric_limits::max() }; + uint8_t _permissionState{ static_cast(PermissionState::Count) }; + +public: + NetworkModifyGroupAction() + { + } + + NetworkModifyGroupAction(ModifyGroupType type, uint8_t groupId = std::numeric_limits::max(), const std::string name = "", uint32_t permissionIndex = 0, PermissionState permissionState = PermissionState::Count ) + : _type(static_cast(type)) + , _groupId(groupId) + , _name(name) + , _permissionIndex(permissionIndex) + , _permissionState(static_cast(permissionState)) + { + } + + uint16_t GetActionFlags() const override + { + return GameAction::GetActionFlags() | GA_FLAGS::ALLOW_WHILE_PAUSED; + } + + void Serialise(DataSerialiser & stream) override + { + GameAction::Serialise(stream); + + stream << DS_TAG(_type) << DS_TAG(_groupId) << DS_TAG(_name) << DS_TAG(_permissionIndex) << DS_TAG(_permissionState); + } + + GameActionResult::Ptr Query() const override + { + return network_modify_groups( + GetPlayer(), static_cast(_type), _groupId, _name, _permissionIndex, + static_cast(_permissionState), false); + } + + GameActionResult::Ptr Execute() const override + { + return network_modify_groups( + GetPlayer(), static_cast(_type), _groupId, _name, _permissionIndex, + static_cast(_permissionState), true); + } +}; diff --git a/src/openrct2/actions/PlayerKickAction.hpp b/src/openrct2/actions/PlayerKickAction.hpp new file mode 100644 index 0000000000..e2bf69dc75 --- /dev/null +++ b/src/openrct2/actions/PlayerKickAction.hpp @@ -0,0 +1,50 @@ +/***************************************************************************** + * Copyright (c) 2014-2019 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + +#pragma once + +#include "../network/network.h" +#include "GameAction.h" + +DEFINE_GAME_ACTION(PlayerKickAction, GAME_COMMAND_KICK_PLAYER, GameActionResult) +{ +private: + NetworkPlayerId_t _playerId{ -1 }; + +public: + PlayerKickAction() + { + } + + PlayerKickAction(NetworkPlayerId_t playerId) + : _playerId(playerId) + { + } + + uint16_t GetActionFlags() const override + { + return GameAction::GetActionFlags() | GA_FLAGS::ALLOW_WHILE_PAUSED; + } + + void Serialise(DataSerialiser & stream) override + { + GameAction::Serialise(stream); + + stream << DS_TAG(_playerId); + } + GameActionResult::Ptr Query() const override + { + return network_kick_player(GetPlayer(), _playerId, false); + } + + GameActionResult::Ptr Execute() const override + { + return network_kick_player(GetPlayer(), _playerId, true); + } +}; diff --git a/src/openrct2/network/Network.cpp b/src/openrct2/network/Network.cpp index 560435b051..4c3b041987 100644 --- a/src/openrct2/network/Network.cpp +++ b/src/openrct2/network/Network.cpp @@ -15,6 +15,7 @@ #include "../OpenRCT2.h" #include "../PlatformEnvironment.h" #include "../actions/LoadOrQuitAction.hpp" +#include "../actions/NetworkModifyGroupAction.hpp" #include "../core/Guard.hpp" #include "../platform/platform.h" #include "../ui/UiContext.h" @@ -3639,30 +3640,24 @@ GameActionResult::Ptr network_set_player_group( return std::make_unique(); } -void game_command_modify_groups( - int32_t* eax, int32_t* ebx, int32_t* ecx, int32_t* edx, [[maybe_unused]] int32_t* esi, int32_t* edi, int32_t* ebp) +GameActionResult::Ptr network_modify_groups( + NetworkPlayerId_t actionPlayerId, ModifyGroupType type, uint8_t groupId, const std::string& name, uint32_t permissionIndex, + PermissionState permissionState, bool isExecuting) { - uint8_t action = (uint8_t)*eax; - uint8_t groupid = (uint8_t)(*eax >> 8); - uint8_t nameChunkIndex = (uint8_t)(*eax >> 16); - - switch (action) + switch (type) { - case 0: - { // add group - if (*ebx & GAME_COMMAND_FLAG_APPLY) + case ModifyGroupType::AddGroup: + { + if (isExecuting) { NetworkGroup* newgroup = gNetwork.AddGroup(); if (!newgroup) { - gGameCommandErrorTitle = STR_CANT_DO_THIS; - gGameCommandErrorText = STR_NONE; - *ebx = MONEY32_UNDEFINED; - return; + return std::make_unique(GA_ERROR::UNKNOWN, STR_CANT_DO_THIS); } // Log add player group event - NetworkPlayer* game_command_player = gNetwork.GetPlayerByID(game_command_playerid); + NetworkPlayer* game_command_player = gNetwork.GetPlayerByID(actionPlayerId); if (game_command_player) { char log_msg[256]; @@ -3676,30 +3671,24 @@ void game_command_modify_groups( } } break; - case 1: - { // remove group - if (groupid == 0) + case ModifyGroupType::RemoveGroup: + { + if (groupId == 0) { - gGameCommandErrorTitle = STR_THIS_GROUP_CANNOT_BE_MODIFIED; - gGameCommandErrorText = STR_NONE; - *ebx = MONEY32_UNDEFINED; - return; + return std::make_unique(GA_ERROR::DISALLOWED, STR_THIS_GROUP_CANNOT_BE_MODIFIED); } for (auto it = gNetwork.player_list.begin(); it != gNetwork.player_list.end(); it++) { - if ((*it)->Group == groupid) + if ((*it)->Group == groupId) { - gGameCommandErrorTitle = STR_CANT_REMOVE_GROUP_THAT_PLAYERS_BELONG_TO; - gGameCommandErrorText = STR_NONE; - *ebx = MONEY32_UNDEFINED; - return; + return std::make_unique(GA_ERROR::DISALLOWED, STR_CANT_REMOVE_GROUP_THAT_PLAYERS_BELONG_TO); } } - if (*ebx & GAME_COMMAND_FLAG_APPLY) + if (isExecuting) { // Log remove player group event - NetworkPlayer* game_command_player = gNetwork.GetPlayerByID(game_command_playerid); - NetworkGroup* group = gNetwork.GetGroupByID(groupid); + NetworkPlayer* game_command_player = gNetwork.GetPlayerByID(actionPlayerId); + NetworkGroup* group = gNetwork.GetGroupByID(groupId); if (game_command_player && group) { char log_msg[256]; @@ -3711,45 +3700,37 @@ void game_command_modify_groups( network_append_server_log(log_msg); } - gNetwork.RemoveGroup(groupid); + gNetwork.RemoveGroup(groupId); } } break; - case 2: - { // set permissions - int32_t index = *ecx; - bool all = *edx & 1; - bool allvalue = (*edx >> 1) & 1; - if (groupid == 0) + case ModifyGroupType::SetPermissions: + { + if (groupId == 0) { // cant change admin group permissions - gGameCommandErrorTitle = STR_THIS_GROUP_CANNOT_BE_MODIFIED; - gGameCommandErrorText = STR_NONE; - *ebx = MONEY32_UNDEFINED; - return; + return std::make_unique(GA_ERROR::DISALLOWED, STR_THIS_GROUP_CANNOT_BE_MODIFIED); } NetworkGroup* mygroup = nullptr; - NetworkPlayer* player = gNetwork.GetPlayerByID(game_command_playerid); - if (player && !all) + NetworkPlayer* player = gNetwork.GetPlayerByID(actionPlayerId); + if (player && permissionState == PermissionState::Toggle) { mygroup = gNetwork.GetGroupByID(player->Group); - if (!mygroup || !mygroup->CanPerformAction(index)) + if (!mygroup || !mygroup->CanPerformAction(permissionIndex)) { - gGameCommandErrorTitle = STR_CANT_MODIFY_PERMISSION_THAT_YOU_DO_NOT_HAVE_YOURSELF; - gGameCommandErrorText = STR_NONE; - *ebx = MONEY32_UNDEFINED; - return; + return std::make_unique( + GA_ERROR::DISALLOWED, STR_CANT_MODIFY_PERMISSION_THAT_YOU_DO_NOT_HAVE_YOURSELF); } } - if (*ebx & GAME_COMMAND_FLAG_APPLY) + if (isExecuting) { - NetworkGroup* group = gNetwork.GetGroupByID(groupid); + NetworkGroup* group = gNetwork.GetGroupByID(groupId); if (group) { - if (all) + if (permissionState != PermissionState::Toggle) { if (mygroup) { - if (allvalue) + if (permissionState == PermissionState::SetAll) { group->ActionsAllowed = mygroup->ActionsAllowed; } @@ -3761,7 +3742,7 @@ void game_command_modify_groups( } else { - group->ToggleActionPermission(index); + group->ToggleActionPermission(permissionIndex); } } @@ -3776,77 +3757,55 @@ void game_command_modify_groups( } } break; - case 3: - { // set group name - NetworkGroup* group = gNetwork.GetGroupByID(groupid); + case ModifyGroupType::SetName: + { + NetworkGroup* group = gNetwork.GetGroupByID(groupId); const char* oldName = group->GetName().c_str(); - static char newName[128]; - size_t nameChunkOffset = nameChunkIndex - 1; - if (nameChunkIndex == 0) - nameChunkOffset = 2; - nameChunkOffset *= 12; - nameChunkOffset = (std::min)(nameChunkOffset, std::size(newName) - 12); - std::memcpy((void*)((uintptr_t)newName + (uintptr_t)nameChunkOffset + 0), edx, sizeof(uint32_t)); - std::memcpy((void*)((uintptr_t)newName + (uintptr_t)nameChunkOffset + 4), ebp, sizeof(uint32_t)); - std::memcpy((void*)((uintptr_t)newName + (uintptr_t)nameChunkOffset + 8), edi, sizeof(uint32_t)); - - if (nameChunkIndex != 0) + if (strcmp(oldName, name.c_str()) == 0) { - *ebx = 0; - return; + return std::make_unique(); } - if (strcmp(oldName, newName) == 0) + if (name.empty()) { - *ebx = 0; - return; + return std::make_unique( + GA_ERROR::INVALID_PARAMETERS, STR_CANT_RENAME_GROUP, STR_INVALID_GROUP_NAME); } - if (newName[0] == 0) - { - gGameCommandErrorTitle = STR_CANT_RENAME_GROUP; - gGameCommandErrorText = STR_INVALID_GROUP_NAME; - *ebx = MONEY32_UNDEFINED; - return; - } - - if (*ebx & GAME_COMMAND_FLAG_APPLY) + if (isExecuting) { if (group) { // Log edit player group name event - NetworkPlayer* player = gNetwork.GetPlayerByID(game_command_playerid); + NetworkPlayer* player = gNetwork.GetPlayerByID(actionPlayerId); char log_msg[256]; const char* args[3] = { player->Name.c_str(), oldName, - newName, + name.c_str(), }; format_string(log_msg, 256, STR_LOG_EDIT_PLAYER_GROUP_NAME, args); network_append_server_log(log_msg); - group->SetName(newName); + group->SetName(name); } } } break; - case 4: - { // set default group - if (groupid == 0) + case ModifyGroupType::SetDefault: + { + if (groupId == 0) { - gGameCommandErrorTitle = STR_CANT_SET_TO_THIS_GROUP; - gGameCommandErrorText = STR_NONE; - *ebx = MONEY32_UNDEFINED; - return; + return std::make_unique(GA_ERROR::DISALLOWED, STR_CANT_SET_TO_THIS_GROUP); } - if (*ebx & GAME_COMMAND_FLAG_APPLY) + if (isExecuting) { - gNetwork.SetDefaultGroup(groupid); + gNetwork.SetDefaultGroup(groupId); // Log edit default player group event - NetworkPlayer* player = gNetwork.GetPlayerByID(game_command_playerid); - NetworkGroup* group = gNetwork.GetGroupByID(groupid); + NetworkPlayer* player = gNetwork.GetPlayerByID(actionPlayerId); + NetworkGroup* group = gNetwork.GetGroupByID(groupId); char log_msg[256]; const char* args[2] = { player->Name.c_str(), @@ -3861,35 +3820,29 @@ void game_command_modify_groups( gNetwork.SaveGroups(); - *ebx = 0; + return std::make_unique(); } -void game_command_kick_player( - int32_t* eax, int32_t* ebx, [[maybe_unused]] int32_t* ecx, [[maybe_unused]] int32_t* edx, [[maybe_unused]] int32_t* esi, - [[maybe_unused]] int32_t* edi, [[maybe_unused]] int32_t* ebp) +GameActionResult::Ptr network_kick_player(NetworkPlayerId_t actionPlayerId, NetworkPlayerId_t playerId, bool isExecuting) { - uint8_t playerid = (uint8_t)*eax; - NetworkPlayer* player = gNetwork.GetPlayerByID(playerid); - NetworkPlayer* kicker = gNetwork.GetPlayerByID(game_command_playerid); + NetworkPlayer* player = gNetwork.GetPlayerByID(playerId); + NetworkPlayer* kicker = gNetwork.GetPlayerByID(actionPlayerId); if (player == nullptr) { // Player might be already removed by the PLAYERLIST command, need to refactor non-game commands executing too early. - return; + return std::make_unique(GA_ERROR::UNKNOWN, STR_NONE); } if (player && player->Flags & NETWORK_PLAYER_FLAG_ISSERVER) { - gGameCommandErrorTitle = STR_CANT_KICK_THE_HOST; - gGameCommandErrorText = STR_NONE; - *ebx = MONEY32_UNDEFINED; - return; + return std::make_unique(GA_ERROR::DISALLOWED, STR_CANT_KICK_THE_HOST); } - if (*ebx & GAME_COMMAND_FLAG_APPLY) + if (isExecuting) { if (gNetwork.GetMode() == NETWORK_MODE_SERVER) { - gNetwork.KickPlayer(playerid); + gNetwork.KickPlayer(playerId); NetworkUserManager* networkUserManager = &gNetwork._userManager; networkUserManager->Load(); @@ -3909,7 +3862,7 @@ void game_command_kick_player( network_append_server_log(log_msg); } } - *ebx = 0; + return std::make_unique(); } uint8_t network_get_default_group() @@ -4329,12 +4282,15 @@ GameActionResult::Ptr network_set_player_group( { return std::make_unique(); } -void game_command_modify_groups( - int32_t* eax, int32_t* ebx, int32_t* ecx, int32_t* edx, int32_t* esi, int32_t* edi, int32_t* ebp) +GameActionResult::Ptr network_modify_groups( + NetworkPlayerId_t actionPlayerId, ModifyGroupType type, uint8_t groupId, const std::string& name, uint32_t permissionIndex, + PermissionState permissionState, bool isExecuting) { + return std::make_unique(); } -void game_command_kick_player(int32_t* eax, int32_t* ebx, int32_t* ecx, int32_t* edx, int32_t* esi, int32_t* edi, int32_t* ebp) +GameActionResult::Ptr network_kick_player(NetworkPlayerId_t actionPlayerId, NetworkPlayerId_t playerId, bool isExecuting) { + return std::make_unique(); } uint8_t network_get_default_group() { diff --git a/src/openrct2/network/network.h b/src/openrct2/network/network.h index b57dd058cc..96284b7d4f 100644 --- a/src/openrct2/network/network.h +++ b/src/openrct2/network/network.h @@ -26,6 +26,8 @@ struct GameAction; struct Peep; struct LocationXYZ16; class GameActionResult; +enum class ModifyGroupType : uint8_t; +enum class PermissionState : uint8_t; namespace OpenRCT2 { @@ -75,9 +77,11 @@ int32_t network_get_num_groups(); const char* network_get_group_name(uint32_t index); std::unique_ptr network_set_player_group( NetworkPlayerId_t actionPlayerId, NetworkPlayerId_t playerId, uint8_t groupId, bool isExecuting); -void game_command_modify_groups( - int32_t* eax, int32_t* ebx, int32_t* ecx, int32_t* edx, int32_t* esi, int32_t* edi, int32_t* ebp); -void game_command_kick_player(int32_t* eax, int32_t* ebx, int32_t* ecx, int32_t* edx, int32_t* esi, int32_t* edi, int32_t* ebp); +std::unique_ptr network_modify_groups( + NetworkPlayerId_t actionPlayerId, ModifyGroupType type, uint8_t groupId, const std::string& name, uint32_t permissionIndex, + PermissionState permissionState, bool isExecuting); +std::unique_ptr network_kick_player( + NetworkPlayerId_t actionPlayerId, NetworkPlayerId_t playerId, bool isExecuting); uint8_t network_get_default_group(); int32_t network_get_num_actions(); rct_string_id network_get_action_name_string_id(uint32_t index); From e72195d16eb5e9244105895e44ca679bd5461571 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Mon, 13 May 2019 19:49:06 +0100 Subject: [PATCH 2/4] Make suggested changes --- .../actions/NetworkModifyGroupAction.hpp | 4 +- src/openrct2/actions/PlayerKickAction.hpp | 8 +- src/openrct2/network/Network.cpp | 91 ++----------------- src/openrct2/network/network.h | 3 +- 4 files changed, 15 insertions(+), 91 deletions(-) diff --git a/src/openrct2/actions/NetworkModifyGroupAction.hpp b/src/openrct2/actions/NetworkModifyGroupAction.hpp index ec01c6d357..780b5949e3 100644 --- a/src/openrct2/actions/NetworkModifyGroupAction.hpp +++ b/src/openrct2/actions/NetworkModifyGroupAction.hpp @@ -40,9 +40,7 @@ private: uint8_t _permissionState{ static_cast(PermissionState::Count) }; public: - NetworkModifyGroupAction() - { - } + NetworkModifyGroupAction() = default; NetworkModifyGroupAction(ModifyGroupType type, uint8_t groupId = std::numeric_limits::max(), const std::string name = "", uint32_t permissionIndex = 0, PermissionState permissionState = PermissionState::Count ) : _type(static_cast(type)) diff --git a/src/openrct2/actions/PlayerKickAction.hpp b/src/openrct2/actions/PlayerKickAction.hpp index e2bf69dc75..1478e9be9d 100644 --- a/src/openrct2/actions/PlayerKickAction.hpp +++ b/src/openrct2/actions/PlayerKickAction.hpp @@ -18,9 +18,7 @@ private: NetworkPlayerId_t _playerId{ -1 }; public: - PlayerKickAction() - { - } + PlayerKickAction() = default; PlayerKickAction(NetworkPlayerId_t playerId) : _playerId(playerId) @@ -40,11 +38,11 @@ public: } GameActionResult::Ptr Query() const override { - return network_kick_player(GetPlayer(), _playerId, false); + return network_kick_player(_playerId, false); } GameActionResult::Ptr Execute() const override { - return network_kick_player(GetPlayer(), _playerId, true); + return network_kick_player(_playerId, true); } }; diff --git a/src/openrct2/network/Network.cpp b/src/openrct2/network/Network.cpp index 4c3b041987..7a68d6ba24 100644 --- a/src/openrct2/network/Network.cpp +++ b/src/openrct2/network/Network.cpp @@ -3651,23 +3651,10 @@ GameActionResult::Ptr network_modify_groups( if (isExecuting) { NetworkGroup* newgroup = gNetwork.AddGroup(); - if (!newgroup) + if (newgroup == nullptr) { return std::make_unique(GA_ERROR::UNKNOWN, STR_CANT_DO_THIS); } - - // Log add player group event - NetworkPlayer* game_command_player = gNetwork.GetPlayerByID(actionPlayerId); - if (game_command_player) - { - char log_msg[256]; - const char* args[2] = { - game_command_player->Name.c_str(), - newgroup->GetName().c_str(), - }; - format_string(log_msg, 256, STR_LOG_ADD_PLAYER_GROUP, args); - network_append_server_log(log_msg); - } } } break; @@ -3677,29 +3664,15 @@ GameActionResult::Ptr network_modify_groups( { return std::make_unique(GA_ERROR::DISALLOWED, STR_THIS_GROUP_CANNOT_BE_MODIFIED); } - for (auto it = gNetwork.player_list.begin(); it != gNetwork.player_list.end(); it++) + for (const auto &it : gNetwork.player_list) { - if ((*it)->Group == groupId) + if ((it.get())->Group == groupId) { return std::make_unique(GA_ERROR::DISALLOWED, STR_CANT_REMOVE_GROUP_THAT_PLAYERS_BELONG_TO); } } if (isExecuting) { - // Log remove player group event - NetworkPlayer* game_command_player = gNetwork.GetPlayerByID(actionPlayerId); - NetworkGroup* group = gNetwork.GetGroupByID(groupId); - if (game_command_player && group) - { - char log_msg[256]; - const char* args[2] = { - game_command_player->Name.c_str(), - group->GetName().c_str(), - }; - format_string(log_msg, 256, STR_LOG_REMOVE_PLAYER_GROUP, args); - network_append_server_log(log_msg); - } - gNetwork.RemoveGroup(groupId); } } @@ -3712,10 +3685,10 @@ GameActionResult::Ptr network_modify_groups( } NetworkGroup* mygroup = nullptr; NetworkPlayer* player = gNetwork.GetPlayerByID(actionPlayerId); - if (player && permissionState == PermissionState::Toggle) + if (player != nullptr && permissionState == PermissionState::Toggle) { mygroup = gNetwork.GetGroupByID(player->Group); - if (!mygroup || !mygroup->CanPerformAction(permissionIndex)) + if (mygroup == nullptr || !mygroup->CanPerformAction(permissionIndex)) { return std::make_unique( GA_ERROR::DISALLOWED, STR_CANT_MODIFY_PERMISSION_THAT_YOU_DO_NOT_HAVE_YOURSELF); @@ -3724,11 +3697,11 @@ GameActionResult::Ptr network_modify_groups( if (isExecuting) { NetworkGroup* group = gNetwork.GetGroupByID(groupId); - if (group) + if (group != nullptr) { if (permissionState != PermissionState::Toggle) { - if (mygroup) + if (mygroup != nullptr) { if (permissionState == PermissionState::SetAll) { @@ -3745,15 +3718,6 @@ GameActionResult::Ptr network_modify_groups( group->ToggleActionPermission(permissionIndex); } } - - // Log edit player group permissions event - char log_msg[256]; - const char* args[2] = { - player->Name.c_str(), - group->GetName().c_str(), - }; - format_string(log_msg, 256, STR_LOG_EDIT_PLAYER_GROUP_PERMISSIONS, args); - network_append_server_log(log_msg); } } break; @@ -3775,19 +3739,8 @@ GameActionResult::Ptr network_modify_groups( if (isExecuting) { - if (group) + if (group != nullptr) { - // Log edit player group name event - NetworkPlayer* player = gNetwork.GetPlayerByID(actionPlayerId); - char log_msg[256]; - const char* args[3] = { - player->Name.c_str(), - oldName, - name.c_str(), - }; - format_string(log_msg, 256, STR_LOG_EDIT_PLAYER_GROUP_NAME, args); - network_append_server_log(log_msg); - group->SetName(name); } } @@ -3802,17 +3755,6 @@ GameActionResult::Ptr network_modify_groups( if (isExecuting) { gNetwork.SetDefaultGroup(groupId); - - // Log edit default player group event - NetworkPlayer* player = gNetwork.GetPlayerByID(actionPlayerId); - NetworkGroup* group = gNetwork.GetGroupByID(groupId); - char log_msg[256]; - const char* args[2] = { - player->Name.c_str(), - group->GetName().c_str(), - }; - format_string(log_msg, 256, STR_LOG_EDIT_DEFAULT_PLAYER_GROUP, args); - network_append_server_log(log_msg); } } break; @@ -3823,10 +3765,9 @@ GameActionResult::Ptr network_modify_groups( return std::make_unique(); } -GameActionResult::Ptr network_kick_player(NetworkPlayerId_t actionPlayerId, NetworkPlayerId_t playerId, bool isExecuting) +GameActionResult::Ptr network_kick_player(NetworkPlayerId_t playerId, bool isExecuting) { NetworkPlayer* player = gNetwork.GetPlayerByID(playerId); - NetworkPlayer* kicker = gNetwork.GetPlayerByID(actionPlayerId); if (player == nullptr) { // Player might be already removed by the PLAYERLIST command, need to refactor non-game commands executing too early. @@ -3849,18 +3790,6 @@ GameActionResult::Ptr network_kick_player(NetworkPlayerId_t actionPlayerId, Netw networkUserManager->RemoveUser(player->KeyHash); networkUserManager->Save(); } - - if (kicker != nullptr) - { - // Log kick player event - char log_msg[256]; - const char* args[2] = { - player->Name.c_str(), - kicker->Name.c_str(), - }; - format_string(log_msg, 256, STR_LOG_PLAYER_KICKED, args); - network_append_server_log(log_msg); - } } return std::make_unique(); } @@ -4288,7 +4217,7 @@ GameActionResult::Ptr network_modify_groups( { return std::make_unique(); } -GameActionResult::Ptr network_kick_player(NetworkPlayerId_t actionPlayerId, NetworkPlayerId_t playerId, bool isExecuting) +GameActionResult::Ptr network_kick_player(NetworkPlayerId_t playerId, bool isExecuting) { return std::make_unique(); } diff --git a/src/openrct2/network/network.h b/src/openrct2/network/network.h index 96284b7d4f..12f946d475 100644 --- a/src/openrct2/network/network.h +++ b/src/openrct2/network/network.h @@ -80,8 +80,7 @@ std::unique_ptr network_set_player_group( std::unique_ptr network_modify_groups( NetworkPlayerId_t actionPlayerId, ModifyGroupType type, uint8_t groupId, const std::string& name, uint32_t permissionIndex, PermissionState permissionState, bool isExecuting); -std::unique_ptr network_kick_player( - NetworkPlayerId_t actionPlayerId, NetworkPlayerId_t playerId, bool isExecuting); +std::unique_ptr network_kick_player(NetworkPlayerId_t playerId, bool isExecuting); uint8_t network_get_default_group(); int32_t network_get_num_actions(); rct_string_id network_get_action_name_string_id(uint32_t index); From 0b7d7027e1ba50e79facc4bed06f8395363c72b6 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Mon, 13 May 2019 19:53:33 +0100 Subject: [PATCH 3/4] Fix formatting --- src/openrct2-ui/windows/Multiplayer.cpp | 7 +++---- src/openrct2/actions/NetworkModifyGroupAction.hpp | 4 +++- src/openrct2/network/Network.cpp | 9 +++++++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/openrct2-ui/windows/Multiplayer.cpp b/src/openrct2-ui/windows/Multiplayer.cpp index de0d4f77f5..00fc390038 100644 --- a/src/openrct2-ui/windows/Multiplayer.cpp +++ b/src/openrct2-ui/windows/Multiplayer.cpp @@ -847,7 +847,8 @@ static void window_multiplayer_groups_scrollmousedown(rct_window* w, int32_t scr w->selected_list_item = index; window_invalidate(w); - auto networkModifyGroup = NetworkModifyGroupAction(ModifyGroupType::SetPermissions, _selectedGroup, "", index, PermissionState::Toggle); + auto networkModifyGroup = NetworkModifyGroupAction( + ModifyGroupType::SetPermissions, _selectedGroup, "", index, PermissionState::Toggle); GameActions::Execute(&networkModifyGroup); } @@ -871,9 +872,7 @@ static void window_multiplayer_groups_text_input(rct_window* w, rct_widgetindex if (text == nullptr) return; - - auto networkModifyGroup = NetworkModifyGroupAction( - ModifyGroupType::SetName, _selectedGroup, text); + auto networkModifyGroup = NetworkModifyGroupAction(ModifyGroupType::SetName, _selectedGroup, text); GameActions::Execute(&networkModifyGroup); } diff --git a/src/openrct2/actions/NetworkModifyGroupAction.hpp b/src/openrct2/actions/NetworkModifyGroupAction.hpp index 780b5949e3..f8185d605d 100644 --- a/src/openrct2/actions/NetworkModifyGroupAction.hpp +++ b/src/openrct2/actions/NetworkModifyGroupAction.hpp @@ -42,7 +42,9 @@ private: public: NetworkModifyGroupAction() = default; - NetworkModifyGroupAction(ModifyGroupType type, uint8_t groupId = std::numeric_limits::max(), const std::string name = "", uint32_t permissionIndex = 0, PermissionState permissionState = PermissionState::Count ) + NetworkModifyGroupAction( + ModifyGroupType type, uint8_t groupId = std::numeric_limits::max(), const std::string name = "", + uint32_t permissionIndex = 0, PermissionState permissionState = PermissionState::Count) : _type(static_cast(type)) , _groupId(groupId) , _name(name) diff --git a/src/openrct2/network/Network.cpp b/src/openrct2/network/Network.cpp index 7a68d6ba24..59bd4d4974 100644 --- a/src/openrct2/network/Network.cpp +++ b/src/openrct2/network/Network.cpp @@ -3664,11 +3664,12 @@ GameActionResult::Ptr network_modify_groups( { return std::make_unique(GA_ERROR::DISALLOWED, STR_THIS_GROUP_CANNOT_BE_MODIFIED); } - for (const auto &it : gNetwork.player_list) + for (const auto& it : gNetwork.player_list) { if ((it.get())->Group == groupId) { - return std::make_unique(GA_ERROR::DISALLOWED, STR_CANT_REMOVE_GROUP_THAT_PLAYERS_BELONG_TO); + return std::make_unique( + GA_ERROR::DISALLOWED, STR_CANT_REMOVE_GROUP_THAT_PLAYERS_BELONG_TO); } } if (isExecuting) @@ -3758,6 +3759,10 @@ GameActionResult::Ptr network_modify_groups( } } break; + default: + log_error("Invalid Modify Group Type: %u", static_cast(type)); + return std::make_unique(GA_ERROR::INVALID_PARAMETERS, STR_NONE); + break; } gNetwork.SaveGroups(); From cb6a563e2d6f7ef1d608dcc200575e1381bdc87e Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Tue, 14 May 2019 21:59:16 +0200 Subject: [PATCH 4/4] Bump network version [ci skip] --- src/openrct2/network/Network.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openrct2/network/Network.cpp b/src/openrct2/network/Network.cpp index 59bd4d4974..837a7fc606 100644 --- a/src/openrct2/network/Network.cpp +++ b/src/openrct2/network/Network.cpp @@ -33,7 +33,7 @@ // This string specifies which version of network stream current build uses. // It is used for making sure only compatible builds get connected, even within // single OpenRCT2 version. -#define NETWORK_STREAM_VERSION "29" +#define NETWORK_STREAM_VERSION "30" #define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION static Peep* _pickup_peep = nullptr;