diff options
-rwxr-xr-x | src/server/game/DungeonFinding/LFGMgr.cpp | 133 | ||||
-rwxr-xr-x | src/server/game/DungeonFinding/LFGMgr.h | 7 | ||||
-rwxr-xr-x | src/server/game/Server/Protocol/Handlers/LFGHandler.cpp | 14 |
3 files changed, 71 insertions, 83 deletions
diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index ec4a18075ca..b11d8194f90 100755 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -201,31 +201,27 @@ void LFGMgr::Update(uint32 diff) time_t currTime = time(NULL); // Remove obsolete role checks - LfgJoinResultData joinData; - joinData.result = LFG_JOIN_FAILED; - joinData.state = LFG_ROLECHECK_MISSING_ROLE; - for (LfgRoleCheckMap::iterator it = m_RoleChecks.begin(); it != m_RoleChecks.end();) { LfgRoleCheckMap::iterator itRoleCheck = it++; - LfgRoleCheck* pRoleCheck = itRoleCheck->second; - if (currTime < pRoleCheck->cancelTime) + LfgRoleCheck* roleCheck = itRoleCheck->second; + if (currTime < roleCheck->cancelTime) continue; - pRoleCheck->state = LFG_ROLECHECK_MISSING_ROLE; + roleCheck->state = LFG_ROLECHECK_MISSING_ROLE; - for (LfgRolesMap::const_iterator itRoles = pRoleCheck->roles.begin(); itRoles != pRoleCheck->roles.end(); ++itRoles) + for (LfgRolesMap::const_iterator itRoles = roleCheck->roles.begin(); itRoles != roleCheck->roles.end(); ++itRoles) { uint64 guid = itRoles->first; ClearState(guid); if (Player* plr = sObjectMgr->GetPlayer(guid)) { - plr->GetSession()->SendLfgRoleCheckUpdate(pRoleCheck); + plr->GetSession()->SendLfgRoleCheckUpdate(roleCheck); - if (itRoles->first == pRoleCheck->leader) - plr->GetSession()->SendLfgJoinResult(joinData); + if (itRoles->first == roleCheck->leader) + plr->GetSession()->SendLfgJoinResult(LfgJoinResultData(LFG_JOIN_FAILED, LFG_ROLECHECK_MISSING_ROLE)); } } - delete pRoleCheck; + delete roleCheck; m_RoleChecks.erase(itRoleCheck); } @@ -283,16 +279,14 @@ void LFGMgr::Update(uint32 diff) if (Player* plr = sObjectMgr->GetPlayer(itPlayers->first)) { Group *grp = plr->GetGroup(); - LfgDungeonSet dungeons = GetSelectedDungeons(guid); - LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_PROPOSAL_BEGIN, &dungeons, GetComment(guid)); if (grp) { uint64 gguid = grp->GetGUID(); SetState(gguid, LFG_STATE_PROPOSAL); - plr->GetSession()->SendLfgUpdateParty(updateData); + plr->GetSession()->SendLfgUpdateParty(LfgUpdateData(LFG_UPDATETYPE_PROPOSAL_BEGIN, GetSelectedDungeons(guid), GetComment(guid))); } else - plr->GetSession()->SendLfgUpdatePlayer(updateData); + plr->GetSession()->SendLfgUpdatePlayer(LfgUpdateData(LFG_UPDATETYPE_PROPOSAL_BEGIN, GetSelectedDungeons(guid), GetComment(guid))); plr->GetSession()->SendLfgUpdateProposal(m_lfgProposalId, pProposal); } } @@ -519,7 +513,7 @@ void LFGMgr::Join(Player* plr, uint8 roles, const LfgDungeonSet& selectedDungeon LfgDungeonSet playerDungeons = GetSelectedDungeons(guid); if (playerDungeons == dungeons) // Joining the same dungeons -- Send OK { - LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, &dungeons, comment); + LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, dungeons, comment); plr->GetSession()->SendLfgJoinResult(joinData); // Default value of joinData.result = LFG_JOIN_OK if (grp) { @@ -641,13 +635,13 @@ void LFGMgr::Join(Player* plr, uint8 roles, const LfgDungeonSet& selectedDungeon if (grp) // Begin rolecheck { // Create new rolecheck - LfgRoleCheck* pRoleCheck = new LfgRoleCheck(); - pRoleCheck->cancelTime = time_t(time(NULL)) + LFG_TIME_ROLECHECK; - pRoleCheck->state = LFG_ROLECHECK_INITIALITING; - pRoleCheck->leader = plr->GetGUID(); - pRoleCheck->dungeons = dungeons; - pRoleCheck->rDungeonId = rDungeonId; - m_RoleChecks[grp->GetGUID()] = pRoleCheck; + LfgRoleCheck* roleCheck = new LfgRoleCheck(); + roleCheck->cancelTime = time_t(time(NULL)) + LFG_TIME_ROLECHECK; + roleCheck->state = LFG_ROLECHECK_INITIALITING; + roleCheck->leader = guid; + roleCheck->dungeons = dungeons; + roleCheck->rDungeonId = rDungeonId; + m_RoleChecks[gguid] = roleCheck; if (rDungeonId) { @@ -655,10 +649,9 @@ void LFGMgr::Join(Player* plr, uint8 roles, const LfgDungeonSet& selectedDungeon dungeons.insert(rDungeonId); } - SetRoles(guid, roles); SetState(gguid, LFG_STATE_ROLECHECK); // Send update to player - LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_JOIN_PROPOSAL, &dungeons, comment); + LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_JOIN_PROPOSAL, dungeons, comment); for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next()) { if (Player* plrg = itr->getSource()) @@ -668,11 +661,11 @@ void LFGMgr::Join(Player* plr, uint8 roles, const LfgDungeonSet& selectedDungeon SetState(pguid, LFG_STATE_ROLECHECK); if (!isContinue) SetSelectedDungeons(pguid, dungeons); - pRoleCheck->roles[pguid] = 0; + roleCheck->roles[pguid] = 0; } } // Update leader role - UpdateRoleCheck(grp, plr, true); + UpdateRoleCheck(gguid, guid, roles); } else // Add player to queue { @@ -691,7 +684,7 @@ void LFGMgr::Join(Player* plr, uint8 roles, const LfgDungeonSet& selectedDungeon // Send update to player plr->GetSession()->SendLfgJoinResult(joinData); - plr->GetSession()->SendLfgUpdatePlayer(LfgUpdateData(LFG_UPDATETYPE_JOIN_PROPOSAL, &dungeons, comment)); + plr->GetSession()->SendLfgUpdatePlayer(LfgUpdateData(LFG_UPDATETYPE_JOIN_PROPOSAL, dungeons, comment)); SetState(gguid, LFG_STATE_QUEUED); SetRoles(guid, roles); if (!isContinue) @@ -750,7 +743,7 @@ void LFGMgr::Leave(Player* plr, Group* grp /* = NULL*/) break; case LFG_STATE_ROLECHECK: if (grp) - UpdateRoleCheck(grp); // No player to update role = LFG_ROLECHECK_ABORTED + UpdateRoleCheck(guid); // No player to update role = LFG_ROLECHECK_ABORTED break; case LFG_STATE_PROPOSAL: { @@ -1049,74 +1042,72 @@ bool LFGMgr::CheckCompatibility(LfgGuidList check, LfgProposal*& pProposal) /** Update the Role check info with the player selected role. - @param[in] grp Group to update rolecheck - @param[in] plr Player to update role (NULL = Rolecheck Failed) - @param[in] newRoleCheck Determines if its a new rolecheck (Default false) + @param[in] grp Group guid to update rolecheck + @param[in] guid Player guid (0 = rolecheck failed) + @param[in] roles Player selected roles */ -void LFGMgr::UpdateRoleCheck(Group* grp, Player* plr /* = NULL*/, bool newRoleCheck /* = false */) +void LFGMgr::UpdateRoleCheck(uint64& gguid, uint64 guid /* = 0 */, uint8 roles /* = ROLE_NONE */) { - if (!grp) + if (!gguid) return; LfgRolesMap check_roles; - LfgRoleCheckMap::iterator itRoleCheck = m_RoleChecks.find(grp->GetGUID()); + LfgRoleCheckMap::iterator itRoleCheck = m_RoleChecks.find(gguid); if (itRoleCheck == m_RoleChecks.end()) return; - uint64 guid = plr ? plr->GetGUID() : 0; - uint8 roles = guid ? GetRoles(guid) : 0; - LfgRoleCheck* pRoleCheck = itRoleCheck->second; + LfgRoleCheck* roleCheck = itRoleCheck->second; + bool sendRoleChosen = roleCheck->state != LFG_ROLECHECK_DEFAULT && guid; + if (!guid) - pRoleCheck->state = LFG_ROLECHECK_ABORTED; + roleCheck->state = LFG_ROLECHECK_ABORTED; else if (roles < ROLE_TANK) // Player selected no role. - pRoleCheck->state = LFG_ROLECHECK_NO_ROLE; + roleCheck->state = LFG_ROLECHECK_NO_ROLE; else { - pRoleCheck->roles[guid] = roles; + roleCheck->roles[guid] = roles; // Check if all players have selected a role - LfgRolesMap::const_iterator itRoles = pRoleCheck->roles.begin(); - while (itRoles != pRoleCheck->roles.end() && itRoles->second != ROLE_NONE) + LfgRolesMap::const_iterator itRoles = roleCheck->roles.begin(); + while (itRoles != roleCheck->roles.end() && itRoles->second != ROLE_NONE) ++itRoles; - if (itRoles == pRoleCheck->roles.end()) + if (itRoles == roleCheck->roles.end()) { // use temporal var to check roles, CheckGroupRoles modifies the roles - check_roles = pRoleCheck->roles; - pRoleCheck->state = CheckGroupRoles(check_roles) ? LFG_ROLECHECK_FINISHED : LFG_ROLECHECK_WRONG_ROLES; + check_roles = roleCheck->roles; + roleCheck->state = CheckGroupRoles(check_roles) ? LFG_ROLECHECK_FINISHED : LFG_ROLECHECK_WRONG_ROLES; } } uint8 team = 0; LfgDungeonSet dungeons; - if (pRoleCheck->rDungeonId) - dungeons.insert(pRoleCheck->rDungeonId); + if (roleCheck->rDungeonId) + dungeons.insert(roleCheck->rDungeonId); else - dungeons = pRoleCheck->dungeons; + dungeons = roleCheck->dungeons; - LfgJoinResultData joinData = LfgJoinResultData(LFG_JOIN_FAILED, pRoleCheck->state); - for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next()) + LfgJoinResultData joinData = LfgJoinResultData(LFG_JOIN_FAILED, roleCheck->state); + for (LfgRolesMap::const_iterator it = roleCheck->roles.begin(); it != roleCheck->roles.end(); ++it) { - Player* plrg = itr->getSource(); - if (!plrg) - continue; - uint64 pguid = plrg->GetGUID(); + uint64 pguid = it->first; + Player* plrg = sObjectMgr->GetPlayer(pguid); team = uint8(plrg->GetTeam()); WorldSession* session = plrg->GetSession(); - if (!newRoleCheck && plr) + if (!sendRoleChosen) session->SendLfgRoleChosen(guid, roles); - session->SendLfgRoleCheckUpdate(pRoleCheck); + session->SendLfgRoleCheckUpdate(roleCheck); - switch(pRoleCheck->state) + switch(roleCheck->state) { case LFG_ROLECHECK_INITIALITING: continue; case LFG_ROLECHECK_FINISHED: SetState(pguid, LFG_STATE_QUEUED); - session->SendLfgUpdateParty(LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, &dungeons, GetComment(pguid))); + session->SendLfgUpdateParty(LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, dungeons, GetComment(pguid))); break; default: - if (grp->GetLeaderGUID() == pguid) + if (roleCheck->leader == pguid) session->SendLfgJoinResult(joinData); session->SendLfgUpdateParty(LfgUpdateData(LFG_UPDATETYPE_ROLECHECK_FAILED)); ClearState(pguid); @@ -1124,15 +1115,13 @@ void LFGMgr::UpdateRoleCheck(Group* grp, Player* plr /* = NULL*/, bool newRoleCh } } - uint64 gguid = grp->GetGUID(); - if (pRoleCheck->state == LFG_ROLECHECK_FINISHED) + if (roleCheck->state == LFG_ROLECHECK_FINISHED) { - SetState(gguid, LFG_STATE_QUEUED); LfgQueueInfo* pqInfo = new LfgQueueInfo(); pqInfo->joinTime = time_t(time(NULL)); - pqInfo->roles = pRoleCheck->roles; - pqInfo->dungeons = pRoleCheck->dungeons; + pqInfo->roles = roleCheck->roles; + pqInfo->dungeons = roleCheck->dungeons; // Set queue roles needed - As we are using check_roles will not have more that 1 tank, 1 healer, 3 dps for (LfgRolesMap::const_iterator it = check_roles.begin(); it != check_roles.end(); ++it) @@ -1150,11 +1139,11 @@ void LFGMgr::UpdateRoleCheck(Group* grp, Player* plr /* = NULL*/, bool newRoleCh AddToQueue(gguid, team); } - if (pRoleCheck->state != LFG_ROLECHECK_INITIALITING) + if (roleCheck->state != LFG_ROLECHECK_INITIALITING) { - if (pRoleCheck->state != LFG_ROLECHECK_FINISHED) + if (roleCheck->state != LFG_ROLECHECK_FINISHED) RestoreState(gguid); - delete pRoleCheck; + delete roleCheck; m_RoleChecks.erase(itRoleCheck); } } @@ -1545,17 +1534,15 @@ void LFGMgr::RemoveProposal(LfgProposalMap::iterator itProposal, LfgUpdateType t } else { - LfgDungeonSet dungeons = GetSelectedDungeons(guid); - LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, &dungeons, GetComment(guid)); sLog.outDebug("LFGMgr::RemoveProposal: Readding [" UI64FMTD "] to queue.", guid); SetState(guid, LFG_STATE_QUEUED); if (grp) { SetState(gguid, LFG_STATE_QUEUED); - plr->GetSession()->SendLfgUpdateParty(updateData); + plr->GetSession()->SendLfgUpdateParty(LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, GetSelectedDungeons(guid), GetComment(guid))); } else - plr->GetSession()->SendLfgUpdatePlayer(updateData); + plr->GetSession()->SendLfgUpdatePlayer(LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, GetSelectedDungeons(guid), GetComment(guid))); } } diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h index 99bad5a6f73..c182422ed8f 100755 --- a/src/server/game/DungeonFinding/LFGMgr.h +++ b/src/server/game/DungeonFinding/LFGMgr.h @@ -157,11 +157,12 @@ struct LfgJoinResultData // Data needed by SMSG_LFG_UPDATE_PARTY and SMSG_LFG_UPDATE_PLAYER struct LfgUpdateData { - LfgUpdateData(LfgUpdateType _type = LFG_UPDATETYPE_DEFAULT, LfgDungeonSet* _dungeons = NULL, std::string _comment = ""): + LfgUpdateData(LfgUpdateType _type = LFG_UPDATETYPE_DEFAULT): updateType(_type), comment("") {} + LfgUpdateData(LfgUpdateType _type, const LfgDungeonSet& _dungeons, std::string _comment): updateType(_type), dungeons(_dungeons), comment(_comment) {} LfgUpdateType updateType; - LfgDungeonSet* dungeons; + LfgDungeonSet dungeons; std::string comment; }; @@ -272,7 +273,7 @@ class LFGMgr void Leave(Player* plr, Group* grp = NULL); // Role Check - void UpdateRoleCheck(Group* grp, Player* plr = NULL, bool newRoleCheck = false); + void UpdateRoleCheck(uint64& gguid, uint64 guid = 0, uint8 roles = ROLE_NONE); // Proposals void UpdateProposal(uint32 proposalId, const uint64& guid, bool accept); diff --git a/src/server/game/Server/Protocol/Handlers/LFGHandler.cpp b/src/server/game/Server/Protocol/Handlers/LFGHandler.cpp index 5ad12742f61..8400ec30646 100755 --- a/src/server/game/Server/Protocol/Handlers/LFGHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/LFGHandler.cpp @@ -115,9 +115,9 @@ void WorldSession::HandleLfgSetRolesOpcode(WorldPacket& recv_data) sLog.outDebug("CMSG_LFG_SET_ROLES [" UI64FMTD "] Not in group", guid); return; } - sLog.outDebug("CMSG_LFG_SET_ROLES [" UI64FMTD "] Roles: %u", guid, roles); - sLFGMgr->SetRoles(guid, roles); - sLFGMgr->UpdateRoleCheck(grp, GetPlayer()); + uint64 gguid = grp->GetGUID(); + sLog.outDebug("CMSG_LFG_SET_ROLES: Group [" UI64FMTD "], Player [" UI64FMTD "], Roles: %u", gguid, guid, roles); + sLFGMgr->UpdateRoleCheck(gguid, guid, roles); } void WorldSession::HandleLfgSetCommentOpcode(WorldPacket& recv_data) @@ -300,7 +300,7 @@ void WorldSession::SendLfgUpdatePlayer(const LfgUpdateData& updateData) } uint64 guid = GetPlayer()->GetGUID(); - uint8 size = updateData.dungeons ? uint8(updateData.dungeons->size()) : 0; + uint8 size = uint8(updateData.dungeons.size()); sLog.outDebug("SMSG_LFG_UPDATE_PLAYER [" UI64FMTD "] updatetype: %u", guid, updateData.updateType); WorldPacket data(SMSG_LFG_UPDATE_PLAYER, 1 + 1 + (extrainfo ? 1 : 0) * (1 + 1 + 1 + 1 + size * 4 + updateData.comment.length())); @@ -314,7 +314,7 @@ void WorldSession::SendLfgUpdatePlayer(const LfgUpdateData& updateData) data << uint8(size); if (size) - for (LfgDungeonSet::const_iterator it = updateData.dungeons->begin(); it != updateData.dungeons->end(); ++it) + for (LfgDungeonSet::const_iterator it = updateData.dungeons.begin(); it != updateData.dungeons.end(); ++it) data << uint32(*it); data << updateData.comment; } @@ -350,7 +350,7 @@ void WorldSession::SendLfgUpdateParty(const LfgUpdateData& updateData) } uint64 guid = GetPlayer()->GetGUID(); - uint8 size = updateData.dungeons ? uint8(updateData.dungeons->size()) : 0; + uint8 size = uint8(updateData.dungeons.size()); sLog.outDebug("SMSG_LFG_UPDATE_PARTY [" UI64FMTD "] updatetype: %u", guid, updateData.updateType); WorldPacket data(SMSG_LFG_UPDATE_PARTY, 1 + 1 + (extrainfo ? 1 : 0) * (1 + 1 + 1 + 1 + 1 + size * 4 + updateData.comment.length())); @@ -367,7 +367,7 @@ void WorldSession::SendLfgUpdateParty(const LfgUpdateData& updateData) data << uint8(size); if (size) - for (LfgDungeonSet::const_iterator it = updateData.dungeons->begin(); it != updateData.dungeons->end(); ++it) + for (LfgDungeonSet::const_iterator it = updateData.dungeons.begin(); it != updateData.dungeons.end(); ++it) data << uint32(*it); data << updateData.comment; } |