refactor(Scripts/Nexus): Update creature scripts to new register method (#20728)

This commit is contained in:
Andrew
2024-11-25 03:15:49 -03:00
committed by GitHub
parent 7da3ab573c
commit 65ec5bbceb
7 changed files with 576 additions and 669 deletions

View File

@@ -67,146 +67,131 @@ private:
Creature* _caster;
};
class boss_anomalus : public CreatureScript
struct boss_anomalus : public BossAI
{
public:
boss_anomalus() : CreatureScript("boss_anomalus") { }
boss_anomalus(Creature* creature) : BossAI(creature, DATA_ANOMALUS_EVENT) { }
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;
uint16 activeRifts;
void Reset() override
void SetData(uint32 type, uint32) override
{
if (type == me->GetEntry())
{
BossAI::Reset();
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))
{
if (activeRifts > 0 && --activeRifts == 0 && me->HasAura(SPELL_RIFT_SHIELD))
{
events.DelayEvents(me->GetAura(SPELL_RIFT_SHIELD)->GetDuration() - 46000);
me->RemoveAura(SPELL_RIFT_SHIELD);
me->InterruptNonMeleeSpells(false);
}
achievement = false;
events.DelayEvents(me->GetAura(SPELL_RIFT_SHIELD)->GetDuration() - 46000);
me->RemoveAura(SPELL_RIFT_SHIELD);
me->InterruptNonMeleeSpells(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);
activeRifts++;
}
void JustEngagedWith(Unit* who) override
{
Talk(SAY_AGGRO);
BossAI::JustEngagedWith(who);
activeRifts = 0;
events.SetTimer(45000);
case EVENT_ANOMALUS_SPARK:
me->CastSpell(me->GetVictim(), SPELL_SPARK, false);
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())
break;
case EVENT_ANOMALUS_HEALTH:
if (me->HealthBelowPct(51))
{
case EVENT_ANOMALUS_SPARK:
me->CastSpell(me->GetVictim(), SPELL_SPARK, false);
events.ScheduleEvent(EVENT_ANOMALUS_SPARK, 5s);
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;
//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);
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
{
return me->GetHomePosition().GetExactDist2d(me) > 60.0f;
}
};
DoMeleeAttackIfReady();
}
bool CheckEvadeIfOutOfCombatArea() const override
{
return me->GetHomePosition().GetExactDist2d(me) > 60.0f;
}
};
class achievement_chaos_theory : public AchievementCriteriaScript
{
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
{
@@ -219,6 +204,6 @@ public:
void AddSC_boss_anomalus()
{
new boss_anomalus();
RegisterNexusCreatureAI(boss_anomalus);
new achievement_chaos_theory();
}

View File

@@ -43,90 +43,77 @@ enum Says
SAY_KILL = 2
};
class boss_commander_stoutbeard : public CreatureScript
struct boss_commander_stoutbeard : public BossAI
{
public:
boss_commander_stoutbeard() : CreatureScript("boss_commander_stoutbeard") { }
boss_commander_stoutbeard(Creature* creature) : BossAI(creature, DATA_COMMANDER_EVENT) {}
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
{
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();
}
};
DoMeleeAttackIfReady();
}
};
void AddSC_boss_commander_stoutbeard()
{
new boss_commander_stoutbeard();
RegisterNexusCreatureAI(boss_commander_stoutbeard);
}

View File

