diff options
author | offl <11556157+offl@users.noreply.github.com> | 2021-04-20 17:34:27 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-20 17:34:27 +0300 |
commit | 3f1fc262acdb3bc27c219388fdbb0314dee0457a (patch) | |
tree | 2e086d5ca07cbdb6ed38d59869f26c819cd4c925 /src | |
parent | 6e36a2007cc64a4fe11cc7781c9ca6f619118a20 (diff) |
Scripts/HoL: Update Loken to new model (#26430)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp | 252 |
1 files changed, 115 insertions, 137 deletions
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp index e2ae79e53d1..8f2cb177003 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp @@ -76,173 +76,151 @@ enum Misc ## Boss Loken ######*/ -class boss_loken : public CreatureScript +struct boss_loken : public BossAI { -public: - boss_loken() : CreatureScript("boss_loken") { } - - struct boss_lokenAI : public BossAI + boss_loken(Creature* creature) : BossAI(creature, DATA_LOKEN) { - boss_lokenAI(Creature* creature) : BossAI(creature, DATA_LOKEN) - { - Initialize(); - _isIntroDone = false; - } + Initialize(); + _isIntroDone = false; + } - void Initialize() - { - _healthAmountModifier = 1; - } + void Initialize() + { + _healthAmountModifier = 1; + } - void Reset() override - { - Initialize(); - _Reset(); - instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT); - } + void Reset() override + { + Initialize(); + _Reset(); + instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, 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->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, 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->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, 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 + { + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } - void MoveInLineOfSight(Unit* who) override + void MoveInLineOfSight(Unit* who) override + { + if (!_isIntroDone && me->IsValidAttackTarget(who) && me->IsWithinDistInMap(who, 40.0f)) { - 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(sSpellMgr->GetSpellIdForDifficulty(SPELL_PULSING_SHOCKWAVE, me)); - 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(sSpellMgr->GetSpellIdForDifficulty(SPELL_PULSING_SHOCKWAVE, me)); + 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); } |