diff options
author | offl <11556157+offl@users.noreply.github.com> | 2021-04-20 17:34:27 +0300 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-03-08 23:00:02 +0100 |
commit | 3ea5cf0ba80b1cda6243d9264d80a0d807dc1c09 (patch) | |
tree | 5bf8ea14507a6024de4eae48a2b2be7c60bb26df /src | |
parent | b1baf9c5dfdc2dacde4f9c91f68273be22521ca9 (diff) |
Scripts/HoL: Update Loken to new model (#26430)
(cherry picked from commit 3f1fc262acdb3bc27c219388fdbb0314dee0457a)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp | 255 |
1 files changed, 117 insertions, 138 deletions
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp index b851558391f..5583ae7f3dc 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp @@ -47,10 +47,11 @@ enum Spells SPELL_ARC_LIGHTNING = 52921, SPELL_LIGHTNING_NOVA = 52960, - SPELL_PULSING_SHOCKWAVE = 52961, SPELL_PULSING_SHOCKWAVE_AURA = 59414 }; +#define SPELL_PULSING_SHOCKWAVE DUNGEON_MODE<uint32>(52961,59836) + enum Events { EVENT_ARC_LIGHTNING = 1, @@ -75,173 +76,151 @@ enum Misc ## Boss Loken ######*/ -class boss_loken : public CreatureScript +struct boss_loken : public BossAI { -public: - boss_loken() : CreatureScript("boss_loken") { } + boss_loken(Creature* creature) : BossAI(creature, DATA_LOKEN) + { + Initialize(); + _isIntroDone = false; + } - struct boss_lokenAI : public BossAI + void Initialize() { - boss_lokenAI(Creature* creature) : BossAI(creature, DATA_LOKEN) - { - Initialize(); - _isIntroDone = false; - } + _healthAmountModifier = 1; + } - void Initialize() - { - _healthAmountModifier = 1; - } + void Reset() override + { + Initialize(); + _Reset(); + instance->DoStopCriteriaTimer(CriteriaStartEvent::SendEvent, ACHIEV_TIMELY_DEATH_START_EVENT); + } - void Reset() override - { - Initialize(); - _Reset(); - instance->DoStopCriteriaTimer(CriteriaStartEvent::SendEvent, ACHIEV_TIMELY_DEATH_START_EVENT); - } + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + Talk(SAY_AGGRO); + events.SetPhase(PHASE_NORMAL); + events.ScheduleEvent(EVENT_ARC_LIGHTNING, 15s); + events.ScheduleEvent(EVENT_LIGHTNING_NOVA, 20s); + events.ScheduleEvent(EVENT_RESUME_PULSING_SHOCKWAVE, 1s); + instance->DoStartCriteriaTimer(CriteriaStartEvent::SendEvent, ACHIEV_TIMELY_DEATH_START_EVENT); + } - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - Talk(SAY_AGGRO); - events.SetPhase(PHASE_NORMAL); - events.ScheduleEvent(EVENT_ARC_LIGHTNING, 15s); - events.ScheduleEvent(EVENT_LIGHTNING_NOVA, 20s); - events.ScheduleEvent(EVENT_RESUME_PULSING_SHOCKWAVE, 1s); - instance->DoStartCriteriaTimer(CriteriaStartEvent::SendEvent, ACHIEV_TIMELY_DEATH_START_EVENT); - } + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DEATH); + _JustDied(); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PULSING_SHOCKWAVE_AURA, true, true); + } - void JustDied(Unit* /*killer*/) override - { - Talk(SAY_DEATH); - _JustDied(); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PULSING_SHOCKWAVE_AURA, true, true); - } + void KilledUnit(Unit* who) override + { + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } - void KilledUnit(Unit* who) override + void MoveInLineOfSight(Unit* who) override + { + if (!_isIntroDone && me->IsValidAttackTarget(who) && me->IsWithinDistInMap(who, 40.0f)) { - if (who->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } - - void MoveInLineOfSight(Unit* who) override - { - if (!_isIntroDone && me->IsValidAttackTarget(who) && me->IsWithinDistInMap(who, 40.0f)) - { - _isIntroDone = true; - Talk(SAY_INTRO_1); - events.ScheduleEvent(EVENT_INTRO_DIALOGUE, 20s, 0, PHASE_INTRO); - } - BossAI::MoveInLineOfSight(who); + _isIntroDone = true; + Talk(SAY_INTRO_1); + events.ScheduleEvent(EVENT_INTRO_DIALOGUE, 20s, 0, PHASE_INTRO); } + BossAI::MoveInLineOfSight(who); + } - void UpdateAI(uint32 diff) override - { - if (events.IsInPhase(PHASE_NORMAL) && !UpdateVictim()) - return; + void UpdateAI(uint32 diff) override + { + if (events.IsInPhase(PHASE_NORMAL) && !UpdateVictim()) + return; - events.Update(diff); + events.Update(diff); - while (uint32 eventId = events.ExecuteEvent()) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - switch (eventId) - { - case EVENT_ARC_LIGHTNING: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - DoCast(target, SPELL_ARC_LIGHTNING); - events.ScheduleEvent(EVENT_ARC_LIGHTNING, 15s, 16s); - break; - case EVENT_LIGHTNING_NOVA: - Talk(SAY_NOVA); - Talk(EMOTE_NOVA); - DoCastAOE(SPELL_LIGHTNING_NOVA); - me->RemoveAurasDueToSpell(SPELL_PULSING_SHOCKWAVE); - events.ScheduleEvent(EVENT_RESUME_PULSING_SHOCKWAVE, DUNGEON_MODE(5s, 4s)); // Pause Pulsing Shockwave aura - events.ScheduleEvent(EVENT_LIGHTNING_NOVA, 20s, 21s); - break; - case EVENT_RESUME_PULSING_SHOCKWAVE: - DoCast(me, SPELL_PULSING_SHOCKWAVE_AURA, true); - me->ClearUnitState(UNIT_STATE_CASTING); // Workaround to allow DoMeleeAttackIfReady work - DoCast(me, SPELL_PULSING_SHOCKWAVE, true); - break; - case EVENT_INTRO_DIALOGUE: - Talk(SAY_INTRO_2); - events.SetPhase(PHASE_NORMAL); - break; - default: - break; - } + case EVENT_ARC_LIGHTNING: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + DoCast(target, SPELL_ARC_LIGHTNING); + events.ScheduleEvent(EVENT_ARC_LIGHTNING, 15s, 16s); + break; + case EVENT_LIGHTNING_NOVA: + Talk(SAY_NOVA); + Talk(EMOTE_NOVA); + DoCastAOE(SPELL_LIGHTNING_NOVA); + me->RemoveAurasDueToSpell(SPELL_PULSING_SHOCKWAVE); + events.ScheduleEvent(EVENT_RESUME_PULSING_SHOCKWAVE, DUNGEON_MODE(5s, 4s)); // Pause Pulsing Shockwave aura + events.ScheduleEvent(EVENT_LIGHTNING_NOVA, 20s, 21s); + break; + case EVENT_RESUME_PULSING_SHOCKWAVE: + DoCast(me, SPELL_PULSING_SHOCKWAVE_AURA, true); + me->ClearUnitState(UNIT_STATE_CASTING); // Workaround to allow DoMeleeAttackIfReady work + DoCast(me, SPELL_PULSING_SHOCKWAVE, true); + break; + case EVENT_INTRO_DIALOGUE: + Talk(SAY_INTRO_2); + events.SetPhase(PHASE_NORMAL); + break; + default: + break; } - - DoMeleeAttackIfReady(); } - void DamageTaken(Unit* /*attacker*/, uint32& damage) override + DoMeleeAttackIfReady(); + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage) override + { + if (me->HealthBelowPctDamaged(100 - 25 * _healthAmountModifier, damage)) { - if (me->HealthBelowPctDamaged(100 - 25 * _healthAmountModifier, damage)) + switch (_healthAmountModifier) { - switch (_healthAmountModifier) - { - case 1: - Talk(SAY_75HEALTH); - break; - case 2: - Talk(SAY_50HEALTH); - break; - case 3: - Talk(SAY_25HEALTH); - break; - default: - break; - } - ++_healthAmountModifier; + case 1: + Talk(SAY_75HEALTH); + break; + case 2: + Talk(SAY_50HEALTH); + break; + case 3: + Talk(SAY_25HEALTH); + break; + default: + break; } + ++_healthAmountModifier; } - - private: - uint32 _healthAmountModifier; - bool _isIntroDone; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetHallsOfLightningAI<boss_lokenAI>(creature); } + + private: + uint32 _healthAmountModifier; + bool _isIntroDone; }; -class spell_loken_pulsing_shockwave : public SpellScriptLoader +class spell_loken_pulsing_shockwave : public SpellScript { - public: - spell_loken_pulsing_shockwave() : SpellScriptLoader("spell_loken_pulsing_shockwave") { } + PrepareSpellScript(spell_loken_pulsing_shockwave); - class spell_loken_pulsing_shockwave_SpellScript : public SpellScript - { - PrepareSpellScript(spell_loken_pulsing_shockwave_SpellScript); - - void CalculateDamage(SpellEffIndex /*effIndex*/) - { - if (!GetHitUnit()) - return; - - float distance = GetCaster()->GetDistance2d(GetHitUnit()); - if (distance > 1.0f) - SetHitDamage(int32(GetHitDamage() * distance)); - } + void CalculateDamage(SpellEffIndex /*effIndex*/) + { + if (!GetHitUnit()) + return; - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_loken_pulsing_shockwave_SpellScript::CalculateDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); - } - }; + float distance = GetCaster()->GetDistance2d(GetHitUnit()); + if (distance > 1.0f) + SetHitDamage(int32(GetHitDamage() * distance)); + } - SpellScript* GetSpellScript() const override - { - return new spell_loken_pulsing_shockwave_SpellScript(); - } + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_loken_pulsing_shockwave::CalculateDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + } }; void AddSC_boss_loken() { - new boss_loken(); - new spell_loken_pulsing_shockwave(); + RegisterHallsOfLightningCreatureAI(boss_loken); + RegisterSpellScript(spell_loken_pulsing_shockwave); } |