@@ -55,152 +55,137 @@ enum Events
EVENT_KILL_TALK = 6
};
class boss_keristrasza : public CreatureScript
struct boss_keristrasza : public BossAI
{
public:
boss_keristrasza() : CreatureScript("boss_keristrasza") { }
boss_keristrasza(Creature* creature) : BossAI(creature, DATA_KERISTRASZA_EVENT) {}
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();
RemovePrison(CanRemovePrison());
aGuids.clear();
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
me->RemoveAurasDueToSpell(SPELL_FROZEN_PRISON);
}
void JustEngagedWith(Unit* who) override
else
{
Talk(SAY_AGGRO);
BossAI::JustEngagedWith(who);
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
me->CastSpell(me, SPELL_FROZEN_PRISON, true);
}
}
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);
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);
events.ScheduleEvent(EVENT_ACHIEVEMENT_CHECK, 1s);
}
void JustDied(Unit* killer) override
break;
case EVENT_ACHIEVEMENT_CHECK:
{
Talk(SAY_DEATH);
BossAI::JustDied(killer);
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;
}
void KilledUnit(Unit*) override
{
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();
}
};
DoMeleeAttackIfReady();
}
};
class achievement_intense_cold : public AchievementCriteriaScript
{
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
{
@@ -213,6 +198,6 @@ public:
void AddSC_boss_keristrasza()
{
new boss_keristrasza();
RegisterNexusCreatureAI(boss_keristrasza);
new achievement_intense_cold();
}

View File

@@ -79,159 +79,146 @@ enum Events
EVENT_KILL_TALK = 9
};
class boss_magus_telestra : public CreatureScript
struct boss_magus_telestra : public BossAI
{
public:
boss_magus_telestra() : CreatureScript("boss_magus_telestra") { }
boss_magus_telestra(Creature* creature) : BossAI(creature, DATA_MAGUS_TELESTRA_EVENT) { }
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;
bool achievement;
void JustSummoned(Creature* summon) override
{
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();
copiesDied = 0;
achievement = true;
events.ScheduleEvent(EVENT_MAGUS_FAIL_ACHIEVEMENT, 5s);
caster->ToCreature()->DespawnOrUnsummon(1000);
if (IsHeroic() && sGameEventMgr->IsActiveEvent(GAME_EVENT_WINTER_VEIL) && !me->HasAura(SPELL_WEAR_CHRISTMAS_HAT))
me->AddAura(SPELL_WEAR_CHRISTMAS_HAT, me);
if (++copiesDied >= 3)
{
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())
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);
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);
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)
break;
case EVENT_MAGUS_HEALTH2:
if (me->HealthBelowPct(11))
{
Talk(SAY_KILL);
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
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;
}
void JustSummoned(Creature* summon) override
{
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();
}
};
DoMeleeAttackIfReady();
}
};
class spell_boss_magus_telestra_summon_telestra_clones_aura : public AuraScript
@@ -331,7 +318,7 @@ public:
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_gravity_well);
new achievement_split_personality();

View File

@@ -60,173 +60,147 @@ enum Misc
GO_CRYSTAL_SPIKE = 188537
};
class boss_ormorok : public CreatureScript
struct boss_ormorok : public BossAI
{
public:
boss_ormorok() : CreatureScript("boss_ormorok") { }
boss_ormorok(Creature* creature) : BossAI(creature, DATA_ORMOROK_EVENT) {}
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;
BossAI::Reset();
}
void JustEngagedWith(Unit* who) override
{
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);
case EVENT_ORMOROK_HEALTH:
if (me->HealthBelowPct(26))
{
me->CastSpell(me, SPELL_FRENZY, true);
Talk(EMOTE_FRENZY);
break;
}
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)
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)
{
Talk(SAY_KILL);
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
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;
}
void JustSummoned(Creature* summon) override
{
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();
}
};
DoMeleeAttackIfReady();
}
};
class npc_crystal_spike : public CreatureScript
struct npc_crystal_spike : public NullCreatureAI
{
public:
npc_crystal_spike() : CreatureScript("npc_crystal_spike") { }
npc_crystal_spike(Creature* c) : NullCreatureAI(c) { }
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)
{
}
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 (_damageTimer >= 2000)
{
_damageTimer += diff;
if (_damageTimer >= 2000)
{
if (GameObject* gameobject = ObjectAccessor::GetGameObject(*me, _gameObjectGUID))
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);
_damageTimer = 0;
}
me->CastSpell(me, SPELL_CRYSTAL_SPIKE_DAMAGE, false);
_damageTimer = 0;
}
}
};
}
};
void AddSC_boss_ormorok()
{
new boss_ormorok();
new npc_crystal_spike();
RegisterNexusCreatureAI(boss_ormorok);
RegisterNexusCreatureAI(npc_crystal_spike);
}

View File

@@ -166,110 +166,97 @@ enum eFrayer
SPELL_ENSNARE = 48053
};
class npc_crystalline_frayer : public CreatureScript
struct npc_crystalline_frayer : public ScriptedAI
{
public:
npc_crystalline_frayer() : CreatureScript("npc_crystalline_frayer") { }
npc_crystalline_frayer(Creature* creature) : ScriptedAI(creature) { }
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;
uint32 restoreTimer;
uint32 abilityTimer1;
uint32 abilityTimer2;
if (!UpdateVictim())
return;
void Reset() override
abilityTimer1 += diff;
abilityTimer2 += diff;
if (abilityTimer1 >= 5000)
{
restoreTimer = 0;
me->CastSpell(me->GetVictim(), SPELL_ENSNARE, false);
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()
{
new instance_nexus();
new npc_crystalline_frayer();
RegisterNexusCreatureAI(npc_crystalline_frayer);
}

View File

@@ -62,4 +62,6 @@ inline AI* GetNexusAI(T* obj)
return GetInstanceAI<AI>(obj, NexusScriptName);
}
#define RegisterNexusCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetNexusAI)
#endif