summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew <47818697+Nyeriah@users.noreply.github.com>2025-11-07 19:37:42 -0300
committerGitHub <noreply@github.com>2025-11-07 19:37:42 -0300
commit09e0343491f2d91e18a2aa75f379e8d163386ea4 (patch)
tree06ff60006b44c0eeebc64bcc4fa9a9991ffde947 /src
parent433be0211142652fa478891d32aa240af837d390 (diff)
fix(Scripts/Ahnkahet): Clean up Herald Volazj insanity casting and ph… (#23549)
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp111
1 files changed, 25 insertions, 86 deletions
diff --git a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp
index fa1a998b0d..e1b0018ef7 100644
--- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp
@@ -77,51 +77,52 @@ enum Misc
DATA_SET_INSANITY_PHASE = 1,
};
-enum Events
-{
- EVENT_HERALD_MIND_FLAY = 1,
- EVENT_HERALD_SHADOW,
- EVENT_HERALD_SHIVER,
-};
-
const std::array<uint32, MAX_INSANITY_TARGETS> InsanitySpells = { SPELL_INSANITY_PHASING_1, SPELL_INSANITY_PHASING_2, SPELL_INSANITY_PHASING_3, SPELL_INSANITY_PHASING_4, SPELL_INSANITY_PHASING_5 };
struct boss_volazj : public BossAI
{
boss_volazj(Creature* pCreature) : BossAI(pCreature, DATA_HERALD_VOLAZJ),
- insanityTimes(0),
insanityPhase(false)
{ }
- void InitializeAI() override
- {
- BossAI::InitializeAI();
- // Visible for all players in insanity
- me->SetPhaseMask((1 | 16 | 32 | 64 | 128 | 256), true);
- }
-
void Reset() override
{
_Reset();
- insanityTimes = 0;
insanityPhase = false;
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
me->SetControlled(false, UNIT_STATE_STUNNED);
ResetPlayersPhaseMask();
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT);
+ me->SetPhaseMask((1 | 16 | 32 | 64 | 128 | 256), true);
+
+ ScheduleHealthCheckEvent({ 66, 33 }, [&]{
+ scheduler.CancelAll();
+ DoCastSelf(SPELL_INSANITY);
+ }, false);
+ }
+
+ void ScheduleTasks() override
+ {
+ ScheduleTimedEvent(8s, [&] {
+ DoCastVictim(SPELL_MIND_FLAY);
+ }, 20s);
+
+ ScheduleTimedEvent(5s, [&] {
+ DoCastVictim(SPELL_SHADOW_BOLT_VOLLEY);
+ }, 5s);
+
+ ScheduleTimedEvent(15s, [&] {
+ DoCastRandomTarget(SPELL_SHIVER);
+ }, 15s);
}
void JustEngagedWith(Unit* /*who*/) override
{
_JustEngagedWith();
- events.ScheduleEvent(EVENT_HERALD_MIND_FLAY, 8s);
- events.ScheduleEvent(EVENT_HERALD_SHADOW, 5s);
- events.ScheduleEvent(EVENT_HERALD_SHIVER, 15s);
Talk(SAY_AGGRO);
DoCastSelf(SPELL_WHISPER_AGGRO);
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT);
- me->SetInCombatWithZone();
}
void JustDied(Unit* /*killer*/) override
@@ -184,36 +185,13 @@ struct boss_volazj : public BossAI
}
}
- void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damagetype*/, SpellSchoolMask /*damageSchoolMask*/) override
- {
- // Do not perform insanity recast if boss is casting Insanity already
- if (me->FindCurrentSpellBySpellId(SPELL_INSANITY))
- {
- return;
- }
-
- // First insanity
- if (insanityTimes == 0 && me->HealthBelowPctDamaged(66, damage))
- {
- DoCastSelf(SPELL_INSANITY, false);
- ++insanityTimes;
- }
- // Second insanity
- else if (insanityTimes == 1 && me->HealthBelowPctDamaged(33, damage))
- {
- me->InterruptNonMeleeSpells(false);
- DoCastSelf(SPELL_INSANITY, false);
- ++insanityTimes;
- }
- }
-
void UpdateAI(uint32 diff) override
{
//Return since we have no target
if (!UpdateVictim())
- {
return;
- }
+
+ scheduler.Update(diff);
if (insanityPhase)
{
@@ -226,53 +204,13 @@ struct boss_volazj : public BossAI
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
me->SetControlled(false, UNIT_STATE_STUNNED);
me->RemoveAurasDueToSpell(INSANITY_VISUAL);
- }
-
- events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- {
- return;
- }
-
- while (uint32 const eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_HERALD_MIND_FLAY:
- {
- DoCastVictim(SPELL_MIND_FLAY, false);
- events.Repeat(20s);
- break;
- }
- case EVENT_HERALD_SHADOW:
- {
- DoCastVictim(SPELL_SHADOW_BOLT_VOLLEY, false);
- events.Repeat(5s);
- break;
- }
- case EVENT_HERALD_SHIVER:
- {
- if (Unit* pTarget = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
- {
- DoCast(pTarget, SPELL_SHIVER, false);
- }
-
- events.Repeat(15s);
- break;
- }
- }
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- {
- return;
- }
+ ScheduleTasks();
}
DoMeleeAttackIfReady();
}
private:
- uint8 insanityTimes;
bool insanityPhase; // Indicates if boss enter to insanity phase
uint32 GetPlrInsanityAuraId(uint32 phaseMask) const
@@ -312,6 +250,7 @@ private:
bool CheckPhaseMinions()
{
summons.RemoveNotExisting();
+
if (summons.empty())
{
ResetPlayersPhaseMask();