diff options
author | Wyrserth <wyrserth@protonmail.com> | 2019-06-21 20:17:37 +0200 |
---|---|---|
committer | Giacomo Pozzoni <giacomopoz@gmail.com> | 2019-06-21 20:17:37 +0200 |
commit | 8163ea60c8d517ebe3a88f595dd8291df8338811 (patch) | |
tree | bf399e22a35f36f05744f70f8b6a04d19b524df2 /src | |
parent | e9d803ccee2fb5d229babbf6c2c4a17b1986edb0 (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
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Accounts/RBAC.h | 4 | ||||
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.cpp | 22 |
2 files changed, 16 insertions, 10 deletions
diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index d16fa0cd3f9..94e9aa7463c 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, // not on 3.3.5a RBAC_PERM_LOG_GM_TRADE = 11, RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_DEMON_HUNTER = 12, // not on 3.3.5a diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 902aec5faf5..3cf08e834e7 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -38,6 +38,7 @@ #include "MapManager.h" #include "ObjectMgr.h" #include "Player.h" +#include "RBAC.h" #include "ReputationMgr.h" #include "ScriptMgr.h" #include "SpellInfo.h" @@ -511,8 +512,8 @@ void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaCondition condi { TC_LOG_DEBUG("achievement", "AchievementMgr::ResetAchievementCriteria(%u, %u, %u)", condition, value, evenIfCriteriaComplete); - // disable for gamemasters with GM-mode enabled - if (m_player->IsGameMaster()) + // Disable for GameMasters with GM-mode enabled or for players that don't have the related RBAC permission + if (m_player->IsGameMaster() || m_player->GetSession()->HasPermission(rbac::RBAC_PERM_CANNOT_EARN_ACHIEVEMENTS)) return; AchievementCriteriaEntryList const* achievementCriteriaList = sAchievementMgr->GetAchievementCriteriaByCondition(condition, value); @@ -758,11 +759,11 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui return; } - // disable for gamemasters with GM-mode enabled - if (m_player->IsGameMaster()) + // Disable for GameMasters with GM-mode enabled or for players that don't have the related RBAC permission + if (m_player->IsGameMaster() || m_player->GetSession()->HasPermission(rbac::RBAC_PERM_CANNOT_EARN_ACHIEVEMENTS)) { - TC_LOG_DEBUG("achievement", "UpdateAchievementCriteria: [Player %s GM mode on] %s, %s (%u), %u, %u" - , m_player->GetName().c_str(), m_player->GetGUID().ToString().c_str(), AchievementGlobalMgr::GetCriteriaTypeString(type), type, miscValue1, miscValue2); + TC_LOG_DEBUG("achievement", "UpdateAchievementCriteria: [Player %s %s] %s, %s (%u), %u, %u" + , m_player->GetName().c_str(), m_player->IsGameMaster() ? "GM mode on" : "disallowed by RBAC", m_player->GetGUID().ToString().c_str(), AchievementGlobalMgr::GetCriteriaTypeString(type), type, miscValue1, miscValue2); return; } @@ -1511,8 +1512,8 @@ void AchievementMgr::RemoveTimedAchievement(AchievementCriteriaTimedTypes type, void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement) { - // disable for gamemasters with GM-mode enabled - if (m_player->IsGameMaster()) + // Disable for GameMasters with GM-mode enabled or for players that don't have the related RBAC permission + if (m_player->IsGameMaster() || m_player->GetSession()->HasPermission(rbac::RBAC_PERM_CANNOT_EARN_ACHIEVEMENTS)) return; if (achievement->Flags & ACHIEVEMENT_FLAG_COUNTER || HasAchieved(achievement->ID)) @@ -1678,6 +1679,11 @@ bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, 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 (GetPlayer()->GetSession()->HasPermission(rbac::RBAC_PERM_CANNOT_EARN_REALM_FIRST_ACHIEVEMENTS)) + return false; + // don't update already completed criteria if (IsCompletedCriteria(criteria, achievement)) return false; |