aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoroffl <11556157+offl@users.noreply.github.com>2021-04-16 20:14:05 +0300
committerShauren <shauren.trinity@gmail.com>2022-03-08 22:38:00 +0100
commitaac1f2c9eab4b5dfdaebcf2fa39e499df4c60392 (patch)
tree27fa08c3296af4e13813e84bd606f937fa491fee /src
parentcd7eeea024b13aecc2e562b593a113101e8918d4 (diff)
Scripts/Outland: Update Kazzak & Doomwalker to new model (#26419)
(cherry picked from commit 9aa7ed4954018751c3955c6f43889245cf8f144d)
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Outland/boss_doomlord_kazzak.cpp329
-rw-r--r--src/server/scripts/Outland/boss_doomwalker.cpp219
2 files changed, 252 insertions, 296 deletions
diff --git a/src/server/scripts/Outland/boss_doomlord_kazzak.cpp b/src/server/scripts/Outland/boss_doomlord_kazzak.cpp
index 07f400fa678..6b23be80e52 100644
--- a/src/server/scripts/Outland/boss_doomlord_kazzak.cpp
+++ b/src/server/scripts/Outland/boss_doomlord_kazzak.cpp
@@ -57,207 +57,174 @@ enum Events
EVENT_BERSERK = 8
};
-class boss_doomlord_kazzak : public CreatureScript
+struct boss_doomlord_kazzak : public ScriptedAI
{
- public:
- boss_doomlord_kazzak() : CreatureScript("boss_doomlord_kazzak") { }
-
- struct boss_doomlordkazzakAI : public ScriptedAI
+ boss_doomlord_kazzak(Creature* creature) : ScriptedAI(creature)
+ {
+ }
+
+ void Reset() override
+ {
+ _events.Reset();
+ _events.ScheduleEvent(EVENT_SHADOW_VOLLEY, 6s, 10s);
+ _events.ScheduleEvent(EVENT_CLEAVE, 7s);
+ _events.ScheduleEvent(EVENT_THUNDERCLAP, 14s, 18s);
+ _events.ScheduleEvent(EVENT_VOID_BOLT, 30s);
+ _events.ScheduleEvent(EVENT_MARK_OF_KAZZAK, 25s);
+ _events.ScheduleEvent(EVENT_ENRAGE, 1min);
+ _events.ScheduleEvent(EVENT_TWISTED_REFLECTION, 33s);
+ _events.ScheduleEvent(EVENT_BERSERK, 3min);
+ }
+
+ void JustAppeared() override
+ {
+ Talk(SAY_INTRO);
+ }
+
+ void JustEngagedWith(Unit* /*who*/) override
+ {
+ Talk(SAY_AGGRO);
+ }
+
+ void KilledUnit(Unit* victim) override
+ {
+ // When Kazzak kills a player (not pets/totems), he regens some health
+ if (victim->GetTypeId() != TYPEID_PLAYER)
+ return;
+
+ DoCast(me, SPELL_CAPTURE_SOUL);
+
+ Talk(SAY_KILL);
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ Talk(SAY_DEATH);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ // Return since we have no target
+ if (!UpdateVictim())
+ return;
+
+ _events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = _events.ExecuteEvent())
{
- boss_doomlordkazzakAI(Creature* creature) : ScriptedAI(creature)
- {
- }
-
- void Reset() override
- {
- _events.Reset();
- _events.ScheduleEvent(EVENT_SHADOW_VOLLEY, 6s, 10s);
- _events.ScheduleEvent(EVENT_CLEAVE, 7s);
- _events.ScheduleEvent(EVENT_THUNDERCLAP, 14s, 18s);
- _events.ScheduleEvent(EVENT_VOID_BOLT, 30s);
- _events.ScheduleEvent(EVENT_MARK_OF_KAZZAK, 25s);
- _events.ScheduleEvent(EVENT_ENRAGE, 1min);
- _events.ScheduleEvent(EVENT_TWISTED_REFLECTION, 33s);
- _events.ScheduleEvent(EVENT_BERSERK, 3min);
- }
-
- void JustAppeared() override
- {
- Talk(SAY_INTRO);
- }
-
- void JustEngagedWith(Unit* /*who*/) override
- {
- Talk(SAY_AGGRO);
- }
-
- void KilledUnit(Unit* victim) override
- {
- // When Kazzak kills a player (not pets/totems), he regens some health
- if (victim->GetTypeId() != TYPEID_PLAYER)
- return;
-
- DoCast(me, SPELL_CAPTURE_SOUL);
-
- Talk(SAY_KILL);
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- Talk(SAY_DEATH);
- }
-
- void UpdateAI(uint32 diff) override
+ switch (eventId)
{
- // Return since we have no target
- if (!UpdateVictim())
- return;
-
- _events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_SHADOW_VOLLEY:
- DoCastVictim(SPELL_SHADOW_VOLLEY);
- _events.ScheduleEvent(EVENT_SHADOW_VOLLEY, 4s, 6s);
- break;
- case EVENT_CLEAVE:
- DoCastVictim(SPELL_CLEAVE);
- _events.ScheduleEvent(EVENT_CLEAVE, 8s, 12s);
- break;
- case EVENT_THUNDERCLAP:
- DoCastVictim(SPELL_THUNDERCLAP);
- _events.ScheduleEvent(EVENT_THUNDERCLAP, 10s, 14s);
- break;
- case EVENT_VOID_BOLT:
- DoCastVictim(SPELL_VOID_BOLT);
- _events.ScheduleEvent(EVENT_VOID_BOLT, 15s, 18s);
- break;
- case EVENT_MARK_OF_KAZZAK:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
- DoCast(target, SPELL_MARK_OF_KAZZAK);
- _events.ScheduleEvent(EVENT_MARK_OF_KAZZAK, 20s);
- break;
- case EVENT_ENRAGE:
- Talk(EMOTE_FRENZY);
- DoCast(me, SPELL_ENRAGE);
- _events.ScheduleEvent(EVENT_ENRAGE, 30s);
- break;
- case EVENT_TWISTED_REFLECTION:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
- DoCast(target, SPELL_TWISTED_REFLECTION);
- _events.ScheduleEvent(EVENT_TWISTED_REFLECTION, 15s);
- break;
- case EVENT_BERSERK:
- DoCast(me, SPELL_BERSERK);
- break;
- default:
- break;
- }
- }
-
- DoMeleeAttackIfReady();
+ case EVENT_SHADOW_VOLLEY:
+ DoCastVictim(SPELL_SHADOW_VOLLEY);
+ _events.ScheduleEvent(EVENT_SHADOW_VOLLEY, 4s, 6s);
+ break;
+ case EVENT_CLEAVE:
+ DoCastVictim(SPELL_CLEAVE);
+ _events.ScheduleEvent(EVENT_CLEAVE, 8s, 12s);
+ break;
+ case EVENT_THUNDERCLAP:
+ DoCastVictim(SPELL_THUNDERCLAP);
+ _events.ScheduleEvent(EVENT_THUNDERCLAP, 10s, 14s);
+ break;
+ case EVENT_VOID_BOLT:
+ DoCastVictim(SPELL_VOID_BOLT);
+ _events.ScheduleEvent(EVENT_VOID_BOLT, 15s, 18s);
+ break;
+ case EVENT_MARK_OF_KAZZAK:
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
+ DoCast(target, SPELL_MARK_OF_KAZZAK);
+ _events.ScheduleEvent(EVENT_MARK_OF_KAZZAK, 20s);
+ break;
+ case EVENT_ENRAGE:
+ Talk(EMOTE_FRENZY);
+ DoCast(me, SPELL_ENRAGE);
+ _events.ScheduleEvent(EVENT_ENRAGE, 30s);
+ break;
+ case EVENT_TWISTED_REFLECTION:
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
+ DoCast(target, SPELL_TWISTED_REFLECTION);
+ _events.ScheduleEvent(EVENT_TWISTED_REFLECTION, 15s);
+ break;
+ case EVENT_BERSERK:
+ DoCast(me, SPELL_BERSERK);
+ break;
+ default:
+ break;
}
+ }
- private:
- EventMap _events;
- };
+ DoMeleeAttackIfReady();
+ }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new boss_doomlordkazzakAI(creature);
- }
+private:
+ EventMap _events;
};
-class spell_mark_of_kazzak : public SpellScriptLoader
+class spell_mark_of_kazzak : public AuraScript
{
- public:
- spell_mark_of_kazzak() : SpellScriptLoader("spell_mark_of_kazzak") { }
+ PrepareAuraScript(spell_mark_of_kazzak);
- class spell_mark_of_kazzak_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_mark_of_kazzak_AuraScript);
-
- bool Validate(SpellInfo const* /*spell*/) override
- {
- return ValidateSpellInfo({ SPELL_MARK_OF_KAZZAK_DAMAGE });
- }
-
- void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
- {
- if (Unit* owner = GetUnitOwner())
- amount = CalculatePct(owner->GetPower(POWER_MANA), 5);
- }
+ bool Validate(SpellInfo const* /*spell*/) override
+ {
+ return ValidateSpellInfo({ SPELL_MARK_OF_KAZZAK_DAMAGE });
+ }
- void OnPeriodic(AuraEffect const* aurEff)
- {
- Unit* target = GetTarget();
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ if (Unit* owner = GetUnitOwner())
+ amount = CalculatePct(owner->GetPower(POWER_MANA), 5);
+ }
- if (target->GetPower(POWER_MANA) == 0)
- {
- target->CastSpell(target, SPELL_MARK_OF_KAZZAK_DAMAGE, aurEff);
- // Remove aura
- SetDuration(0);
- }
- }
+ void OnPeriodic(AuraEffect const* aurEff)
+ {
+ Unit* target = GetTarget();
- void Register() override
- {
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mark_of_kazzak_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_MANA_LEECH);
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_mark_of_kazzak_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_MANA_LEECH);
- }
- };
-
- AuraScript* GetAuraScript() const override
+ if (target->GetPower(POWER_MANA) == 0)
{
- return new spell_mark_of_kazzak_AuraScript();
+ target->CastSpell(target, SPELL_MARK_OF_KAZZAK_DAMAGE, aurEff);
+ // Remove aura
+ SetDuration(0);
}
+ }
+
+ void Register() override
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mark_of_kazzak::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_MANA_LEECH);
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_mark_of_kazzak::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_MANA_LEECH);
+ }
};
-class spell_twisted_reflection : public SpellScriptLoader
+class spell_twisted_reflection : public AuraScript
{
- public:
- spell_twisted_reflection() : SpellScriptLoader("spell_twisted_reflection") { }
-
- class spell_twisted_reflection_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_twisted_reflection_AuraScript);
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_TWISTED_REFLECTION_HEAL });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- DamageInfo* damageInfo = eventInfo.GetDamageInfo();
- if (!damageInfo || !damageInfo->GetDamage())
- return;
-
- eventInfo.GetActionTarget()->CastSpell(eventInfo.GetActor(), SPELL_TWISTED_REFLECTION_HEAL, aurEff);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_twisted_reflection_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
- };
-
- AuraScript* GetAuraScript() const override
- {
- return new spell_twisted_reflection_AuraScript();
- }
+ PrepareAuraScript(spell_twisted_reflection);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_TWISTED_REFLECTION_HEAL });
+ }
+
+ void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ DamageInfo* damageInfo = eventInfo.GetDamageInfo();
+ if (!damageInfo || !damageInfo->GetDamage())
+ return;
+
+ eventInfo.GetActionTarget()->CastSpell(eventInfo.GetActor(), SPELL_TWISTED_REFLECTION_HEAL, aurEff);
+ }
+
+ void Register() override
+ {
+ OnEffectProc += AuraEffectProcFn(spell_twisted_reflection::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
};
void AddSC_boss_doomlordkazzak()
{
- new boss_doomlord_kazzak();
- new spell_mark_of_kazzak();
- new spell_twisted_reflection();
+ RegisterCreatureAI(boss_doomlord_kazzak);
+ RegisterSpellScript(spell_mark_of_kazzak);
+ RegisterSpellScript(spell_twisted_reflection);
}
diff --git a/src/server/scripts/Outland/boss_doomwalker.cpp b/src/server/scripts/Outland/boss_doomwalker.cpp
index 79cc2429f77..f9b48263ba7 100644
--- a/src/server/scripts/Outland/boss_doomwalker.cpp
+++ b/src/server/scripts/Outland/boss_doomwalker.cpp
@@ -47,130 +47,119 @@ enum Events
EVENT_OVERRUN = 5
};
-class boss_doomwalker : public CreatureScript
+struct boss_doomwalker : public ScriptedAI
{
- public:
- boss_doomwalker() : CreatureScript("boss_doomwalker") { }
-
- struct boss_doomwalkerAI : public ScriptedAI
+ boss_doomwalker(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _inEnrage = false;
+ }
+
+ void Reset() override
+ {
+ _events.Reset();
+ _events.ScheduleEvent(EVENT_ENRAGE, 0s);
+ _events.ScheduleEvent(EVENT_ARMOR, 5s, 13s);
+ _events.ScheduleEvent(EVENT_CHAIN, 10s, 30s);
+ _events.ScheduleEvent(EVENT_QUAKE, 25s, 35s);
+ _events.ScheduleEvent(EVENT_OVERRUN, 30s, 45s);
+ Initialize();
+ }
+
+ void KilledUnit(Unit* victim) override
+ {
+ victim->CastSpell(victim, SPELL_MARK_DEATH, true);
+
+ if (urand(0, 4))
+ return;
+
+ Talk(SAY_SLAY);
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ Talk(SAY_DEATH);
+ }
+
+ void JustEngagedWith(Unit* /*who*/) override
+ {
+ Talk(SAY_AGGRO);
+ }
+
+ void MoveInLineOfSight(Unit* who) override
+
+ {
+ if (who && who->GetTypeId() == TYPEID_PLAYER && me->IsValidAttackTarget(who))
+ if (who->HasAura(SPELL_MARK_DEATH))
+ who->CastSpell(who, SPELL_AURA_DEATH, 1);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
+
+ _events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = _events.ExecuteEvent())
{
- boss_doomwalkerAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- }
-
- void Initialize()
- {
- _inEnrage = false;
- }
-
- void Reset() override
- {
- _events.Reset();
- _events.ScheduleEvent(EVENT_ENRAGE, 0s);
- _events.ScheduleEvent(EVENT_ARMOR, 5s, 13s);
- _events.ScheduleEvent(EVENT_CHAIN, 10s, 30s);
- _events.ScheduleEvent(EVENT_QUAKE, 25s, 35s);
- _events.ScheduleEvent(EVENT_OVERRUN, 30s, 45s);
- Initialize();
- }
-
- void KilledUnit(Unit* victim) override
- {
- victim->CastSpell(victim, SPELL_MARK_DEATH, true);
-
- if (urand(0, 4))
- return;
-
- Talk(SAY_SLAY);
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- Talk(SAY_DEATH);
- }
-
- void JustEngagedWith(Unit* /*who*/) override
- {
- Talk(SAY_AGGRO);
- }
-
- void MoveInLineOfSight(Unit* who) override
-
- {
- if (who && who->GetTypeId() == TYPEID_PLAYER && me->IsValidAttackTarget(who))
- if (who->HasAura(SPELL_MARK_DEATH))
- who->CastSpell(who, SPELL_AURA_DEATH, 1);
- }
-
- void UpdateAI(uint32 diff) override
+ switch (eventId)
{
- if (!UpdateVictim())
- return;
-
- _events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
+ case EVENT_ENRAGE:
+ if (!HealthAbovePct(20))
{
- case EVENT_ENRAGE:
- if (!HealthAbovePct(20))
- {
- DoCast(me, SPELL_ENRAGE);
- _events.ScheduleEvent(EVENT_ENRAGE, 6s);
- _inEnrage = true;
- }
- break;
- case EVENT_OVERRUN:
- Talk(SAY_OVERRUN);
- DoCastVictim(SPELL_OVERRUN);
- _events.ScheduleEvent(EVENT_OVERRUN, 25s, 40s);
- break;
- case EVENT_QUAKE:
- if (urand(0, 1))
- return;
-
- Talk(SAY_EARTHQUAKE);
-
- //remove enrage before casting earthquake because enrage + earthquake = 16000dmg over 8sec and all dead
- if (_inEnrage)
- me->RemoveAurasDueToSpell(SPELL_ENRAGE);
-
- DoCast(me, SPELL_EARTHQUAKE);
- _events.ScheduleEvent(EVENT_QUAKE, 30s, 55s);
- break;
- case EVENT_CHAIN:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true))
- DoCast(target, SPELL_CHAIN_LIGHTNING);
- _events.ScheduleEvent(EVENT_CHAIN, 7s, 27s);
- break;
- case EVENT_ARMOR:
- DoCastVictim(SPELL_SUNDER_ARMOR);
- _events.ScheduleEvent(EVENT_ARMOR, 10s, 25s);
- break;
- default:
- break;
+ DoCast(me, SPELL_ENRAGE);
+ _events.ScheduleEvent(EVENT_ENRAGE, 6s);
+ _inEnrage = true;
}
- }
- DoMeleeAttackIfReady();
+ break;
+ case EVENT_OVERRUN:
+ Talk(SAY_OVERRUN);
+ DoCastVictim(SPELL_OVERRUN);
+ _events.ScheduleEvent(EVENT_OVERRUN, 25s, 40s);
+ break;
+ case EVENT_QUAKE:
+ if (urand(0, 1))
+ return;
+
+ Talk(SAY_EARTHQUAKE);
+
+ //remove enrage before casting earthquake because enrage + earthquake = 16000dmg over 8sec and all dead
+ if (_inEnrage)
+ me->RemoveAurasDueToSpell(SPELL_ENRAGE);
+
+ DoCast(me, SPELL_EARTHQUAKE);
+ _events.ScheduleEvent(EVENT_QUAKE, 30s, 55s);
+ break;
+ case EVENT_CHAIN:
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true))
+ DoCast(target, SPELL_CHAIN_LIGHTNING);
+ _events.ScheduleEvent(EVENT_CHAIN, 7s, 27s);
+ break;
+ case EVENT_ARMOR:
+ DoCastVictim(SPELL_SUNDER_ARMOR);
+ _events.ScheduleEvent(EVENT_ARMOR, 10s, 25s);
+ break;
+ default:
+ break;
}
-
- private:
- EventMap _events;
- bool _inEnrage;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new boss_doomwalkerAI(creature);
}
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ EventMap _events;
+ bool _inEnrage;
};
void AddSC_boss_doomwalker()
{
- new boss_doomwalker();
+ RegisterCreatureAI(boss_doomwalker);
}