fix(Core/Scripts): Fix Valithria Dreamwalker encounter and default JustExitedCombat (#25315)

Co-authored-by: ForesterDev <11771800+ForesterDev@users.noreply.github.com>
This commit is contained in:
blinkysc 2026-03-30 14:22:36 -05:00 committed by GitHub
parent 263802381c
commit 037588ed03
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 11 additions and 30 deletions

View file

@ -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)

View file

@ -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);
}