diff options
| -rw-r--r-- | src/server/game/Battlegrounds/ArenaTeam.cpp | 28 | ||||
| -rw-r--r-- | src/server/game/Handlers/ArenaTeamHandler.cpp | 37 | 
2 files changed, 64 insertions, 1 deletions
| diff --git a/src/server/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp index e9fa1df6f88..54bebb9bc1c 100644 --- a/src/server/game/Battlegrounds/ArenaTeam.cpp +++ b/src/server/game/Battlegrounds/ArenaTeam.cpp @@ -18,6 +18,7 @@  #include "ArenaTeam.h"  #include "ArenaTeamMgr.h" +#include "BattlegroundMgr.h"  #include "CharacterCache.h"  #include "DatabaseEnv.h"  #include "Group.h" @@ -314,9 +315,34 @@ void ArenaTeam::SetCaptain(ObjectGuid guid)  void ArenaTeam::DelMember(ObjectGuid guid, bool cleanDb)  { +    Player* player = ObjectAccessor::FindConnectedPlayer(guid); +    Group* group = (player && player->GetGroup()) ? player->GetGroup() : nullptr; +          // Remove member from team      for (MemberList::iterator itr = Members.begin(); itr != Members.end(); ++itr)      { +        // Remove queues of members +        if (Player* playerMember = ObjectAccessor::FindConnectedPlayer(itr->Guid)) +        { +            if (group && playerMember->GetGroup() && group->GetGUID() == playerMember->GetGroup()->GetGUID()) +            { +                if (BattlegroundQueueTypeId bgQueue = BattlegroundMgr::BGQueueTypeId(BATTLEGROUND_AA, GetType())) +                { +                    GroupQueueInfo ginfo; +                    BattlegroundQueue& queue = sBattlegroundMgr->GetBattlegroundQueue(bgQueue); +                    if (queue.GetPlayerGroupInfoData(playerMember->GetGUID(), &ginfo)) +                        if (!ginfo.IsInvitedToBGInstanceGUID) +                        { +                            WorldPacket data; +                            playerMember->RemoveBattlegroundQueueId(bgQueue); +                            sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, nullptr, playerMember->GetBattlegroundQueueIndex(bgQueue), STATUS_NONE, 0, 0, 0, 0); +                            queue.RemovePlayer(playerMember->GetGUID(), true); +                            playerMember->GetSession()->SendPacket(&data); +                        } +                } +            } +        } +          if (itr->Guid == guid)          {              Members.erase(itr); @@ -326,7 +352,7 @@ void ArenaTeam::DelMember(ObjectGuid guid, bool cleanDb)      }      // Inform player and remove arena team info from player data -    if (Player* player = ObjectAccessor::FindPlayer(guid)) +    if (player)      {          player->GetSession()->SendArenaTeamCommandResult(ERR_ARENA_TEAM_QUIT_S, GetName(), "", 0);          // delete all info regarding this team diff --git a/src/server/game/Handlers/ArenaTeamHandler.cpp b/src/server/game/Handlers/ArenaTeamHandler.cpp index 7d5248e25dc..25c7b96c68d 100644 --- a/src/server/game/Handlers/ArenaTeamHandler.cpp +++ b/src/server/game/Handlers/ArenaTeamHandler.cpp @@ -19,6 +19,7 @@  #include "WorldSession.h"  #include "ArenaTeam.h"  #include "ArenaTeamMgr.h" +#include "BattlegroundMgr.h"  #include "CharacterCache.h"  #include "Log.h"  #include "ObjectAccessor.h" @@ -233,6 +234,19 @@ void WorldSession::HandleArenaTeamLeaveOpcode(WorldPacket& recvData)          return;      } +    // Player cannot be removed during queues +    if (BattlegroundQueueTypeId bgQueue = BattlegroundMgr::BGQueueTypeId(BATTLEGROUND_AA, arenaTeam->GetType())) +    { +        GroupQueueInfo ginfo; +        BattlegroundQueue& queue = sBattlegroundMgr->GetBattlegroundQueue(bgQueue); +        if (queue.GetPlayerGroupInfoData(_player->GetGUID(), &ginfo)) +            if (ginfo.IsInvitedToBGInstanceGUID) +            { +                SendArenaTeamCommandResult(ERR_ARENA_TEAM_QUIT_S, "", "", ERR_ARENA_TEAMS_LOCKED); +                return; +            } +    } +      // If team consists only of the captain, disband the team      if (_player->GetGUID() == arenaTeam->GetCaptain())      { @@ -263,6 +277,16 @@ void WorldSession::HandleArenaTeamDisbandOpcode(WorldPacket& recvData)          if (arenaTeam->GetCaptain() != _player->GetGUID())              return; +        // Teams cannot be disbanded during queues +        if (BattlegroundQueueTypeId bgQueue = BattlegroundMgr::BGQueueTypeId(BATTLEGROUND_AA, arenaTeam->GetType())) +        { +            GroupQueueInfo ginfo; +            BattlegroundQueue& queue = sBattlegroundMgr->GetBattlegroundQueue(bgQueue); +            if (queue.GetPlayerGroupInfoData(_player->GetGUID(), &ginfo)) +                if (ginfo.IsInvitedToBGInstanceGUID) +                    return; +        } +          // Teams cannot be disbanded during fights          if (arenaTeam->IsFighting())              return; @@ -312,6 +336,19 @@ void WorldSession::HandleArenaTeamRemoveOpcode(WorldPacket& recvData)          return;      } +    // Team cannot be removed during queues +    if (BattlegroundQueueTypeId bgQueue = BattlegroundMgr::BGQueueTypeId(BATTLEGROUND_AA, arenaTeam->GetType())) +    { +        GroupQueueInfo ginfo; +        BattlegroundQueue& queue = sBattlegroundMgr->GetBattlegroundQueue(bgQueue); +        if (queue.GetPlayerGroupInfoData(_player->GetGUID(), &ginfo)) +            if (ginfo.IsInvitedToBGInstanceGUID) +            { +                SendArenaTeamCommandResult(ERR_ARENA_TEAM_QUIT_S, "", "", ERR_ARENA_TEAMS_LOCKED); +                return; +            } +    } +      // Player cannot be removed during fights      if (arenaTeam->IsFighting())          return; | 
