diff options
author | Shauren <shauren.trinity@gmail.com> | 2013-06-27 12:48:34 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2013-06-27 12:48:34 +0200 |
commit | 36c866f9ffbcc29e3e11e679e899b24fab9c39f8 (patch) | |
tree | 309e33a360996101c7bc0c5e3cc256c1f0709b6a /src/server | |
parent | 0d9cc47cbbe6256dd67b232996df7f7a4579f3d7 (diff) |
Core/PacketIO: Updated and enabled more LFG opcodes
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/game/DungeonFinding/LFG.h | 26 | ||||
-rw-r--r-- | src/server/game/DungeonFinding/LFGMgr.cpp | 74 | ||||
-rw-r--r-- | src/server/game/DungeonFinding/LFGMgr.h | 47 | ||||
-rw-r--r-- | src/server/game/DungeonFinding/LFGScripts.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.h | 2 | ||||
-rw-r--r-- | src/server/game/Handlers/LFGHandler.cpp | 297 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.h | 2 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 3 |
9 files changed, 264 insertions, 199 deletions
diff --git a/src/server/game/DungeonFinding/LFG.h b/src/server/game/DungeonFinding/LFG.h index 541e4d6bd43..0bd82bcd7c1 100644 --- a/src/server/game/DungeonFinding/LFG.h +++ b/src/server/game/DungeonFinding/LFG.h @@ -44,17 +44,21 @@ enum LfgUpdateType LFG_UPDATETYPE_DEFAULT = 0, // Internal Use LFG_UPDATETYPE_LEADER_UNK1 = 1, // FIXME: At group leave LFG_UPDATETYPE_ROLECHECK_ABORTED = 4, - LFG_UPDATETYPE_JOIN_QUEUE = 5, - LFG_UPDATETYPE_ROLECHECK_FAILED = 6, - LFG_UPDATETYPE_REMOVED_FROM_QUEUE = 7, - LFG_UPDATETYPE_PROPOSAL_FAILED = 8, - LFG_UPDATETYPE_PROPOSAL_DECLINED = 9, - LFG_UPDATETYPE_GROUP_FOUND = 10, - LFG_UPDATETYPE_ADDED_TO_QUEUE = 12, - LFG_UPDATETYPE_PROPOSAL_BEGIN = 13, - LFG_UPDATETYPE_UPDATE_STATUS = 14, - LFG_UPDATETYPE_GROUP_MEMBER_OFFLINE = 15, - LFG_UPDATETYPE_GROUP_DISBAND_UNK16 = 16, // FIXME: Sometimes at group disband + LFG_UPDATETYPE_JOIN_QUEUE = 6, + LFG_UPDATETYPE_ROLECHECK_FAILED = 7, + LFG_UPDATETYPE_REMOVED_FROM_QUEUE = 8, + LFG_UPDATETYPE_PROPOSAL_FAILED = 9, + LFG_UPDATETYPE_PROPOSAL_DECLINED = 10, + LFG_UPDATETYPE_GROUP_FOUND = 11, + LFG_UPDATETYPE_ADDED_TO_QUEUE = 13, + LFG_UPDATETYPE_PROPOSAL_BEGIN = 14, + LFG_UPDATETYPE_UPDATE_STATUS = 15, + LFG_UPDATETYPE_GROUP_MEMBER_OFFLINE = 16, + LFG_UPDATETYPE_GROUP_DISBAND_UNK16 = 17, // FIXME: Sometimes at group disband + LFG_UPDATETYPE_JOIN_QUEUE_INITIAL = 24, + LFG_UPDATETYPE_DUNGEON_FINISHED = 25, + LFG_UPDATETYPE_PARTY_ROLE_NOT_AVAILABLE = 43, + LFG_UPDATETYPE_JOIN_LFG_OBJECT_FAILED = 45, }; enum LfgState diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 1aef979c51f..3bf2eb25b95 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -286,7 +286,7 @@ void LFGMgr::Update(uint32 diff) RestoreState(guid, "Remove Obsolete RoleCheck"); SendLfgRoleCheckUpdate(guid, roleCheck); if (guid == roleCheck.leader) - SendLfgJoinResult(guid, LfgJoinResultData(LFG_JOIN_FAILED, LFG_ROLECHECK_MISSING_ROLE)); + SendLfgJoinResult(guid, LfgJoinResultData(LFG_JOIN_ROLE_CHECK_FAILED, LFG_ROLECHECK_MISSING_ROLE)); } RestoreState(itRoleCheck->first, "Remove Obsolete RoleCheck"); @@ -343,10 +343,10 @@ void LFGMgr::Update(uint32 diff) if (uint64 gguid = GetGroup(guid)) { SetState(gguid, LFG_STATE_PROPOSAL); - SendLfgUpdateParty(guid, LfgUpdateData(LFG_UPDATETYPE_PROPOSAL_BEGIN, GetSelectedDungeons(guid), GetComment(guid))); + SendLfgUpdateStatus(guid, LfgUpdateData(LFG_UPDATETYPE_PROPOSAL_BEGIN, GetSelectedDungeons(guid), GetComment(guid)), true); } else - SendLfgUpdatePlayer(guid, LfgUpdateData(LFG_UPDATETYPE_PROPOSAL_BEGIN, GetSelectedDungeons(guid), GetComment(guid))); + SendLfgUpdateStatus(guid, LfgUpdateData(LFG_UPDATETYPE_PROPOSAL_BEGIN, GetSelectedDungeons(guid), GetComment(guid)), false); SendLfgUpdateProposal(guid, proposal); } @@ -495,7 +495,7 @@ void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons, const if (Player* plrg = itr->GetSource()) { if (!plrg->GetSession()->HasPermission(RBAC_PERM_JOIN_DUNGEON_FINDER)) - joinData.result = LFG_JOIN_PARTY_NOT_MEET_REQS; + joinData.result = LFG_JOIN_INTERNAL_ERROR; if (plrg->HasAura(LFG_SPELL_DUNGEON_DESERTER)) joinData.result = LFG_JOIN_PARTY_DESERTER; else if (plrg->HasAura(LFG_SPELL_DUNGEON_COOLDOWN)) @@ -558,7 +558,7 @@ void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons, const // if we have lockmap then there are no compatible dungeons GetCompatibleDungeons(dungeons, players, joinData.lockmap); if (dungeons.empty()) - joinData.result = grp ? LFG_JOIN_PARTY_NOT_MEET_REQS : LFG_JOIN_NOT_MEET_REQS; + joinData.result = grp ? LFG_JOIN_INTERNAL_ERROR : LFG_JOIN_NOT_MEET_REQS; } } @@ -605,7 +605,7 @@ void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons, const if (Player* plrg = itr->GetSource()) { uint64 pguid = plrg->GetGUID(); - plrg->GetSession()->SendLfgUpdateParty(updateData); + plrg->GetSession()->SendLfgUpdateStatus(updateData, true); SetState(pguid, LFG_STATE_ROLECHECK); if (!isContinue) SetSelectedDungeons(pguid, dungeons); @@ -636,7 +636,7 @@ void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons, const } // Send update to player player->GetSession()->SendLfgJoinResult(joinData); - player->GetSession()->SendLfgUpdatePlayer(LfgUpdateData(LFG_UPDATETYPE_JOIN_QUEUE, dungeons, comment)); + player->GetSession()->SendLfgUpdateStatus(LfgUpdateData(LFG_UPDATETYPE_JOIN_QUEUE, dungeons, comment), false); SetState(gguid, LFG_STATE_QUEUED); SetRoles(guid, roles); debugNames.append(player->GetName()); @@ -675,14 +675,14 @@ void LFGMgr::LeaveLfg(uint64 guid) for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it) { SetState(*it, LFG_STATE_NONE); - SendLfgUpdateParty(*it, LfgUpdateData(LFG_UPDATETYPE_REMOVED_FROM_QUEUE)); + SendLfgUpdateStatus(*it, LfgUpdateData(LFG_UPDATETYPE_REMOVED_FROM_QUEUE), true); } } else { LFGQueue& queue = GetQueue(guid); queue.RemoveFromQueue(guid); - SendLfgUpdatePlayer(guid, LfgUpdateData(LFG_UPDATETYPE_REMOVED_FROM_QUEUE)); + SendLfgUpdateStatus(guid, LfgUpdateData(LFG_UPDATETYPE_REMOVED_FROM_QUEUE), false); SetState(guid, LFG_STATE_NONE); } break; @@ -771,6 +771,10 @@ void LFGMgr::UpdateRoleCheck(uint64 gguid, uint64 guid /* = 0 */, uint8 roles /* else dungeons = roleCheck.dungeons; + LfgJoinResult joinResult = LFG_JOIN_FAILED; + if (roleCheck.state == LFG_ROLECHECK_MISSING_ROLE || roleCheck.state == LFG_ROLECHECK_WRONG_ROLES) + joinResult = LFG_JOIN_ROLE_CHECK_FAILED; + LfgJoinResultData joinData = LfgJoinResultData(LFG_JOIN_FAILED, roleCheck.state); for (LfgRolesMap::const_iterator it = roleCheck.roles.begin(); it != roleCheck.roles.end(); ++it) { @@ -787,12 +791,12 @@ void LFGMgr::UpdateRoleCheck(uint64 gguid, uint64 guid /* = 0 */, uint8 roles /* case LFG_ROLECHECK_FINISHED: SetState(pguid, LFG_STATE_QUEUED); SetRoles(pguid, it->second); - SendLfgUpdateParty(pguid, LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, dungeons, GetComment(pguid))); + SendLfgUpdateStatus(pguid, LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, dungeons, GetComment(pguid)), true); break; default: if (roleCheck.leader == pguid) SendLfgJoinResult(pguid, joinData); - SendLfgUpdateParty(pguid, LfgUpdateData(LFG_UPDATETYPE_ROLECHECK_FAILED)); + SendLfgUpdateStatus(pguid, LfgUpdateData(LFG_UPDATETYPE_ROLECHECK_FAILED), true); RestoreState(pguid, "Rolecheck Failed"); break; } @@ -1056,16 +1060,16 @@ void LFGMgr::UpdateProposal(uint32 proposalId, uint64 guid, bool accept) if (gguid) { waitTime = int32((joinTime - queue.GetJoinTime(gguid)) / IN_MILLISECONDS); - SendLfgUpdateParty(pguid, updateData); + SendLfgUpdateStatus(pguid, updateData, false); } else { waitTime = int32((joinTime - queue.GetJoinTime(pguid)) / IN_MILLISECONDS); - SendLfgUpdatePlayer(pguid, updateData); + SendLfgUpdateStatus(pguid, updateData, false); } updateData.updateType = LFG_UPDATETYPE_REMOVED_FROM_QUEUE; - SendLfgUpdatePlayer(pguid, updateData); - SendLfgUpdateParty(pguid, updateData); + SendLfgUpdateStatus(pguid, updateData, true); + SendLfgUpdateStatus(pguid, updateData, false); // Update timers uint8 role = GetRoles(pguid); @@ -1157,10 +1161,10 @@ void LFGMgr::RemoveProposal(LfgProposalContainer::iterator itProposal, LfgUpdate if (gguid != guid) { RestoreState(it->second.group, "Proposal Fail (someone in group didn't accepted)"); - SendLfgUpdateParty(guid, updateData); + SendLfgUpdateStatus(guid, updateData, true); } else - SendLfgUpdatePlayer(guid, updateData); + SendLfgUpdateStatus(guid, updateData, false); } else { @@ -1169,10 +1173,10 @@ void LFGMgr::RemoveProposal(LfgProposalContainer::iterator itProposal, LfgUpdate if (gguid != guid) { SetState(gguid, LFG_STATE_QUEUED); - SendLfgUpdateParty(guid, LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, GetSelectedDungeons(guid), GetComment(guid))); + SendLfgUpdateStatus(guid, LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, GetSelectedDungeons(guid), GetComment(guid)), true); } else - SendLfgUpdatePlayer(guid, LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, GetSelectedDungeons(guid), GetComment(guid))); + SendLfgUpdateStatus(guid, LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, GetSelectedDungeons(guid), GetComment(guid)), false); } } @@ -1733,7 +1737,7 @@ void LFGMgr::RemoveGroupData(uint64 guid) if (state != LFG_STATE_PROPOSAL) { SetState(*it, LFG_STATE_NONE); - SendLfgUpdateParty(guid, LfgUpdateData(LFG_UPDATETYPE_REMOVED_FROM_QUEUE)); + SendLfgUpdateStatus(guid, LfgUpdateData(LFG_UPDATETYPE_REMOVED_FROM_QUEUE), true); } } GroupsStore.erase(it); @@ -1813,16 +1817,10 @@ void LFGMgr::SendLfgRoleCheckUpdate(uint64 guid, LfgRoleCheck const& roleCheck) player->GetSession()->SendLfgRoleCheckUpdate(roleCheck); } -void LFGMgr::SendLfgUpdatePlayer(uint64 guid, LfgUpdateData const& data) -{ - if (Player* player = ObjectAccessor::FindPlayer(guid)) - player->GetSession()->SendLfgUpdatePlayer(data); -} - -void LFGMgr::SendLfgUpdateParty(uint64 guid, LfgUpdateData const& data) +void LFGMgr::SendLfgUpdateStatus(uint64 guid, LfgUpdateData const& data, bool party) { if (Player* player = ObjectAccessor::FindPlayer(guid)) - player->GetSession()->SendLfgUpdateParty(data); + player->GetSession()->SendLfgUpdateStatus(data, party); } void LFGMgr::SendLfgJoinResult(uint64 guid, LfgJoinResultData const& data) @@ -1854,18 +1852,22 @@ bool LFGMgr::IsLfgGroup(uint64 guid) return guid && IS_GROUP_GUID(guid) && GroupsStore[guid].IsLfgGroup(); } -LFGQueue& LFGMgr::GetQueue(uint64 guid) +uint8 LFGMgr::GetQueueId(uint64 guid) { - uint8 queueId = 0; if (IS_GROUP_GUID(guid)) { LfgGuidSet const& players = GetPlayers(guid); uint64 pguid = players.empty() ? 0 : (*players.begin()); if (pguid) - queueId = GetTeam(pguid); + return GetTeam(pguid); } - else - queueId = GetTeam(guid); + + return GetTeam(guid); +} + +LFGQueue& LFGMgr::GetQueue(uint64 guid) +{ + uint8 queueId = GetQueueId(guid); return QueuesStore[queueId]; } @@ -1880,6 +1882,12 @@ bool LFGMgr::AllQueued(LfgGuidList const& check) return true; } +time_t LFGMgr::GetQueueJoinTime(uint64 guid) +{ + LFGQueue& queue = GetQueue(guid); + return queue.GetJoinTime(guid); +} + // Only for debugging purposes void LFGMgr::Clean() { diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h index 2d24253ed49..a55ff135110 100644 --- a/src/server/game/DungeonFinding/LFGMgr.h +++ b/src/server/game/DungeonFinding/LFGMgr.h @@ -94,23 +94,24 @@ enum LfgTeleportError enum LfgJoinResult { // 3 = No client reaction | 18 = "Rolecheck failed" - LFG_JOIN_OK = 0, // Joined (no client msg) - LFG_JOIN_FAILED = 1, // RoleCheck Failed - LFG_JOIN_GROUPFULL = 2, // Your group is full - LFG_JOIN_INTERNAL_ERROR = 4, // Internal LFG Error - LFG_JOIN_NOT_MEET_REQS = 5, // You do not meet the requirements for the chosen dungeons - LFG_JOIN_PARTY_NOT_MEET_REQS = 6, // One or more party members do not meet the requirements for the chosen dungeons - LFG_JOIN_MIXED_RAID_DUNGEON = 7, // You cannot mix dungeons, raids, and random when picking dungeons - LFG_JOIN_MULTI_REALM = 8, // The dungeon you chose does not support players from multiple realms - LFG_JOIN_DISCONNECTED = 9, // One or more party members are pending invites or disconnected - LFG_JOIN_PARTY_INFO_FAILED = 10, // Could not retrieve information about some party members - LFG_JOIN_DUNGEON_INVALID = 11, // One or more dungeons was not valid - LFG_JOIN_DESERTER = 12, // You can not queue for dungeons until your deserter debuff wears off - LFG_JOIN_PARTY_DESERTER = 13, // One or more party members has a deserter debuff - LFG_JOIN_RANDOM_COOLDOWN = 14, // You can not queue for random dungeons while on random dungeon cooldown - LFG_JOIN_PARTY_RANDOM_COOLDOWN = 15, // One or more party members are on random dungeon cooldown - LFG_JOIN_TOO_MUCH_MEMBERS = 16, // You can not enter dungeons with more that 5 party members - LFG_JOIN_USING_BG_SYSTEM = 17 // You can not use the dungeon system while in BG or arenas + LFG_JOIN_OK = 0x00, // Joined (no client msg) + LFG_JOIN_FAILED = 0x1B, // RoleCheck Failed + LFG_JOIN_GROUPFULL = 0x1C, // Your group is full + LFG_JOIN_INTERNAL_ERROR = 0x1E, // Internal LFG Error + LFG_JOIN_NOT_MEET_REQS = 0x1F, // You do not meet the requirements for the chosen dungeons + //LFG_JOIN_PARTY_NOT_MEET_REQS = 6, // One or more party members do not meet the requirements for the chosen dungeons + LFG_JOIN_MIXED_RAID_DUNGEON = 0x20, // You cannot mix dungeons, raids, and random when picking dungeons + LFG_JOIN_MULTI_REALM = 0x21, // The dungeon you chose does not support players from multiple realms + LFG_JOIN_DISCONNECTED = 0x22, // One or more party members are pending invites or disconnected + LFG_JOIN_PARTY_INFO_FAILED = 0x23, // Could not retrieve information about some party members + LFG_JOIN_DUNGEON_INVALID = 0x24, // One or more dungeons was not valid + LFG_JOIN_DESERTER = 0x25, // You can not queue for dungeons until your deserter debuff wears off + LFG_JOIN_PARTY_DESERTER = 0x26, // One or more party members has a deserter debuff + LFG_JOIN_RANDOM_COOLDOWN = 0x27, // You can not queue for random dungeons while on random dungeon cooldown + LFG_JOIN_PARTY_RANDOM_COOLDOWN = 0x28, // One or more party members are on random dungeon cooldown + LFG_JOIN_TOO_MUCH_MEMBERS = 0x29, // You can not enter dungeons with more that 5 party members + LFG_JOIN_USING_BG_SYSTEM = 0x2A, // You can not use the dungeon system while in BG or arenas + LFG_JOIN_ROLE_CHECK_FAILED = 0x2B // Role check failed, client shows special error }; /// Role check states @@ -157,7 +158,7 @@ struct LfgJoinResultData LfgLockPartyMap lockmap; }; -// Data needed by SMSG_LFG_UPDATE_PARTY and SMSG_LFG_UPDATE_PLAYER +// Data needed by SMSG_LFG_UPDATE_STATUS struct LfgUpdateData { LfgUpdateData(LfgUpdateType _type = LFG_UPDATETYPE_DEFAULT): updateType(_type), state(LFG_STATE_NONE), comment("") { } @@ -409,8 +410,12 @@ class LFGMgr uint8 GetPlayerCount(uint64 guid); /// Add a new Proposal uint32 AddProposal(LfgProposal& proposal); + /// Returns queue id + uint8 GetQueueId(uint64 guid); /// Checks if all players are queued bool AllQueued(LfgGuidList const& check); + /// Gets queue join time + time_t GetQueueJoinTime(uint64 guid); /// Checks if given roles match, modifies given roles map with new roles static bool CheckGroupRoles(LfgRolesMap &groles, bool removeLeaderFlag = true); /// Checks if given players are ignoring each other @@ -437,7 +442,8 @@ class LFGMgr void MakeNewGroup(LfgProposal const& proposal); // Generic - LFGQueue &GetQueue(uint64 guid); + LFGQueue& GetQueue(uint64 guid); + LfgDungeonSet const& GetDungeonsByRandom(uint32 randomdungeon); LfgType GetDungeonType(uint32 dungeon); @@ -445,8 +451,7 @@ class LFGMgr void SendLfgJoinResult(uint64 guid, LfgJoinResultData const& data); void SendLfgRoleChosen(uint64 guid, uint64 pguid, uint8 roles); void SendLfgRoleCheckUpdate(uint64 guid, LfgRoleCheck const& roleCheck); - void SendLfgUpdateParty(uint64 guid, LfgUpdateData const& data); - void SendLfgUpdatePlayer(uint64 guid, LfgUpdateData const& data); + void SendLfgUpdateStatus(uint64 guid, LfgUpdateData const& data, bool party); void SendLfgUpdateProposal(uint64 guid, LfgProposal const& proposal); LfgGuidSet const& GetPlayers(uint64 guid); diff --git a/src/server/game/DungeonFinding/LFGScripts.cpp b/src/server/game/DungeonFinding/LFGScripts.cpp index 9dfbb0e9fb3..dca76bd5417 100644 --- a/src/server/game/DungeonFinding/LFGScripts.cpp +++ b/src/server/game/DungeonFinding/LFGScripts.cpp @@ -197,7 +197,7 @@ void LFGGroupScript::OnRemoveMember(Group* group, uint64 guid, RemoveMethod meth //else if (state == LFG_STATE_BOOT) // Update internal kick cooldown of kicked - player->GetSession()->SendLfgUpdateParty(LfgUpdateData(LFG_UPDATETYPE_LEADER_UNK1)); + player->GetSession()->SendLfgUpdateStatus(LfgUpdateData(LFG_UPDATETYPE_LEADER_UNK1), true); if (isLFG && player->GetMap()->IsDungeon()) // Teleport player out the dungeon sLFGMgr->TeleportPlayer(player, true); } diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 08bc0ae88ae..5a95c051968 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -123,7 +123,7 @@ typedef UNORDERED_MAP<Player*, UpdateData> UpdateDataMapType; struct ObjectGuid { public: - ObjectGuid() { _data.u64 = 0LL; } + ObjectGuid() { _data.u64 = UI64LIT(0); } ObjectGuid(uint64 guid) { _data.u64 = guid; } ObjectGuid(ObjectGuid const& other) { _data.u64 = other._data.u64; } diff --git a/src/server/game/Handlers/LFGHandler.cpp b/src/server/game/Handlers/LFGHandler.cpp index a5b73520dea..98e0faea4c5 100644 --- a/src/server/game/Handlers/LFGHandler.cpp +++ b/src/server/game/Handlers/LFGHandler.cpp @@ -89,12 +89,15 @@ void WorldSession::HandleLfgJoinOpcode(WorldPacket& recvData) return; } - uint8 numDungeons; uint32 roles; recvData >> roles; - recvData.read_skip<uint16>(); // uint8 (always 0) - uint8 (always 0) - recvData >> numDungeons; + for (int32 i = 0; i < 3; ++i) + recvData.read_skip<uint32>(); + + uint32 commentLen = recvData.ReadBits(9); + uint32 numDungeons = recvData.ReadBits(24); + if (!numDungeons) { TC_LOG_DEBUG(LOG_FILTER_LFG, "CMSG_LFG_JOIN %s no dungeons selected", GetPlayerInfo().c_str()); @@ -102,41 +105,63 @@ void WorldSession::HandleLfgJoinOpcode(WorldPacket& recvData) return; } + std::string comment = recvData.ReadString(commentLen); + lfg::LfgDungeonSet newDungeons; - for (int8 i = 0; i < numDungeons; ++i) + for (uint32 i = 0; i < numDungeons; ++i) { uint32 dungeon; recvData >> dungeon; newDungeons.insert((dungeon & 0x00FFFFFF)); // remove the type from the dungeon entry } - recvData.read_skip<uint32>(); // for 0..uint8 (always 3) { uint8 (always 0) } - - std::string comment; - recvData >> comment; TC_LOG_DEBUG(LOG_FILTER_LFG, "CMSG_LFG_JOIN %s roles: %u, Dungeons: %u, Comment: %s", GetPlayerInfo().c_str(), roles, uint8(newDungeons.size()), comment.c_str()); sLFGMgr->JoinLfg(GetPlayer(), uint8(roles), newDungeons, comment); } -void WorldSession::HandleLfgLeaveOpcode(WorldPacket& /*recvData*/) +void WorldSession::HandleLfgLeaveOpcode(WorldPacket& recvData) { + ObjectGuid leaveGuid; Group* group = GetPlayer()->GetGroup(); uint64 guid = GetPlayer()->GetGUID(); uint64 gguid = group ? group->GetGUID() : guid; - TC_LOG_DEBUG(LOG_FILTER_LFG, "CMSG_LFG_LEAVE %s in group: %u", - GetPlayerInfo().c_str(), group ? 1 : 0); + 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(LOG_FILTER_LFG, "CMSG_LFG_LEAVE %s in group: %u sent guid " UI64FMTD ".", + GetPlayerInfo().c_str(), group ? 1 : 0, uint64(leaveGuid)); // Check cheating - only leader can leave the queue - if (!group || group->GetLeaderGUID() == GetPlayer()->GetGUID()) + if (!group || group->GetLeaderGUID() == guid) sLFGMgr->LeaveLfg(gguid); } void WorldSession::HandleLfgProposalResultOpcode(WorldPacket& recvData) { - uint32 lfgGroupID; // Internal lfgGroupID + uint32 lfgGroupID; // Internal lfgGroupID bool accept; // Accept to join? recvData >> lfgGroupID; recvData >> accept; @@ -242,57 +267,36 @@ void WorldSession::SendLfgPlayerLockInfo() } } - if (quest) + 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) { - uint8 rewCount = quest->GetRewItemsCount() + quest->GetRewCurrencyCount(); - - 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()); - } + data << uint32(0); // Call to Arms Role + //if (role) + // BuildQuestReward(data, ctaRoleQuest, GetPlayer()); + } + if (quest) BuildQuestReward(data, quest, GetPlayer()); - } else { - 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 - data << uint32(0); // Call to Arms Role - data << uint32(0); // Call to Arms Role - data << uint32(0); // Call to Arms Role - data << uint32(0); - data << uint32(0); - data << uint8(0); + data << uint32(0); // Money + data << uint32(0); // XP + data << uint8(0); // Reward count } } @@ -354,71 +358,45 @@ void WorldSession::HandleLfgGetStatus(WorldPacket& /*recvData*/) { TC_LOG_DEBUG(LOG_FILTER_LFG, "CMSG_LFG_GET_STATUS %s", GetPlayerInfo().c_str()); + if (!GetPlayer()->isUsingLfg()) + return; + uint64 guid = GetPlayer()->GetGUID(); lfg::LfgUpdateData updateData = sLFGMgr->GetLfgStatus(guid); if (GetPlayer()->GetGroup()) { - SendLfgUpdateParty(updateData); + SendLfgUpdateStatus(updateData, true); updateData.dungeons.clear(); - SendLfgUpdatePlayer(updateData); + SendLfgUpdateStatus(updateData, false); } else { - SendLfgUpdatePlayer(updateData); + SendLfgUpdateStatus(updateData, false); updateData.dungeons.clear(); - SendLfgUpdateParty(updateData); + SendLfgUpdateStatus(updateData, true); } } -void WorldSession::SendLfgUpdatePlayer(lfg::LfgUpdateData const& updateData) -{ - bool queued = false; - uint8 size = uint8(updateData.dungeons.size()); - - switch (updateData.updateType) - { - case lfg::LFG_UPDATETYPE_JOIN_QUEUE: - case lfg::LFG_UPDATETYPE_ADDED_TO_QUEUE: - queued = true; - break; - case lfg::LFG_UPDATETYPE_UPDATE_STATUS: - queued = updateData.state == lfg::LFG_STATE_QUEUED; - break; - default: - break; - } - - TC_LOG_DEBUG(LOG_FILTER_LFG, "SMSG_LFG_UPDATE_PLAYER %s updatetype: %u", - GetPlayerInfo().c_str(), updateData.updateType); - WorldPacket data(SMSG_LFG_UPDATE_PLAYER, 1 + 1 + (size > 0 ? 1 : 0) * (1 + 1 + 1 + 1 + size * 4 + updateData.comment.length())); - data << uint8(updateData.updateType); // Lfg Update type - data << uint8(size > 0); // Extra info - if (size) - { - data << uint8(queued); // Join the queue - data << uint8(0); // unk - Always 0 - data << uint8(0); // unk - Always 0 - - data << uint8(size); - for (lfg::LfgDungeonSet::const_iterator it = updateData.dungeons.begin(); it != updateData.dungeons.end(); ++it) - data << uint32(*it); - data << updateData.comment; - } - SendPacket(&data); -} - -void WorldSession::SendLfgUpdateParty(const lfg::LfgUpdateData& updateData) +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) { + case lfg::LFG_UPDATETYPE_JOIN_QUEUE_INITIAL: // Joined queue outside the dungeon + join = true; + break; + case lfg::LFG_UPDATETYPE_JOIN_QUEUE: case lfg::LFG_UPDATETYPE_ADDED_TO_QUEUE: // Rolecheck Success + join = true; queued = true; - // no break on purpose + break; case lfg::LFG_UPDATETYPE_PROPOSAL_BEGIN: join = true; break; @@ -430,25 +408,44 @@ void WorldSession::SendLfgUpdateParty(const lfg::LfgUpdateData& updateData) break; } - TC_LOG_DEBUG(LOG_FILTER_LFG, "SMSG_LFG_UPDATE_PARTY %s updatetype: %u", - GetPlayerInfo().c_str(), updateData.updateType); - WorldPacket data(SMSG_LFG_UPDATE_PARTY, 1 + 1 + (size > 0 ? 1 : 0) * (1 + 1 + 1 + 1 + 1 + size * 4 + updateData.comment.length())); + TC_LOG_DEBUG(LOG_FILTER_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 + updateData.comment.length() + 4 + 4 + 1 + 1 + 1 + 4 + size); + data.WriteBit(guid[1]); + data.WriteBit(party); + data.WriteBits(size, 24); + data.WriteBit(guid[6]); + data.WriteBit(size > 0); // Extra info + data.WriteBits(updateData.comment.length(), 9); + data.WriteBit(guid[4]); + data.WriteBit(guid[7]); + data.WriteBit(guid[2]); + data.WriteBit(join); // LFG Join + data.WriteBit(guid[0]); + data.WriteBit(guid[3]); + data.WriteBit(guid[5]); + data.WriteBit(queued); // Join the queue + data << uint8(updateData.updateType); // Lfg Update type - data << uint8(size > 0); // Extra info - if (size) - { - data << uint8(join); // LFG Join - data << uint8(queued); // Join the queue - data << uint8(0); // unk - Always 0 + data.WriteString(updateData.comment); + 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 - for (uint8 i = 0; i < 3; ++i) - data << uint8(0); // unk - Always 0 - data << uint8(size); - for (lfg::LfgDungeonSet::const_iterator it = updateData.dungeons.begin(); it != updateData.dungeons.end(); ++it) - data << uint32(*it); - data << updateData.comment; - } + 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); } @@ -514,6 +511,8 @@ void WorldSession::SendLfgRoleCheckUpdate(lfg::LfgRoleCheck const& roleCheck) 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); @@ -521,10 +520,64 @@ void WorldSession::SendLfgJoinResult(lfg::LfgJoinResultData const& joinData) GetPlayerInfo().c_str(), joinData.result, joinData.state); WorldPacket data(SMSG_LFG_JOIN_RESULT, 4 + 4 + size); - data << uint32(joinData.result); // Check Result - data << uint32(joinData.state); // Check Value - if (!joinData.lockmap.empty()) - BuildPartyLockDungeonBlock(data, joinData.lockmap); + 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]); + data.WriteBit(guid[7]); + data.WriteBit(guid[3]); + data.WriteBit(guid[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]); + data.WriteBit(playerGuid[5]); + data.WriteBit(playerGuid[3]); + data.WriteBit(playerGuid[6]); + data.WriteBit(playerGuid[0]); + data.WriteBit(playerGuid[2]); + data.WriteBit(playerGuid[4]); + data.WriteBit(playerGuid[1]); + data.WriteBits(it->second.size(), 22); + } + + data.WriteBit(guid[4]); + data.WriteBit(guid[5]); + data.WriteBit(guid[1]); + data.WriteBit(guid[6]); + for (lfg::LfgLockPartyMap::const_iterator it = joinData.lockmap.begin(); it != joinData.lockmap.end(); ++it) + { + ObjectGuid playerGuid = it->first; + for (lfg::LfgLockMap::const_iterator itr = it->second.begin(); itr != it->second.end(); ++itr) + { + data << uint32(itr->second); // Lock status + data << uint32(0); // Current itemLevel + data << uint32(0); // Required itemLevel + data << uint32(itr->first); // Dungeon entry (id + type) + } + + 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); } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 3948b036a56..cf90f5b0b0e 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -298,8 +298,8 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(CMSG_LEARN_TALENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLearnTalentOpcode ); DEFINE_OPCODE_HANDLER(CMSG_LEAVE_CHANNEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLeaveChannel ); DEFINE_OPCODE_HANDLER(CMSG_LFG_GET_STATUS, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleLfgGetStatus ); - DEFINE_OPCODE_HANDLER(CMSG_LFG_JOIN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgJoinOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_LFG_LEAVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgLeaveOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_LFG_JOIN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgJoinOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_LFG_LEAVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgLeaveOpcode ); DEFINE_OPCODE_HANDLER(CMSG_LFG_LFR_JOIN, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(CMSG_LFG_LFR_LEAVE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(CMSG_LFG_LOCK_INFO_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleLfgGetLockInfoOpcode ); @@ -922,7 +922,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(SMSG_LEVELUP_INFO, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_LFG_BOOT_PROPOSAL_UPDATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_LFG_DISABLED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - DEFINE_OPCODE_HANDLER(SMSG_LFG_JOIN_RESULT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_LFG_JOIN_RESULT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_LFG_OFFER_CONTINUE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_LFG_PARTY_INFO, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_LFG_PLAYER_INFO, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); @@ -934,7 +934,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(SMSG_LFG_SLOT_INVALID, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_LFG_TELEPORT_DENIED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_LFG_UPDATE_SEARCH, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - DEFINE_OPCODE_HANDLER(SMSG_LFG_UPDATE_STATUS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_LFG_UPDATE_STATUS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_LFG_UPDATE_STATUS_NONE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICANT_LIST_UPDATED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); @@ -1616,8 +1616,6 @@ void OpcodeTable::Initialize() //DEFINE_OPCODE_HANDLER(SMSG_KICK_REASON, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_LFG_OPEN_FROM_GOSSIP, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_LFG_UPDATE_LIST, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(SMSG_LFG_UPDATE_PARTY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(SMSG_LFG_UPDATE_PLAYER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_LF_GUILD_SEARCH_RESULT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_LOTTERY_QUERY_RESULT_OBSOLETE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_LOTTERY_RESULT_OBSOLETE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 64d08ef45de..c67afc5dbdb 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -995,8 +995,6 @@ enum Opcodes SMSG_LFG_SLOT_INVALID = 0x54B5, SMSG_LFG_TELEPORT_DENIED = 0x0E14, SMSG_LFG_UPDATE_LIST = 0x0000, - SMSG_LFG_UPDATE_PARTY = 0x0000, - SMSG_LFG_UPDATE_PLAYER = 0x0000, SMSG_LFG_UPDATE_SEARCH = 0x54A1, SMSG_LFG_UPDATE_STATUS = 0x31A4, SMSG_LFG_UPDATE_STATUS_NONE = 0x7CA1, diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 310470aabd8..646007a34e2 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -820,8 +820,7 @@ class WorldSession void HandleLfrLeaveOpcode(WorldPacket& recvData); void HandleLfgGetStatus(WorldPacket& recvData); - void SendLfgUpdatePlayer(lfg::LfgUpdateData const& updateData); - void SendLfgUpdateParty(lfg::LfgUpdateData const& updateData); + void SendLfgUpdateStatus(lfg::LfgUpdateData const& updateData, bool party); void SendLfgRoleChosen(uint64 guid, uint8 roles); void SendLfgRoleCheckUpdate(lfg::LfgRoleCheck const& pRoleCheck); void SendLfgLfrList(bool update); |