diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp
index 4241df5918b..2c628b57e46 100644
--- a/src/server/game/DungeonFinding/LFGMgr.cpp
+++ b/src/server/game/DungeonFinding/LFGMgr.cpp
@@ -587,8 +587,8 @@ void LFGMgr::UpdateRoleCheck(Group *grp, Player *plr /* = NULL*/)
///
/// Check if a group can be formed with the given group
///
-/// Map of roles
-/// bool, will be used to remove ROLE_LEADER
+/// Roles to check
+/// Used to remove ROLE_LEADER
/// bool
bool LFGMgr::CheckGroupRoles(LfgRolesMap &groles, bool removeLeaderFlag /*= true*/)
{
@@ -598,81 +598,61 @@ bool LFGMgr::CheckGroupRoles(LfgRolesMap &groles, bool removeLeaderFlag /*= true
uint8 damage = 0;
uint8 tank = 0;
uint8 healer = 0;
- uint64 tguid = 0;
- uint64 hguid = 0;
- uint64 dguid = 0;
- uint64 guid = 0;
- uint8 role = 0;
if (removeLeaderFlag)
for (LfgRolesMap::iterator it = groles.begin(); it != groles.end(); ++it)
it->second &= ~ROLE_LEADER;
- for (LfgRolesMap::const_iterator it = groles.begin(); it != groles.end(); ++it)
+ for (LfgRolesMap::iterator it = groles.begin(); it != groles.end(); ++it)
{
- guid = it->first;
- role = it->second;
-
- if (role == ROLE_NONE)
+ switch(it->second)
+ {
+ case ROLE_NONE:
return false;
-
- if (role & ROLE_TANK)
- {
- if (!tank)
+ case ROLE_TANK:
+ if (tank == LFG_TANKS_NEEDED)
+ return false;
+ tank++;
+ break;
+ case ROLE_HEALER:
+ if (healer == LFG_HEALERS_NEEDED)
+ return false;
+ healer++;
+ break;
+ case ROLE_DAMAGE:
+ if (damage == LFG_DPS_NEEDED)
+ return false;
+ damage++;
+ break;
+ default:
+ if (it->second & ROLE_TANK)
{
- tguid = guid;
- ++tank;
- }
- else
- {
- if (groles[tguid] == ROLE_TANK)
- tguid = guid;
- groles[tguid] -= ROLE_TANK;
- return CheckGroupRoles(groles, false);
- }
- }
-
- if (role & ROLE_HEALER)
- {
- if (!healer)
- {
- hguid = guid;
- ++healer;
- }
- else
- {
- if (groles[hguid] == ROLE_HEALER)
- hguid = guid;
- groles[hguid] -= ROLE_HEALER;
- return CheckGroupRoles(groles, false);
- }
- }
-
- if (role & ROLE_DAMAGE)
- {
- if (damage < 3)
- {
- if (!damage)
- dguid = guid;
- ++damage;
- }
- else
- {
- if (groles[dguid] == ROLE_DAMAGE)
- dguid = guid;
- groles[dguid] -= ROLE_DAMAGE;
- if (!CheckGroupRoles(groles, false))
- groles[dguid] += ROLE_DAMAGE;
- else
+ it->second -= ROLE_TANK;
+ if (CheckGroupRoles(groles, false))
return true;
+ it->second += ROLE_TANK;
}
+
+ if (it->second & ROLE_HEALER)
+ {
+ it->second -= ROLE_HEALER;
+ if (CheckGroupRoles(groles, false))
+ return true;
+ it->second += ROLE_HEALER;
+ }
+
+ if (it->second & ROLE_DAMAGE)
+ {
+ it->second -= ROLE_DAMAGE;
+ return CheckGroupRoles(groles, false);
+ }
+ break;
}
}
- return true;
+ return tank == LFG_TANKS_NEEDED && healer == LFG_HEALERS_NEEDED && damage == LFG_DPS_NEEDED;
}
-
// --------------------------------------------------------------------------//
// Packet Functions
// --------------------------------------------------------------------------//