aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/server/game/DungeonFinding/LFG.h12
-rw-r--r--src/server/game/DungeonFinding/LFGGroupData.h3
-rwxr-xr-xsrc/server/game/DungeonFinding/LFGMgr.cpp360
-rwxr-xr-xsrc/server/game/DungeonFinding/LFGMgr.h93
-rw-r--r--src/server/game/DungeonFinding/LFGPlayerData.cpp14
-rw-r--r--src/server/game/DungeonFinding/LFGPlayerData.h12
-rw-r--r--src/server/game/DungeonFinding/LFGScripts.cpp3
-rw-r--r--src/server/game/DungeonFinding/LFGScripts.h2
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/LFGHandler.cpp397
-rwxr-xr-xsrc/server/game/Server/WorldSession.h12
10 files changed, 422 insertions, 486 deletions
diff --git a/src/server/game/DungeonFinding/LFG.h b/src/server/game/DungeonFinding/LFG.h
index 236831ed1f9..4ccec91c7d6 100755
--- a/src/server/game/DungeonFinding/LFG.h
+++ b/src/server/game/DungeonFinding/LFG.h
@@ -26,7 +26,7 @@ enum LfgRoles
ROLE_LEADER = 0x01,
ROLE_TANK = 0x02,
ROLE_HEALER = 0x04,
- ROLE_DAMAGE = 0x08,
+ ROLE_DAMAGE = 0x08
};
enum LfgUpdateType
@@ -44,7 +44,7 @@ enum LfgUpdateType
LFG_UPDATETYPE_PROPOSAL_BEGIN = 13,
LFG_UPDATETYPE_CLEAR_LOCK_LIST = 14,
LFG_UPDATETYPE_GROUP_MEMBER_OFFLINE = 15,
- LFG_UPDATETYPE_GROUP_DISBAND = 16,
+ LFG_UPDATETYPE_GROUP_DISBAND = 16
};
enum LfgState
@@ -56,7 +56,7 @@ enum LfgState
LFG_STATE_BOOT, // Vote kick active
LFG_STATE_DUNGEON, // In LFG Group, in a Dungeon
LFG_STATE_FINISHED_DUNGEON, // In LFG Group, in a finished Dungeon
- LFG_STATE_RAIDBROWSER, // Using Raid finder
+ LFG_STATE_RAIDBROWSER // Using Raid finder
};
/// Instance lock types
@@ -73,7 +73,7 @@ enum LfgLockStatusType
LFG_LOCKSTATUS_ATTUNEMENT_TOO_HIGH_LEVEL = 1002,
LFG_LOCKSTATUS_QUEST_NOT_COMPLETED = 1022,
LFG_LOCKSTATUS_MISSING_ITEM = 1025,
- LFG_LOCKSTATUS_NOT_IN_SEASON = 1031,
+ LFG_LOCKSTATUS_NOT_IN_SEASON = 1031
};
/// Dungeon and reason why player can't join
@@ -84,7 +84,7 @@ struct LfgLockStatus
};
typedef std::set<uint32> LfgDungeonSet;
-typedef std::set<LfgLockStatus*> LfgLockStatusSet;
-typedef std::map<uint64, LfgLockStatusSet*> LfgLockStatusMap;
+typedef std::map<uint32, LfgLockStatusType> LfgLockMap;
+typedef std::map<uint64, LfgLockMap> LfgLockPartyMap;
#endif
diff --git a/src/server/game/DungeonFinding/LFGGroupData.h b/src/server/game/DungeonFinding/LFGGroupData.h
index 4259ad2253e..71e1c4998c7 100644
--- a/src/server/game/DungeonFinding/LFGGroupData.h
+++ b/src/server/game/DungeonFinding/LFGGroupData.h
@@ -18,13 +18,12 @@
#ifndef _LFGGROUPDATA_H
#define _LFGGROUPDATA_H
-#include "Common.h"
#include "LFG.h"
enum LfgGroupEnum
{
LFG_GROUP_MAX_KICKS = 3,
- LFG_GROUP_KICK_VOTES_NEEDED = 3,
+ LFG_GROUP_KICK_VOTES_NEEDED = 3
};
/**
diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp
index b62966c2904..013e2ce0510 100755
--- a/src/server/game/DungeonFinding/LFGMgr.cpp
+++ b/src/server/game/DungeonFinding/LFGMgr.cpp
@@ -292,7 +292,8 @@ void LFGMgr::Update(uint32 diff)
if (Player* plr = sObjectMgr.GetPlayer(itPlayers->first))
{
Group *grp = plr->GetGroup();
- LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_PROPOSAL_BEGIN, &GetSelectedDungeons(guid), GetComment(guid));
+ LfgDungeonSet dungeons = GetSelectedDungeons(guid);
+ LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_PROPOSAL_BEGIN, &dungeons, GetComment(guid));
if (grp)
{
uint64 gguid = grp->GetGUID();
@@ -375,7 +376,7 @@ void LFGMgr::Update(uint32 diff)
@param[in] guid Player or group guid to add to queue
@param[in] queueId Queue Id to add player/group to
*/
-void LFGMgr::AddToQueue(uint64& guid, uint8 queueId)
+void LFGMgr::AddToQueue(const uint64& guid, uint8 queueId)
{
if (sWorld.getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP))
queueId = 0;
@@ -396,7 +397,7 @@ void LFGMgr::AddToQueue(uint64& guid, uint8 queueId)
@param[in] guid Player or group guid to add to queue
@return true if guid was found in main queue.
*/
-bool LFGMgr::RemoveFromQueue(uint64& guid)
+bool LFGMgr::RemoveFromQueue(const uint64& guid)
{
for (LfgGuidListMap::iterator it = m_currentQueue.begin(); it != m_currentQueue.end(); ++it)
it->second.remove(guid);
@@ -423,6 +424,73 @@ bool LFGMgr::RemoveFromQueue(uint64& guid)
}
/**
+ Generate the dungeon lock map for a given player
+
+ @param[in] plr Player we need to initialize the lock status map
+*/
+void LFGMgr::InitializeLockedDungeons(Player* plr)
+{
+ uint64 guid = plr->GetGUID();
+ LfgLockMap cachedLockMap = GetLockedDungeons(guid);
+ if (!cachedLockMap.empty())
+ return;
+
+ uint8 level = plr->getLevel();
+ uint8 expansion = plr->GetSession()->Expansion();
+ LfgDungeonSet dungeons = GetDungeonsByRandom(0);
+ LfgLockMap lock;
+
+ for (LfgDungeonSet::const_iterator it = dungeons.begin(); it != dungeons.end(); ++it)
+ {
+ LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(*it);
+ if (!dungeon) // should never happen - We provide a list from sLFGDungeonStore
+ continue;
+
+ AccessRequirement const* ar = sObjectMgr.GetAccessRequirement(dungeon->map, Difficulty(dungeon->difficulty));
+
+ LfgLockStatusType locktype = LFG_LOCKSTATUS_OK;
+ if (dungeon->expansion > expansion)
+ locktype = LFG_LOCKSTATUS_INSUFFICIENT_EXPANSION;
+ else if (sDisableMgr.IsDisabledFor(DISABLE_TYPE_MAP, dungeon->map, plr))
+ locktype = LFG_LOCKSTATUS_RAID_LOCKED;
+ else if (dungeon->difficulty > DUNGEON_DIFFICULTY_NORMAL && plr->GetBoundInstance(dungeon->map, Difficulty(dungeon->difficulty)))
+ locktype = LFG_LOCKSTATUS_RAID_LOCKED;
+ else if (dungeon->minlevel > level)
+ locktype = LFG_LOCKSTATUS_TOO_LOW_LEVEL;
+ else if (dungeon->maxlevel < level)
+ locktype = LFG_LOCKSTATUS_TOO_HIGH_LEVEL;
+ else if (locktype == LFG_LOCKSTATUS_OK && ar)
+ {
+ if (ar->achievement && !plr->GetAchievementMgr().HasAchieved(sAchievementStore.LookupEntry(ar->achievement)))
+ locktype = LFG_LOCKSTATUS_RAID_LOCKED; // FIXME: Check the correct lock value
+ else if (plr->GetTeam() == ALLIANCE && ar->quest_A && !plr->GetQuestRewardStatus(ar->quest_A))
+ locktype = LFG_LOCKSTATUS_QUEST_NOT_COMPLETED;
+ else if (plr->GetTeam() == HORDE && ar->quest_H && !plr->GetQuestRewardStatus(ar->quest_H))
+ locktype = LFG_LOCKSTATUS_QUEST_NOT_COMPLETED;
+ else
+ if (ar->item)
+ {
+ if (!plr->HasItemCount(ar->item, 1) && (!ar->item2 || !plr->HasItemCount(ar->item2, 1)))
+ locktype = LFG_LOCKSTATUS_MISSING_ITEM;
+ }
+ else if (ar->item2 && !plr->HasItemCount(ar->item2, 1))
+ locktype = LFG_LOCKSTATUS_MISSING_ITEM;
+ }
+ /* TODO VoA closed if WG is not under team control (LFG_LOCKSTATUS_RAID_LOCKED)
+ locktype = LFG_LOCKSTATUS_TOO_LOW_GEAR_SCORE;
+ locktype = LFG_LOCKSTATUS_TOO_HIGH_GEAR_SCORE;
+ locktype = LFG_LOCKSTATUS_ATTUNEMENT_TOO_LOW_LEVEL;
+ locktype = LFG_LOCKSTATUS_ATTUNEMENT_TOO_HIGH_LEVEL;
+ locktype = LFG_LOCKSTATUS_NOT_IN_SEASON; // Need list of instances and needed season to open
+ */
+
+ if (locktype != LFG_LOCKSTATUS_OK)
+ lock[dungeon->Entry()] = locktype;
+ }
+ SetLockedDungeons(guid, lock);
+}
+
+/**
Adds the player/group to lfg queue. If player is in a group then it is the leader
of the group tying to join the group. Join conditions are checked before adding
to the new queue.
@@ -432,9 +500,9 @@ bool LFGMgr::RemoveFromQueue(uint64& guid)
@param[in] dungeons Dungeons the player/group is applying for
@param[in] comment Player selected comment
*/
-void LFGMgr::Join(Player* plr, uint8 roles, LfgDungeonSet& dungeons, std::string& comment)
+void LFGMgr::Join(Player* plr, uint8 roles, const LfgDungeonSet& selectedDungeons, const std::string& comment)
{
- if (!plr || !plr->GetSession() || !dungeons.size())
+ if (!plr || !plr->GetSession() || !selectedDungeons.size())
return;
Group* grp = plr->GetGroup();
@@ -444,6 +512,7 @@ void LFGMgr::Join(Player* plr, uint8 roles, LfgDungeonSet& dungeons, std::string
PlayerSet players;
uint32 rDungeonId = 0;
bool isContinue = grp && grp->isLFGGroup() && GetState(gguid) != LFG_STATE_FINISHED_DUNGEON;
+ LfgDungeonSet dungeons = selectedDungeons;
// Do not allow to change dungeon in the middle of a current dungeon
if (isContinue)
@@ -551,23 +620,15 @@ void LFGMgr::Join(Player* plr, uint8 roles, LfgDungeonSet& dungeons, std::string
dungeons = GetDungeonsByRandom(rDungeonId);
// if we have lockmap then there are no compatible dungeons
- if (LfgLockStatusMap* lockStatusMap = GetCompatibleDungeons(dungeons, players))
+ GetCompatibleDungeons(dungeons, players, joinData.lockmap);
+ if (!joinData.lockmap.empty())
{
joinData.result = LFG_JOIN_PARTY_NOT_MEET_REQS;
- joinData.lockmap = lockStatusMap;
sLog.outDebug("LFGMgr::Join: [" UI64FMTD "] joining with %u members. result: LFG_JOIN_PARTY_NOT_MEET_REQS", guid, uint8(players.size()));
plr->GetSession()->SendLfgJoinResult(joinData);
-
- for (LfgLockStatusMap::iterator itLockMap = lockStatusMap->begin(); itLockMap != lockStatusMap->end(); ++itLockMap)
- {
- for (LfgLockStatusSet::iterator itLockSet = itLockMap->second->begin(); itLockSet != itLockMap->second->end(); ++itLockSet)
- delete (*itLockSet);
- delete itLockMap->second;
- }
- delete lockStatusMap;
- joinData.lockmap = NULL;
return;
}
+ joinData.lockmap.clear();
}
// Can't join. Send result
@@ -596,7 +657,7 @@ void LFGMgr::Join(Player* plr, uint8 roles, LfgDungeonSet& dungeons, std::string
pRoleCheck->leader = plr->GetGUID();
pRoleCheck->dungeons = dungeons;
pRoleCheck->rDungeonId = rDungeonId;
- m_RoleChecks[grp->GetLowGUID()] = pRoleCheck;
+ m_RoleChecks[grp->GetGUID()] = pRoleCheck;
if (rDungeonId)
{
@@ -616,7 +677,7 @@ void LFGMgr::Join(Player* plr, uint8 roles, LfgDungeonSet& dungeons, std::string
SetState(pguid, LFG_STATE_ROLECHECK);
if (!isContinue)
SetSelectedDungeons(pguid, dungeons);
- pRoleCheck->roles[plrg->GetGUID()] = 0;
+ pRoleCheck->roles[pguid] = 0;
}
}
// Update leader role
@@ -926,9 +987,10 @@ bool LFGMgr::CheckCompatibility(LfgGuidList check, LfgProposal*& pProposal)
if (itOther == pqInfoMap.end())
compatibleDungeons.insert(*itDungeon);
}
- GetCompatibleDungeons(compatibleDungeons, players, false);
+ LfgLockPartyMap lockMap;
+ GetCompatibleDungeons(compatibleDungeons, players, lockMap);
- if (!compatibleDungeons.size())
+ if (compatibleDungeons.empty())
{
SetCompatibles(strGuids, false);
return false;
@@ -964,7 +1026,7 @@ bool LFGMgr::CheckCompatibility(LfgGuidList check, LfgProposal*& pProposal)
PlayerSet::const_iterator itPlayers = players.begin();
if (!leader)
{
- uint8 pos = urand(0, players.size() - 1);
+ uint8 pos = uint8(urand(0, players.size() - 1));
for (uint8 i = 0; i < pos; ++i)
++itPlayers;
leader = (*itPlayers)->GetGUID();
@@ -1007,7 +1069,7 @@ void LFGMgr::UpdateRoleCheck(Group* grp, Player* plr /* = NULL*/, bool newRoleCh
return;
LfgRolesMap check_roles;
- LfgRoleCheckMap::iterator itRoleCheck = m_RoleChecks.find(grp->GetLowGUID());
+ LfgRoleCheckMap::iterator itRoleCheck = m_RoleChecks.find(grp->GetGUID());
if (itRoleCheck == m_RoleChecks.end())
return;
@@ -1049,7 +1111,7 @@ void LFGMgr::UpdateRoleCheck(Group* grp, Player* plr /* = NULL*/, bool newRoleCh
if (!plrg)
continue;
uint64 pguid = plrg->GetGUID();
- team = plrg->GetTeam();
+ team = uint8(plrg->GetTeam());
WorldSession* session = plrg->GetSession();
if (!newRoleCheck && plr)
session->SendLfgRoleChosen(guid, roles);
@@ -1160,39 +1222,25 @@ LfgAnswer LFGMgr::GetCompatibles(std::string key)
@param[in,out] dungeons Dungeons to check restrictions
@param[in] players Set of players to check their dungeon restrictions
@param[in] returnLockMap Determines when to return a function value (Default true)
- @return Map of players Lock status info of given dungeons (NULL if dungeons is not empty)
+ @param[out] Map of players Lock status info of given dungeons
*/
-LfgLockStatusMap* LFGMgr::GetCompatibleDungeons(LfgDungeonSet& dungeons, PlayerSet& players, bool returnLockMap /* = true */)
+void LFGMgr::GetCompatibleDungeons(LfgDungeonSet& dungeons, const PlayerSet& players, LfgLockPartyMap& lockMap)
{
- if (!dungeons.size())
- return NULL;
-
- LfgLockStatusMap* pLockDungeons = GetGroupLockStatusDungeons(players, dungeons, false);
- if (pLockDungeons) // Found dungeons not compatible, remove them from the set
+ for (PlayerSet::const_iterator it = players.begin(); it != players.end() && dungeons.size(); ++it)
{
- for (LfgLockStatusMap::const_iterator itLockMap = pLockDungeons->begin(); itLockMap != pLockDungeons->end() && dungeons.size(); ++itLockMap)
+ uint64 guid = (*it)->GetGUID();
+ LfgLockMap cachedLockMap = GetLockedDungeons(guid);
+ for(LfgLockMap::const_iterator it = cachedLockMap.begin(); it != cachedLockMap.end() && dungeons.size(); ++it)
{
- for(LfgLockStatusSet::const_iterator itLockSet = itLockMap->second->begin(); itLockSet != itLockMap->second->end() && dungeons.size(); ++itLockSet)
+ uint32 dungeonId = (it->first & 0x00FFFFFF); // Compare dungeon ids
+ LfgDungeonSet::iterator itDungeon = dungeons.find(dungeonId);
+ if (itDungeon != dungeons.end())
{
- LfgDungeonSet::iterator itDungeon = dungeons.find((*itLockSet)->dungeon);
- if (itDungeon != dungeons.end())
- dungeons.erase(itDungeon);
+ dungeons.erase(itDungeon);
+ lockMap[guid][dungeonId] = it->second;
}
}
-
- if (!returnLockMap || !dungeons.empty())
- {
- for (LfgLockStatusMap::iterator itLockMap = pLockDungeons->begin(); itLockMap != pLockDungeons->end(); ++itLockMap)
- {
- for (LfgLockStatusSet::iterator itLockSet = itLockMap->second->begin(); itLockSet != itLockMap->second->end(); ++itLockSet)
- delete (*itLockSet);
- delete itLockMap->second;
- }
- delete pLockDungeons;
- pLockDungeons = NULL;
- }
}
- return pLockDungeons;
}
/**
@@ -1505,7 +1553,8 @@ void LFGMgr::RemoveProposal(LfgProposalMap::iterator itProposal, LfgUpdateType t
}
else
{
- LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, &GetSelectedDungeons(guid), GetComment(guid));
+ LfgDungeonSet dungeons = GetSelectedDungeons(guid);
+ LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, &dungeons, GetComment(guid));
sLog.outDebug("LFGMgr::RemoveProposal: Readding [" UI64FMTD "] to queue.", guid);
SetState(guid, LFG_STATE_QUEUED);
if (grp)
@@ -1545,7 +1594,7 @@ void LFGMgr::RemoveProposal(LfgProposalMap::iterator itProposal, LfgUpdateType t
@param[in] victim Victim guid
@param[in] reason Kick reason
*/
-void LFGMgr::InitBoot(Group* grp, uint64& kicker, uint64& victim, std::string reason)
+void LFGMgr::InitBoot(Group* grp, const uint64& kicker, const uint64& victim, std::string reason)
{
if (!grp)
return;
@@ -1763,7 +1812,7 @@ void LFGMgr::TeleportPlayer(Player* plr, bool out, bool fromOpcode /*= false*/)
}
if (error != LFG_TELEPORTERROR_OK)
- plr->GetSession()->SendLfgTeleportError(error);
+ plr->GetSession()->SendLfgTeleportError(uint8(error));
}
/**
@@ -1842,150 +1891,16 @@ void LFGMgr::RewardDungeonDoneFor(const uint32 /*dungeonId*/, Player* player)
// --------------------------------------------------------------------------//
/**
- Get all Group members list of all dungeons that can't be done and reason
- leader excluded as the list given is he list he can do
-
- @param[in] plr Players to check group lock status
- @returns Map of player's group dungeon Lock status
-*/
-LfgLockStatusMap* LFGMgr::GetPartyLockStatusDungeons(Player* plr)
-{
- Group* grp = plr->GetGroup();
- if (!grp)
- return NULL;
-
- PlayerSet players;
- for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
- {
- Player* plrg = itr->getSource();
- if (plrg && plrg != plr)
- players.insert(plrg);
- }
-
- LfgDungeonSet allDungeons = GetDungeonsByRandom(0);
- return GetGroupLockStatusDungeons(players, allDungeons, true);
-}
-
-/**
- Get list of all dungeons player can't do and reasons
-
- @param[in] plr Players to check dungeon lock status
- @returns Set of player's dungeon Lock status
-*/
-LfgLockStatusSet* LFGMgr::GetPlayerLockStatusDungeons(Player* plr)
-{
- LfgDungeonSet allDungeons = GetDungeonsByRandom(0);
- return GetPlayerLockStatusDungeons(plr, allDungeons, true);
-}
-
-/**
- Given a group get the dungeons that can't be done and reason
-
- @param[in] players Players to check lock status
- @param[in] dungeons Dungeons to check
- @param[in] useEntry Use dungeon entry (true) or id (false)
- @returns Map of player's dungeon Lock status
-*/
-LfgLockStatusMap* LFGMgr::GetGroupLockStatusDungeons(PlayerSet& players, LfgDungeonSet& dungeons, bool useEntry)
-{
- LfgLockStatusMap* dungeonMap = new LfgLockStatusMap();
- for (PlayerSet::const_iterator itr = players.begin(); itr != players.end(); ++itr)
- if (LfgLockStatusSet* dungeonSet = GetPlayerLockStatusDungeons(*itr, dungeons, useEntry))
- (*dungeonMap)[(*itr)->GetGUID()] = dungeonSet;
-
- if (!dungeonMap->size())
- {
- delete dungeonMap;
- dungeonMap = NULL;
- }
- return dungeonMap;
-}
-
-/**
- Given a list of dungeon return the list of dungeons player can't do and reasons
-
- @param[in] plr Players to check dungeon lock status
- @param[in] dungeons Dungeons to check (Default = NULL, means check all dungeons)
- @param[in] useEntry Use dungeon entry (true) or id (false)
- @returns Set of player's dungeon Lock status
-*/
-LfgLockStatusSet* LFGMgr::GetPlayerLockStatusDungeons(Player* plr, LfgDungeonSet& dungeons, bool useEntry)
-{
- LfgLockStatusSet* list = new LfgLockStatusSet();
- uint8 level = plr->getLevel();
- uint8 expansion = plr->GetSession()->Expansion();
-
- for (LfgDungeonSet::const_iterator it = dungeons.begin(); it != dungeons.end(); ++it)
- {
- LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(*it);
- if (!dungeon) // should never happen - We provide a list from sLFGDungeonStore
- continue;
-
- AccessRequirement const* ar = sObjectMgr.GetAccessRequirement(dungeon->map, Difficulty(dungeon->difficulty));
-
- LfgLockStatusType locktype = LFG_LOCKSTATUS_OK;
- if (dungeon->expansion > expansion)
- locktype = LFG_LOCKSTATUS_INSUFFICIENT_EXPANSION;
- else if (sDisableMgr.IsDisabledFor(DISABLE_TYPE_MAP, dungeon->map, plr))
- locktype = LFG_LOCKSTATUS_RAID_LOCKED;
- else if (dungeon->difficulty > DUNGEON_DIFFICULTY_NORMAL && plr->GetBoundInstance(dungeon->map, Difficulty(dungeon->difficulty)))
- locktype = LFG_LOCKSTATUS_RAID_LOCKED;
- else if (dungeon->minlevel > level)
- locktype = LFG_LOCKSTATUS_TOO_LOW_LEVEL;
- else if (dungeon->maxlevel < level)
- locktype = LFG_LOCKSTATUS_TOO_HIGH_LEVEL;
- else if (locktype == LFG_LOCKSTATUS_OK && ar)
- {
- if (ar->achievement && !plr->GetAchievementMgr().HasAchieved(sAchievementStore.LookupEntry(ar->achievement)))
- locktype = LFG_LOCKSTATUS_RAID_LOCKED; // FIXME: Check the correct lock value
- else if (plr->GetTeam() == ALLIANCE && ar->quest_A && !plr->GetQuestRewardStatus(ar->quest_A))
- locktype = LFG_LOCKSTATUS_QUEST_NOT_COMPLETED;
- else if (plr->GetTeam() == HORDE && ar->quest_H && !plr->GetQuestRewardStatus(ar->quest_H))
- locktype = LFG_LOCKSTATUS_QUEST_NOT_COMPLETED;
- else
- if (ar->item)
- {
- if (!plr->HasItemCount(ar->item, 1) && (!ar->item2 || !plr->HasItemCount(ar->item2, 1)))
- locktype = LFG_LOCKSTATUS_MISSING_ITEM;
- }
- else if (ar->item2 && !plr->HasItemCount(ar->item2, 1))
- locktype = LFG_LOCKSTATUS_MISSING_ITEM;
- }
- /* TODO VoA closed if WG is not under team control (LFG_LOCKSTATUS_RAID_LOCKED)
- locktype = LFG_LOCKSTATUS_TOO_LOW_GEAR_SCORE;
- locktype = LFG_LOCKSTATUS_TOO_HIGH_GEAR_SCORE;
- locktype = LFG_LOCKSTATUS_ATTUNEMENT_TOO_LOW_LEVEL;
- locktype = LFG_LOCKSTATUS_ATTUNEMENT_TOO_HIGH_LEVEL;
- locktype = LFG_LOCKSTATUS_NOT_IN_SEASON; // Need list of instances and needed season to open
- */
-
- if (locktype != LFG_LOCKSTATUS_OK)
- {
- LfgLockStatus* lockstatus = new LfgLockStatus();
- lockstatus->dungeon = useEntry ? dungeon->Entry(): dungeon->ID;
- lockstatus->lockstatus = locktype;
- list->insert(lockstatus);
- }
- }
- if (!list->size())
- {
- delete list;
- list = NULL;
- }
- return list;
-}
-
-/**
Get the dungeon list that can be done given a random dungeon entry.
@param[in] randomdungeon Random dungeon id (if value = 0 will return all dungeons)
@returns Set of dungeons that can be done.
*/
-LfgDungeonSet LFGMgr::GetDungeonsByRandom(uint32 randomdungeon)
+const LfgDungeonSet& LFGMgr::GetDungeonsByRandom(uint32 randomdungeon)
{
LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(randomdungeon);
- uint8 groupType = dungeon ? dungeon->grouptype : 0;
- return m_CachedDungeonMap[groupType]; // Return a copy
+ uint32 groupType = dungeon ? dungeon->grouptype : 0;
+ return m_CachedDungeonMap[groupType];
}
/**
@@ -2060,94 +1975,125 @@ std::string LFGMgr::ConcatenateGuids(LfgGuidList check)
}
-LfgState LFGMgr::GetState(uint64& guid)
+LfgState LFGMgr::GetState(const uint64& guid)
{
- return m_Players[guid].GetState();
+ sLog.outDebug("LFGMgr::GetState: [" UI64FMTD "]", guid);
+ if (IS_GROUP(guid))
+ return m_Groups[guid].GetState();
+ else
+ return m_Players[guid].GetState();
}
-uint32 LFGMgr::GetDungeon(uint64& guid, bool asId /*= true*/)
+uint32 LFGMgr::GetDungeon(const uint64& guid, bool asId /*= true*/)
{
+ sLog.outDebug("LFGMgr::GetDungeon: [" UI64FMTD "] asId: %u", guid, asId);
return m_Groups[guid].GetDungeon(asId);
}
-uint8 LFGMgr::GetRoles(uint64& guid)
+uint8 LFGMgr::GetRoles(const uint64& guid)
{
+ sLog.outDebug("LFGMgr::GetRoles: [" UI64FMTD "]", guid);
return m_Players[guid].GetRoles();
}
-const std::string& LFGMgr::GetComment(uint64& guid)
+const std::string& LFGMgr::GetComment(const uint64& guid)
{
+ sLog.outDebug("LFGMgr::GetComment: [" UI64FMTD "]", guid);
return m_Players[guid].GetComment();
}
-LfgDungeonSet& LFGMgr::GetSelectedDungeons(uint64& guid)
+const LfgDungeonSet& LFGMgr::GetSelectedDungeons(const uint64& guid)
{
+ sLog.outDebug("LFGMgr::GetSelectedDungeons: [" UI64FMTD "]", guid);
return m_Players[guid].GetSelectedDungeons();
}
-uint8 LFGMgr::GetKicksLeft(uint64& guid)
+const LfgLockMap& LFGMgr::GetLockedDungeons(const uint64& guid)
+{
+ sLog.outDebug("LFGMgr::GetLockedDungeons: [" UI64FMTD "]", guid);
+ return m_Players[guid].GetLockedDungeons();
+}
+
+uint8 LFGMgr::GetKicksLeft(const uint64& guid)
{
+ sLog.outDebug("LFGMgr::GetKicksLeft: [" UI64FMTD "]", guid);
return m_Groups[guid].GetKicksLeft();
}
-uint8 LFGMgr::GetVotesNeeded(uint64& guid)
+uint8 LFGMgr::GetVotesNeeded(const uint64& guid)
{
+ sLog.outDebug("LFGMgr::GetVotesNeeded: [" UI64FMTD "]", guid);
return m_Groups[guid].GetVotesNeeded();
}
-
-void LFGMgr::RestoreState(uint64& guid)
+void LFGMgr::RestoreState(const uint64& guid)
{
+ sLog.outDebug("LFGMgr::RestoreState: [" UI64FMTD "]", guid);
m_Groups[guid].RestoreState();
}
-void LFGMgr::ClearState(uint64& guid)
+void LFGMgr::ClearState(const uint64& guid)
{
+ sLog.outDebug("LFGMgr::ClearState: [" UI64FMTD "]", guid);
m_Players[guid].ClearState();
}
-void LFGMgr::SetState(uint64& guid, LfgState state)
+void LFGMgr::SetState(const uint64& guid, LfgState state)
{
+ sLog.outDebug("LFGMgr::SetState: [" UI64FMTD "] state %u", guid, state);
if (IS_GROUP(guid))
m_Groups[guid].SetState(state);
else
m_Players[guid].SetState(state);
}
-void LFGMgr::SetDungeon(uint64& guid, uint32 dungeon)
+void LFGMgr::SetDungeon(const uint64& guid, uint32 dungeon)
{
+ sLog.outDebug("LFGMgr::SetDungeon: [" UI64FMTD "] dungeon %u", guid, dungeon);
m_Groups[guid].SetDungeon(dungeon);
}
-void LFGMgr::SetRoles(uint64& guid, uint8 roles)
+void LFGMgr::SetRoles(const uint64& guid, uint8 roles)
{
+ sLog.outDebug("LFGMgr::SetRoles: [" UI64FMTD "] roles: %u", guid, roles);
m_Players[guid].SetRoles(roles);
}
-void LFGMgr::SetComment(uint64& guid, std::string& comment)
+void LFGMgr::SetComment(const uint64& guid, const std::string& comment)
{
+ sLog.outDebug("LFGMgr::SetComment: [" UI64FMTD "] comment: %s", guid, comment.c_str());
m_Players[guid].SetComment(comment);
}
-void LFGMgr::SetSelectedDungeons(uint64& guid, LfgDungeonSet dungeons)
+void LFGMgr::SetSelectedDungeons(const uint64& guid, const LfgDungeonSet& dungeons)
{
+ sLog.outDebug("LFGMgr::SetSelectedDungeons: [" UI64FMTD "]", guid);
m_Players[guid].SetSelectedDungeons(dungeons);
}
-void LFGMgr::DecreaseKicksLeft(uint64& guid)
+void LFGMgr::SetLockedDungeons(const uint64& guid, const LfgLockMap& lock)
+{
+ sLog.outDebug("LFGMgr::SetLockedDungeons: [" UI64FMTD "]", guid);
+ m_Players[guid].SetLockedDungeons(lock);
+}
+
+void LFGMgr::DecreaseKicksLeft(const uint64& guid)
{
+ sLog.outDebug("LFGMgr::DecreaseKicksLeft: [" UI64FMTD "]", guid);
m_Groups[guid].DecreaseKicksLeft();
}
-void LFGMgr::RemovePlayerData(uint64& guid)
+void LFGMgr::RemovePlayerData(const uint64& guid)
{
+ sLog.outDebug("LFGMgr::RemovePlayerData: [" UI64FMTD "]", guid);
LfgPlayerDataMap::iterator it = m_Players.find(guid);
if (it != m_Players.end())
m_Players.erase(it);
}
-void LFGMgr::RemoveGroupData(uint64& guid)
+void LFGMgr::RemoveGroupData(const uint64& guid)
{
+ sLog.outDebug("LFGMgr::RemoveGroupData: [" UI64FMTD "]", guid);
LfgGroupDataMap::iterator it = m_Groups.find(guid);
if (it != m_Groups.end())
m_Groups.erase(it);
diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h
index 4cf17f2fc58..82748e3da29 100755
--- a/src/server/game/DungeonFinding/LFGMgr.h
+++ b/src/server/game/DungeonFinding/LFGMgr.h
@@ -38,7 +38,7 @@ enum LFGenum
LFG_QUEUEUPDATE_INTERVAL = 15*IN_MILLISECONDS,
LFG_SPELL_DUNGEON_COOLDOWN = 71328,
LFG_SPELL_DUNGEON_DESERTER = 71041,
- LFG_SPELL_LUCK_OF_THE_DRAW = 72221,
+ LFG_SPELL_LUCK_OF_THE_DRAW = 72221
};
/// Determines the type of instance
@@ -50,7 +50,7 @@ enum LfgType
LFG_TYPE_QUEST = 3,
LFG_TYPE_ZONE = 4,
LFG_TYPE_HEROIC = 5,
- LFG_TYPE_RANDOM = 6,
+ LFG_TYPE_RANDOM = 6
};
/// Proposal states
@@ -58,7 +58,7 @@ enum LfgProposalState
{
LFG_PROPOSAL_INITIATING = 0,
LFG_PROPOSAL_FAILED = 1,
- LFG_PROPOSAL_SUCCESS = 2,
+ LFG_PROPOSAL_SUCCESS = 2
};
/// Teleport errors
@@ -69,7 +69,7 @@ enum LfgTeleportError
LFG_TELEPORTERROR_PLAYER_DEAD = 1,
LFG_TELEPORTERROR_FALLING = 2,
LFG_TELEPORTERROR_FATIGUE = 4,
- LFG_TELEPORTERROR_INVALID_LOCATION = 6,
+ LFG_TELEPORTERROR_INVALID_LOCATION = 6
};
/// Queue join results
@@ -92,7 +92,7 @@ enum LfgJoinResult
LFG_JOIN_RANDOM_COOLDOWN = 14, // You can not queue for random dungeons while on random dungeon cooldown
LFG_JOIN_PARTY_RANDOM_COOLDOWN = 15, // One or more party members are on random dungeon cooldown
LFG_JOIN_TOO_MUCH_MEMBERS = 16, // You can not enter dungeons with more that 5 party members
- LFG_JOIN_USING_BG_SYSTEM = 17, // You can not use the dungeon system while in BG or arenas
+ LFG_JOIN_USING_BG_SYSTEM = 17 // You can not use the dungeon system while in BG or arenas
};
/// Role check states
@@ -104,7 +104,7 @@ enum LfgRoleCheckState
LFG_ROLECHECK_MISSING_ROLE = 3, // Someone didn't selected a role after 2 mins
LFG_ROLECHECK_WRONG_ROLES = 4, // Can't form a group with that role selection
LFG_ROLECHECK_ABORTED = 5, // Someone leave the group
- LFG_ROLECHECK_NO_ROLE = 6, // Someone selected no role
+ LFG_ROLECHECK_NO_ROLE = 6 // Someone selected no role
};
/// Answer state (Also used to check compatibilites)
@@ -112,7 +112,7 @@ enum LfgAnswer
{
LFG_ANSWER_PENDING = -1,
LFG_ANSWER_DENY = 0,
- LFG_ANSWER_AGREE = 1,
+ LFG_ANSWER_AGREE = 1
};
@@ -136,7 +136,7 @@ typedef std::map<std::string, LfgAnswer> LfgCompatibleMap;
typedef std::map<uint64, LfgDungeonSet> LfgDungeonMap;
typedef std::map<uint64, uint8> LfgRolesMap;
typedef std::map<uint64, LfgAnswer> LfgAnswerMap;
-typedef std::map<uint32, LfgRoleCheck*> LfgRoleCheckMap;
+typedef std::map<uint64, LfgRoleCheck*> LfgRoleCheckMap;
typedef std::map<uint64, LfgQueueInfo*> LfgQueueInfoMap;
typedef std::map<uint32, LfgProposal*> LfgProposalMap;
typedef std::map<uint64, LfgProposalPlayer*> LfgProposalPlayerMap;
@@ -147,11 +147,11 @@ typedef std::map<uint64, LfgPlayerData> LfgPlayerDataMap;
// Data needed by SMSG_LFG_JOIN_RESULT
struct LfgJoinResultData
{
- LfgJoinResultData(LfgJoinResult _result = LFG_JOIN_OK, LfgRoleCheckState _state = LFG_ROLECHECK_DEFAULT, LfgLockStatusMap* _lockmap = NULL):
- result(_result), state(_state), lockmap(_lockmap) {}
+ LfgJoinResultData(LfgJoinResult _result = LFG_JOIN_OK, LfgRoleCheckState _state = LFG_ROLECHECK_DEFAULT):
+ result(_result), state(_state) {}
LfgJoinResult result;
LfgRoleCheckState state;
- LfgLockStatusMap* lockmap;
+ LfgLockPartyMap lockmap;
};
// Data needed by SMSG_LFG_UPDATE_PARTY and SMSG_LFG_UPDATE_PLAYER
@@ -176,7 +176,7 @@ struct LfgReward
uint32 variableXP;
} reward[2];
- LfgReward(uint32 _maxLevel, uint32 firstQuest, uint32 firstVarMoney, uint32 firstVarXp, uint32 otherQuest, uint32 otherVarMoney, uint32 otherVarXp)
+ LfgReward(uint32 _maxLevel = 0, uint32 firstQuest = 0, uint32 firstVarMoney = 0, uint32 firstVarXp = 0, uint32 otherQuest = 0, uint32 otherVarMoney = 0, uint32 otherVarXp = 0)
: maxLevel(_maxLevel)
{
reward[0].questId = firstQuest;
@@ -191,7 +191,7 @@ struct LfgReward
/// Stores player or group queue info
struct LfgQueueInfo
{
- LfgQueueInfo(): tanks(LFG_TANKS_NEEDED), healers(LFG_HEALERS_NEEDED), dps(LFG_DPS_NEEDED) {};
+ LfgQueueInfo(): joinTime(0), tanks(LFG_TANKS_NEEDED), healers(LFG_HEALERS_NEEDED), dps(LFG_DPS_NEEDED) {};
time_t joinTime; ///< Player queue join time (to calculate wait times)
uint8 tanks; ///< Tanks needed
uint8 healers; ///< Healers needed
@@ -213,14 +213,12 @@ struct LfgProposalPlayer
/// Stores group data related to proposal to join
struct LfgProposal
{
- LfgProposal(uint32 dungeon): dungeonId(dungeon), state(LFG_PROPOSAL_INITIATING), groupLowGuid(0), leader(0) {}
+ LfgProposal(uint32 dungeon = 0): dungeonId(dungeon), state(LFG_PROPOSAL_INITIATING), groupLowGuid(0), leader(0), cancelTime(0) {}
~LfgProposal()
{
for (LfgProposalPlayerMap::iterator it = players.begin(); it != players.end(); ++it)
delete it->second;
- players.clear();
- queues.clear();
};
uint32 dungeonId; ///< Dungeon to join
LfgProposalState state; ///< State of the proposal
@@ -270,7 +268,7 @@ class LFGMgr
LfgReward const* GetRandomDungeonReward(uint32 dungeon, uint8 level);
// Queue
- void Join(Player* plr, uint8 roles, LfgDungeonSet& dungeons, std::string& comment);
+ void Join(Player* plr, uint8 roles, const LfgDungeonSet& dungeons, const std::string& comment);
void Leave(Player* plr, Group* grp = NULL);
// Role Check
@@ -283,38 +281,39 @@ class LFGMgr
void TeleportPlayer(Player* plr, bool out, bool fromOpcode = false);
// Vote kick
- void InitBoot(Group* grp, uint64& kguid, uint64& vguid, std::string reason);
+ void InitBoot(Group* grp, const uint64& kguid, const uint64& vguid, std::string reason);
void UpdateBoot(Player* plr, bool accept);
void OfferContinue(Group* grp);
- // Lock info
- LfgLockStatusMap* GetPartyLockStatusDungeons(Player* plr);
- LfgLockStatusSet* GetPlayerLockStatusDungeons(Player* plr);
-
-
- LfgState GetState(uint64& guid);
- uint32 GetDungeon(uint64& guid, bool asId = true);
- uint8 GetRoles(uint64& guid);
- const std::string& GetComment(uint64& gguid);
- LfgDungeonSet& GetSelectedDungeons(uint64& guid);
- uint8 GetKicksLeft(uint64& gguid);
- uint8 GetVotesNeeded(uint64& gguid);
-
- void RestoreState(uint64& guid);
- void ClearState(uint64& guid);
- void SetState(uint64& guid, LfgState state);
- void SetDungeon(uint64& guid, uint32 dungeon);
- void SetRoles(uint64& guid, uint8 roles);
- void SetComment(uint64& guid, std::string& comment);
- void SetSelectedDungeons(uint64& guid, LfgDungeonSet dungeons);
- void DecreaseKicksLeft(uint64& guid);
- void RemovePlayerData(uint64& guid);
- void RemoveGroupData(uint64& guid);
+ void InitializeLockedDungeons(Player* plr);
+
+ void SetComment(const uint64& guid, const std::string& comment);
+ const LfgLockMap& GetLockedDungeons(const uint64& guid);
+ LfgState GetState(const uint64& guid);
+ const LfgDungeonSet& GetSelectedDungeons(const uint64& guid);
+ uint32 GetDungeon(const uint64& guid, bool asId = true);
+ void ClearState(const uint64& guid);
+ void RemovePlayerData(const uint64& guid);
+ void RemoveGroupData(const uint64& guid);
+ uint8 GetKicksLeft(const uint64& gguid);
+ uint8 GetVotesNeeded(const uint64& gguid);
+ void SetRoles(const uint64& guid, uint8 roles);
private:
+
+ uint8 GetRoles(const uint64& guid);
+ const std::string& GetComment(const uint64& gguid);
+ void RestoreState(const uint64& guid);
+ void SetState(const uint64& guid, LfgState state);
+ void SetDungeon(const uint64& guid, uint32 dungeon);
+ void SetSelectedDungeons(const uint64& guid, const LfgDungeonSet& dungeons);
+ void SetLockedDungeons(const uint64& guid, const LfgLockMap& lock);
+ void DecreaseKicksLeft(const uint64& guid);
+ void NoExiste(uint8 lala);
+
// Queue
- void AddToQueue(uint64& guid, uint8 queueId);
- bool RemoveFromQueue(uint64& guid);
+ void AddToQueue(const uint64& guid, uint8 queueId);
+ bool RemoveFromQueue(const uint64& guid);
// Proposals
void RemoveProposal(LfgProposalMap::iterator itProposal, LfgUpdateType type);
@@ -323,17 +322,13 @@ class LFGMgr
LfgProposal* FindNewGroups(LfgGuidList& check, LfgGuidList& all);
bool CheckGroupRoles(LfgRolesMap &groles, bool removeLeaderFlag = true);
bool CheckCompatibility(LfgGuidList check, LfgProposal*& pProposal);
- LfgLockStatusMap* GetCompatibleDungeons(LfgDungeonSet& dungeons, PlayerSet& players, bool returnLockMap = true);
+ void GetCompatibleDungeons(LfgDungeonSet& dungeons, const PlayerSet& players, LfgLockPartyMap& lockMap);
void SetCompatibles(std::string concatenatedGuids, bool compatibles);
LfgAnswer GetCompatibles(std::string concatenatedGuids);
void RemoveFromCompatibles(uint64 guid);
- // Lock info
- LfgLockStatusMap* GetGroupLockStatusDungeons(PlayerSet& players, LfgDungeonSet& dungeons, bool useEntry);
- LfgLockStatusSet* GetPlayerLockStatusDungeons(Player* plr, LfgDungeonSet& dungeons, bool useEntry);
-
// Generic
- LfgDungeonSet GetDungeonsByRandom(uint32 randomdungeon);
+ const LfgDungeonSet& GetDungeonsByRandom(uint32 randomdungeon);
LfgType GetDungeonType(uint32 dungeon);
std::string ConcatenateGuids(LfgGuidList check);
diff --git a/src/server/game/DungeonFinding/LFGPlayerData.cpp b/src/server/game/DungeonFinding/LFGPlayerData.cpp
index 02654d54f39..207733774b3 100644
--- a/src/server/game/DungeonFinding/LFGPlayerData.cpp
+++ b/src/server/game/DungeonFinding/LFGPlayerData.cpp
@@ -18,7 +18,7 @@
#include "LFGPlayerData.h"
LfgPlayerData::LfgPlayerData():
-m_State(LFG_STATE_NONE), m_OldState(LFG_STATE_NONE), m_Roles(ROLE_NONE), m_Comment("")
+m_State(LFG_STATE_NONE), m_OldState(LFG_STATE_NONE), m_Roles(0), m_Comment("")
{}
LfgPlayerData::~LfgPlayerData()
@@ -42,11 +42,11 @@ void LfgPlayerData::SetState(LfgState state)
void LfgPlayerData::ClearState()
{
m_SelectedDungeons.clear();
- m_Roles = ROLE_NONE;
+ m_Roles = 0;
m_State = m_OldState;
}
-void LfgPlayerData::SetDungeonsLockStatus(LfgLockStatusSet& lockStatus)
+void LfgPlayerData::SetLockedDungeons(const LfgLockMap& lockStatus)
{
m_LockedDungeons = lockStatus;
}
@@ -56,12 +56,12 @@ void LfgPlayerData::SetRoles(uint8 roles)
m_Roles = roles;
}
-void LfgPlayerData::SetComment(std::string& comment)
+void LfgPlayerData::SetComment(const std::string& comment)
{
m_Comment = comment;
}
-void LfgPlayerData::SetSelectedDungeons(LfgDungeonSet& dungeons)
+void LfgPlayerData::SetSelectedDungeons(const LfgDungeonSet& dungeons)
{
m_SelectedDungeons = dungeons;
}
@@ -76,7 +76,7 @@ LfgState LfgPlayerData::GetState() const
return m_State;
}
-LfgLockStatusSet& LfgPlayerData::GetDungeonsLockStatus()
+const LfgLockMap & LfgPlayerData::GetLockedDungeons() const
{
return m_LockedDungeons;
}
@@ -91,7 +91,7 @@ const std::string& LfgPlayerData::GetComment() const
return m_Comment;
}
-LfgDungeonSet& LfgPlayerData::GetSelectedDungeons()
+const LfgDungeonSet& LfgPlayerData::GetSelectedDungeons() const
{
return m_SelectedDungeons;
}
diff --git a/src/server/game/DungeonFinding/LFGPlayerData.h b/src/server/game/DungeonFinding/LFGPlayerData.h
index 4572cdc95ba..84b0d0625e7 100644
--- a/src/server/game/DungeonFinding/LFGPlayerData.h
+++ b/src/server/game/DungeonFinding/LFGPlayerData.h
@@ -33,27 +33,27 @@ class LfgPlayerData
// General
void SetState(LfgState state);
void ClearState();
- void SetDungeonsLockStatus(LfgLockStatusSet& lockStatus);
+ void SetLockedDungeons(const LfgLockMap& lock);
// Queue
void SetRoles(uint8 roles);
- void SetComment(std::string& comment);
- void SetSelectedDungeons(LfgDungeonSet& dungeons);
+ void SetComment(const std::string& comment);
+ void SetSelectedDungeons(const LfgDungeonSet& dungeons);
void ClearSelectedDungeons();
// General
LfgState GetState() const;
- LfgLockStatusSet& GetDungeonsLockStatus();
+ const LfgLockMap& GetLockedDungeons() const;
// Queue
uint8 GetRoles() const;
const std::string& GetComment() const;
- LfgDungeonSet& GetSelectedDungeons();
+ const LfgDungeonSet& GetSelectedDungeons() const;
private:
// General
LfgState m_State; ///< State if group in LFG
LfgState m_OldState; ///< Old State
// Player
- LfgLockStatusSet m_LockedDungeons; ///< Dungeons player can't do and reason
+ LfgLockMap m_LockedDungeons; ///< Dungeons player can't do and reason
// Queue
uint8 m_Roles; ///< Roles the player selected when joined LFG
std::string m_Comment; ///< Player comment used when joined LFG
diff --git a/src/server/game/DungeonFinding/LFGScripts.cpp b/src/server/game/DungeonFinding/LFGScripts.cpp
index 56f9cca8761..f7f597767be 100644
--- a/src/server/game/DungeonFinding/LFGScripts.cpp
+++ b/src/server/game/DungeonFinding/LFGScripts.cpp
@@ -158,7 +158,8 @@ void LFGScripts::OnLogout(Player* player)
sLFGMgr.RemovePlayerData(guid);
}
-void LFGScripts::OnLogin(Player* /*player*/)
+void LFGScripts::OnLogin(Player* player)
{
+ sLFGMgr.InitializeLockedDungeons(player);
// TODO - Restore LfgPlayerData and send proper status to player if it was in a group
}
diff --git a/src/server/game/DungeonFinding/LFGScripts.h b/src/server/game/DungeonFinding/LFGScripts.h
index ff9a6d26232..0c48affc343 100644
--- a/src/server/game/DungeonFinding/LFGScripts.h
+++ b/src/server/game/DungeonFinding/LFGScripts.h
@@ -26,7 +26,7 @@
class Player;
class Group;
-class LFGScripts: public GroupScript, PlayerScript
+class LFGScripts: public GroupScript, public PlayerScript
{
public:
LFGScripts();
diff --git a/src/server/game/Server/Protocol/Handlers/LFGHandler.cpp b/src/server/game/Server/Protocol/Handlers/LFGHandler.cpp
index b9021c68c0e..61d5e6a2da4 100755
--- a/src/server/game/Server/Protocol/Handlers/LFGHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/LFGHandler.cpp
@@ -24,39 +24,27 @@
#include "ObjectMgr.h"
-void BuildPlayerLockDungeonBlock(WorldPacket &data, LfgLockStatusSet* lockSet)
+void BuildPlayerLockDungeonBlock(WorldPacket& data, const LfgLockMap& lock)
{
- if (!lockSet)
+ data << uint32(lock.size()); // Size of lock dungeons
+ for (LfgLockMap::const_iterator it = lock.begin(); it != lock.end(); ++it)
{
- data << uint8(0);
- return;
- }
-
- data << uint32(lockSet->size()); // Size of lock dungeons
- for (LfgLockStatusSet::const_iterator it = lockSet->begin(); it != lockSet->end(); ++it)
- {
- data << uint32((*it)->dungeon); // Dungeon entry + type
- data << uint32((*it)->lockstatus); // Lock status
+ data << uint32(it->first); // Dungeon entry (id + type)
+ data << uint32(it->second); // Lock status
}
}
-void BuildPartyLockDungeonBlock(WorldPacket &data, LfgLockStatusMap* lockMap)
+void BuildPartyLockDungeonBlock(WorldPacket& data, const LfgLockPartyMap& lockMap)
{
- if (!lockMap)
+ data << uint8(lockMap.size());
+ for (LfgLockPartyMap::const_iterator it = lockMap.begin(); it != lockMap.end(); ++it)
{
- data << uint8(0);
- return;
- }
-
- data << uint8(lockMap->size());
- for (LfgLockStatusMap::const_iterator it = lockMap->begin(); it != lockMap->end(); ++it)
- {
- data << uint64(MAKE_NEW_GUID(it->first, 0, HIGHGUID_PLAYER)); // Player guid
+ data << uint64(it->first); // Player guid
BuildPlayerLockDungeonBlock(data, it->second);
}
}
-void WorldSession::HandleLfgJoinOpcode(WorldPacket &recv_data)
+void WorldSession::HandleLfgJoinOpcode(WorldPacket& recv_data)
{
if (!sWorld.getBoolConfig(CONFIG_DUNGEON_FINDER_ENABLE) ||
(GetPlayer()->GetGroup() && GetPlayer()->GetGroup()->GetLeaderGUID() != GetPlayer()->GetGUID()))
@@ -70,7 +58,7 @@ void WorldSession::HandleLfgJoinOpcode(WorldPacket &recv_data)
uint32 roles;
recv_data >> roles;
- recv_data.read_skip<uint16>(); // uint8 (always 0) - uint8 (always 0)
+ recv_data.read_skip<uint16>(); // uint8 (always 0) - uint8 (always 0)
recv_data >> numDungeons;
if (!numDungeons)
{
@@ -83,18 +71,18 @@ void WorldSession::HandleLfgJoinOpcode(WorldPacket &recv_data)
for (int8 i = 0 ; i < numDungeons; ++i)
{
recv_data >> dungeon;
- newDungeons.insert((dungeon & 0x00FFFFFF)); // remove the type from the dungeon entry
+ newDungeons.insert((dungeon & 0x00FFFFFF)); // remove the type from the dungeon entry
}
- recv_data.read_skip<uint32>(); // for 0..uint8 (always 3) { uint8 (always 0) }
+ recv_data.read_skip<uint32>(); // for 0..uint8 (always 3) { uint8 (always 0) }
std::string comment;
recv_data >> comment;
sLog.outDebug("CMSG_LFG_JOIN [" UI64FMTD "] roles: %u, Dungeons: %u, Comment: %s", GetPlayer()->GetGUID(), roles, uint8(newDungeons.size()), comment.c_str());
- sLFGMgr.Join(GetPlayer(), LfgRoles(roles), newDungeons, comment);
+ sLFGMgr.Join(GetPlayer(), uint8(roles), newDungeons, comment);
}
-void WorldSession::HandleLfgLeaveOpcode(WorldPacket & /*recv_data*/)
+void WorldSession::HandleLfgLeaveOpcode(WorldPacket& /*recv_data*/)
{
Group* grp = GetPlayer()->GetGroup();
@@ -105,10 +93,10 @@ void WorldSession::HandleLfgLeaveOpcode(WorldPacket & /*recv_data*/)
sLFGMgr.Leave(GetPlayer(), grp);
}
-void WorldSession::HandleLfgProposalResultOpcode(WorldPacket &recv_data)
+void WorldSession::HandleLfgProposalResultOpcode(WorldPacket& recv_data)
{
- uint32 lfgGroupID; // Internal lfgGroupID
- bool accept; // Accept to join?
+ uint32 lfgGroupID; // Internal lfgGroupID
+ bool accept; // Accept to join?
recv_data >> lfgGroupID;
recv_data >> accept;
@@ -116,10 +104,10 @@ void WorldSession::HandleLfgProposalResultOpcode(WorldPacket &recv_data)
sLFGMgr.UpdateProposal(lfgGroupID, GetPlayer()->GetGUID(), accept);
}
-void WorldSession::HandleLfgSetRolesOpcode(WorldPacket &recv_data)
+void WorldSession::HandleLfgSetRolesOpcode(WorldPacket& recv_data)
{
uint8 roles;
- recv_data >> roles; // Player Group Roles
+ recv_data >> roles; // Player Group Roles
uint64 guid = GetPlayer()->GetGUID();
Group* grp = GetPlayer()->GetGroup();
if (!grp)
@@ -128,10 +116,10 @@ void WorldSession::HandleLfgSetRolesOpcode(WorldPacket &recv_data)
return;
}
sLog.outDebug("CMSG_LFG_SET_ROLES [" UI64FMTD "] Roles: %u", guid, roles);
- sLFGMgr.UpdateRoleCheck(grp, GetPlayer(), LfgRoles(roles));
+ sLFGMgr.UpdateRoleCheck(grp, GetPlayer());
}
-void WorldSession::HandleLfgSetCommentOpcode(WorldPacket & recv_data)
+void WorldSession::HandleLfgSetCommentOpcode(WorldPacket& recv_data)
{
std::string comment;
recv_data >> comment;
@@ -141,16 +129,16 @@ void WorldSession::HandleLfgSetCommentOpcode(WorldPacket & recv_data)
sLFGMgr.SetComment(guid, comment);
}
-void WorldSession::HandleLfgSetBootVoteOpcode(WorldPacket &recv_data)
+void WorldSession::HandleLfgSetBootVoteOpcode(WorldPacket& recv_data)
{
- bool agree; // Agree to kick player
+ bool agree; // Agree to kick player
recv_data >> agree;
sLog.outDebug("CMSG_LFG_SET_BOOT_VOTE [" UI64FMTD "] agree: %u", GetPlayer()->GetGUID(), agree ? 1 : 0);
sLFGMgr.UpdateBoot(GetPlayer(), agree);
}
-void WorldSession::HandleLfgTeleportOpcode(WorldPacket &recv_data)
+void WorldSession::HandleLfgTeleportOpcode(WorldPacket& recv_data)
{
bool out;
recv_data >> out;
@@ -159,10 +147,12 @@ void WorldSession::HandleLfgTeleportOpcode(WorldPacket &recv_data)
sLFGMgr.TeleportPlayer(GetPlayer(), out, true);
}
-void WorldSession::HandleLfgPlayerLockInfoRequestOpcode(WorldPacket &/*recv_data*/)
+void WorldSession::HandleLfgPlayerLockInfoRequestOpcode(WorldPacket& /*recv_data*/)
{
- sLog.outDebug("CMSG_LFD_PLAYER_LOCK_INFO_REQUEST [" UI64FMTD "]", GetPlayer()->GetGUID());
+ uint64 guid = GetPlayer()->GetGUID();
+ sLog.outDebug("CMSG_LFD_PLAYER_LOCK_INFO_REQUEST [" UI64FMTD "]", guid);
+ // Get Random dungeons that can be done at a certain level and expansion
// FIXME - Should return seasonals (when not disabled)
LfgDungeonSet randomDungeons;
uint8 level = GetPlayer()->getLevel();
@@ -170,113 +160,125 @@ void WorldSession::HandleLfgPlayerLockInfoRequestOpcode(WorldPacket &/*recv_data
for (uint32 i = 0; i < sLFGDungeonStore.GetNumRows(); ++i)
{
LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(i);
- if (dungeon && dungeon->type == LFG_TYPE_RANDOM && dungeon && dungeon->expansion <= expansion &&
+ if (dungeon && dungeon->type == LFG_TYPE_RANDOM && dungeon->expansion <= expansion &&
dungeon->minlevel <= level && level <= dungeon->maxlevel)
randomDungeons.insert(dungeon->Entry());
}
- LfgLockStatusSet* lockSet = sLFGMgr.GetPlayerLockStatusDungeons(GetPlayer());
+ // Get player locked Dungeons
+ LfgLockMap lock = sLFGMgr.GetLockedDungeons(guid);
uint32 rsize = uint32(randomDungeons.size());
- uint32 lsize = lockSet ? uint32(lockSet->size()) : 0;
+ uint32 lsize = uint32(lock.size());
- sLog.outDebug("SMSG_LFG_PLAYER_INFO [" UI64FMTD "]", GetPlayer()->GetGUID());
+ sLog.outDebug("SMSG_LFG_PLAYER_INFO [" UI64FMTD "]", guid);
WorldPacket data(SMSG_LFG_PLAYER_INFO, 1 + rsize * (4 + 1 + 4 + 4 + 4 + 4 + 1 + 4 + 4 + 4) + 4 + lsize * (1 + 4 + 4 + 4 + 4 + 1 + 4 + 4 + 4));
- if (!randomDungeons.size())
- data << uint8(0);
- else
+
+ data << uint8(randomDungeons.size()); // Random Dungeon count
+ for (LfgDungeonSet::const_iterator it = randomDungeons.begin(); it != randomDungeons.end(); ++it)
{
- LfgReward const* reward = NULL;
+ data << uint32(*it); // Dungeon Entry (id + type)
+ LfgReward const* reward = sLFGMgr.GetRandomDungeonReward(*it, level);
Quest const* qRew = NULL;
uint8 done = 0;
-
- data << uint8(randomDungeons.size()); // Random Dungeon count
- for (LfgDungeonSet::iterator it = randomDungeons.begin(); it != randomDungeons.end(); ++it)
+ if (reward)
{
- data << uint32(*it); // Entry
- reward = sLFGMgr.GetRandomDungeonReward(*it, level);
- qRew = NULL;
- if (reward)
+ qRew = sObjectMgr.GetQuestTemplate(reward->reward[0].questId);
+ if (qRew)
{
- qRew = sObjectMgr.GetQuestTemplate(reward->reward[0].questId);
- if (qRew)
- {
- done = !GetPlayer()->CanRewardQuest(qRew,false);
- if (done)
- qRew = sObjectMgr.GetQuestTemplate(reward->reward[1].questId);
- }
-
+ done = !GetPlayer()->CanRewardQuest(qRew, false);
+ if (done)
+ qRew = sObjectMgr.GetQuestTemplate(reward->reward[1].questId);
}
- if (qRew)
+ }
+ if (qRew)
+ {
+ data << uint8(done);
+ data << uint32(qRew->GetRewOrReqMoney());
+ data << uint32(qRew->XPValue(GetPlayer()));
+ data << uint32(reward->reward[done].variableMoney);
+ data << uint32(reward->reward[done].variableXP);
+ data << uint8(qRew->GetRewItemsCount());
+ if (qRew->GetRewItemsCount())
{
- data << uint8(done);
- data << uint32(qRew->GetRewOrReqMoney());
- data << uint32(qRew->XPValue(GetPlayer()));
- data << uint32(reward->reward[done].variableMoney);
- data << uint32(reward->reward[done].variableXP);
- data << uint8(qRew->GetRewItemsCount());
- if (qRew->GetRewItemsCount())
+ ItemPrototype const* iProto = NULL;
+ for (uint8 i = 0; i < QUEST_REWARDS_COUNT; ++i)
{
- ItemPrototype const* iProto = NULL;
- for (uint8 i = 0; i < QUEST_REWARDS_COUNT; ++i)
- {
- if (!qRew->RewItemId[i])
- continue;
-
- iProto = ObjectMgr::GetItemPrototype(qRew->RewItemId[i]);
-
- data << uint32(qRew->RewItemId[i]);
- data << uint32(iProto ? iProto->DisplayInfoID : 0);
- data << uint32(qRew->RewItemCount[i]);
- }
+ if (!qRew->RewItemId[i])
+ continue;
+
+ iProto = ObjectMgr::GetItemPrototype(qRew->RewItemId[i]);
+
+ data << uint32(qRew->RewItemId[i]);
+ data << uint32(iProto ? iProto->DisplayInfoID : 0);
+ data << uint32(qRew->RewItemCount[i]);
}
}
- else
- {
- data << uint8(0);
- data << uint32(0);
- data << uint32(0);
- data << uint32(0);
- data << uint32(0);
- data << uint8(0);
- }
+ }
+ else
+ {
+ data << uint8(0);
+ data << uint32(0);
+ data << uint32(0);
+ data << uint32(0);
+ data << uint32(0);
+ data << uint8(0);
}
}
- BuildPlayerLockDungeonBlock(data, lockSet);
+ BuildPlayerLockDungeonBlock(data, lock);
SendPacket(&data);
}
-void WorldSession::HandleLfgPartyLockInfoRequestOpcode(WorldPacket & /*recv_data*/)
+void WorldSession::HandleLfgPartyLockInfoRequestOpcode(WorldPacket& /*recv_data*/)
{
- sLog.outDebug("CMSG_LFD_PARTY_LOCK_INFO_REQUEST [" UI64FMTD "]", GetPlayer()->GetGUID());
- if (LfgLockStatusMap* lockMap = sLFGMgr.GetPartyLockStatusDungeons(GetPlayer()))
+ uint64 guid = GetPlayer()->GetGUID();
+ sLog.outDebug("CMSG_LFD_PARTY_LOCK_INFO_REQUEST [" UI64FMTD "]", guid);
+
+ Group* grp = GetPlayer()->GetGroup();
+ if (!grp)
+ return;
+
+ // Get the locked dungeons of the other party members
+ LfgLockPartyMap lockMap;
+ for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
{
- uint32 size = 0;
- for (LfgLockStatusMap::const_iterator it = lockMap->begin(); it != lockMap->end(); ++it)
- size += 8 + 4 + it->second->size() * (4 + 4);
- sLog.outDebug("SMSG_LFG_PARTY_INFO [" UI64FMTD "]", GetPlayer()->GetGUID());
- WorldPacket data(SMSG_LFG_PARTY_INFO, 1 + size);
- BuildPartyLockDungeonBlock(data, lockMap);
- SendPacket(&data);
+ Player* plrg = itr->getSource();
+ if (!plrg)
+ continue;
+
+ uint64 pguid = plrg->GetGUID();
+ if (pguid == guid)
+ continue;
+
+ lockMap[pguid] = sLFGMgr.GetLockedDungeons(pguid);
}
+
+ uint32 size = 0;
+ for (LfgLockPartyMap::const_iterator it = lockMap.begin(); it != lockMap.end(); ++it)
+ size += 8 + 4 + uint32(it->second.size()) * (4 + 4);
+
+ sLog.outDebug("SMSG_LFG_PARTY_INFO [" UI64FMTD "]", guid);
+ WorldPacket data(SMSG_LFG_PARTY_INFO, 1 + size);
+ BuildPartyLockDungeonBlock(data, lockMap);
+ SendPacket(&data);
}
-void WorldSession::HandleLfrSearchOpcode(WorldPacket &recv_data)
+void WorldSession::HandleLfrSearchOpcode(WorldPacket& recv_data)
{
- uint32 entry; // Raid id to search
+ uint32 entry; // Raid id to search
recv_data >> entry;
sLog.outDebug("CMSG_SEARCH_LFG_JOIN [" UI64FMTD "] dungeon entry: %u", GetPlayer()->GetGUID(), entry);
//SendLfrUpdateListOpcode(entry);
}
-void WorldSession::HandleLfrLeaveOpcode(WorldPacket &recv_data)
+void WorldSession::HandleLfrLeaveOpcode(WorldPacket& recv_data)
{
- uint32 dungeonId; // Raid id queue to leave
+ uint32 dungeonId; // Raid id queue to leave
recv_data >> dungeonId;
sLog.outDebug("CMSG_SEARCH_LFG_LEAVE [" UI64FMTD "] dungeonId: %u", GetPlayer()->GetGUID(), dungeonId);
//sLFGMgr.LeaveLfr(GetPlayer(), dungeonId);
}
-void WorldSession::SendLfgUpdatePlayer(LfgUpdateData updateData)
+void WorldSession::SendLfgUpdatePlayer(const LfgUpdateData& updateData)
{
bool queued = false;
bool extrainfo = false;
@@ -297,17 +299,17 @@ void WorldSession::SendLfgUpdatePlayer(LfgUpdateData updateData)
}
uint64 guid = GetPlayer()->GetGUID();
- uint8 size = updateData.dungeons ? updateData.dungeons->size() : 0;
+ uint8 size = updateData.dungeons ? uint8(updateData.dungeons->size()) : 0;
sLog.outDebug("SMSG_LFG_UPDATE_PLAYER [" UI64FMTD "] updatetype: %u", guid, updateData.updateType);
WorldPacket data(SMSG_LFG_UPDATE_PLAYER, 1 + 1 + (extrainfo ? 1 : 0) * (1 + 1 + 1 + 1 + size * 4 + updateData.comment.length()));
- data << uint8(updateData.updateType); // Lfg Update type
- data << uint8(extrainfo); // Extra info
+ data << uint8(updateData.updateType); // Lfg Update type
+ data << uint8(extrainfo); // Extra info
if (extrainfo)
{
- data << uint8(queued); // Join the queue
- data << uint8(0); // unk - Always 0
- data << uint8(0); // unk - Always 0
+ data << uint8(queued); // Join the queue
+ data << uint8(0); // unk - Always 0
+ data << uint8(0); // unk - Always 0
data << uint8(size);
if (size)
@@ -318,7 +320,7 @@ void WorldSession::SendLfgUpdatePlayer(LfgUpdateData updateData)
SendPacket(&data);
}
-void WorldSession::SendLfgUpdateParty(LfgUpdateData updateData)
+void WorldSession::SendLfgUpdateParty(const LfgUpdateData& updateData)
{
bool join = false;
bool extrainfo = false;
@@ -347,20 +349,20 @@ void WorldSession::SendLfgUpdateParty(LfgUpdateData updateData)
}
uint64 guid = GetPlayer()->GetGUID();
- uint8 size = updateData.dungeons ? updateData.dungeons->size() : 0;
+ uint8 size = updateData.dungeons ? uint8(updateData.dungeons->size()) : 0;
sLog.outDebug("SMSG_LFG_UPDATE_PARTY [" UI64FMTD "] updatetype: %u", guid, updateData.updateType);
WorldPacket data(SMSG_LFG_UPDATE_PARTY, 1 + 1 + (extrainfo ? 1 : 0) * (1 + 1 + 1 + 1 + 1 + size * 4 + updateData.comment.length()));
- data << uint8(updateData.updateType); // Lfg Update type
- data << uint8(extrainfo); // Extra info
+ data << uint8(updateData.updateType); // Lfg Update type
+ data << uint8(extrainfo); // Extra info
if (extrainfo)
{
- data << uint8(join); // LFG Join
- data << uint8(queued); // Join the queue
- data << uint8(0); // unk - Always 0
- data << uint8(0); // unk - Always 0
+ data << uint8(join); // LFG Join
+ data << uint8(queued); // Join the queue
+ data << uint8(0); // unk - Always 0
+ data << uint8(0); // unk - Always 0
for (uint8 i = 0; i < 3; ++i)
- data << uint8(0); // unk - Always 0
+ data << uint8(0); // unk - Always 0
data << uint8(size);
if (size)
@@ -376,13 +378,13 @@ void WorldSession::SendLfgRoleChosen(uint64 guid, uint8 roles)
sLog.outDebug("SMSG_LFG_ROLE_CHOSEN [" UI64FMTD "] guid: [" UI64FMTD "] roles: %u", GetPlayer()->GetGUID(), guid, roles);
WorldPacket data(SMSG_LFG_ROLE_CHOSEN, 8 + 1 + 4);
- data << uint64(guid); // Guid
- data << uint8(roles > 0); // Ready
- data << uint32(roles); // Roles
+ data << uint64(guid); // Guid
+ data << uint8(roles > 0); // Ready
+ data << uint32(roles); // Roles
SendPacket(&data);
}
-void WorldSession::SendLfgRoleCheckUpdate(LfgRoleCheck* pRoleCheck)
+void WorldSession::SendLfgRoleCheckUpdate(const LfgRoleCheck* pRoleCheck)
{
ASSERT(pRoleCheck);
LfgDungeonSet dungeons;
@@ -394,12 +396,9 @@ void WorldSession::SendLfgRoleCheckUpdate(LfgRoleCheck* pRoleCheck)
sLog.outDebug("SMSG_LFG_ROLE_CHECK_UPDATE [" UI64FMTD "]", GetPlayer()->GetGUID());
WorldPacket data(SMSG_LFG_ROLE_CHECK_UPDATE, 4 + 1 + 1 + dungeons.size() * 4 + 1 + pRoleCheck->roles.size() * (8 + 1 + 4 + 1));
- Player* plr;
- uint8 roles;
-
- data << uint32(pRoleCheck->state); // Check result
+ data << uint32(pRoleCheck->state); // Check result
data << uint8(pRoleCheck->state == LFG_ROLECHECK_INITIALITING);
- data << uint8(dungeons.size()); // Number of dungeons
+ data << uint8(dungeons.size()); // Number of dungeons
if (dungeons.size())
{
for (LfgDungeonSet::iterator it = dungeons.begin(); it != dungeons.end(); ++it)
@@ -409,49 +408,46 @@ void WorldSession::SendLfgRoleCheckUpdate(LfgRoleCheck* pRoleCheck)
}
}
- data << uint8(pRoleCheck->roles.size()); // Players in group
+ data << uint8(pRoleCheck->roles.size()); // Players in group
if (pRoleCheck->roles.size())
{
// Leader info MUST be sent 1st :S
- roles = pRoleCheck->roles[pRoleCheck->leader];
- uint64 guid = MAKE_NEW_GUID(pRoleCheck->leader, 0, HIGHGUID_PLAYER);
- data << uint64(guid); // Guid
- data << uint8(roles > 0); // Ready
- data << uint32(roles); // Roles
- plr = sObjectMgr.GetPlayer(guid);
- data << uint8(plr ? plr->getLevel() : 0); // Level
-
- for (LfgRolesMap::const_iterator itPlayers = pRoleCheck->roles.begin(); itPlayers != pRoleCheck->roles.end(); ++itPlayers)
+ uint64 guid = pRoleCheck->leader;
+ uint8 roles = pRoleCheck->roles.find(guid)->second;
+ data << uint64(guid); // Guid
+ data << uint8(roles > 0); // Ready
+ data << uint32(roles); // Roles
+ Player* plr = sObjectMgr.GetPlayer(guid);
+ data << uint8(plr ? plr->getLevel() : 0); // Level
+
+ for (LfgRolesMap::const_iterator it = pRoleCheck->roles.begin(); it != pRoleCheck->roles.end(); ++it)
{
- if (itPlayers->first == pRoleCheck->leader)
+ if (it->first == pRoleCheck->leader)
continue;
- roles = itPlayers->second;
- guid = MAKE_NEW_GUID(itPlayers->first, 0, HIGHGUID_PLAYER);
- data << uint64(guid); // Guid
- data << uint8(roles > 0); // Ready
- data << uint32(roles); // Roles
+ guid = it->first;
+ roles = it->second;
+ data << uint64(guid); // Guid
+ data << uint8(roles > 0); // Ready
+ data << uint32(roles); // Roles
plr = sObjectMgr.GetPlayer(guid);
- data << uint8(plr ? plr->getLevel() : 0); // Level
+ data << uint8(plr ? plr->getLevel() : 0); // Level
}
}
SendPacket(&data);
}
-void WorldSession::SendLfgJoinResult(LfgJoinResultData& joinData)
+void WorldSession::SendLfgJoinResult(const LfgJoinResultData& joinData)
{
uint32 size = 0;
- if (joinData.lockmap)
- {
- for (LfgLockStatusMap::const_iterator it = joinData.lockmap->begin(); it != joinData.lockmap->end(); ++it)
- size += 8 + 4 + it->second->size() * (4 + 4);
- }
+ for (LfgLockPartyMap::const_iterator it = joinData.lockmap.begin(); it != joinData.lockmap.end(); ++it)
+ size += 8 + 4 + uint32(it->second.size()) * (4 + 4);
sLog.outDebug("SMSG_LFG_JOIN_RESULT [" UI64FMTD "] checkResult: %u checkValue: %u", GetPlayer()->GetGUID(), joinData.result, joinData.state);
WorldPacket data(SMSG_LFG_JOIN_RESULT, 4 + 4 + size);
- data << uint32(joinData.result); // Check Result
- data << uint32(joinData.state); // Check Value
- if (joinData.lockmap)
+ data << uint32(joinData.result); // Check Result
+ data << uint32(joinData.state); // Check Value
+ if (!joinData.lockmap.empty())
BuildPartyLockDungeonBlock(data, joinData.lockmap);
SendPacket(&data);
}
@@ -461,16 +457,16 @@ void WorldSession::SendLfgQueueStatus(uint32 dungeon, int32 waitTime, int32 avgW
sLog.outDebug("SMSG_LFG_QUEUE_STATUS [" UI64FMTD "] dungeon: %u - waitTime: %d - avgWaitTime: %d - waitTimeTanks: %d - waitTimeHealer: %d - waitTimeDps: %d - queuedTime: %u - tanks: %u - healers: %u - dps: %u", GetPlayer()->GetGUID(), dungeon, waitTime, avgWaitTime, waitTimeTanks, waitTimeHealer, waitTimeDps, queuedTime, tanks, healers, dps);
WorldPacket data(SMSG_LFG_QUEUE_STATUS, 4 + 4 + 4 + 4 + 4 +4 + 1 + 1 + 1 + 4);
- data << uint32(dungeon); // Dungeon
- data << int32(avgWaitTime); // Average Wait time
- data << int32(waitTime); // Wait Time
- data << int32(waitTimeTanks); // Wait Tanks
- data << int32(waitTimeHealer); // Wait Healers
- data << int32(waitTimeDps); // Wait Dps
- data << uint8(tanks); // Tanks needed
- data << uint8(healers); // Healers needed
- data << uint8(dps); // Dps needed
- data << uint32(queuedTime); // Player wait time in queue
+ data << uint32(dungeon); // Dungeon
+ data << int32(avgWaitTime); // Average Wait time
+ data << int32(waitTime); // Wait Time
+ data << int32(waitTimeTanks); // Wait Tanks
+ data << int32(waitTimeHealer); // Wait Healers
+ data << int32(waitTimeDps); // Wait Dps
+ data << uint8(tanks); // Tanks needed
+ data << uint8(healers); // Healers needed
+ data << uint8(dps); // Dps needed
+ data << uint32(queuedTime); // Player wait time in queue
SendPacket(&data);
}
@@ -479,12 +475,12 @@ void WorldSession::SendLfgPlayerReward(uint32 rdungeonEntry, uint32 sdungeonEntr
if (!rdungeonEntry || !sdungeonEntry || !qRew)
return;
- uint8 itemNum = qRew ? qRew->GetRewItemsCount() : 0;
+ uint8 itemNum = uint8(qRew ? qRew->GetRewItemsCount() : 0);
sLog.outDebug("SMSG_LFG_PLAYER_REWARD [" UI64FMTD "] rdungeonEntry: %u - sdungeonEntry: %u - done: %u", GetPlayer()->GetGUID(), rdungeonEntry, sdungeonEntry, done);
WorldPacket data(SMSG_LFG_PLAYER_REWARD, 4 + 4 + 1 + 4 + 4 + 4 + 4 + 4 + 1 + itemNum * (4 + 4 + 4));
- data << uint32(rdungeonEntry); // Random Dungeon Finished
- data << uint32(sdungeonEntry); // Dungeon Finished
+ data << uint32(rdungeonEntry); // Random Dungeon Finished
+ data << uint32(sdungeonEntry); // Dungeon Finished
data << uint8(done);
data << uint32(1);
data << uint32(qRew->GetRewOrReqMoney());
@@ -510,9 +506,10 @@ void WorldSession::SendLfgPlayerReward(uint32 rdungeonEntry, uint32 sdungeonEntr
SendPacket(&data);
}
-void WorldSession::SendLfgBootPlayer(LfgPlayerBoot* pBoot)
+void WorldSession::SendLfgBootPlayer(const LfgPlayerBoot* pBoot)
{
- int8 playerVote = pBoot->votes[GetPlayer()->GetGUIDLow()];
+ uint64 guid = GetPlayer()->GetGUID();
+ LfgAnswer playerVote = pBoot->votes.find(guid)->second;
uint8 votesNum = 0;
uint8 agreeNum = 0;
uint32 secsleft = uint8((pBoot->cancelTime - time(NULL)) / 1000);
@@ -526,30 +523,28 @@ void WorldSession::SendLfgBootPlayer(LfgPlayerBoot* pBoot)
}
}
sLog.outDebug("SMSG_LFG_BOOT_PLAYER [" UI64FMTD "] inProgress: %u - didVote: %u - agree: %u - victim: [" UI64FMTD "] votes: %u - agrees: %u - left: %u - needed: %u - reason %s",
- GetPlayer()->GetGUID(), uint8(pBoot->inProgress), uint8(playerVote != LFG_ANSWER_PENDING), uint8(playerVote == LFG_ANSWER_AGREE), pBoot->victim, votesNum, agreeNum, secsleft, pBoot->votedNeeded, pBoot->reason.c_str());
+ guid, uint8(pBoot->inProgress), uint8(playerVote != LFG_ANSWER_PENDING), uint8(playerVote == LFG_ANSWER_AGREE), pBoot->victim, votesNum, agreeNum, secsleft, pBoot->votedNeeded, pBoot->reason.c_str());
WorldPacket data(SMSG_LFG_BOOT_PLAYER, 1 + 1 + 1 + 8 + 4 + 4 + 4 + 4 + pBoot->reason.length());
- data << uint8(pBoot->inProgress); // Vote in progress
- data << uint8(playerVote != LFG_ANSWER_PENDING); // Did Vote
- data << uint8(playerVote == LFG_ANSWER_AGREE); // Agree
- data << uint64(pBoot->victim); // Victim GUID
- data << uint32(votesNum); // Total Votes
- data << uint32(agreeNum); // Agree Count
- data << uint32(secsleft); // Time Left
- data << uint32(pBoot->votedNeeded); // Needed Votes
- data << pBoot->reason.c_str(); // Kick reason
+ data << uint8(pBoot->inProgress); // Vote in progress
+ data << uint8(playerVote != LFG_ANSWER_PENDING); // Did Vote
+ data << uint8(playerVote == LFG_ANSWER_AGREE); // Agree
+ data << uint64(pBoot->victim); // Victim GUID
+ data << uint32(votesNum); // Total Votes
+ data << uint32(agreeNum); // Agree Count
+ data << uint32(secsleft); // Time Left
+ data << uint32(pBoot->votedNeeded); // Needed Votes
+ data << pBoot->reason.c_str(); // Kick reason
SendPacket(&data);
}
-void WorldSession::SendLfgUpdateProposal(uint32 proposalId, LfgProposal* pProp)
+void WorldSession::SendLfgUpdateProposal(uint32 proposalId, const LfgProposal* pProp)
{
if (!pProp)
return;
- uint32 pLogGuid = GetPlayer()->GetGUIDLow();
uint64 guid = GetPlayer()->GetGUID();
-
- LfgProposalPlayerMap::const_iterator itPlayer = pProp->players.find(pLogGuid);
- if (itPlayer == pProp->players.end()) // Player MUST be in the proposal
+ LfgProposalPlayerMap::const_iterator itPlayer = pProp->players.find(guid);
+ if (itPlayer == pProp->players.end()) // Player MUST be in the proposal
return;
LfgProposalPlayer* ppPlayer = itPlayer->second;
@@ -569,7 +564,7 @@ void WorldSession::SendLfgUpdateProposal(uint32 proposalId, LfgProposal* pProp)
sLog.outDebug("SMSG_LFG_PROPOSAL_UPDATE [" UI64FMTD "] state: %u", GetPlayer()->GetGUID(), pProp->state);
WorldPacket data(SMSG_LFG_PROPOSAL_UPDATE, 4 + 1 + 4 + 4 + 1 + 1 + pProp->players.size() * (4 + 1 + 1 + 1 + 1 +1));
- if (!isContinue) // Only show proposal dungeon if it's continue
+ if (!isContinue) // Only show proposal dungeon if it's continue
{
LfgDungeonSet playerDungeons = sLFGMgr.GetSelectedDungeons(guid);
if (playerDungeons.size())
@@ -577,22 +572,22 @@ void WorldSession::SendLfgUpdateProposal(uint32 proposalId, LfgProposal* pProp)
}
if (LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(dungeonId))
dungeonId = dungeon->Entry();
- data << uint32(dungeonId); // Dungeon
- data << uint8(pProp->state); // Result state
- data << uint32(proposalId); // Internal Proposal ID
- data << uint32(0); // Bosses killed - FIXME
- data << uint8(isSameDungeon); // Silent (show client window)
- data << uint8(pProp->players.size()); // Group size
+ data << uint32(dungeonId); // Dungeon
+ data << uint8(pProp->state); // Result state
+ data << uint32(proposalId); // Internal Proposal ID
+ data << uint32(0); // Bosses killed - FIXME
+ data << uint8(isSameDungeon); // Silent (show client window)
+ data << uint8(pProp->players.size()); // Group size
for (itPlayer = pProp->players.begin(); itPlayer != pProp->players.end(); ++itPlayer)
{
ppPlayer = itPlayer->second;
- data << uint32(ppPlayer->role); // Role
- data << uint8(itPlayer->first == pLogGuid); // Self player
- if (!ppPlayer->groupLowGuid) // Player not it a group
+ data << uint32(ppPlayer->role); // Role
+ data << uint8(itPlayer->first == guid); // Self player
+ if (!ppPlayer->groupLowGuid) // Player not it a group
{
- data << uint8(0); // Not in dungeon
- data << uint8(0); // Not same group
+ data << uint8(0); // Not in dungeon
+ data << uint8(0); // Not same group
}
else
{
@@ -609,7 +604,7 @@ void WorldSession::SendLfgUpdateSearch(bool update)
{
sLog.outDebug("SMSG_LFG_UPDATE_SEARCH [" UI64FMTD "] update: %u", GetPlayer()->GetGUID(), update ? 1 : 0);
WorldPacket data(SMSG_LFG_UPDATE_SEARCH, 1);
- data << uint8(update); // In Lfg Queue?
+ data << uint8(update); // In Lfg Queue?
SendPacket(&data);
}
@@ -632,7 +627,7 @@ void WorldSession::SendLfgTeleportError(uint8 err)
{
sLog.outDebug("SMSG_LFG_TELEPORT_DENIED [" UI64FMTD "] reason: %u", GetPlayer()->GetGUID(), err);
WorldPacket data(SMSG_LFG_TELEPORT_DENIED, 4);
- data << uint32(err); // Error
+ data << uint32(err); // Error
SendPacket(&data);
}
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index c2476ec467d..809d48e5a6b 100755
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -768,16 +768,16 @@ class WorldSession
void HandleLfrSearchOpcode(WorldPacket &recv_data);
void HandleLfrLeaveOpcode(WorldPacket &recv_data);
- void SendLfgUpdatePlayer(LfgUpdateData updateData);
- void SendLfgUpdateParty(LfgUpdateData updateData);
+ void SendLfgUpdatePlayer(const LfgUpdateData& updateData);
+ void SendLfgUpdateParty(const LfgUpdateData& updateData);
void SendLfgRoleChosen(uint64 guid, uint8 roles);
- void SendLfgRoleCheckUpdate(LfgRoleCheck *pRoleCheck);
+ void SendLfgRoleCheckUpdate(const LfgRoleCheck *pRoleCheck);
void SendLfgUpdateSearch(bool update);
- void SendLfgJoinResult(LfgJoinResultData& joinData);
+ void SendLfgJoinResult(const LfgJoinResultData& joinData);
void SendLfgQueueStatus(uint32 dungeon, int32 waitTime, int32 avgWaitTime, int32 waitTimeTanks, int32 waitTimeHealer, int32 waitTimeDps, uint32 queuedTime, uint8 tanks, uint8 healers, uint8 dps);
void SendLfgPlayerReward(uint32 rdungeonEntry, uint32 sdungeonEntry, uint8 done, const LfgReward *reward, const Quest *qRew);
- void SendLfgBootPlayer(LfgPlayerBoot *pBoot);
- void SendLfgUpdateProposal(uint32 proposalId, LfgProposal *pProp);
+ void SendLfgBootPlayer(const LfgPlayerBoot *pBoot);
+ void SendLfgUpdateProposal(uint32 proposalId, const LfgProposal *pProp);
void SendLfgDisabled();
void SendLfgOfferContinue(uint32 dungeonEntry);
void SendLfgTeleportError(uint8 err);