aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/BattleGroundHandler.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2015-04-17 00:06:24 +0200
committerShauren <shauren.trinity@gmail.com>2015-04-17 00:06:24 +0200
commit280a0b8e35ccf2fde55199938dffb2851892eaa2 (patch)
tree8a9a1541b4c592cac569910a3d4ca875057df7ec /src/server/game/Handlers/BattleGroundHandler.cpp
parent5c3d8c1e8788909181e7a5ded1592dae767d4807 (diff)
Core/PacketIO: Updated and enabled some battleground packets
Diffstat (limited to 'src/server/game/Handlers/BattleGroundHandler.cpp')
-rw-r--r--src/server/game/Handlers/BattleGroundHandler.cpp288
1 files changed, 101 insertions, 187 deletions
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*/)