From db4af7ca4cd105b5a1dd1493fb1740cdd27329bb Mon Sep 17 00:00:00 2001 From: Shauren Date: Thu, 26 Jun 2025 15:24:16 +0200 Subject: Core/LFG: Change InstanceScript::UpdateLfgEncounterState to only pass valid dungeon encounter ids to LFGMgr --- src/server/game/Instances/InstanceScript.cpp | 37 ++++++++++++++++------------ 1 file changed, 21 insertions(+), 16 deletions(-) (limited to 'src/server/game/Instances/InstanceScript.cpp') diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index 26cbfd86a21..da687f920d4 100644 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -56,7 +56,7 @@ BossBoundaryData::~BossBoundaryData() DungeonEncounterEntry const* BossInfo::GetDungeonEncounterForDifficulty(Difficulty difficulty) const { - auto itr = std::find_if(DungeonEncounters.begin(), DungeonEncounters.end(), [difficulty](DungeonEncounterEntry const* dungeonEncounter) + auto itr = std::ranges::find_if(DungeonEncounters, [difficulty](DungeonEncounterEntry const* dungeonEncounter) { return dungeonEncounter && (dungeonEncounter->DifficultyID == 0 || Difficulty(dungeonEncounter->DifficultyID) == difficulty); }); @@ -77,9 +77,7 @@ _entranceId(0), _temporaryEntranceId(0), _combatResurrectionTimer(0), _combatRes #endif // #ifndef TRINITY_API_USE_DYNAMIC_LINKING } -InstanceScript::~InstanceScript() -{ -} +InstanceScript::~InstanceScript() = default; bool InstanceScript::IsEncounterInProgress() const { @@ -176,7 +174,7 @@ void InstanceScript::LoadMinionData(MinionData const* data) while (data->entry) { if (data->bossId < bosses.size()) - minions.insert(std::make_pair(data->entry, MinionInfo(&bosses[data->bossId]))); + minions.try_emplace(data->entry, &bosses[data->bossId]); ++data; } @@ -210,8 +208,8 @@ void InstanceScript::LoadObjectData(ObjectData const* data, ObjectInfoMap& objec { while (data->entry) { - ASSERT(objectInfo.find(data->entry) == objectInfo.end()); - objectInfo[data->entry] = data->type; + bool inserted = objectInfo.try_emplace(data->entry, data->type).second; + ASSERT(inserted); ++data; } } @@ -219,8 +217,9 @@ void InstanceScript::LoadObjectData(ObjectData const* data, ObjectInfoMap& objec void InstanceScript::LoadDungeonEncounterData(uint32 bossId, std::array const& dungeonEncounterIds) { if (bossId < bosses.size()) - for (std::size_t i = 0; i < MAX_DUNGEON_ENCOUNTERS_PER_BOSS; ++i) - bosses[bossId].DungeonEncounters[i] = sDungeonEncounterStore.LookupEntry(dungeonEncounterIds[i]); + for (std::size_t i = 0, j = 0; i < MAX_DUNGEON_ENCOUNTERS_PER_BOSS; ++i) + if (dungeonEncounterIds[i]) + bosses[bossId].DungeonEncounters[j++] = sDungeonEncounterStore.AssertEntry(dungeonEncounterIds[i]); } void InstanceScript::UpdateDoorState(GameObject* door) @@ -782,10 +781,9 @@ bool InstanceScript::CheckAchievementCriteriaMeet(uint32 criteria_id, Player con bool InstanceScript::IsEncounterCompleted(uint32 dungeonEncounterId) const { - for (std::size_t i = 0; i < bosses.size(); ++i) - for (std::size_t j = 0; j < bosses[i].DungeonEncounters.size(); ++j) - if (bosses[i].DungeonEncounters[j] && bosses[i].DungeonEncounters[j]->ID == dungeonEncounterId) - return bosses[i].state == DONE; + for (BossInfo const& boss : bosses) + if (advstd::ranges::contains(boss.DungeonEncounters, dungeonEncounterId, &DungeonEncounterEntry::ID)) + return boss.state == DONE; return false; } @@ -915,9 +913,16 @@ void InstanceScript::UpdateLfgEncounterState(BossInfo const* bossInfo) if (grp->isLFGGroup()) { std::array dungeonEncounterIds; - std::ranges::transform(bossInfo->DungeonEncounters, dungeonEncounterIds.begin(), - [](DungeonEncounterEntry const* entry) { return entry ? entry->ID : 0u; }); - sLFGMgr->OnDungeonEncounterDone(grp->GetGUID(), dungeonEncounterIds, instance); + auto itr = dungeonEncounterIds.begin(); + for (DungeonEncounterEntry const* dungeonEncounter : bossInfo->DungeonEncounters) + { + if (!dungeonEncounter) + break; + + *itr = dungeonEncounter->ID; + ++itr; + } + sLFGMgr->OnDungeonEncounterDone(grp->GetGUID(), std::span(dungeonEncounterIds.begin(), itr), instance); break; } } -- cgit v1.2.3