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 8163ea60c8)
This commit is contained in:
Wyrserth
2019-06-21 20:17:37 +02:00
committed by Shauren
parent 8fc52bc5e5
commit b709ea9a8d
5 changed files with 29 additions and 10 deletions

View File

@@ -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),

View File

@@ -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);

View File

@@ -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,

View File

@@ -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) ||

View File

@@ -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;
}