diff options
Diffstat (limited to 'src/server/game/Handlers/LFGHandler.cpp')
-rw-r--r-- | src/server/game/Handlers/LFGHandler.cpp | 786 |
1 files changed, 228 insertions, 558 deletions
diff --git a/src/server/game/Handlers/LFGHandler.cpp b/src/server/game/Handlers/LFGHandler.cpp index a368a9a1b7e..24b0aa0bb19 100644 --- a/src/server/game/Handlers/LFGHandler.cpp +++ b/src/server/game/Handlers/LFGHandler.cpp @@ -18,213 +18,62 @@ #include "WorldSession.h" #include "Group.h" #include "LFGMgr.h" +#include "LFGPackets.h" #include "Log.h" #include "ObjectAccessor.h" #include "ObjectMgr.h" #include "Opcodes.h" #include "Player.h" +#include "World.h" #include "WorldPacket.h" -void BuildPlayerLockDungeonBlock(WorldPacket& data, lfg::LfgLockMap const& lock) -{ - data << uint32(lock.size()); // Size of lock dungeons - for (lfg::LfgLockMap::const_iterator it = lock.begin(); it != lock.end(); ++it) - { - TC_LOG_TRACE("lfg", "BuildPlayerLockDungeonBlock:: DungeonID: %u Lock status: %u Required itemLevel: %u Current itemLevel: %f", - (it->first & 0x00FFFFFF), it->second.lockStatus, it->second.requiredItemLevel, it->second.currentItemLevel); - - data << uint32(it->first); // Dungeon entry (id + type) - data << uint32(it->second.lockStatus); // Lock status - data << uint32(it->second.requiredItemLevel); // Required itemLevel - data << uint32(it->second.currentItemLevel); // Current itemLevel - } -} - -void BuildPartyLockDungeonBlock(WorldPacket& data, lfg::LfgLockPartyMap const& lockMap) -{ - data << uint8(lockMap.size()); - for (lfg::LfgLockPartyMap::const_iterator it = lockMap.begin(); it != lockMap.end(); ++it) - { - data << it->first; // Player guid - BuildPlayerLockDungeonBlock(data, it->second); - } -} - -void BuildQuestReward(WorldPacket& data, Quest const* quest, Player* player) -{ - uint8 rewCount = quest->GetRewItemsCount() + quest->GetRewCurrencyCount(); - - data << uint32(player->GetQuestMoneyReward(quest)); - data << uint32(player->GetQuestXPReward(quest)); - data << uint8(rewCount); - if (rewCount) - { - for (uint8 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i) - { - if (uint32 currencyId = quest->RewardCurrencyId[i]) - { - data << uint32(currencyId); - data << uint32(0); - data << uint32(quest->RewardCurrencyCount[i]); - data << uint8(1); // Is currency - } - } - - for (uint8 i = 0; i < QUEST_REWARD_ITEM_COUNT; ++i) - { - if (uint32 itemId = quest->RewardItemId[i]) - { - //ItemTemplate const* item = sObjectMgr->GetItemTemplate(itemId); - data << uint32(itemId); - data << uint32(/*item ? item->DisplayInfoID :*/ 0); - data << uint32(quest->RewardItemCount[i]); - data << uint8(0); // Is currency - } - } - } -} - -void WorldSession::HandleLfgJoinOpcode(WorldPacket& recvData) +void WorldSession::HandleLfgJoinOpcode(WorldPackets::LFG::DFJoin& dfJoin) { if (!sLFGMgr->isOptionEnabled(lfg::LFG_OPTION_ENABLE_DUNGEON_FINDER | lfg::LFG_OPTION_ENABLE_RAID_BROWSER) || (GetPlayer()->GetGroup() && GetPlayer()->GetGroup()->GetLeaderGUID() != GetPlayer()->GetGUID() && (GetPlayer()->GetGroup()->GetMembersCount() == MAX_GROUP_SIZE || !GetPlayer()->GetGroup()->isLFGGroup()))) - { - recvData.rfinish(); return; - } - - uint32 roles; - - recvData >> roles; - for (int32 i = 0; i < 3; ++i) - recvData.read_skip<uint32>(); - uint32 commentLen = recvData.ReadBits(9); - uint32 numDungeons = recvData.ReadBits(24); - - if (!numDungeons) + if (dfJoin.Slots.empty()) { TC_LOG_DEBUG("lfg", "CMSG_DF_JOIN %s no dungeons selected", GetPlayerInfo().c_str()); - recvData.rfinish(); return; } - std::string comment = recvData.ReadString(commentLen); - lfg::LfgDungeonSet newDungeons; - for (uint32 i = 0; i < numDungeons; ++i) + for (uint32 slot : dfJoin.Slots) { - uint32 dungeon; - recvData >> dungeon; - dungeon &= 0x00FFFFFF; // remove the type from the dungeon entry - if (dungeon) + uint32 dungeon = slot & 0x00FFFFFF; + if (sLfgDungeonsStore.LookupEntry(dungeon)) newDungeons.insert(dungeon); } - TC_LOG_DEBUG("lfg", "CMSG_DF_JOIN %s roles: %u, Dungeons: %u, Comment: %s", - GetPlayerInfo().c_str(), roles, uint8(newDungeons.size()), comment.c_str()); + TC_LOG_DEBUG("lfg", "CMSG_DF_JOIN %s roles: %u, Dungeons: %u", GetPlayerInfo().c_str(), dfJoin.Roles, uint8(newDungeons.size())); - sLFGMgr->JoinLfg(GetPlayer(), uint8(roles), newDungeons); + sLFGMgr->JoinLfg(GetPlayer(), uint8(dfJoin.Roles), newDungeons); } -void WorldSession::HandleLfgLeaveOpcode(WorldPacket& recvData) +void WorldSession::HandleLfgLeaveOpcode(WorldPackets::LFG::DFLeave& dfLeave) { - ObjectGuid leaveGuid; Group* group = GetPlayer()->GetGroup(); - ObjectGuid guid = GetPlayer()->GetGUID(); - ObjectGuid gguid = group ? group->GetGUID() : guid; - - recvData.read_skip<uint32>(); // Always 8 - recvData.read_skip<uint32>(); // Join date - recvData.read_skip<uint32>(); // Always 3 - recvData.read_skip<uint32>(); // Queue Id - - leaveGuid[4] = recvData.ReadBit(); - leaveGuid[5] = recvData.ReadBit(); - leaveGuid[0] = recvData.ReadBit(); - leaveGuid[6] = recvData.ReadBit(); - leaveGuid[2] = recvData.ReadBit(); - leaveGuid[7] = recvData.ReadBit(); - leaveGuid[1] = recvData.ReadBit(); - leaveGuid[3] = recvData.ReadBit(); - - recvData.ReadByteSeq(leaveGuid[7]); - recvData.ReadByteSeq(leaveGuid[4]); - recvData.ReadByteSeq(leaveGuid[3]); - recvData.ReadByteSeq(leaveGuid[2]); - recvData.ReadByteSeq(leaveGuid[6]); - recvData.ReadByteSeq(leaveGuid[0]); - recvData.ReadByteSeq(leaveGuid[1]); - recvData.ReadByteSeq(leaveGuid[5]); TC_LOG_DEBUG("lfg", "CMSG_DF_LEAVE %s in group: %u sent guid %s.", - GetPlayerInfo().c_str(), group ? 1 : 0, leaveGuid.ToString().c_str()); + GetPlayerInfo().c_str(), group ? 1 : 0, dfLeave.Ticket.RequesterGuid.ToString().c_str()); // Check cheating - only leader can leave the queue - if (!group || group->GetLeaderGUID() == guid) - sLFGMgr->LeaveLfg(gguid); + if (!group || group->GetLeaderGUID() == dfLeave.Ticket.RequesterGuid) + sLFGMgr->LeaveLfg(dfLeave.Ticket.RequesterGuid); } -void WorldSession::HandleLfgProposalResultOpcode(WorldPacket& recvData) +void WorldSession::HandleLfgProposalResultOpcode(WorldPackets::LFG::DFProposalResponse& dfProposalResponse) { - uint32 proposalID; // Proposal ID - bool accept; - - ObjectGuid guid1; - ObjectGuid guid2; - - recvData >> proposalID; - recvData.read_skip<uint32>(); - recvData.read_skip<uint32>(); - recvData.read_skip<uint32>(); - - guid2[4] = recvData.ReadBit(); - guid2[5] = recvData.ReadBit(); - guid2[0] = recvData.ReadBit(); - guid2[6] = recvData.ReadBit(); - guid2[2] = recvData.ReadBit(); - guid2[7] = recvData.ReadBit(); - guid2[1] = recvData.ReadBit(); - guid2[3] = recvData.ReadBit(); - - recvData.ReadByteSeq(guid2[7]); - recvData.ReadByteSeq(guid2[4]); - recvData.ReadByteSeq(guid2[3]); - recvData.ReadByteSeq(guid2[2]); - recvData.ReadByteSeq(guid2[6]); - recvData.ReadByteSeq(guid2[0]); - recvData.ReadByteSeq(guid2[1]); - recvData.ReadByteSeq(guid2[5]); - - guid1[7] = recvData.ReadBit(); - accept = recvData.ReadBit(); - guid1[1] = recvData.ReadBit(); - guid1[3] = recvData.ReadBit(); - guid1[0] = recvData.ReadBit(); - guid1[5] = recvData.ReadBit(); - guid1[4] = recvData.ReadBit(); - guid1[6] = recvData.ReadBit(); - guid1[2] = recvData.ReadBit(); - - recvData.ReadByteSeq(guid1[7]); - recvData.ReadByteSeq(guid1[1]); - recvData.ReadByteSeq(guid1[5]); - recvData.ReadByteSeq(guid1[6]); - recvData.ReadByteSeq(guid1[3]); - recvData.ReadByteSeq(guid1[4]); - recvData.ReadByteSeq(guid1[0]); - recvData.ReadByteSeq(guid1[2]); - TC_LOG_DEBUG("lfg", "CMSG_LFG_PROPOSAL_RESULT %s proposal: %u accept: %u", - GetPlayerInfo().c_str(), proposalID, accept ? 1 : 0); - sLFGMgr->UpdateProposal(proposalID, GetPlayer()->GetGUID(), accept); + GetPlayerInfo().c_str(), dfProposalResponse.ProposalID, dfProposalResponse.Accepted ? 1 : 0); + sLFGMgr->UpdateProposal(dfProposalResponse.ProposalID, GetPlayer()->GetGUID(), dfProposalResponse.Accepted); } -void WorldSession::HandleLfgSetRolesOpcode(WorldPacket& recvData) +void WorldSession::HandleLfgSetRolesOpcode(WorldPackets::LFG::DFSetRoles& dfSetRoles) { - uint8 roles; - recvData >> roles; // Player Group Roles ObjectGuid guid = GetPlayer()->GetGUID(); Group* group = GetPlayer()->GetGroup(); if (!group) @@ -235,112 +84,120 @@ void WorldSession::HandleLfgSetRolesOpcode(WorldPacket& recvData) } ObjectGuid gguid = group->GetGUID(); TC_LOG_DEBUG("lfg", "CMSG_DF_SET_ROLES: Group %s, Player %s, Roles: %u", - gguid.ToString().c_str(), GetPlayerInfo().c_str(), roles); - sLFGMgr->UpdateRoleCheck(gguid, guid, roles); + gguid.ToString().c_str(), GetPlayerInfo().c_str(), dfSetRoles.RolesDesired); + sLFGMgr->UpdateRoleCheck(gguid, guid, dfSetRoles.RolesDesired); } -void WorldSession::HandleLfgSetBootVoteOpcode(WorldPacket& recvData) +void WorldSession::HandleLfgSetBootVoteOpcode(WorldPackets::LFG::DFBootPlayerVote& dfBootPlayerVote) { - bool agree; // Agree to kick player - recvData >> agree; - ObjectGuid guid = GetPlayer()->GetGUID(); TC_LOG_DEBUG("lfg", "CMSG_LFG_SET_BOOT_VOTE %s agree: %u", - GetPlayerInfo().c_str(), agree ? 1 : 0); - sLFGMgr->UpdateBoot(guid, agree); + GetPlayerInfo().c_str(), dfBootPlayerVote.Vote ? 1 : 0); + sLFGMgr->UpdateBoot(guid, dfBootPlayerVote.Vote); } -void WorldSession::HandleLfgTeleportOpcode(WorldPacket& recvData) +void WorldSession::HandleLfgTeleportOpcode(WorldPackets::LFG::DFTeleport& dfTeleport) { - bool out; - recvData >> out; - TC_LOG_DEBUG("lfg", "CMSG_DF_TELEPORT %s out: %u", - GetPlayerInfo().c_str(), out ? 1 : 0); - sLFGMgr->TeleportPlayer(GetPlayer(), out, true); + GetPlayerInfo().c_str(), dfTeleport.TeleportOut ? 1 : 0); + sLFGMgr->TeleportPlayer(GetPlayer(), dfTeleport.TeleportOut, true); } -void WorldSession::HandleDFGetSystemInfo(WorldPacket& recvData) +void WorldSession::HandleDFGetSystemInfo(WorldPackets::LFG::DFGetSystemInfo& dfGetSystemInfo) { - bool forPlayer = recvData.ReadBit(); - TC_LOG_DEBUG("lfg", "CMSG_DF_GET_SYSTEM_INFO %s for %s", GetPlayerInfo().c_str(), (forPlayer ? "player" : "party")); + TC_LOG_DEBUG("lfg", "CMSG_DF_GET_SYSTEM_INFO %s for %s", GetPlayerInfo().c_str(), (dfGetSystemInfo.Player ? "player" : "party")); - if (forPlayer) + if (dfGetSystemInfo.Player) SendLfgPlayerLockInfo(); else SendLfgPartyLockInfo(); } -void WorldSession::SendLfgPlayerLockInfo() +void WorldSession::HandleDFGetJoinStatus(WorldPackets::LFG::DFGetJoinStatus& /*dfGetJoinStatus*/) { + TC_LOG_DEBUG("lfg", "CMSG_DF_GET_JOIN_STATUS %s", GetPlayerInfo().c_str()); + + if (!GetPlayer()->isUsingLfg()) + return; + ObjectGuid guid = GetPlayer()->GetGUID(); + lfg::LfgUpdateData updateData = sLFGMgr->GetLfgStatus(guid); + + if (GetPlayer()->GetGroup()) + { + SendLfgUpdateStatus(updateData, true); + updateData.dungeons.clear(); + SendLfgUpdateStatus(updateData, false); + } + else + { + SendLfgUpdateStatus(updateData, false); + updateData.dungeons.clear(); + SendLfgUpdateStatus(updateData, true); + } +} + +void WorldSession::SendLfgPlayerLockInfo() +{ + TC_LOG_DEBUG("lfg", "SMSG_LFG_PLAYER_INFO %s", GetPlayerInfo().c_str()); // Get Random dungeons that can be done at a certain level and expansion uint8 level = GetPlayer()->getLevel(); - lfg::LfgDungeonSet const& randomDungeons = - sLFGMgr->GetRandomAndSeasonalDungeons(level, GetExpansion()); + lfg::LfgDungeonSet const& randomDungeons = sLFGMgr->GetRandomAndSeasonalDungeons(level, GetExpansion()); - // Get player locked Dungeons - lfg::LfgLockMap const& lock = sLFGMgr->GetLockedDungeons(guid); - uint32 rsize = uint32(randomDungeons.size()); - uint32 lsize = uint32(lock.size()); + WorldPackets::LFG::LfgPlayerInfo lfgPlayerInfo; - TC_LOG_DEBUG("lfg", "SMSG_LFG_PLAYER_INFO %s", GetPlayerInfo().c_str()); - WorldPacket data(SMSG_LFG_PLAYER_INFO, 1 + rsize * (4 + 1 + 4 + 4 + 4 + 4 + 1 + 4 + 4 + 4) + 4 + lsize * (1 + 4 + 4 + 4 + 4 + 1 + 4 + 4 + 4)); + // Get player locked Dungeons + for (auto const& lock : sLFGMgr->GetLockedDungeons(_player->GetGUID())) + lfgPlayerInfo.BlackList.Slot.emplace_back(lock.first, lock.second.lockStatus, lock.second.requiredItemLevel, lock.second.currentItemLevel); - data << uint8(randomDungeons.size()); // Random Dungeon count - for (lfg::LfgDungeonSet::const_iterator it = randomDungeons.begin(); it != randomDungeons.end(); ++it) + for (uint32 slot : randomDungeons) { - data << uint32(*it); // Dungeon Entry (id + type) - lfg::LfgReward const* reward = sLFGMgr->GetRandomDungeonReward(*it, level); - Quest const* quest = NULL; + lfgPlayerInfo.Dungeon.emplace_back(); + WorldPackets::LFG::LfgPlayerDungeonInfo& playerDungeonInfo = lfgPlayerInfo.Dungeon.back(); + playerDungeonInfo.Slot = slot; + playerDungeonInfo.CompletionQuantity = 1; + playerDungeonInfo.CompletionLimit = 1; + playerDungeonInfo.CompletionCurrencyID = 0; + playerDungeonInfo.SpecificQuantity = 0; + playerDungeonInfo.SpecificLimit = 1; + playerDungeonInfo.OverallQuantity = 0; + playerDungeonInfo.OverallLimit = 1; + playerDungeonInfo.PurseWeeklyQuantity = 0; + playerDungeonInfo.PurseWeeklyLimit = 0; + playerDungeonInfo.PurseQuantity = 0; + playerDungeonInfo.PurseLimit = 0; + playerDungeonInfo.Quantity = 1; + playerDungeonInfo.CompletedMask = 0; + playerDungeonInfo.EncounterMask = 0; + + Quest const* quest = nullptr; bool done = false; - if (reward) + if (lfg::LfgReward const* reward = sLFGMgr->GetRandomDungeonReward(slot, level)) { - quest = sObjectMgr->GetQuestTemplate(reward->firstQuest); - if (quest) + if (Quest const* quest = sObjectMgr->GetQuestTemplate(reward->firstQuest)) { - done = !GetPlayer()->CanRewardQuest(quest, false); - if (done) + playerDungeonInfo.FirstReward = !GetPlayer()->CanRewardQuest(quest, false); + if (!playerDungeonInfo.FirstReward) quest = sObjectMgr->GetQuestTemplate(reward->otherQuest); - } - } - - data << uint8(done); - data << uint32(0); // currencyQuantity - data << uint32(0); // some sort of overall cap/weekly cap - data << uint32(0); // currencyID - data << uint32(0); // tier1Quantity - data << uint32(0); // tier1Limit - data << uint32(0); // overallQuantity - data << uint32(0); // overallLimit - data << uint32(0); // periodPurseQuantity - data << uint32(0); // periodPurseLimit - data << uint32(0); // purseQuantity - data << uint32(0); // purseLimit - data << uint32(0); // some sort of reward for completion - data << uint32(0); // completedEncounters - data << uint8(0); // Call to Arms eligible - - for (uint32 i = 0; i < 3; ++i) - { - data << uint32(0); // Call to Arms Role - //if (role) - // BuildQuestReward(data, ctaRoleQuest, GetPlayer()); - } - if (quest) - BuildQuestReward(data, quest, GetPlayer()); - else - { - data << uint32(0); // Money - data << uint32(0); // XP - data << uint8(0); // Reward count + if (quest) + { + playerDungeonInfo.Rewards.RewardMoney = _player->GetQuestMoneyReward(quest); + playerDungeonInfo.Rewards.RewardXP = _player->GetQuestXPReward(quest); + for (uint8 i = 0; i < QUEST_REWARD_ITEM_COUNT; ++i) + if (uint32 itemId = quest->RewardItemId[i]) + playerDungeonInfo.Rewards.Item.emplace_back(itemId, quest->RewardItemCount[i]); + + for (uint32 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i) + if (uint32 curencyId = quest->RewardCurrencyId[i]) + playerDungeonInfo.Rewards.Currency.emplace_back(curencyId, quest->RewardCurrencyCount[i]); + } + } } } - BuildPlayerLockDungeonBlock(data, lock); - SendPacket(&data); + SendPacket(lfgPlayerInfo.Write());; } void WorldSession::SendLfgPartyLockInfo() @@ -350,9 +207,10 @@ void WorldSession::SendLfgPartyLockInfo() if (!group) return; + WorldPackets::LFG::LfgPartyInfo lfgPartyInfo; + // Get the locked dungeons of the other party members - lfg::LfgLockPartyMap lockMap; - for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) + for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) { Player* plrg = itr->GetSource(); if (!plrg) @@ -362,51 +220,22 @@ void WorldSession::SendLfgPartyLockInfo() if (pguid == guid) continue; - lockMap[pguid] = sLFGMgr->GetLockedDungeons(pguid); + lfgPartyInfo.Player.emplace_back(); + WorldPackets::LFG::LFGBlackList& lfgBlackList = lfgPartyInfo.Player.back(); + lfgBlackList.PlayerGuid = pguid; + for (auto const& lock : sLFGMgr->GetLockedDungeons(pguid)) + lfgBlackList.Slot.emplace_back(lock.first, lock.second.lockStatus, lock.second.requiredItemLevel, lock.second.currentItemLevel); } - uint32 size = 0; - for (lfg::LfgLockPartyMap::const_iterator it = lockMap.begin(); it != lockMap.end(); ++it) - size += 8 + 4 + uint32(it->second.size()) * (4 + 4 + 4 + 4); - TC_LOG_DEBUG("lfg", "SMSG_LFG_PARTY_INFO %s", GetPlayerInfo().c_str()); - WorldPacket data(SMSG_LFG_PARTY_INFO, 1 + size); - BuildPartyLockDungeonBlock(data, lockMap); - SendPacket(&data); -} - -void WorldSession::HandleDFGetJoinStatus(WorldPacket& /*recvData*/) -{ - TC_LOG_DEBUG("lfg", "CMSG_DF_GET_JOIN_STATUS %s", GetPlayerInfo().c_str()); - - if (!GetPlayer()->isUsingLfg()) - return; - - ObjectGuid guid = GetPlayer()->GetGUID(); - lfg::LfgUpdateData updateData = sLFGMgr->GetLfgStatus(guid); - - if (GetPlayer()->GetGroup()) - { - SendLfgUpdateStatus(updateData, true); - updateData.dungeons.clear(); - SendLfgUpdateStatus(updateData, false); - } - else - { - SendLfgUpdateStatus(updateData, false); - updateData.dungeons.clear(); - SendLfgUpdateStatus(updateData, true); - } + SendPacket(lfgPartyInfo.Write());; } void WorldSession::SendLfgUpdateStatus(lfg::LfgUpdateData const& updateData, bool party) { bool join = false; bool queued = false; - uint8 size = uint8(updateData.dungeons.size()); ObjectGuid guid = _player->GetGUID(); - time_t joinTime = sLFGMgr->GetQueueJoinTime(_player->GetGUID()); - uint32 queueId = sLFGMgr->GetQueueId(_player->GetGUID()); switch (updateData.updateType) { @@ -432,40 +261,25 @@ void WorldSession::SendLfgUpdateStatus(lfg::LfgUpdateData const& updateData, boo TC_LOG_DEBUG("lfg", "SMSG_LFG_UPDATE_STATUS %s updatetype: %u, party %s", GetPlayerInfo().c_str(), updateData.updateType, party ? "true" : "false"); - WorldPacket data(SMSG_LFG_UPDATE_STATUS, 1 + 8 + 3 + 2 + 1 + 4 + 4 + 1 + 1 + 1 + 4 + size); - data.WriteBit(guid[1] != 0); - data.WriteBit(party); - data.WriteBits(size, 24); - data.WriteBit(guid[6] != 0); - data.WriteBit(size > 0); // Extra info - data.WriteBit(guid[4] != 0); - data.WriteBit(guid[7] != 0); - data.WriteBit(guid[2] != 0); - data.WriteBit(join); // LFG Join - data.WriteBit(guid[0] != 0); - data.WriteBit(guid[3] != 0); - data.WriteBit(guid[5] != 0); - data.WriteBit(queued); // Join the queue - - data << uint8(updateData.updateType); // Lfg Update type - data << uint32(queueId); // Queue Id - data << uint32(joinTime); // Join date - data.WriteByteSeq(guid[6]); - for (uint8 i = 0; i < 3; ++i) - data << uint8(0); // unk - Always 0 - - data.WriteByteSeq(guid[1]); - data.WriteByteSeq(guid[2]); - data.WriteByteSeq(guid[4]); - data.WriteByteSeq(guid[3]); - data.WriteByteSeq(guid[5]); - data.WriteByteSeq(guid[0]); - data << uint32(3); - data.WriteByteSeq(guid[7]); - for (lfg::LfgDungeonSet::const_iterator it = updateData.dungeons.begin(); it != updateData.dungeons.end(); ++it) - data << uint32(*it); - - SendPacket(&data); + WorldPackets::LFG::LFGUpdateStatus lfgUpdateStatus; + if (WorldPackets::LFG::RideTicket const* ticket = sLFGMgr->GetTicket(_player->GetGUID())) + lfgUpdateStatus.Ticket = *ticket; + + lfgUpdateStatus.SubType = lfg::LFG_QUEUE_DUNGEON; // other types not implemented + lfgUpdateStatus.Reason = updateData.updateType; + std::transform(updateData.dungeons.begin(), updateData.dungeons.end(), std::back_inserter(lfgUpdateStatus.Slots), [](uint32 dungeonId) + { + return sLFGMgr->GetLFGDungeonEntry(dungeonId); + }); + lfgUpdateStatus.RequestedRoles = sLFGMgr->GetRoles(_player->GetGUID()); + //lfgUpdateStatus.SuspendedPlayers; + lfgUpdateStatus.IsParty = party; + lfgUpdateStatus.NotifyUI = true; + lfgUpdateStatus.Joined = join; + lfgUpdateStatus.LfgJoined = updateData.updateType != lfg::LFG_UPDATETYPE_REMOVED_FROM_QUEUE; + lfgUpdateStatus.Queued = queued; + + SendPacket(lfgUpdateStatus.Write()); } void WorldSession::SendLfgRoleChosen(ObjectGuid guid, uint8 roles) @@ -473,11 +287,11 @@ void WorldSession::SendLfgRoleChosen(ObjectGuid guid, uint8 roles) TC_LOG_DEBUG("lfg", "SMSG_LFG_ROLE_CHOSEN %s guid: %s roles: %u", GetPlayerInfo().c_str(), guid.ToString().c_str(), roles); - WorldPacket data(SMSG_ROLE_CHOSEN, 8 + 1 + 4); - data << guid; // Guid - data << uint8(roles > 0); // Ready - data << uint32(roles); // Roles - SendPacket(&data); + WorldPackets::LFG::RoleChosen roleChosen; + roleChosen.Player = guid; + roleChosen.RoleMask = roles; + roleChosen.Accepted = roles > 0; + SendPacket(roleChosen.Write()); } void WorldSession::SendLfgRoleCheckUpdate(lfg::LfgRoleCheck const& roleCheck) @@ -489,118 +303,63 @@ void WorldSession::SendLfgRoleCheckUpdate(lfg::LfgRoleCheck const& roleCheck) dungeons = roleCheck.dungeons; TC_LOG_DEBUG("lfg", "SMSG_LFG_ROLE_CHECK_UPDATE %s", GetPlayerInfo().c_str()); - WorldPacket data(SMSG_LFG_ROLE_CHECK_UPDATE, 4 + 1 + 1 + dungeons.size() * 4 + 1 + roleCheck.roles.size() * (8 + 1 + 4 + 1)); - - data << uint32(roleCheck.state); // Check result - data << uint8(roleCheck.state == lfg::LFG_ROLECHECK_INITIALITING); - data << uint8(dungeons.size()); // Number of dungeons - if (!dungeons.empty()) - for (lfg::LfgDungeonSet::iterator it = dungeons.begin(); it != dungeons.end(); ++it) - data << uint32(sLFGMgr->GetLFGDungeonEntry(*it)); // Dungeon - - data << uint8(roleCheck.roles.size()); // Players in group + WorldPackets::LFG::LFGRoleCheckUpdate lfgRoleCheckUpdate; + lfgRoleCheckUpdate.PartyIndex = 127; + lfgRoleCheckUpdate.RoleCheckStatus = roleCheck.state; + std::transform(dungeons.begin(), dungeons.end(), std::back_inserter(lfgRoleCheckUpdate.JoinSlots), [](uint32 dungeonId) + { + return sLFGMgr->GetLFGDungeonEntry(dungeonId); + }); + lfgRoleCheckUpdate.BgQueueID = 0; + lfgRoleCheckUpdate.GroupFinderActivityID = 0; if (!roleCheck.roles.empty()) { // Leader info MUST be sent 1st :S - ObjectGuid guid = roleCheck.leader; - uint8 roles = roleCheck.roles.find(guid)->second; - Player* player = ObjectAccessor::FindConnectedPlayer(guid); - data << guid; // Guid - data << uint8(roles > 0); // Ready - data << uint32(roles); // Roles - data << uint8(player ? player->getLevel() : 0); // Level + uint8 roles = roleCheck.roles.find(roleCheck.leader)->second; + lfgRoleCheckUpdate.Members.emplace_back(roleCheck.leader, roles, ASSERT_NOTNULL(sWorld->GetCharacterInfo(roleCheck.leader))->Level, roles > 0); for (lfg::LfgRolesMap::const_iterator it = roleCheck.roles.begin(); it != roleCheck.roles.end(); ++it) { if (it->first == roleCheck.leader) continue; - guid = it->first; roles = it->second; - player = ObjectAccessor::FindConnectedPlayer(guid); - data << guid; // Guid - data << uint8(roles > 0); // Ready - data << uint32(roles); // Roles - data << uint8(player ? player->getLevel() : 0);// Level + lfgRoleCheckUpdate.Members.emplace_back(it->first, roles, ASSERT_NOTNULL(sWorld->GetCharacterInfo(it->first))->Level, roles > 0); } } - SendPacket(&data); + + SendPacket(lfgRoleCheckUpdate.Write()); } void WorldSession::SendLfgJoinResult(lfg::LfgJoinResultData const& joinData) { - uint32 size = 0; - ObjectGuid guid = GetPlayer()->GetGUID(); - uint32 queueId = sLFGMgr->GetQueueId(_player->GetGUID()); - for (lfg::LfgLockPartyMap::const_iterator it = joinData.lockmap.begin(); it != joinData.lockmap.end(); ++it) - size += 8 + 4 + uint32(it->second.size()) * (4 + 4 + 4 + 4); - TC_LOG_DEBUG("lfg", "SMSG_LFG_JOIN_RESULT %s checkResult: %u checkValue: %u", GetPlayerInfo().c_str(), joinData.result, joinData.state); - WorldPacket data(SMSG_LFG_JOIN_RESULT, 4 + 4 + size); - data << uint32(3); - data << uint8(joinData.result); // Check Result - data << uint32(queueId); // Queue Id - data << uint8(joinData.state); // Check Value - data << uint32(time(NULL)); // Join date - data.WriteBit(guid[2] != 0); - data.WriteBit(guid[7] != 0); - data.WriteBit(guid[3] != 0); - data.WriteBit(guid[0] != 0); - data.WriteBits(joinData.lockmap.size(), 24); - for (lfg::LfgLockPartyMap::const_iterator it = joinData.lockmap.begin(); it != joinData.lockmap.end(); ++it) - { - ObjectGuid playerGuid = it->first; - data.WriteBit(playerGuid[7] != 0); - data.WriteBit(playerGuid[5] != 0); - data.WriteBit(playerGuid[3] != 0); - data.WriteBit(playerGuid[6] != 0); - data.WriteBit(playerGuid[0] != 0); - data.WriteBit(playerGuid[2] != 0); - data.WriteBit(playerGuid[4] != 0); - data.WriteBit(playerGuid[1] != 0); - data.WriteBits(it->second.size(), 22); - } + WorldPackets::LFG::LFGJoinResult lfgJoinResult; + if (WorldPackets::LFG::RideTicket const* ticket = sLFGMgr->GetTicket(GetPlayer()->GetGUID())) + lfgJoinResult.Ticket = *ticket; + lfgJoinResult.Result = joinData.result; + if (joinData.result == lfg::LFG_JOIN_ROLE_CHECK_FAILED) + lfgJoinResult.ResultDetail = joinData.state; - data.WriteBit(guid[4] != 0); - data.WriteBit(guid[5] != 0); - data.WriteBit(guid[1] != 0); - data.WriteBit(guid[6] != 0); for (lfg::LfgLockPartyMap::const_iterator it = joinData.lockmap.begin(); it != joinData.lockmap.end(); ++it) { + lfgJoinResult.BlackList.emplace_back(); + WorldPackets::LFG::LFGJoinBlackList& blackList = lfgJoinResult.BlackList.back(); + blackList.Guid = it->first; + ObjectGuid playerGuid = it->first; for (lfg::LfgLockMap::const_iterator itr = it->second.begin(); itr != it->second.end(); ++itr) { TC_LOG_TRACE("lfg", "SendLfgJoinResult:: %s DungeonID: %u Lock status: %u Required itemLevel: %u Current itemLevel: %f", - playerGuid.ToString().c_str(), (itr->first & 0x00FFFFFF), itr->second.lockStatus, itr->second.requiredItemLevel, itr->second.currentItemLevel); + it->first.ToString().c_str(), (itr->first & 0x00FFFFFF), itr->second.lockStatus, itr->second.requiredItemLevel, itr->second.currentItemLevel); - data << uint32(itr->second.lockStatus); // Lock status - data << uint32(itr->second.currentItemLevel); // Current itemLevel - data << uint32(itr->second.requiredItemLevel); // Required itemLevel - data << uint32(itr->first); // Dungeon entry (id + type) + blackList.Slots.emplace_back(itr->first, itr->second.lockStatus, itr->second.requiredItemLevel, itr->second.currentItemLevel); } - - data.WriteByteSeq(playerGuid[2]); - data.WriteByteSeq(playerGuid[5]); - data.WriteByteSeq(playerGuid[1]); - data.WriteByteSeq(playerGuid[0]); - data.WriteByteSeq(playerGuid[4]); - data.WriteByteSeq(playerGuid[3]); - data.WriteByteSeq(playerGuid[6]); - data.WriteByteSeq(playerGuid[7]); } - data.WriteByteSeq(guid[1]); - data.WriteByteSeq(guid[4]); - data.WriteByteSeq(guid[3]); - data.WriteByteSeq(guid[5]); - data.WriteByteSeq(guid[0]); - data.WriteByteSeq(guid[7]); - data.WriteByteSeq(guid[2]); - data.WriteByteSeq(guid[6]); - - SendPacket(&data); + SendPacket(lfgJoinResult.Write()); } void WorldSession::SendLfgQueueStatus(lfg::LfgQueueStatusData const& queueData) @@ -612,40 +371,20 @@ void WorldSession::SendLfgQueueStatus(lfg::LfgQueueStatusData const& queueData) queueData.waitTimeTank, queueData.waitTimeHealer, queueData.waitTimeDps, queueData.queuedTime, queueData.tanks, queueData.healers, queueData.dps); - ObjectGuid guid = _player->GetGUID(); - WorldPacket data(SMSG_LFG_QUEUE_STATUS, 4 + 4 + 4 + 4 + 4 + 4 + 1 + 1 + 1 + 4 + 4 + 4 + 4 + 8); - data.WriteBit(guid[3] != 0); - data.WriteBit(guid[0] != 0); - data.WriteBit(guid[2] != 0); - data.WriteBit(guid[6] != 0); - data.WriteBit(guid[5] != 0); - data.WriteBit(guid[7] != 0); - data.WriteBit(guid[1] != 0); - data.WriteBit(guid[4] != 0); - - data.WriteByteSeq(guid[0]); - data << uint8(queueData.tanks); // Tanks needed - data << int32(queueData.waitTimeTank); // Wait Tanks - data << uint8(queueData.healers); // Healers needed - data << int32(queueData.waitTimeHealer); // Wait Healers - data << uint8(queueData.dps); // Dps needed - data << int32(queueData.waitTimeDps); // Wait Dps - data.WriteByteSeq(guid[4]); - data.WriteByteSeq(guid[6]); - data << int32(queueData.waitTime); // Wait Time - data << uint32(queueData.joinTime); // Join time - data << uint32(queueData.dungeonId); // Dungeon - data << uint32(queueData.queuedTime); // Player wait time in queue - data.WriteByteSeq(guid[5]); - data.WriteByteSeq(guid[7]); - data.WriteByteSeq(guid[3]); - data << uint32(queueData.queueId); // Queue Id - data.WriteByteSeq(guid[1]); - data.WriteByteSeq(guid[2]); - data << int32(queueData.waitTimeAvg); // Average Wait time - data << uint32(3); - - SendPacket(&data); + WorldPackets::LFG::LFGQueueStatus lfgQueueStatus; + if (WorldPackets::LFG::RideTicket const* ticket = sLFGMgr->GetTicket(GetPlayer()->GetGUID())) + lfgQueueStatus.Ticket = *ticket; + lfgQueueStatus.Slot = sLFGMgr->GetLFGDungeonEntry(queueData.dungeonId); + lfgQueueStatus.AvgWaitTimeMe = queueData.waitTime; + lfgQueueStatus.AvgWaitTime = queueData.waitTimeAvg; + lfgQueueStatus.AvgWaitTimeByRole[0] = queueData.waitTimeTank; + lfgQueueStatus.AvgWaitTimeByRole[1] = queueData.waitTimeHealer; + lfgQueueStatus.AvgWaitTimeByRole[2] = queueData.waitTimeDps; + lfgQueueStatus.LastNeeded[0] = queueData.tanks; + lfgQueueStatus.LastNeeded[1] = queueData.healers; + lfgQueueStatus.LastNeeded[2] = queueData.dps; + lfgQueueStatus.QueuedTime = queueData.queuedTime; + SendPacket(lfgQueueStatus.Write()); } void WorldSession::SendLfgPlayerReward(lfg::LfgPlayerRewardData const& rewardData) @@ -656,28 +395,35 @@ void WorldSession::SendLfgPlayerReward(lfg::LfgPlayerRewardData const& rewardDat TC_LOG_DEBUG("lfg", "SMSG_LFG_PLAYER_REWARD %s rdungeonEntry: %u, sdungeonEntry: %u, done: %u", GetPlayerInfo().c_str(), rewardData.rdungeonEntry, rewardData.sdungeonEntry, rewardData.done); - uint8 itemNum = rewardData.quest->GetRewItemsCount() + rewardData.quest->GetRewCurrencyCount(); + WorldPackets::LFG::LFGPlayerReward lfgPlayerReward; + lfgPlayerReward.QueuedSlot = rewardData.rdungeonEntry; + lfgPlayerReward.ActualSlot = rewardData.sdungeonEntry; + lfgPlayerReward.RewardMoney = GetPlayer()->GetQuestMoneyReward(rewardData.quest); + lfgPlayerReward.AddedXP = GetPlayer()->GetQuestXPReward(rewardData.quest); + + for (uint8 i = 0; i < QUEST_REWARD_ITEM_COUNT; ++i) + if (uint32 itemId = rewardData.quest->RewardItemId[i]) + lfgPlayerReward.Rewards.emplace_back(itemId, rewardData.quest->RewardItemCount[i], 0, false); - WorldPacket data(SMSG_LFG_PLAYER_REWARD, 4 + 4 + 1 + 4 + 4 + 4 + 4 + 4 + 1 + itemNum * (4 + 4 + 4)); - data << uint32(rewardData.rdungeonEntry); // Random Dungeon Finished - data << uint32(rewardData.sdungeonEntry); // Dungeon Finished - BuildQuestReward(data, rewardData.quest, GetPlayer()); - SendPacket(&data); + for (uint32 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i) + if (uint32 curencyId = rewardData.quest->RewardCurrencyId[i]) + lfgPlayerReward.Rewards.emplace_back(curencyId, rewardData.quest->RewardCurrencyCount[i], 0, true); + + SendPacket(lfgPlayerReward.Write()); } void WorldSession::SendLfgBootProposalUpdate(lfg::LfgPlayerBoot const& boot) { - ObjectGuid guid = GetPlayer()->GetGUID(); - lfg::LfgAnswer playerVote = boot.votes.find(guid)->second; + lfg::LfgAnswer playerVote = boot.votes.find(GetPlayer()->GetGUID())->second; uint8 votesNum = 0; uint8 agreeNum = 0; - uint32 secsleft = uint8((boot.cancelTime - time(NULL)) / 1000); - for (lfg::LfgAnswerContainer::const_iterator it = boot.votes.begin(); it != boot.votes.end(); ++it) + int32 secsleft = int32((boot.cancelTime - time(nullptr)) / 1000); + for (const auto& vote : boot.votes) { - if (it->second != lfg::LFG_ANSWER_PENDING) + if (vote.second != lfg::LFG_ANSWER_PENDING) { ++votesNum; - if (it->second == lfg::LFG_ANSWER_AGREE) + if (vote.second == lfg::LFG_ANSWER_AGREE) ++agreeNum; } } @@ -687,18 +433,19 @@ void WorldSession::SendLfgBootProposalUpdate(lfg::LfgPlayerBoot const& boot) GetPlayerInfo().c_str(), uint8(boot.inProgress), uint8(playerVote != lfg::LFG_ANSWER_PENDING), uint8(playerVote == lfg::LFG_ANSWER_AGREE), boot.victim.ToString().c_str(), votesNum, agreeNum, secsleft, lfg::LFG_GROUP_KICK_VOTES_NEEDED, boot.reason.c_str()); - WorldPacket data(SMSG_LFG_BOOT_PLAYER, 1 + 1 + 1 + 1 + 8 + 4 + 4 + 4 + 4 + boot.reason.length()); - data << uint8(boot.inProgress); // Vote in progress - data << uint8(agreeNum >= lfg::LFG_GROUP_KICK_VOTES_NEEDED); // Did succeed - data << uint8(playerVote != lfg::LFG_ANSWER_PENDING); // Did Vote - data << uint8(playerVote == lfg::LFG_ANSWER_AGREE); // Agree - data << boot.victim; // Victim GUID - data << uint32(votesNum); // Total Votes - data << uint32(agreeNum); // Agree Count - data << uint32(secsleft); // Time Left - data << uint32(lfg::LFG_GROUP_KICK_VOTES_NEEDED); // Needed Votes - data << boot.reason.c_str(); // Kick reason - SendPacket(&data); + + WorldPackets::LFG::LfgBootPlayer lfgBootPlayer; + lfgBootPlayer.Info.VoteInProgress = boot.inProgress; + lfgBootPlayer.Info.VotePassed = agreeNum >= lfg::LFG_GROUP_KICK_VOTES_NEEDED; + lfgBootPlayer.Info.MyVoteCompleted = playerVote != lfg::LFG_ANSWER_PENDING; + lfgBootPlayer.Info.MyVote = playerVote == lfg::LFG_ANSWER_AGREE; + lfgBootPlayer.Info.Target = boot.victim; + lfgBootPlayer.Info.TotalVotes = votesNum; + lfgBootPlayer.Info.BootVotes = agreeNum; + lfgBootPlayer.Info.TimeLeft = secsleft; + lfgBootPlayer.Info.VotesNeeded = lfg::LFG_GROUP_KICK_VOTES_NEEDED; + lfgBootPlayer.Info.Reason = boot.reason; + SendPacket(lfgBootPlayer.Write()); } void WorldSession::SendLfgUpdateProposal(lfg::LfgProposal const& proposal) @@ -707,8 +454,6 @@ void WorldSession::SendLfgUpdateProposal(lfg::LfgProposal const& proposal) ObjectGuid gguid = proposal.players.find(guid)->second.group; bool silent = !proposal.isNew && gguid == proposal.group; uint32 dungeonEntry = proposal.dungeonId; - uint32 queueId = sLFGMgr->GetQueueId(_player->GetGUID()); - time_t joinTime = sLFGMgr->GetQueueJoinTime(_player->GetGUID()); TC_LOG_DEBUG("lfg", "SMSG_LFG_PROPOSAL_UPDATE %s state: %u", GetPlayerInfo().c_str(), proposal.state); @@ -721,124 +466,49 @@ void WorldSession::SendLfgUpdateProposal(lfg::LfgProposal const& proposal) dungeonEntry = (*playerDungeons.begin()); } - dungeonEntry = sLFGMgr->GetLFGDungeonEntry(dungeonEntry); - - WorldPacket data(SMSG_LFG_PROPOSAL_UPDATE, 4 + 1 + 4 + 4 + 1 + 1 + proposal.players.size() * (4 + 1 + 1 + 1 + 1 +1)); - data << uint32(joinTime); - data << uint32(proposal.encounters); // Encounters done - data << uint32(queueId); // Queue Id - data << uint32(3); // Always 3 - data << uint32(dungeonEntry); // Dungeon - data << uint32(proposal.id); // Proposal Id - data << uint8(proposal.state); // State - - data.WriteBit(gguid[4] != 0); - data.WriteBit(guid[3] != 0); - data.WriteBit(guid[7] != 0); - data.WriteBit(guid[0] != 0); - data.WriteBit(gguid[1] != 0); - data.WriteBit(silent); - data.WriteBit(guid[4] != 0); - data.WriteBit(guid[5] != 0); - data.WriteBit(gguid[3] != 0); - data.WriteBits(proposal.players.size(), 23); - data.WriteBit(gguid[7] != 0); - - for (lfg::LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it) + WorldPackets::LFG::LFGProposalUpdate lfgProposalUpdate; + if (WorldPackets::LFG::RideTicket const* ticket = sLFGMgr->GetTicket(GetPlayer()->GetGUID())) + lfgProposalUpdate.Ticket = *ticket; + lfgProposalUpdate.InstanceID = 0; + lfgProposalUpdate.ProposalID = proposal.id; + lfgProposalUpdate.Slot = sLFGMgr->GetLFGDungeonEntry(dungeonEntry); + lfgProposalUpdate.State = proposal.state; + lfgProposalUpdate.CompletedMask = proposal.encounters; + lfgProposalUpdate.ValidCompletedMask = true; + lfgProposalUpdate.ProposalSilent = silent; + lfgProposalUpdate.IsRequeue = !proposal.isNew; + + for (auto const& player : proposal.players) { - lfg::LfgProposalPlayer const& player = it->second; - - if (!player.group) - { - data.WriteBit(false); - data.WriteBit(false); - } - else - { - data.WriteBit(player.group == proposal.group); // Is group in dungeon - data.WriteBit(player.group == gguid); // Same group as the player - } - - data.WriteBit(player.accept == lfg::LFG_ANSWER_AGREE); - data.WriteBit(player.accept != lfg::LFG_ANSWER_PENDING); - data.WriteBit(it->first == guid); - } - - data.WriteBit(gguid[5] != 0); - data.WriteBit(guid[6] != 0); - data.WriteBit(gguid[2] != 0); - data.WriteBit(gguid[6] != 0); - data.WriteBit(guid[2] != 0); - data.WriteBit(guid[1] != 0); - data.WriteBit(gguid[0] != 0); - - data.WriteByteSeq(guid[5]); - data.WriteByteSeq(gguid[3]); - data.WriteByteSeq(gguid[6]); - data.WriteByteSeq(guid[6]); - data.WriteByteSeq(guid[0]); - data.WriteByteSeq(gguid[5]); - data.WriteByteSeq(guid[1]); - - for (lfg::LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it) - { - lfg::LfgProposalPlayer const& player = it->second; - data << uint32(player.role); + lfgProposalUpdate.Players.emplace_back(); + auto& proposalPlayer = lfgProposalUpdate.Players.back(); + proposalPlayer.Roles = player.second.role; + proposalPlayer.Me = player.first == guid; + proposalPlayer.MyParty = !player.second.group.IsEmpty() && player.second.group == proposal.group; + proposalPlayer.SameParty = !player.second.group.IsEmpty() && player.second.group == gguid; + proposalPlayer.Responded = player.second.accept != lfg::LFG_ANSWER_PENDING; + proposalPlayer.Accepted = player.second.accept == lfg::LFG_ANSWER_AGREE; } - data.WriteByteSeq(gguid[7]); - data.WriteByteSeq(guid[4]); - data.WriteByteSeq(gguid[0]); - data.WriteByteSeq(gguid[1]); - data.WriteByteSeq(guid[2]); - data.WriteByteSeq(guid[7]); - data.WriteByteSeq(gguid[2]); - data.WriteByteSeq(guid[3]); - data.WriteByteSeq(gguid[4]); - - SendPacket(&data); -} - -void WorldSession::SendLfgLfrList(bool /*update*/) -{ - //TC_LOG_DEBUG("lfg", "SMSG_LFG_LFR_LIST %s update: %u", - // GetPlayerInfo().c_str(), update ? 1 : 0); - //WorldPacket data(SMSG_LFG_UPDATE_SEARCH, 1); - //data << uint8(update); // In Lfg Queue? - //SendPacket(&data); + SendPacket(lfgProposalUpdate.Write()); } void WorldSession::SendLfgDisabled() { TC_LOG_DEBUG("lfg", "SMSG_LFG_DISABLED %s", GetPlayerInfo().c_str()); - WorldPacket data(SMSG_LFG_DISABLED, 0); - SendPacket(&data); + SendPacket(WorldPackets::LFG::LFGDisabled().Write()); } void WorldSession::SendLfgOfferContinue(uint32 dungeonEntry) { TC_LOG_DEBUG("lfg", "SMSG_LFG_OFFER_CONTINUE %s dungeon entry: %u", GetPlayerInfo().c_str(), dungeonEntry); - WorldPacket data(SMSG_LFG_OFFER_CONTINUE, 4); - data << uint32(dungeonEntry); - SendPacket(&data); + SendPacket(WorldPackets::LFG::LFGOfferContinue(sLFGMgr->GetLFGDungeonEntry(dungeonEntry)).Write()); } -void WorldSession::SendLfgTeleportError(uint8 err) +void WorldSession::SendLfgTeleportError(lfg::LfgTeleportResult err) { TC_LOG_DEBUG("lfg", "SMSG_LFG_TELEPORT_DENIED %s reason: %u", GetPlayerInfo().c_str(), err); - WorldPacket data(SMSG_LFG_TELEPORT_DENIED, 4); - data << uint32(err); // Error - SendPacket(&data); -} - -/* -void WorldSession::SendLfrUpdateListOpcode(uint32 dungeonEntry) -{ - TC_LOG_DEBUG("network", "SMSG_LFG_UPDATE_LIST %s dungeon entry: %u", - GetPlayerInfo().c_str(), dungeonEntry); - WorldPacket data(SMSG_LFG_UPDATE_LIST); - SendPacket(&data); + SendPacket(WorldPackets::LFG::LFGTeleportDenied(err).Write()); } -*/ |