From f4c04299961a96e153bf50e2e1fb92c8f9db77f5 Mon Sep 17 00:00:00 2001 From: Simon Pribylski <66266021+Persson-dev@users.noreply.github.com> Date: Mon, 24 Jan 2022 21:24:55 +0100 Subject: Add player permission level (#5358) --- src/Entities/Player.cpp | 81 ++++++++++++++++++++++++++++--------------------- src/Entities/Player.h | 10 +++--- 2 files changed, 53 insertions(+), 38 deletions(-) (limited to 'src/Entities') diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp index de4acc806..30650a6d0 100644 --- a/src/Entities/Player.cpp +++ b/src/Entities/Player.cpp @@ -1567,7 +1567,7 @@ void cPlayer::PermuteEnchantmentSeed() -bool cPlayer::HasPermission(const AString & a_Permission) +bool cPlayer::HasPermission(const AString & a_Permission) const { if (a_Permission.empty()) { @@ -1786,7 +1786,7 @@ void cPlayer::TossPickup(const cItem & a_Item) void cPlayer::LoadFromDisk() { - LoadRank(); + RefreshRank(); Json::Value Root; const auto & UUID = GetUUID(); @@ -2295,39 +2295,11 @@ void cPlayer::UpdateMovementStats(const Vector3d & a_DeltaPos, bool a_PreviousIs void cPlayer::LoadRank(void) { - const auto & UUID = GetUUID(); - cRankManager * RankMgr = cRoot::Get()->GetRankManager(); - - // Load the values from cRankManager: - m_Rank = RankMgr->GetPlayerRankName(UUID); - if (m_Rank.empty()) - { - m_Rank = RankMgr->GetDefaultRank(); - } - else - { - // Update the name: - RankMgr->UpdatePlayerName(UUID, GetName()); - } - m_Permissions = RankMgr->GetPlayerPermissions(UUID); - m_Restrictions = RankMgr->GetPlayerRestrictions(UUID); - RankMgr->GetRankVisuals(m_Rank, m_MsgPrefix, m_MsgSuffix, m_MsgNameColorCode); + // Update our permissions: + RefreshRank(); - // Break up the individual permissions on each dot, into m_SplitPermissions: - m_SplitPermissions.clear(); - m_SplitPermissions.reserve(m_Permissions.size()); - for (auto & Permission: m_Permissions) - { - m_SplitPermissions.push_back(StringSplit(Permission, ".")); - } // for Permission - m_Permissions[] - - // Break up the individual restrictions on each dot, into m_SplitRestrictions: - m_SplitRestrictions.clear(); - m_SplitRestrictions.reserve(m_Restrictions.size()); - for (auto & Restriction: m_Restrictions) - { - m_SplitRestrictions.push_back(StringSplit(Restriction, ".")); - } // for itr - m_Restrictions[] + // Send a permission level update: + m_ClientHandle->SendPlayerPermissionLevel(); } @@ -2808,6 +2780,47 @@ void cPlayer::TickFreezeCode() +void cPlayer::RefreshRank() +{ + const auto & UUID = GetUUID(); + cRankManager * RankMgr = cRoot::Get()->GetRankManager(); + + // Load the values from cRankManager: + m_Rank = RankMgr->GetPlayerRankName(UUID); + if (m_Rank.empty()) + { + m_Rank = RankMgr->GetDefaultRank(); + } + else + { + // Update the name: + RankMgr->UpdatePlayerName(UUID, GetName()); + } + m_Permissions = RankMgr->GetPlayerPermissions(UUID); + m_Restrictions = RankMgr->GetPlayerRestrictions(UUID); + RankMgr->GetRankVisuals(m_Rank, m_MsgPrefix, m_MsgSuffix, m_MsgNameColorCode); + + // Break up the individual permissions on each dot, into m_SplitPermissions: + m_SplitPermissions.clear(); + m_SplitPermissions.reserve(m_Permissions.size()); + for (auto & Permission : m_Permissions) + { + m_SplitPermissions.push_back(StringSplit(Permission, ".")); + } + + // Break up the individual restrictions on each dot, into m_SplitRestrictions: + m_SplitRestrictions.clear(); + m_SplitRestrictions.reserve(m_Restrictions.size()); + for (auto & Restriction : m_Restrictions) + { + m_SplitRestrictions.push_back(StringSplit(Restriction, ".")); + } +} + + + + + void cPlayer::ApplyArmorDamage(int a_DamageBlocked) { short ArmorDamage = static_cast(std::max(a_DamageBlocked / 4, 1)); diff --git a/src/Entities/Player.h b/src/Entities/Player.h index 87eaad2fe..e0a88814d 100644 --- a/src/Entities/Player.h +++ b/src/Entities/Player.h @@ -301,7 +301,7 @@ public: // tolua_end - bool HasPermission(const AString & a_Permission); // tolua_export + bool HasPermission(const AString & a_Permission) const; // tolua_export /** Returns true iff a_Permission matches the a_Template. A match is defined by either being exactly the same, or each sub-item matches until there's a wildcard in a_Template. @@ -545,8 +545,7 @@ public: /** Returns wheter the player can fly or not. */ virtual bool CanFly(void) const { return m_IsFlightCapable; } - /** (Re)loads the rank and permissions from the cRankManager. - Loads the m_Rank, m_Permissions, m_MsgPrefix, m_MsgSuffix and m_MsgNameColorCode members. */ + /** (Re)loads the rank and permissions from the cRankManager and sends a permission level update to the client. */ void LoadRank(void); /** Sends the block in the specified range around the specified coord to the client @@ -626,7 +625,6 @@ private: This is used mainly by the HasPermission() function to optimize the lookup. */ AStringVectorVector m_SplitRestrictions; - // Message visuals: AString m_MsgPrefix, m_MsgSuffix; AString m_MsgNameColorCode; @@ -787,6 +785,10 @@ private: void TickFreezeCode(); + /** (Re)loads the rank and permissions from the cRankManager. + Loads the m_Rank, m_Permissions, m_MsgPrefix, m_MsgSuffix and m_MsgNameColorCode members. */ + void RefreshRank(); + // cEntity overrides: virtual void ApplyArmorDamage(int DamageBlocked) override; virtual void BroadcastMovementUpdate(const cClientHandle * a_Exclude = nullptr) override; -- cgit v1.2.3