diff options
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 19 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 1 | ||||
-rw-r--r-- | src/server/game/Groups/Group.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Handlers/BattleGroundHandler.cpp | 21 |
4 files changed, 30 insertions, 16 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index f50918a2b44..a62d8873264 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -22178,20 +22178,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 74bf97fd81c..00ee3aa2bf8 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1903,6 +1903,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> Battleground* GetBattleground() const; bool InBattlegroundQueue(bool ignoreArena = false) const; + bool IsDeserter() const { return HasAura(26013); } BattlegroundQueueTypeId GetBattlegroundQueueTypeId(uint32 index) const; uint32 GetBattlegroundQueueIndex(BattlegroundQueueTypeId bgQueueTypeId) const; diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 1057e8bd0d3..c0824e58ba1 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -1996,6 +1996,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) return ERR_BATTLEGROUND_JOIN_TIMED_OUT; @@ -2016,7 +2019,7 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* if (bgOrTemplate->GetTypeID() == BATTLEGROUND_RB && member->InBattlegroundQueue(true)) 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 dbd858d7673..f57e82ae653 100644 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -138,9 +138,18 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData) GetPlayer()->SendDirectMessage(&data); return; } + + // check RBAC permissions + if (!_player->CanJoinToBattleground(bg)) + { + WorldPacket data; + sBattlegroundMgr->BuildGroupJoinedBattlegroundPacket(&data, ERR_BATTLEGROUND_JOIN_TIMED_OUT); + GetPlayer()->SendDirectMessage(&data); + return; + } // check Deserter debuff - if (!_player->CanJoinToBattleground(bg)) + if (_player->IsDeserter()) { WorldPacket data; sBattlegroundMgr->BuildGroupJoinedBattlegroundPacket(&data, ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS); @@ -419,7 +428,7 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) if (action == 1 && ginfo.ArenaType == 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 WorldPacket data2; @@ -672,6 +681,14 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket& recvData) _player->SendDirectMessage(&data); return; } + + if (!_player->CanJoinToBattleground(bg)) + { + WorldPacket data; + sBattlegroundMgr->BuildGroupJoinedBattlegroundPacket(&data, ERR_BATTLEGROUND_JOIN_FAILED); + _player->SendDirectMessage(&data); + return; + } // check if already in queue if (_player->GetBattlegroundQueueIndex(bgQueueTypeId) < PLAYER_MAX_BATTLEGROUND_QUEUES) |