aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSpp <none@none>2010-08-18 00:30:17 +0200
committerSpp <none@none>2010-08-18 00:30:17 +0200
commit1ab2bd6d58adf35090ca3a9ef82eee00a14ff507 (patch)
treea33767024aa46203aa294e609d0ffcfb243f525e /src
parent7a13043af4f6f7372a6fae0fa67fb6147f5d7b3e (diff)
Dungeon Finder: Update wait time after a successful proposal
--HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/server/game/DungeonFinding/LFG.h3
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.cpp73
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.h12
-rw-r--r--src/server/game/Entities/Player/Player.h2
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; }