Core/PacketIO: Updated and enabled some battleground packets

This commit is contained in:
Shauren
2015-04-17 00:06:24 +02:00
parent 5c3d8c1e87
commit 280a0b8e35
18 changed files with 571 additions and 626 deletions
+17 -17
View File
@@ -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
+3 -3
View File
@@ -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 */
+67 -357
View File
@@ -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;
if (bg)
;//bgGuid = bg->GetGUID();
else
StatusID = STATUS_NONE;
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;
}
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;
}
void BattlegroundMgr::BuildStatusFailedPacket(WorldPacket* data, Battleground* bg, Player* player, uint8 QueueSlot, GroupJoinBattlegroundResult result)
void BattlegroundMgr::BuildBattlegroundStatusNone(WorldPackets::Battleground::BattlefieldStatusNone* battlefieldStatus, Player* player, uint32 ticketId, uint32 joinTime, uint32 arenaType)
{
ObjectGuid guidBytes1 = player->GetGUID(); // player who caused the error
ObjectGuid guidBytes2;// = bg->GetGUID();
ObjectGuid unkGuid3;
battlefieldStatus->Ticket.RequesterGuid = player->GetGUID();
battlefieldStatus->Ticket.Id = ticketId;
battlefieldStatus->Ticket.Type = arenaType;
battlefieldStatus->Ticket.Time = joinTime;
}
data->Initialize(SMSG_BATTLEFIELD_STATUS_FAILED);
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;
}
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]);
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();
}
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]);
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);
}
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]);
void BattlegroundMgr::BuildBattlegroundStatusFailed(WorldPackets::Battleground::BattlefieldStatusFailed* battlefieldStatus, Battleground* bg, Player* pPlayer, uint32 ticketId, uint32 arenaType, GroupJoinBattlegroundResult result, ObjectGuid const* errorGuid /*= nullptr*/)
{
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)
@@ -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);
@@ -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());
}
}
+16 -2
View File
@@ -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;
}
}
+3 -14
View File
@@ -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];
+4 -1
View File
@@ -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)
+1 -1
View File
@@ -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);
+101 -187
View File
@@ -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*/)
@@ -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
@@ -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;
}
@@ -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 { }
};
}
}
@@ -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;
}
@@ -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__
@@ -34,6 +34,7 @@ namespace WorldPackets
// CMSG_GOSSIP_HELLO
// CMSG_LIST_INVENTORY
// CMSG_TRAINER_LIST
// CMSG_BATTLEMASTER_HELLO
class Hello final : public ClientPacket
{
public:
+14 -14
View File
@@ -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);
+13 -11
View File
@@ -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);