mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 15:40:45 +01:00
Battleground/Arena: Properly check RBAC arena join permission before allowing queue. Closes #23000.
(cherry picked from commit af082664ca)
This commit is contained in:
@@ -23917,20 +23917,13 @@ void Player::LeaveBattleground(bool teleportToEntryPoint)
|
||||
|
||||
bool Player::CanJoinToBattleground(Battleground const* bg) const
|
||||
{
|
||||
// check Deserter debuff
|
||||
if (HasAura(26013))
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
return true;
|
||||
return GetSession()->HasPermission(perm);
|
||||
}
|
||||
|
||||
bool Player::CanReportAfkDueToLimit()
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -118,8 +118,17 @@ 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);
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user