diff options
author | Wyrserth <wyrserth@protonmail.com> | 2019-06-21 20:17:37 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-12-11 22:47:08 +0100 |
commit | b709ea9a8dcceb76bf1d057d01e86e347e207e51 (patch) | |
tree | 7d28aaf615e0bc228eade3871c2fadd6a739a7ab | |
parent | 8fc52bc5e542ab5a572343c64e915d01cf363b76 (diff) |
Core/RBAC: add permission that prevents accounts from earning all achievements or only realm firsts (#23459)
* Core/RBAC: add permission that prevents accounts from earning all achievements or only realm firsts.
* Kill evil spaces.
* Rename 9999_99_99_99_auth.sql to 2019_06_21_00_auth.sql
* Update auth_database.sql
(cherry picked from commit 8163ea60c8d517ebe3a88f595dd8291df8338811)
-rw-r--r-- | sql/base/auth_database.sql | 4 | ||||
-rw-r--r-- | sql/updates/auth/master/2019_06_21_00_auth.sql | 7 | ||||
-rw-r--r-- | src/server/game/Accounts/RBAC.h | 4 | ||||
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.cpp | 14 | ||||
-rw-r--r-- | src/server/game/Achievements/CriteriaHandler.cpp | 10 |
5 files changed, 29 insertions, 10 deletions
diff --git a/sql/base/auth_database.sql b/sql/base/auth_database.sql index a42fd4ef9ef..ee8b4b5324e 100644 --- a/sql/base/auth_database.sql +++ b/sql/base/auth_database.sql @@ -829,6 +829,7 @@ INSERT INTO `rbac_linked_permissions` VALUES (193,197), (194,1), (194,2), +(194,9), (194,11), (194,12), (194,13), @@ -1486,6 +1487,8 @@ INSERT INTO `rbac_permissions` VALUES (5,'Join Arenas'), (6,'Join Dungeon Finder'), (7,'Skip idle connection check'), +(8,"Cannot earn achievements"), +(9,"Cannot earn realm first achievements"), (10,'Use character templates'), (11,'Log GM trades'), (12,'Skip character creation demon hunter min level check'), @@ -2400,6 +2403,7 @@ INSERT INTO `updates` VALUES ('2019_06_08_02_auth.sql','B39DCBD902290700A81C9D028F54B58601C19A99','ARCHIVED','2019-06-05 16:26:31',0), ('2019_06_08_03_auth.sql','F483B657015D39D4F63E3905C27C3AA48241AB03','ARCHIVED','2019-06-08 17:14:21',0), ('2019_06_16_00_auth.sql','B14AED4D3387B56FF8C8161D3671750AEEAE0F2E','ARCHIVED','2019-06-15 23:32:12',0), +('2019_06_21_00_auth.sql','C519239830204B68E710F698BC0C9E89B6D5FD24','ARCHIVED','2019-06-20 19:43:50',0), ('2019_07_14_00_auth.sql','94C2B877BD906538E1E008350BEA8D8B58E0A158','ARCHIVED','2019-07-14 19:22:08',0), ('2019_07_15_00_auth.sql','3649248104CFEC70553016273069A9AE744798E3','ARCHIVED','2019-07-15 19:22:08',0), ('2019_07_26_00_auth.sql','DC9D0651602AE78B1243B40555A1A7B8447D01B2','ARCHIVED','2019-07-26 18:21:34',0), diff --git a/sql/updates/auth/master/2019_06_21_00_auth.sql b/sql/updates/auth/master/2019_06_21_00_auth.sql new file mode 100644 index 00000000000..1db042a632f --- /dev/null +++ b/sql/updates/auth/master/2019_06_21_00_auth.sql @@ -0,0 +1,7 @@ +DELETE FROM `rbac_permissions` WHERE `id` IN (8, 9); +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(8, "Cannot earn achievements"), +(9, "Cannot earn realm first achievements"); + +INSERT INTO `rbac_linked_permissions` (`id`, `linkedId`) VALUES +(194, 9); diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index b376624a235..ddac66afd61 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -58,8 +58,8 @@ enum RBACPermissions RBAC_PERM_JOIN_ARENAS = 5, RBAC_PERM_JOIN_DUNGEON_FINDER = 6, RBAC_PERM_IGNORE_IDLE_CONNECTION = 7, - // 8 - reuse - // 9 - reuse + RBAC_PERM_CANNOT_EARN_ACHIEVEMENTS = 8, + RBAC_PERM_CANNOT_EARN_REALM_FIRST_ACHIEVEMENTS = 9, RBAC_PERM_USE_CHARACTER_TEMPLATES = 10, RBAC_PERM_LOG_GM_TRADE = 11, RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_DEMON_HUNTER = 12, diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 0674a28d559..0b0e4bd2a00 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -32,6 +32,7 @@ #include "Log.h" #include "Mail.h" #include "ObjectMgr.h" +#include "RBAC.h" #include "World.h" #include "WorldSession.h" #include <sstream> @@ -109,6 +110,11 @@ bool AchievementMgr::CanUpdateCriteriaTree(Criteria const* criteria, CriteriaTre return false; } + // Don't update realm first achievements if the player's account isn't allowed to do so + if (achievement->Flags & (ACHIEVEMENT_FLAG_REALM_FIRST_REACH | ACHIEVEMENT_FLAG_REALM_FIRST_KILL)) + if (referencePlayer->GetSession()->HasPermission(rbac::RBAC_PERM_CANNOT_EARN_REALM_FIRST_ACHIEVEMENTS)) + return false; + if (achievement->CovenantID && referencePlayer->m_playerData->CovenantID != achievement->CovenantID) { TC_LOG_TRACE("criteria.achievement", "AchievementMgr::CanUpdateCriteriaTree: (Id: %u Type %s Achievement %u) Wrong covenant", @@ -364,8 +370,8 @@ void PlayerAchievementMgr::ResetCriteria(CriteriaFailEvent failEvent, int32 fail { TC_LOG_DEBUG("criteria.achievement", "PlayerAchievementMgr::ResetCriteria(%u, %d, %s)", uint32(failEvent), failAsset, evenIfCriteriaComplete ? "true" : "false"); - // disable for gamemasters with GM-mode enabled - if (_owner->IsGameMaster()) + // Disable for GameMasters with GM-mode enabled or for players that don't have the related RBAC permission + if (_owner->IsGameMaster() || _owner->GetSession()->HasPermission(rbac::RBAC_PERM_CANNOT_EARN_ACHIEVEMENTS)) return; if (CriteriaList const* achievementCriteriaList = sCriteriaMgr->GetCriteriaByFailEvent(failEvent, failAsset)) @@ -495,8 +501,8 @@ void PlayerAchievementMgr::SendAchievementInfo(Player* receiver, uint32 /*achiev void PlayerAchievementMgr::CompletedAchievement(AchievementEntry const* achievement, Player* referencePlayer) { - // disable for gamemasters with GM-mode enabled - if (_owner->IsGameMaster()) + // Disable for GameMasters with GM-mode enabled or for players that don't have the related RBAC permission + if (_owner->IsGameMaster() || _owner->GetSession()->HasPermission(rbac::RBAC_PERM_CANNOT_EARN_ACHIEVEMENTS)) return; if ((achievement->Faction == ACHIEVEMENT_FACTION_HORDE && referencePlayer->GetTeam() != HORDE) || diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp index 964998093da..c3fe055a630 100644 --- a/src/server/game/Achievements/CriteriaHandler.cpp +++ b/src/server/game/Achievements/CriteriaHandler.cpp @@ -40,6 +40,7 @@ #include "ObjectMgr.h" #include "PhasingHandler.h" #include "Player.h" +#include "RBAC.h" #include "RealmList.h" #include "ReputationMgr.h" #include "Scenario.h" @@ -472,11 +473,12 @@ void CriteriaHandler::UpdateCriteria(CriteriaType type, uint64 miscValue1 /*= 0* return; } - // disable for gamemasters with GM-mode enabled - if (referencePlayer->IsGameMaster()) + // Disable for GameMasters with GM-mode enabled or for players that don't have the related RBAC permission + if (referencePlayer->IsGameMaster() || referencePlayer->GetSession()->HasPermission(rbac::RBAC_PERM_CANNOT_EARN_ACHIEVEMENTS)) { - TC_LOG_DEBUG("criteria", "CriteriaHandler::UpdateCriteria: [Player %s GM mode on] %s, %s (%u), " UI64FMTD ", " UI64FMTD ", " UI64FMTD, - referencePlayer->GetName().c_str(), GetOwnerInfo().c_str(), CriteriaMgr::GetCriteriaTypeString(type), uint32(type), miscValue1, miscValue2, miscValue3); + TC_LOG_DEBUG("criteria", "CriteriaHandler::UpdateCriteria: [Player %s %s] %s, %s (%u), " UI64FMTD ", " UI64FMTD ", " UI64FMTD, + referencePlayer->GetName().c_str(), referencePlayer->IsGameMaster() ? "GM mode on" : "disallowed by RBAC", + GetOwnerInfo().c_str(), CriteriaMgr::GetCriteriaTypeString(type), uint32(type), miscValue1, miscValue2, miscValue3); return; } |