aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoroffl <11556157+offl@users.noreply.github.com>2021-04-20 17:34:27 +0300
committerGitHub <noreply@github.com>2021-04-20 17:34:27 +0300
commit3f1fc262acdb3bc27c219388fdbb0314dee0457a (patch)
tree2e086d5ca07cbdb6ed38d59869f26c819cd4c925 /src
parent6e36a2007cc64a4fe11cc7781c9ca6f619118a20 (diff)
Scripts/HoL: Update Loken to new model (#26430)
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp252
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);
}