Dungeon Finder: Update wait time after a successful proposal

--HG--
branch : trunk
This commit is contained in:
Spp
2010-08-18 00:30:17 +02:00
parent 7a13043af4
commit 1ab2bd6d58
4 changed files with 72 additions and 18 deletions

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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;
};

View File

@@ -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; }