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:
@@ -309,12 +309,8 @@ void CreatureAI::EngagementOver()
|
|||||||
|
|
||||||
void CreatureAI::JustExitedCombat()
|
void CreatureAI::JustExitedCombat()
|
||||||
{
|
{
|
||||||
EngagementOver();
|
// Creatures evade through UpdateVictim() detecting out-of-combat state.
|
||||||
|
// Scripts that need custom combat-exit behavior should override this.
|
||||||
// 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*void CreatureAI::AttackedBy(Unit* attacker)
|
/*void CreatureAI::AttackedBy(Unit* attacker)
|
||||||
|
|||||||
@@ -341,18 +341,12 @@ public:
|
|||||||
_done = true;
|
_done = true;
|
||||||
Talk(SAY_VALITHRIA_SUCCESS);
|
Talk(SAY_VALITHRIA_SUCCESS);
|
||||||
_instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
|
_instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
|
||||||
_instance->DoRemoveAurasDueToSpellOnPlayers(70766);
|
|
||||||
me->RemoveAurasDueToSpell(SPELL_CORRUPTION_VALITHRIA);
|
me->RemoveAurasDueToSpell(SPELL_CORRUPTION_VALITHRIA);
|
||||||
me->CastSpell(me, SPELL_ACHIEVEMENT_CHECK, true);
|
me->CastSpell(me, SPELL_ACHIEVEMENT_CHECK, true);
|
||||||
me->CastSpell((Unit*)nullptr, SPELL_DREAMWALKERS_RAGE, false);
|
me->CastSpell((Unit*)nullptr, SPELL_DREAMWALKERS_RAGE, false);
|
||||||
_events.Reset();
|
|
||||||
_events.ScheduleEvent(EVENT_DREAM_SLIP, 3500ms);
|
_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)))
|
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))
|
else if (!_over75PercentTalkDone && me->HealthAbovePctHealed(75, heal))
|
||||||
{
|
{
|
||||||
@@ -361,11 +355,8 @@ public:
|
|||||||
}
|
}
|
||||||
else if (_instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == NOT_STARTED)
|
else if (_instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == NOT_STARTED)
|
||||||
{
|
{
|
||||||
if (Creature* trigger = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_VALITHRIA_TRIGGER)))
|
if (Creature* archmage = me->FindNearestCreature(NPC_RISEN_ARCHMAGE, 30.0f))
|
||||||
{
|
DoZoneInCombat(archmage); // archmage chain will put trigger in combat
|
||||||
trigger->AI()->DoAction(ACTION_ENTER_COMBAT);
|
|
||||||
_instance->SetBossState(DATA_VALITHRIA_DREAMWALKER, IN_PROGRESS);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -388,7 +379,7 @@ public:
|
|||||||
Talk(SAY_VALITHRIA_DEATH);
|
Talk(SAY_VALITHRIA_DEATH);
|
||||||
_instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
|
_instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
|
||||||
if (Creature* trigger = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_VALITHRIA_TRIGGER)))
|
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->SetDisplayId(11686);
|
||||||
me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
|
me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
|
||||||
me->DespawnOrUnsummon(4s);
|
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)))
|
if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_VALITHRIA_LICH_KING)))
|
||||||
lichKing->CastSpell(lichKing, SPELL_SPAWN_CHEST, false);
|
lichKing->CastSpell(lichKing, SPELL_SPAWN_CHEST, false);
|
||||||
_instance->SetData(DATA_WEEKLY_QUEST_ID, 0); // show hidden npc if necessary
|
_instance->SetData(DATA_WEEKLY_QUEST_ID, 0); // show hidden npc if necessary
|
||||||
@@ -434,13 +427,8 @@ public:
|
|||||||
void UpdateAI(uint32 diff) override
|
void UpdateAI(uint32 diff) override
|
||||||
{
|
{
|
||||||
// does not enter combat
|
// does not enter combat
|
||||||
if (_instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == NOT_STARTED)
|
if (_instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) != IN_PROGRESS)
|
||||||
{
|
|
||||||
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);
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
_events.Update(diff);
|
_events.Update(diff);
|
||||||
|
|
||||||
@@ -544,11 +532,6 @@ public:
|
|||||||
|
|
||||||
void MoveInLineOfSight(Unit* /*who*/) override {}
|
void MoveInLineOfSight(Unit* /*who*/) override {}
|
||||||
|
|
||||||
bool CanAIAttack(Unit const* target) const override
|
|
||||||
{
|
|
||||||
return target->IsPlayer();
|
|
||||||
}
|
|
||||||
|
|
||||||
void JustExitedCombat() override
|
void JustExitedCombat() override
|
||||||
{
|
{
|
||||||
EngagementOver();
|
EngagementOver();
|
||||||
@@ -557,6 +540,8 @@ public:
|
|||||||
|
|
||||||
if (!me->IsAlive())
|
if (!me->IsAlive())
|
||||||
return;
|
return;
|
||||||
|
if (instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == DONE)
|
||||||
|
return;
|
||||||
DoAction(ACTION_DEATH);
|
DoAction(ACTION_DEATH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user