bool ChallengeMgr::InviteGroupsToArena(Player *leader1, Player *leader2, ArenaChallengeType type) { uint8 arenatype = (type == ARENA_CHALLENGE_TYPE_1v1) ? ARENA_CHALLENGE_TYPE_2v2 : type; uint32 matchmakerRating = 0; //check existance Battleground* bg = sBattlegroundMgr->GetBattlegroundTemplate(BATTLEGROUND_AA); if (!bg) { sLog->outError("Battleground: template bg (all arenas) not found"); return false; } BattlegroundTypeId bgTypeId = bg->GetTypeID(); BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(bgTypeId, arenatype); PvPDifficultyEntry const* bracketEntry = GetBattlegroundBracketByLevel(bg->GetMapId(), 80); if (!bracketEntry) return false; GroupQueueInfo *group1, *group2; if (type == ARENA_CHALLENGE_TYPE_1v1) { group1 = CreateGroupQueueInfo(leader1, bgTypeId, arenatype); group2 = CreateGroupQueueInfo(leader2, bgTypeId, arenatype); } else { group1 = CreateGroupQueueInfo(leader1->GetGroup(), bgTypeId, arenatype); group2 = CreateGroupQueueInfo(leader2->GetGroup(), bgTypeId, arenatype); } if (!group1 || !group2) return false; for (std::map<uint64, PlayerQueueInfo*>::iterator itr = group1->Players.begin(); itr != group1->Players.end(); ++itr) { Player *player = ObjectAccessor::FindPlayer(itr->first); if (!player) return false; if (!CanInvitePlayer(player, bgQueueTypeId)) return false; } for (std::map<uint64, PlayerQueueInfo*>::iterator itr = group2->Players.begin(); itr != group2->Players.end(); ++itr) { Player *player = ObjectAccessor::FindPlayer(itr->first); if (!player) return false; if (!CanInvitePlayer(player, bgQueueTypeId)) return false; } sBattlegroundMgr->ScheduleQueueUpdate(matchmakerRating, arenatype, bgQueueTypeId, bgTypeId, bracketEntry->GetBracketId()); Battleground *arena = sBattlegroundMgr->CreateNewBattleground(bgTypeId, bracketEntry, arenatype, true); arena->SetRated(false); if (type == ARENA_CHALLENGE_TYPE_1v1) arena->Set1vs1(true); for (std::map<uint64, PlayerQueueInfo*>::iterator itr = group1->Players.begin(); itr != group1->Players.end(); ++itr) { Player *player = ObjectAccessor::FindPlayer(itr->first); if (!player) return false; uint32 queueSlot = player->AddBattlegroundQueueId(bgQueueTypeId); WorldPacket data; // send status packet (in queue) sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_QUEUE, 0, 0, arenatype); player->GetSession()->SendPacket(&data); player->challengeData->bg = arena; player->challengeData->ginfo = CreateGroupQueueInfo(player, bgTypeId, arenatype); player->challengeData->ginfo->IsInvitedToBGInstanceGUID = arena->GetInstanceID(); player->challengeData->ginfo->Team = ALLIANCE; } for (std::map<uint64, PlayerQueueInfo*>::iterator itr = group2->Players.begin(); itr != group2->Players.end(); ++itr) { Player *player = ObjectAccessor::FindPlayer(itr->first); if (!player) return false; uint32 queueSlot = player->AddBattlegroundQueueId(bgQueueTypeId); WorldPacket data; // send status packet (in queue) sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_QUEUE, 0, 0, arenatype); player->GetSession()->SendPacket(&data); player->challengeData->bg = arena; player->challengeData->ginfo = CreateGroupQueueInfo(player, bgTypeId, arenatype); player->challengeData->ginfo->IsInvitedToBGInstanceGUID = arena->GetInstanceID(); player->challengeData->ginfo->Team = HORDE; } InviteGroupToArena(group1, arena, ALLIANCE); InviteGroupToArena(group2, arena, HORDE); arena->StartBattleground(); if (!sBattlegroundMgr->HasBattleground(arena)) sBattlegroundMgr->AddBattleground(group1->IsInvitedToBGInstanceGUID, bgTypeId, arena); return true; }