diff options
Diffstat (limited to 'src')
18 files changed, 573 insertions, 628 deletions
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 02050c8087b..d25d88ec389 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -177,7 +177,7 @@ Battleground::Battleground() m_PrematureCountDown = false; m_PrematureCountDownTimer = 0; - m_Guid = 0; + m_queueId = 0; m_HonorMode = BG_NORMAL; @@ -527,12 +527,12 @@ inline void Battleground::_ProcessJoin(uint32 diff) if (Player* player = ObjectAccessor::FindPlayer(itr->first)) { // BG Status packet - WorldPacket status; - BattlegroundQueueTypeId bgQueueTypeId = sBattlegroundMgr->BGQueueTypeId(m_TypeID, GetArenaType()); + BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(m_TypeID, GetArenaType()); uint32 queueSlot = player->GetBattlegroundQueueIndex(bgQueueTypeId); - sBattlegroundMgr->BuildBattlegroundStatusPacket(&status, this, player, queueSlot, STATUS_IN_PROGRESS, player->GetBattlegroundQueueJoinTime(m_TypeID), GetElapsedTime(), GetArenaType()); - player->GetSession()->SendPacket(&status); + WorldPackets::Battleground::BattlefieldStatusActive battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusActive(&battlefieldStatus, this, player, queueSlot, player->GetBattlegroundQueueJoinTime(bgQueueTypeId), GetArenaType()); + player->SendDirectMessage(battlefieldStatus.Write()); // Correctly display EnemyUnitFrame player->SetByteValue(PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_ARENA_FACTION, player->GetBGTeam()); @@ -885,9 +885,9 @@ void Battleground::EndBattleground(uint32 winner) player->SendDirectMessage(pvpLogData.Write()); - WorldPacket data; - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player, player->GetBattlegroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, player->GetBattlegroundQueueJoinTime(GetTypeID()), GetElapsedTime(), GetArenaType()); - player->SendDirectMessage(&data); + WorldPackets::Battleground::BattlefieldStatusActive battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusActive(&battlefieldStatus, this, player, player->GetBattlegroundQueueIndex(bgQueueTypeId), player->GetBattlegroundQueueJoinTime(bgQueueTypeId), GetArenaType()); + player->SendDirectMessage(battlefieldStatus.Write()); player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND, 1); } @@ -973,9 +973,9 @@ void Battleground::RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool Sen if (SendPacket) { - WorldPacket data; - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player, player->GetBattlegroundQueueIndex(bgQueueTypeId), STATUS_NONE, player->GetBattlegroundQueueJoinTime(bgTypeId), 0, m_ArenaType); - player->SendDirectMessage(&data); + WorldPackets::Battleground::BattlefieldStatusNone battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusNone(&battlefieldStatus, player, player->GetBattlegroundQueueIndex(bgQueueTypeId), player->GetBattlegroundQueueJoinTime(bgQueueTypeId), m_ArenaType); + player->SendDirectMessage(battlefieldStatus.Write()); } // this call is important, because player, when joins to battleground, this method is not called, so it must be called when leaving bg @@ -1008,7 +1008,6 @@ void Battleground::RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool Sen player->SetBattlegroundId(0, BATTLEGROUND_TYPE_NONE); // We're not in BG. // reset destination bg team player->SetBGTeam(0); - player->RemoveBattlegroundQueueJoinTime(bgTypeId); if (Transport) player->TeleportToBGEntryPoint(); @@ -1093,8 +1092,9 @@ void Battleground::AddPlayer(Player* player) BattlegroundQueueTypeId bgQueueTypeId = sBattlegroundMgr->BGQueueTypeId(m_TypeID, GetArenaType()); uint32 queueSlot = player->GetBattlegroundQueueIndex(bgQueueTypeId); - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player, queueSlot, STATUS_IN_PROGRESS, player->GetBattlegroundQueueJoinTime(m_TypeID), GetElapsedTime(), GetArenaType()); - player->GetSession()->SendPacket(&data); + WorldPackets::Battleground::BattlefieldStatusActive battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusActive(&battlefieldStatus, this, player, queueSlot, player->GetBattlegroundQueueJoinTime(bgQueueTypeId), GetArenaType()); + player->SendDirectMessage(battlefieldStatus.Write()); player->RemoveAurasByType(SPELL_AURA_MOUNTED); @@ -1832,9 +1832,9 @@ void Battleground::PlayerAddedToBGCheckIfBGIsRunning(Player* player) BuildPvPLogDataPacket(pvpLogData); player->SendDirectMessage(pvpLogData.Write()); - WorldPacket data; - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player, player->GetBattlegroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, player->GetBattlegroundQueueJoinTime(GetTypeID()), GetElapsedTime(), GetArenaType()); - player->SendDirectMessage(&data); + WorldPackets::Battleground::BattlefieldStatusActive battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusActive(&battlefieldStatus, this, player, player->GetBattlegroundQueueIndex(bgQueueTypeId), player->GetBattlegroundQueueJoinTime(bgQueueTypeId), GetArenaType()); + player->SendDirectMessage(battlefieldStatus.Write()); } uint32 Battleground::GetAlivePlayersCountByTeam(uint32 Team) const diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index 0fe95a0c7a5..c1e4b3ad4ec 100644 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -250,7 +250,7 @@ class Battleground /* Battleground */ // Get methods: std::string const& GetName() const { return m_Name; } - uint64 GetGUID() { return m_Guid; } + uint64 GetQueueId() { return m_queueId; } BattlegroundTypeId GetTypeID(bool GetRandom = false) const { return GetRandom ? m_RandomTypeID : m_TypeID; } BattlegroundBracketId GetBracketId() const { return m_BracketId; } uint32 GetInstanceID() const { return m_InstanceID; } @@ -276,7 +276,7 @@ class Battleground bool IsRandom() const { return m_IsRandom; } // Set methods: - void SetGuid(uint64 newGuid) { m_Guid = newGuid; } + void SetQueueId(uint64 queueId) { m_queueId = queueId; } void SetName(std::string const& name) { m_Name = name; } void SetTypeID(BattlegroundTypeId TypeID) { m_TypeID = TypeID; } void SetRandomTypeID(BattlegroundTypeId TypeID) { m_RandomTypeID = TypeID; } @@ -546,7 +546,7 @@ class Battleground bool m_PrematureCountDown; uint32 m_PrematureCountDownTimer; std::string m_Name; - uint64 m_Guid; + uint64 m_queueId; /* Pre- and post-update hooks */ diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index 80995bdaba9..71ec756f793 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -37,6 +37,7 @@ #include "BattlegroundIC.h" #include "BattlegroundTP.h" #include "BattlegroundBFG.h" +#include "BattlegroundPackets.h" #include "Chat.h" #include "Map.h" #include "MapInstanced.h" @@ -148,282 +149,67 @@ void BattlegroundMgr::Update(uint32 diff) } } -void BattlegroundMgr::BuildBattlegroundStatusPacket(WorldPacket* data, Battleground* bg, Player* player, uint8 QueueSlot, uint8 StatusID, uint32 Time1, uint32 Time2, uint8 arenatype) +void BattlegroundMgr::BuildBattlegroundStatusHeader(WorldPackets::Battleground::BattlefieldStatusHeader* header, Battleground* bg, Player* player, uint32 ticketId, uint32 joinTime, uint32 arenaType) { - ObjectGuid playerGuid = player->GetGUID(); - ObjectGuid bgGuid; + header->Ticket.RequesterGuid = player->GetGUID(); + header->Ticket.Id = ticketId; + header->Ticket.Type = bg->isArena() ? arenaType : 1; + header->Ticket.Time = joinTime; + header->QueueID = bg->GetQueueId(); + header->RangeMin = bg->GetMinLevel(); + header->RangeMax = bg->GetMaxLevel(); + header->TeamSize = bg->isArena() ? arenaType : 0; + header->InstanceID = bg->GetClientInstanceID(); + header->RegisteredMatch = bg->isRated(); + header->TournamentRules = false; +} - if (bg) - ;//bgGuid = bg->GetGUID(); - else - StatusID = STATUS_NONE; +void BattlegroundMgr::BuildBattlegroundStatusNone(WorldPackets::Battleground::BattlefieldStatusNone* battlefieldStatus, Player* player, uint32 ticketId, uint32 joinTime, uint32 arenaType) +{ + battlefieldStatus->Ticket.RequesterGuid = player->GetGUID(); + battlefieldStatus->Ticket.Id = ticketId; + battlefieldStatus->Ticket.Type = arenaType; + battlefieldStatus->Ticket.Time = joinTime; +} - switch (StatusID) - { - case STATUS_NONE: - { - data->Initialize(SMSG_BATTLEFIELD_STATUS_NONE); - - data->WriteBit(playerGuid[0]); - data->WriteBit(playerGuid[4]); - data->WriteBit(playerGuid[7]); - data->WriteBit(playerGuid[1]); - data->WriteBit(playerGuid[6]); - data->WriteBit(playerGuid[3]); - data->WriteBit(playerGuid[5]); - data->WriteBit(playerGuid[2]); - - data->WriteByteSeq(playerGuid[5]); - data->WriteByteSeq(playerGuid[6]); - data->WriteByteSeq(playerGuid[7]); - data->WriteByteSeq(playerGuid[2]); - *data << uint32(arenatype ? arenatype : 1); // Player count, 1 for bgs, 2-3-5 for arenas - data->WriteByteSeq(playerGuid[3]); - data->WriteByteSeq(playerGuid[1]); - *data << uint32(QueueSlot); // Queue slot - *data << uint32(Time1); // Join Time - data->WriteByteSeq(playerGuid[0]); - data->WriteByteSeq(playerGuid[4]); - break; - } - case STATUS_WAIT_QUEUE: - { - data->Initialize(SMSG_BATTLEFIELD_STATUS_QUEUED); - - data->WriteBit(playerGuid[3]); - data->WriteBit(playerGuid[0]); - data->WriteBit(bgGuid[3]); - data->WriteBit(playerGuid[2]); - data->WriteBit(1); // Eligible In Queue - data->WriteBit(0); // Join Failed, 1 when it's arena ... - data->WriteBit(bgGuid[2]); - data->WriteBit(playerGuid[1]); - data->WriteBit(bgGuid[0]); - data->WriteBit(bgGuid[6]); - data->WriteBit(bgGuid[4]); - data->WriteBit(playerGuid[6]); - data->WriteBit(playerGuid[7]); - data->WriteBit(bgGuid[7]); - data->WriteBit(bgGuid[5]); - data->WriteBit(playerGuid[4]); - data->WriteBit(playerGuid[5]); - data->WriteBit(bg->isRated()); // Is Rated - data->WriteBit(0); // Waiting On Other Activity - data->WriteBit(bgGuid[1]); - - data->FlushBits(); - - data->WriteByteSeq(playerGuid[0]); - *data << uint32(bg->isArena() ? arenatype : 1); // Player count, 1 for bgs, 2-3-5 for arena (2v2, 3v3, 5v5) - data->WriteByteSeq(bgGuid[5]); - data->WriteByteSeq(playerGuid[3]); - *data << uint32(Time1); // Estimated Wait Time - data->WriteByteSeq(bgGuid[7]); - data->WriteByteSeq(bgGuid[1]); - data->WriteByteSeq(bgGuid[2]); - *data << uint8(0); // unk - data->WriteByteSeq(bgGuid[4]); - data->WriteByteSeq(playerGuid[2]); - *data << uint8(0); // unk - data->WriteByteSeq(bgGuid[6]); - data->WriteByteSeq(playerGuid[7]); - data->WriteByteSeq(bgGuid[3]); - data->WriteByteSeq(playerGuid[6]); - data->WriteByteSeq(bgGuid[0]); - *data << uint32(Time2); // Join Time - *data << uint32(QueueSlot); // Queue slot - *data << uint8(bg->GetMinLevel()); // Min Level - *data << uint32(GetMSTimeDiffToNow(Time2)); // Time since joined - data->WriteByteSeq(playerGuid[1]); - data->WriteByteSeq(playerGuid[5]); - *data << uint32(bg->GetClientInstanceID()); // Client Instance ID - data->WriteByteSeq(playerGuid[4]); - break; - } - case STATUS_WAIT_JOIN: - { - data->Initialize(SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION); - - *data << uint32(bg->GetClientInstanceID()); // Client Instance ID - *data << uint32(Time1); // Time until closed - *data << uint8(0); // unk - *data << uint32(QueueSlot); // Queue slot - *data << uint32(Time2); // Join Time - *data << uint8(bg->GetMinLevel()); // Min Level - *data << uint32(bg->isArena() ? arenatype : 1); // Player count, 1 for bgs, 2-3-5 for arena (2v2, 3v3, 5v5) - *data << uint32(bg->GetMapId()); // Map Id - *data << uint8(0); // unk - - data->WriteBit(playerGuid[5]); - data->WriteBit(playerGuid[2]); - data->WriteBit(playerGuid[1]); - data->WriteBit(bgGuid[2]); - data->WriteBit(playerGuid[4]); - data->WriteBit(bgGuid[6]); - data->WriteBit(bgGuid[3]); - data->WriteBit(bg->isRated()); // Is Rated - data->WriteBit(playerGuid[7]); - data->WriteBit(playerGuid[3]); - data->WriteBit(bgGuid[7]); - data->WriteBit(bgGuid[0]); - data->WriteBit(bgGuid[4]); - data->WriteBit(playerGuid[6]); - data->WriteBit(bgGuid[1]); - data->WriteBit(bgGuid[5]); - data->WriteBit(playerGuid[0]); - - data->WriteByteSeq(bgGuid[6]); - data->WriteByteSeq(bgGuid[5]); - data->WriteByteSeq(bgGuid[7]); - data->WriteByteSeq(bgGuid[2]); - data->WriteByteSeq(playerGuid[0]); - data->WriteByteSeq(playerGuid[7]); - data->WriteByteSeq(bgGuid[4]); - data->WriteByteSeq(playerGuid[1]); - data->WriteByteSeq(bgGuid[0]); - data->WriteByteSeq(playerGuid[4]); - data->WriteByteSeq(bgGuid[1]); - data->WriteByteSeq(playerGuid[5]); - data->WriteByteSeq(bgGuid[3]); - data->WriteByteSeq(playerGuid[6]); - data->WriteByteSeq(playerGuid[2]); - data->WriteByteSeq(playerGuid[3]); - break; - } - case STATUS_IN_PROGRESS: - { - data->Initialize(SMSG_BATTLEFIELD_STATUS_ACTIVE); - - data->WriteBit(playerGuid[2]); - data->WriteBit(playerGuid[7]); - data->WriteBit(bgGuid[7]); - data->WriteBit(bgGuid[1]); - data->WriteBit(playerGuid[5]); - data->WriteBit(player->GetBGTeam() == HORDE ? 0 : 1); - data->WriteBit(bgGuid[0]); - data->WriteBit(playerGuid[1]); - data->WriteBit(bgGuid[3]); - data->WriteBit(playerGuid[6]); - data->WriteBit(bgGuid[5]); - data->WriteBit(bg->isRated()); // Is Rated - data->WriteBit(playerGuid[4]); - data->WriteBit(bgGuid[6]); - data->WriteBit(bgGuid[4]); - data->WriteBit(bgGuid[2]); - data->WriteBit(playerGuid[3]); - data->WriteBit(playerGuid[0]); - - data->FlushBits(); - - data->WriteByteSeq(bgGuid[4]); - data->WriteByteSeq(bgGuid[5]); - data->WriteByteSeq(playerGuid[5]); - data->WriteByteSeq(bgGuid[1]); - data->WriteByteSeq(bgGuid[6]); - data->WriteByteSeq(bgGuid[3]); - data->WriteByteSeq(bgGuid[7]); - data->WriteByteSeq(playerGuid[6]); - - *data << uint32(Time1); // Join Time - *data << uint8(0); // unk - - data->WriteByteSeq(playerGuid[4]); - data->WriteByteSeq(playerGuid[1]); - - *data << uint32(QueueSlot); // Queue slot - *data << uint8(0); // unk - *data << uint32(bg->isArena() ? arenatype : 1); // Player count, 1 for bgs, 2-3-5 for arena (2v2, 3v3, 5v5) - *data << uint32(bg->GetMapId()); // Map Id - *data << uint8(bg->GetMinLevel()); // Min Level - *data << uint32(Time2); // Elapsed Time - - data->WriteByteSeq(playerGuid[2]); - *data << uint32(bg->GetRemainingTime()); // Remaining Time - - data->WriteByteSeq(playerGuid[0]); - data->WriteByteSeq(playerGuid[3]); - data->WriteByteSeq(bgGuid[2]); - - *data << uint32(bg->GetClientInstanceID()); // Client Instance ID or faction ? - - data->WriteByteSeq(bgGuid[0]); - data->WriteByteSeq(playerGuid[7]); - break; - } - case STATUS_WAIT_LEAVE: - break; - } +void BattlegroundMgr::BuildBattlegroundStatusNeedConfirmation(WorldPackets::Battleground::BattlefieldStatusNeedConfirmation* battlefieldStatus, Battleground* bg, Player* player, uint32 ticketId, uint32 joinTime, uint32 timeout, uint32 arenaType) +{ + BuildBattlegroundStatusHeader(&battlefieldStatus->Hdr, bg, player, ticketId, joinTime, arenaType); + battlefieldStatus->Mapid = bg->GetMapId(); + battlefieldStatus->Timeout = timeout; + battlefieldStatus->Role = 0; +} + +void BattlegroundMgr::BuildBattlegroundStatusActive(WorldPackets::Battleground::BattlefieldStatusActive* battlefieldStatus, Battleground* bg, Player* player, uint32 ticketId, uint32 joinTime, uint32 arenaType) +{ + BuildBattlegroundStatusHeader(&battlefieldStatus->Hdr, bg, player, ticketId, joinTime, arenaType); + battlefieldStatus->ShutdownTimer = bg->GetRemainingTime(); + battlefieldStatus->ArenaFaction = player->GetBGTeam() == HORDE ? BG_TEAM_HORDE : BG_TEAM_ALLIANCE; + battlefieldStatus->LeftEarly = false; + battlefieldStatus->StartTimer = bg->GetElapsedTime(); + battlefieldStatus->Mapid = bg->GetMapId(); +} + +void BattlegroundMgr::BuildBattlegroundStatusQueued(WorldPackets::Battleground::BattlefieldStatusQueued* battlefieldStatus, Battleground* bg, Player* player, uint32 ticketId, uint32 joinTime, uint32 avgWaitTime, uint32 arenaType, bool asGroup) +{ + BuildBattlegroundStatusHeader(&battlefieldStatus->Hdr, bg, player, ticketId, joinTime, arenaType); + battlefieldStatus->AverageWaitTime = avgWaitTime; + battlefieldStatus->AsGroup = asGroup; + battlefieldStatus->SuspendedQueue = false; + battlefieldStatus->EligibleForMatchmaking = true; + battlefieldStatus->WaitTime = GetMSTimeDiffToNow(joinTime); } -void BattlegroundMgr::BuildStatusFailedPacket(WorldPacket* data, Battleground* bg, Player* player, uint8 QueueSlot, GroupJoinBattlegroundResult result) +void BattlegroundMgr::BuildBattlegroundStatusFailed(WorldPackets::Battleground::BattlefieldStatusFailed* battlefieldStatus, Battleground* bg, Player* pPlayer, uint32 ticketId, uint32 arenaType, GroupJoinBattlegroundResult result, ObjectGuid const* errorGuid /*= nullptr*/) { - ObjectGuid guidBytes1 = player->GetGUID(); // player who caused the error - ObjectGuid guidBytes2;// = bg->GetGUID(); - ObjectGuid unkGuid3; - - data->Initialize(SMSG_BATTLEFIELD_STATUS_FAILED); - - data->WriteBit(guidBytes2[3]); - data->WriteBit(unkGuid3[3]); - data->WriteBit(guidBytes1[3]); - data->WriteBit(unkGuid3[0]); - data->WriteBit(guidBytes2[6]); - data->WriteBit(guidBytes1[5]); - data->WriteBit(guidBytes1[6]); - data->WriteBit(guidBytes1[4]); - - data->WriteBit(guidBytes1[2]); - data->WriteBit(unkGuid3[1]); - data->WriteBit(guidBytes2[1]); - data->WriteBit(unkGuid3[5]); - data->WriteBit(unkGuid3[6]); - data->WriteBit(guidBytes1[1]); - data->WriteBit(guidBytes2[7]); - data->WriteBit(unkGuid3[4]); - - data->WriteBit(guidBytes2[2]); - data->WriteBit(guidBytes2[5]); - data->WriteBit(unkGuid3[7]); - data->WriteBit(guidBytes2[4]); - data->WriteBit(guidBytes2[0]); - data->WriteBit(guidBytes1[0]); - data->WriteBit(unkGuid3[2]); - data->WriteBit(guidBytes1[7]); - - data->WriteByteSeq(guidBytes2[1]); - - *data << uint32(1); // Unk, always 1 - *data << uint32(QueueSlot); // Queue slot - - data->WriteByteSeq(guidBytes1[6]); - data->WriteByteSeq(guidBytes1[3]); - data->WriteByteSeq(guidBytes1[7]); - data->WriteByteSeq(guidBytes1[4]); - data->WriteByteSeq(guidBytes2[0]); - data->WriteByteSeq(guidBytes1[5]); - data->WriteByteSeq(guidBytes2[7]); - data->WriteByteSeq(guidBytes2[6]); - data->WriteByteSeq(guidBytes2[2]); - data->WriteByteSeq(unkGuid3[6]); - data->WriteByteSeq(unkGuid3[3]); - data->WriteByteSeq(guidBytes1[1]); - data->WriteByteSeq(guidBytes2[3]); - data->WriteByteSeq(unkGuid3[0]); - data->WriteByteSeq(unkGuid3[1]); - data->WriteByteSeq(unkGuid3[4]); - data->WriteByteSeq(guidBytes1[0]); - data->WriteByteSeq(guidBytes2[5]); - data->WriteByteSeq(unkGuid3[7]); - data->WriteByteSeq(guidBytes2[4]); - data->WriteByteSeq(guidBytes1[2]); - - *data << uint32(result); // Result - - data->WriteByteSeq(unkGuid3[2]); - - *data << uint32(player->GetBattlegroundQueueJoinTime(bg->GetTypeID())); // Join Time - - data->WriteByteSeq(unkGuid3[5]); + battlefieldStatus->Ticket.RequesterGuid = pPlayer->GetGUID(); + battlefieldStatus->Ticket.Id = ticketId; + battlefieldStatus->Ticket.Type = arenaType; + battlefieldStatus->Ticket.Time = pPlayer->GetBattlegroundQueueJoinTime(BGQueueTypeId(bg->GetTypeID(), arenaType)); + battlefieldStatus->QueueID = bg->GetQueueId(); + battlefieldStatus->Reason = result; + if (errorGuid && (result == ERR_BATTLEGROUND_NOT_IN_BATTLEGROUND || result == ERR_BATTLEGROUND_JOIN_TIMED_OUT)) + battlefieldStatus->ClientID = *errorGuid; } void BattlegroundMgr::BuildPlaySoundPacket(WorldPacket* data, uint32 soundid) @@ -479,30 +265,6 @@ void BattlegroundMgr::BuildPlayerJoinedBattlegroundPacket(WorldPacket* data, Obj data->WriteByteSeq(guid[6]); } -Battleground* BattlegroundMgr::GetBattlegroundThroughClientInstance(uint32 instanceId, BattlegroundTypeId bgTypeId) -{ - //cause at HandleBattlegroundJoinOpcode the clients sends the instanceid he gets from - //SMSG_BATTLEFIELD_LIST we need to find the battleground with this clientinstance-id - Battleground* bg = GetBattlegroundTemplate(bgTypeId); - if (!bg) - return NULL; - - if (bg->isArena()) - return GetBattleground(instanceId, bgTypeId); - - BattlegroundDataContainer::const_iterator it = bgDataStore.find(bgTypeId); - if (it == bgDataStore.end()) - return NULL; - - for (BattlegroundContainer::const_iterator itr = it->second.m_Battlegrounds.begin(); itr != it->second.m_Battlegrounds.end(); ++itr) - { - if (itr->second->GetClientInstanceID() == instanceId) - return itr->second; - } - - return NULL; -} - Battleground* BattlegroundMgr::GetBattleground(uint32 instanceId, BattlegroundTypeId bgTypeId) { if (!instanceId) @@ -645,7 +407,7 @@ Battleground* BattlegroundMgr::CreateNewBattleground(BattlegroundTypeId original bg->SetRandomTypeID(bgTypeId); bg->SetRated(isRated); bg->SetRandom(isRandom); - bg->SetGuid(uint64(bgTypeId) | UI64LIT(0x1F10000000000000)); + bg->SetQueueId(uint64(bgTypeId) | UI64LIT(0x1F10000000000000)); // Set up correct min/max player counts for scoreboards if (bg->isArena()) @@ -748,7 +510,7 @@ bool BattlegroundMgr::CreateBattleground(BattlegroundTemplate const* bgTemplate) bg->SetStartMaxDist(bgTemplate->MaxStartDistSq); bg->SetLevelRange(bgTemplate->MinLevel, bgTemplate->MaxLevel); bg->SetScriptId(bgTemplate->ScriptId); - bg->SetGuid(uint64(bgTemplate->Id) | UI64LIT(0x1F10000000000000)); + bg->SetQueueId(uint64(bgTemplate->Id) | UI64LIT(0x1F10000000000000)); AddBattleground(bg); @@ -855,74 +617,22 @@ void BattlegroundMgr::LoadBattlegroundTemplates() TC_LOG_INFO("server.loading", ">> Loaded %u battlegrounds in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } -void BattlegroundMgr::BuildBattlegroundListPacket(WorldPacket* data, ObjectGuid guid, Player* player, BattlegroundTypeId bgTypeId) +void BattlegroundMgr::SendBattlegroundList(Player* player, ObjectGuid const& guid, BattlegroundTypeId bgTypeId) { - if (!player) - return; - BattlegroundTemplate const* bgTemplate = GetBattlegroundTemplateByTypeId(bgTypeId); if (!bgTemplate) return; - uint32 winnerConquest = (player->GetRandomWinner() ? sWorld->getIntConfig(CONFIG_BG_REWARD_WINNER_CONQUEST_FIRST) : sWorld->getIntConfig(CONFIG_BG_REWARD_WINNER_CONQUEST_LAST)) / CURRENCY_PRECISION; - uint32 winnerHonor = (player->GetRandomWinner() ? sWorld->getIntConfig(CONFIG_BG_REWARD_WINNER_HONOR_FIRST) : sWorld->getIntConfig(CONFIG_BG_REWARD_WINNER_HONOR_LAST)) / CURRENCY_PRECISION; - uint32 loserHonor = (!player->GetRandomWinner() ? sWorld->getIntConfig(CONFIG_BG_REWARD_LOSER_HONOR_FIRST) : sWorld->getIntConfig(CONFIG_BG_REWARD_LOSER_HONOR_LAST)) / CURRENCY_PRECISION; - - data->Initialize(SMSG_BATTLEFIELD_LIST); - *data << uint32(winnerConquest) // Winner Conquest Reward or Random Winner Conquest Reward - << uint32(winnerConquest) // Winner Conquest Reward or Random Winner Conquest Reward - << uint32(loserHonor) // Loser Honor Reward or Random Loser Honor Reward - << uint32(bgTypeId) // battleground id - << uint32(loserHonor) // Loser Honor Reward or Random Loser Honor Reward - << uint32(winnerHonor) // Winner Honor Reward or Random Winner Honor Reward - << uint32(winnerHonor) // Winner Honor Reward or Random Winner Honor Reward - << uint8(bgTemplate->MaxLevel) // max level - << uint8(bgTemplate->MinLevel); // min level - - data->WriteBit(guid[0]); - data->WriteBit(guid[1]); - data->WriteBit(guid[7]); - data->WriteBit(0); // unk - data->WriteBit(0); // unk - - size_t count_pos = data->bitwpos(); - data->WriteBits(0, 24); // placeholder - - data->WriteBit(guid[6]); - data->WriteBit(guid[4]); - data->WriteBit(guid[2]); - data->WriteBit(guid[3]); - data->WriteBit(0); // unk - data->WriteBit(guid[5]); - data->WriteBit(1); // hide battleground list window - - data->FlushBits(); - - data->WriteByteSeq(guid[6]); - data->WriteByteSeq(guid[1]); - data->WriteByteSeq(guid[7]); - data->WriteByteSeq(guid[5]); - - BattlegroundDataContainer::iterator it = bgDataStore.find(bgTypeId); - if (it != bgDataStore.end()) - { - - PvPDifficultyEntry const* bracketEntry = GetBattlegroundBracketByLevel(it->second.m_Battlegrounds.begin()->second->GetMapId(), player->getLevel()); - if (bracketEntry) - { - BattlegroundBracketId bracketId = bracketEntry->GetBracketId(); - BattlegroundClientIdsContainer& clientIds = it->second.m_ClientBattlegroundIds[bracketId]; - for (BattlegroundClientIdsContainer::const_iterator itr = clientIds.begin(); itr != clientIds.end(); ++itr) - *data << uint32(*itr); - - data->PutBits(count_pos, clientIds.size(), 24); // bg instance count - } - } - - data->WriteByteSeq(guid[0]); - data->WriteByteSeq(guid[2]); - data->WriteByteSeq(guid[4]); - data->WriteByteSeq(guid[3]); + WorldPackets::Battleground::BattlefieldList battlefieldList; + battlefieldList.BattlemasterGuid = guid; + battlefieldList.BattlemasterListID = bgTypeId; + battlefieldList.MinLevel = bgTemplate->MinLevel; + battlefieldList.MaxLevel = bgTemplate->MaxLevel; + battlefieldList.PvpAnywhere = guid.IsEmpty(); + battlefieldList.HasRandomWinToday = player->GetRandomWinner(); + battlefieldList.HasHolidayWinToday = false; + battlefieldList.IsRandomBG = bgTypeId == BATTLEGROUND_RB; + player->SendDirectMessage(battlefieldList.Write()); } void BattlegroundMgr::SendToBattleground(Player* player, uint32 instanceId, BattlegroundTypeId bgTypeId) diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.h b/src/server/game/Battlegrounds/BattlegroundMgr.h index 6b19208778a..5f4fe41437c 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.h +++ b/src/server/game/Battlegrounds/BattlegroundMgr.h @@ -54,6 +54,19 @@ struct BattlegroundTemplate bool IsArena() const { return BattlemasterEntry->InstanceType == MAP_ARENA; } }; +namespace WorldPackets +{ + namespace Battleground + { + struct BattlefieldStatusHeader; + class BattlefieldStatusNone; + class BattlefieldStatusNeedConfirmation; + class BattlefieldStatusActive; + class BattlefieldStatusQueued; + class BattlefieldStatusFailed; + } +} + class BattlegroundMgr { private: @@ -72,14 +85,17 @@ class BattlegroundMgr /* Packet Building */ void BuildPlayerJoinedBattlegroundPacket(WorldPacket* data, ObjectGuid guid); void BuildPlayerLeftBattlegroundPacket(WorldPacket* data, ObjectGuid guid); - void BuildBattlegroundListPacket(WorldPacket* data, ObjectGuid guid, Player* player, BattlegroundTypeId bgTypeId); - void BuildStatusFailedPacket(WorldPacket* data, Battleground* bg, Player* pPlayer, uint8 QueueSlot, GroupJoinBattlegroundResult result); - void BuildBattlegroundStatusPacket(WorldPacket* data, Battleground* bg, Player* player, uint8 queueSlot, uint8 statusId, uint32 time1, uint32 time2, uint8 arenaType); + void SendBattlegroundList(Player* player, ObjectGuid const& guid, BattlegroundTypeId bgTypeId); + void BuildBattlegroundStatusHeader(WorldPackets::Battleground::BattlefieldStatusHeader* battlefieldStatus, Battleground* bg, Player* player, uint32 ticketId, uint32 joinTime, uint32 arenaType); + void BuildBattlegroundStatusNone(WorldPackets::Battleground::BattlefieldStatusNone* battlefieldStatus, Player* player, uint32 ticketId, uint32 joinTime, uint32 arenaType); + void BuildBattlegroundStatusNeedConfirmation(WorldPackets::Battleground::BattlefieldStatusNeedConfirmation* battlefieldStatus, Battleground* bg, Player* player, uint32 ticketId, uint32 joinTime, uint32 timeout, uint32 arenaType); + void BuildBattlegroundStatusActive(WorldPackets::Battleground::BattlefieldStatusActive* battlefieldStatus, Battleground* bg, Player* player, uint32 ticketId, uint32 joinTime, uint32 arenaType); + void BuildBattlegroundStatusQueued(WorldPackets::Battleground::BattlefieldStatusQueued* battlefieldStatus, Battleground* bg, Player* player, uint32 ticketId, uint32 joinTime, uint32 avgWaitTime, uint32 arenaType, bool asGroup); + void BuildBattlegroundStatusFailed(WorldPackets::Battleground::BattlefieldStatusFailed* battlefieldStatus, Battleground* bg, Player* pPlayer, uint32 ticketId, uint32 arenaType, GroupJoinBattlegroundResult result, ObjectGuid const* errorGuid = nullptr); void BuildPlaySoundPacket(WorldPacket* data, uint32 soundId); void SendAreaSpiritHealerQueryOpcode(Player* player, Battleground* bg, ObjectGuid guid); /* Battlegrounds */ - Battleground* GetBattlegroundThroughClientInstance(uint32 instanceId, BattlegroundTypeId bgTypeId); Battleground* GetBattleground(uint32 InstanceID, BattlegroundTypeId bgTypeId); Battleground* GetBattlegroundTemplate(BattlegroundTypeId bgTypeId); Battleground* CreateNewBattleground(BattlegroundTypeId bgTypeId, PvPDifficultyEntry const* bracketEntry, uint8 arenaType, bool isRated); diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp index 3d5770b7547..8c646859740 100644 --- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp +++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp @@ -20,6 +20,7 @@ #include "ArenaTeamMgr.h" #include "BattlegroundMgr.h" #include "BattlegroundQueue.h" +#include "BattlegroundPackets.h" #include "Chat.h" #include "Group.h" #include "Log.h" @@ -387,15 +388,15 @@ void BattlegroundQueue::RemovePlayer(ObjectGuid guid, bool decreaseInvitedCount) // first send removal information if (Player* plr2 = ObjectAccessor::FindConnectedPlayer(group->Players.begin()->first)) { - Battleground* bg = sBattlegroundMgr->GetBattlegroundTemplate(group->BgTypeId); BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(group->BgTypeId, group->ArenaType); uint32 queueSlot = plr2->GetBattlegroundQueueIndex(bgQueueTypeId); plr2->RemoveBattlegroundQueueId(bgQueueTypeId); // must be called this way, because if you move this call to // queue->removeplayer, it causes bugs - WorldPacket data; - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, plr2, queueSlot, STATUS_NONE, plr2->GetBattlegroundQueueJoinTime(group->BgTypeId), 0, group->ArenaType); - plr2->GetSession()->SendPacket(&data); + + WorldPackets::Battleground::BattlefieldStatusNone battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusNone(&battlefieldStatus, plr2, queueSlot, plr2->GetBattlegroundQueueJoinTime(bgQueueTypeId), group->ArenaType); + plr2->SendDirectMessage(battlefieldStatus.Write()); } // then actually delete, this may delete the group as well! RemovePlayer(group->Players.begin()->first, decreaseInvitedCount); @@ -478,9 +479,9 @@ bool BattlegroundQueue::InviteGroupToBG(GroupQueueInfo* ginfo, Battleground* bg, TC_LOG_DEBUG("bg.battleground", "Battleground: invited player %s (%s) to BG instance %u queueindex %u bgtype %u", player->GetName().c_str(), player->GetGUID().ToString().c_str(), bg->GetInstanceID(), queueSlot, bg->GetTypeID()); - // send status packet - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, player, queueSlot, STATUS_WAIT_JOIN, INVITE_ACCEPT_WAIT_TIME, player->GetBattlegroundQueueJoinTime(bgTypeId), ginfo->ArenaType); - player->GetSession()->SendPacket(&data); + WorldPackets::Battleground::BattlefieldStatusNeedConfirmation battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusNeedConfirmation(&battlefieldStatus, bg, player, queueSlot, player->GetBattlegroundQueueJoinTime(bgQueueTypeId), INVITE_ACCEPT_WAIT_TIME, ginfo->ArenaType); + player->SendDirectMessage(battlefieldStatus.Write()); } return true; } @@ -999,10 +1000,9 @@ bool BGQueueInviteEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) BattlegroundQueue &bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId); if (bgQueue.IsPlayerInvited(m_PlayerGuid, m_BgInstanceGUID, m_RemoveTime)) { - WorldPacket data; - //we must send remaining time in queue - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, player, queueSlot, STATUS_WAIT_JOIN, INVITE_ACCEPT_WAIT_TIME - INVITATION_REMIND_TIME, player->GetBattlegroundQueueJoinTime(m_BgTypeId), m_ArenaType); - player->GetSession()->SendPacket(&data); + WorldPackets::Battleground::BattlefieldStatusNeedConfirmation battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusNeedConfirmation(&battlefieldStatus, bg, player, queueSlot, player->GetBattlegroundQueueJoinTime(bgQueueTypeId), INVITE_ACCEPT_WAIT_TIME - INVITATION_REMIND_TIME, m_ArenaType); + player->SendDirectMessage(battlefieldStatus.Write()); } } return true; //event will be deleted @@ -1048,9 +1048,9 @@ bool BGQueueRemoveEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) if (bg && bg->isBattleground() && bg->GetStatus() != STATUS_WAIT_LEAVE) sBattlegroundMgr->ScheduleQueueUpdate(0, 0, m_BgQueueTypeId, m_BgTypeId, bg->GetBracketId()); - WorldPacket data; - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, player, queueSlot, STATUS_NONE, player->GetBattlegroundQueueJoinTime(m_BgTypeId), 0, m_ArenaType); - player->GetSession()->SendPacket(&data); + WorldPackets::Battleground::BattlefieldStatusNone battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusNone(&battlefieldStatus, player, queueSlot, player->GetBattlegroundQueueJoinTime(m_BgQueueTypeId), m_ArenaType); + player->SendDirectMessage(battlefieldStatus.Write()); } } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index fe35fe82108..ae5655a5655 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -751,6 +751,7 @@ Player::Player(WorldSession* session): Unit(true) { m_bgBattlegroundQueueID[j].bgQueueTypeId = BATTLEGROUND_QUEUE_NONE; m_bgBattlegroundQueueID[j].invitedToInstance = 0; + m_bgBattlegroundQueueID[j].joinTime = 0; } m_logintime = time(NULL); @@ -13953,7 +13954,7 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men return; } - GetSession()->SendBattleGroundList(guid, bgTypeId); + sBattlegroundMgr->SendBattlegroundList(this, guid, bgTypeId); break; } } @@ -23098,6 +23099,14 @@ Battleground* Player::GetBattleground() const return sBattlegroundMgr->GetBattleground(GetBattlegroundId(), m_bgData.bgTypeID); } +uint32 Player::GetBattlegroundQueueJoinTime(BattlegroundQueueTypeId bgQueueTypeId) const +{ + for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) + if (m_bgBattlegroundQueueID[i].bgQueueTypeId == bgQueueTypeId) + return m_bgBattlegroundQueueID[i].joinTime; + return 0; +} + bool Player::InBattlegroundQueue() const { for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) @@ -23108,7 +23117,10 @@ bool Player::InBattlegroundQueue() const BattlegroundQueueTypeId Player::GetBattlegroundQueueTypeId(uint32 index) const { - return m_bgBattlegroundQueueID[index].bgQueueTypeId; + if (index < PLAYER_MAX_BATTLEGROUND_QUEUES) + return m_bgBattlegroundQueueID[index].bgQueueTypeId; + + return BATTLEGROUND_QUEUE_NONE; } uint32 Player::GetBattlegroundQueueIndex(BattlegroundQueueTypeId bgQueueTypeId) const @@ -23146,6 +23158,7 @@ uint32 Player::AddBattlegroundQueueId(BattlegroundQueueTypeId val) { m_bgBattlegroundQueueID[i].bgQueueTypeId = val; m_bgBattlegroundQueueID[i].invitedToInstance = 0; + m_bgBattlegroundQueueID[i].joinTime = getMSTime(); return i; } } @@ -23168,6 +23181,7 @@ void Player::RemoveBattlegroundQueueId(BattlegroundQueueTypeId val) { m_bgBattlegroundQueueID[i].bgQueueTypeId = BATTLEGROUND_QUEUE_NONE; m_bgBattlegroundQueueID[i].invitedToInstance = 0; + m_bgBattlegroundQueueID[i].joinTime = 0; return; } } diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 104531d84e2..aff2b06f2b0 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1133,14 +1133,12 @@ class Player; struct BGData { BGData() : bgInstanceID(0), bgTypeID(BATTLEGROUND_TYPE_NONE), bgAfkReportedCount(0), bgAfkReportedTimer(0), - bgTeam(0), mountSpell(0) { bgQueuesJoinedTime.clear(); ClearTaxiPath(); } + bgTeam(0), mountSpell(0) { ClearTaxiPath(); } uint32 bgInstanceID; ///< This variable is set to bg->m_InstanceID, /// when player is teleported to BG - (it is battleground's GUID) BattlegroundTypeId bgTypeID; - std::map<uint32, uint32> bgQueuesJoinedTime; - GuidSet bgAfkReporter; uint8 bgAfkReportedCount; time_t bgAfkReportedTimer; @@ -2317,18 +2315,8 @@ class Player : public Unit, public GridObject<Player> BattlegroundTypeId GetBattlegroundTypeId() const { return m_bgData.bgTypeID; } Battleground* GetBattleground() const; - uint32 GetBattlegroundQueueJoinTime(uint32 bgTypeId) const { return m_bgData.bgQueuesJoinedTime.find(bgTypeId)->second; } - void AddBattlegroundQueueJoinTime(uint32 bgTypeId, uint32 joinTime) - { - m_bgData.bgQueuesJoinedTime[bgTypeId] = joinTime; - } - void RemoveBattlegroundQueueJoinTime(uint32 bgTypeId) - { - m_bgData.bgQueuesJoinedTime.erase(m_bgData.bgQueuesJoinedTime.find(bgTypeId)->second); - } - + uint32 GetBattlegroundQueueJoinTime(BattlegroundQueueTypeId bgQueueTypeId) const; bool InBattlegroundQueue() const; - BattlegroundQueueTypeId GetBattlegroundQueueTypeId(uint32 index) const; uint32 GetBattlegroundQueueIndex(BattlegroundQueueTypeId bgQueueTypeId) const; bool IsInvitedForBattlegroundQueueType(BattlegroundQueueTypeId bgQueueTypeId) const; @@ -2652,6 +2640,7 @@ class Player : public Unit, public GridObject<Player> { BattlegroundQueueTypeId bgQueueTypeId; uint32 invitedToInstance; + uint32 joinTime; }; BgBattlegroundQueueID_Rec m_bgBattlegroundQueueID[PLAYER_MAX_BATTLEGROUND_QUEUES]; diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 0b4ea05a40c..d7d08508230 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -1840,7 +1840,7 @@ void Group::UpdateLooterGuid(WorldObject* pLootedObject, bool ifneed) } } -GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* bgOrTemplate, BattlegroundQueueTypeId bgQueueTypeId, uint32 MinPlayerCount, uint32 /*MaxPlayerCount*/, bool isRated, uint32 arenaSlot) +GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* bgOrTemplate, BattlegroundQueueTypeId bgQueueTypeId, uint32 MinPlayerCount, uint32 /*MaxPlayerCount*/, bool isRated, uint32 arenaSlot, ObjectGuid& errorGuid) { // check if this group is LFG group if (isLFGGroup()) @@ -1881,7 +1881,10 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* return ERR_BATTLEGROUND_JOIN_FAILED; // don't allow cross-faction join as group if (member->GetTeam() != team) + { + errorGuid = member->GetGUID(); return ERR_BATTLEGROUND_JOIN_TIMED_OUT; + } // not in the same battleground level braket, don't let join PvPDifficultyEntry const* memberBracketEntry = GetBattlegroundBracketByLevel(bracketEntry->MapID, member->getLevel()); if (memberBracketEntry != bracketEntry) diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h index 274676036a3..4154f31a410 100644 --- a/src/server/game/Groups/Group.h +++ b/src/server/game/Groups/Group.h @@ -251,7 +251,7 @@ class Group void SetBattlegroundGroup(Battleground* bg); void SetBattlefieldGroup(Battlefield* bf); - GroupJoinBattlegroundResult CanJoinBattlegroundQueue(Battleground const* bgOrTemplate, BattlegroundQueueTypeId bgQueueTypeId, uint32 MinPlayerCount, uint32 MaxPlayerCount, bool isRated, uint32 arenaSlot); + GroupJoinBattlegroundResult CanJoinBattlegroundQueue(Battleground const* bgOrTemplate, BattlegroundQueueTypeId bgQueueTypeId, uint32 MinPlayerCount, uint32 MaxPlayerCount, bool isRated, uint32 arenaSlot, ObjectGuid& errorGuid); void ChangeMembersGroup(ObjectGuid guid, uint8 group); void SetTargetIcon(uint8 id, ObjectGuid whoGuid, ObjectGuid targetGuid); diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index 0b9bf2f5d65..2b49b4673bf 100644 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -36,15 +36,12 @@ #include "Group.h" #include "Battlefield.h" #include "BattlefieldMgr.h" +#include "NPCPackets.h" #include "BattlegroundPackets.h" -void WorldSession::HandleBattlemasterHelloOpcode(WorldPacket& recvData) +void WorldSession::HandleBattlemasterHelloOpcode(WorldPackets::NPC::Hello& hello) { - ObjectGuid guid; - recvData >> guid; - TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_BATTLEMASTER_HELLO Message from %s", guid.ToString().c_str()); - - Creature* unit = GetPlayer()->GetMap()->GetCreature(guid); + Creature* unit = GetPlayer()->GetMap()->GetCreature(hello.Unit); if (!unit) return; @@ -63,48 +60,14 @@ void WorldSession::HandleBattlemasterHelloOpcode(WorldPacket& recvData) return; } - SendBattleGroundList(guid, bgTypeId); + sBattlegroundMgr->SendBattlegroundList(_player, hello.Unit, bgTypeId); } -void WorldSession::SendBattleGroundList(ObjectGuid guid, BattlegroundTypeId bgTypeId) +void WorldSession::HandleBattlemasterJoinOpcode(WorldPackets::Battleground::BattlemasterJoin& battlemasterJoin) { - WorldPacket data; - sBattlegroundMgr->BuildBattlegroundListPacket(&data, guid, _player, bgTypeId); - SendPacket(&data); -} - -void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData) -{ - uint32 bgTypeId_; - uint32 instanceId; - uint8 asGroup; bool isPremade = false; Group* grp = NULL; - ObjectGuid guid; - - recvData >> instanceId; // Instance Id - guid[2] = recvData.ReadBit(); - guid[0] = recvData.ReadBit(); - guid[3] = recvData.ReadBit(); - guid[1] = recvData.ReadBit(); - guid[5] = recvData.ReadBit(); - asGroup = recvData.ReadBit(); // As Group - guid[4] = recvData.ReadBit(); - guid[6] = recvData.ReadBit(); - guid[7] = recvData.ReadBit(); - - recvData.ReadByteSeq(guid[2]); - recvData.ReadByteSeq(guid[6]); - recvData.ReadByteSeq(guid[4]); - recvData.ReadByteSeq(guid[3]); - recvData.ReadByteSeq(guid[7]); - recvData.ReadByteSeq(guid[0]); - recvData.ReadByteSeq(guid[5]); - recvData.ReadByteSeq(guid[1]); - - //extract from guid - bgTypeId_ = uint64(guid.GetCounter()) & 0xFFFFFFFF; - + uint32 bgTypeId_ = battlemasterJoin.QueueID & 0xFFFF; if (!sBattlemasterListStore.LookupEntry(bgTypeId_)) { TC_LOG_ERROR("network", "Battleground: invalid bgtype (%u) received. possible cheater? %s", bgTypeId_, _player->GetGUID().ToString().c_str()); @@ -116,9 +79,8 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData) ChatHandler(this).PSendSysMessage(LANG_BG_DISABLED); return; } - BattlegroundTypeId bgTypeId = BattlegroundTypeId(bgTypeId_); - TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_BATTLEMASTER_JOIN Message from %s", guid.ToString().c_str()); + BattlegroundTypeId bgTypeId = BattlegroundTypeId(bgTypeId_); // can do this, since it's battleground, not arena BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(bgTypeId, 0); @@ -129,12 +91,7 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData) return; // get bg instance or bg template if instance not found - Battleground* bg = NULL; - if (instanceId) - bg = sBattlegroundMgr->GetBattlegroundThroughClientInstance(instanceId, bgTypeId); - - if (!bg) - bg = sBattlegroundMgr->GetBattlegroundTemplate(bgTypeId); + Battleground* bg = sBattlegroundMgr->GetBattlegroundTemplate(bgTypeId); if (!bg) return; @@ -146,40 +103,40 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData) GroupJoinBattlegroundResult err = ERR_BATTLEGROUND_NONE; // check queue conditions - if (!asGroup) + if (!battlemasterJoin.JoinAsGroup) { if (GetPlayer()->isUsingLfg()) { - WorldPacket data; - sBattlegroundMgr->BuildStatusFailedPacket(&data, bg, _player, 0, ERR_LFG_CANT_USE_BATTLEGROUND); - SendPacket(&data); + WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusFailed(&battlefieldStatus, bg, _player, 0, 0, ERR_LFG_CANT_USE_BATTLEGROUND); + SendPacket(battlefieldStatus.Write()); return; } // check Deserter debuff if (!_player->CanJoinToBattleground(bg)) { - WorldPacket data; - sBattlegroundMgr->BuildStatusFailedPacket(&data, bg, _player, 0, ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS); - SendPacket(&data); + WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusFailed(&battlefieldStatus, bg, _player, 0, 0, ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS); + SendPacket(battlefieldStatus.Write()); return; } if (_player->GetBattlegroundQueueIndex(bgQueueTypeIdRandom) < PLAYER_MAX_BATTLEGROUND_QUEUES) { // player is already in random queue - WorldPacket data; - sBattlegroundMgr->BuildStatusFailedPacket(&data, bg, _player, 0, ERR_IN_RANDOM_BG); - SendPacket(&data); + WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusFailed(&battlefieldStatus, bg, _player, 0, 0, ERR_IN_RANDOM_BG); + SendPacket(battlefieldStatus.Write()); return; } if (_player->InBattlegroundQueue() && bgTypeId == BATTLEGROUND_RB) { // player is already in queue, can't start random queue - WorldPacket data; - sBattlegroundMgr->BuildStatusFailedPacket(&data, bg, _player, 0, ERR_IN_NON_RANDOM_BG); - SendPacket(&data); + WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusFailed(&battlefieldStatus, bg, _player, 0, 0, ERR_IN_NON_RANDOM_BG); + SendPacket(battlefieldStatus.Write()); return; } @@ -191,9 +148,9 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData) // check if has free queue slots if (!_player->HasFreeBattlegroundQueueId()) { - WorldPacket data; - sBattlegroundMgr->BuildStatusFailedPacket(&data, bg, _player, 0, ERR_BATTLEGROUND_TOO_MANY_QUEUES); - SendPacket(&data); + WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusFailed(&battlefieldStatus, bg, _player, 0, 0, ERR_BATTLEGROUND_TOO_MANY_QUEUES); + SendPacket(battlefieldStatus.Write()); return; } @@ -203,12 +160,9 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData) uint32 avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId()); uint32 queueSlot = _player->AddBattlegroundQueueId(bgQueueTypeId); - // add joined time data - _player->AddBattlegroundQueueJoinTime(bgTypeId, ginfo->JoinTime); - - WorldPacket data; // send status packet (in queue) - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, _player, queueSlot, STATUS_WAIT_QUEUE, avgTime, ginfo->JoinTime, ginfo->ArenaType); - SendPacket(&data); + WorldPackets::Battleground::BattlefieldStatusQueued battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusQueued(&battlefieldStatus, bg, _player, queueSlot, ginfo->JoinTime, avgTime, ginfo->ArenaType, false); + SendPacket(battlefieldStatus.Write()); TC_LOG_DEBUG("bg.battleground", "Battleground: player joined queue for bg queue type %u bg type %u, %s, NAME %s", bgQueueTypeId, bgTypeId, _player->GetGUID().ToString().c_str(), _player->GetName().c_str()); @@ -223,7 +177,8 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData) if (grp->GetLeaderGUID() != _player->GetGUID()) return; - err = grp->CanJoinBattlegroundQueue(bg, bgQueueTypeId, 0, bg->GetMaxPlayersPerTeam(), false, 0); + ObjectGuid errorGuid; + err = grp->CanJoinBattlegroundQueue(bg, bgQueueTypeId, 0, bg->GetMaxPlayersPerTeam(), false, 0, errorGuid); isPremade = (grp->GetMembersCount() >= bg->GetMinPlayersPerTeam()); BattlegroundQueue& bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId); @@ -245,21 +200,18 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData) if (err) { - WorldPacket data; - sBattlegroundMgr->BuildStatusFailedPacket(&data, bg, _player, 0, err); - member->GetSession()->SendPacket(&data); + WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusFailed(&battlefieldStatus, bg, _player, 0, 0, err, &errorGuid); + member->SendDirectMessage(battlefieldStatus.Write()); continue; } // add to queue uint32 queueSlot = member->AddBattlegroundQueueId(bgQueueTypeId); - // add joined time data - member->AddBattlegroundQueueJoinTime(bgTypeId, ginfo->JoinTime); - - WorldPacket data; // send status packet (in queue) - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, member, queueSlot, STATUS_WAIT_QUEUE, avgTime, ginfo->JoinTime, ginfo->ArenaType); - member->GetSession()->SendPacket(&data); + WorldPackets::Battleground::BattlefieldStatusQueued battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusQueued(&battlefieldStatus, bg, member, queueSlot, ginfo->JoinTime, avgTime, ginfo->ArenaType, true); + member->SendDirectMessage(battlefieldStatus.Write()); TC_LOG_DEBUG("bg.battleground", "Battleground: player joined queue for bg queue type %u bg type %u, %s, NAME %s", bgQueueTypeId, bgTypeId, member->GetGUID().ToString().c_str(), member->GetName().c_str()); } @@ -374,67 +326,32 @@ void WorldSession::HandlePVPLogDataOpcode(WorldPackets::Battleground::PVPLogData SendPacket(pvpLogData.Write()); } -void WorldSession::HandleBattlefieldListOpcode(WorldPacket& recvData) +void WorldSession::HandleBattlefieldListOpcode(WorldPackets::Battleground::BattlefieldListRequest& battlefieldList) { - uint32 bgTypeId; - recvData >> bgTypeId; // id from DBC - - BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(bgTypeId); - if (!bl) + BattlemasterListEntry const* battlemasterListEntry = sBattlemasterListStore.LookupEntry(battlefieldList.ListID); + if (!battlemasterListEntry) { - TC_LOG_DEBUG("bg.battleground", "BattlegroundHandler: invalid bgtype (%u) with player (Name: %s, %s) received.", bgTypeId, _player->GetName().c_str(), _player->GetGUID().ToString().c_str()); + TC_LOG_DEBUG("bg.battleground", "BattlegroundHandler: invalid bgtype (%u) with player (Name: %s, %s) received.", battlefieldList.ListID, _player->GetName().c_str(), _player->GetGUID().ToString().c_str()); return; } - WorldPacket data; - sBattlegroundMgr->BuildBattlegroundListPacket(&data, ObjectGuid::Empty, _player, BattlegroundTypeId(bgTypeId)); - SendPacket(&data); + sBattlegroundMgr->SendBattlegroundList(_player, ObjectGuid::Empty, BattlegroundTypeId(battlefieldList.ListID)); } -void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) +void WorldSession::HandleBattleFieldPortOpcode(WorldPackets::Battleground::BattlefieldPort& battlefieldPort) { - uint32 time; - uint32 queueSlot; - uint32 unk; - uint8 action; // enter battle 0x1, leave queue 0x0 - ObjectGuid guid; - - recvData >> time; - recvData >> queueSlot; - recvData >> unk; - - guid[0] = recvData.ReadBit(); - guid[1] = recvData.ReadBit(); - guid[5] = recvData.ReadBit(); - guid[6] = recvData.ReadBit(); - guid[7] = recvData.ReadBit(); - guid[4] = recvData.ReadBit(); - guid[3] = recvData.ReadBit(); - guid[2] = recvData.ReadBit(); - - action = recvData.ReadBit(); - - recvData.ReadByteSeq(guid[1]); - recvData.ReadByteSeq(guid[3]); - recvData.ReadByteSeq(guid[5]); - recvData.ReadByteSeq(guid[7]); - recvData.ReadByteSeq(guid[0]); - recvData.ReadByteSeq(guid[2]); - recvData.ReadByteSeq(guid[6]); - recvData.ReadByteSeq(guid[4]); - if (!_player->InBattlegroundQueue()) { - TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT %s Slot: %u, Unk: %u, Time: %u, Action: %u. Player not in queue!", - GetPlayerInfo().c_str(), queueSlot, unk, time, action); + TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT %s Slot: %u, Unk: %u, Time: %u, AcceptedInvite: %u. Player not in queue!", + GetPlayerInfo().c_str(), battlefieldPort.Ticket.Id, battlefieldPort.Ticket.Type, battlefieldPort.Ticket.Time, uint32(battlefieldPort.AcceptedInvite)); return; } - BattlegroundQueueTypeId bgQueueTypeId = _player->GetBattlegroundQueueTypeId(queueSlot); + BattlegroundQueueTypeId bgQueueTypeId = _player->GetBattlegroundQueueTypeId(battlefieldPort.Ticket.Id); if (bgQueueTypeId == BATTLEGROUND_QUEUE_NONE) { - TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT %s Slot: %u, Unk: %u, Time: %u, Action: %u. Invalid queueSlot!", - GetPlayerInfo().c_str(), queueSlot, unk, time, action); + TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT %s Slot: %u, Unk: %u, Time: %u, AcceptedInvite: %u. Invalid queueSlot!", + GetPlayerInfo().c_str(), battlefieldPort.Ticket.Id, battlefieldPort.Ticket.Type, battlefieldPort.Ticket.Time, uint32(battlefieldPort.AcceptedInvite)); return; } @@ -444,15 +361,15 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) GroupQueueInfo ginfo; if (!bgQueue.GetPlayerGroupInfoData(_player->GetGUID(), &ginfo)) { - TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT %s Slot: %u, Unk: %u, Time: %u, Action: %u. Player not in queue (No player Group Info)!", - GetPlayerInfo().c_str(), queueSlot, unk, time, action); + TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT %s Slot: %u, Unk: %u, Time: %u, AcceptedInvite: %u. Player not in queue (No player Group Info)!", + GetPlayerInfo().c_str(), battlefieldPort.Ticket.Id, battlefieldPort.Ticket.Type, battlefieldPort.Ticket.Time, uint32(battlefieldPort.AcceptedInvite)); return; } - // if action == 1, then instanceId is required - if (!ginfo.IsInvitedToBGInstanceGUID && action == 1) + // if action == 1, then player must have been invited to join + if (!ginfo.IsInvitedToBGInstanceGUID && battlefieldPort.AcceptedInvite) { - TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT %s Slot: %u, Unk: %u, Time: %u, Action: %u. Player is not invited to any bg!", - GetPlayerInfo().c_str(), queueSlot, unk, time, action); + TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT %s Slot: %u, Unk: %u, Time: %u, AcceptedInvite: %u. Player is not invited to any bg!", + GetPlayerInfo().c_str(), battlefieldPort.Ticket.Id, battlefieldPort.Ticket.Type, battlefieldPort.Ticket.Time, uint32(battlefieldPort.AcceptedInvite)); return; } @@ -462,10 +379,10 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) Battleground* bg = sBattlegroundMgr->GetBattleground(ginfo.IsInvitedToBGInstanceGUID, bgTypeId == BATTLEGROUND_AA ? BATTLEGROUND_TYPE_NONE : bgTypeId); if (!bg) { - if (action) + if (battlefieldPort.AcceptedInvite) { - TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT %s Slot: %u, Unk: %u, Time: %u, Action: %u. Cant find BG with id %u!", - GetPlayerInfo().c_str(), queueSlot, unk, time, action, ginfo.IsInvitedToBGInstanceGUID); + TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT %s Slot: %u, Unk: %u, Time: %u, AcceptedInvite: %u. Cant find BG with id %u!", + GetPlayerInfo().c_str(), battlefieldPort.Ticket.Id, battlefieldPort.Ticket.Type, battlefieldPort.Ticket.Time, uint32(battlefieldPort.AcceptedInvite), ginfo.IsInvitedToBGInstanceGUID); return; } @@ -477,8 +394,8 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) } } - TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT %s Slot: %u, Unk: %u, Time: %u, Action: %u.", - GetPlayerInfo().c_str(), queueSlot, unk, time, action); + TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT %s Slot: %u, Unk: %u, Time: %u, AcceptedInvite: %u.", + GetPlayerInfo().c_str(), battlefieldPort.Ticket.Id, battlefieldPort.Ticket.Type, battlefieldPort.Ticket.Time, uint32(battlefieldPort.AcceptedInvite)); // get real bg type bgTypeId = bg->GetTypeID(); @@ -489,16 +406,16 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) return; //some checks if player isn't cheating - it is not exactly cheating, but we cannot allow it - if (action == 1 && ginfo.ArenaType == 0) + if (battlefieldPort.AcceptedInvite && ginfo.ArenaType == 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)) { //send bg command result to show nice message - WorldPacket data2; - sBattlegroundMgr->BuildStatusFailedPacket(&data2, bg, _player, 0, ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS); - _player->GetSession()->SendPacket(&data2); - action = 0; + WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusFailed(&battlefieldStatus, bg, _player, battlefieldPort.Ticket.Id, 0, ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS); + SendPacket(battlefieldPort.Write()); + battlefieldPort.AcceptedInvite = false; TC_LOG_DEBUG("bg.battleground", "Player %s (%s) has a deserter debuff, do not port him to battleground!", _player->GetName().c_str(), _player->GetGUID().ToString().c_str()); } //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 @@ -506,12 +423,11 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) { TC_LOG_DEBUG("network", "Player %s (%s) has level (%u) higher than maxlevel (%u) of battleground (%u)! Do not port him to battleground!", _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), _player->getLevel(), bg->GetMaxLevel(), bg->GetTypeID()); - action = 0; + battlefieldPort.AcceptedInvite = false; } } - WorldPacket data; - if (action) + if (battlefieldPort.AcceptedInvite) { if (!_player->IsInvitedForBattlegroundQueueType(bgQueueTypeId)) return; // cheating? @@ -532,8 +448,9 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) _player->CleanupAfterTaxiFlight(); } - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, _player, queueSlot, STATUS_IN_PROGRESS, _player->GetBattlegroundQueueJoinTime(bgTypeId), bg->GetElapsedTime(), bg->GetArenaType()); - _player->GetSession()->SendPacket(&data); + WorldPackets::Battleground::BattlefieldStatusActive battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusActive(&battlefieldStatus, bg, _player, battlefieldPort.Ticket.Id, _player->GetBattlegroundQueueJoinTime(bgQueueTypeId), bg->GetArenaType()); + SendPacket(battlefieldStatus.Write()); // remove battleground queue status from BGmgr bgQueue.RemovePlayer(_player->GetGUID(), false); @@ -566,8 +483,10 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) at->SaveToDB(); } } - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, _player, queueSlot, STATUS_NONE, _player->GetBattlegroundQueueJoinTime(bgTypeId), 0, ginfo.ArenaType); - SendPacket(&data); + + WorldPackets::Battleground::BattlefieldStatusNone battlefieldStatus; + battlefieldStatus.Ticket = battlefieldPort.Ticket; + SendPacket(battlefieldStatus.Write()); _player->RemoveBattlegroundQueueId(bgQueueTypeId); // must be called this way, because if you move this call to queue->removeplayer, it causes bugs bgQueue.RemovePlayer(_player->GetGUID(), true); @@ -579,7 +498,7 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) } } -void WorldSession::HandleBattlefieldLeaveOpcode(WorldPacket& /*recvData*/) +void WorldSession::HandleBattlefieldLeaveOpcode(WorldPackets::Battleground::BattlefieldLeave& /*battlefieldLeave*/) { // not allow leave battleground in combat if (_player->IsInCombat()) @@ -590,9 +509,8 @@ void WorldSession::HandleBattlefieldLeaveOpcode(WorldPacket& /*recvData*/) _player->LeaveBattleground(); } -void WorldSession::HandleRequestBattlefieldStatusOpcode(WorldPacket& /*recvData*/) +void WorldSession::HandleRequestBattlefieldStatusOpcode(WorldPackets::Battleground::RequestBattlefieldStatus& /*requestBattlefieldStatus*/) { - WorldPacket data; // we must update all queues here Battleground* bg = NULL; for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) @@ -609,10 +527,9 @@ void WorldSession::HandleRequestBattlefieldStatusOpcode(WorldPacket& /*recvData* //so i must use bg pointer to get that information if (bg && bg->GetArenaType() == arenaType) { - // this line is checked, i only don't know if GetElapsedTime() is changing itself after bg end! - // send status in Battleground - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, GetPlayer(), i, STATUS_IN_PROGRESS, _player->GetBattlegroundQueueJoinTime(bgTypeId), bg->GetElapsedTime(), arenaType); - SendPacket(&data); + WorldPackets::Battleground::BattlefieldStatusActive battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusActive(&battlefieldStatus, bg, _player, i, _player->GetBattlegroundQueueJoinTime(bgQueueTypeId), arenaType); + SendPacket(battlefieldStatus.Write()); continue; } } @@ -629,9 +546,10 @@ void WorldSession::HandleRequestBattlefieldStatusOpcode(WorldPacket& /*recvData* if (!bg) continue; - // send status invited to Battleground - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, GetPlayer(), i, STATUS_WAIT_JOIN, getMSTimeDiff(getMSTime(), ginfo.RemoveInviteTime), _player->GetBattlegroundQueueJoinTime(bgTypeId), arenaType); - SendPacket(&data); + + WorldPackets::Battleground::BattlefieldStatusNeedConfirmation battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusNeedConfirmation(&battlefieldStatus, bg, _player, i, _player->GetBattlegroundQueueJoinTime(bgQueueTypeId), getMSTimeDiff(getMSTime(), ginfo.RemoveInviteTime), arenaType); + SendPacket(battlefieldStatus.Write()); } else { @@ -645,9 +563,9 @@ void WorldSession::HandleRequestBattlefieldStatusOpcode(WorldPacket& /*recvData* continue; uint32 avgTime = bgQueue.GetAverageQueueWaitTime(&ginfo, bracketEntry->GetBracketId()); - // send status in Battleground Queue - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, GetPlayer(), i, STATUS_WAIT_QUEUE, avgTime, _player->GetBattlegroundQueueJoinTime(bgTypeId), arenaType); - SendPacket(&data); + WorldPackets::Battleground::BattlefieldStatusQueued battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusQueued(&battlefieldStatus, bg, _player, i, _player->GetBattlegroundQueueJoinTime(bgQueueTypeId), avgTime, arenaType, ginfo.Players.size() > 1); + SendPacket(battlefieldStatus.Write()); } } } @@ -718,7 +636,8 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket& recvData) uint32 avgTime = 0; GroupQueueInfo* ginfo = NULL; - err = grp->CanJoinBattlegroundQueue(bg, bgQueueTypeId, arenatype, arenatype, true, arenaslot); + ObjectGuid errorGuid; + err = grp->CanJoinBattlegroundQueue(bg, bgQueueTypeId, arenatype, arenatype, true, arenaslot, errorGuid); if (!err) { TC_LOG_DEBUG("bg.battleground", "Battleground: arena team id %u, leader %s queued with matchmaker rating %u for type %u", _player->GetArenaTeamId(arenaslot), _player->GetName().c_str(), matchmakerRating, arenatype); @@ -735,21 +654,18 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket& recvData) if (err) { - WorldPacket data; - sBattlegroundMgr->BuildStatusFailedPacket(&data, bg, _player, 0, err); - member->GetSession()->SendPacket(&data); + WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusFailed(&battlefieldStatus, bg, _player, 0, arenatype, err, &errorGuid); + member->SendDirectMessage(battlefieldStatus.Write()); continue; } // add to queue uint32 queueSlot = member->AddBattlegroundQueueId(bgQueueTypeId); - // add joined time data - member->AddBattlegroundQueueJoinTime(bgTypeId, ginfo->JoinTime); - - WorldPacket data; // send status packet (in queue) - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, member, queueSlot, STATUS_WAIT_QUEUE, avgTime, ginfo->JoinTime, arenatype); - member->GetSession()->SendPacket(&data); + WorldPackets::Battleground::BattlefieldStatusQueued battlefieldStatus; + sBattlegroundMgr->BuildBattlegroundStatusQueued(&battlefieldStatus, bg, member, queueSlot, ginfo->JoinTime, avgTime, arenatype, true); + member->SendDirectMessage(battlefieldStatus.Write()); TC_LOG_DEBUG("bg.battleground", "Battleground: player joined queue for arena as group bg queue type %u bg type %u, %s, NAME %s", bgQueueTypeId, bgTypeId, member->GetGUID().ToString().c_str(), member->GetName().c_str()); } @@ -806,19 +722,17 @@ void WorldSession::HandleRequestRatedBattlefieldInfo(WorldPacket& recvData) SendPacket(&data); } -void WorldSession::HandleGetPVPOptionsEnabled(WorldPacket& /*recvData*/) +void WorldSession::HandleGetPVPOptionsEnabled(WorldPackets::Battleground::GetPVPOptionsEnabled& /*getPvPOptionsEnabled*/) { - /// @Todo: perfome research in this case - WorldPacket data(SMSG_PVP_OPTIONS_ENABLED, 1); - data.WriteBit(1); - data.WriteBit(1); // WargamesEnabled - data.WriteBit(1); - data.WriteBit(1); // RatedBGsEnabled - data.WriteBit(1); // RatedArenasEnabled - - data.FlushBits(); - - SendPacket(&data); + // This packet is completely irrelevant, it triggers PVP_TYPES_ENABLED lua event but that is not handled in interface code as of 6.1.2 + WorldPackets::Battleground::PVPOptionsEnabled pvpOptionsEnabled; + pvpOptionsEnabled.WargameArenas = false; + pvpOptionsEnabled.RatedArenas = false; + pvpOptionsEnabled.WargameBattlegrounds = false; + pvpOptionsEnabled.ArenaSkirmish = false; + pvpOptionsEnabled.PugBattlegrounds = true; + pvpOptionsEnabled.RatedBattlegrounds = false; + SendPacket(pvpOptionsEnabled.Write()); } void WorldSession::HandleRequestPvpReward(WorldPacket& /*recvData*/) diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 4a024441ed5..28705b36c65 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -4784,7 +4784,11 @@ enum GroupJoinBattlegroundResult ERR_REMOVE_FROM_PVP_QUEUE_GRANT_LEVEL = 33, ERR_REMOVE_FROM_PVP_QUEUE_FACTION_CHANGE = 34, ERR_BATTLEGROUND_JOIN_FAILED = 35, - ERR_BATTLEGROUND_DUPE_QUEUE = 43 + ERR_BATTLEGROUND_DUPE_QUEUE = 43, + ERR_BATTLEGROUND_JOIN_NO_VALID_SPEC_FOR_ROLE = 44, + ERR_BATTLEGROUND_JOIN_RESPEC = 45, + ERR_ALREADY_USING_LFG_LIST = 46, + ERR_BATTLEGROUND_JOIN_MUST_COMPLETE_QUEST = 47 }; enum PetNameInvalidReason diff --git a/src/server/game/Server/Packets/BattlegroundPackets.cpp b/src/server/game/Server/Packets/BattlegroundPackets.cpp index e11fd9c1ac8..a6aeb370ebe 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.cpp +++ b/src/server/game/Server/Packets/BattlegroundPackets.cpp @@ -110,3 +110,114 @@ WorldPacket const* WorldPackets::Battleground::PVPLogData::Write() return &_worldPacket; } + +void WorldPackets::Battleground::BattlemasterJoin::Read() +{ + _worldPacket >> QueueID; + _worldPacket >> Roles; + _worldPacket >> BlacklistMap[0] >> BlacklistMap[1]; + JoinAsGroup = _worldPacket.ReadBit(); +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::BattlefieldStatusHeader const& header) +{ + data << header.Ticket; + data << uint64(header.QueueID); + data << uint8(header.RangeMin); + data << uint8(header.RangeMax); + data << uint8(header.TeamSize); + data << uint32(header.InstanceID); + data.WriteBit(header.RegisteredMatch); + data.WriteBit(header.TournamentRules); + data.FlushBits(); + return data; +} + +WorldPacket const* WorldPackets::Battleground::BattlefieldStatusNone::Write() +{ + _worldPacket << Ticket; + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Battleground::BattlefieldStatusNeedConfirmation::Write() +{ + _worldPacket << Hdr; + _worldPacket << uint32(Mapid); + _worldPacket << uint32(Timeout); + _worldPacket << uint8(Role); + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Battleground::BattlefieldStatusActive::Write() +{ + _worldPacket << Hdr; + _worldPacket << uint32(Mapid); + _worldPacket << uint32(ShutdownTimer); + _worldPacket << uint32(StartTimer); + _worldPacket.WriteBit(ArenaFaction); + _worldPacket.WriteBit(LeftEarly); + _worldPacket.FlushBits(); + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Battleground::BattlefieldStatusQueued::Write() +{ + _worldPacket << Hdr; + _worldPacket << uint32(AverageWaitTime); + _worldPacket << uint32(WaitTime); + _worldPacket.WriteBit(AsGroup); + _worldPacket.WriteBit(EligibleForMatchmaking); + _worldPacket.WriteBit(SuspendedQueue); + _worldPacket.FlushBits(); + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Battleground::BattlefieldStatusFailed::Write() +{ + _worldPacket << Ticket; + _worldPacket << uint64(QueueID); + _worldPacket << uint32(Reason); + _worldPacket << ClientID; + return &_worldPacket; +} + +void WorldPackets::Battleground::BattlefieldPort::Read() +{ + _worldPacket >> Ticket; + AcceptedInvite = _worldPacket.ReadBit(); +} + +void WorldPackets::Battleground::BattlefieldListRequest::Read() +{ + _worldPacket >> ListID; +} + +WorldPacket const* WorldPackets::Battleground::BattlefieldList::Write() +{ + _worldPacket << BattlemasterGuid; + _worldPacket << int32(BattlemasterListID); + _worldPacket << uint8(MinLevel); + _worldPacket << uint8(MaxLevel); + _worldPacket << uint32(Battlefields.size()); + if (!Battlefields.empty()) + _worldPacket.append(Battlefields.data(), Battlefields.size()); + + _worldPacket.WriteBit(PvpAnywhere); + _worldPacket.WriteBit(HasHolidayWinToday); + _worldPacket.WriteBit(HasRandomWinToday); + _worldPacket.WriteBit(IsRandomBG); + _worldPacket.FlushBits(); + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Battleground::PVPOptionsEnabled::Write() +{ + _worldPacket.WriteBit(RatedBattlegrounds); + _worldPacket.WriteBit(PugBattlegrounds); + _worldPacket.WriteBit(WargameBattlegrounds); + _worldPacket.WriteBit(WargameArenas); + _worldPacket.WriteBit(RatedArenas); + _worldPacket.WriteBit(ArenaSkirmish); + _worldPacket.FlushBits(); + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/BattlegroundPackets.h b/src/server/game/Server/Packets/BattlegroundPackets.h index 8620112f548..efecef094ce 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.h +++ b/src/server/game/Server/Packets/BattlegroundPackets.h @@ -20,6 +20,7 @@ #include "ObjectGuid.h" #include "Packet.h" +#include "LFGPackets.h" namespace WorldPackets { @@ -116,6 +117,175 @@ namespace WorldPackets Optional<RatingData> Ratings; int8 PlayerCount[2] = { }; }; + + struct BattlefieldStatusHeader + { + WorldPackets::LFG::RideTicket Ticket; + uint64 QueueID = 0; + uint8 RangeMin = 0; + uint8 RangeMax = 0; + uint8 TeamSize = 0; + uint32 InstanceID = 0; + bool RegisteredMatch = false; + bool TournamentRules = false; + }; + + class BattlefieldStatusNone final : public ServerPacket + { + public: + BattlefieldStatusNone() : ServerPacket(SMSG_BATTLEFIELD_STATUS_NONE, 16 + 4 + 4 + 4) { } + + WorldPacket const* Write() override; + + WorldPackets::LFG::RideTicket Ticket; + }; + + class BattlefieldStatusNeedConfirmation final : public ServerPacket + { + public: + BattlefieldStatusNeedConfirmation() : ServerPacket(SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION, 4 + 4 + sizeof(BattlefieldStatusHeader) + 1) { } + + WorldPacket const* Write() override; + + uint32 Timeout = 0; + uint32 Mapid = 0; + BattlefieldStatusHeader Hdr; + uint8 Role = 0; + }; + + class BattlefieldStatusActive final : public ServerPacket + { + public: + BattlefieldStatusActive() : ServerPacket(SMSG_BATTLEFIELD_STATUS_ACTIVE, sizeof(BattlefieldStatusHeader) + 4 + 1 + 1 + 4 + 4) { } + + WorldPacket const* Write() override; + + BattlefieldStatusHeader Hdr; + uint32 ShutdownTimer = 0; + uint8 ArenaFaction = 0; + bool LeftEarly = false; + uint32 StartTimer = 0; + uint32 Mapid = 0; + }; + + class BattlefieldStatusQueued final : public ServerPacket + { + public: + BattlefieldStatusQueued() : ServerPacket(SMSG_BATTLEFIELD_STATUS_QUEUED, 4 + sizeof(BattlefieldStatusHeader) + 1 + 1 + 1 + 4) { } + + WorldPacket const* Write() override; + + uint32 AverageWaitTime = 0; + BattlefieldStatusHeader Hdr; + bool AsGroup = false; + bool SuspendedQueue = false; + bool EligibleForMatchmaking = false; + uint32 WaitTime = 0; + }; + + class BattlefieldStatusFailed final : public ServerPacket + { + public: + BattlefieldStatusFailed() : ServerPacket(SMSG_BATTLEFIELD_STATUS_FAILED, 8 + 16 + 4 + 16 + 4 + 4 + 4) { } + + WorldPacket const* Write() override; + + uint64 QueueID = 0; + ObjectGuid ClientID; + int32 Reason = 0; + WorldPackets::LFG::RideTicket Ticket; + }; + + class BattlemasterJoin final : public ClientPacket + { + public: + BattlemasterJoin(WorldPacket&& packet) : ClientPacket(CMSG_BATTLEMASTER_JOIN, std::move(packet)) { } + + void Read() override; + + bool JoinAsGroup = false; + uint8 Roles = 0; + uint64 QueueID = 0; + int32 BlacklistMap[2] = { }; + }; + + class BattlefieldLeave final : public ClientPacket + { + public: + BattlefieldLeave(WorldPacket&& packet) : ClientPacket(CMSG_BATTLEFIELD_LEAVE, std::move(packet)) { } + + void Read() override { } + }; + + class BattlefieldPort final : public ClientPacket + { + public: + BattlefieldPort(WorldPacket&& packet) : ClientPacket(CMSG_BATTLEFIELD_PORT, std::move(packet)) { } + + void Read() override; + + WorldPackets::LFG::RideTicket Ticket; + bool AcceptedInvite = false; + }; + + class BattlefieldListRequest final : public ClientPacket + { + public: + BattlefieldListRequest(WorldPacket&& packet) : ClientPacket(CMSG_BATTLEFIELD_LIST, std::move(packet)) { } + + void Read() override; + + int32 ListID = 0; + }; + + class BattlefieldList final : public ServerPacket + { + public: + BattlefieldList() : ServerPacket(SMSG_BATTLEFIELD_LIST, 1 + 1 + 16 + 1 + 1 + 1 + 4 + 1 + 4) { } + + WorldPacket const* Write() override; + + uint8 MaxLevel = 0; + bool PvpAnywhere = false; + ObjectGuid BattlemasterGuid; + bool IsRandomBG = false; + uint8 MinLevel = 0; + bool HasHolidayWinToday = false; + int32 BattlemasterListID = 0; + bool HasRandomWinToday = false; + std::vector<int32> Battlefields; // Players cannot join a specific battleground instance anymore - this is always empty + }; + + class GetPVPOptionsEnabled final : public ClientPacket + { + public: + GetPVPOptionsEnabled(WorldPacket&& packet) : ClientPacket(CMSG_GET_PVP_OPTIONS_ENABLED, std::move(packet)) { } + + void Read() override { } + }; + + class PVPOptionsEnabled final : public ServerPacket + { + public: + PVPOptionsEnabled() : ServerPacket(SMSG_PVP_OPTIONS_ENABLED, 1) { } + + WorldPacket const* Write() override; + + bool WargameArenas = false; + bool RatedArenas = false; + bool WargameBattlegrounds = false; + bool ArenaSkirmish = false; + bool PugBattlegrounds = false; + bool RatedBattlegrounds = false; + }; + + class RequestBattlefieldStatus final : public ClientPacket + { + public: + RequestBattlefieldStatus(WorldPacket&& packet) : ClientPacket(CMSG_REQUEST_BATTLEFIELD_STATUS, std::move(packet)) { } + + void Read() override { } + }; } } diff --git a/src/server/game/Server/Packets/LFGPackets.cpp b/src/server/game/Server/Packets/LFGPackets.cpp index 4e7bc35b55a..05c714fab9f 100644 --- a/src/server/game/Server/Packets/LFGPackets.cpp +++ b/src/server/game/Server/Packets/LFGPackets.cpp @@ -26,3 +26,13 @@ ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::LFG::RideTicket& ticket) return data; } + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::LFG::RideTicket const& ticket) +{ + data << ticket.RequesterGuid; + data << int32(ticket.Id); + data << int32(ticket.Type); + data << uint32(ticket.Time); + + return data; +} diff --git a/src/server/game/Server/Packets/LFGPackets.h b/src/server/game/Server/Packets/LFGPackets.h index 8c92e671b4b..723ddfd1d84 100644 --- a/src/server/game/Server/Packets/LFGPackets.h +++ b/src/server/game/Server/Packets/LFGPackets.h @@ -35,5 +35,6 @@ namespace WorldPackets } ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::LFG::RideTicket& ticket); +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::LFG::RideTicket const& ticket); #endif // LFGPackets_h__ diff --git a/src/server/game/Server/Packets/NPCPackets.h b/src/server/game/Server/Packets/NPCPackets.h index bb38327c463..a6e265b5d9f 100644 --- a/src/server/game/Server/Packets/NPCPackets.h +++ b/src/server/game/Server/Packets/NPCPackets.h @@ -34,6 +34,7 @@ namespace WorldPackets // CMSG_GOSSIP_HELLO // CMSG_LIST_INVENTORY // CMSG_TRAINER_LIST + // CMSG_BATTLEMASTER_HELLO class Hello final : public ClientPacket { public: diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index dc255d3ac1c..4bd42c94472 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -184,11 +184,11 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_AUTO_EQUIP_ITEM_SLOT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoEquipItemSlot, &WorldSession::HandleAutoEquipItemSlotOpcode); DEFINE_HANDLER(CMSG_AUTO_STORE_BAG_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoStoreBagItem, &WorldSession::HandleAutoStoreBagItemOpcode); DEFINE_HANDLER(CMSG_BANKER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleBankerActivateOpcode); - DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEFIELD_LEAVE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleBattlefieldLeaveOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEFIELD_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlefieldListOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEFIELD_PORT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBattleFieldPortOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEMASTER_HELLO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlemasterHelloOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEMASTER_JOIN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlemasterJoinOpcode ); + DEFINE_HANDLER(CMSG_BATTLEFIELD_LEAVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::BattlefieldLeave, &WorldSession::HandleBattlefieldLeaveOpcode); + DEFINE_HANDLER(CMSG_BATTLEFIELD_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::BattlefieldListRequest, &WorldSession::HandleBattlefieldListOpcode); + DEFINE_HANDLER(CMSG_BATTLEFIELD_PORT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::BattlefieldPort, &WorldSession::HandleBattleFieldPortOpcode); + DEFINE_HANDLER(CMSG_BATTLEMASTER_HELLO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleBattlemasterHelloOpcode); + DEFINE_HANDLER(CMSG_BATTLEMASTER_JOIN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::BattlemasterJoin, &WorldSession::HandleBattlemasterJoinOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEMASTER_JOIN_ARENA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlemasterJoinArena ); DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEMASTER_JOIN_SKIRMISH, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLENET_CHALLENGE_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -392,7 +392,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_GET_GARRISON_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_GET_ITEM_PURCHASE_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::GetItemPurchaseData, &WorldSession::HandleGetItemPurchaseData); DEFINE_OPCODE_HANDLER_OLD(CMSG_GET_MIRROR_IMAGE_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMirrorImageDataRequest ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_GET_PVP_OPTIONS_ENABLED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleGetPVPOptionsEnabled ); + DEFINE_HANDLER(CMSG_GET_PVP_OPTIONS_ENABLED, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Battleground::GetPVPOptionsEnabled, &WorldSession::HandleGetPVPOptionsEnabled); DEFINE_OPCODE_HANDLER_OLD(CMSG_GET_REMAINING_GAME_TIME, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_GET_TROPHY_LIST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::GetUndeleteCharacterCooldownStatus, &WorldSession::HandleGetUndeleteCooldownStatus); @@ -665,7 +665,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_REPOP_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::RepopRequest, &WorldSession::HandleRepopRequest); DEFINE_OPCODE_HANDLER_OLD(CMSG_REPORT_PVP_PLAYER_AFK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleReportPvPAFK ); DEFINE_HANDLER(CMSG_REQUEST_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::ClientConfig::RequestAccountData, &WorldSession::HandleRequestAccountData); - DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_BATTLEFIELD_STATUS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestBattlefieldStatusOpcode); + DEFINE_HANDLER(CMSG_REQUEST_BATTLEFIELD_STATUS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::RequestBattlefieldStatus, &WorldSession::HandleRequestBattlefieldStatusOpcode); DEFINE_HANDLER(CMSG_REQUEST_CATEGORY_COOLDOWNS, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Spells::RequestCategoryCooldowns, &WorldSession::HandleRequestCategoryCooldowns); DEFINE_HANDLER(CMSG_REQUEST_CEMETERY_LIST, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::RequestCemeteryList, &WorldSession::HandleRequestCemeteryList); DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -886,13 +886,13 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUTH_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AVAILABLE_VOICE_CHANNEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BARBER_SHOP_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_LIST, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_PORT_DENIED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_ACTIVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_NONE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_QUEUED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_ACTIVE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_NONE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_QUEUED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_WAIT_FOR_GROUPS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_INFO_THROTTLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_INIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1497,7 +1497,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_PROPOSE_LEVEL_GRANT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_CREDIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_LOG_DATA, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_OPTIONS_ENABLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_OPTIONS_ENABLED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_SEASON, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_BATTLE_PET_NAME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_CREATURE_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index e3c893c6d64..c2c2126c6fc 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -110,6 +110,12 @@ namespace WorldPackets class AreaSpiritHealerQueue; class HearthAndResurrect; class PVPLogDataRequest; + class BattlemasterJoin; + class BattlefieldLeave; + class BattlefieldPort; + class BattlefieldListRequest; + class GetPVPOptionsEnabled; + class RequestBattlefieldStatus; } namespace BlackMarket @@ -740,8 +746,6 @@ class WorldSession void SendAttackStop(Unit const* enemy); - void SendBattleGroundList(ObjectGuid guid, BattlegroundTypeId bgTypeId = BATTLEGROUND_RB); - void SendTradeStatus(WorldPackets::Trade::TradeStatus& status); void SendUpdateTrade(bool trader_data = true); void SendCancelTrade(); @@ -1013,9 +1017,6 @@ class WorldSession void HandleRequestRaidInfoOpcode(WorldPacket& recvData); - void HandleRequestBattlefieldStatusOpcode(WorldPacket& recvData); - void HandleBattleMasterHelloOpcode(WorldPacket& recvData); - void HandleGroupInviteOpcode(WorldPacket& recvPacket); //void HandleGroupCancelOpcode(WorldPacket& recvPacket); void HandleGroupInviteResponseOpcode(WorldPacket& recvPacket); @@ -1273,21 +1274,22 @@ class WorldSession void HandleDismissCritter(WorldPacket& recvData); //Battleground - void HandleBattlemasterHelloOpcode(WorldPacket& recvData); - void HandleBattlemasterJoinOpcode(WorldPacket& recvData); + void HandleBattlemasterHelloOpcode(WorldPackets::NPC::Hello& hello); + void HandleBattlemasterJoinOpcode(WorldPackets::Battleground::BattlemasterJoin& battlemasterJoin); void HandleBattlegroundPlayerPositionsOpcode(WorldPacket& recvData); void HandlePVPLogDataOpcode(WorldPackets::Battleground::PVPLogDataRequest& pvpLogDataRequest); - void HandleBattleFieldPortOpcode(WorldPacket& recvData); - void HandleBattlefieldListOpcode(WorldPacket& recvData); - void HandleBattlefieldLeaveOpcode(WorldPacket& recvData); + void HandleBattleFieldPortOpcode(WorldPackets::Battleground::BattlefieldPort& battlefieldPort); + void HandleBattlefieldListOpcode(WorldPackets::Battleground::BattlefieldListRequest& battlefieldList); + void HandleBattlefieldLeaveOpcode(WorldPackets::Battleground::BattlefieldLeave& battlefieldLeave); void HandleBattlemasterJoinArena(WorldPacket& recvData); void HandleReportPvPAFK(WorldPacket& recvData); void HandleRequestRatedBattlefieldInfo(WorldPacket& recvData); - void HandleGetPVPOptionsEnabled(WorldPacket& recvData); + void HandleGetPVPOptionsEnabled(WorldPackets::Battleground::GetPVPOptionsEnabled& getPvPOptionsEnabled); void HandleRequestPvpReward(WorldPacket& recvData); void HandleAreaSpiritHealerQueryOpcode(WorldPackets::Battleground::AreaSpiritHealerQuery& areaSpiritHealerQuery); void HandleAreaSpiritHealerQueueOpcode(WorldPackets::Battleground::AreaSpiritHealerQueue& areaSpiritHealerQueue); void HandleHearthAndResurrect(WorldPackets::Battleground::HearthAndResurrect& hearthAndResurrect); + void HandleRequestBattlefieldStatusOpcode(WorldPackets::Battleground::RequestBattlefieldStatus& requestBattlefieldStatus); // Battlefield void SendBfInvitePlayerToWar(ObjectGuid guid, uint32 zoneId, uint32 time); |