aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjackpoz <giacomopoz@gmail.com>2015-03-09 21:30:36 +0100
committerNayd <dnpd.dd@gmail.com>2015-03-18 00:34:51 +0000
commit38c23495b38b786c648ec346b707d049e7a91071 (patch)
tree32041ceb18d98d98f2bb6bc699396216f130cd27
parent812e117b30bbdb86d38cc7ab517196ecf8cc5c7f (diff)
Core/Dungeon Finder: Fix Vote Kick breaking LFG queue
Fix Vote Kick started with party in queue breaking the whole LFG queue. The status of Vote Kick is now storing in a bool variable in LfgGroupData, separated from LfgState of the group/members. If a Vote Kick started with party in queue, the members were not removed from queue correctly and would cause LFG matching system to match these "broken" players but not allowing to start a dungeon. Closes #10191 (cherry picked from commit 22403121fe9c762c82dc32913aeba46a7e76a004)
-rw-r--r--src/server/game/DungeonFinding/LFG.cpp3
-rw-r--r--src/server/game/DungeonFinding/LFG.h4
-rw-r--r--src/server/game/DungeonFinding/LFGGroupData.cpp12
-rw-r--r--src/server/game/DungeonFinding/LFGGroupData.h4
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.cpp37
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.h3
-rw-r--r--src/server/game/DungeonFinding/LFGQueue.cpp2
-rw-r--r--src/server/game/Entities/Player/Player.cpp2
8 files changed, 48 insertions, 19 deletions
diff --git a/src/server/game/DungeonFinding/LFG.cpp b/src/server/game/DungeonFinding/LFG.cpp
index ab06eff7148..8ec638128d8 100644
--- a/src/server/game/DungeonFinding/LFG.cpp
+++ b/src/server/game/DungeonFinding/LFG.cpp
@@ -91,9 +91,6 @@ std::string GetStateString(LfgState state)
case LFG_STATE_DUNGEON:
entry = LANG_LFG_STATE_DUNGEON;
break;
- case LFG_STATE_BOOT:
- entry = LANG_LFG_STATE_BOOT;
- break;
case LFG_STATE_FINISHED_DUNGEON:
entry = LANG_LFG_STATE_FINISHED_DUNGEON;
break;
diff --git a/src/server/game/DungeonFinding/LFG.h b/src/server/game/DungeonFinding/LFG.h
index 0ee9e7886d5..680781cc9d1 100644
--- a/src/server/game/DungeonFinding/LFG.h
+++ b/src/server/game/DungeonFinding/LFG.h
@@ -68,8 +68,8 @@ enum LfgState
LFG_STATE_ROLECHECK, // Rolecheck active
LFG_STATE_QUEUED, // Queued
LFG_STATE_PROPOSAL, // Proposal active
- LFG_STATE_BOOT, // Vote kick active
- LFG_STATE_DUNGEON, // In LFG Group, in a Dungeon
+ //LFG_STATE_BOOT, // Vote kick active
+ LFG_STATE_DUNGEON = 5, // In LFG Group, in a Dungeon
LFG_STATE_FINISHED_DUNGEON, // In LFG Group, in a finished Dungeon
LFG_STATE_RAIDBROWSER // Using Raid finder
};
diff --git a/src/server/game/DungeonFinding/LFGGroupData.cpp b/src/server/game/DungeonFinding/LFGGroupData.cpp
index 2ab1e0b1e7e..aa6916a39a4 100644
--- a/src/server/game/DungeonFinding/LFGGroupData.cpp
+++ b/src/server/game/DungeonFinding/LFGGroupData.cpp
@@ -22,7 +22,7 @@ namespace lfg
{
LfgGroupData::LfgGroupData(): m_State(LFG_STATE_NONE), m_OldState(LFG_STATE_NONE),
- m_Leader(), m_Dungeon(0), m_KicksLeft(LFG_GROUP_MAX_KICKS)
+ m_Leader(), m_Dungeon(0), m_KicksLeft(LFG_GROUP_MAX_KICKS), m_VoteKickActive(false)
{ }
LfgGroupData::~LfgGroupData()
@@ -126,4 +126,14 @@ uint8 LfgGroupData::GetKicksLeft() const
return m_KicksLeft;
}
+void LfgGroupData::SetVoteKick(bool active)
+{
+ m_VoteKickActive = active;
+}
+
+bool LfgGroupData::IsVoteKickActive() const
+{
+ return m_VoteKickActive;
+}
+
} // namespace lfg
diff --git a/src/server/game/DungeonFinding/LFGGroupData.h b/src/server/game/DungeonFinding/LFGGroupData.h
index 8d8f1dc0f3d..b573e7c309e 100644
--- a/src/server/game/DungeonFinding/LFGGroupData.h
+++ b/src/server/game/DungeonFinding/LFGGroupData.h
@@ -66,6 +66,9 @@ class LfgGroupData
// VoteKick
uint8 GetKicksLeft() const;
+ void SetVoteKick(bool active);
+ bool IsVoteKickActive() const;
+
private:
// General
LfgState m_State; ///< State if group in LFG
@@ -76,6 +79,7 @@ class LfgGroupData
uint32 m_Dungeon; ///< Dungeon entry
// Vote Kick
uint8 m_KicksLeft; ///< Number of kicks left
+ bool m_VoteKickActive;
};
} // namespace lfg
diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp
index 977dcbb216b..19ea140d998 100644
--- a/src/server/game/DungeonFinding/LFGMgr.cpp
+++ b/src/server/game/DungeonFinding/LFGMgr.cpp
@@ -309,9 +309,8 @@ void LFGMgr::Update(uint32 diff)
ObjectGuid pguid = itVotes->first;
if (pguid != boot.victim)
SendLfgBootProposalUpdate(pguid, boot);
- SetState(pguid, LFG_STATE_DUNGEON);
}
- SetState(itBoot->first, LFG_STATE_DUNGEON);
+ SetVoteKick(itBoot->first, false);
BootsStore.erase(itBoot);
}
}
@@ -642,7 +641,6 @@ void LFGMgr::LeaveLfg(ObjectGuid guid)
break;
case LFG_STATE_DUNGEON:
case LFG_STATE_FINISHED_DUNGEON:
- case LFG_STATE_BOOT:
if (guid != gguid) // Player
SetState(guid, LFG_STATE_NONE);
break;
@@ -1159,7 +1157,7 @@ void LFGMgr::RemoveProposal(LfgProposalContainer::iterator itProposal, LfgUpdate
*/
void LFGMgr::InitBoot(ObjectGuid gguid, ObjectGuid kicker, ObjectGuid victim, std::string const& reason)
{
- SetState(gguid, LFG_STATE_BOOT);
+ SetVoteKick(gguid, true);
LfgPlayerBoot& boot = BootsStore[gguid];
boot.inProgress = true;
@@ -1173,7 +1171,6 @@ void LFGMgr::InitBoot(ObjectGuid gguid, ObjectGuid kicker, ObjectGuid victim, st
for (GuidSet::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
ObjectGuid guid = (*itr);
- SetState(guid, LFG_STATE_BOOT);
boot.votes[guid] = LFG_ANSWER_PENDING;
}
@@ -1230,13 +1227,10 @@ void LFGMgr::UpdateBoot(ObjectGuid guid, bool accept)
{
ObjectGuid pguid = itVotes->first;
if (pguid != boot.victim)
- {
- SetState(pguid, LFG_STATE_DUNGEON);
SendLfgBootProposalUpdate(pguid, boot);
- }
}
- SetState(gguid, LFG_STATE_DUNGEON);
+ SetVoteKick(gguid, false);
if (agreeNum == LFG_GROUP_KICK_VOTES_NEEDED) // Vote passed - Kick player
{
if (Group* group = sGroupMgr->GetGroupByGUID(gguid))
@@ -1498,12 +1492,12 @@ LfgState LFGMgr::GetState(ObjectGuid guid)
if (guid.IsParty())
{
state = GroupsStore[guid].GetState();
- TC_LOG_TRACE("lfg.data.group.state.get", "Group: %s, State: %u", guid.ToString().c_str(), state);
+ TC_LOG_TRACE("lfg.data.group.state.get", "Group: %s, State: %s", guid.ToString().c_str(), GetStateString(state).c_str());
}
else
{
state = PlayersStore[guid].GetState();
- TC_LOG_TRACE("lfg.data.player.state.get", "Player: %s, State: %u", guid.ToString().c_str(), state);
+ TC_LOG_TRACE("lfg.data.player.state.get", "Player: %s, State: %s", guid.ToString().c_str(), GetStateString(state).c_str());
}
return state;
@@ -1526,6 +1520,16 @@ LfgState LFGMgr::GetOldState(ObjectGuid guid)
return state;
}
+bool LFGMgr::IsVoteKickActive(ObjectGuid gguid)
+{
+ ASSERT(gguid.IsGroup());
+
+ bool active = GroupsStore[gguid].IsVoteKickActive();
+ TC_LOG_TRACE("lfg.data.group.votekick.get", "Group: %s, Active: %d", gguid.ToString().c_str(), active);
+
+ return active;
+}
+
uint32 LFGMgr::GetDungeon(ObjectGuid guid, bool asId /*= true */)
{
uint32 dungeon = GroupsStore[guid].GetDungeon(asId);
@@ -1686,6 +1690,17 @@ void LFGMgr::SetState(ObjectGuid guid, LfgState state)
}
}
+void LFGMgr::SetVoteKick(ObjectGuid gguid, bool active)
+{
+ ASSERT(gguid.IsGroup());
+
+ LfgGroupData& data = GroupsStore[gguid];
+ TC_LOG_TRACE("lfg.data.group.votekick.set", "Group: %s, New state: %d, Previous: %d",
+ gguid.ToString().c_str(), active, data.IsVoteKickActive());
+
+ data.SetVoteKick(active);
+}
+
void LFGMgr::SetDungeon(ObjectGuid guid, uint32 dungeon)
{
TC_LOG_TRACE("lfg.data.group.dungeon.set", "Group: %s, Dungeon: %u", guid.ToString().c_str(), dungeon);
diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h
index 5e7c4e368a2..5fd0decadaf 100644
--- a/src/server/game/DungeonFinding/LFGMgr.h
+++ b/src/server/game/DungeonFinding/LFGMgr.h
@@ -328,6 +328,8 @@ class LFGMgr
LfgDungeonSet const& GetSelectedDungeons(ObjectGuid guid);
/// Get current lfg state
LfgState GetState(ObjectGuid guid);
+ /// Get current vote kick state
+ bool IsVoteKickActive(ObjectGuid gguid);
/// Get current dungeon
uint32 GetDungeon(ObjectGuid guid, bool asId = true);
/// Get the map id of the current dungeon
@@ -435,6 +437,7 @@ class LFGMgr
void SetSelectedDungeons(ObjectGuid guid, LfgDungeonSet const& dungeons);
void DecreaseKicksLeft(ObjectGuid guid);
void SetState(ObjectGuid guid, LfgState state);
+ void SetVoteKick(ObjectGuid gguid, bool active);
void RemovePlayerData(ObjectGuid guid);
void GetCompatibleDungeons(LfgDungeonSet& dungeons, GuidSet const& players, LfgLockPartyMap& lockMap, bool isContinue);
void _SaveToDB(ObjectGuid guid, uint32 db_guid);
diff --git a/src/server/game/DungeonFinding/LFGQueue.cpp b/src/server/game/DungeonFinding/LFGQueue.cpp
index 7a4ec0f7e1e..97f87a4d814 100644
--- a/src/server/game/DungeonFinding/LFGQueue.cpp
+++ b/src/server/game/DungeonFinding/LFGQueue.cpp
@@ -377,7 +377,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check)
// Group with less that MAXGROUPSIZE members always compatible
if (check.size() == 1 && numPlayers != MAXGROUPSIZE)
{
- TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) sigle group. Compatibles", strGuids.c_str());
+ TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) single group. Compatibles", strGuids.c_str());
LfgQueueDataContainer::iterator itQueue = QueueDataStore.find(check.front());
LfgCompatibilityData data(LFG_COMPATIBLES_WITH_LESS_PLAYERS);
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 55f13138868..f5c2a8e05f9 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -23885,7 +23885,7 @@ PartyResult Player::CanUninviteFromGroup(ObjectGuid guidMember) const
return ERR_PARTY_LFG_BOOT_LIMIT;
lfg::LfgState state = sLFGMgr->GetState(gguid);
- if (state == lfg::LFG_STATE_BOOT)
+ if (sLFGMgr->IsVoteKickActive(gguid))
return ERR_PARTY_LFG_BOOT_IN_PROGRESS;
if (grp->GetMembersCount() <= lfg::LFG_GROUP_KICK_VOTES_NEEDED)