aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorWyrserth <wyrserth@protonmail.com>2019-06-21 20:17:37 +0200
committerGiacomo Pozzoni <giacomopoz@gmail.com>2019-06-21 20:17:37 +0200
commit8163ea60c8d517ebe3a88f595dd8291df8338811 (patch)
treebf399e22a35f36f05744f70f8b6a04d19b524df2 /src
parente9d803ccee2fb5d229babbf6c2c4a17b1986edb0 (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.h4
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp22
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;