diff options
| author | Gooyeth <migmadmu@hotmail.com> | 2018-03-26 03:21:10 -0600 |
|---|---|---|
| committer | jackpoz <giacomopoz@gmail.com> | 2018-03-26 11:21:10 +0200 |
| commit | f39919ca8c323e5f0005b29a49ff9d5b8c5fd96b (patch) | |
| tree | dab6c08c2c3e2473b354c5c9770c5601433b38f6 /src | |
| parent | fb31cb7c047f4d79e7bea04b72175e6ef251a317 (diff) | |
Core/ArenaTeam: Remove queues of members if a character is removed (#21491)
* Core/ArenaTeam: Remove queues of members when a character is removed from the team
* Remove only if you do not have an invitation
* If have an invitation, do not leave the team
* Send packet when leaving queue
* Fix build
* It's possible that there are two or more groups of arenas, then we eliminate from the queue only the members of the group that leaves the team
- Changed FindPlayer to FindConnectedPlayer for possible screen loads
* Change to FindConnectPlayer
The leader can remove while the player is loading screen.
Diffstat (limited to 'src')
| -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; |
