diff options
author | Treeston <treeston.mmoc@gmail.com> | 2019-07-12 14:14:01 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-12-15 23:31:31 +0100 |
commit | a69a061d76fe4e142e84c775230e2fcbd6ddb9d4 (patch) | |
tree | 1573037ff6f0f016a8fa350c77b47b0ed93e0b1a /src | |
parent | b4b581de1b9d2fd6afef02d1734e69b3ce6a8e63 (diff) |
Battleground/Arena: Properly check RBAC arena join permission before allowing queue. Closes #23000.
(cherry picked from commit af082664ca8ff76cc8ef1947d6ce76310d65b58b)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 19 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 | ||||
-rw-r--r-- | src/server/game/Groups/Group.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Handlers/BattleGroundHandler.cpp | 21 |
4 files changed, 31 insertions, 16 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 0a5a21aaab9..ad525d51145 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -23917,20 +23917,13 @@ void Player::LeaveBattleground(bool teleportToEntryPoint) bool Player::CanJoinToBattleground(Battleground const* bg) const { - // check Deserter debuff - if (HasAura(26013)) - return false; - - if (bg->isArena() && !GetSession()->HasPermission(rbac::RBAC_PERM_JOIN_ARENAS)) - return false; - - if (bg->IsRandom() && !GetSession()->HasPermission(rbac::RBAC_PERM_JOIN_RANDOM_BG)) - return false; - - if (!GetSession()->HasPermission(rbac::RBAC_PERM_JOIN_NORMAL_BG)) - return false; + uint32 perm = rbac::RBAC_PERM_JOIN_NORMAL_BG; + if (bg->isArena()) + perm = rbac::RBAC_PERM_JOIN_ARENAS; + else if (bg->IsRandom()) + perm = rbac::RBAC_PERM_JOIN_RANDOM_BG; - return true; + return GetSession()->HasPermission(perm); } bool Player::CanReportAfkDueToLimit() diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index b33859d96ea..387671c7e86 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2316,6 +2316,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> uint32 GetBattlegroundQueueJoinTime(BattlegroundQueueTypeId bgQueueTypeId) const; bool InBattlegroundQueue(bool ignoreArena = false) const; + bool IsDeserter() const { return HasAura(26013); } + BattlegroundQueueTypeId GetBattlegroundQueueTypeId(uint32 index) const; uint32 GetBattlegroundQueueIndex(BattlegroundQueueTypeId bgQueueTypeId) const; bool IsInvitedForBattlegroundQueueType(BattlegroundQueueTypeId bgQueueTypeId) const; diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index bd89e252b87..9533d3657d8 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -1900,6 +1900,9 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* // offline member? don't let join if (!member) return ERR_BATTLEGROUND_JOIN_FAILED; + // rbac permissions + if (!member->CanJoinToBattleground(bgOrTemplate)) + return ERR_BATTLEGROUND_JOIN_TIMED_OUT; // don't allow cross-faction join as group if (member->GetTeam() != team) { @@ -1925,7 +1928,7 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* if ((bgOrTemplate->GetTypeID() == BATTLEGROUND_RB || bgOrTemplate->GetTypeID() == BATTLEGROUND_RANDOM_EPIC) && member->InBattlegroundQueue(true) && !isInRandomBgQueue) return ERR_IN_NON_RANDOM_BG; // check for deserter debuff in case not arena queue - if (bgOrTemplate->GetTypeID() != BATTLEGROUND_AA && !member->CanJoinToBattleground(bgOrTemplate)) + if (bgOrTemplate->GetTypeID() != BATTLEGROUND_AA && member->IsDeserter()) return ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS; // check if member can join any more battleground queues if (!member->HasFreeBattlegroundQueueId()) diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index a01b18116f1..6eed6f7099f 100644 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -118,10 +118,19 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPackets::Battleground::Batt return; } - // check Deserter debuff + // check RBAC permissions if (!_player->CanJoinToBattleground(bg)) { WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusFailed(&battlefieldStatus, bgQueueTypeId, _player, 0, ERR_BATTLEGROUND_JOIN_TIMED_OUT); + SendPacket(battlefieldStatus.Write()); + return; + } + + // check Deserter debuff + if (_player->IsDeserter()) + { + WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; sBattlegroundMgr->BuildBattlegroundStatusFailed(&battlefieldStatus, bgQueueTypeId, _player, 0, ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS); SendPacket(battlefieldStatus.Write()); return; @@ -326,7 +335,7 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPackets::Battleground::Battl if (battlefieldPort.AcceptedInvite && bgQueue.GetQueueId().TeamSize == 0) { //if player is trying to enter battleground (not arena!) and he has deserter debuff, we must just remove him from queue - if (!_player->CanJoinToBattleground(bg)) + if (_player->IsDeserter()) { //send bg command result to show nice message WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; @@ -566,6 +575,14 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPackets::Battleground::Battl continue; } + if (!_player->CanJoinToBattleground(bg)) + { + WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusFailed(&battlefieldStatus, bgQueueTypeId, _player, 0, ERR_BATTLEGROUND_JOIN_FAILED, &errorGuid); + member->SendDirectMessage(battlefieldStatus.Write()); + return; + } + // add to queue uint32 queueSlot = member->AddBattlegroundQueueId(bgQueueTypeId); |