diff options
author | offl <11556157+offl@users.noreply.github.com> | 2021-04-16 20:14:05 +0300 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-03-08 22:38:00 +0100 |
commit | aac1f2c9eab4b5dfdaebcf2fa39e499df4c60392 (patch) | |
tree | 27fa08c3296af4e13813e84bd606f937fa491fee /src | |
parent | cd7eeea024b13aecc2e562b593a113101e8918d4 (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.cpp | 329 | ||||
-rw-r--r-- | src/server/scripts/Outland/boss_doomwalker.cpp | 219 |
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); } |