diff --git a/Source/Framework/Constants/AccountConst.cs b/Source/Framework/Constants/AccountConst.cs index 7bf0b96e4..fa411b45d 100644 --- a/Source/Framework/Constants/AccountConst.cs +++ b/Source/Framework/Constants/AccountConst.cs @@ -64,8 +64,8 @@ namespace Framework.Constants JoinArenas = 5, JoinDungeonFinder = 6, IgnoreIdleConnection = 7, - // 8 - Reuse - // 9 - Reuse + CannotEarnAchievements = 8, + CannotEarnRealmFirstAchievements = 9, UseCharacterTemplates = 10, LogGmTrade = 11, SkipCheckCharacterCreationDemonHunter = 12, diff --git a/Source/Game/Achievements/AchievementManager.cs b/Source/Game/Achievements/AchievementManager.cs index c0b90737d..e0f10147b 100644 --- a/Source/Game/Achievements/AchievementManager.cs +++ b/Source/Game/Achievements/AchievementManager.cs @@ -88,10 +88,15 @@ namespace Game.Achievements (achievement.Faction == AchievementFaction.Alliance && referencePlayer.GetTeam() != Team.Alliance)) { Log.outTrace(LogFilter.Achievement, "CanUpdateCriteriaTree: (Id: {0} Type {1} Achievement {2}) Wrong faction", - criteria.Id, criteria.Entry.Type, achievement.Id); + criteria.Id, criteria.Entry.Type, achievement.Id); return false; } + // Don't update realm first achievements if the player's account isn't allowed to do so + if (achievement.Flags.HasAnyFlag(AchievementFlags.RealmFirstReach | AchievementFlags.RealmFirstKill)) + if (referencePlayer.GetSession().HasPermission(RBACPermissions.CannotEarnRealmFirstAchievements)) + return false; + if (achievement.CovenantID != 0 && referencePlayer.m_playerData.CovenantID != achievement.CovenantID) { Log.outTrace(LogFilter.Achievement, $"CanUpdateCriteriaTree: (Id: {criteria.Id} Type {criteria.Entry.Type} Achievement {achievement.Id}) Wrong covenant"); @@ -373,8 +378,8 @@ namespace Game.Achievements { Log.outDebug(LogFilter.Achievement, $"ResetAchievementCriteria({failEvent}, {failAsset}, {evenIfCriteriaComplete})"); - // 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(RBACPermissions.CannotEarnAchievements)) return; var achievementCriteriaList = Global.CriteriaMgr.GetCriteriaByFailEvent(failEvent, (int)failAsset); @@ -499,8 +504,8 @@ namespace Game.Achievements public override void CompletedAchievement(AchievementRecord 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(RBACPermissions.CannotEarnAchievements)) return; if ((achievement.Faction == AchievementFaction.Horde && referencePlayer.GetTeam() != Team.Horde) || diff --git a/Source/Game/Achievements/CriteriaHandler.cs b/Source/Game/Achievements/CriteriaHandler.cs index a7c466c01..eff2d6bda 100644 --- a/Source/Game/Achievements/CriteriaHandler.cs +++ b/Source/Game/Achievements/CriteriaHandler.cs @@ -70,10 +70,11 @@ namespace Game.Achievements 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(RBACPermissions.CannotEarnAchievements)) { - Log.outDebug(LogFilter.Achievement, "UpdateCriteria: [Player {0} GM mode on] {1}, {2} ({3}), {4}, {5}, {6}", referencePlayer.GetName(), GetOwnerInfo(), type, type, miscValue1, miscValue2, miscValue3); + Log.outDebug(LogFilter.Achievement, $"CriteriaHandler::UpdateCriteria: [Player {referencePlayer.GetName()} {(referencePlayer.IsGameMaster() ? "GM mode on" : "disallowed by RBAC")}]" + + $" {GetOwnerInfo()}, {type} ({(uint)type}), {miscValue1}, {miscValue2}, {miscValue3}"); return; }