diff options
| author | Ovahlord <dreadkiller@gmx.de> | 2024-11-03 13:20:28 +0100 |
|---|---|---|
| committer | Ovahlord <dreadkiller@gmx.de> | 2024-11-03 13:20:28 +0100 |
| commit | 73aa788b2c17725c0452b50ac0b7d2730d0fe083 (patch) | |
| tree | 67fe1995778fb864a8840b2120f3b0f2343e7c0e /src | |
| parent | f38eca4d3f1c3079c3239bd51033202635f0c6e1 (diff) | |
Core/LFG: send SoftLock = 2 for dungeons which are out of level range, unavailable for the current expansion or not in season to hide them from the dungeon finder list
* the client isn't giving away much info on how these values could be named. All we know from sniffs is that 2 is the value used by default. Though 1 also hides dungeons, we stick with what sniffs say for now until someone with more extensive reverse engineering knowledge can dig up the solution
Diffstat (limited to 'src')
| -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) { |
