Dungeon Finder: Fix proposals when joining the queue as LfgGroup with 5 members. Success was never possible
This fixes a inconsistency and a possible deadloop --HG-- branch : trunk
This commit is contained in:
@@ -259,8 +259,10 @@ void LFGMgr::Update(uint32 diff)
|
|||||||
|
|
||||||
m_Proposals[++m_lfgProposalId] = pProposal;
|
m_Proposals[++m_lfgProposalId] = pProposal;
|
||||||
|
|
||||||
|
uint32 lowGuid = 0;
|
||||||
for (LfgProposalPlayerMap::const_iterator itPlayers = pProposal->players.begin(); itPlayers != pProposal->players.end(); ++itPlayers)
|
for (LfgProposalPlayerMap::const_iterator itPlayers = pProposal->players.begin(); itPlayers != pProposal->players.end(); ++itPlayers)
|
||||||
{
|
{
|
||||||
|
lowGuid = itPlayers->first;
|
||||||
if (Player *plr = sObjectMgr.GetPlayer(itPlayers->first))
|
if (Player *plr = sObjectMgr.GetPlayer(itPlayers->first))
|
||||||
{
|
{
|
||||||
if (plr->GetGroup())
|
if (plr->GetGroup())
|
||||||
@@ -271,6 +273,9 @@ void LFGMgr::Update(uint32 diff)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pProposal->state == LFG_PROPOSAL_SUCCESS)
|
||||||
|
UpdateProposal(m_lfgProposalId, lowGuid, 1);
|
||||||
|
|
||||||
// Clean up
|
// Clean up
|
||||||
for (LfgProposalList::iterator it = proposals.begin(); it != proposals.end(); ++it)
|
for (LfgProposalList::iterator it = proposals.begin(); it != proposals.end(); ++it)
|
||||||
{
|
{
|
||||||
@@ -797,19 +802,27 @@ void LFGMgr::FindNewGroups(LfgGuidList &check, LfgGuidList all, LfgProposalList
|
|||||||
}
|
}
|
||||||
pProposal->leaderLowGuid = newLeaderLowGuid;
|
pProposal->leaderLowGuid = newLeaderLowGuid;
|
||||||
|
|
||||||
|
uint8 numAccept = 0;
|
||||||
for (itPlayers = players.begin(); itPlayers != players.end(); ++itPlayers)
|
for (itPlayers = players.begin(); itPlayers != players.end(); ++itPlayers)
|
||||||
{
|
{
|
||||||
lowGuid = (*itPlayers)->GetGUIDLow();
|
lowGuid = (*itPlayers)->GetGUIDLow();
|
||||||
ppPlayer = new LfgProposalPlayer();
|
ppPlayer = new LfgProposalPlayer();
|
||||||
if ((*itPlayers)->GetGroup())
|
Group *grp = (*itPlayers)->GetGroup();
|
||||||
|
if (grp)
|
||||||
|
{
|
||||||
|
ppPlayer->groupLowGuid = grp->GetLowGUID();
|
||||||
|
if (grp->GetLfgDungeonEntry() == selectedDungeon && ppPlayer->groupLowGuid == pProposal->groupLowGuid) // Player from existing group, autoaccept
|
||||||
{
|
{
|
||||||
ppPlayer->groupLowGuid = (*itPlayers)->GetGroup()->GetLowGUID();
|
|
||||||
if (ppPlayer->groupLowGuid == pProposal->groupLowGuid) // Player from existing group, autoaccept
|
|
||||||
ppPlayer->accept = 1;
|
ppPlayer->accept = 1;
|
||||||
|
++numAccept;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ppPlayer->role = rolesMap[lowGuid];
|
ppPlayer->role = rolesMap[lowGuid];
|
||||||
pProposal->players[lowGuid] = ppPlayer;
|
pProposal->players[lowGuid] = ppPlayer;
|
||||||
}
|
}
|
||||||
|
if (numAccept == MAXGROUPSIZE)
|
||||||
|
pProposal->state = LFG_PROPOSAL_SUCCESS;
|
||||||
|
|
||||||
if (!proposals)
|
if (!proposals)
|
||||||
proposals = new LfgProposalList();
|
proposals = new LfgProposalList();
|
||||||
proposals->push_back(pProposal);
|
proposals->push_back(pProposal);
|
||||||
@@ -1088,6 +1101,7 @@ void LFGMgr::UpdateProposal(uint32 proposalId, uint32 lowGuid, uint8 accept)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
bool sendUpdate = pProposal->state != LFG_PROPOSAL_SUCCESS;
|
||||||
pProposal->state = LFG_PROPOSAL_SUCCESS;
|
pProposal->state = LFG_PROPOSAL_SUCCESS;
|
||||||
|
|
||||||
// Create a new group (if needed)
|
// Create a new group (if needed)
|
||||||
@@ -1095,6 +1109,7 @@ void LFGMgr::UpdateProposal(uint32 proposalId, uint32 lowGuid, uint8 accept)
|
|||||||
for (LfgPlayerList::const_iterator it = players.begin(); it != players.end(); ++it)
|
for (LfgPlayerList::const_iterator it = players.begin(); it != players.end(); ++it)
|
||||||
{
|
{
|
||||||
plr = *it;
|
plr = *it;
|
||||||
|
if (sendUpdate)
|
||||||
SendUpdateProposal(plr, proposalId, pProposal);
|
SendUpdateProposal(plr, proposalId, pProposal);
|
||||||
//plr->SetLfgSendUpdates(false);
|
//plr->SetLfgSendUpdates(false);
|
||||||
if (plr->GetGroup())
|
if (plr->GetGroup())
|
||||||
@@ -1429,6 +1444,7 @@ void LFGMgr::SendUpdateProposal(Player *plr, uint32 proposalId, LfgProposal *pPr
|
|||||||
uint32 pLowGroupGuid = ppPlayer->groupLowGuid;
|
uint32 pLowGroupGuid = ppPlayer->groupLowGuid;
|
||||||
uint32 dLowGuid = pProp->groupLowGuid;
|
uint32 dLowGuid = pProp->groupLowGuid;
|
||||||
uint32 dungeonId = pProp->dungeonId;
|
uint32 dungeonId = pProp->dungeonId;
|
||||||
|
uint32 isSameDungeon = plr->GetGroup() && plr->GetGroup()->GetLfgDungeonEntry() == dungeonId;
|
||||||
|
|
||||||
sLog.outDebug("SMSG_LFG_PROPOSAL_UPDATE");
|
sLog.outDebug("SMSG_LFG_PROPOSAL_UPDATE");
|
||||||
WorldPacket data(SMSG_LFG_PROPOSAL_UPDATE, 4 + 1 + 4 + 4 + 1 + 1 + pProp->players.size() * (4 + 1 + 1 + 1 + 1 +1));
|
WorldPacket data(SMSG_LFG_PROPOSAL_UPDATE, 4 + 1 + 4 + 4 + 1 + 1 + pProp->players.size() * (4 + 1 + 1 + 1 + 1 +1));
|
||||||
@@ -1440,7 +1456,7 @@ void LFGMgr::SendUpdateProposal(Player *plr, uint32 proposalId, LfgProposal *pPr
|
|||||||
data << uint8(pProp->state); // Result state
|
data << uint8(pProp->state); // Result state
|
||||||
data << uint32(proposalId); // Internal Proposal ID
|
data << uint32(proposalId); // Internal Proposal ID
|
||||||
data << uint32(0); // Bosses killed - FIXME
|
data << uint32(0); // Bosses killed - FIXME
|
||||||
data << uint8(pLowGroupGuid && pLowGroupGuid == dLowGuid); // Silent (show client window)
|
data << uint8(isSameDungeon); // Silent (show client window)
|
||||||
data << uint8(pProp->players.size()); // Group size
|
data << uint8(pProp->players.size()); // Group size
|
||||||
|
|
||||||
for (itPlayer = pProp->players.begin(); itPlayer != pProp->players.end(); ++itPlayer)
|
for (itPlayer = pProp->players.begin(); itPlayer != pProp->players.end(); ++itPlayer)
|
||||||
|
|||||||
Reference in New Issue
Block a user