diff options
author | offl <11556157+offl@users.noreply.github.com> | 2021-04-26 10:19:30 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-26 09:19:30 +0200 |
commit | 87ba4a76156aa45cf0de36e9d43b1fb8694778cd (patch) | |
tree | 844c810838835fc4e9b0ec159cbaa90790cbbdb0 /src | |
parent | b5cc63873d758317896e9523efe4f8fbef7c04b3 (diff) |
Scripts/POS: Update Tyrannus to new model (#26466)
Co-authored-by: offl <offl@users.noreply.github.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp | 637 |
1 files changed, 291 insertions, 346 deletions
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp index 005df69fcfd..ad6b987d52d 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp @@ -128,271 +128,249 @@ static const Position rimefangPos[10] = static Position const miscPos = { 1018.376f, 167.2495f, 628.2811f, 0.000000f }; // tyrannus combat start position -class boss_tyrannus : public CreatureScript +struct boss_tyrannus : public BossAI { - public: - boss_tyrannus() : CreatureScript("boss_tyrannus") { } - - struct boss_tyrannusAI : public BossAI + boss_tyrannus(Creature* creature) : BossAI(creature, DATA_TYRANNUS) + { + } + + void InitializeAI() override + { + if (instance->GetBossState(DATA_TYRANNUS) != DONE) + Reset(); + else + me->DespawnOrUnsummon(); + } + + void Reset() override + { + events.Reset(); + events.SetPhase(PHASE_NONE); + me->SetReactState(REACT_PASSIVE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + instance->SetBossState(DATA_TYRANNUS, NOT_STARTED); + } + + Creature* GetRimefang() + { + return ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_RIMEFANG)); + } + + void JustEngagedWith(Unit* /*who*/) override + { + Talk(SAY_AGGRO); + } + + void AttackStart(Unit* victim) override + { + if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) + return; + + if (victim && me->Attack(victim, true) && !events.IsInPhase(PHASE_INTRO)) + me->GetMotionMaster()->MoveChase(victim); + } + + void EnterEvadeMode(EvadeReason /*why*/) override + { + instance->SetBossState(DATA_TYRANNUS, FAIL); + if (Creature* rimefang = GetRimefang()) + rimefang->AI()->EnterEvadeMode(); + + me->DespawnOrUnsummon(); + } + + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DEATH); + instance->SetBossState(DATA_TYRANNUS, DONE); + + // Prevent corpse despawning + if (TempSummon* summ = me->ToTempSummon()) + summ->SetTempSummonType(TEMPSUMMON_DEAD_DESPAWN); + + // Stop combat for Rimefang + if (Creature* rimefang = GetRimefang()) + rimefang->AI()->DoAction(ACTION_END_COMBAT); + } + + void DoAction(int32 actionId) override + { + if (actionId == ACTION_START_INTRO) { - boss_tyrannusAI(Creature* creature) : BossAI(creature, DATA_TYRANNUS) - { - } - - void InitializeAI() override - { - if (instance->GetBossState(DATA_TYRANNUS) != DONE) - Reset(); - else - me->DespawnOrUnsummon(); - } - - void Reset() override - { - events.Reset(); - events.SetPhase(PHASE_NONE); - me->SetReactState(REACT_PASSIVE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - instance->SetBossState(DATA_TYRANNUS, NOT_STARTED); - } - - Creature* GetRimefang() - { - return ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_RIMEFANG)); - } - - void JustEngagedWith(Unit* /*who*/) override - { - Talk(SAY_AGGRO); - } - - void AttackStart(Unit* victim) override - { - if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) - return; - - if (victim && me->Attack(victim, true) && !events.IsInPhase(PHASE_INTRO)) - me->GetMotionMaster()->MoveChase(victim); - } - - void EnterEvadeMode(EvadeReason /*why*/) override - { - instance->SetBossState(DATA_TYRANNUS, FAIL); - if (Creature* rimefang = GetRimefang()) - rimefang->AI()->EnterEvadeMode(); - - me->DespawnOrUnsummon(); - } - - void KilledUnit(Unit* victim) override - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } - - void JustDied(Unit* /*killer*/) override - { - Talk(SAY_DEATH); - instance->SetBossState(DATA_TYRANNUS, DONE); - - // Prevent corpse despawning - if (TempSummon* summ = me->ToTempSummon()) - summ->SetTempSummonType(TEMPSUMMON_DEAD_DESPAWN); + Talk(SAY_TYRANNUS_INTRO_1); + events.SetPhase(PHASE_INTRO); + events.ScheduleEvent(EVENT_INTRO_1, 14s, 0, PHASE_INTRO); + events.ScheduleEvent(EVENT_INTRO_2, 22s, 0, PHASE_INTRO); + events.ScheduleEvent(EVENT_INTRO_3, 34s, 0, PHASE_INTRO); + events.ScheduleEvent(EVENT_COMBAT_START, 36s, 0, PHASE_INTRO); + instance->SetBossState(DATA_TYRANNUS, IN_PROGRESS); + } + } - // Stop combat for Rimefang - if (Creature* rimefang = GetRimefang()) - rimefang->AI()->DoAction(ACTION_END_COMBAT); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim() && !events.IsInPhase(PHASE_INTRO)) + return; - void DoAction(int32 actionId) override - { - if (actionId == ACTION_START_INTRO) - { - Talk(SAY_TYRANNUS_INTRO_1); - events.SetPhase(PHASE_INTRO); - events.ScheduleEvent(EVENT_INTRO_1, 14s, 0, PHASE_INTRO); - events.ScheduleEvent(EVENT_INTRO_2, 22s, 0, PHASE_INTRO); - events.ScheduleEvent(EVENT_INTRO_3, 34s, 0, PHASE_INTRO); - events.ScheduleEvent(EVENT_COMBAT_START, 36s, 0, PHASE_INTRO); - instance->SetBossState(DATA_TYRANNUS, IN_PROGRESS); - } - } + events.Update(diff); - void UpdateAI(uint32 diff) override + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - if (!UpdateVictim() && !events.IsInPhase(PHASE_INTRO)) - return; - - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + case EVENT_INTRO_1: + //Talk(SAY_GORKUN_INTRO_2, pGorkunOrVictus); + break; + case EVENT_INTRO_2: + Talk(SAY_TYRANNUS_INTRO_3); + break; + case EVENT_INTRO_3: + me->ExitVehicle(); + me->GetMotionMaster()->MovePoint(0, miscPos); + break; + case EVENT_COMBAT_START: + if (Creature* rimefang = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_RIMEFANG))) + rimefang->AI()->DoAction(ACTION_START_RIMEFANG); //set rimefang also infight + events.SetPhase(PHASE_COMBAT); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + me->SetReactState(REACT_AGGRESSIVE); + DoCast(me, SPELL_FULL_HEAL); + DoZoneInCombat(); + events.ScheduleEvent(EVENT_OVERLORD_BRAND, 5s, 7s); + events.ScheduleEvent(EVENT_FORCEFUL_SMASH, 14s, 16s); + events.ScheduleEvent(EVENT_MARK_OF_RIMEFANG, 25s, 27s); + break; + case EVENT_OVERLORD_BRAND: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true)) + DoCast(target, SPELL_OVERLORD_BRAND); + events.ScheduleEvent(EVENT_OVERLORD_BRAND, 11s, 12s); + break; + case EVENT_FORCEFUL_SMASH: + DoCastVictim(SPELL_FORCEFUL_SMASH); + events.ScheduleEvent(EVENT_UNHOLY_POWER, 1s); + break; + case EVENT_UNHOLY_POWER: + Talk(SAY_DARK_MIGHT_1); + Talk(SAY_DARK_MIGHT_2); + DoCast(me, SPELL_UNHOLY_POWER); + events.ScheduleEvent(EVENT_FORCEFUL_SMASH, 40s, 48s); + break; + case EVENT_MARK_OF_RIMEFANG: + Talk(SAY_MARK_RIMEFANG_1); + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true)) { - case EVENT_INTRO_1: - //Talk(SAY_GORKUN_INTRO_2, pGorkunOrVictus); - break; - case EVENT_INTRO_2: - Talk(SAY_TYRANNUS_INTRO_3); - break; - case EVENT_INTRO_3: - me->ExitVehicle(); - me->GetMotionMaster()->MovePoint(0, miscPos); - break; - case EVENT_COMBAT_START: - if (Creature* rimefang = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_RIMEFANG))) - rimefang->AI()->DoAction(ACTION_START_RIMEFANG); //set rimefang also infight - events.SetPhase(PHASE_COMBAT); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->SetReactState(REACT_AGGRESSIVE); - DoCast(me, SPELL_FULL_HEAL); - DoZoneInCombat(); - events.ScheduleEvent(EVENT_OVERLORD_BRAND, 5s, 7s); - events.ScheduleEvent(EVENT_FORCEFUL_SMASH, 14s, 16s); - events.ScheduleEvent(EVENT_MARK_OF_RIMEFANG, 25s, 27s); - break; - case EVENT_OVERLORD_BRAND: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true)) - DoCast(target, SPELL_OVERLORD_BRAND); - events.ScheduleEvent(EVENT_OVERLORD_BRAND, 11s, 12s); - break; - case EVENT_FORCEFUL_SMASH: - DoCastVictim(SPELL_FORCEFUL_SMASH); - events.ScheduleEvent(EVENT_UNHOLY_POWER, 1s); - break; - case EVENT_UNHOLY_POWER: - Talk(SAY_DARK_MIGHT_1); - Talk(SAY_DARK_MIGHT_2); - DoCast(me, SPELL_UNHOLY_POWER); - events.ScheduleEvent(EVENT_FORCEFUL_SMASH, 40s, 48s); - break; - case EVENT_MARK_OF_RIMEFANG: - Talk(SAY_MARK_RIMEFANG_1); - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true)) - { - Talk(SAY_MARK_RIMEFANG_2, target); - DoCast(target, SPELL_MARK_OF_RIMEFANG); - } - events.ScheduleEvent(EVENT_MARK_OF_RIMEFANG, 24s, 26s); - break; + Talk(SAY_MARK_RIMEFANG_2, target); + DoCast(target, SPELL_MARK_OF_RIMEFANG); } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); + events.ScheduleEvent(EVENT_MARK_OF_RIMEFANG, 24s, 26s); + break; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetPitOfSaronAI<boss_tyrannusAI>(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + DoMeleeAttackIfReady(); + } }; -class boss_rimefang : public CreatureScript +struct boss_rimefang : public ScriptedAI { - public: - boss_rimefang() : CreatureScript("boss_rimefang") { } - - struct boss_rimefangAI : public ScriptedAI + boss_rimefang(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } + + void Initialize() + { + _currentWaypoint = 0; + _hoarfrostTargetGUID.Clear(); + } + + void Reset() override + { + _events.Reset(); + _events.SetPhase(PHASE_NONE); + Initialize(); + me->SetCanFly(true); + me->SetReactState(REACT_PASSIVE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + } + + void JustReachedHome() override + { + if (Vehicle* _vehicle = me->GetVehicleKit()) + _vehicle->InstallAllAccessories(false); + } + + void DoAction(int32 actionId) override + { + if (actionId == ACTION_START_RIMEFANG) { - boss_rimefangAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - } + _events.SetPhase(PHASE_COMBAT); + DoZoneInCombat(); + _events.ScheduleEvent(EVENT_MOVE_NEXT, 500ms, 0, PHASE_COMBAT); + _events.ScheduleEvent(EVENT_ICY_BLAST, 15s, 0, PHASE_COMBAT); + } + else if (actionId == ACTION_END_COMBAT) + _EnterEvadeMode(); + } - void Initialize() - { - _currentWaypoint = 0; - _hoarfrostTargetGUID.Clear(); - } + void SetGUID(ObjectGuid const& guid, int32 id) override + { + if (id == GUID_HOARFROST) + { + _hoarfrostTargetGUID = guid; + _events.ScheduleEvent(EVENT_HOARFROST, 1s); + } + } - void Reset() override - { - _events.Reset(); - _events.SetPhase(PHASE_NONE); - Initialize(); - me->SetCanFly(true); - me->SetReactState(REACT_PASSIVE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim() && !_events.IsInPhase(PHASE_COMBAT)) + return; - void JustReachedHome() override - { - if (Vehicle* _vehicle = me->GetVehicleKit()) - _vehicle->InstallAllAccessories(false); - } + _events.Update(diff); - void DoAction(int32 actionId) override + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) { - if (actionId == ACTION_START_RIMEFANG) - { - _events.SetPhase(PHASE_COMBAT); - DoZoneInCombat(); - _events.ScheduleEvent(EVENT_MOVE_NEXT, 500ms, 0, PHASE_COMBAT); + case EVENT_MOVE_NEXT: + if (_currentWaypoint >= 10 || _currentWaypoint == 0) + _currentWaypoint = 1; + me->GetMotionMaster()->MovePoint(0, rimefangPos[_currentWaypoint]); + ++_currentWaypoint; + _events.ScheduleEvent(EVENT_MOVE_NEXT, 2s, 0, PHASE_COMBAT); + break; + case EVENT_ICY_BLAST: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + DoCast(target, SPELL_ICY_BLAST); _events.ScheduleEvent(EVENT_ICY_BLAST, 15s, 0, PHASE_COMBAT); - } - else if (actionId == ACTION_END_COMBAT) - _EnterEvadeMode(); - } - - void SetGUID(ObjectGuid const& guid, int32 id) override - { - if (id == GUID_HOARFROST) - { - _hoarfrostTargetGUID = guid; - _events.ScheduleEvent(EVENT_HOARFROST, 1s); - } - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim() && !_events.IsInPhase(PHASE_COMBAT)) - return; - - _events.Update(diff); - - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) + break; + case EVENT_HOARFROST: + if (Unit* target = ObjectAccessor::GetUnit(*me, _hoarfrostTargetGUID)) { - case EVENT_MOVE_NEXT: - if (_currentWaypoint >= 10 || _currentWaypoint == 0) - _currentWaypoint = 1; - me->GetMotionMaster()->MovePoint(0, rimefangPos[_currentWaypoint]); - ++_currentWaypoint; - _events.ScheduleEvent(EVENT_MOVE_NEXT, 2s, 0, PHASE_COMBAT); - break; - case EVENT_ICY_BLAST: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - DoCast(target, SPELL_ICY_BLAST); - _events.ScheduleEvent(EVENT_ICY_BLAST, 15s, 0, PHASE_COMBAT); - break; - case EVENT_HOARFROST: - if (Unit* target = ObjectAccessor::GetUnit(*me, _hoarfrostTargetGUID)) - { - DoCast(target, SPELL_HOARFROST); - _hoarfrostTargetGUID.Clear(); - } - break; - default: - break; + DoCast(target, SPELL_HOARFROST); + _hoarfrostTargetGUID.Clear(); } - } + break; + default: + break; } - - private: - ObjectGuid _hoarfrostTargetGUID; - EventMap _events; - uint8 _currentWaypoint; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetPitOfSaronAI<boss_rimefangAI>(creature); } + } + +private: + ObjectGuid _hoarfrostTargetGUID; + EventMap _events; + uint8 _currentWaypoint; }; class player_overlord_brandAI : public PlayerAI @@ -427,115 +405,82 @@ class player_overlord_brandAI : public PlayerAI ObjectGuid _tyrannusGUID; }; -class spell_tyrannus_overlord_brand : public SpellScriptLoader +class spell_tyrannus_overlord_brand : public AuraScript { - public: - spell_tyrannus_overlord_brand() : SpellScriptLoader("spell_tyrannus_overlord_brand") { } - - class spell_tyrannus_overlord_brand_AuraScript : public AuraScript - { - PrepareAuraScript(spell_tyrannus_overlord_brand_AuraScript); - - bool Load() override - { - return GetCaster() && GetCaster()->GetEntry() == NPC_TYRANNUS; - } - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTarget()->GetTypeId() != TYPEID_PLAYER) - return; - - Player* pTarget = GetTarget()->ToPlayer(); - GetTarget()->PushAI(new player_overlord_brandAI(pTarget, GetCasterGUID())); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTarget()->GetTypeId() != TYPEID_PLAYER) - return; - - GetTarget()->PopAI(); - } - - void Register() override - { - AfterEffectApply += AuraEffectApplyFn(spell_tyrannus_overlord_brand_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_tyrannus_overlord_brand_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_tyrannus_overlord_brand_AuraScript(); - } + PrepareAuraScript(spell_tyrannus_overlord_brand); + + bool Load() override + { + return GetCaster() && GetCaster()->GetEntry() == NPC_TYRANNUS; + } + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTarget()->GetTypeId() != TYPEID_PLAYER) + return; + + Player* pTarget = GetTarget()->ToPlayer(); + GetTarget()->PushAI(new player_overlord_brandAI(pTarget, GetCasterGUID())); + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTarget()->GetTypeId() != TYPEID_PLAYER) + return; + + GetTarget()->PopAI(); + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_tyrannus_overlord_brand::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_tyrannus_overlord_brand::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } }; -class spell_tyrannus_mark_of_rimefang : public SpellScriptLoader +class spell_tyrannus_mark_of_rimefang : public AuraScript { - public: - spell_tyrannus_mark_of_rimefang() : SpellScriptLoader("spell_tyrannus_mark_of_rimefang") { } - - class spell_tyrannus_mark_of_rimefang_AuraScript : public AuraScript - { - PrepareAuraScript(spell_tyrannus_mark_of_rimefang_AuraScript); - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* caster = GetCaster(); - if (!caster || caster->GetTypeId() != TYPEID_UNIT) - return; - - if (InstanceScript* instance = caster->GetInstanceScript()) - if (Creature* rimefang = ObjectAccessor::GetCreature(*caster, instance->GetGuidData(DATA_RIMEFANG))) - rimefang->AI()->SetGUID(GetTarget()->GetGUID(), GUID_HOARFROST); - } - - void Register() override - { - AfterEffectApply += AuraEffectApplyFn(spell_tyrannus_mark_of_rimefang_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_tyrannus_mark_of_rimefang_AuraScript(); - } + PrepareAuraScript(spell_tyrannus_mark_of_rimefang); + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* caster = GetCaster(); + if (!caster || caster->GetTypeId() != TYPEID_UNIT) + return; + + if (InstanceScript* instance = caster->GetInstanceScript()) + if (Creature* rimefang = ObjectAccessor::GetCreature(*caster, instance->GetGuidData(DATA_RIMEFANG))) + rimefang->AI()->SetGUID(GetTarget()->GetGUID(), GUID_HOARFROST); + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_tyrannus_mark_of_rimefang::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } }; // 69232 - Icy Blast -class spell_tyrannus_rimefang_icy_blast : public SpellScriptLoader +class spell_tyrannus_rimefang_icy_blast : public SpellScript { - public: - spell_tyrannus_rimefang_icy_blast() : SpellScriptLoader("spell_tyrannus_rimefang_icy_blast") { } - - class spell_tyrannus_rimefang_icy_blast_SpellScript : public SpellScript - { - PrepareSpellScript(spell_tyrannus_rimefang_icy_blast_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_ICY_BLAST_AURA }); - } - - void HandleTriggerMissile(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Position const* pos = GetHitDest()) - if (TempSummon* summon = GetCaster()->SummonCreature(NPC_ICY_BLAST, *pos, TEMPSUMMON_TIMED_DESPAWN, 1min)) - summon->CastSpell(summon, SPELL_ICY_BLAST_AURA, true); - } - - void Register() override - { - OnEffectHit += SpellEffectFn(spell_tyrannus_rimefang_icy_blast_SpellScript::HandleTriggerMissile, EFFECT_1, SPELL_EFFECT_TRIGGER_MISSILE); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_tyrannus_rimefang_icy_blast_SpellScript(); - } + PrepareSpellScript(spell_tyrannus_rimefang_icy_blast); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_ICY_BLAST_AURA }); + } + + void HandleTriggerMissile(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Position const* pos = GetHitDest()) + if (TempSummon* summon = GetCaster()->SummonCreature(NPC_ICY_BLAST, *pos, TEMPSUMMON_TIMED_DESPAWN, 1min)) + summon->CastSpell(summon, SPELL_ICY_BLAST_AURA, true); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_tyrannus_rimefang_icy_blast::HandleTriggerMissile, EFFECT_1, SPELL_EFFECT_TRIGGER_MISSILE); + } }; class at_tyrannus_event_starter : public AreaTriggerScript @@ -562,10 +507,10 @@ class at_tyrannus_event_starter : public AreaTriggerScript void AddSC_boss_tyrannus() { - new boss_tyrannus(); - new boss_rimefang(); - new spell_tyrannus_overlord_brand(); - new spell_tyrannus_mark_of_rimefang(); - new spell_tyrannus_rimefang_icy_blast(); + RegisterPitOfSaronCreatureAI(boss_tyrannus); + RegisterPitOfSaronCreatureAI(boss_rimefang); + RegisterSpellScript(spell_tyrannus_overlord_brand); + RegisterSpellScript(spell_tyrannus_mark_of_rimefang); + RegisterSpellScript(spell_tyrannus_rimefang_icy_blast); new at_tyrannus_event_starter(); } |