refactor(Scripts/Nexus): Update creature scripts to new register method (#20728)
This commit is contained in:
@@ -67,146 +67,131 @@ private:
|
|||||||
Creature* _caster;
|
Creature* _caster;
|
||||||
};
|
};
|
||||||
|
|
||||||
class boss_anomalus : public CreatureScript
|
struct boss_anomalus : public BossAI
|
||||||
{
|
{
|
||||||
public:
|
boss_anomalus(Creature* creature) : BossAI(creature, DATA_ANOMALUS_EVENT) { }
|
||||||
boss_anomalus() : CreatureScript("boss_anomalus") { }
|
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature* creature) const override
|
bool achievement;
|
||||||
|
uint16 activeRifts;
|
||||||
|
|
||||||
|
void Reset() override
|
||||||
{
|
{
|
||||||
return GetNexusAI<boss_anomalusAI>(creature);
|
BossAI::Reset();
|
||||||
|
achievement = true;
|
||||||
|
me->CastSpell(me, SPELL_CLOSE_RIFTS, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct boss_anomalusAI : public BossAI
|
uint32 GetData(uint32 data) const override
|
||||||
{
|
{
|
||||||
boss_anomalusAI(Creature* creature) : BossAI(creature, DATA_ANOMALUS_EVENT)
|
if (data == me->GetEntry())
|
||||||
{
|
return achievement;
|
||||||
}
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool achievement;
|
void SetData(uint32 type, uint32) override
|
||||||
uint16 activeRifts;
|
{
|
||||||
|
if (type == me->GetEntry())
|
||||||
void Reset() override
|
|
||||||
{
|
{
|
||||||
BossAI::Reset();
|
if (activeRifts > 0 && --activeRifts == 0 && me->HasAura(SPELL_RIFT_SHIELD))
|
||||||
achievement = true;
|
|
||||||
me->CastSpell(me, SPELL_CLOSE_RIFTS, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32 GetData(uint32 data) const override
|
|
||||||
{
|
|
||||||
if (data == me->GetEntry())
|
|
||||||
return achievement;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetData(uint32 type, uint32) override
|
|
||||||
{
|
|
||||||
if (type == me->GetEntry())
|
|
||||||
{
|
{
|
||||||
if (activeRifts > 0 && --activeRifts == 0 && me->HasAura(SPELL_RIFT_SHIELD))
|
events.DelayEvents(me->GetAura(SPELL_RIFT_SHIELD)->GetDuration() - 46000);
|
||||||
{
|
me->RemoveAura(SPELL_RIFT_SHIELD);
|
||||||
events.DelayEvents(me->GetAura(SPELL_RIFT_SHIELD)->GetDuration() - 46000);
|
me->InterruptNonMeleeSpells(false);
|
||||||
me->RemoveAura(SPELL_RIFT_SHIELD);
|
|
||||||
me->InterruptNonMeleeSpells(false);
|
|
||||||
}
|
|
||||||
achievement = false;
|
|
||||||
}
|
}
|
||||||
|
achievement = false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void JustSummoned(Creature* summon) override
|
void JustSummoned(Creature* summon) override
|
||||||
|
{
|
||||||
|
summons.Summon(summon);
|
||||||
|
activeRifts++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void JustEngagedWith(Unit* who) override
|
||||||
|
{
|
||||||
|
Talk(SAY_AGGRO);
|
||||||
|
BossAI::JustEngagedWith(who);
|
||||||
|
|
||||||
|
activeRifts = 0;
|
||||||
|
events.SetTimer(45000);
|
||||||
|
events.ScheduleEvent(EVENT_ANOMALUS_SPARK, 5s);
|
||||||
|
events.ScheduleEvent(EVENT_ANOMALUS_HEALTH, 1s);
|
||||||
|
events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15s : 25s);
|
||||||
|
if (IsHeroic())
|
||||||
|
events.ScheduleEvent(EVENT_ANOMALUS_ARCANE_ATTRACTION, 8s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JustDied(Unit* killer) override
|
||||||
|
{
|
||||||
|
Talk(SAY_DEATH);
|
||||||
|
BossAI::JustDied(killer);
|
||||||
|
me->CastSpell(me, SPELL_CLOSE_RIFTS, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateAI(uint32 diff) override
|
||||||
|
{
|
||||||
|
if (!UpdateVictim())
|
||||||
|
return;
|
||||||
|
|
||||||
|
events.Update(diff);
|
||||||
|
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (events.ExecuteEvent())
|
||||||
{
|
{
|
||||||
summons.Summon(summon);
|
case EVENT_ANOMALUS_SPARK:
|
||||||
activeRifts++;
|
me->CastSpell(me->GetVictim(), SPELL_SPARK, false);
|
||||||
}
|
|
||||||
|
|
||||||
void JustEngagedWith(Unit* who) override
|
|
||||||
{
|
|
||||||
Talk(SAY_AGGRO);
|
|
||||||
BossAI::JustEngagedWith(who);
|
|
||||||
|
|
||||||
activeRifts = 0;
|
|
||||||
events.SetTimer(45000);
|
|
||||||
events.ScheduleEvent(EVENT_ANOMALUS_SPARK, 5s);
|
events.ScheduleEvent(EVENT_ANOMALUS_SPARK, 5s);
|
||||||
events.ScheduleEvent(EVENT_ANOMALUS_HEALTH, 1s);
|
break;
|
||||||
events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15s : 25s);
|
case EVENT_ANOMALUS_HEALTH:
|
||||||
if (IsHeroic())
|
if (me->HealthBelowPct(51))
|
||||||
events.ScheduleEvent(EVENT_ANOMALUS_ARCANE_ATTRACTION, 8s);
|
|
||||||
}
|
|
||||||
|
|
||||||
void JustDied(Unit* killer) override
|
|
||||||
{
|
|
||||||
Talk(SAY_DEATH);
|
|
||||||
BossAI::JustDied(killer);
|
|
||||||
me->CastSpell(me, SPELL_CLOSE_RIFTS, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdateAI(uint32 diff) override
|
|
||||||
{
|
|
||||||
if (!UpdateVictim())
|
|
||||||
return;
|
|
||||||
|
|
||||||
events.Update(diff);
|
|
||||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (events.ExecuteEvent())
|
|
||||||
{
|
{
|
||||||
case EVENT_ANOMALUS_SPARK:
|
//First time we reach 51%, the next rift going to be empowered following timings.
|
||||||
me->CastSpell(me->GetVictim(), SPELL_SPARK, false);
|
events.CancelEvent(EVENT_ANOMALUS_SPAWN_RIFT);
|
||||||
events.ScheduleEvent(EVENT_ANOMALUS_SPARK, 5s);
|
events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED, 1s);
|
||||||
break;
|
break;
|
||||||
case EVENT_ANOMALUS_HEALTH:
|
|
||||||
if (me->HealthBelowPct(51))
|
|
||||||
{
|
|
||||||
//First time we reach 51%, the next rift going to be empowered following timings.
|
|
||||||
events.CancelEvent(EVENT_ANOMALUS_SPAWN_RIFT);
|
|
||||||
events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED, 1s);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
events.ScheduleEvent(EVENT_ANOMALUS_HEALTH, 1s);
|
|
||||||
break;
|
|
||||||
case EVENT_ANOMALUS_ARCANE_ATTRACTION:
|
|
||||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true))
|
|
||||||
me->CastSpell(target, SPELL_ARCANE_ATTRACTION, false);
|
|
||||||
events.ScheduleEvent(EVENT_ANOMALUS_ARCANE_ATTRACTION, 15s);
|
|
||||||
break;
|
|
||||||
case EVENT_ANOMALUS_SPAWN_RIFT:
|
|
||||||
Talk(SAY_RIFT);
|
|
||||||
Talk(EMOTE_RIFT);
|
|
||||||
me->CastSpell(me, SPELL_CREATE_RIFT, false);
|
|
||||||
//Once we hit 51% hp mark, after each rift we spawn an empowered
|
|
||||||
events.ScheduleEvent(me->HealthBelowPct(51) ? EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED : EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15000 : 25000);
|
|
||||||
break;
|
|
||||||
case EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED:
|
|
||||||
Talk(SAY_RIFT);
|
|
||||||
Talk(EMOTE_RIFT);
|
|
||||||
|
|
||||||
me->CastSpell(me, SPELL_CREATE_RIFT, false);
|
|
||||||
me->CastSpell(me, SPELL_RIFT_SHIELD, true);
|
|
||||||
me->m_Events.AddEvent(new ChargeRifts(me), me->m_Events.CalculateTime(1000));
|
|
||||||
events.DelayEvents(46s);
|
|
||||||
//As we just spawned an empowered spawn a normal one
|
|
||||||
events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15s : 25s);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
events.ScheduleEvent(EVENT_ANOMALUS_HEALTH, 1s);
|
||||||
|
break;
|
||||||
|
case EVENT_ANOMALUS_ARCANE_ATTRACTION:
|
||||||
|
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true))
|
||||||
|
me->CastSpell(target, SPELL_ARCANE_ATTRACTION, false);
|
||||||
|
events.ScheduleEvent(EVENT_ANOMALUS_ARCANE_ATTRACTION, 15s);
|
||||||
|
break;
|
||||||
|
case EVENT_ANOMALUS_SPAWN_RIFT:
|
||||||
|
Talk(SAY_RIFT);
|
||||||
|
Talk(EMOTE_RIFT);
|
||||||
|
me->CastSpell(me, SPELL_CREATE_RIFT, false);
|
||||||
|
//Once we hit 51% hp mark, after each rift we spawn an empowered
|
||||||
|
events.ScheduleEvent(me->HealthBelowPct(51) ? EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED : EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15000 : 25000);
|
||||||
|
break;
|
||||||
|
case EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED:
|
||||||
|
Talk(SAY_RIFT);
|
||||||
|
Talk(EMOTE_RIFT);
|
||||||
|
|
||||||
DoMeleeAttackIfReady();
|
me->CastSpell(me, SPELL_CREATE_RIFT, false);
|
||||||
|
me->CastSpell(me, SPELL_RIFT_SHIELD, true);
|
||||||
|
me->m_Events.AddEvent(new ChargeRifts(me), me->m_Events.CalculateTime(1000));
|
||||||
|
events.DelayEvents(46s);
|
||||||
|
//As we just spawned an empowered spawn a normal one
|
||||||
|
events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15s : 25s);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CheckEvadeIfOutOfCombatArea() const override
|
DoMeleeAttackIfReady();
|
||||||
{
|
}
|
||||||
return me->GetHomePosition().GetExactDist2d(me) > 60.0f;
|
|
||||||
}
|
bool CheckEvadeIfOutOfCombatArea() const override
|
||||||
};
|
{
|
||||||
|
return me->GetHomePosition().GetExactDist2d(me) > 60.0f;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class achievement_chaos_theory : public AchievementCriteriaScript
|
class achievement_chaos_theory : public AchievementCriteriaScript
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
achievement_chaos_theory() : AchievementCriteriaScript("achievement_chaos_theory")
|
achievement_chaos_theory() : AchievementCriteriaScript("achievement_chaos_theory") { }
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override
|
bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override
|
||||||
{
|
{
|
||||||
@@ -219,6 +204,6 @@ public:
|
|||||||
|
|
||||||
void AddSC_boss_anomalus()
|
void AddSC_boss_anomalus()
|
||||||
{
|
{
|
||||||
new boss_anomalus();
|
RegisterNexusCreatureAI(boss_anomalus);
|
||||||
new achievement_chaos_theory();
|
new achievement_chaos_theory();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,90 +43,77 @@ enum Says
|
|||||||
SAY_KILL = 2
|
SAY_KILL = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
class boss_commander_stoutbeard : public CreatureScript
|
struct boss_commander_stoutbeard : public BossAI
|
||||||
{
|
{
|
||||||
public:
|
boss_commander_stoutbeard(Creature* creature) : BossAI(creature, DATA_COMMANDER_EVENT) {}
|
||||||
boss_commander_stoutbeard() : CreatureScript("boss_commander_stoutbeard") { }
|
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature* creature) const override
|
void Reset() override
|
||||||
{
|
{
|
||||||
return GetNexusAI<boss_commander_stoutbeardAI>(creature);
|
BossAI::Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
struct boss_commander_stoutbeardAI : public BossAI
|
void JustEngagedWith(Unit* who) override
|
||||||
{
|
{
|
||||||
boss_commander_stoutbeardAI(Creature* creature) : BossAI(creature, DATA_COMMANDER_EVENT)
|
BossAI::JustEngagedWith(who);
|
||||||
|
Talk(SAY_AGGRO);
|
||||||
|
|
||||||
|
events.ScheduleEvent(EVENT_BATTLE_SHOUT, 0ms);
|
||||||
|
events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 10s);
|
||||||
|
events.ScheduleEvent(EVENT_WHIRLWIND, 15s);
|
||||||
|
events.ScheduleEvent(EVENT_COMMANDER_CHARGE, 1s);
|
||||||
|
me->RemoveAllAuras();
|
||||||
|
}
|
||||||
|
|
||||||
|
void KilledUnit(Unit*) override
|
||||||
|
{
|
||||||
|
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||||
{
|
{
|
||||||
|
Talk(SAY_KILL);
|
||||||
|
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JustDied(Unit* killer) override
|
||||||
|
{
|
||||||
|
BossAI::JustDied(killer);
|
||||||
|
Talk(SAY_DEATH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateAI(uint32 diff) override
|
||||||
|
{
|
||||||
|
if (!UpdateVictim())
|
||||||
|
return;
|
||||||
|
|
||||||
|
events.Update(diff);
|
||||||
|
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (events.ExecuteEvent())
|
||||||
|
{
|
||||||
|
case EVENT_BATTLE_SHOUT:
|
||||||
|
me->CastSpell(me, SPELL_BATTLE_SHOUT, true);
|
||||||
|
events.ScheduleEvent(EVENT_BATTLE_SHOUT, 2min);
|
||||||
|
break;
|
||||||
|
case EVENT_FRIGHTENING_SHOUT:
|
||||||
|
me->CastSpell(me->GetVictim(), SPELL_FRIGHTENING_SHOUT, false);
|
||||||
|
events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 15s, 20s);
|
||||||
|
break;
|
||||||
|
case EVENT_WHIRLWIND:
|
||||||
|
me->CastSpell(me, SPELL_WHIRLWIND, false);
|
||||||
|
events.ScheduleEvent(EVENT_WHIRLWIND, 16s);
|
||||||
|
break;
|
||||||
|
case EVENT_COMMANDER_CHARGE:
|
||||||
|
if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, 25.0f))
|
||||||
|
me->CastSpell(target, SPELL_CHARGE, false);
|
||||||
|
events.ScheduleEvent(EVENT_COMMANDER_CHARGE, 20s);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Reset() override
|
DoMeleeAttackIfReady();
|
||||||
{
|
}
|
||||||
BossAI::Reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
void JustEngagedWith(Unit* who) override
|
|
||||||
{
|
|
||||||
BossAI::JustEngagedWith(who);
|
|
||||||
Talk(SAY_AGGRO);
|
|
||||||
|
|
||||||
events.ScheduleEvent(EVENT_BATTLE_SHOUT, 0ms);
|
|
||||||
events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 10s);
|
|
||||||
events.ScheduleEvent(EVENT_WHIRLWIND, 15s);
|
|
||||||
events.ScheduleEvent(EVENT_COMMANDER_CHARGE, 1s);
|
|
||||||
me->RemoveAllAuras();
|
|
||||||
}
|
|
||||||
|
|
||||||
void KilledUnit(Unit*) override
|
|
||||||
{
|
|
||||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
|
||||||
{
|
|
||||||
Talk(SAY_KILL);
|
|
||||||
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void JustDied(Unit* killer) override
|
|
||||||
{
|
|
||||||
BossAI::JustDied(killer);
|
|
||||||
Talk(SAY_DEATH);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdateAI(uint32 diff) override
|
|
||||||
{
|
|
||||||
if (!UpdateVictim())
|
|
||||||
return;
|
|
||||||
|
|
||||||
events.Update(diff);
|
|
||||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (events.ExecuteEvent())
|
|
||||||
{
|
|
||||||
case EVENT_BATTLE_SHOUT:
|
|
||||||
me->CastSpell(me, SPELL_BATTLE_SHOUT, true);
|
|
||||||
events.ScheduleEvent(EVENT_BATTLE_SHOUT, 2min);
|
|
||||||
break;
|
|
||||||
case EVENT_FRIGHTENING_SHOUT:
|
|
||||||
me->CastSpell(me->GetVictim(), SPELL_FRIGHTENING_SHOUT, false);
|
|
||||||
events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 15s, 20s);
|
|
||||||
break;
|
|
||||||
case EVENT_WHIRLWIND:
|
|
||||||
me->CastSpell(me, SPELL_WHIRLWIND, false);
|
|
||||||
events.ScheduleEvent(EVENT_WHIRLWIND, 16s);
|
|
||||||
break;
|
|
||||||
case EVENT_COMMANDER_CHARGE:
|
|
||||||
if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, 25.0f))
|
|
||||||
me->CastSpell(target, SPELL_CHARGE, false);
|
|
||||||
events.ScheduleEvent(EVENT_COMMANDER_CHARGE, 20s);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
DoMeleeAttackIfReady();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void AddSC_boss_commander_stoutbeard()
|
void AddSC_boss_commander_stoutbeard()
|
||||||
{
|
{
|
||||||
new boss_commander_stoutbeard();
|
RegisterNexusCreatureAI(boss_commander_stoutbeard);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,152 +55,137 @@ enum Events
|
|||||||
EVENT_KILL_TALK = 6
|
EVENT_KILL_TALK = 6
|
||||||
};
|
};
|
||||||
|
|
||||||
class boss_keristrasza : public CreatureScript
|
struct boss_keristrasza : public BossAI
|
||||||
{
|
{
|
||||||
public:
|
boss_keristrasza(Creature* creature) : BossAI(creature, DATA_KERISTRASZA_EVENT) {}
|
||||||
boss_keristrasza() : CreatureScript("boss_keristrasza") { }
|
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature* creature) const override
|
std::set<uint32> aGuids;
|
||||||
|
|
||||||
|
void Reset() override
|
||||||
{
|
{
|
||||||
return GetNexusAI<boss_keristraszaAI>(creature);
|
BossAI::Reset();
|
||||||
|
RemovePrison(CanRemovePrison());
|
||||||
|
aGuids.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
struct boss_keristraszaAI : public BossAI
|
void JustEngagedWith(Unit* who) override
|
||||||
{
|
{
|
||||||
boss_keristraszaAI(Creature* creature) : BossAI(creature, DATA_KERISTRASZA_EVENT)
|
Talk(SAY_AGGRO);
|
||||||
|
BossAI::JustEngagedWith(who);
|
||||||
|
|
||||||
|
me->CastSpell(me, SPELL_INTENSE_COLD, true);
|
||||||
|
events.ScheduleEvent(EVENT_CRYSTALFIRE_BREATH, 14s);
|
||||||
|
events.ScheduleEvent(EVENT_CRYSTAL_CHAINS, DUNGEON_MODE(20000, 11000));
|
||||||
|
events.ScheduleEvent(EVENT_TAIL_SWEEP, 5s);
|
||||||
|
events.ScheduleEvent(EVENT_HEALTH_CHECK, 1s);
|
||||||
|
events.ScheduleEvent(EVENT_ACHIEVEMENT_CHECK, 1s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JustDied(Unit* killer) override
|
||||||
|
{
|
||||||
|
Talk(SAY_DEATH);
|
||||||
|
BossAI::JustDied(killer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void KilledUnit(Unit*) override
|
||||||
|
{
|
||||||
|
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||||
{
|
{
|
||||||
|
Talk(SAY_SLAY);
|
||||||
|
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
std::set<uint32> aGuids;
|
void SetData(uint32 type, uint32) override
|
||||||
|
{
|
||||||
|
if (type == me->GetEntry() && CanRemovePrison())
|
||||||
|
RemovePrison(true);
|
||||||
|
}
|
||||||
|
|
||||||
void Reset() override
|
bool CanRemovePrison()
|
||||||
|
{
|
||||||
|
for (uint8 i = DATA_TELESTRA_ORB; i <= DATA_ORMOROK_ORB; ++i)
|
||||||
|
if (instance->GetBossState(i) != DONE)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RemovePrison(bool remove)
|
||||||
|
{
|
||||||
|
if (remove)
|
||||||
{
|
{
|
||||||
BossAI::Reset();
|
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
|
||||||
RemovePrison(CanRemovePrison());
|
me->RemoveAurasDueToSpell(SPELL_FROZEN_PRISON);
|
||||||
aGuids.clear();
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
void JustEngagedWith(Unit* who) override
|
|
||||||
{
|
{
|
||||||
Talk(SAY_AGGRO);
|
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
|
||||||
BossAI::JustEngagedWith(who);
|
me->CastSpell(me, SPELL_FROZEN_PRISON, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
me->CastSpell(me, SPELL_INTENSE_COLD, true);
|
uint32 GetData(uint32 guid) const override
|
||||||
events.ScheduleEvent(EVENT_CRYSTALFIRE_BREATH, 14s);
|
{
|
||||||
events.ScheduleEvent(EVENT_CRYSTAL_CHAINS, DUNGEON_MODE(20000, 11000));
|
return aGuids.find(guid) == aGuids.end();
|
||||||
events.ScheduleEvent(EVENT_TAIL_SWEEP, 5s);
|
}
|
||||||
|
|
||||||
|
void UpdateAI(uint32 diff) override
|
||||||
|
{
|
||||||
|
if (!UpdateVictim())
|
||||||
|
return;
|
||||||
|
|
||||||
|
events.Update(diff);
|
||||||
|
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (events.ExecuteEvent())
|
||||||
|
{
|
||||||
|
case EVENT_HEALTH_CHECK:
|
||||||
|
if (me->HealthBelowPct(26))
|
||||||
|
{
|
||||||
|
Talk(SAY_ENRAGE);
|
||||||
|
Talk(EMOTE_FRENZY);
|
||||||
|
me->CastSpell(me, SPELL_ENRAGE, true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
events.ScheduleEvent(EVENT_HEALTH_CHECK, 1s);
|
events.ScheduleEvent(EVENT_HEALTH_CHECK, 1s);
|
||||||
events.ScheduleEvent(EVENT_ACHIEVEMENT_CHECK, 1s);
|
break;
|
||||||
}
|
case EVENT_ACHIEVEMENT_CHECK:
|
||||||
|
|
||||||
void JustDied(Unit* killer) override
|
|
||||||
{
|
{
|
||||||
Talk(SAY_DEATH);
|
Map::PlayerList const& pList = me->GetMap()->GetPlayers();
|
||||||
BossAI::JustDied(killer);
|
for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr)
|
||||||
|
if (Aura* aur = itr->GetSource()->GetAura(SPELL_INTENSE_COLD_TRIGGER))
|
||||||
|
if (aur->GetStackAmount() > 2)
|
||||||
|
aGuids.insert(itr->GetSource()->GetGUID().GetCounter());
|
||||||
|
events.ScheduleEvent(EVENT_ACHIEVEMENT_CHECK, 500ms);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EVENT_CRYSTALFIRE_BREATH:
|
||||||
|
me->CastSpell(me->GetVictim(), SPELL_CRYSTALFIRE_BREATH, false);
|
||||||
|
events.ScheduleEvent(EVENT_CRYSTALFIRE_BREATH, 14s);
|
||||||
|
break;
|
||||||
|
case EVENT_TAIL_SWEEP:
|
||||||
|
me->CastSpell(me, SPELL_TAIL_SWEEP, false);
|
||||||
|
events.ScheduleEvent(EVENT_TAIL_SWEEP, 5s);
|
||||||
|
break;
|
||||||
|
case EVENT_CRYSTAL_CHAINS:
|
||||||
|
Talk(SAY_CRYSTAL_NOVA);
|
||||||
|
if (IsHeroic())
|
||||||
|
me->CastSpell(me, SPELL_CRYSTALIZE, false);
|
||||||
|
else if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
|
||||||
|
me->CastSpell(target, SPELL_CRYSTAL_CHAINS, false);
|
||||||
|
events.ScheduleEvent(EVENT_CRYSTAL_CHAINS, DUNGEON_MODE(20000, 11000));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KilledUnit(Unit*) override
|
DoMeleeAttackIfReady();
|
||||||
{
|
}
|
||||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
|
||||||
{
|
|
||||||
Talk(SAY_SLAY);
|
|
||||||
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetData(uint32 type, uint32) override
|
|
||||||
{
|
|
||||||
if (type == me->GetEntry() && CanRemovePrison())
|
|
||||||
RemovePrison(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CanRemovePrison()
|
|
||||||
{
|
|
||||||
for (uint8 i = DATA_TELESTRA_ORB; i <= DATA_ORMOROK_ORB; ++i)
|
|
||||||
if (instance->GetBossState(i) != DONE)
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RemovePrison(bool remove)
|
|
||||||
{
|
|
||||||
if (remove)
|
|
||||||
{
|
|
||||||
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
|
|
||||||
me->RemoveAurasDueToSpell(SPELL_FROZEN_PRISON);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
|
|
||||||
me->CastSpell(me, SPELL_FROZEN_PRISON, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32 GetData(uint32 guid) const override
|
|
||||||
{
|
|
||||||
return aGuids.find(guid) == aGuids.end();
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdateAI(uint32 diff) override
|
|
||||||
{
|
|
||||||
if (!UpdateVictim())
|
|
||||||
return;
|
|
||||||
|
|
||||||
events.Update(diff);
|
|
||||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (events.ExecuteEvent())
|
|
||||||
{
|
|
||||||
case EVENT_HEALTH_CHECK:
|
|
||||||
if (me->HealthBelowPct(26))
|
|
||||||
{
|
|
||||||
Talk(SAY_ENRAGE);
|
|
||||||
Talk(EMOTE_FRENZY);
|
|
||||||
me->CastSpell(me, SPELL_ENRAGE, true);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
events.ScheduleEvent(EVENT_HEALTH_CHECK, 1s);
|
|
||||||
break;
|
|
||||||
case EVENT_ACHIEVEMENT_CHECK:
|
|
||||||
{
|
|
||||||
Map::PlayerList const& pList = me->GetMap()->GetPlayers();
|
|
||||||
for(Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr)
|
|
||||||
if (Aura* aur = itr->GetSource()->GetAura(SPELL_INTENSE_COLD_TRIGGER))
|
|
||||||
if (aur->GetStackAmount() > 2)
|
|
||||||
aGuids.insert(itr->GetSource()->GetGUID().GetCounter());
|
|
||||||
events.ScheduleEvent(EVENT_ACHIEVEMENT_CHECK, 500ms);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case EVENT_CRYSTALFIRE_BREATH:
|
|
||||||
me->CastSpell(me->GetVictim(), SPELL_CRYSTALFIRE_BREATH, false);
|
|
||||||
events.ScheduleEvent(EVENT_CRYSTALFIRE_BREATH, 14s);
|
|
||||||
break;
|
|
||||||
case EVENT_TAIL_SWEEP:
|
|
||||||
me->CastSpell(me, SPELL_TAIL_SWEEP, false);
|
|
||||||
events.ScheduleEvent(EVENT_TAIL_SWEEP, 5s);
|
|
||||||
break;
|
|
||||||
case EVENT_CRYSTAL_CHAINS:
|
|
||||||
Talk(SAY_CRYSTAL_NOVA);
|
|
||||||
if (IsHeroic())
|
|
||||||
me->CastSpell(me, SPELL_CRYSTALIZE, false);
|
|
||||||
else if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
|
|
||||||
me->CastSpell(target, SPELL_CRYSTAL_CHAINS, false);
|
|
||||||
events.ScheduleEvent(EVENT_CRYSTAL_CHAINS, DUNGEON_MODE(20000, 11000));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
DoMeleeAttackIfReady();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class achievement_intense_cold : public AchievementCriteriaScript
|
class achievement_intense_cold : public AchievementCriteriaScript
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
achievement_intense_cold() : AchievementCriteriaScript("achievement_intense_cold")
|
achievement_intense_cold() : AchievementCriteriaScript("achievement_intense_cold") { }
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool OnCheck(Player* player, Unit* target, uint32 /*criteria_id*/) override
|
bool OnCheck(Player* player, Unit* target, uint32 /*criteria_id*/) override
|
||||||
{
|
{
|
||||||
@@ -213,6 +198,6 @@ public:
|
|||||||
|
|
||||||
void AddSC_boss_keristrasza()
|
void AddSC_boss_keristrasza()
|
||||||
{
|
{
|
||||||
new boss_keristrasza();
|
RegisterNexusCreatureAI(boss_keristrasza);
|
||||||
new achievement_intense_cold();
|
new achievement_intense_cold();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,159 +79,146 @@ enum Events
|
|||||||
EVENT_KILL_TALK = 9
|
EVENT_KILL_TALK = 9
|
||||||
};
|
};
|
||||||
|
|
||||||
class boss_magus_telestra : public CreatureScript
|
struct boss_magus_telestra : public BossAI
|
||||||
{
|
{
|
||||||
public:
|
boss_magus_telestra(Creature* creature) : BossAI(creature, DATA_MAGUS_TELESTRA_EVENT) { }
|
||||||
boss_magus_telestra() : CreatureScript("boss_magus_telestra") { }
|
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature* creature) const override
|
uint8 copiesDied;
|
||||||
|
bool achievement;
|
||||||
|
|
||||||
|
void Reset() override
|
||||||
{
|
{
|
||||||
return GetNexusAI<boss_magus_telestraAI>(creature);
|
BossAI::Reset();
|
||||||
|
copiesDied = 0;
|
||||||
|
achievement = true;
|
||||||
|
|
||||||
|
if (IsHeroic() && sGameEventMgr->IsActiveEvent(GAME_EVENT_WINTER_VEIL) && !me->HasAura(SPELL_WEAR_CHRISTMAS_HAT))
|
||||||
|
me->AddAura(SPELL_WEAR_CHRISTMAS_HAT, me);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct boss_magus_telestraAI : public BossAI
|
uint32 GetData(uint32 data) const override
|
||||||
{
|
{
|
||||||
boss_magus_telestraAI(Creature* creature) : BossAI(creature, DATA_MAGUS_TELESTRA_EVENT)
|
if (data == me->GetEntry())
|
||||||
|
return achievement;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void JustEngagedWith(Unit* who) override
|
||||||
|
{
|
||||||
|
BossAI::JustEngagedWith(who);
|
||||||
|
Talk(SAY_AGGRO);
|
||||||
|
|
||||||
|
events.ScheduleEvent(EVENT_MAGUS_ICE_NOVA, 10s);
|
||||||
|
events.ScheduleEvent(EVENT_MAGUS_FIREBOMB, 0ms);
|
||||||
|
events.ScheduleEvent(EVENT_MAGUS_GRAVITY_WELL, 20s);
|
||||||
|
events.ScheduleEvent(EVENT_MAGUS_HEALTH1, 1s);
|
||||||
|
if (IsHeroic())
|
||||||
|
events.ScheduleEvent(EVENT_MAGUS_HEALTH2, 1s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AttackStart(Unit* who) override
|
||||||
|
{
|
||||||
|
if (who && me->Attack(who, true))
|
||||||
|
me->GetMotionMaster()->MoveChase(who, 20.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JustDied(Unit* killer) override
|
||||||
|
{
|
||||||
|
BossAI::JustDied(killer);
|
||||||
|
Talk(SAY_DEATH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void KilledUnit(Unit*) override
|
||||||
|
{
|
||||||
|
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||||
{
|
{
|
||||||
|
Talk(SAY_KILL);
|
||||||
|
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
uint8 copiesDied;
|
void JustSummoned(Creature* summon) override
|
||||||
bool achievement;
|
{
|
||||||
|
summons.Summon(summon);
|
||||||
|
summon->SetInCombatWithZone();
|
||||||
|
}
|
||||||
|
|
||||||
void Reset() override
|
void SpellHit(Unit* caster, SpellInfo const* spellInfo) override
|
||||||
|
{
|
||||||
|
if (spellInfo->Id >= SPELL_FIRE_MAGUS_DEATH && spellInfo->Id <= SPELL_ARCANE_MAGUS_DEATH && caster->ToCreature())
|
||||||
{
|
{
|
||||||
BossAI::Reset();
|
events.ScheduleEvent(EVENT_MAGUS_FAIL_ACHIEVEMENT, 5s);
|
||||||
copiesDied = 0;
|
caster->ToCreature()->DespawnOrUnsummon(1000);
|
||||||
achievement = true;
|
|
||||||
|
|
||||||
if (IsHeroic() && sGameEventMgr->IsActiveEvent(GAME_EVENT_WINTER_VEIL) && !me->HasAura(SPELL_WEAR_CHRISTMAS_HAT))
|
if (++copiesDied >= 3)
|
||||||
me->AddAura(SPELL_WEAR_CHRISTMAS_HAT, me);
|
{
|
||||||
|
copiesDied = 0;
|
||||||
|
events.CancelEvent(EVENT_MAGUS_FAIL_ACHIEVEMENT);
|
||||||
|
events.ScheduleEvent(EVENT_MAGUS_MERGED, 5s);
|
||||||
|
me->CastSpell(me, SPELL_BURNING_WINDS, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
uint32 GetData(uint32 data) const override
|
void UpdateAI(uint32 diff) override
|
||||||
|
{
|
||||||
|
if (!UpdateVictim())
|
||||||
|
return;
|
||||||
|
|
||||||
|
events.Update(diff);
|
||||||
|
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (events.ExecuteEvent())
|
||||||
{
|
{
|
||||||
if (data == me->GetEntry())
|
case EVENT_MAGUS_HEALTH1:
|
||||||
return achievement;
|
if (me->HealthBelowPct(51))
|
||||||
return 0;
|
{
|
||||||
}
|
me->CastSpell(me, SPELL_START_SUMMON_CLONES, false);
|
||||||
|
events.ScheduleEvent(EVENT_MAGUS_RELOCATE, 3500ms);
|
||||||
void JustEngagedWith(Unit* who) override
|
Talk(SAY_SPLIT);
|
||||||
{
|
break;
|
||||||
BossAI::JustEngagedWith(who);
|
}
|
||||||
Talk(SAY_AGGRO);
|
|
||||||
|
|
||||||
events.ScheduleEvent(EVENT_MAGUS_ICE_NOVA, 10s);
|
|
||||||
events.ScheduleEvent(EVENT_MAGUS_FIREBOMB, 0ms);
|
|
||||||
events.ScheduleEvent(EVENT_MAGUS_GRAVITY_WELL, 20s);
|
|
||||||
events.ScheduleEvent(EVENT_MAGUS_HEALTH1, 1s);
|
events.ScheduleEvent(EVENT_MAGUS_HEALTH1, 1s);
|
||||||
if (IsHeroic())
|
break;
|
||||||
events.ScheduleEvent(EVENT_MAGUS_HEALTH2, 1s);
|
case EVENT_MAGUS_HEALTH2:
|
||||||
}
|
if (me->HealthBelowPct(11))
|
||||||
|
|
||||||
void AttackStart(Unit* who) override
|
|
||||||
{
|
|
||||||
if (who && me->Attack(who, true))
|
|
||||||
me->GetMotionMaster()->MoveChase(who, 20.0f);
|
|
||||||
}
|
|
||||||
|
|
||||||
void JustDied(Unit* killer) override
|
|
||||||
{
|
|
||||||
BossAI::JustDied(killer);
|
|
||||||
Talk(SAY_DEATH);
|
|
||||||
}
|
|
||||||
|
|
||||||
void KilledUnit(Unit*) override
|
|
||||||
{
|
|
||||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
|
||||||
{
|
{
|
||||||
Talk(SAY_KILL);
|
me->CastSpell(me, SPELL_START_SUMMON_CLONES, false);
|
||||||
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
|
events.ScheduleEvent(EVENT_MAGUS_RELOCATE, 3500ms);
|
||||||
|
Talk(SAY_SPLIT);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
events.ScheduleEvent(EVENT_MAGUS_HEALTH2, 1s);
|
||||||
|
break;
|
||||||
|
case EVENT_MAGUS_FIREBOMB:
|
||||||
|
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||||
|
me->CastSpell(target, SPELL_FIREBOMB, false);
|
||||||
|
events.ScheduleEvent(EVENT_MAGUS_FIREBOMB, 3s);
|
||||||
|
break;
|
||||||
|
case EVENT_MAGUS_ICE_NOVA:
|
||||||
|
me->CastSpell(me, SPELL_ICE_NOVA, false);
|
||||||
|
events.ScheduleEvent(EVENT_MAGUS_ICE_NOVA, 15s);
|
||||||
|
break;
|
||||||
|
case EVENT_MAGUS_GRAVITY_WELL:
|
||||||
|
me->CastSpell(me, SPELL_GRAVITY_WELL, false);
|
||||||
|
events.ScheduleEvent(EVENT_MAGUS_GRAVITY_WELL, 15s);
|
||||||
|
break;
|
||||||
|
case EVENT_MAGUS_FAIL_ACHIEVEMENT:
|
||||||
|
achievement = false;
|
||||||
|
break;
|
||||||
|
case EVENT_MAGUS_RELOCATE:
|
||||||
|
me->NearTeleportTo(505.04f, 88.915f, -16.13f, 2.98f);
|
||||||
|
break;
|
||||||
|
case EVENT_MAGUS_MERGED:
|
||||||
|
me->CastSpell(me, SPELL_TELESTRA_BACK, true);
|
||||||
|
me->RemoveAllAuras();
|
||||||
|
Talk(SAY_MERGE);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
void JustSummoned(Creature* summon) override
|
DoMeleeAttackIfReady();
|
||||||
{
|
}
|
||||||
summons.Summon(summon);
|
|
||||||
summon->SetInCombatWithZone();
|
|
||||||
}
|
|
||||||
|
|
||||||
void SpellHit(Unit* caster, SpellInfo const* spellInfo) override
|
|
||||||
{
|
|
||||||
if (spellInfo->Id >= SPELL_FIRE_MAGUS_DEATH && spellInfo->Id <= SPELL_ARCANE_MAGUS_DEATH && caster->ToCreature())
|
|
||||||
{
|
|
||||||
events.ScheduleEvent(EVENT_MAGUS_FAIL_ACHIEVEMENT, 5s);
|
|
||||||
caster->ToCreature()->DespawnOrUnsummon(1000);
|
|
||||||
|
|
||||||
if (++copiesDied >= 3)
|
|
||||||
{
|
|
||||||
copiesDied = 0;
|
|
||||||
events.CancelEvent(EVENT_MAGUS_FAIL_ACHIEVEMENT);
|
|
||||||
events.ScheduleEvent(EVENT_MAGUS_MERGED, 5s);
|
|
||||||
me->CastSpell(me, SPELL_BURNING_WINDS, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdateAI(uint32 diff) override
|
|
||||||
{
|
|
||||||
if (!UpdateVictim())
|
|
||||||
return;
|
|
||||||
|
|
||||||
events.Update(diff);
|
|
||||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (events.ExecuteEvent())
|
|
||||||
{
|
|
||||||
case EVENT_MAGUS_HEALTH1:
|
|
||||||
if (me->HealthBelowPct(51))
|
|
||||||
{
|
|
||||||
me->CastSpell(me, SPELL_START_SUMMON_CLONES, false);
|
|
||||||
events.ScheduleEvent(EVENT_MAGUS_RELOCATE, 3500ms);
|
|
||||||
Talk(SAY_SPLIT);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
events.ScheduleEvent(EVENT_MAGUS_HEALTH1, 1s);
|
|
||||||
break;
|
|
||||||
case EVENT_MAGUS_HEALTH2:
|
|
||||||
if (me->HealthBelowPct(11))
|
|
||||||
{
|
|
||||||
me->CastSpell(me, SPELL_START_SUMMON_CLONES, false);
|
|
||||||
events.ScheduleEvent(EVENT_MAGUS_RELOCATE, 3500ms);
|
|
||||||
Talk(SAY_SPLIT);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
events.ScheduleEvent(EVENT_MAGUS_HEALTH2, 1s);
|
|
||||||
break;
|
|
||||||
case EVENT_MAGUS_FIREBOMB:
|
|
||||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
|
||||||
me->CastSpell(target, SPELL_FIREBOMB, false);
|
|
||||||
events.ScheduleEvent(EVENT_MAGUS_FIREBOMB, 3s);
|
|
||||||
break;
|
|
||||||
case EVENT_MAGUS_ICE_NOVA:
|
|
||||||
me->CastSpell(me, SPELL_ICE_NOVA, false);
|
|
||||||
events.ScheduleEvent(EVENT_MAGUS_ICE_NOVA, 15s);
|
|
||||||
break;
|
|
||||||
case EVENT_MAGUS_GRAVITY_WELL:
|
|
||||||
me->CastSpell(me, SPELL_GRAVITY_WELL, false);
|
|
||||||
events.ScheduleEvent(EVENT_MAGUS_GRAVITY_WELL, 15s);
|
|
||||||
break;
|
|
||||||
case EVENT_MAGUS_FAIL_ACHIEVEMENT:
|
|
||||||
achievement = false;
|
|
||||||
break;
|
|
||||||
case EVENT_MAGUS_RELOCATE:
|
|
||||||
me->NearTeleportTo(505.04f, 88.915f, -16.13f, 2.98f);
|
|
||||||
break;
|
|
||||||
case EVENT_MAGUS_MERGED:
|
|
||||||
me->CastSpell(me, SPELL_TELESTRA_BACK, true);
|
|
||||||
me->RemoveAllAuras();
|
|
||||||
Talk(SAY_MERGE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
DoMeleeAttackIfReady();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class spell_boss_magus_telestra_summon_telestra_clones_aura : public AuraScript
|
class spell_boss_magus_telestra_summon_telestra_clones_aura : public AuraScript
|
||||||
@@ -331,7 +318,7 @@ public:
|
|||||||
|
|
||||||
void AddSC_boss_magus_telestra()
|
void AddSC_boss_magus_telestra()
|
||||||
{
|
{
|
||||||
new boss_magus_telestra();
|
RegisterNexusCreatureAI(boss_magus_telestra);
|
||||||
RegisterSpellScript(spell_boss_magus_telestra_summon_telestra_clones_aura);
|
RegisterSpellScript(spell_boss_magus_telestra_summon_telestra_clones_aura);
|
||||||
RegisterSpellScript(spell_boss_magus_telestra_gravity_well);
|
RegisterSpellScript(spell_boss_magus_telestra_gravity_well);
|
||||||
new achievement_split_personality();
|
new achievement_split_personality();
|
||||||
|
|||||||
@@ -60,173 +60,147 @@ enum Misc
|
|||||||
GO_CRYSTAL_SPIKE = 188537
|
GO_CRYSTAL_SPIKE = 188537
|
||||||
};
|
};
|
||||||
|
|
||||||
class boss_ormorok : public CreatureScript
|
struct boss_ormorok : public BossAI
|
||||||
{
|
{
|
||||||
public:
|
boss_ormorok(Creature* creature) : BossAI(creature, DATA_ORMOROK_EVENT) {}
|
||||||
boss_ormorok() : CreatureScript("boss_ormorok") { }
|
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature* creature) const override
|
uint8 _spikesCount;
|
||||||
|
|
||||||
|
void Reset() override
|
||||||
{
|
{
|
||||||
return GetNexusAI<boss_ormorokAI>(creature);
|
_spikesCount = 0;
|
||||||
|
BossAI::Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
struct boss_ormorokAI : public BossAI
|
void JustEngagedWith(Unit* who) override
|
||||||
{
|
{
|
||||||
boss_ormorokAI(Creature* creature) : BossAI(creature, DATA_ORMOROK_EVENT)
|
Talk(SAY_AGGRO);
|
||||||
|
BossAI::JustEngagedWith(who);
|
||||||
|
|
||||||
|
events.ScheduleEvent(EVENT_ORMOROK_CRYSTAL_SPIKES, 12s);
|
||||||
|
events.ScheduleEvent(EVENT_ORMOROK_TRAMPLE, 10s);
|
||||||
|
events.ScheduleEvent(EVENT_ORMOROK_SPELL_REFLECTION, 30s);
|
||||||
|
events.ScheduleEvent(EVENT_ORMOROK_HEALTH, 1s);
|
||||||
|
if (IsHeroic())
|
||||||
|
events.ScheduleEvent(EVENT_ORMOROK_SUMMON, 17s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JustDied(Unit* killer) override
|
||||||
|
{
|
||||||
|
Talk(SAY_DEATH);
|
||||||
|
BossAI::JustDied(killer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void KilledUnit(Unit* /*victim*/) override
|
||||||
|
{
|
||||||
|
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||||
{
|
{
|
||||||
|
Talk(SAY_KILL);
|
||||||
|
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
uint8 _spikesCount;
|
void JustSummoned(Creature* summon) override
|
||||||
|
{
|
||||||
|
summons.Summon(summon);
|
||||||
|
}
|
||||||
|
|
||||||
void Reset() override
|
void UpdateAI(uint32 diff) override
|
||||||
|
{
|
||||||
|
if (!UpdateVictim())
|
||||||
|
return;
|
||||||
|
|
||||||
|
events.Update(diff);
|
||||||
|
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (events.ExecuteEvent())
|
||||||
{
|
{
|
||||||
_spikesCount = 0;
|
case EVENT_ORMOROK_HEALTH:
|
||||||
BossAI::Reset();
|
if (me->HealthBelowPct(26))
|
||||||
}
|
{
|
||||||
|
me->CastSpell(me, SPELL_FRENZY, true);
|
||||||
void JustEngagedWith(Unit* who) override
|
Talk(EMOTE_FRENZY);
|
||||||
{
|
break;
|
||||||
Talk(SAY_AGGRO);
|
}
|
||||||
BossAI::JustEngagedWith(who);
|
|
||||||
|
|
||||||
events.ScheduleEvent(EVENT_ORMOROK_CRYSTAL_SPIKES, 12s);
|
|
||||||
events.ScheduleEvent(EVENT_ORMOROK_TRAMPLE, 10s);
|
|
||||||
events.ScheduleEvent(EVENT_ORMOROK_SPELL_REFLECTION, 30s);
|
|
||||||
events.ScheduleEvent(EVENT_ORMOROK_HEALTH, 1s);
|
events.ScheduleEvent(EVENT_ORMOROK_HEALTH, 1s);
|
||||||
if (IsHeroic())
|
break;
|
||||||
events.ScheduleEvent(EVENT_ORMOROK_SUMMON, 17s);
|
case EVENT_ORMOROK_TRAMPLE:
|
||||||
}
|
me->CastSpell(me, SPELL_TRAMPLE, false);
|
||||||
|
events.ScheduleEvent(EVENT_ORMOROK_TRAMPLE, 10s);
|
||||||
void JustDied(Unit* killer) override
|
break;
|
||||||
{
|
case EVENT_ORMOROK_SPELL_REFLECTION:
|
||||||
Talk(SAY_DEATH);
|
Talk(SAY_REFLECT);
|
||||||
BossAI::JustDied(killer);
|
me->CastSpell(me, SPELL_SPELL_REFLECTION, false);
|
||||||
}
|
events.ScheduleEvent(EVENT_ORMOROK_SPELL_REFLECTION, 30s);
|
||||||
|
break;
|
||||||
void KilledUnit(Unit* /*victim*/) override
|
case EVENT_ORMOROK_SUMMON:
|
||||||
{
|
if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, 50.0f, true))
|
||||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
me->CastSpell(target, SPELL_SUMMON_CRYSTALLINE_TANGLER, true);
|
||||||
|
events.ScheduleEvent(EVENT_ORMOROK_SUMMON, 17s);
|
||||||
|
break;
|
||||||
|
case EVENT_ORMOROK_CRYSTAL_SPIKES:
|
||||||
|
Talk(SAY_CRYSTAL_SPIKES);
|
||||||
|
me->CastSpell(me, SPELL_CRYSTAL_SPIKES, false);
|
||||||
|
_spikesCount = 0;
|
||||||
|
events.ScheduleEvent(EVENT_ORMOROK_SUMMON_SPIKES, 300ms);
|
||||||
|
events.ScheduleEvent(EVENT_ORMOROK_CRYSTAL_SPIKES, 20s);
|
||||||
|
break;
|
||||||
|
case EVENT_ORMOROK_SUMMON_SPIKES:
|
||||||
|
if (++_spikesCount > 9)
|
||||||
|
break;
|
||||||
|
for (uint8 i = 0; i < 4; ++i)
|
||||||
{
|
{
|
||||||
Talk(SAY_KILL);
|
float o = rand_norm() * 2.0f * M_PI;
|
||||||
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
|
float x = me->GetPositionX() + 5.0f * _spikesCount * cos(o);
|
||||||
|
float y = me->GetPositionY() + 5.0f * _spikesCount * std::sin(o);
|
||||||
|
float h = me->GetMapHeight(x, y, me->GetPositionZ());
|
||||||
|
|
||||||
|
if (h != INVALID_HEIGHT)
|
||||||
|
me->SummonCreature(NPC_CRYSTAL_SPIKE, x, y, h, 0, TEMPSUMMON_TIMED_DESPAWN, 7000);
|
||||||
}
|
}
|
||||||
|
events.ScheduleEvent(EVENT_ORMOROK_SUMMON_SPIKES, 200ms);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
void JustSummoned(Creature* summon) override
|
DoMeleeAttackIfReady();
|
||||||
{
|
}
|
||||||
summons.Summon(summon);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdateAI(uint32 diff) override
|
|
||||||
{
|
|
||||||
if (!UpdateVictim())
|
|
||||||
return;
|
|
||||||
|
|
||||||
events.Update(diff);
|
|
||||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (events.ExecuteEvent())
|
|
||||||
{
|
|
||||||
case EVENT_ORMOROK_HEALTH:
|
|
||||||
if (me->HealthBelowPct(26))
|
|
||||||
{
|
|
||||||
me->CastSpell(me, SPELL_FRENZY, true);
|
|
||||||
Talk(EMOTE_FRENZY);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
events.ScheduleEvent(EVENT_ORMOROK_HEALTH, 1s);
|
|
||||||
break;
|
|
||||||
case EVENT_ORMOROK_TRAMPLE:
|
|
||||||
me->CastSpell(me, SPELL_TRAMPLE, false);
|
|
||||||
events.ScheduleEvent(EVENT_ORMOROK_TRAMPLE, 10s);
|
|
||||||
break;
|
|
||||||
case EVENT_ORMOROK_SPELL_REFLECTION:
|
|
||||||
Talk(SAY_REFLECT);
|
|
||||||
me->CastSpell(me, SPELL_SPELL_REFLECTION, false);
|
|
||||||
events.ScheduleEvent(EVENT_ORMOROK_SPELL_REFLECTION, 30s);
|
|
||||||
break;
|
|
||||||
case EVENT_ORMOROK_SUMMON:
|
|
||||||
if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, 50.0f, true))
|
|
||||||
me->CastSpell(target, SPELL_SUMMON_CRYSTALLINE_TANGLER, true);
|
|
||||||
events.ScheduleEvent(EVENT_ORMOROK_SUMMON, 17s);
|
|
||||||
break;
|
|
||||||
case EVENT_ORMOROK_CRYSTAL_SPIKES:
|
|
||||||
Talk(SAY_CRYSTAL_SPIKES);
|
|
||||||
me->CastSpell(me, SPELL_CRYSTAL_SPIKES, false);
|
|
||||||
_spikesCount = 0;
|
|
||||||
events.ScheduleEvent(EVENT_ORMOROK_SUMMON_SPIKES, 300ms);
|
|
||||||
events.ScheduleEvent(EVENT_ORMOROK_CRYSTAL_SPIKES, 20s);
|
|
||||||
break;
|
|
||||||
case EVENT_ORMOROK_SUMMON_SPIKES:
|
|
||||||
if (++_spikesCount > 9)
|
|
||||||
break;
|
|
||||||
for (uint8 i = 0; i < 4; ++i)
|
|
||||||
{
|
|
||||||
float o = rand_norm() * 2.0f * M_PI;
|
|
||||||
float x = me->GetPositionX() + 5.0f * _spikesCount * cos(o);
|
|
||||||
float y = me->GetPositionY() + 5.0f * _spikesCount * std::sin(o);
|
|
||||||
float h = me->GetMapHeight(x, y, me->GetPositionZ());
|
|
||||||
|
|
||||||
if (h != INVALID_HEIGHT)
|
|
||||||
me->SummonCreature(NPC_CRYSTAL_SPIKE, x, y, h, 0, TEMPSUMMON_TIMED_DESPAWN, 7000);
|
|
||||||
}
|
|
||||||
events.ScheduleEvent(EVENT_ORMOROK_SUMMON_SPIKES, 200ms);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
DoMeleeAttackIfReady();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class npc_crystal_spike : public CreatureScript
|
struct npc_crystal_spike : public NullCreatureAI
|
||||||
{
|
{
|
||||||
public:
|
npc_crystal_spike(Creature* c) : NullCreatureAI(c) { }
|
||||||
npc_crystal_spike() : CreatureScript("npc_crystal_spike") { }
|
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature* pCreature) const override
|
int32 _damageTimer;
|
||||||
|
ObjectGuid _gameObjectGUID;
|
||||||
|
|
||||||
|
void Reset() override
|
||||||
{
|
{
|
||||||
return GetNexusAI<npc_crystal_spikeAI>(pCreature);
|
if (GameObject* gameobject = me->SummonGameObject(GO_CRYSTAL_SPIKE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 3500))
|
||||||
|
_gameObjectGUID = gameobject->GetGUID();
|
||||||
|
|
||||||
|
_damageTimer = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct npc_crystal_spikeAI : public NullCreatureAI
|
void UpdateAI(uint32 diff) override
|
||||||
{
|
{
|
||||||
npc_crystal_spikeAI(Creature* c) : NullCreatureAI(c)
|
if (_damageTimer)
|
||||||
{
|
{
|
||||||
}
|
_damageTimer += diff;
|
||||||
|
if (_damageTimer >= 2000)
|
||||||
int32 _damageTimer;
|
|
||||||
ObjectGuid _gameObjectGUID;
|
|
||||||
|
|
||||||
void Reset() override
|
|
||||||
{
|
|
||||||
if (GameObject* gameobject = me->SummonGameObject(GO_CRYSTAL_SPIKE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 3500))
|
|
||||||
_gameObjectGUID = gameobject->GetGUID();
|
|
||||||
|
|
||||||
_damageTimer = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdateAI(uint32 diff) override
|
|
||||||
{
|
|
||||||
if (_damageTimer)
|
|
||||||
{
|
{
|
||||||
_damageTimer += diff;
|
if (GameObject* gameobject = ObjectAccessor::GetGameObject(*me, _gameObjectGUID))
|
||||||
if (_damageTimer >= 2000)
|
gameobject->SetGoState(GO_STATE_ACTIVE);
|
||||||
{
|
|
||||||
if (GameObject* gameobject = ObjectAccessor::GetGameObject(*me, _gameObjectGUID))
|
|
||||||
gameobject->SetGoState(GO_STATE_ACTIVE);
|
|
||||||
|
|
||||||
me->CastSpell(me, SPELL_CRYSTAL_SPIKE_DAMAGE, false);
|
me->CastSpell(me, SPELL_CRYSTAL_SPIKE_DAMAGE, false);
|
||||||
_damageTimer = 0;
|
_damageTimer = 0;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void AddSC_boss_ormorok()
|
void AddSC_boss_ormorok()
|
||||||
{
|
{
|
||||||
new boss_ormorok();
|
RegisterNexusCreatureAI(boss_ormorok);
|
||||||
new npc_crystal_spike();
|
RegisterNexusCreatureAI(npc_crystal_spike);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -166,110 +166,97 @@ enum eFrayer
|
|||||||
SPELL_ENSNARE = 48053
|
SPELL_ENSNARE = 48053
|
||||||
};
|
};
|
||||||
|
|
||||||
class npc_crystalline_frayer : public CreatureScript
|
struct npc_crystalline_frayer : public ScriptedAI
|
||||||
{
|
{
|
||||||
public:
|
npc_crystalline_frayer(Creature* creature) : ScriptedAI(creature) { }
|
||||||
npc_crystalline_frayer() : CreatureScript("npc_crystalline_frayer") { }
|
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature* creature) const override
|
bool _allowDeath;
|
||||||
|
uint32 restoreTimer;
|
||||||
|
uint32 abilityTimer1;
|
||||||
|
uint32 abilityTimer2;
|
||||||
|
|
||||||
|
void Reset() override
|
||||||
{
|
{
|
||||||
return GetNexusAI<npc_crystalline_frayerAI>(creature);
|
restoreTimer = 0;
|
||||||
|
abilityTimer1 = 0;
|
||||||
|
abilityTimer2 = 30000;
|
||||||
|
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
|
||||||
|
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct npc_crystalline_frayerAI : public ScriptedAI
|
void JustEngagedWith(Unit*) override
|
||||||
{
|
{
|
||||||
npc_crystalline_frayerAI(Creature* creature) : ScriptedAI(creature)
|
_allowDeath = me->GetInstanceScript()->GetBossState(DATA_ORMOROK_EVENT) == DONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EnterEvadeMode(EvadeReason why) override
|
||||||
|
{
|
||||||
|
if (me->isRegeneratingHealth())
|
||||||
|
ScriptedAI::EnterEvadeMode(why);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override
|
||||||
|
{
|
||||||
|
if (damage >= me->GetHealth())
|
||||||
{
|
{
|
||||||
|
if (!_allowDeath)
|
||||||
|
{
|
||||||
|
me->RemoveAllAuras();
|
||||||
|
me->GetThreatMgr().ClearAllThreat();
|
||||||
|
me->CombatStop(true);
|
||||||
|
damage = 0;
|
||||||
|
|
||||||
|
me->SetReactState(REACT_PASSIVE);
|
||||||
|
me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
|
||||||
|
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
|
||||||
|
me->SetRegeneratingHealth(false);
|
||||||
|
me->CastSpell(me, SPELL_SUMMON_SEED_POD, true);
|
||||||
|
me->CastSpell(me, SPELL_SEED_POD, true);
|
||||||
|
me->CastSpell(me, SPELL_AURA_OF_REGENERATION, false);
|
||||||
|
restoreTimer = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateAI(uint32 diff) override
|
||||||
|
{
|
||||||
|
if (restoreTimer)
|
||||||
|
{
|
||||||
|
restoreTimer += diff;
|
||||||
|
if (restoreTimer >= 90 * IN_MILLISECONDS)
|
||||||
|
{
|
||||||
|
Talk(0);
|
||||||
|
me->SetRegeneratingHealth(true);
|
||||||
|
restoreTimer = 0;
|
||||||
|
me->SetReactState(REACT_AGGRESSIVE);
|
||||||
|
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
|
||||||
|
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool _allowDeath;
|
if (!UpdateVictim())
|
||||||
uint32 restoreTimer;
|
return;
|
||||||
uint32 abilityTimer1;
|
|
||||||
uint32 abilityTimer2;
|
|
||||||
|
|
||||||
void Reset() override
|
abilityTimer1 += diff;
|
||||||
|
abilityTimer2 += diff;
|
||||||
|
|
||||||
|
if (abilityTimer1 >= 5000)
|
||||||
{
|
{
|
||||||
restoreTimer = 0;
|
me->CastSpell(me->GetVictim(), SPELL_ENSNARE, false);
|
||||||
abilityTimer1 = 0;
|
abilityTimer1 = 0;
|
||||||
abilityTimer2 = 30000;
|
|
||||||
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
|
|
||||||
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void JustEngagedWith(Unit*) override
|
if (abilityTimer2 >= 30000)
|
||||||
{
|
{
|
||||||
_allowDeath = me->GetInstanceScript()->GetBossState(DATA_ORMOROK_EVENT) == DONE;
|
me->CastSpell(me->GetVictim(), SPELL_CRYSTAL_BLOOM, false);
|
||||||
|
abilityTimer2 = 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
void EnterEvadeMode(EvadeReason why) override
|
|
||||||
{
|
|
||||||
if (me->isRegeneratingHealth())
|
|
||||||
ScriptedAI::EnterEvadeMode(why);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override
|
|
||||||
{
|
|
||||||
if (damage >= me->GetHealth())
|
|
||||||
{
|
|
||||||
if (!_allowDeath)
|
|
||||||
{
|
|
||||||
me->RemoveAllAuras();
|
|
||||||
me->GetThreatMgr().ClearAllThreat();
|
|
||||||
me->CombatStop(true);
|
|
||||||
damage = 0;
|
|
||||||
|
|
||||||
me->SetReactState(REACT_PASSIVE);
|
|
||||||
me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
|
|
||||||
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
|
|
||||||
me->SetRegeneratingHealth(false);
|
|
||||||
me->CastSpell(me, SPELL_SUMMON_SEED_POD, true);
|
|
||||||
me->CastSpell(me, SPELL_SEED_POD, true);
|
|
||||||
me->CastSpell(me, SPELL_AURA_OF_REGENERATION, false);
|
|
||||||
restoreTimer = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdateAI(uint32 diff) override
|
|
||||||
{
|
|
||||||
if (restoreTimer)
|
|
||||||
{
|
|
||||||
restoreTimer += diff;
|
|
||||||
if (restoreTimer >= 90 * IN_MILLISECONDS)
|
|
||||||
{
|
|
||||||
Talk(0);
|
|
||||||
me->SetRegeneratingHealth(true);
|
|
||||||
restoreTimer = 0;
|
|
||||||
me->SetReactState(REACT_AGGRESSIVE);
|
|
||||||
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
|
|
||||||
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!UpdateVictim())
|
|
||||||
return;
|
|
||||||
|
|
||||||
abilityTimer1 += diff;
|
|
||||||
abilityTimer2 += diff;
|
|
||||||
|
|
||||||
if (abilityTimer1 >= 5000)
|
|
||||||
{
|
|
||||||
me->CastSpell(me->GetVictim(), SPELL_ENSNARE, false);
|
|
||||||
abilityTimer1 = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (abilityTimer2 >= 30000)
|
|
||||||
{
|
|
||||||
me->CastSpell(me->GetVictim(), SPELL_CRYSTAL_BLOOM, false);
|
|
||||||
abilityTimer2 = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void AddSC_instance_nexus()
|
void AddSC_instance_nexus()
|
||||||
{
|
{
|
||||||
new instance_nexus();
|
new instance_nexus();
|
||||||
new npc_crystalline_frayer();
|
RegisterNexusCreatureAI(npc_crystalline_frayer);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,4 +62,6 @@ inline AI* GetNexusAI(T* obj)
|
|||||||
return GetInstanceAI<AI>(obj, NexusScriptName);
|
return GetInstanceAI<AI>(obj, NexusScriptName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define RegisterNexusCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetNexusAI)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user