From d3f1be6d2223fc1a1d08751316885b609b693a20 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Sun, 22 Mar 2026 11:07:29 -0500 Subject: [PATCH] fix(Core/Scripts): Fix boss scripts resetting during death/defeat RP after threat system port (#25185) Co-authored-by: blinkysc Co-authored-by: Treeston --- src/server/game/AI/ScriptedAI/ScriptedCreature.cpp | 2 +- src/server/game/Entities/Unit/Unit.cpp | 6 +----- .../MagistersTerrace/boss_felblood_kaelthas.cpp | 3 +-- .../SunwellPlateau/boss_kalecgos.cpp | 1 - .../Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp | 4 ++-- .../scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp | 8 ++++++++ .../scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp | 8 ++++++++ .../scripts/Outland/BlackTemple/boss_illidan.cpp | 13 +++++++++++++ 8 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index b19fdddced..ce9ea88e90 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -472,7 +472,7 @@ void ScriptedAI::DoResetThreat(Unit* unit) void ScriptedAI::DoResetThreatList() { - if (!me->CanHaveThreatList() || me->GetThreatMgr().IsThreatListEmpty()) + if (!me->CanHaveThreatList() || me->GetThreatMgr().IsThreatListEmpty(true)) { LOG_ERROR("entities.unit.ai", "DoResetThreatList called for creature that either cannot have threat list or has empty threat list (me entry = {})", me->GetEntry()); return; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 7d8cb92c04..0d94a956aa 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -11419,12 +11419,8 @@ Unit* Creature::SelectVictim() Unit* target = nullptr; - // Taunt handling is now done inside ThreatManager via TauntState if (CanHaveThreatList()) - { - if (!m_threatManager.IsThreatListEmpty()) - target = m_threatManager.GetCurrentVictim(); - } + target = m_threatManager.GetCurrentVictim(); else if (!HasReactState(REACT_PASSIVE)) { // we have player pet probably diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp index d25849cd05..9caf6524e7 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp @@ -190,11 +190,10 @@ struct boss_felblood_kaelthas : public BossAI damage = me->GetHealth() - 1; if (me->isRegeneratingHealth()) { - me->CombatStop(); me->CastStop(); me->SetRegeneratingHealth(false); me->SetUnitFlag(UNIT_FLAG_DISABLE_MOVE); - me->SetImmuneToAll(true); + me->SetImmuneToAll(true, true); me->SetReactState(REACT_PASSIVE); LapseAction(ACTION_REMOVE_FLY); scheduler.CancelAll(); diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp index 8253bf8103..f32644ea0f 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp @@ -161,7 +161,6 @@ struct boss_kalecgos : public BossAI me->m_Events.AddEventAtOffset([&] { me->SetReactState(REACT_PASSIVE); - me->CombatStop(); me->RemoveAllAuras(); me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); Talk(SAY_EVIL_ENRAGE); diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp index fc9fe8949f..69adba8590 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp @@ -95,7 +95,7 @@ struct boss_skeram : public BossAI creature->CastSpell(creature, SPELL_BIRTH, true); creature->SetControlled(true, UNIT_STATE_ROOT); creature->SetReactState(REACT_PASSIVE); - creature->SetImmuneToAll(true); + creature->SetImmuneToAll(true, true); _copiesGUIDs.push_back(creature->GetGUID()); } @@ -211,7 +211,7 @@ struct boss_skeram : public BossAI _copiesGUIDs.clear(); DoCast(me, SPELL_SUMMON_IMAGES, true); me->SetReactState(REACT_PASSIVE); - me->SetImmuneToAll(true); + me->SetImmuneToAll(true, true); me->SetControlled(true, UNIT_STATE_ROOT); Talk(SAY_SPLIT); _hpct -= 25.0f; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp index 391a73146f..545a3b4227 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp @@ -217,6 +217,14 @@ struct boss_hodir : public BossAI const Position ENTRANCE_DOOR{ 1999.160034f, -297.792999f, 431.960999f, 0 }; const Position EXIT_DOOR{ 1999.709961f, -166.259003f, 432.822998f, 0 }; + void JustExitedCombat() override + { + EngagementOver(); + if (me->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE)) + return; + EnterEvadeMode(EVADE_REASON_NO_HOSTILES); + } + void Reset() override { _Reset(); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp index 6b94236bdb..4fc2897f62 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp @@ -399,6 +399,14 @@ struct boss_thorim : public BossAI go->SetGoState(GO_STATE_ACTIVE); } + void JustExitedCombat() override + { + EngagementOver(); + if (_encounterFinished) + return; + EnterEvadeMode(EVADE_REASON_NO_HOSTILES); + } + void EnterEvadeMode(EvadeReason why) override { DisableThorim(false); diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index c41e1ecc22..2e0cfe9f0b 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp @@ -1101,16 +1101,29 @@ struct npc_maiev_illidan : public ScriptedAI instance = creature->GetInstanceScript(); } + bool _outroActive{ false }; + void Reset() override { + if (_outroActive) + return; scheduler.CancelAll(); me->m_Events.KillAllEvents(false); } + void JustExitedCombat() override + { + EngagementOver(); + if (_outroActive) + return; + EnterEvadeMode(EVADE_REASON_NO_HOSTILES); + } + void DoAction(int32 param) override { if (param == ACTION_MAIEV_ENDING) { + _outroActive = true; scheduler.CancelAll(); me->SetReactState(REACT_PASSIVE); DoStopAttack();