aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoroffl <11556157+offl@users.noreply.github.com>2021-04-26 10:19:30 +0300
committerGitHub <noreply@github.com>2021-04-26 09:19:30 +0200
commit87ba4a76156aa45cf0de36e9d43b1fb8694778cd (patch)
tree844c810838835fc4e9b0ec159cbaa90790cbbdb0 /src
parentb5cc63873d758317896e9523efe4f8fbef7c04b3 (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.cpp637
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();
}