diff options
author | offl <11556157+offl@users.noreply.github.com> | 2021-04-16 20:14:29 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-16 20:14:29 +0300 |
commit | 19606ea1e7daadde9aa5ee7169565d5ec727b7e7 (patch) | |
tree | c1dcaba43f520d691eb85787cdba6d8a5be2494c /src | |
parent | 7bd3a36d52277a9d438538b50b97a6dcf6d25020 (diff) |
Scripts/HoS: Update Krystallus to new model (#26421)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp | 243 | ||||
-rw-r--r-- | src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h | 2 |
2 files changed, 107 insertions, 138 deletions
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp index 2d45f54ca74..d948491732e 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp @@ -49,167 +49,134 @@ enum Events EVENT_SHATTER }; -class boss_krystallus : public CreatureScript +struct boss_krystallus : public BossAI { - public: - boss_krystallus() : CreatureScript("boss_krystallus") { } + boss_krystallus(Creature* creature) : BossAI(creature, DATA_KRYSTALLUS) { } - struct boss_krystallusAI : public BossAI - { - boss_krystallusAI(Creature* creature) : BossAI(creature, DATA_KRYSTALLUS) { } + void Reset() override + { + _Reset(); + } - void Reset() override - { - _Reset(); - } + void JustEngagedWith(Unit* who) override + { + Talk(SAY_AGGRO); + BossAI::JustEngagedWith(who); - void JustEngagedWith(Unit* who) override - { - Talk(SAY_AGGRO); - BossAI::JustEngagedWith(who); - - events.ScheduleEvent(EVENT_BOULDER_TOSS, 3s, 9s); - events.ScheduleEvent(EVENT_GROUND_SLAM, 15s, 18s); - events.ScheduleEvent(EVENT_STOMP, 20s, 29s); - if (IsHeroic()) - events.ScheduleEvent(EVENT_GROUND_SPIKE, 9s, 14s); - } + events.ScheduleEvent(EVENT_BOULDER_TOSS, 3s, 9s); + events.ScheduleEvent(EVENT_GROUND_SLAM, 15s, 18s); + events.ScheduleEvent(EVENT_STOMP, 20s, 29s); + if (IsHeroic()) + events.ScheduleEvent(EVENT_GROUND_SPIKE, 9s, 14s); + } - 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()) - { - switch (eventId) - { - case EVENT_BOULDER_TOSS: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true)) - DoCast(target, SPELL_BOULDER_TOSS); - events.ScheduleEvent(EVENT_BOULDER_TOSS, 9s, 15s); - break; - case EVENT_GROUND_SPIKE: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) - DoCast(target, SPELL_GROUND_SPIKE); - events.ScheduleEvent(EVENT_GROUND_SPIKE, 12s, 17s); - break; - case EVENT_GROUND_SLAM: - DoCast(me, SPELL_GROUND_SLAM); - events.ScheduleEvent(EVENT_SHATTER, 10s); - events.ScheduleEvent(EVENT_GROUND_SLAM, 15s, 18s); - break; - case EVENT_STOMP: - DoCast(me, SPELL_STOMP); - events.ScheduleEvent(EVENT_STOMP, 20s, 29s); - break; - case EVENT_SHATTER: - DoCast(me, SPELL_SHATTER); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); - } + void UpdateAI(uint32 diff) override + { + // Return since we have no target + if (!UpdateVictim()) + return; - void JustDied(Unit* /*killer*/) override - { - Talk(SAY_DEATH); - _JustDied(); - } + events.Update(diff); - void KilledUnit(Unit* victim) override + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_KILL); + case EVENT_BOULDER_TOSS: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true)) + DoCast(target, SPELL_BOULDER_TOSS); + events.ScheduleEvent(EVENT_BOULDER_TOSS, 9s, 15s); + break; + case EVENT_GROUND_SPIKE: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) + DoCast(target, SPELL_GROUND_SPIKE); + events.ScheduleEvent(EVENT_GROUND_SPIKE, 12s, 17s); + break; + case EVENT_GROUND_SLAM: + DoCast(me, SPELL_GROUND_SLAM); + events.ScheduleEvent(EVENT_SHATTER, 10s); + events.ScheduleEvent(EVENT_GROUND_SLAM, 15s, 18s); + break; + case EVENT_STOMP: + DoCast(me, SPELL_STOMP); + events.ScheduleEvent(EVENT_STOMP, 20s, 29s); + break; + case EVENT_SHATTER: + DoCast(me, SPELL_SHATTER); + break; + default: + break; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetHallsOfStoneAI<boss_krystallusAI>(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } -}; -class spell_krystallus_shatter : public SpellScriptLoader -{ - public: - spell_krystallus_shatter() : SpellScriptLoader("spell_krystallus_shatter") { } + DoMeleeAttackIfReady(); + } - class spell_krystallus_shatter_SpellScript : public SpellScript - { - PrepareSpellScript(spell_krystallus_shatter_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - { - target->RemoveAurasDueToSpell(SPELL_STONED); - target->CastSpell(nullptr, SPELL_SHATTER_EFFECT, true); - } - } + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DEATH); + _JustDied(); + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_krystallus_shatter_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_krystallus_shatter_SpellScript(); - } + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); + } }; -class spell_krystallus_shatter_effect : public SpellScriptLoader +class spell_krystallus_shatter : public SpellScript { - public: - spell_krystallus_shatter_effect() : SpellScriptLoader("spell_krystallus_shatter_effect") { } + PrepareSpellScript(spell_krystallus_shatter); - class spell_krystallus_shatter_effect_SpellScript : public SpellScript + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Unit* target = GetHitUnit()) { - PrepareSpellScript(spell_krystallus_shatter_effect_SpellScript); - - void CalculateDamage() - { - if (!GetHitUnit()) - return; - - float radius = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster()); - if (!radius) - return; - - float distance = GetCaster()->GetDistance2d(GetHitUnit()); - if (distance > 1.0f) - SetHitDamage(int32(GetHitDamage() * ((radius - distance) / radius))); - } + target->RemoveAurasDueToSpell(SPELL_STONED); + target->CastSpell(nullptr, SPELL_SHATTER_EFFECT, true); + } + } - void Register() override - { - OnHit += SpellHitFn(spell_krystallus_shatter_effect_SpellScript::CalculateDamage); - } - }; + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_krystallus_shatter::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; - SpellScript* GetSpellScript() const override - { - return new spell_krystallus_shatter_effect_SpellScript(); - } +class spell_krystallus_shatter_effect : public SpellScript +{ + PrepareSpellScript(spell_krystallus_shatter_effect); + + void CalculateDamage() + { + if (!GetHitUnit()) + return; + + float radius = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster()); + if (!radius) + return; + + float distance = GetCaster()->GetDistance2d(GetHitUnit()); + if (distance > 1.0f) + SetHitDamage(int32(GetHitDamage() * ((radius - distance) / radius))); + } + + void Register() override + { + OnHit += SpellHitFn(spell_krystallus_shatter_effect::CalculateDamage); + } }; void AddSC_boss_krystallus() { - new boss_krystallus(); - new spell_krystallus_shatter(); - new spell_krystallus_shatter_effect(); + RegisterHallsOfStoneCreatureAI(boss_krystallus); + RegisterSpellScript(spell_krystallus_shatter); + RegisterSpellScript(spell_krystallus_shatter_effect); } diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h index 9cbf93e9866..187ece05c7a 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h @@ -75,4 +75,6 @@ inline AI* GetHallsOfStoneAI(T* obj) return GetInstanceAI<AI>(obj, HoSScriptName); } +#define RegisterHallsOfStoneCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetHallsOfStoneAI) + #endif // HALLS_OF_STONE_H_ |