36 bool IsScenarioDifficulty(
uint32 difficulty)
41 bool IsScenarioDungeon(LFGDungeonEntry
const* dungeon)
55 if (IsScenarioDifficulty(dungeon.difficulty))
58 MapEntry
const* map =
sMapStore.LookupEntry(dungeon.map);
67 MapEntry
const* map =
sMapStore.LookupEntry(dungeon.map);
68 return map && map->
IsRaid();
78 if (!dungeon.map || (dungeon.x == 0.0f && dungeon.y == 0.0f && dungeon.z == 0.0f))
89 MapEntry
const* map =
sMapStore.LookupEntry(dungeon.map);
97 InstanceSave* save =
sInstanceSaveMgr->AddInstanceSave(dungeon.map,
sMapMgr->GenerateInstanceId(), difficulty, 0,
true);
104 struct LfgRoleAssignment
108 uint8 availableRoles;
124 bool TryAssignLfgRoles(std::vector<LfgRoleAssignment>& assignments,
size_t index,
uint8 tanks,
uint8 healers,
uint8 damage)
126 if (index == assignments.size())
129 LfgRoleAssignment& assignment = assignments[index];
132 for (
uint8 role : rolePreference)
134 if (!(assignment.availableRoles & role))
144 assignment.assignedRole = role | assignment.leader;
146 if (TryAssignLfgRoles(assignments, index + 1,
186 if (!dungeon || !state)
233 QueryResult result =
WorldDatabase.Query(
"SELECT dungeonId, maxLevel, firstQuestId, otherQuestId FROM lfg_dungeon_rewards ORDER BY dungeonId, maxLevel ASC");
237 SF_LOG_ERROR(
"server.loading",
">> Loaded 0 lfg dungeon rewards. DB table `lfg_dungeon_rewards` is empty!");
243 Field* fields = NULL;
246 fields = result->Fetch();
254 SF_LOG_ERROR(
"sql.sql",
"Dungeon %u specified in table `lfg_dungeon_rewards` does not exist!", dungeonId);
260 SF_LOG_ERROR(
"sql.sql",
"Level %u specified for dungeon %u in table `lfg_dungeon_rewards` can never be reached!", maxLevel, dungeonId);
264 if (!firstQuestId || !
sObjectMgr->GetQuestTemplate(firstQuestId))
266 SF_LOG_ERROR(
"sql.sql",
"First quest %u specified for dungeon %u in table `lfg_dungeon_rewards` does not exist!", firstQuestId, dungeonId);
270 if (otherQuestId && !
sObjectMgr->GetQuestTemplate(otherQuestId))
272 SF_LOG_ERROR(
"sql.sql",
"Other quest %u specified for dungeon %u in table `lfg_dungeon_rewards` does not exist!", otherQuestId, dungeonId);
276 RewardMapStore.insert(LfgRewardContainer::value_type(dungeonId,
new LfgReward(maxLevel, firstQuestId, otherQuestId)));
278 }
while (result->NextRow());
287 return &(itr->second);
317 if (IsScenarioDungeon(dungeon))
325 bool usingDungeonTemplate =
false;
326 QueryResult dungeonTemplateTable =
WorldDatabase.Query(
"SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'lfg_dungeon_template' LIMIT 1");
327 if (dungeonTemplateTable)
329 result =
WorldDatabase.Query(
"SELECT dungeonId, position_x, position_y, position_z, orientation, requiredItemLevel FROM lfg_dungeon_template");
331 usingDungeonTemplate =
true;
335 result =
WorldDatabase.Query(
"SELECT dungeonId, position_x, position_y, position_z, orientation FROM lfg_entrances");
343 Field* fields = result->Fetch();
345 LFGDungeonContainer::iterator dungeonItr =
LfgDungeonStore.find(dungeonId);
348 SF_LOG_ERROR(
"sql.sql",
"table `%s` contains data for wrong dungeon %u", usingDungeonTemplate ?
"lfg_dungeon_template" :
"lfg_entrances", dungeonId);
358 if (usingDungeonTemplate)
362 }
while (result->NextRow());
365 if (usingDungeonTemplate)
370 SF_LOG_ERROR(
"server.loading",
">> Loaded 0 lfg entrance positions. DB tables `lfg_dungeon_template` and `lfg_entrances` are empty or missing!");
383 SF_LOG_ERROR(
"sql.sql",
"Failed to load dungeon %s, cant find areatrigger for map %u", dungeon.
name.c_str(), dungeon.
map);
396 SF_LOG_ERROR(
"sql.sql",
"LFG dungeon %u (%s) has no valid teleport location for map %u. Add lfg_dungeon_template data.",
415 time_t currTime = time(NULL);
420 LfgRoleCheckContainer::iterator itRoleCheck = it++;
433 for (LfgRolesMap::const_iterator itRoles = roleCheck.
roles.begin(); itRoles != roleCheck.
roles.end(); ++itRoles)
435 uint64 guid = itRoles->first;
437 if (guid == roleCheck.
leader)
450 LfgProposalContainer::iterator itRemove = it++;
451 if (itRemove->second.cancelTime < currTime)
458 LfgPlayerBootContainer::iterator itBoot = it++;
462 LfgGroupDataContainer::const_iterator groupData =
GroupsStore.find(itBoot->first);
470 for (LfgAnswerContainer::const_iterator itVotes = boot.
votes.begin(); itVotes != boot.
votes.end(); ++itVotes)
472 uint64 pguid = itVotes->first;
486 if (
uint8 newProposals = it->second.FindGroups())
487 SF_LOG_DEBUG(
"lfg.update",
"Found %u new groups in queue %u", newProposals, it->first);
491 for (LfgProposalContainer::const_iterator itProposal =
ProposalsStore.upper_bound(lastProposalId); itProposal !=
ProposalsStore.end(); ++itProposal)
493 uint32 proposalId = itProposal->first;
497 for (LfgProposalPlayerContainer::const_iterator itPlayers = proposal.
players.begin(); itPlayers != proposal.
players.end(); ++itPlayers)
499 guid = itPlayers->first;
520 time_t currTime = time(NULL);
522 it->second.UpdateQueueTimers(it->first, currTime);
540 if (!player || !player->
GetSession() || dungeons.empty())
551 bool hasFlexibleRaid =
false;
560 for (LfgDungeonSet::const_iterator it = dungeons.begin(); it != dungeons.end(); ++it)
563 hasFlexibleRaid =
true;
578 if (hasActiveQueueState && !isContinue)
595 else if (dungeons.empty())
604 uint8 memberCount = 0;
607 if (
Player* plrg = itr->GetSource())
615 else if (plrg->InBattleground() || plrg->InArena() || plrg->InBattlegroundQueue())
618 players.insert(plrg->GetGUID());
627 players.insert(player->
GetGUID());
633 bool isDungeon =
false;
634 bool hasNonFlexibleRaid =
false;
635 for (LfgDungeonSet::const_iterator it = dungeons.begin(); it != dungeons.end() && joinData.
result ==
LFG_JOIN_OK; ++it)
641 if (dungeons.size() > 1)
644 rDungeonId = (*dungeons.begin());
656 hasFlexibleRaid =
true;
658 hasNonFlexibleRaid =
true;
659 if (hasFlexibleRaid && hasNonFlexibleRaid)
677 if (dungeons.empty())
685 SF_LOG_DEBUG(
"lfg.join",
"%u joining with %u members. Result: %u, Dungeons: %s",
687 if (!dungeons.empty())
693 if (isRaid && !hasFlexibleRaid)
705 std::string debugNames =
"";
719 dungeons.insert(rDungeonId);
727 if (
Player* plrg = itr->GetSource())
729 uint64 pguid = plrg->GetGUID();
730 plrg->GetSession()->SendLfgUpdateStatus(updateData,
false);
736 if (!debugNames.empty())
737 debugNames.append(
", ");
738 debugNames.append(plrg->GetName());
747 rolesMap[guid] = roles;
749 queue.
AddQueueData(guid, time(NULL), dungeons, rolesMap);
756 dungeons.insert(rDungeonId);
765 debugNames.append(player->
GetName());
809 LfgProposalPlayerContainer::iterator itPlayer = it->second.players.find(pguid);
810 if (itPlayer != it->second.players.end())
830 if (guid == gguid && gguid && !disconnected)
832 else if (guid != gguid && !disconnected)
859 LfgProposalPlayerContainer::iterator itPlayer = it->second.players.find(guid);
860 if (itPlayer != it->second.players.end())
900 LfgRoleCheckContainer::iterator itRoleCheck =
RoleChecksStore.find(gguid);
913 roleCheck.
roles[guid] = roles;
916 LfgRolesMap::const_iterator itRoles = roleCheck.
roles.begin();
920 if (itRoles == roleCheck.
roles.end())
923 check_roles = roleCheck.
roles;
924 bool scenario =
false;
925 bool flexibleRaid =
false;
926 for (LfgDungeonSet::const_iterator it = roleCheck.
dungeons.begin(); it != roleCheck.
dungeons.end(); ++it)
932 if (IsScenarioDungeon(*dungeon))
938 if (IsFlexibleRaidData(*dungeon))
942 bool rolesOk =
false;
945 else if (flexibleRaid)
961 switch (roleCheck.
state)
974 for (LfgRolesMap::const_iterator it = roleCheck.
roles.begin(); it != roleCheck.
roles.end(); ++it)
982 switch (roleCheck.
state)
992 if (roleCheck.
leader == pguid)
1024 std::map<uint32, uint32> lockedDungeons;
1025 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end() && !dungeons.empty(); ++it)
1030 for (LfgLockMap::const_iterator it2 = cachedLockMap.begin(); it2 != cachedLockMap.end() && !dungeons.empty(); ++it2)
1032 uint32 dungeonId = (it2->first & 0x00FFFFFF);
1033 LfgDungeonSet::iterator itDungeon = dungeons.find(dungeonId);
1034 if (itDungeon != dungeons.end())
1036 bool eraseDungeon =
true;
1047 uint32 dungeonInstanceId = playerSave->GetInstanceId();
1048 auto itLockedDungeon = lockedDungeons.find(dungeonId);
1049 if (itLockedDungeon == lockedDungeons.end() || itLockedDungeon->second == dungeonInstanceId)
1050 eraseDungeon =
false;
1051 lockedDungeons[dungeonId] = dungeonInstanceId;
1057 dungeons.erase(itDungeon);
1059 lockMap[guid][dungeonId] = it2->second;
1063 if (!dungeons.empty())
1078 std::vector<LfgRoleAssignment> assignments;
1079 assignments.reserve(groles.size());
1081 for (LfgRolesMap::iterator it = groles.begin(); it != groles.end(); ++it)
1083 uint8 roles = it->second & LFG_COMBAT_ROLE_MASK;
1087 LfgRoleAssignment assignment;
1088 assignment.guid = it->first;
1090 assignment.availableRoles = roles;
1092 assignments.push_back(assignment);
1095 std::sort(assignments.begin(), assignments.end(), [](LfgRoleAssignment
const& left, LfgRoleAssignment
const& right)
1097 uint8 leftCount = CountAvailableRoles(left.availableRoles);
1098 uint8 rightCount = CountAvailableRoles(right.availableRoles);
1099 if (leftCount != rightCount)
1100 return leftCount < rightCount;
1102 return left.guid < right.guid;
1105 if (!TryAssignLfgRoles(assignments, 0, 0, 0, 0))
1108 for (LfgRoleAssignment
const& assignment : assignments)
1109 groles[assignment.guid] = assignment.assignedRole;
1116 if (groles.empty() || groles.size() > neededDamage)
1119 for (LfgRolesMap::iterator it = groles.begin(); it != groles.end(); ++it)
1127 if (groles.empty() || !maxPlayers || groles.size() > maxPlayers)
1130 for (LfgRolesMap::iterator it = groles.begin(); it != groles.end(); ++it)
1133 uint8 roles = it->second & LFG_COMBAT_ROLE_MASK;
1158 for (LfgProposalPlayerContainer::const_iterator it = proposal.
players.begin(); it != proposal.
players.end(); ++it)
1161 expectedPlayers.insert(guid);
1162 if (guid == proposal.
leader)
1163 players.push_front(guid);
1165 players.push_back(guid);
1168 playersToTeleport.push_back(guid);
1175 SF_LOG_ERROR(
"lfg.proposal.group.make",
"Proposal %u cannot create group for missing dungeon %u.",
1181 bool const groupAlreadyExisted = grp != NULL;
1182 for (LfgGuidList::const_iterator it = players.begin(); it != players.end(); ++it)
1188 SF_LOG_DEBUG(
"lfg.proposal.group.make",
"Proposal %u cannot create group, player %u is offline.",
1194 if (group && group != grp)
1201 if (!grp->
Create(player))
1204 SF_LOG_ERROR(
"lfg.proposal.group.make",
"Proposal %u failed to create LFG group with leader %u.",
1214 else if (group != grp)
1218 SF_LOG_ERROR(
"lfg.proposal.group.make",
"Proposal %u failed to add player %u to group %u.",
1233 SF_LOG_ERROR(
"lfg.proposal.group.make",
"Proposal %u did not create or find a group.", proposal.
id);
1237 for (LfgGuidSet::const_iterator it = expectedPlayers.begin(); it != expectedPlayers.end(); ++it)
1241 SF_LOG_ERROR(
"lfg.proposal.group.make",
"Proposal %u created incomplete group %u, missing player %u.",
1247 bool const isRaidDungeon = IsRaidDungeon(*dungeon);
1268 for (LfgGuidList::const_iterator it = players.begin(); it != players.end(); ++it)
1274 if (!BindLfgGroupToDungeonInstance(grp, *dungeon))
1276 SF_LOG_ERROR(
"lfg.proposal.group.make",
"Proposal %u failed to bind group %u to dungeon %u map %u.",
1281 bool const forceChangeInstance = !proposal.
isNew && groupAlreadyExisted;
1284 for (LfgGuidList::const_iterator it = playersToTeleport.begin(); it != playersToTeleport.end(); ++it)
1286 if (player->GetMapId() !=
uint32(dungeon->
map) || forceChangeInstance)
1311 LfgProposalContainer::iterator itProposal =
ProposalsStore.find(proposalId);
1318 LfgProposalPlayerContainer::iterator itProposalPlayer = proposal.
players.find(guid);
1319 if (itProposalPlayer == proposal.
players.end())
1325 SF_LOG_DEBUG(
"lfg.proposal.update",
"Ignoring stale proposal response. Player %u, Proposal %u, Selection: %u, State: %u, Previous: %d",
1332 SF_LOG_DEBUG(
"lfg.proposal.update",
"Player %u is no longer in proposal group %u. Removing stale proposal %u.",
1339 for (LfgGuidList::const_iterator itQueue = proposal.
queues.begin(); itQueue != proposal.
queues.end(); ++itQueue)
1344 SF_LOG_DEBUG(
"lfg.proposal.update",
"Proposal %u has stale queue owner %u. Removing proposal.",
1353 SF_LOG_DEBUG(
"lfg.proposal.update",
"Player %u, Proposal %u, Selection: %u",
GUID_LOPART(guid), proposalId, accept);
1361 bool allAnswered =
true;
1362 for (LfgProposalPlayerContainer::const_iterator itPlayers = proposal.
players.begin(); itPlayers != proposal.
players.end(); ++itPlayers)
1364 allAnswered =
false;
1368 for (LfgProposalPlayerContainer::const_iterator it = proposal.
players.begin(); it != proposal.
players.end(); ++it)
1376 SF_LOG_ERROR(
"lfg.proposal.update",
"Proposal %u accepted but dungeon %u no longer exists.",
1382 for (LfgProposalPlayerContainer::iterator it = proposal.
players.begin(); it != proposal.
players.end(); ++it)
1384 uint64 pguid = it->first;
1387 SF_LOG_DEBUG(
"lfg.proposal.update",
"Proposal %u accepted but player %u is offline.",
1394 if (it->second.group &&
GetGroup(pguid) != it->second.group)
1396 SF_LOG_DEBUG(
"lfg.proposal.update",
"Proposal %u accepted but player %u left proposal group %u.",
1406 time_t joinTime = time(NULL);
1412 for (LfgProposalPlayerContainer::const_iterator it = proposal.
players.begin(); it != proposal.
players.end(); ++it)
1414 uint64 pguid = it->first;
1415 uint64 gguid = it->second.group;
1417 uint32 dungeonId = selectedDungeons.empty() ? proposal.
dungeonId : (*selectedDungeons.begin());
1418 int32 waitTime = -1;
1419 uint64 queuedGuid = gguid ? gguid : pguid;
1420 time_t queueJoinTime = queue.
GetJoinTime(queuedGuid);
1421 if (!queueJoinTime && queuedGuid != pguid)
1425 waitTime =
int32(joinTime - queueJoinTime);
1427 SF_LOG_DEBUG(
"lfg.proposal.update",
"Proposal %u missing queue join time for player %u queue owner %u",
1430 if (waitTime >= 0 && dungeonId)
1454 for (LfgProposalPlayerContainer::const_iterator it = proposal.
players.begin(); it != proposal.
players.end(); ++it)
1459 for (LfgProposalPlayerContainer::iterator it = proposal.
players.begin(); it != proposal.
players.end(); ++it)
1466 for (LfgProposalPlayerContainer::const_iterator it = proposal.
players.begin(); it != proposal.
players.end(); ++it)
1468 uint64 pguid = it->first;
1469 uint64 gguid = it->second.group;
1478 for (LfgGuidList::const_iterator it = proposal.
queues.begin(); it != proposal.
queues.end(); ++it)
1495 SF_LOG_DEBUG(
"lfg.proposal.remove",
"Proposal %u, state FAILED, UpdateType %u", itProposal->first, type);
1504 for (LfgProposalPlayerContainer::iterator it = proposal.
players.begin(); it != proposal.
players.end(); ++it)
1510 for (LfgProposalPlayerContainer::iterator it = proposal.
players.begin(); it != proposal.
players.end(); ++it)
1515 uint64 guid = it->second.group ? it->second.group : it->first;
1520 toRemove.insert(guid);
1525 for (LfgGuidList::const_iterator it = proposal.
queues.begin(); it != proposal.
queues.end(); ++it)
1529 missingQueueData.insert(*it);
1530 toRemove.insert(*it);
1531 SF_LOG_DEBUG(
"lfg.proposal.remove",
"Proposal %u missing queue data for %u while removing proposal",
1537 for (LfgProposalPlayerContainer::const_iterator it = proposal.
players.begin(); it != proposal.
players.end(); ++it)
1540 uint64 gguid = it->second.group ? it->second.group : guid;
1541 bool canRequeue = toRemove.find(gguid) == toRemove.end() &&
GetQueue(gguid).
HasQueueData(gguid);
1551 SF_LOG_DEBUG(
"lfg.proposal.remove",
"%u didn't accept. Removing from queue and compatible cache",
GUID_LOPART(guid));
1553 else if (missingQueueData.find(gguid) != missingQueueData.end())
1556 SF_LOG_DEBUG(
"lfg.proposal.remove",
"%u no longer has queue data. Removing stale proposal state",
GUID_LOPART(guid));
1561 SF_LOG_DEBUG(
"lfg.proposal.remove",
"%u cannot be requeued. Removing from queue and compatible cache",
GUID_LOPART(guid));
1564 RestoreOrClearState(guid,
"Proposal Fail (didn't accept or in group with someone that didn't accept)");
1588 for (LfgGuidSet::const_iterator it = toRemove.begin(); it != toRemove.end(); ++it)
1592 proposal.
queues.remove(guid);
1596 for (LfgGuidList::const_iterator it = proposal.
queues.begin(); it != proposal.
queues.end(); ++it)
1617 LfgGroupDataContainer::const_iterator groupData =
GroupsStore.find(gguid);
1621 LfgGuidSet const& players = groupData->second.GetPlayers();
1622 if (players.find(kicker) == players.end() || players.find(victim) == players.end())
1624 SF_LOG_DEBUG(
"lfg.boot",
"Group %u rejected boot init for invalid kicker %u or victim %u",
1640 for (LfgGuidSet::const_iterator itr = players.begin(); itr != players.end(); ++itr)
1647 LfgAnswerContainer::iterator victimVote = boot.
votes.find(victim);
1648 if (victimVote != boot.
votes.end())
1651 LfgAnswerContainer::iterator kickerVote = boot.
votes.find(kicker);
1652 if (kickerVote != boot.
votes.end())
1656 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it)
1672 LfgPlayerBootContainer::iterator itBoot =
BootsStore.find(gguid);
1676 LfgGroupDataContainer::const_iterator groupData =
GroupsStore.find(gguid);
1685 LfgAnswerContainer::iterator itVote = boot.
votes.find(guid);
1686 if (itVote == boot.
votes.end())
1696 for (LfgAnswerContainer::const_iterator itVotes = boot.
votes.begin(); itVotes != boot.
votes.end(); ++itVotes)
1712 for (LfgAnswerContainer::const_iterator itVotes = boot.
votes.begin(); itVotes != boot.
votes.end(); ++itVotes)
1714 uint64 pguid = itVotes->first;
1715 if (pguid != boot.
victim)
1748 SF_LOG_DEBUG(
"lfg.teleport",
"Player %s not in group/lfggroup or dungeon not found!",
1756 SF_LOG_DEBUG(
"lfg.teleport",
"Player %s already has a pending teleport, skipping LFG teleport %s.",
1757 player->
GetName().c_str(), out ?
"out" :
"in");
1763 SF_LOG_DEBUG(
"lfg.teleport",
"Player %s is being teleported out. Current Map %u - Expected Map %u",
1772 if (player->
TeleportTo(returnLocation.
MapId, returnLocation.
X, returnLocation.
Y, returnLocation.
Z, returnLocation.
O))
1778 SF_LOG_DEBUG(
"lfg.teleport",
"Player %s failed LFG return teleport to map %u (x: %f, y: %f, z: %f), falling back to battleground entry point",
1779 player->
GetName().c_str(), returnLocation.
MapId, returnLocation.
X, returnLocation.
Y, returnLocation.
Z);
1806 float x = dungeon->
x;
1807 float y = dungeon->
y;
1808 float z = dungeon->
z;
1809 float orientation = dungeon->
o;
1811 if (!HasValidLfgTeleportLocation(*dungeon))
1813 SF_LOG_ERROR(
"lfg.teleport",
"Player %s cannot teleport to LFG dungeon %u (%s): invalid entrance map %u position %f %f %f %f",
1814 player->
GetName().c_str(), dungeon->
id, dungeon->
name.c_str(),
uint32(dungeon->
map), dungeon->
x, dungeon->
y, dungeon->
z, dungeon->
o);
1823 Player* plrg = itr->GetSource();
1853 if (!player->
TeleportTo(mapid, x, y, z, orientation))
1856 if (forceChangeInstance)
1868 SF_LOG_DEBUG(
"lfg.teleport",
"Player %s is being teleported in to map %u "
1869 "(x: %f, y: %f, z: %f) Result: %u", player->
GetName().c_str(), dungeon->
map,
1870 dungeon->
x, dungeon->
y, dungeon->
z, error);
1889 Player* member = itr->GetSource();
1906 if (gDungeonId != dungeonId)
1908 SF_LOG_DEBUG(
"lfg.dungeon.finish",
"Group %u finished dungeon %u but queued for %u",
GUID_LOPART(gguid), dungeonId, gDungeonId);
1921 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it)
1932 if (!dungeons.empty())
1933 rDungeonId = (*dungeons.begin());
2023 for (LfgRewardContainer::const_iterator itr = bounds.first; itr != bounds.second; ++itr)
2027 if (itr->second->maxLevel >= level)
2058 return dungeon && IsFlexibleRaidData(*dungeon);
2096 SF_LOG_TRACE(
"lfg.data.group.dungeon.get",
"Group: %u, asId: %u, Dungeon: %u",
GUID_LOPART(guid), asId, dungeon);
2106 mapId = dungeon->map;
2108 SF_LOG_TRACE(
"lfg.data.group.dungeon.map",
"Group: %u, MapId: %u (DungeonId: %u)",
GUID_LOPART(guid), mapId, dungeonId);
2138 bool active =
GroupsStore[guid].IsVoteKickActive();
2169 SF_LOG_WARN(
"lfg.data.player.dungeons.locked.get",
"Player: %u not ingame while retrieving his LockedDungeons.",
GUID_LOPART(guid));
2180 for (LfgDungeonSet::const_iterator it = dungeons.begin(); it != dungeons.end(); ++it)
2192 else if (!bypassLfgRequirements)
2200 else if (dungeon->
minlevel > level)
2202 else if (dungeon->
maxlevel < level)
2208 if (!requiredItemLevel)
2209 requiredItemLevel = ar->iLvl;
2211 if (requiredItemLevel && playerItemLevel < requiredItemLevel)
2213 else if (ar->achievement && !player->
HasAchieved(ar->achievement))
2224 else if (ar->item2 && !player->
HasItemCount(ar->item2))
2227 else if (requiredItemLevel && playerItemLevel < requiredItemLevel)
2238 lock[dungeon->
Entry()] =
LfgLockData(lockStatus, currentItemLevel, requiredItemLevel);
2256 SF_LOG_TRACE(
"lfg.data.group.state.restore",
"Group: %u (%s), State: %s, Old state: %s",
2265 SF_LOG_TRACE(
"lfg.data.player.state.restore",
"Player: %u (%s), State: %s, Old state: %s",
2285 SF_LOG_TRACE(
"lfg.data.group.state.set",
"Group: %u, New state: %s, Previous: %s, Old state: %s",
2293 SF_LOG_TRACE(
"lfg.data.player.state.set",
"Player: %u, New state: %s, Previous: %s, OldState: %s",
2310 itr->second.RemoveFromQueue(guid);
2323 LfgGroupDataContainer::const_iterator itr =
GroupsStore.find(guid);
2330 LfgGuidSet const players = itr->second.GetPlayers();
2337 for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it)
2344 player->GetSession()->SendLfgClearStatus();
2413 LfgPlayerDataContainer::iterator it =
PlayersStore.find(guid);
2421 LfgGroupDataContainer::iterator it =
GroupsStore.find(guid);
2429 LfgProposalContainer::iterator itProposalRemove = itProposal++;
2430 bool removeProposal =
false;
2432 for (LfgProposalPlayerContainer::iterator itPlayer = itProposalRemove->second.players.begin();
2433 itPlayer != itProposalRemove->second.players.end(); ++itPlayer)
2435 if (itPlayer->second.group != guid)
2439 removeProposal =
true;
2447 itQueue->second.RemoveFromQueue(guid);
2450 LfgGuidSet players = it->second.GetPlayers();
2451 for (LfgGuidSet::const_iterator itr = players.begin(); itr != players.end(); ++itr)
2540 player->GetSession()->SendLfgRoleChosen(pguid, roles);
2546 player->GetSession()->SendLfgRoleCheckUpdate(roleCheck);
2552 player->GetSession()->SendLfgUpdateStatus(data, party);
2558 player->GetSession()->SendLfgJoinResult(data);
2564 player->GetSession()->SendLfgBootProposalUpdate(boot);
2570 player->GetSession()->SendLfgUpdateProposal(proposal);
2576 player->GetSession()->SendLfgQueueStatus(data);
2593 uint64 pguid = players.empty() ? 0 : (*players.begin());
2616 for (LfgGuidList::const_iterator it = check.begin(); it != check.end(); ++it)
2632 LfgQueueContainer::const_iterator itr =
QueuesStore.find(queueId);
2643 return itr->second.GetJoinTime(queueGuid);
2651 SF_LOG_INFO(
"lfg",
"Clearing all Dungeon Finder runtime state: queues=%u players=%u groups=%u roleChecks=%u proposals=%u boots=%u",
2687 SF_LOG_DEBUG(
"lfg.status",
"Player %u had stale LFG group %u while requesting status; clearing finder state.",
2699 if (statusDungeons.empty())
2701 statusDungeons.insert(dungeon);
2717 LfgProposalPlayerContainer::const_iterator itPlayer = itr->second.players.find(guid);
2718 if (itPlayer == itr->second.players.end())
2738 LfgGroupQueueDataContainer::const_iterator activeItr = queues.find(activeQueueId);
2742 for (LfgGroupQueueDataContainer::const_iterator itr = queues.begin(); itr != queues.end(); ++itr)
2757 LfgPlayerQueueDataContainer::const_iterator activeItr = queues.find(activeQueueId);
2761 for (LfgPlayerQueueDataContainer::const_iterator itr = queues.begin(); itr != queues.end(); ++itr)
2792 std::ostringstream o;
2794 o <<
"Number of Queues: " << size <<
"\n";
2797 o <<
"Queue Id: " <<
uint32(itr->first) <<
"\n";
2798 std::string
const& queued = itr->second.DumpQueueInfo(full);
2799 std::string
const& compatibles = itr->second.DumpCompatibleInfo(full);
2800 o << queued << compatibles;
2805 time_t
const currTime = time(NULL);
2811 o <<
" Group " << itr->first
2813 <<
" leader: " << roleCheck.
leader
2818 for (LfgRolesMap::const_iterator itRoles = roleCheck.
roles.begin(); itRoles != roleCheck.
roles.end(); ++itRoles)
2819 o <<
" role " << itRoles->first <<
": " <<
GetRolesString(itRoles->second) <<
"\n";
2826 o <<
" Proposal " << itr->first
2829 <<
" group: " << proposal.
group
2830 <<
" leader: " << proposal.
leader
2834 for (LfgProposalPlayerContainer::const_iterator itPlayer = proposal.
players.begin(); itPlayer != proposal.
players.end(); ++itPlayer)
2837 o <<
" player " << itPlayer->first
2840 <<
" group: " << player.
group <<
"\n";
2844 o <<
"Boot Votes: " <<
BootsStore.size() <<
"\n";
2852 std::ostringstream o;
2853 LfgPlayerDataContainer::const_iterator itr =
PlayersStore.find(guid);
2856 o <<
"LFG player data missing for guid " << guid <<
"\n";
2861 time_t
const currTime = time(NULL);
2864 o <<
"LFG Player: " << guid <<
"\n";
2866 o <<
" Original Group: " << group <<
"\n";
2868 o <<
" Original Group Exists: " << (
sGroupMgr->GetGroupByGUID(
GUID_LOPART(group)) ?
"yes" :
"no") <<
"\n";
2874 o <<
" Comment: " << playerData.
GetComment() <<
"\n";
2877 o <<
" Saved Queues: " << queues.size() <<
"\n";
2878 for (LfgPlayerQueueDataContainer::const_iterator itQueue = queues.begin(); itQueue != queues.end(); ++itQueue)
2880 time_t joinTime = 0;
2881 LfgQueueContainer::const_iterator itLfgQueue =
QueuesStore.find(itQueue->first);
2883 joinTime = itLfgQueue->second.GetJoinTime(guid);
2885 o <<
" Queue " <<
uint32(itQueue->first)
2892 o <<
" queued: " <<
uint32(currTime > joinTime ? currTime - joinTime : 0) <<
"s";
2894 if (!itQueue->second.Comment.empty())
2895 o <<
" comment: " << itQueue->second.Comment;
2905 std::ostringstream o;
2906 LfgGroupDataContainer::const_iterator itr =
GroupsStore.find(guid);
2909 o <<
"LFG group data missing for guid " << guid <<
"\n";
2914 time_t
const currTime = time(NULL);
2916 o <<
"LFG Group: " << guid <<
"\n";
2917 o <<
" Is LFG Group: " << (groupData.
IsLfgGroup() ?
"yes" :
"no") <<
"\n";
2920 o <<
" Dungeon: " << groupData.
GetDungeon(
true) <<
"\n";
2921 o <<
" Leader: " << groupData.
GetLeader() <<
"\n";
2922 o <<
" Players: " << groupData.
GetPlayers().size() <<
"\n";
2924 o <<
" Vote Kick: " << (groupData.
IsVoteKickActive() ?
"active" :
"inactive") <<
"\n";
2927 o <<
" Saved Queues: " << queues.size() <<
"\n";
2928 for (LfgGroupQueueDataContainer::const_iterator itQueue = queues.begin(); itQueue != queues.end(); ++itQueue)
2930 time_t joinTime = 0;
2931 LfgQueueContainer::const_iterator itLfgQueue =
QueuesStore.find(itQueue->first);
2933 joinTime = itLfgQueue->second.GetJoinTime(guid);
2935 o <<
" Queue " <<
uint32(itQueue->first)
2938 <<
" dungeon: " << itQueue->second.Dungeon;
2941 o <<
" queued: " <<
uint32(currTime > joinTime ? currTime - joinTime : 0) <<
"s";
2946 for (LfgGuidSet::const_iterator itPlayer = groupData.
GetPlayers().begin(); itPlayer != groupData.
GetPlayers().end(); ++itPlayer)
2947 o <<
" Member: " << *itPlayer <<
"\n";
2968 if (!dungeons.empty())
2985 if (
uint32(dungeon->map) == map && dungeon->difficulty == difficulty)
2994 if (
uint32(dungeon->map) == map && dungeon->difficulty == difficulty)
2998 for (LfgDungeonSet::const_iterator itr = selectedDungeons.begin(); itr != selectedDungeons.end(); ++itr)
3000 if (
uint32(dungeon->map) == map && dungeon->difficulty == difficulty)
3010 return dungeon->Entry();
3019 return dungeon->category;
3032 randomDungeons.insert(dungeon.
Entry());
3034 return randomDungeons;
@ ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS
DBCStorage< LFGDungeonEntry > sLFGDungeonStore(LFGDungeonEntryfmt)
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
bool IsHolidayActive(HolidayIds id)
#define SF_LOG_DEBUG(filterType__,...)
#define SF_LOG_WARN(filterType__,...)
#define SF_LOG_ERROR(filterType__,...)
#define SF_LOG_TRACE(filterType__,...)
#define SF_LOG_INFO(filterType__,...)
uint32 GUID_LOPART(uint64 x)
bool IS_GROUP_GUID(uint64 guid)
uint64 MAKE_NEW_GUID(uint32 l, uint32 e, uint32 h)
Skyfire::AutoPtr< ResultSet, Skyfire::Mutex > QueryResult
Role Based Access Control related classes definition.
@ GROUP_REMOVEMETHOD_KICK_LFG
@ HOLIDAY_LOVE_IS_IN_THE_AIR
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
Skyfire::AutoPtr< Transaction, Skyfire::Mutex > SQLTransaction
InstanceGroupBind * BindToInstance(InstanceSave *save, bool permanent, bool load=false)
bool AddMember(Player *player)
void SetDungeonDifficulty(DifficultyID difficulty)
uint32 GetMembersCount() const
void SetLfgRoles(uint64 guid, const uint8 roles)
void SetRaidDifficulty(DifficultyID difficulty)
bool IsMember(uint64 guid) const
bool RemoveMember(uint64 guid, const RemoveMethod &method=GROUP_REMOVEMETHOD_DEFAULT, uint64 kicker=0, const char *reason=NULL)
GroupReference * GetFirstMember()
uint32 GetMemberRole(uint64 guid) const
bool RoleCheckAllResponded() const
bool Create(Player *leader)
InstanceGroupBind * GetBoundInstance(Player *player)
uint32 GetDbStoreId() const
uint64 GetLeaderGUID() const
bool IsLeader(uint64 guid) const
void ChangeLeader(uint64 guid)
static bool IsValidMapCoord(uint32 mapid, float x, float y)
void MovementExpired(bool reset=true)
static Player * FindPlayer(uint64)
void RewardQuest(Quest const *quest, uint32 reward, Object *questGiver, bool announce=true)
InstancePlayerBind * GetBoundInstance(uint32 mapid, DifficultyID difficulty)
bool GetQuestRewardStatus(uint32 quest_id) const
bool HasItemCount(uint32 item, uint32 count=1, bool inBankAlso=false) const
void SetBattlegroundEntryPoint()
bool InBattleground() const
bool IsMirrorTimerActive(MirrorTimerType type)
bool CanRewardQuest(Quest const *quest, bool msg)
bool HasAchieved(uint32 achievementId) const
WorldSession * GetSession() const
bool InBattlegroundQueue() const
bool TeleportToBGEntryPoint()
float GetAverageItemLevel()
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1=0, uint64 miscValue2=0, uint64 miscValue3=0, Unit *unit=NULL)
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0)
void SetSemaphoreTeleportForcedFar(bool semphsetting)
static void RemoveFromGroup(Group *group, uint64 guid, RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT, uint64 kicker=0, const char *reason=NULL)
PlayerSocial * GetSocial()
void SetForcedTeleportFar(bool forced)
void CleanupAfterTaxiFlight()
bool IsBeingTeleported() const
bool HasIgnore(uint32 ignore_guid)
void setUInt32(const uint8 index, const uint32 value)
Vehicle * GetVehicle() const
uint64 GetCharmGUID() const
void CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, uint64 originalCaster=0)
MotionMaster * GetMotionMaster()
bool HasAura(uint32 spellId, uint64 casterGUID=0, uint64 itemCasterGUID=0, uint32 reqEffMask=0) const
bool HasUnitState(const uint32 f) const
std::string const & GetName() const
void SendLfgJoinResult(lfg::LfgJoinResultData const &joinData)
void SendLfgTeleportError(uint8 err)
void SendLfgPlayerReward(lfg::LfgPlayerRewardData const &lfgPlayerRewardData)
void SendLfgUpdateStatus(lfg::LfgUpdateData const &updateData, bool party, uint64 queueGuidOverride=0, uint8 queueIdOverride=0)
bool HasPermission(uint32 permissionId)
void SetActiveQueueId(uint64 guid, uint8 queueId)
void SendLfgRoleCheckUpdate(uint64 guid, LfgRoleCheck const &roleCheck)
void SetSelectedDungeons(uint64 guid, LfgDungeonSet const &dungeons)
static bool CheckDpsOnlyRoles(LfgRolesMap &groles, uint8 neededDamage)
Assigns queued players to damage roles for role-neutral scenario queues.
void RemovePlayerData(uint64 guid)
bool inLfgDungeonMap(uint64 guid, uint32 map, DifficultyID difficulty)
Check if given guid applied for given map and difficulty. Used to know.
uint32 GetLFGDungeonEntry(uint32 id)
Return Lfg dungeon entry for given dungeon id.
void LoadLFGDungeons(bool reload=false)
Loads dungeons from dbc and adds teleport coords.
void SetupGroupMember(uint64 guid, uint64 gguid)
Initializes player data after loading group data from DB.
void LeaveSoloLfg(uint64 guid, uint32 queueID, bool disconnected=false)
Leaves Solo lfg.
uint32 GetDungeon(uint64 guid, bool asId=true)
Get current dungeon.
LfgProposalContainer ProposalsStore
Current Proposals.
uint64 GetGroup(uint64 guid)
Gets player group.
std::string const & GetComment(uint64 gguid)
Get current player comment (used for LFR).
void SetTeam(uint64 guid, uint8 team)
Sets player team.
void ClearQueueState(uint64 guid, char const *debugMsg)
bool RestoreActiveQueue(uint64 guid)
Restores the active queue id from saved queue data.
bool IsRaidFinderDungeon(uint32 dungeonId)
Check whether the dungeon id belongs to a Raid Finder queue entry.
void LeaveLfg(uint64 guid, bool disconnected=false)
Leaves lfg.
uint8 RemovePlayerFromGroup(uint64 gguid, uint64 guid)
Removes a player from a group.
LFGDungeonContainer LfgDungeonStore
LfgPlayerBootContainer BootsStore
Current player kicks.
LfgDungeonSet const & GetSelectedDungeons(uint64 guid)
Get selected dungeons.
uint8 GetTeam(uint64 guid)
void SetComment(uint64 guid, std::string const &comment)
Sets player lfr comment.
void ClearGroupQueueState(uint64 guid, char const *debugMsg, bool sendUpdate)
void UpdateBoot(uint64 guid, bool accept)
Updates player boot proposal with new player answer.
void SetGroup(uint64 guid, uint64 group)
Sets player group.
void SendLfgUpdateStatus(uint64 guid, LfgUpdateData const &data, bool party)
bool m_debugRequirementOverride
bypasses LFG entry requirements for server-wide debugging
std::string DumpQueueInfo(bool full=false)
Dumps the state of the queue - Only for internal testing.
bool selectedRandomLfgDungeon(uint64 guid)
Check if given guid applied for random dungeon.
LfgGuidSet const & GetPlayers(uint64 guid)
void DecreaseKicksLeft(uint64 guid)
time_t GetQueueJoinTime(uint64 guid)
Gets queue join time.
LfgUpdateData GetLfgStatus(uint64 guid)
Returns current lfg status.
void RestoreOrClearState(uint64 guid, char const *debugMsg)
void UpdateRoleCheck(uint64 gguid, uint64 guid=0, uint8 roles=PLAYER_ROLE_NONE)
Updates the role check with player answer.
uint32 GetOptions()
Gets current lfg options.
LfgState GetState(uint64 guid)
Get current lfg state.
LfgLockMap const GetLockedDungeons(uint64 guid)
Get locked dungeons.
void GetCompatibleDungeons(LfgDungeonSet &dungeons, LfgGuidSet const &players, LfgLockPartyMap &lockMap, bool isContinue)
LfgDungeonSet const & GetDungeonsByRandom(uint32 randomdungeon)
void ClearDungeonGroupState(uint64 guid, uint32 dbGuid, char const *debugMsg, bool sendUpdate)
Clears active dungeon finder state for an LFG dungeon group.
bool MakeNewGroup(LfgProposal const &proposal)
void SetRoles(uint64 guid, uint8 roles)
Sets player lfg roles.
static void SendLfgQueueStatus(uint64 guid, LfgQueueStatusData const &data)
Sends queue status to player.
uint8 GetKicksLeft(uint64 gguid)
Get kicks left in current group.
void SetDungeon(uint64 guid, uint32 dungeon)
void SendLfgBootProposalUpdate(uint64 guid, LfgPlayerBoot const &boot)
bool IsVoteKickActive(uint64 gguid)
Get current vote kick state.
void LoadRewards()
Loads rewards for random dungeons.
void SendLfgUpdateProposal(uint64 guid, LfgProposal const &proposal)
LfgCachedDungeonContainer CachedDungeonMapStore
Stores all dungeons by groupType.
bool isOptionEnabled(uint32 option)
Checks if given lfg option is enabled.
void Clean()
Clears queue - Only for internal testing.
LfgRoleCheckContainer RoleChecksStore
Current Role checks.
void TeleportDungeonGroupOut(Group *group)
Teleport online members of an LFG dungeon group back to their saved entry points.
void SetOptions(uint32 options)
Sets new lfg options.
uint32 m_lfgProposalId
used as internal counter for proposals
void AddPlayerToGroup(uint64 gguid, uint64 guid)
Adds player to group.
LFGDungeonData const * GetLFGDungeon(uint32 id)
void RemoveProposal(LfgProposalContainer::iterator itProposal, LfgUpdateType type)
bool m_debugFlexRaidMinimumOverride
allows flexible raid queues to form below normal minimum for debugging
void SetVoteKick(uint64 guid, bool active)
void TeleportPlayer(Player *player, bool out, bool fromOpcode=false, bool forceChangeInstance=false)
Teleport a player to/from selected dungeon.
uint64 GetLeader(uint64 guid)
Get leader of the group (using internal data).
void JoinLfg(Player *player, uint8 roles, LfgDungeonSet &dungeons, std::string const &comment)
Join Lfg with selected roles, dungeons and comment.
uint8 GetActiveQueueId(uint64 guid)
Get active LFG queue id.
LfgRewardContainer RewardMapStore
Stores rewards for random dungeons.
void RestoreState(uint64 guid, char const *debugMsg)
uint8 GetQueueId(uint64 guid)
Returns queue id.
LFGQueue & GetQueue(uint64 guid)
uint8 GetPlayerCount(uint64 guid)
Gets the player count of given group.
void SendLfgJoinResult(uint64 guid, LfgJoinResultData const &data)
LfgGroupDataContainer GroupsStore
Group data.
static bool HasIgnore(uint64 guid1, uint64 guid2)
Checks if given players are ignoring each other.
bool IsDebugRequirementOverrideEnabled() const
Gets the server-wide debug override for dungeon and raid finder requirements.
void ClearState(uint64 guid, char const *debugMsg)
void UpdateProposal(uint32 proposalId, uint64 guid, bool accept)
Updates proposal to join dungeon with player answer.
uint32 m_options
Stores config options.
void _LoadFromDB(Field *fields, uint64 guid)
Load Lfg group info from DB.
static bool CheckGroupRoles(LfgRolesMap &groles)
Checks if given roles match, modifies given roles map with new roles.
void SetState(uint64 guid, LfgState state)
void SetLeader(uint64 gguid, uint64 leader)
Sets the leader of the group.
uint8 GetRoles(uint64 guid)
Get current player roles.
LfgPlayerDataContainer PlayersStore
Player data.
LfgQueueContainer QueuesStore
Queues.
uint32 AddProposal(LfgProposal &proposal)
Add a new Proposal.
void FinishDungeon(uint64 gguid, uint32 dungeonId)
Finish the dungeon for the given group. All check are performed using internal lfg data.
bool IsSeasonActive(uint32 dungeonId)
Checks if Seasonal dungeon is active.
bool AllQueued(LfgGuidList const &check)
Checks if all players are queued.
LfgType GetDungeonType(uint32 dungeon)
static bool CheckFlexibleRaidRoles(LfgRolesMap &groles, uint8 maxPlayers)
Assigns queued players to their preferred combat role for flexible raid queues.
void _SaveToDB(uint64 guid, uint32 db_guid)
std::string DumpGroupInfo(uint64 guid)
Dumps queue-scoped group state - Only for internal testing.
std::string DumpPlayerInfo(uint64 guid)
Dumps queue-scoped player state - Only for internal testing.
LfgState GetOldState(uint64 guid)
Get last lfg state (NONE, DUNGEON or FINISHED_DUNGEON).
bool IsFlexibleRaidDungeon(uint32 dungeonId)
Check whether the dungeon id belongs to a flexible raid queue entry.
void SendLfgRoleChosen(uint64 guid, uint64 pguid, uint8 roles)
LfgReward const * GetRandomDungeonReward(uint32 dungeon, uint8 level)
Gets the random dungeon reward corresponding to given dungeon and player level.
bool IsLfgGroup(uint64 guid)
Check if given group guid is lfg.
bool SendActiveProposal(uint64 guid)
Resends an active dungeon proposal to a player if one exists.
void InitBoot(uint64 gguid, uint64 kguid, uint64 vguid, std::string const &reason)
Inits new proposal to boot a player.
uint32 m_QueueTimer
used to check interval of update
void RemoveGroupData(uint64 guid)
Removes saved group data.
uint32 GetDungeonMapId(uint64 guid)
Get the map id of the current dungeon.
LfgDungeonSet GetRandomAndSeasonalDungeons(uint8 level, uint8 expansion)
Returns all random and seasonal dungeons for given level and expansion.
uint8 GetLFGDungeonCategory(uint32 id)
Return Lfg dungeon category for given dungeon id.
void RemoveFromQueue(uint64 guid)
void AddToQueue(uint64 guid, bool reQueue=false)
time_t GetJoinTime(uint64 guid) const
void UpdateWaitTimeAvg(int32 waitTime, uint32 dungeonId)
bool HasQueueData(uint64 guid) const
void UpdateWaitTimeHealer(int32 waitTime, uint32 dungeonId)
void UpdateWaitTimeTank(int32 waitTime, uint32 dungeonId)
void UpdateWaitTimeDps(int32 waitTime, uint32 dungeonId)
void AddQueueData(uint64 guid, time_t joinTime, LfgDungeonSet const &dungeons, LfgRolesMap const &rolesMap)
uint32 GetDungeon(bool asId=true) const
bool IsVoteKickActive() const
void SetVoteKick(bool active)
LfgState GetState() const
void SetActiveQueueId(uint8 queueId)
void SetState(LfgState state)
uint8 GetActiveQueueId() const
uint8 GetKicksLeft() const
LfgGuidSet const & GetPlayers() const
LfgState GetOldState() const
LfgGroupQueueDataContainer const & GetQueues() const
LfgReturnLocation const & GetReturnLocation() const
LfgState GetOldState() const
void ClearReturnLocation()
LfgPlayerQueueDataContainer const & GetQueues() const
std::string const & GetComment() const
void SetState(LfgState state)
uint8 GetActiveQueueId() const
LfgState GetState() const
void SetActiveQueueId(uint8 queueId)
LfgDungeonSet const & GetSelectedDungeons() const
CharacterDatabaseWorkerPool CharacterDatabase
Accessor to the character database.
WorldDatabaseWorkerPool WorldDatabase
Accessor to the world database.
@ CONFIG_MAX_PLAYER_LEVEL
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
bool IsDisabledFor(DisableType type, uint32 entry, Unit const *unit, uint8 flags)
bool IsValidMapCoord(float c)
bool IsValidPlayerRoles(uint8 roles)
@ LFG_LOCKSTATUS_INSUFFICIENT_EXPANSION
@ LFG_LOCKSTATUS_TOO_LOW_LEVEL
@ LFG_LOCKSTATUS_RAID_LOCKED
@ LFG_LOCKSTATUS_TOO_LOW_GEAR_SCORE
@ LFG_LOCKSTATUS_MISSING_ITEM
@ LFG_LOCKSTATUS_TOO_HIGH_LEVEL
@ LFG_LOCKSTATUS_MISSING_ACHIEVEMENT
@ LFG_LOCKSTATUS_NOT_IN_SEASON
@ LFG_LOCKSTATUS_QUEST_NOT_COMPLETED
@ LFG_OPTION_ENABLE_DUNGEON_FINDER
@ LFG_OPTION_ENABLE_RAID_BROWSER
std::map< uint8, LfgGroupQueueData > LfgGroupQueueDataContainer
LfgTeleportError
Teleport errors.
@ LFG_TELEPORTERROR_INVALID_LOCATION
@ LFG_TELEPORTERROR_FATIGUE
@ LFG_TELEPORTERROR_PLAYER_DEAD
@ LFG_TELEPORTERROR_CHARMING
@ LFG_TELEPORTERROR_FALLING
@ LFG_TELEPORTERROR_IN_COMBAT
@ LFG_TELEPORTERROR_IN_VEHICLE
@ LFG_STATE_FINISHED_DUNGEON
@ LFG_UPDATETYPE_ROLECHECK_FAILED
@ LFG_UPDATETYPE_GROUP_FOUND
@ LFG_UPDATETYPE_ADDED_TO_QUEUE
@ LFG_UPDATETYPE_GROUP_MEMBER_OFFLINE
@ LFG_UPDATETYPE_UPDATE_STATUS
@ LFG_UPDATETYPE_PROPOSAL_FAILED
@ LFG_UPDATETYPE_PROPOSAL_DECLINED
@ LFG_UPDATETYPE_REMOVED_FROM_QUEUE
@ LFG_UPDATETYPE_PROPOSAL_BEGIN
@ LFG_UPDATETYPE_JOIN_QUEUE
@ LFG_SPELL_DUNGEON_COOLDOWN
@ LFG_GROUP_KICK_VOTES_NEEDED
@ LFG_QUEUEUPDATE_INTERVAL
@ LFG_SPELL_DUNGEON_DESERTER
LfgType
Determines the type of instance.
LfgAnswer
Answer state (Also used to check compatibilites).
std::map< uint32, LfgLockData > LfgLockMap
std::set< uint32 > LfgDungeonSet
std::list< uint64 > LfgGuidList
@ LFG_ROLECHECK_WRONG_ROLES
@ LFG_ROLECHECK_MISSING_ROLE
@ LFG_ROLECHECK_INITIALITING
std::string GetStateString(LfgState state)
std::string ConcatenateGuids(LfgGuidList const &guids)
std::pair< LfgRewardContainer::const_iterator, LfgRewardContainer::const_iterator > LfgRewardContainerBounds
std::map< uint64, uint8 > LfgRolesMap
std::string GetRolesString(uint8 roles)
std::set< uint64 > LfgGuidSet
std::string ConcatenateDungeons(LfgDungeonSet const &dungeons)
std::map< uint64, LfgLockMap > LfgLockPartyMap
std::map< uint8, LfgPlayerQueueData > LfgPlayerQueueDataContainer
@ LFG_PROPOSAL_INITIATING
LfgJoinResult
Queue join results.
@ LFG_JOIN_TOO_MUCH_MEMBERS
@ LFG_JOIN_DUNGEON_INVALID
@ LFG_JOIN_ROLE_CHECK_FAILED
@ LFG_JOIN_USING_BG_SYSTEM
@ LFG_JOIN_INTERNAL_ERROR
@ LFG_JOIN_MIXED_RAID_DUNGEON
@ LFG_JOIN_RANDOM_COOLDOWN
@ LFG_JOIN_PARTY_RANDOM_COOLDOWN
@ LFG_JOIN_PARTY_DESERTER
@ RBAC_PERM_JOIN_DUNGEON_FINDER
bool IsBattlegroundOrArena() const
float GetPositionZ() const
float GetOrientation() const
float GetPositionX() const
float GetPositionY() const
Stores information of a current vote to kick someone from a group.
uint64 victim
Player guid to be kicked (can't vote).
std::string reason
kick reason
time_t cancelTime
Time left to vote.
LfgAnswerContainer votes
Player votes (-1 not answer | 0 Not agree | 1 agree).
bool inProgress
Vote in progress.
Stores group data related to proposal to join.
uint32 dungeonId
Dungeon to join.
uint64 group
Proposal group (0 if new).
LfgGuidList queues
Queue Ids to remove/readd.
uint64 leader
Leader guid.
LfgProposalPlayerContainer players
Players data.
bool isNew
Determines if it's new group or not.
LfgProposalState state
State of the proposal.
time_t cancelTime
Time when we will cancel this proposal.
Stores player data related to proposal to join.
LfgAnswer accept
Accept status (-1 not answer | 0 Not agree | 1 agree).
uint64 group
Original group guid. 0 if no original group.
Stores all rolecheck info of a group that wants to join.
LfgDungeonSet dungeons
Dungeons group is applying for (expanded random dungeons).
LfgRolesMap roles
Player selected roles.
uint64 leader
Leader of the group.
LfgRoleCheckState state
State of the rolecheck.
time_t cancelTime
Time when the rolecheck will fail.
uint32 rDungeonId
Random Dungeon Id.