aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp34
-rw-r--r--src/server/game/Battlegrounds/Battleground.h6
-rw-r--r--src/server/game/Battlegrounds/BattlegroundMgr.cpp428
-rw-r--r--src/server/game/Battlegrounds/BattlegroundMgr.h24
-rw-r--r--src/server/game/Battlegrounds/BattlegroundQueue.cpp28
-rw-r--r--src/server/game/Entities/Player/Player.cpp18
-rw-r--r--src/server/game/Entities/Player/Player.h17
-rw-r--r--src/server/game/Groups/Group.cpp5
-rw-r--r--src/server/game/Groups/Group.h2
-rw-r--r--src/server/game/Handlers/BattleGroundHandler.cpp288
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h6
-rw-r--r--src/server/game/Server/Packets/BattlegroundPackets.cpp111
-rw-r--r--src/server/game/Server/Packets/BattlegroundPackets.h170
-rw-r--r--src/server/game/Server/Packets/LFGPackets.cpp10
-rw-r--r--src/server/game/Server/Packets/LFGPackets.h1
-rw-r--r--src/server/game/Server/Packets/NPCPackets.h1
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp28
-rw-r--r--src/server/game/Server/WorldSession.h24
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);