diff options
Diffstat (limited to 'src/game/BattleGroundHandler.cpp')
| -rw-r--r-- | src/game/BattleGroundHandler.cpp | 562 | 
1 files changed, 273 insertions, 289 deletions
diff --git a/src/game/BattleGroundHandler.cpp b/src/game/BattleGroundHandler.cpp index 1cb0084a1d1..6d16abfd5ea 100644 --- a/src/game/BattleGroundHandler.cpp +++ b/src/game/BattleGroundHandler.cpp @@ -1,7 +1,7 @@  /* - * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/> + * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>   * - * Copyright (C) 2008 Trinity <http://www.trinitycore.org/> + * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>   *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by @@ -19,32 +19,32 @@   */  #include "Common.h" -#include "WorldPacket.h" -#include "Opcodes.h" -#include "Log.h" -#include "Player.h" +#include "ObjectAccessor.h"  #include "ObjectMgr.h" +#include "WorldPacket.h"  #include "WorldSession.h" -#include "MapManager.h" -#include "ObjectAccessor.h" -#include "Object.h" -#include "Chat.h" + +#include "ArenaTeam.h"  #include "BattleGroundMgr.h"  #include "BattleGroundWS.h"  #include "BattleGround.h" -#include "ArenaTeam.h" +#include "Chat.h"  #include "Language.h" +#include "Log.h" +#include "Player.h" +#include "Object.h" +#include "Opcodes.h" -void WorldSession::HandleBattleGroundHelloOpcode( WorldPacket & recv_data ) +void WorldSession::HandleBattlemasterHelloOpcode( WorldPacket & recv_data )  {      CHECK_PACKET_SIZE(recv_data, 8);      uint64 guid;      recv_data >> guid; -    sLog.outDebug( "WORLD: Recvd CMSG_BATTLEMASTER_HELLO Message from: " I64FMT, guid); +    sLog.outDebug( "WORLD: Recvd CMSG_BATTLEMASTER_HELLO Message from (GUID: %u TypeId:%u)", GUID_LOPART(guid),GuidHigh2TypeId(GUID_HIPART(guid))); -    Creature *unit = ObjectAccessor::GetCreature(*_player, guid); -    if(!unit) +    Creature *unit = GetPlayer()->GetMap()->GetCreature(guid); +    if (!unit)          return;      if(!unit->isBattleMaster())                             // it's not battlemaster @@ -53,9 +53,9 @@ void WorldSession::HandleBattleGroundHelloOpcode( WorldPacket & recv_data )      // Stop the npc if moving      unit->StopMoving(); -    uint32 bgTypeId = objmgr.GetBattleMasterBG(unit->GetEntry()); +    BattleGroundTypeId bgTypeId = sBattleGroundMgr.GetBattleMasterBG(unit->GetEntry()); -    if(!_player->GetBGAccessByLevel(bgTypeId)) +    if (!_player->GetBGAccessByLevel(bgTypeId))      {                                                              // temp, must be gossip message...          SendNotification(LANG_YOUR_BG_LEVEL_REQ_ERROR); @@ -65,69 +65,65 @@ void WorldSession::HandleBattleGroundHelloOpcode( WorldPacket & recv_data )      SendBattlegGroundList(guid, bgTypeId);  } -void WorldSession::SendBattlegGroundList( uint64 guid, uint32 bgTypeId ) +void WorldSession::SendBattlegGroundList( uint64 guid, BattleGroundTypeId bgTypeId )  {      WorldPacket data; -    sBattleGroundMgr.BuildBattleGroundListPacket(&data, guid, _player, bgTypeId); +    sBattleGroundMgr.BuildBattleGroundListPacket(&data, guid, _player, bgTypeId, 0);      SendPacket( &data );  } -void WorldSession::HandleBattleGroundJoinOpcode( WorldPacket & recv_data ) +void WorldSession::HandleBattlemasterJoinOpcode( WorldPacket & recv_data )  {      CHECK_PACKET_SIZE(recv_data, 8+4+4+1);      uint64 guid; -    uint32 bgTypeId; +    uint32 bgTypeId_;      uint32 instanceId;      uint8 joinAsGroup; +    bool isPremade = false;      Group * grp;      recv_data >> guid;                                      // battlemaster guid -    recv_data >> bgTypeId;                                  // battleground type id (DBC id) +    recv_data >> bgTypeId_;                                 // battleground type id (DBC id)      recv_data >> instanceId;                                // instance id, 0 if First Available selected      recv_data >> joinAsGroup;                               // join as group -    if(bgTypeId >= MAX_BATTLEGROUND_TYPES) +    if (!sBattlemasterListStore.LookupEntry(bgTypeId_))      { -        sLog.outError("Battleground: invalid bgtype received. possible cheater? player guid %u",_player->GetGUIDLow()); +        sLog.outError("Battleground: invalid bgtype (%u) received. possible cheater? player guid %u",bgTypeId_,_player->GetGUIDLow());          return;      } -    sLog.outDebug( "WORLD: Recvd CMSG_BATTLEMASTER_JOIN Message from: " I64FMT, guid); +    BattleGroundTypeId bgTypeId = BattleGroundTypeId(bgTypeId_); + +    sLog.outDebug( "WORLD: Recvd CMSG_BATTLEMASTER_JOIN Message from (GUID: %u TypeId:%u)", GUID_LOPART(guid), GuidHigh2TypeId(GUID_HIPART(guid)));      // can do this, since it's battleground, not arena -    uint32 bgQueueTypeId = sBattleGroundMgr.BGQueueTypeId(bgTypeId, 0); +    BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(bgTypeId, 0);      // ignore if player is already in BG -    if(_player->InBattleGround()) -        return; - -    Creature *unit = ObjectAccessor::GetCreature(*_player, guid); -    if(!unit) -        return; - -    if(!unit->isBattleMaster())                             // it's not battlemaster +    if (_player->InBattleGround())          return;      // get bg instance or bg template if instance not found -    BattleGround * bg = 0; -    if(instanceId) -        BattleGround *bg = sBattleGroundMgr.GetBattleGround(instanceId); +    BattleGround *bg = NULL; +    if (instanceId) +        bg = sBattleGroundMgr.GetBattleGroundThroughClientInstance(instanceId, bgTypeId); -    if(!bg && !(bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId))) +    if (!bg && !(bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId)))      {          sLog.outError("Battleground: no available bg / template found");          return;      }      // check queueing conditions -    if(!joinAsGroup) +    if (!joinAsGroup)      {          // check Deserter debuff -        if( !_player->CanJoinToBattleground() ) +        if (!_player->CanJoinToBattleground())          {              WorldPacket data(SMSG_GROUP_JOINED_BATTLEGROUND, 4); -            data << (uint32) 0xFFFFFFFE; +            data << uint32(0xFFFFFFFE);              _player->GetSession()->SendPacket(&data);              return;          } @@ -136,16 +132,17 @@ void WorldSession::HandleBattleGroundJoinOpcode( WorldPacket & recv_data )              //player is already in this queue              return;          // check if has free queue slots -        if(!_player->HasFreeBattleGroundQueueId()) +        if (!_player->HasFreeBattleGroundQueueId())              return;      }      else      {          grp = _player->GetGroup();          // no group found, error -        if(!grp) +        if (!grp)              return;          uint32 err = grp->CanJoinBattleGroundQueue(bgTypeId, bgQueueTypeId, 0, bg->GetMaxPlayersPerTeam(), false, 0); +        isPremade = (grp->GetMembersCount() >= bg->GetMinPlayersPerTeam());          if (err != BG_JOIN_ERR_OK)          {              SendBattleGroundOrArenaJoinError(err); @@ -155,10 +152,11 @@ void WorldSession::HandleBattleGroundJoinOpcode( WorldPacket & recv_data )      // if we're here, then the conditions to join a bg are met. We can proceed in joining.      // _player->GetGroup() was already checked, grp is already initialized -    if(joinAsGroup /* && _player->GetGroup()*/) +    GroupQueueInfo * ginfo = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddGroup(_player, bgTypeId, 0, false, isPremade, 0); +    uint32 avgTime = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].GetAverageQueueWaitTime(ginfo, _player->GetBattleGroundQueueIdFromLevel(bgTypeId)); +    if (joinAsGroup /* && _player->GetGroup()*/)      {          sLog.outDebug("Battleground: the following players are joining as group:"); -        GroupQueueInfo * ginfo = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddGroup(_player, bgTypeId, 0, false, 0);          for(GroupReference *itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())          {              Player *member = itr->getSource(); @@ -171,7 +169,7 @@ void WorldSession::HandleBattleGroundJoinOpcode( WorldPacket & recv_data )              WorldPacket data;                                                              // send status packet (in queue) -            sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, member->GetTeam(), queueSlot, STATUS_WAIT_QUEUE, 0, 0); +            sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, ginfo->ArenaType);              member->GetSession()->SendPacket(&data);              sBattleGroundMgr.BuildGroupJoinedBattlegroundPacket(&data, bgTypeId);              member->GetSession()->SendPacket(&data); @@ -179,7 +177,6 @@ void WorldSession::HandleBattleGroundJoinOpcode( WorldPacket & recv_data )              sLog.outDebug("Battleground: player joined queue for bg queue type %u bg type %u: GUID %u, NAME %s",bgQueueTypeId,bgTypeId,member->GetGUIDLow(), member->GetName());          }          sLog.outDebug("Battleground: group end"); -        sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, _player->GetBattleGroundQueueIdFromLevel());      }      else      { @@ -190,14 +187,15 @@ void WorldSession::HandleBattleGroundJoinOpcode( WorldPacket & recv_data )          WorldPacket data;                                                              // send status packet (in queue) -        sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, _player->GetTeam(), queueSlot, STATUS_WAIT_QUEUE, 0, 0); +        sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, ginfo->ArenaType);          SendPacket(&data); -        GroupQueueInfo * ginfo = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddGroup(_player, bgTypeId, 0, false, 0);          sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddPlayer(_player, ginfo); -        sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, _player->GetBattleGroundQueueIdFromLevel());          sLog.outDebug("Battleground: player joined queue for bg queue type %u bg type %u: GUID %u, NAME %s",bgQueueTypeId,bgTypeId,_player->GetGUIDLow(), _player->GetName());      } +    sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, _player->GetBattleGroundQueueIdFromLevel(bgTypeId)); +    if (!ginfo->IsInvitedToBGInstanceGUID) +        sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AnnounceWorld(ginfo, _player->GetGUID(), true);  }  void WorldSession::HandleBattleGroundPlayerPositionsOpcode( WorldPacket & /*recv_data*/ ) @@ -209,49 +207,71 @@ void WorldSession::HandleBattleGroundPlayerPositionsOpcode( WorldPacket & /*recv      if(!bg)                                                 // can't be received if player not in battleground          return; -    if(bg->GetTypeID() == BATTLEGROUND_WS) +    switch( bg->GetTypeID() )      { -        uint32 count1 = 0; -        uint32 count2 = 0; +        case BATTLEGROUND_WS: +            { +                uint32 count1 = 0;                                  //always constant zero? +                uint32 count2 = 0;                                  //count of next fields -        Player *ap = objmgr.GetPlayer(((BattleGroundWS*)bg)->GetAllianceFlagPickerGUID()); -        if(ap) ++count2; +                Player *ali_plr = objmgr.GetPlayer(((BattleGroundWS*)bg)->GetAllianceFlagPickerGUID()); +                if (ali_plr) +                    ++count2; -        Player *hp = objmgr.GetPlayer(((BattleGroundWS*)bg)->GetHordeFlagPickerGUID()); -        if(hp) ++count2; +                Player *horde_plr = objmgr.GetPlayer(((BattleGroundWS*)bg)->GetHordeFlagPickerGUID()); +                if (horde_plr) +                    ++count2; -        WorldPacket data(MSG_BATTLEGROUND_PLAYER_POSITIONS, (4+4+16*count1+16*count2)); -        data << count1;                                     // alliance flag holders count -        /*for(uint8 i = 0; i < count1; i++) -        { -            data << uint64(0);                              // guid -            data << (float)0;                               // x -            data << (float)0;                               // y -        }*/ -        data << count2;                                     // horde flag holders count -        if(ap) -        { -            data << (uint64)ap->GetGUID(); -            data << (float)ap->GetPositionX(); -            data << (float)ap->GetPositionY(); -        } -        if(hp) -        { -            data << (uint64)hp->GetGUID(); -            data << (float)hp->GetPositionX(); -            data << (float)hp->GetPositionY(); -        } +                WorldPacket data(MSG_BATTLEGROUND_PLAYER_POSITIONS, (4+4+16*count1+16*count2)); +                data << count1;                                     // alliance flag holders count - obsolete, now always 0 +                /*for(uint8 i = 0; i < count1; ++i) +                { +                    data << uint64(0);                              // guid +                    data << (float)0;                               // x +                    data << (float)0;                               // y +                }*/ +                data << count2;                                     // horde flag holders count - obsolete, now count of next fields +                if (ali_plr) +                { +                    data << (uint64)ali_plr->GetGUID(); +                    data << (float)ali_plr->GetPositionX(); +                    data << (float)ali_plr->GetPositionY(); +                } +                if (horde_plr) +                { +                    data << (uint64)horde_plr->GetGUID(); +                    data << (float)horde_plr->GetPositionX(); +                    data << (float)horde_plr->GetPositionY(); +                } -        SendPacket(&data); +                SendPacket(&data); +            } +            break; +        case BATTLEGROUND_EY: +            //TODO : fix me! +            break; +        case BATTLEGROUND_AB: +        case BATTLEGROUND_AV: +            { +                //for other BG types - send default +                WorldPacket data(MSG_BATTLEGROUND_PLAYER_POSITIONS, (4+4)); +                data << uint32(0); +                data << uint32(0); +                SendPacket(&data); +            } +            break; +        default: +            //maybe it is sent also in arena - do nothing +            break;      }  } -void WorldSession::HandleBattleGroundPVPlogdataOpcode( WorldPacket & /*recv_data*/ ) +void WorldSession::HandlePVPLogDataOpcode( WorldPacket & /*recv_data*/ )  {      sLog.outDebug( "WORLD: Recvd MSG_PVP_LOG_DATA Message");      BattleGround *bg = _player->GetBattleGround(); -    if(!bg) +    if (!bg)          return;      WorldPacket data; @@ -261,32 +281,31 @@ void WorldSession::HandleBattleGroundPVPlogdataOpcode( WorldPacket & /*recv_data      sLog.outDebug( "WORLD: Sent MSG_PVP_LOG_DATA Message");  } -void WorldSession::HandleBattleGroundListOpcode( WorldPacket &recv_data ) +void WorldSession::HandleBattlefieldListOpcode( WorldPacket &recv_data )  { -    CHECK_PACKET_SIZE(recv_data, 4); +    CHECK_PACKET_SIZE(recv_data, 4 + 1);      sLog.outDebug( "WORLD: Recvd CMSG_BATTLEFIELD_LIST Message");      uint32 bgTypeId;      recv_data >> bgTypeId;                                  // id from DBC -    if(bgTypeId >= MAX_BATTLEGROUND_TYPES) +    uint8 fromWhere; +    recv_data >> fromWhere;                                 // 0 - battlemaster, 1 - UI + +    BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(bgTypeId); +    if (!bl)      {          sLog.outError("Battleground: invalid bgtype received.");          return;      } -    BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(bgTypeId); - -    if(!bl) -        return; -      WorldPacket data; -    sBattleGroundMgr.BuildBattleGroundListPacket(&data, _player->GetGUID(), _player, bgTypeId); +    sBattleGroundMgr.BuildBattleGroundListPacket(&data, 0, _player, BattleGroundTypeId(bgTypeId), fromWhere);      SendPacket( &data );  } -void WorldSession::HandleBattleGroundPlayerPortOpcode( WorldPacket &recv_data ) +void WorldSession::HandleBattleFieldPortOpcode( WorldPacket &recv_data )  {      CHECK_PACKET_SIZE(recv_data, 1+1+4+2+1); @@ -295,45 +314,39 @@ void WorldSession::HandleBattleGroundPlayerPortOpcode( WorldPacket &recv_data )      uint8 type;                                             // arenatype if arena      uint8 unk2;                                             // unk, can be 0x0 (may be if was invited?) and 0x1      uint32 instanceId; -    uint32 bgTypeId;                                        // type id from dbc +    uint32 bgTypeId_;                                       // type id from dbc      uint16 unk;                                             // 0x1F90 constant?      uint8 action;                                           // enter battle 0x1, leave queue 0x0 -    recv_data >> type >> unk2 >> bgTypeId >> unk >> action; +    recv_data >> type >> unk2 >> bgTypeId_ >> unk >> action; -    if(bgTypeId >= MAX_BATTLEGROUND_TYPES) +    if (!sBattlemasterListStore.LookupEntry(bgTypeId_))      { -        sLog.outError("Battleground: invalid bgtype received."); +        sLog.outError("Battleground: invalid bgtype (%u) received.", bgTypeId_);          // update battleground slots for the player to fix his UI and sent data.          // this is a HACK, I don't know why the client starts sending invalid packets in the first place.          // it usually happens with extremely high latency (if debugging / stepping in the code for example) -        if(_player->InBattleGroundQueue()) +        if (_player->InBattleGroundQueue())          {              // update all queues, send invitation info if player is invited, queue info if queued -            for (uint32 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; i++) +            for (uint32 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)              { -                uint32 queue_id = _player->GetBattleGroundQueueId(i); -                if(!queue_id) +                BattleGroundQueueTypeId bgQueueTypeId = _player->GetBattleGroundQueueTypeId(i); +                if (!bgQueueTypeId)                      continue; -                BattleGroundQueue::QueuedPlayersMap::iterator itrPlayerStatus = sBattleGroundMgr.m_BattleGroundQueues[queue_id].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel()].find(_player->GetGUID()); -                // if the player is not in queue, contine -                if(itrPlayerStatus == sBattleGroundMgr.m_BattleGroundQueues[queue_id].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel()].end()) -                    continue; - -                // no group information, this should never happen -                if(!itrPlayerStatus->second.GroupInfo) +                BattleGroundTypeId bgTypeId = BattleGroundMgr::BGTemplateId(bgQueueTypeId); +                BattleGroundQueue::QueuedPlayersMap& qpMap = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers; +                BattleGroundQueue::QueuedPlayersMap::iterator itrPlayerStatus = qpMap.find(_player->GetGUID()); +                // if the player is not in queue, continue or no group information - this should never happen +                if (itrPlayerStatus == qpMap.end() || !itrPlayerStatus->second.GroupInfo)                      continue;                  BattleGround * bg = NULL; -                  // get possibly needed data from groupinfo -                bgTypeId = itrPlayerStatus->second.GroupInfo->BgTypeId;                  uint8 arenatype = itrPlayerStatus->second.GroupInfo->ArenaType; -                uint8 israted = itrPlayerStatus->second.GroupInfo->IsRated;                  uint8 status = 0; - -                if(!itrPlayerStatus->second.GroupInfo->IsInvitedToBGInstanceGUID) +                if (!itrPlayerStatus->second.GroupInfo->IsInvitedToBGInstanceGUID)                  {                      // not invited to bg, get template                      bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId); @@ -342,133 +355,127 @@ void WorldSession::HandleBattleGroundPlayerPortOpcode( WorldPacket &recv_data )                  else                  {                      // get the bg we're invited to -                    BattleGround * bg = sBattleGroundMgr.GetBattleGround(itrPlayerStatus->second.GroupInfo->IsInvitedToBGInstanceGUID); +                    bg = sBattleGroundMgr.GetBattleGround(itrPlayerStatus->second.GroupInfo->IsInvitedToBGInstanceGUID, bgTypeId);                      status = STATUS_WAIT_JOIN;                  } -                // if bg not found, then continue -                if(!bg) -                    continue; - -                // don't invite if already in the instance -                if(_player->InBattleGround() && _player->GetBattleGround() && _player->GetBattleGround()->GetInstanceID() == bg->GetInstanceID()) +                // if bg not found, then continue, don't invite if already in the instance +                if (!bg || (_player->InBattleGround() && _player->GetBattleGround() && _player->GetBattleGround()->GetInstanceID() == bg->GetInstanceID()))                      continue;                  // re - invite player with proper data                  WorldPacket data; -                sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, itrPlayerStatus->second.GroupInfo->Team?itrPlayerStatus->second.GroupInfo->Team:_player->GetTeam(), i, status, INVITE_ACCEPT_WAIT_TIME, 0, arenatype, israted); +                sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, i, status, INVITE_ACCEPT_WAIT_TIME, 0, arenatype);                  SendPacket(&data);              }          }          return;      } -    uint32 bgQueueTypeId = 0; -    // get the bg what we were invited to -    BattleGroundQueue::QueuedPlayersMap::iterator itrPlayerStatus; -    bgQueueTypeId = sBattleGroundMgr.BGQueueTypeId(bgTypeId,type); -    itrPlayerStatus = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel()].find(_player->GetGUID()); - -    if(itrPlayerStatus == sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel()].end()) +    //get GroupQueueInfo from BattleGroundQueue +    BattleGroundTypeId bgTypeId = BattleGroundTypeId(bgTypeId_); +    BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(bgTypeId, type); +    BattleGroundQueue::QueuedPlayersMap& qpMap = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers; +    BattleGroundQueue::QueuedPlayersMap::iterator itrPlayerStatus = qpMap.find(_player->GetGUID()); +    if (itrPlayerStatus == qpMap.end())      {          sLog.outError("Battleground: itrplayerstatus not found.");          return;      } -    instanceId = itrPlayerStatus->second.GroupInfo->IsInvitedToBGInstanceGUID; -    // if action == 1, then instanceId is _required_ -    if(!instanceId && action == 1) +    instanceId = itrPlayerStatus->second.GroupInfo->IsInvitedToBGInstanceGUID; +    // if action == 1, then instanceId is required +    if (!instanceId && action == 1)      {          sLog.outError("Battleground: instance not found.");          return;      } -    BattleGround *bg = sBattleGroundMgr.GetBattleGround(instanceId); +    BattleGround *bg = sBattleGroundMgr.GetBattleGround(instanceId, bgTypeId);      // bg template might and must be used in case of leaving queue, when instance is not created yet -    if(!bg && action == 0) +    if (!bg && action == 0)          bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId); - -    if(!bg) +    if (!bg)      { -        sLog.outError("Battleground: bg not found."); +        sLog.outError("Battleground: bg_template not found for type id %u.", bgTypeId);          return;      } -    bgTypeId = bg->GetTypeID(); - -    if(_player->InBattleGroundQueue()) +    if (_player->InBattleGroundQueue())      { -        uint32 queueSlot = 0; -        uint32 team = 0; -        uint32 arenatype = 0; -        uint32 israted = 0; -        uint32 rating = 0; -        uint32 opponentsRating = 0; -        // get the team info from the queue -        BattleGroundQueue::QueuedPlayersMap::iterator pitr = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel()].find(_player->GetGUID()); -        if(pitr !=sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel()].end() -            && pitr->second.GroupInfo ) -        { -            team = pitr->second.GroupInfo->Team; -            arenatype = pitr->second.GroupInfo->ArenaType; -            israted = pitr->second.GroupInfo->IsRated; -            rating = pitr->second.GroupInfo->ArenaTeamRating; -            opponentsRating = pitr->second.GroupInfo->OpponentsTeamRating; -        } -        else +        //we must use temporary variables, because GroupQueueInfo pointer can be deleted in BattleGroundQueue::RemovePlayer() function! +        uint32 team = itrPlayerStatus->second.GroupInfo->Team; +        uint32 arenaType = itrPlayerStatus->second.GroupInfo->ArenaType; +        uint32 isRated = itrPlayerStatus->second.GroupInfo->IsRated; +        uint32 rating = itrPlayerStatus->second.GroupInfo->ArenaTeamRating; +        uint32 opponentsRating = itrPlayerStatus->second.GroupInfo->OpponentsTeamRating; + +        //some checks if player isn't cheating - it is not exactly cheating, but we cannot allow it +        if (action == 1 && arenaType == 0)          { -            sLog.outError("Battleground: Invalid player queue info!"); -            return; +            //if player is trying to enter battleground (not arena!) and he has deserter debuff, we must just remove him from queue +            if (!_player->CanJoinToBattleground()) +            { +                //send bg command result to show nice message +                WorldPacket data2(SMSG_GROUP_JOINED_BATTLEGROUND, 4); +                data2 << uint32(0xFFFFFFFE); +                _player->GetSession()->SendPacket(&data2); +                action = 0; +                sLog.outDebug("Battleground: player %s (%u) has a deserter debuff, do not port him to battleground!", _player->GetName(), _player->GetGUIDLow()); +            } +            //if player don't match battleground max level, then do not allow him to enter! (this might happen when player leveled up during his waiting in queue +            if (_player->getLevel() > bg->GetMaxLevel()) +            { +                sLog.outError("Battleground: Player %s (%u) has level higher than maxlevel of battleground! Do not port him to battleground!", _player->GetName(), _player->GetGUIDLow()); +                action = 0; +            }          } +        uint32 queueSlot = _player->GetBattleGroundQueueIndex(bgQueueTypeId);          WorldPacket data; -        switch(action) +        switch( action )          { -            case 1:                                     // port to battleground -                if(!_player->IsInvitedForBattleGroundQueueType(bgQueueTypeId)) -                    return;                                     // cheating? +            case 1:                                         // port to battleground +                if (!_player->IsInvitedForBattleGroundQueueType(bgQueueTypeId)) +                    return;                                 // cheating?                  // resurrect the player -                if(!_player->isAlive()) +                if (!_player->isAlive())                  {                      _player->ResurrectPlayer(1.0f);                      _player->SpawnCorpseBones();                  }                  // stop taxi flight at port -                if(_player->isInFlight()) +                if (_player->isInFlight())                  {                      _player->GetMotionMaster()->MovementExpired();                      _player->m_taxi.ClearTaxiDestinations();                  } -                _player->RemoveFromGroup(); -                queueSlot = _player->GetBattleGroundQueueIndex(bgQueueTypeId); -                sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, _player->GetTeam(), queueSlot, STATUS_IN_PROGRESS, 0, bg->GetStartTime()); + +                sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_IN_PROGRESS, 0, bg->GetStartTime(), bg->GetArenaType());                  _player->GetSession()->SendPacket(&data);                  // remove battleground queue status from BGmgr                  sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].RemovePlayer(_player->GetGUID(), false);                  // this is still needed here if battleground "jumping" shouldn't add deserter debuff -                // also this required to prevent stuck at old battleground after SetBattleGroundId set to new -                if( BattleGround *currentBg = _player->GetBattleGround() ) +                // also this is required to prevent stuck at old battleground after SetBattleGroundId set to new +                if (BattleGround *currentBg = _player->GetBattleGround())                      currentBg->RemovePlayerAtLeave(_player->GetGUID(), false, true);                  // set the destination instance id -                _player->SetBattleGroundId(bg->GetInstanceID()); +                _player->SetBattleGroundId(bg->GetInstanceID(), bgTypeId);                  // set the destination team                  _player->SetBGTeam(team);                  // clear AFK                  if(_player->isAFK())                      _player->ToggleAFK();                  // bg->HandleBeforeTeleportToBattleGround(_player); -                sBattleGroundMgr.SendToBattleGround(_player, instanceId); +                sBattleGroundMgr.SendToBattleGround(_player, instanceId, bgTypeId);                  // add only in HandleMoveWorldPortAck()                  // bg->AddPlayer(_player,team); -                sLog.outDebug("Battleground: player %s (%u) joined battle for bg %u, bgtype %u, queue type %u.",_player->GetName(),_player->GetGUIDLow(),bg->GetInstanceID(),bg->GetTypeID(),bgQueueTypeId); +                sLog.outDebug("Battleground: player %s (%u) joined battle for bg %u, bgtype %u, queue type %u.", _player->GetName(), _player->GetGUIDLow(), bg->GetInstanceID(), bg->GetTypeID(), bgQueueTypeId);                  break; -            case 0:                                     // leave queue -                queueSlot = _player->GetBattleGroundQueueIndex(bgQueueTypeId); -                /* -                if player leaves rated arena match before match start, it is counted as he played but he lost -                */ -                if (israted) +            case 0:                                         // leave queue +                // if player leaves rated arena match before match start, it is counted as he played but he lost +                if (isRated)                  {                      ArenaTeam * at = objmgr.GetArenaTeamById(team);                      if (at) @@ -478,13 +485,14 @@ void WorldSession::HandleBattleGroundPlayerPortOpcode( WorldPacket &recv_data )                          at->SaveToDB();                      }                  } -                _player->RemoveBattleGroundQueueId(bgQueueTypeId); // must be called this way, because if you move this call to queue->removeplayer, it causes bugs -                sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, _player->GetTeam(), queueSlot, STATUS_NONE, 0, 0); +                _player->RemoveBattleGroundQueueId(bgQueueTypeId);  // must be called this way, because if you move this call to queue->removeplayer, it causes bugs +                sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_NONE, 0, 0, 0);                  sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].RemovePlayer(_player->GetGUID(), true); -                // player left queue, we should update it, maybe now his group fits in -                sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId,_player->GetBattleGroundQueueIdFromLevel(),arenatype,israted,rating); +                // player left queue, we should update it - do not update Arena Queue +                if (!arenaType) +                    sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, _player->GetBattleGroundQueueIdFromLevel(bgTypeId), arenaType, isRated, rating);                  SendPacket(&data); -                sLog.outDebug("Battleground: player %s (%u) left queue for bgtype %u, queue type %u.",_player->GetName(),_player->GetGUIDLow(),bg->GetTypeID(),bgQueueTypeId); +                sLog.outDebug("Battleground: player %s (%u) left queue for bgtype %u, queue type %u.", _player->GetName(), _player->GetGUIDLow(), bg->GetTypeID(), bgQueueTypeId);                  break;              default:                  sLog.outError("Battleground port: unknown action %u", action); @@ -493,7 +501,7 @@ void WorldSession::HandleBattleGroundPlayerPortOpcode( WorldPacket &recv_data )      }  } -void WorldSession::HandleBattleGroundLeaveOpcode( WorldPacket & /*recv_data*/ ) +void WorldSession::HandleLeaveBattlefieldOpcode( WorldPacket & /*recv_data*/ )  {      //CHECK_PACKET_SIZE(recv_data, 1+1+4+2); @@ -509,9 +517,9 @@ void WorldSession::HandleBattleGroundLeaveOpcode( WorldPacket & /*recv_data*/ )      //    return;      // not allow leave battleground in combat -    if(_player->isInCombat()) -        if(BattleGround* bg = _player->GetBattleGround()) -            if(bg->GetStatus() != STATUS_WAIT_LEAVE) +    if (_player->isInCombat()) +        if (BattleGround* bg = _player->GetBattleGround()) +            if (bg->GetStatus() != STATUS_WAIT_LEAVE)                  return;      _player->LeaveBattleground(); @@ -523,81 +531,56 @@ void WorldSession::HandleBattlefieldStatusOpcode( WorldPacket & /*recv_data*/ )      sLog.outDebug( "WORLD: Battleground status" );      WorldPacket data; - -    // TODO: we must put player back to battleground in case disconnect (< 5 minutes offline time) or teleport player on login(!) from battleground map to entry point -    if(_player->InBattleGround()) +    // we must update all queues here +    BattleGround *bg = NULL; +    for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)      { -        BattleGround *bg = _player->GetBattleGround(); -        if(bg) +        BattleGroundQueueTypeId bgQueueTypeId = _player->GetBattleGroundQueueTypeId(i); +        if (!bgQueueTypeId) +            continue; +        BattleGroundTypeId bgTypeId = BattleGroundMgr::BGTemplateId(bgQueueTypeId); +        uint8 arenaType = BattleGroundMgr::BGArenaType(bgQueueTypeId); +        if (bgTypeId == _player->GetBattleGroundTypeId())          { -            uint32 bgQueueTypeId = sBattleGroundMgr.BGQueueTypeId(bg->GetTypeID(), bg->GetArenaType()); -            uint32 queueSlot = _player->GetBattleGroundQueueIndex(bgQueueTypeId); -            if((bg->GetStatus() <= STATUS_IN_PROGRESS)) +            bg = _player->GetBattleGround(); +            //i cannot check any variable from player class because player class doesn't know if player is in 2v2 / 3v3 or 5v5 arena +            //so i must use bg pointer to get that information +            if (bg && bg->GetArenaType() == arenaType)              { -                sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, _player->GetTeam(), queueSlot, STATUS_IN_PROGRESS, 0, bg->GetStartTime()); +                // this line is checked, i only don't know if GetStartTime is changing itself after bg end! +                // send status in BattleGround +                sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, i, STATUS_IN_PROGRESS, bg->GetEndTime(), bg->GetStartTime(), arenaType);                  SendPacket(&data); -            } -            for (uint32 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; i++) -            { -                uint32 queue_id = _player->GetBattleGroundQueueId(i);       // battlegroundqueueid stores the type id, not the instance id, so this is definitely wrong -                uint8 arenatype = sBattleGroundMgr.BGArenaType(queue_id); -                uint8 isRated = 0; -                if (i == queueSlot || !queue_id)                            // we need to get the instance ids -                    continue; -                BattleGroundQueue::QueuedPlayersMap::iterator itrPlayerStatus = sBattleGroundMgr.m_BattleGroundQueues[queue_id].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel()].find(_player->GetGUID()); -                if(itrPlayerStatus == sBattleGroundMgr.m_BattleGroundQueues[queue_id].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel()].end()) -                    continue; -                if(itrPlayerStatus->second.GroupInfo) -                { -                    arenatype = itrPlayerStatus->second.GroupInfo->ArenaType; -                    isRated = itrPlayerStatus->second.GroupInfo->IsRated; -                } -                BattleGround *bg2 = sBattleGroundMgr.GetBattleGroundTemplate(sBattleGroundMgr.BGTemplateId(queue_id)); //  try this -                if(bg2) -                { -                    //in this call is small bug, this call should be filled by player's waiting time in queue -                    //this call nulls all timers for client : -                    sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg2, _player->GetTeam(), i, STATUS_WAIT_QUEUE, 0, 0,arenatype,isRated); -                    SendPacket(&data); -                } +                continue;              }          } -    } -    else -    { -        // we should update all queues? .. i'm not sure if this code is correct -        for (uint32 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; i++) +        //we are sending update to player about queue - he can be invited there! +        //get GroupQueueInfo for queue status +        BattleGroundQueue::QueuedPlayersMap& qpMap = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers; +        BattleGroundQueue::QueuedPlayersMap::iterator itrPlayerStatus = qpMap.find(_player->GetGUID()); +        if (itrPlayerStatus == qpMap.end()) +            continue; +        if (itrPlayerStatus->second.GroupInfo->IsInvitedToBGInstanceGUID)          { -            uint32 queue_id = _player->GetBattleGroundQueueId(i); -            if(!queue_id) +            bg = sBattleGroundMgr.GetBattleGround(itrPlayerStatus->second.GroupInfo->IsInvitedToBGInstanceGUID, bgTypeId); +            if (!bg)                  continue; -            uint32 bgTypeId = sBattleGroundMgr.BGTemplateId(queue_id); -            uint8 arenatype = sBattleGroundMgr.BGArenaType(queue_id); -            uint8 isRated = 0; -            BattleGround *bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId); -            BattleGroundQueue::QueuedPlayersMap::iterator itrPlayerStatus = sBattleGroundMgr.m_BattleGroundQueues[queue_id].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel()].find(_player->GetGUID()); -            if(itrPlayerStatus == sBattleGroundMgr.m_BattleGroundQueues[queue_id].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel()].end()) -                continue; -            if(itrPlayerStatus->second.GroupInfo) -            { -                arenatype = itrPlayerStatus->second.GroupInfo->ArenaType; -                isRated = itrPlayerStatus->second.GroupInfo->IsRated; -            } -            if(bg && queue_id) -            { -                sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, _player->GetTeam(), i, STATUS_WAIT_QUEUE, 0, 0, arenatype, isRated); -                SendPacket(&data); -            } +            uint32 remainingTime = getMSTimeDiff(getMSTime(), itrPlayerStatus->second.GroupInfo->RemoveInviteTime); +            // send status invited to BattleGround +            sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, i, STATUS_WAIT_JOIN, remainingTime, 0, arenaType); +            SendPacket(&data);          } -    } -/*    else              // not sure if it needed... -    { -        for (uint32 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; i++) +        else          { -            sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, NULL, _player->GetTeam(),i , STATUS_NONE, 0, 0); +            bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId); +            if (!bg) +                continue; +            uint32 avgTime = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].GetAverageQueueWaitTime(itrPlayerStatus->second.GroupInfo, _player->GetBattleGroundQueueIdFromLevel(bgTypeId)); +            // send status in BattleGround Queue +            sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, i, STATUS_WAIT_QUEUE, avgTime, getMSTimeDiff(itrPlayerStatus->second.GroupInfo->JoinTime, getMSTime()), arenaType);              SendPacket(&data);          } -    }*/ +    }  }  void WorldSession::HandleAreaSpiritHealerQueryOpcode( WorldPacket & recv_data ) @@ -607,14 +590,14 @@ void WorldSession::HandleAreaSpiritHealerQueryOpcode( WorldPacket & recv_data )      CHECK_PACKET_SIZE(recv_data, 8);      BattleGround *bg = _player->GetBattleGround(); -    if(!bg) +    if (!bg)          return;      uint64 guid;      recv_data >> guid; -    Creature *unit = ObjectAccessor::GetCreature(*_player, guid); -    if(!unit) +    Creature *unit = GetPlayer()->GetMap()->GetCreature(guid); +    if (!unit)          return;      if(!unit->isSpiritService())                            // it's not spirit service @@ -630,14 +613,14 @@ void WorldSession::HandleAreaSpiritHealerQueueOpcode( WorldPacket & recv_data )      CHECK_PACKET_SIZE(recv_data, 8);      BattleGround *bg = _player->GetBattleGround(); -    if(!bg) +    if (!bg)          return;      uint64 guid;      recv_data >> guid; -    Creature *unit = ObjectAccessor::GetCreature(*_player, guid); -    if(!unit) +    Creature *unit = GetPlayer()->GetMap()->GetCreature(guid); +    if (!unit)          return;      if(!unit->isSpiritService())                            // it's not spirit service @@ -646,7 +629,7 @@ void WorldSession::HandleAreaSpiritHealerQueueOpcode( WorldPacket & recv_data )      bg->AddPlayerToResurrectQueue(guid, _player->GetGUID());  } -void WorldSession::HandleBattleGroundArenaJoin( WorldPacket & recv_data ) +void WorldSession::HandleBattlemasterJoinArena( WorldPacket & recv_data )  {      CHECK_PACKET_SIZE(recv_data, 8+1+1+1); @@ -654,19 +637,19 @@ void WorldSession::HandleBattleGroundArenaJoin( WorldPacket & recv_data )      recv_data.hexlike();      // ignore if we already in BG or BG queue -    if(_player->InBattleGround()) +    if (_player->InBattleGround())          return;      uint64 guid;                                            // arena Battlemaster guid -    uint8 type;                                             // 2v2, 3v3 or 5v5 +    uint8 arenaslot;                                        // 2v2, 3v3 or 5v5      uint8 asGroup;                                          // asGroup      uint8 isRated;                                          // isRated      Group * grp; -    recv_data >> guid >> type >> asGroup >> isRated; +    recv_data >> guid >> arenaslot >> asGroup >> isRated; -    Creature *unit = ObjectAccessor::GetCreature(*_player, guid); -    if(!unit) +    Creature *unit = GetPlayer()->GetMap()->GetCreature(guid); +    if (!unit)          return;      if(!unit->isBattleMaster())                             // it's not battle master @@ -675,7 +658,7 @@ void WorldSession::HandleBattleGroundArenaJoin( WorldPacket & recv_data )      uint8 arenatype = 0;      uint32 arenaRating = 0; -    switch(type) +    switch(arenaslot)      {          case 0:              arenatype = ARENA_TYPE_2v2; @@ -687,39 +670,39 @@ void WorldSession::HandleBattleGroundArenaJoin( WorldPacket & recv_data )              arenatype = ARENA_TYPE_5v5;              break;          default: -            sLog.outError("Unknown arena type %u at HandleBattleGroundArenaJoin()", type); +            sLog.outError("Unknown arena slot %u at HandleBattlemasterJoinArena()", arenaslot);              return;      }      //check existance      BattleGround* bg = NULL; -    if( !(bg = sBattleGroundMgr.GetBattleGroundTemplate(BATTLEGROUND_AA)) ) +    if (!(bg = sBattleGroundMgr.GetBattleGroundTemplate(BATTLEGROUND_AA)))      {          sLog.outError("Battleground: template bg (all arenas) not found");          return;      } -    uint8 bgTypeId = bg->GetTypeID(); -    uint32 bgQueueTypeId = sBattleGroundMgr.BGQueueTypeId(bgTypeId, arenatype); +    BattleGroundTypeId bgTypeId = bg->GetTypeID(); +    BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(bgTypeId, arenatype);      // check queueing conditions -    if(!asGroup) +    if (!asGroup)      {          // check if already in queue          if (_player->GetBattleGroundQueueIndex(bgQueueTypeId) < PLAYER_MAX_BATTLEGROUND_QUEUES)              //player is already in this queue              return;          // check if has free queue slots -        if(!_player->HasFreeBattleGroundQueueId()) +        if (!_player->HasFreeBattleGroundQueueId())              return;      }      else      {          grp = _player->GetGroup();          // no group found, error -        if(!grp) +        if (!grp)              return; -        uint32 err = grp->CanJoinBattleGroundQueue(bgTypeId, bgQueueTypeId, arenatype, arenatype, (bool)isRated, type); +        uint32 err = grp->CanJoinBattleGroundQueue(bgTypeId, bgQueueTypeId, arenatype, arenatype, (bool)isRated, arenaslot);          if (err != BG_JOIN_ERR_OK)          {              SendBattleGroundOrArenaJoinError(err); @@ -729,12 +712,12 @@ void WorldSession::HandleBattleGroundArenaJoin( WorldPacket & recv_data )      uint32 ateamId = 0; -    if(isRated) +    if (isRated)      { -        ateamId = _player->GetArenaTeamId(type); +        ateamId = _player->GetArenaTeamId(arenaslot);          // check real arenateam existence only here (if it was moved to group->CanJoin .. () then we would ahve to get it twice)          ArenaTeam * at = objmgr.GetArenaTeamById(ateamId); -        if(!at) +        if (!at)          {              _player->GetSession()->SendNotInArenaTeamPacket(arenatype);              return; @@ -749,23 +732,24 @@ void WorldSession::HandleBattleGroundArenaJoin( WorldPacket & recv_data )              Player *member = itr->getSource();              // calc avg personal rating -            avg_pers_rating += member->GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (type*6) + 5); +            avg_pers_rating += member->GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (arenaslot*6) + 5);          } -        if( arenatype ) +        if (arenatype)              avg_pers_rating /= arenatype;          // if avg personal rating is more than 150 points below the teams rating, the team will be queued against an opponent matching or similar to the average personal rating -        if(avg_pers_rating + 150 < arenaRating) +        if (avg_pers_rating + 150 < arenaRating)              arenaRating = avg_pers_rating;      } -    if(asGroup) +    GroupQueueInfo * ginfo = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddGroup(_player, bgTypeId, arenatype, isRated, false, arenaRating, ateamId); +    uint32 avgTime = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].GetAverageQueueWaitTime(ginfo, _player->GetBattleGroundQueueIdFromLevel(bgTypeId)); +    if (asGroup)      { -        GroupQueueInfo * ginfo = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddGroup(_player, bgTypeId, arenatype, isRated, arenaRating, ateamId);          sLog.outDebug("Battleground: arena join as group start"); -        if(isRated) -            sLog.outDebug("Battleground: arena team id %u, leader %s queued with rating %u for type %u",_player->GetArenaTeamId(type),_player->GetName(),arenaRating,arenatype); +        if (isRated) +            sLog.outDebug("Battleground: arena team id %u, leader %s queued with rating %u for type %u",_player->GetArenaTeamId(arenaslot),_player->GetName(),arenaRating,arenatype);          for(GroupReference *itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())          {              Player *member = itr->getSource(); @@ -778,7 +762,7 @@ void WorldSession::HandleBattleGroundArenaJoin( WorldPacket & recv_data )              WorldPacket data;              // send status packet (in queue) -            sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, member->GetTeam(), queueSlot, STATUS_WAIT_QUEUE, 0, 0, arenatype, isRated); +            sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, arenatype);              member->GetSession()->SendPacket(&data);              sBattleGroundMgr.BuildGroupJoinedBattlegroundPacket(&data, bgTypeId);              member->GetSession()->SendPacket(&data); @@ -786,7 +770,8 @@ void WorldSession::HandleBattleGroundArenaJoin( WorldPacket & recv_data )              sLog.outDebug("Battleground: player joined queue for arena as group bg queue type %u bg type %u: GUID %u, NAME %s",bgQueueTypeId,bgTypeId,member->GetGUIDLow(), member->GetName());          }          sLog.outDebug("Battleground: arena join as group end"); -        sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, _player->GetBattleGroundQueueIdFromLevel(), arenatype, isRated, arenaRating); +        if (isRated) +            sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AnnounceWorld(ginfo, _player->GetGUID(), true);      }      else      { @@ -797,16 +782,15 @@ void WorldSession::HandleBattleGroundArenaJoin( WorldPacket & recv_data )          WorldPacket data;          // send status packet (in queue) -        sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, _player->GetTeam(), queueSlot, STATUS_WAIT_QUEUE, 0, 0, arenatype, isRated); +        sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, arenatype);          SendPacket(&data); -        GroupQueueInfo * ginfo = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddGroup(_player, bgTypeId, arenatype, isRated, arenaRating);          sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddPlayer(_player, ginfo); -        sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, _player->GetBattleGroundQueueIdFromLevel(), arenatype, isRated, arenaRating);          sLog.outDebug("Battleground: player joined queue for arena, skirmish, bg queue type %u bg type %u: GUID %u, NAME %s",bgQueueTypeId,bgTypeId,_player->GetGUIDLow(), _player->GetName());      } +    sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, _player->GetBattleGroundQueueIdFromLevel(bgTypeId), arenatype, isRated, arenaRating);  } -void WorldSession::HandleBattleGroundReportAFK( WorldPacket & recv_data ) +void WorldSession::HandleReportPvPAFK( WorldPacket & recv_data )  {      CHECK_PACKET_SIZE(recv_data, 8); @@ -814,13 +798,13 @@ void WorldSession::HandleBattleGroundReportAFK( WorldPacket & recv_data )      recv_data >> playerGuid;      Player *reportedPlayer = objmgr.GetPlayer(playerGuid); -    if(!reportedPlayer) +    if (!reportedPlayer)      { -        sLog.outDebug("WorldSession::HandleBattleGroundReportAFK: player not found"); +        sLog.outDebug("WorldSession::HandleReportPvPAFK: player not found");          return;      } -    sLog.outDebug("WorldSession::HandleBattleGroundReportAFK: %s reported %s", _player->GetName(), reportedPlayer->GetName()); +    sLog.outDebug("WorldSession::HandleReportPvPAFK: %s reported %s", _player->GetName(), reportedPlayer->GetName());      reportedPlayer->ReportedAfkBy(_player);  }  | 
