aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSpp <spp@jorge.gr>2010-08-11 11:27:36 +0200
committerSpp <spp@jorge.gr>2010-08-11 11:27:36 +0200
commit2638d24926abb62e9720156685fd910270176be7 (patch)
tree82855100a94499e6666cda358287cbbd4d842745 /src
parent3002300e71f5ece7b7642e9818f85db390eebb4d (diff)
Dungeon Finder: redo CheckGroupRoles, sometimes it was accepting wrong roles as valid
--HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.cpp94
1 files changed, 37 insertions, 57 deletions
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*/)
/// <summary>
/// Check if a group can be formed with the given group
/// </summary>
-/// <param name="groles">Map of roles</param>
-/// <param name="firstCall">bool, will be used to remove ROLE_LEADER</param>
+/// <param name="LfgRolesMap &">Roles to check</param>
+/// <param name="bool">Used to remove ROLE_LEADER</param>
/// <returns>bool</returns>
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)
- return false;
-
- if (role & ROLE_TANK)
+ switch(it->second)
{
- if (!tank)
- {
- tguid = guid;
- ++tank;
- }
- else
+ case ROLE_NONE:
+ return false;
+ 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)
{
- if (groles[tguid] == ROLE_TANK)
- tguid = guid;
- groles[tguid] -= ROLE_TANK;
- return CheckGroupRoles(groles, false);
+ it->second -= ROLE_TANK;
+ if (CheckGroupRoles(groles, false))
+ return true;
+ it->second += ROLE_TANK;
}
- }
- if (role & ROLE_HEALER)
- {
- if (!healer)
+ if (it->second & ROLE_HEALER)
{
- hguid = guid;
- ++healer;
- }
- else
- {
- if (groles[hguid] == ROLE_HEALER)
- hguid = guid;
- groles[hguid] -= ROLE_HEALER;
- return CheckGroupRoles(groles, false);
+ it->second -= ROLE_HEALER;
+ if (CheckGroupRoles(groles, false))
+ return true;
+ it->second += ROLE_HEALER;
}
- }
- if (role & ROLE_DAMAGE)
- {
- if (damage < 3)
+ if (it->second & ROLE_DAMAGE)
{
- 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
- return true;
+ 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
// --------------------------------------------------------------------------//