mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-19 17:05:44 +01:00
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:
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user