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
This commit is contained in:
Wyrserth
2019-06-21 20:17:37 +02:00
committed by Giacomo Pozzoni
parent e9d803ccee
commit 8163ea60c8
4 changed files with 28 additions and 11 deletions

View File

@@ -358,6 +358,7 @@ INSERT INTO `rbac_linked_permissions` VALUES
(193,197),
(194,1),
(194,2),
(194,9),
(194,11),
(194,13),
(194,14),
@@ -1001,6 +1002,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"),
(11,'Log GM trades'),
(13,'Skip Instance required bosses check'),
(14,'Skip character creation team mask check'),
@@ -1789,7 +1792,8 @@ INSERT INTO `updates` VALUES
('2019_05_15_00_auth.sql','8A7B96E66D689DA63380654142FF60A1EE938697','ARCHIVED','2019-05-15 06:13:20',0),
('2019_06_06_00_auth.sql','6DE8159E04BEE7BA0A4A81D72D160EB74934B6A5','ARCHIVED','2019-06-06 18:09:54',0),
('2019_06_15_00_auth.sql','456B92D99FFD2E7B6CBF64F4C68555A42B24B298','ARCHIVED','2019-06-15 07:33:45',0),
('2019_06_16_00_auth.sql','B14AED4D3387B56FF8C8161D3671750AEEAE0F2E','ARCHIVED','2019-06-15 23:32:12',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);
/*!40000 ALTER TABLE `updates` ENABLE KEYS */;
UNLOCK TABLES;

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

View File

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