diff options
-rw-r--r-- | src/server/game/DungeonFinding/LFG.h | 13 | ||||
-rw-r--r-- | src/server/game/DungeonFinding/LFGMgr.cpp | 20 | ||||
-rw-r--r-- | src/server/game/Handlers/LFGHandler.cpp | 2 |
3 files changed, 31 insertions, 4 deletions
diff --git a/src/server/game/DungeonFinding/LFG.h b/src/server/game/DungeonFinding/LFG.h index 1387507d00a..31d47dfed23 100644 --- a/src/server/game/DungeonFinding/LFG.h +++ b/src/server/game/DungeonFinding/LFG.h @@ -119,14 +119,23 @@ enum LfgAnswer LFG_ANSWER_AGREE = 1 }; +/// Used to hide random LFG dungeon entries from the dungeon finder. Either value above 0 is doing that, however, only 2 is being sent in sniffs +enum class LfgSoftLock : uint8 +{ + None = 0, + Unk1 = 1, + Unk2 = 2 +}; + struct TC_GAME_API LfgLockInfoData { - LfgLockInfoData(uint32 _lockStatus = 0, uint16 _requiredItemLevel = 0, float _currentItemLevel = 0) : - lockStatus(_lockStatus), requiredItemLevel(_requiredItemLevel), currentItemLevel(_currentItemLevel) { } + LfgLockInfoData(uint32 _lockStatus = 0, uint16 _requiredItemLevel = 0, float _currentItemLevel = 0, LfgSoftLock _softLock = LfgSoftLock::None) : + lockStatus(_lockStatus), requiredItemLevel(_requiredItemLevel), currentItemLevel(_currentItemLevel), softLock(_softLock) { } uint32 lockStatus; uint16 requiredItemLevel; float currentItemLevel; + LfgSoftLock softLock; }; typedef std::set<uint32> LfgDungeonSet; diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 2a132c5068c..4c18a6e0041 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -1804,8 +1804,26 @@ LfgLockMap LFGMgr::GetLockedDungeons(ObjectGuid guid) return 0; }(); + LfgSoftLock softLock = [lockStatus]() + { + switch (lockStatus) + { + // Dungeons which are out of our level range, active season or expansion are hidden from the list + case LFG_LOCKSTATUS_TOO_LOW_LEVEL: + case LFG_LOCKSTATUS_TOO_HIGH_LEVEL: + case LFG_LOCKSTATUS_NOT_IN_SEASON: + case LFG_LOCKSTATUS_INSUFFICIENT_EXPANSION: + return LfgSoftLock::Unk2; // only value seen in sniffs + default: + return LfgSoftLock::None; + + } + + return LfgSoftLock::None; + }(); + if (lockStatus) - lock[dungeon->Entry()] = LfgLockInfoData(lockStatus, dungeon->requiredItemLevel, player->GetAverageItemLevel()); + lock[dungeon->Entry()] = LfgLockInfoData(lockStatus, dungeon->requiredItemLevel, player->GetAverageItemLevel(), softLock); } return lock; diff --git a/src/server/game/Handlers/LFGHandler.cpp b/src/server/game/Handlers/LFGHandler.cpp index 8ee1aede0c3..5d850fc976f 100644 --- a/src/server/game/Handlers/LFGHandler.cpp +++ b/src/server/game/Handlers/LFGHandler.cpp @@ -157,7 +157,7 @@ void WorldSession::SendLfgPlayerLockInfo() // Get player locked Dungeons for (auto const& lock : sLFGMgr->GetLockedDungeons(_player->GetGUID())) - lfgPlayerInfo.BlackList.Slot.emplace_back(lock.first, lock.second.lockStatus, lock.second.requiredItemLevel, lock.second.currentItemLevel, 0); + lfgPlayerInfo.BlackList.Slot.emplace_back(lock.first, lock.second.lockStatus, lock.second.requiredItemLevel, lock.second.currentItemLevel, AsUnderlyingType(lock.second.softLock)); for (uint32 slot : randomDungeons) { |