From 037588ed03ed475aadf62b027610cde2eee3c424 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Mon, 30 Mar 2026 14:22:36 -0500 Subject: [PATCH] fix(Core/Scripts): Fix Valithria Dreamwalker encounter and default JustExitedCombat (#25315) Co-authored-by: ForesterDev <11771800+ForesterDev@users.noreply.github.com> --- src/server/game/AI/CreatureAI.cpp | 8 ++--- .../boss_valithria_dreamwalker.cpp | 33 +++++-------------- 2 files changed, 11 insertions(+), 30 deletions(-) diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp index 665b915cb..4cfbc1ea3 100644 --- a/src/server/game/AI/CreatureAI.cpp +++ b/src/server/game/AI/CreatureAI.cpp @@ -309,12 +309,8 @@ void CreatureAI::EngagementOver() void CreatureAI::JustExitedCombat() { - EngagementOver(); - - // If creature is alive, in world, and not already evading, trigger evade to return home - // Check IsInWorld to avoid evade during server shutdown/cleanup - if (me->IsAlive() && me->IsInWorld() && !me->IsInEvadeMode()) - EnterEvadeMode(EVADE_REASON_NO_HOSTILES); + // Creatures evade through UpdateVictim() detecting out-of-combat state. + // Scripts that need custom combat-exit behavior should override this. } /*void CreatureAI::AttackedBy(Unit* attacker) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp index 6d497061c..cd7811ba0 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp @@ -341,18 +341,12 @@ public: _done = true; Talk(SAY_VALITHRIA_SUCCESS); _instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); - _instance->DoRemoveAurasDueToSpellOnPlayers(70766); me->RemoveAurasDueToSpell(SPELL_CORRUPTION_VALITHRIA); me->CastSpell(me, SPELL_ACHIEVEMENT_CHECK, true); me->CastSpell((Unit*)nullptr, SPELL_DREAMWALKERS_RAGE, false); - _events.Reset(); _events.ScheduleEvent(EVENT_DREAM_SLIP, 3500ms); - _instance->SetBossState(DATA_VALITHRIA_DREAMWALKER, DONE); - - if (Creature* trigger = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_VALITHRIA_TRIGGER))) - trigger->AI()->EnterEvadeMode(); if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_VALITHRIA_LICH_KING))) - lichKing->AI()->Reset(); + lichKing->AI()->EnterEvadeMode(); } else if (!_over75PercentTalkDone && me->HealthAbovePctHealed(75, heal)) { @@ -361,11 +355,8 @@ public: } else if (_instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == NOT_STARTED) { - if (Creature* trigger = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_VALITHRIA_TRIGGER))) - { - trigger->AI()->DoAction(ACTION_ENTER_COMBAT); - _instance->SetBossState(DATA_VALITHRIA_DREAMWALKER, IN_PROGRESS); - } + if (Creature* archmage = me->FindNearestCreature(NPC_RISEN_ARCHMAGE, 30.0f)) + DoZoneInCombat(archmage); // archmage chain will put trigger in combat } } @@ -388,7 +379,7 @@ public: Talk(SAY_VALITHRIA_DEATH); _instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); if (Creature* trigger = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_VALITHRIA_TRIGGER))) - trigger->AI()->EnterEvadeMode(); + trigger->AI()->DoAction(ACTION_DEATH); } } } @@ -404,6 +395,8 @@ public: me->SetDisplayId(11686); me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); me->DespawnOrUnsummon(4s); + if (Creature* trigger = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_VALITHRIA_TRIGGER))) + Unit::Kill(me, trigger); if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_VALITHRIA_LICH_KING))) lichKing->CastSpell(lichKing, SPELL_SPAWN_CHEST, false); _instance->SetData(DATA_WEEKLY_QUEST_ID, 0); // show hidden npc if necessary @@ -434,13 +427,8 @@ public: void UpdateAI(uint32 diff) override { // does not enter combat - if (_instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == NOT_STARTED) - { - uint32 startingHealth = me->GetMaxHealth() * 0.5f; - if (me->GetHealth() != startingHealth) // healing when boss cannot be engaged (lower spire not finished, cheating) doesn't start the fight, prevent winning this way - me->SetHealth(startingHealth); + if (_instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) != IN_PROGRESS) return; - } _events.Update(diff); @@ -544,11 +532,6 @@ public: void MoveInLineOfSight(Unit* /*who*/) override {} - bool CanAIAttack(Unit const* target) const override - { - return target->IsPlayer(); - } - void JustExitedCombat() override { EngagementOver(); @@ -557,6 +540,8 @@ public: if (!me->IsAlive()) return; + if (instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == DONE) + return; DoAction(ACTION_DEATH); }