1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-23 14:54:30 +01:00
Files
OpenRCT2/src/openrct2/scripting/bindings/network/ScPlayerGroup.cpp
2021-08-11 22:15:35 +03:00

151 lines
4.5 KiB
C++

/*****************************************************************************
* Copyright (c) 2014-2021 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
#ifdef ENABLE_SCRIPTING
# include "ScPlayerGroup.hpp"
# include "../../../Context.h"
# include "../../../actions/NetworkModifyGroupAction.h"
# include "../../../actions/PlayerSetGroupAction.h"
# include "../../../network/NetworkAction.h"
# include "../../../network/network.h"
# include "../../Duktape.hpp"
namespace OpenRCT2::Scripting
{
ScPlayerGroup::ScPlayerGroup(int32_t id)
: _id(id)
{
}
int32_t ScPlayerGroup::id_get()
{
return _id;
}
std::string ScPlayerGroup::name_get() const
{
# ifndef DISABLE_NETWORK
auto index = network_get_group_index(_id);
if (index == -1)
return {};
return network_get_group_name(index);
# else
return {};
# endif
}
void ScPlayerGroup::name_set(std::string value)
{
# ifndef DISABLE_NETWORK
auto action = NetworkModifyGroupAction(ModifyGroupType::SetName, _id, value);
GameActions::Execute(&action);
# endif
}
static std::string TransformPermissionKeyToJS(const std::string& s)
{
auto result = s.substr(sizeof("PERMISSION_") - 1);
for (auto& c : result)
{
c = std::tolower(c);
}
return result;
}
std::vector<std::string> ScPlayerGroup::permissions_get() const
{
# ifndef DISABLE_NETWORK
auto index = network_get_group_index(_id);
if (index == -1)
return {};
// Create array of permissions
std::vector<std::string> result;
auto permissionIndex = 0;
for (const auto& action : NetworkActions::Actions)
{
if (network_can_perform_action(index, static_cast<NetworkPermission>(permissionIndex)))
{
result.push_back(TransformPermissionKeyToJS(action.PermissionName));
}
permissionIndex++;
}
return result;
# else
return {};
# endif
}
static std::string TransformPermissionKeyToInternal(const std::string& s)
{
auto result = "PERMISSION_" + s;
for (auto& c : result)
{
c = std::toupper(c);
}
return result;
}
void ScPlayerGroup::permissions_set(std::vector<std::string> value)
{
# ifndef DISABLE_NETWORK
auto groupIndex = network_get_group_index(_id);
if (groupIndex == -1)
return;
// First clear all permissions
auto networkAction = NetworkModifyGroupAction(ModifyGroupType::SetPermissions, _id, "", 0, PermissionState::ClearAll);
GameActions::Execute(&networkAction);
std::vector<bool> enabledPermissions;
enabledPermissions.resize(NetworkActions::Actions.size());
for (const auto& p : value)
{
auto permissionName = TransformPermissionKeyToInternal(p);
auto permissionIndex = 0;
for (const auto& action : NetworkActions::Actions)
{
if (action.PermissionName == permissionName)
{
enabledPermissions[permissionIndex] = true;
}
permissionIndex++;
}
}
for (size_t i = 0; i < enabledPermissions.size(); i++)
{
auto toggle
= (enabledPermissions[i] != (network_can_perform_action(groupIndex, static_cast<NetworkPermission>(i)) != 0));
if (toggle)
{
auto networkAction2 = NetworkModifyGroupAction(
ModifyGroupType::SetPermissions, _id, "", static_cast<uint32_t>(i), PermissionState::Toggle);
GameActions::Execute(&networkAction2);
}
}
# endif
}
void ScPlayerGroup::Register(duk_context* ctx)
{
dukglue_register_property(ctx, &ScPlayerGroup::id_get, nullptr, "id");
dukglue_register_property(ctx, &ScPlayerGroup::name_get, &ScPlayerGroup::name_set, "name");
dukglue_register_property(ctx, &ScPlayerGroup::permissions_get, &ScPlayerGroup::permissions_set, "permissions");
}
} // namespace OpenRCT2::Scripting
#endif