diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index add31c1b1..688820001 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -542,13 +542,13 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) condMeets = object->GetMap()->GetDifficulty() == ConditionValue1; break; } - case CONDITION_RANDOM_DUNGEON: + case CONDITION_PLAYER_QUEUED_RANDOM_DUNGEON: { if (Unit* unit = object->ToUnit()) { - if (Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself()) + if (Player* player = unit->ToPlayer()) { - if (sLFGMgr->selectedRandomLfgDungeon(player->GetGUID())) + if (sLFGMgr->IsPlayerQueuedForRandomDungeon(player->GetGUID())) { if (!ConditionValue1) condMeets = true; @@ -803,7 +803,7 @@ uint32 Condition::GetSearcherTypeMaskForCondition() case CONDITION_CHARMED: mask |= GRID_MAP_TYPE_MASK_CREATURE | GRID_MAP_TYPE_MASK_PLAYER; break; - case CONDITION_RANDOM_DUNGEON: + case CONDITION_PLAYER_QUEUED_RANDOM_DUNGEON: mask |= GRID_MAP_TYPE_MASK_PLAYER; break; case CONDITION_WORLD_SCRIPT: @@ -2486,7 +2486,7 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) return false; } break; - case CONDITION_RANDOM_DUNGEON: + case CONDITION_PLAYER_QUEUED_RANDOM_DUNGEON: if (cond->ConditionValue1 > 1) { LOG_ERROR("sql.sql", "RandomDungeon condition has useless data in value1 ({}).", cond->ConditionValue1); diff --git a/src/server/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h index c472451a3..f4db6429b 100644 --- a/src/server/game/Conditions/ConditionMgr.h +++ b/src/server/game/Conditions/ConditionMgr.h @@ -88,7 +88,7 @@ enum ConditionTypes CONDITION_HAS_AURA_TYPE = 102, // aura_type 0 0 true if has aura type CONDITION_WORLD_SCRIPT = 103, // conditionId state 0 true if WorldState::IsConditionFulfilled returns true CONDITION_AI_DATA = 104, // dataId value 0 true if AI::GetData returns value - CONDITION_RANDOM_DUNGEON = 105, // difficulty (0 = any) 0 0 true if player is queued for a random dungeon via RDF (param1 = Difficulty) + CONDITION_PLAYER_QUEUED_RANDOM_DUNGEON = 105, // checkDifficulty difficulty 0 true if player is queued for a random dungeon via RDF CONDITION_AC_END = 106 // placeholder }; diff --git a/src/server/game/DungeonFinding/LFGGroupData.cpp b/src/server/game/DungeonFinding/LFGGroupData.cpp index 0f522d278..96c71a2b3 100644 --- a/src/server/game/DungeonFinding/LFGGroupData.cpp +++ b/src/server/game/DungeonFinding/LFGGroupData.cpp @@ -139,4 +139,13 @@ namespace lfg return m_KicksLeft; } + void LfgGroupData::AddRandomQueuedPlayer(ObjectGuid guid) + { + m_RandomQueuedPlayers.insert(guid); + } + + [[nodiscard]] bool LfgGroupData::IsRandomQueuedPlayer(ObjectGuid guid) const + { + return m_RandomQueuedPlayers.contains(guid); + } } // namespace lfg diff --git a/src/server/game/DungeonFinding/LFGGroupData.h b/src/server/game/DungeonFinding/LFGGroupData.h index 281beaff4..a6eecfcf6 100644 --- a/src/server/game/DungeonFinding/LFGGroupData.h +++ b/src/server/game/DungeonFinding/LFGGroupData.h @@ -37,6 +37,8 @@ namespace lfg void SetState(LfgState state); void RestoreState(); void AddPlayer(ObjectGuid guid); + void AddRandomQueuedPlayer(ObjectGuid guid); + [[nodiscard]] bool IsRandomQueuedPlayer(ObjectGuid guid) const; uint8 RemovePlayer(ObjectGuid guid); void RemoveAllPlayers(); void SetLeader(ObjectGuid guid); @@ -66,6 +68,7 @@ namespace lfg LfgState m_OldState; ///< Old State ObjectGuid m_Leader; ///< Leader GUID LfgGuidSet m_Players; ///< Players in group + LfgGuidSet m_RandomQueuedPlayers; ///< Players that queued for random dungeon // Dungeon uint32 m_Dungeon; ///< Dungeon entry bool _isLFGGroup; diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 9e097ab9b..fe44c400d 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -2583,6 +2583,18 @@ namespace lfg GroupsStore[gguid].AddPlayer(guid); } + void LFGMgr::AddPlayerQueuedForRandomDungeonToGroup(ObjectGuid gguid, ObjectGuid guid) + { + const LfgDungeonSet& dungeons = GetSelectedDungeons(guid); + if (dungeons.empty()) + return; + + uint32 dungeonId = *dungeons.begin(); + LFGDungeonData const* dungeon = GetLFGDungeon(dungeonId); + if (dungeon && (dungeon->type == LFG_TYPE_RANDOM)) + GroupsStore[gguid].AddRandomQueuedPlayer(guid); + } + void LFGMgr::SetLeader(ObjectGuid gguid, ObjectGuid leader) { GroupsStore[gguid].SetLeader(leader); @@ -2839,4 +2851,12 @@ namespace lfg sDisableMgr->IsDisabledFor(DISABLE_TYPE_LFG_MAP, mapId, nullptr); } + bool LFGMgr::IsPlayerQueuedForRandomDungeon(ObjectGuid guid) + { + auto gguid = GetGroup(guid); + if (!gguid) + return false; + + return GroupsStore[gguid].IsRandomQueuedPlayer(guid); + } } // namespace lfg diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h index c96ae4f2a..644504567 100644 --- a/src/server/game/DungeonFinding/LFGMgr.h +++ b/src/server/game/DungeonFinding/LFGMgr.h @@ -506,6 +506,9 @@ namespace lfg uint8 RemovePlayerFromGroup(ObjectGuid gguid, ObjectGuid guid); /// Adds player to group void AddPlayerToGroup(ObjectGuid gguid, ObjectGuid guid); + /// Store player that selected random queue to group + void AddPlayerQueuedForRandomDungeonToGroup(ObjectGuid gguid, ObjectGuid guid); + bool IsPlayerQueuedForRandomDungeon(ObjectGuid guid); /// Xinef: Set Random Players Count void SetRandomPlayersCount(ObjectGuid guid, uint8 count); /// Xinef: Get Random Players Count diff --git a/src/server/game/DungeonFinding/LFGScripts.cpp b/src/server/game/DungeonFinding/LFGScripts.cpp index b4faf18fa..c4c7969ce 100644 --- a/src/server/game/DungeonFinding/LFGScripts.cpp +++ b/src/server/game/DungeonFinding/LFGScripts.cpp @@ -187,6 +187,7 @@ namespace lfg sLFGMgr->SetGroup(guid, gguid); sLFGMgr->AddPlayerToGroup(gguid, guid); + sLFGMgr->AddPlayerQueuedForRandomDungeonToGroup(gguid, guid); // pussywizard: after all necessary actions handle raid browser if (sLFGMgr->GetState(guid) == LFG_STATE_RAIDBROWSER)