diff options
| author | Shauren <shauren.trinity@gmail.com> | 2015-04-17 00:06:24 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2015-04-17 00:06:24 +0200 |
| commit | 280a0b8e35ccf2fde55199938dffb2851892eaa2 (patch) | |
| tree | 8a9a1541b4c592cac569910a3d4ca875057df7ec /src/server/game/Handlers/BattleGroundHandler.cpp | |
| parent | 5c3d8c1e8788909181e7a5ded1592dae767d4807 (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.cpp | 288 |
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*/) |
