diff options
author | Spp <spp@jorge.gr> | 2010-05-31 20:25:21 +0200 |
---|---|---|
committer | Spp <spp@jorge.gr> | 2010-05-31 20:25:21 +0200 |
commit | 824b1303cedd1ce9fed7435982b08e96798f1e70 (patch) | |
tree | 54fd62d176156a2befe1e596b94833523137c0e7 /src/game/LFGHandler.cpp | |
parent | 248782448c91aaa15a918d117a92f4ceaae0d77c (diff) |
Dungeon Finder:
- Add Rolechecks
- Can Join and Leave queue
* No Find group implementation, it just adds u to the queue.
* Still missing some join queue restrictions.
--HG--
branch : trunk
Diffstat (limited to 'src/game/LFGHandler.cpp')
-rw-r--r-- | src/game/LFGHandler.cpp | 162 |
1 files changed, 134 insertions, 28 deletions
diff --git a/src/game/LFGHandler.cpp b/src/game/LFGHandler.cpp index 462b3c3e16b..0746973ff4c 100644 --- a/src/game/LFGHandler.cpp +++ b/src/game/LFGHandler.cpp @@ -22,6 +22,74 @@ #include "WorldPacket.h" #include "Player.h" +void WorldSession::HandleLfgJoinOpcode(WorldPacket &recv_data) +{ + sLog.outDebug("CMSG_LFG_JOIN"); + + uint8 numDungeons; + uint32 dungeon; + uint32 roles; + std::string comment; + + recv_data >> roles; + recv_data.read_skip<uint8>(); // unk - always 0 + recv_data.read_skip<uint8>(); // unk - always 0 + recv_data >> numDungeons; + if (!numDungeons) + { + sLog.outError("Invalid CMSG_LFG_JOIN packet sent by %s", GetPlayer()->GetName()); + recv_data.rpos(recv_data.wpos()); + return; + } + + GetPlayer()->m_lookingForGroup.roles = uint8(roles); + for (int8 i = 0 ; i < numDungeons; ++i) + { + recv_data >> dungeon; + // remove the type from the dungeon entry + GetPlayer()->m_lookingForGroup.applyDungeons.insert((dungeon & 0x00FFFFFF)); + } + + recv_data >> numDungeons; // unk - always 3 + for (int8 i = 0 ; i < numDungeons; ++i) + recv_data.read_skip<uint8>(); // unk - always 0 + + recv_data >> comment; + + GetPlayer()->m_lookingForGroup.comment = comment; + sLFGMgr.Join(GetPlayer()); +} + +void WorldSession::HandleLfgLeaveOpcode(WorldPacket & /*recv_data*/) +{ + sLog.outDebug("CMSG_LFG_LEAVE"); + + // Check cheating - only leader can leave the queue + if (Group *grp = GetPlayer()->GetGroup()) + { + if (grp->GetLeaderGUID() != GetPlayer()->GetGUID()) + return; + else + sLFGMgr.Leave(GetPlayer(), grp); + } + else + sLFGMgr.Leave(GetPlayer()); +} + +void WorldSession::HandleLfgSetRolesOpcode(WorldPacket &recv_data) +{ + sLog.outDebug("CMSG_LFG_SET_ROLES"); + + uint8 roles; + recv_data >> roles; // Player Group Roles + + Group *grp = GetPlayer()->GetGroup(); + if (!grp) + return; + GetPlayer()->m_lookingForGroup.roles = roles; + sLFGMgr.UpdateRoleCheck(grp, GetPlayer()); +} + void WorldSession::HandleSetLfgCommentOpcode(WorldPacket & recv_data) { sLog.outDebug("CMSG_SET_LFG_COMMENT"); @@ -44,7 +112,7 @@ void WorldSession::HandleLfgPartyLockInfoRequestOpcode(WorldPacket &/*recv_data* sLFGMgr.SendLfgPartyInfo(GetPlayer()); } -void WorldSession::SendLfgUpdatePlayer(uint8 updateType, uint32 dungeonEntry /* = 0*/) +void WorldSession::SendLfgUpdatePlayer(uint8 updateType) { bool queued = false; bool extrainfo = false; @@ -62,7 +130,7 @@ void WorldSession::SendLfgUpdatePlayer(uint8 updateType, uint32 dungeonEntry /* break; } sLog.outDebug("SMSG_LFG_UPDATE_PLAYER"); - WorldPacket data(SMSG_LFG_UPDATE_PLAYER, 1 + 1 + (extrainfo ? 1 : 0) * (1 + 1 + 1 + 1 + !dungeonEntry ? 4 : GetPlayer()->m_lookingForGroup.applyDungeons.size() * 4 + GetPlayer()->m_lookingForGroup.comment.length())); + WorldPacket data(SMSG_LFG_UPDATE_PLAYER, 1 + 1 + (extrainfo ? 1 : 0) * (1 + 1 + 1 + 1 + GetPlayer()->m_lookingForGroup.applyDungeons.size() * 4 + GetPlayer()->m_lookingForGroup.comment.length())); data << uint8(updateType); // Lfg Update type data << uint8(extrainfo); // Extra info if (extrainfo) @@ -71,25 +139,17 @@ void WorldSession::SendLfgUpdatePlayer(uint8 updateType, uint32 dungeonEntry /* data << uint8(0); // unk - Always 0 data << uint8(0); // unk - Always 0 - if (dungeonEntry) - { - data << uint8(1); - data << uint32(dungeonEntry); - } - else - { - uint8 size = GetPlayer()->m_lookingForGroup.applyDungeons.size(); - data << uint8(size); + uint8 size = GetPlayer()->m_lookingForGroup.applyDungeons.size(); + data << uint8(size); - for (LfgDungeonSet::const_iterator it = GetPlayer()->m_lookingForGroup.applyDungeons.begin(); it != GetPlayer()->m_lookingForGroup.applyDungeons.end(); ++it) - data << uint32(*it); - } + for (LfgDungeonSet::const_iterator it = GetPlayer()->m_lookingForGroup.applyDungeons.begin(); it != GetPlayer()->m_lookingForGroup.applyDungeons.end(); ++it) + data << uint32(*it); data << GetPlayer()->m_lookingForGroup.comment; } SendPacket(&data); } -void WorldSession::SendLfgUpdateParty(uint8 updateType, uint32 dungeonEntry /* = 0*/) +void WorldSession::SendLfgUpdateParty(uint8 updateType) { bool join = false; bool extrainfo = false; @@ -116,7 +176,7 @@ void WorldSession::SendLfgUpdateParty(uint8 updateType, uint32 dungeonEntry /* = } sLog.outDebug("SMSG_LFG_UPDATE_PARTY"); - WorldPacket data(SMSG_LFG_UPDATE_PARTY, 1 + 1 + (extrainfo ? 1 : 0) * (1 + 1 + 1 + 1 + 1 + !dungeonEntry ? 4 : GetPlayer()->m_lookingForGroup.applyDungeons.size() * 4 + GetPlayer()->m_lookingForGroup.comment.length())); + WorldPacket data(SMSG_LFG_UPDATE_PARTY, 1 + 1 + (extrainfo ? 1 : 0) * (1 + 1 + 1 + 1 + 1 + GetPlayer()->m_lookingForGroup.applyDungeons.size() * 4 + GetPlayer()->m_lookingForGroup.comment.length())); data << uint8(updateType); // Lfg Update type data << uint8(extrainfo); // Extra info if (extrainfo) @@ -125,21 +185,67 @@ void WorldSession::SendLfgUpdateParty(uint8 updateType, uint32 dungeonEntry /* = data << uint8(queued); // Join the queue data << uint8(0); // unk - Always 0 data << uint8(0); // unk - Always 0 + for (uint8 i = 0; i < 3; ++i) + data << uint8(0); // unk - Always 0 - if (dungeonEntry) - { - data << uint8(1); - data << uint32(dungeonEntry); - } - else - { - uint8 size = GetPlayer()->m_lookingForGroup.applyDungeons.size(); - data << uint8(size); + uint8 size = GetPlayer()->m_lookingForGroup.applyDungeons.size(); + data << uint8(size); + + for (LfgDungeonSet::const_iterator it = GetPlayer()->m_lookingForGroup.applyDungeons.begin(); it != GetPlayer()->m_lookingForGroup.applyDungeons.end(); ++it) + data << uint32(*it); - for (LfgDungeonSet::const_iterator it = GetPlayer()->m_lookingForGroup.applyDungeons.begin(); it != GetPlayer()->m_lookingForGroup.applyDungeons.end(); ++it) - data << uint32(*it); - } data << GetPlayer()->m_lookingForGroup.comment; } SendPacket(&data); } + +void WorldSession::SendLfgRoleChosen(uint64 guid, uint8 roles) +{ + sLog.outDebug("SMSG_LFG_ROLE_CHOSEN"); + + WorldPacket data(SMSG_LFG_ROLE_CHOSEN); + data << uint64(guid); // Guid + data << uint8(roles > 0); // Ready + data << uint32(roles); // Roles + SendPacket(&data); +} + +void WorldSession::SendLfgJoinResult(uint8 checkResult, uint8 checkValue) +{ + if (checkResult == LFG_JOIN_PARTY_NOT_MEET_REQS) // Should never happen - its handled in Mgr + return; + + sLog.outDebug("SMSG_LFG_JOIN_RESULT"); + + WorldPacket data(SMSG_LFG_JOIN_RESULT); + data << uint32(checkResult); // Check Result + data << uint32(checkValue); // Check Value + SendPacket(&data); +} + +void WorldSession::SendLfgQueueStatus(uint32 dungeon, int32 waitTime, int32 avgWaitTime, int32 waitTimeTanks, int32 waitTimeHealer, int32 waitTimeDps, uint32 queuedTime, uint8 tanks, uint8 healers, uint8 dps) +{ + sLog.outDebug("SMSG_LFG_QUEUE_STATUS"); + WorldPacket data(SMSG_LFG_QUEUE_STATUS); + + data << uint32(dungeon); // Dungeon + data << uint32(avgWaitTime); // Average Wait time + data << uint32(waitTime); // Wait Time + data << uint32(waitTimeTanks); // Wait Tanks + data << uint32(waitTimeHealer); // Wait Healers + data << uint32(waitTimeDps); // Wait Dps + data << uint8(tanks); // Tanks needed + data << uint8(healers); // Healers needed + data << uint8(dps); // Dps needed + data << uint32(queuedTime); // Player wait time in queue + SendPacket(&data); +} + +void WorldSession::SendLfgUpdateSearch(bool update) +{ + sLog.outDebug("SMSG_LFG_UPDATE_SEARCH"); + + WorldPacket data(SMSG_LFG_UPDATE_SEARCH); + data << uint8(update); // In Lfg Queue? + SendPacket(&data); +} |