mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-18 00:18:43 +01:00
Dungeon Finder: Update wait time after a successful proposal
--HG-- branch : trunk
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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; }
|
||||
|
||||
Reference in New Issue
Block a user