From 8b82e1c49402765c6658893f6062599a57bf88c1 Mon Sep 17 00:00:00 2001 From: Hondacrx Date: Mon, 18 Aug 2025 20:52:49 -0400 Subject: [PATCH] Core/LFG: Change InstanceScript::UpdateLfgEncounterState to only pass valid dungeon encounter ids to LFGMgr Port From (https://github.com/TrinityCore/TrinityCore/commit/db4af7ca4cd105b5a1dd1493fb1740cdd27329bb) --- Source/Game/DungeonFinding/LFGManager.cs | 6 +++--- Source/Game/Maps/Instances/InstanceScript.cs | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Source/Game/DungeonFinding/LFGManager.cs b/Source/Game/DungeonFinding/LFGManager.cs index bb73e6724..088179804 100644 --- a/Source/Game/DungeonFinding/LFGManager.cs +++ b/Source/Game/DungeonFinding/LFGManager.cs @@ -1339,9 +1339,9 @@ namespace Game.DungeonFinding /// Check if dungeon can be rewarded, if any. /// /// Group guid - /// DungeonEncounter that was just completed + /// DungeonEncounter that was just completed /// Map of the instance where encounter was completed - public void OnDungeonEncounterDone(ObjectGuid gguid, uint[] dungeonEncounterIds, Map currMap) + public void OnDungeonEncounterDone(ObjectGuid gguid, uint[] dungeonEncounters, Map currMap) { if (GetState(gguid) == LfgState.FinishedDungeon) // Shouldn't happen. Do not reward multiple times { @@ -1352,7 +1352,7 @@ namespace Game.DungeonFinding uint gDungeonId = GetDungeon(gguid); LFGDungeonData dungeonDone = GetLFGDungeon(gDungeonId); // LFGDungeons can point to a DungeonEncounter from any difficulty so we need this kind of lenient check - if (dungeonDone.finalDungeonEncounterId == 0 || !dungeonEncounterIds.Contains(dungeonDone.finalDungeonEncounterId)) + if (dungeonDone.finalDungeonEncounterId == 0 || !dungeonEncounters.Contains(dungeonDone.finalDungeonEncounterId)) return; FinishDungeon(gguid, gDungeonId, currMap); diff --git a/Source/Game/Maps/Instances/InstanceScript.cs b/Source/Game/Maps/Instances/InstanceScript.cs index 762c434ad..de24e91e1 100644 --- a/Source/Game/Maps/Instances/InstanceScript.cs +++ b/Source/Game/Maps/Instances/InstanceScript.cs @@ -138,8 +138,9 @@ namespace Game.Maps void LoadDungeonEncounterData(uint bossId, uint[] dungeonEncounterIds) { if (bossId < bosses.Count) - for (int i = 0; i < dungeonEncounterIds.Length && i < MapConst.MaxDungeonEncountersPerBoss; ++i) - bosses[bossId].DungeonEncounters[i] = CliDB.DungeonEncounterStorage.LookupByKey(dungeonEncounterIds[i]); + for (int i = 0, j = 0; i < dungeonEncounterIds.Length && i < MapConst.MaxDungeonEncountersPerBoss; ++i) + if (dungeonEncounterIds[i] != 0) + bosses[bossId].DungeonEncounters[j++] = CliDB.DungeonEncounterStorage.LookupByKey(dungeonEncounterIds[i]); } public virtual void UpdateDoorState(GameObject door) @@ -724,10 +725,9 @@ namespace Game.Maps public bool IsEncounterCompleted(uint dungeonEncounterId) { - for (uint i = 0; i < bosses.Count; ++i) - for (var j = 0; j < bosses[i].DungeonEncounters.Length; ++j) - if (bosses[i].DungeonEncounters[j] != null && bosses[i].DungeonEncounters[j].Id == dungeonEncounterId) - return bosses[i].state == EncounterState.Done; + foreach (var (_, boss) in bosses) + if (boss.DungeonEncounters.Any(p => p.Id == dungeonEncounterId)) + return boss.state == EncounterState.Done; return false; }