diff options
| -rw-r--r-- | sql/base/auth_database.sql | 6 | ||||
| -rw-r--r-- | sql/updates/auth/3.3.5/2019_06_21_00_auth.sql | 7 | ||||
| -rw-r--r-- | src/server/game/Accounts/RBAC.h | 4 | ||||
| -rw-r--r-- | src/server/game/Achievements/AchievementMgr.cpp | 22 | 
4 files changed, 28 insertions, 11 deletions
| diff --git a/sql/base/auth_database.sql b/sql/base/auth_database.sql index 54120fbfa0d..2018786b018 100644 --- a/sql/base/auth_database.sql +++ b/sql/base/auth_database.sql @@ -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; diff --git a/sql/updates/auth/3.3.5/2019_06_21_00_auth.sql b/sql/updates/auth/3.3.5/2019_06_21_00_auth.sql new file mode 100644 index 00000000000..1db042a632f --- /dev/null +++ b/sql/updates/auth/3.3.5/2019_06_21_00_auth.sql @@ -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); 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; | 
