Scripts/POS: Update Tyrannus to new model (#26466)

Co-authored-by: offl <offl@users.noreply.github.com>
(cherry picked from commit 87ba4a7615)
This commit is contained in:
offl
2021-04-26 10:19:30 +03:00
committed by Shauren
parent 60168e18be
commit 6dedb40aa5

View File

@@ -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") { }
boss_tyrannus(Creature* creature) : BossAI(creature, DATA_TYRANNUS)
{
}
struct boss_tyrannusAI : public BossAI
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->AddUnitFlag(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->HasUnitFlag(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->AddUnitFlag(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->HasUnitFlag(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)
{
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);
}
}
void UpdateAI(uint32 diff) override
{
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->RemoveUnitFlag(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;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetPitOfSaronAI<boss_tyrannusAI>(creature);
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);
}
}
void UpdateAI(uint32 diff) override
{
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->RemoveUnitFlag(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;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
}
DoMeleeAttackIfReady();
}
};
class boss_rimefang : public CreatureScript
struct boss_rimefang : public ScriptedAI
{
public:
boss_rimefang() : CreatureScript("boss_rimefang") { }
boss_rimefang(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
struct boss_rimefangAI : public ScriptedAI
void Initialize()
{
_currentWaypoint = 0;
_hoarfrostTargetGUID.Clear();
}
void Reset() override
{
_events.Reset();
_events.SetPhase(PHASE_NONE);
Initialize();
me->SetCanFly(true);
me->SetReactState(REACT_PASSIVE);
me->AddUnitFlag(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();
}
void Initialize()
{
_currentWaypoint = 0;
_hoarfrostTargetGUID.Clear();
}
void Reset() override
{
_events.Reset();
_events.SetPhase(PHASE_NONE);
Initialize();
me->SetCanFly(true);
me->SetReactState(REACT_PASSIVE);
me->AddUnitFlag(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)
{
_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 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)
{
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;
}
}
}
private:
ObjectGuid _hoarfrostTargetGUID;
EventMap _events;
uint8 _currentWaypoint;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetPitOfSaronAI<boss_rimefangAI>(creature);
_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 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)
{
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;
}
}
}
private:
ObjectGuid _hoarfrostTargetGUID;
EventMap _events;
uint8 _currentWaypoint;
};
class player_overlord_brandAI : public PlayerAI
@@ -429,115 +407,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") { }
PrepareAuraScript(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;
}
bool Load() override
{
return GetCaster() && GetCaster()->GetEntry() == NPC_TYRANNUS;
}
void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (GetTarget()->GetTypeId() != TYPEID_PLAYER)
return;
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()));
}
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;
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (GetTarget()->GetTypeId() != TYPEID_PLAYER)
return;
GetTarget()->PopAI();
}
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();
}
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") { }
PrepareAuraScript(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;
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);
}
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();
}
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") { }
PrepareSpellScript(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 });
}
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 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();
}
void Register() override
{
OnEffectHit += SpellEffectFn(spell_tyrannus_rimefang_icy_blast::HandleTriggerMissile, EFFECT_1, SPELL_EFFECT_TRIGGER_MISSILE);
}
};
class at_tyrannus_event_starter : public AreaTriggerScript
@@ -564,10 +509,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();
}