diff options
-rw-r--r-- | src/server/game/DungeonFinding/LFG.h | 3 | ||||
-rw-r--r-- | src/server/game/DungeonFinding/LFGMgr.cpp | 73 | ||||
-rw-r--r-- | src/server/game/DungeonFinding/LFGMgr.h | 12 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 |
4 files changed, 72 insertions, 18 deletions
diff --git a/src/server/game/DungeonFinding/LFG.h b/src/server/game/DungeonFinding/LFG.h index 524f13d9790..3c644f40690 100644 --- a/src/server/game/DungeonFinding/LFG.h +++ b/src/server/game/DungeonFinding/LFG.h @@ -52,8 +52,9 @@ typedef std::set<uint32> LfgDungeonSet; struct LookingForGroup { - LookingForGroup(): roles(0) {} + LookingForGroup(): roles(0), update(true) {} uint8 roles; + bool update; LfgDungeonSet applyDungeons; // Dungeons the player have applied for LfgDungeonSet donerandomDungeons; // Finished random Dungeons (to calculate the bonus); std::string comment; diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 4ff7e80a06c..0749a320d05 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -29,10 +29,14 @@ LFGMgr::LFGMgr() { m_QueueTimer = 0; - m_avgWaitTime = -1; - m_waitTimeTanks = -1; - m_waitTimeHealer = -1; - m_waitTimeDps = -1; + m_WaitTimeAvg = -1; + m_WaitTimeTank = -1; + m_WaitTimeHealer = -1; + m_WaitTimeDps = -1; + m_NumWaitTimeAvg = 0; + m_NumWaitTimeTank = 0; + m_NumWaitTimeHealer = 0; + m_NumWaitTimeDps = 0; m_update = true; m_lfgProposalId = 1; } @@ -330,23 +334,23 @@ void LFGMgr::Update(uint32 diff) if (role & ROLE_TANK) { if (role & ROLE_HEALER || role & ROLE_DAMAGE) - waitTime = m_avgWaitTime; + waitTime = m_WaitTimeAvg; else - waitTime = m_waitTimeTanks; + waitTime = m_WaitTimeTank; } else if (role & ROLE_HEALER) { if (role & ROLE_DAMAGE) - waitTime = m_avgWaitTime; + waitTime = m_WaitTimeAvg; else - waitTime = m_waitTimeHealer; + waitTime = m_WaitTimeHealer; } else if (role & ROLE_DAMAGE) - waitTime = m_waitTimeDps; + waitTime = m_WaitTimeDps; for (LfgRolesMap::const_iterator itPlayer = queue->roles.begin(); itPlayer != queue->roles.end(); ++itPlayer) if (Player * plr = sObjectMgr.GetPlayer(itPlayer->first)) - plr->GetSession()->SendLfgQueueStatus(dungeonId, waitTime, m_avgWaitTime, m_waitTimeTanks, m_waitTimeHealer, m_waitTimeDps, queuedTime, queue->tanks, queue->healers, queue->dps); + plr->GetSession()->SendLfgQueueStatus(dungeonId, waitTime, m_WaitTimeAvg, m_WaitTimeTank, m_WaitTimeHealer, m_WaitTimeDps, queuedTime, queue->tanks, queue->healers, queue->dps); } } else @@ -506,6 +510,9 @@ void LFGMgr::Join(Player *plr) /// <param name="Group *">Group (could be NULL)</param> void LFGMgr::Leave(Player *plr, Group *grp /* = NULL*/) { + if (plr && !plr->GetLfgUpdate()) + return; + uint64 guid = grp ? grp->GetGUID() : plr ? plr->GetGUID() : 0; // Remove from Role Checks @@ -1105,6 +1112,11 @@ void LFGMgr::UpdateProposal(uint32 proposalId, uint32 lowGuid, uint8 accept) { bool sendUpdate = pProposal->state != LFG_PROPOSAL_SUCCESS; pProposal->state = LFG_PROPOSAL_SUCCESS; + time_t joinTime = time_t(time(NULL)); + uint8 role = 0; + int32 waitTime = -1; + LfgQueueInfoMap::iterator itQueue; + uint64 guid = 0; // Create a new group (if needed) Group *grp = sObjectMgr.GetGroupByGUID(pProposal->groupLowGuid); @@ -1113,15 +1125,19 @@ void LFGMgr::UpdateProposal(uint32 proposalId, uint32 lowGuid, uint8 accept) plr = *it; if (sendUpdate) SendUpdateProposal(plr, proposalId, pProposal); - //plr->SetLfgSendUpdates(false); + plr->SetLfgUpdate(false); if (plr->GetGroup()) { + guid = plr->GetGroup()->GetGUID(); + plr->GetSession()->SendLfgUpdateParty(LFG_UPDATETYPE_GROUP_FOUND); if (plr->GetGroup() != grp) plr->RemoveFromGroup(); - plr->GetSession()->SendLfgUpdateParty(LFG_UPDATETYPE_GROUP_FOUND); } else + { + guid = plr->GetGUID(); plr->GetSession()->SendLfgUpdatePlayer(LFG_UPDATETYPE_GROUP_FOUND); + } if (!grp) { @@ -1132,8 +1148,38 @@ void LFGMgr::UpdateProposal(uint32 proposalId, uint32 lowGuid, uint8 accept) } else if (plr->GetGroup() != grp) grp->AddMember(plr->GetGUID(), plr->GetName()); + plr->SetLfgUpdate(true); + // Update timers + role = plr->GetLfgRoles(); + itQueue = m_QueueInfoMap.find(guid); + if (itQueue == m_QueueInfoMap.end()) + { + sLog.outError("LFGMgr::UpdateProposal: Queue info for guid " UI64FMTD " not found!", guid); + waitTime = -1; + } + else + { + waitTime = int32(joinTime - itQueue->second->joinTime); + + if (role & ROLE_TANK) + { + if (role & ROLE_HEALER || role & ROLE_DAMAGE) + m_WaitTimeAvg = int32((m_WaitTimeAvg * m_NumWaitTimeAvg + waitTime) / ++m_NumWaitTimeAvg); + else + m_WaitTimeTank = int32((m_WaitTimeTank * m_NumWaitTimeTank + waitTime) / ++m_NumWaitTimeTank); + } + else if (role & ROLE_HEALER) + { + if (role & ROLE_DAMAGE) + m_WaitTimeAvg = int32((m_WaitTimeAvg * m_NumWaitTimeAvg + waitTime) / ++m_NumWaitTimeAvg); + else + m_WaitTimeHealer = int32((m_WaitTimeHealer * m_NumWaitTimeHealer + waitTime) / ++m_NumWaitTimeHealer); + } + else if (role & ROLE_DAMAGE) + m_WaitTimeDps = int32((m_WaitTimeDps * m_NumWaitTimeDps + waitTime) / ++m_NumWaitTimeDps); + } + grp->SetLfgRoles(plr->GetGUID(), pProposal->players[plr->GetGUIDLow()]->role); - //plr->SetLfgSendUpdates(true); } // Set the dungeon difficulty @@ -1208,6 +1254,7 @@ void LFGMgr::RemoveProposal(LfgProposalMap::iterator itProposal, LfgUpdateType t updateType = LFG_UPDATETYPE_REMOVED_FROM_QUEUE; else { + itQueue->second->joinTime = time_t(time(NULL)); AddGuidToNewQueue(guid); updateType = LFG_UPDATETYPE_ADDED_TO_QUEUE; } diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h index 1c8e923db8b..2820d1c7ed2 100644 --- a/src/server/game/DungeonFinding/LFGMgr.h +++ b/src/server/game/DungeonFinding/LFGMgr.h @@ -351,10 +351,14 @@ class LFGMgr LfgRoleCheckMap m_RoleChecks; // Current Role checks uint32 m_QueueTimer; // used to check interval of update uint32 m_lfgProposalId; // used as internal counter for proposals - int32 m_avgWaitTime; - int32 m_waitTimeTanks; - int32 m_waitTimeHealer; - int32 m_waitTimeDps; + int32 m_WaitTimeAvg; + int32 m_WaitTimeTank; + int32 m_WaitTimeHealer; + int32 m_WaitTimeDps; + uint32 m_NumWaitTimeAvg; + uint32 m_NumWaitTimeTank; + uint32 m_NumWaitTimeHealer; + uint32 m_NumWaitTimeDps; bool m_update; }; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 025ce14c737..65cc4783ff7 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2241,6 +2241,8 @@ class Player : public Unit, public GridObject<Player> void SetLfgComment(std::string _comment) { m_LookingForGroup.comment = _comment; } uint8 GetLfgRoles() { return m_LookingForGroup.roles; } void SetLfgRoles(uint8 _roles) { m_LookingForGroup.roles = _roles; } + bool GetLfgUpdate() { return m_LookingForGroup.update; } + void SetLfgUpdate(bool update) { m_LookingForGroup.update = update; } // Temporarily removed pet cache uint32 GetTemporaryUnsummonedPetNumber() const { return m_temporaryUnsummonedPetNumber; } |