aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2019-07-12 14:14:01 +0200
committerTreeston <treeston.mmoc@gmail.com>2019-07-12 14:14:01 +0200
commitaf082664ca8ff76cc8ef1947d6ce76310d65b58b (patch)
tree7c352532bc317d675affbc18f45c8410082b99ef /src
parentdaf423a6c3c0fdd13e421f02ccd791103f7bdd5b (diff)
Battleground/Arena: Properly check RBAC arena join permission before allowing queue. Closes #23000.
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp19
-rw-r--r--src/server/game/Entities/Player/Player.h1
-rw-r--r--src/server/game/Groups/Group.cpp5
-rw-r--r--src/server/game/Handlers/BattleGroundHandler.cpp21
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)