diff options
author | Spp <spp@jorge.gr> | 2010-08-11 11:27:36 +0200 |
---|---|---|
committer | Spp <spp@jorge.gr> | 2010-08-11 11:27:36 +0200 |
commit | 2638d24926abb62e9720156685fd910270176be7 (patch) | |
tree | 82855100a94499e6666cda358287cbbd4d842745 /src | |
parent | 3002300e71f5ece7b7642e9818f85db390eebb4d (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.cpp | 94 |
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 // --------------------------------------------------------------------------// |