mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-18 03:15:41 +00:00
refactor(Scripts/Nexus): Update creature scripts to new register method (#20728)
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -62,4 +62,6 @@ inline AI* GetNexusAI(T* obj)
|
||||
return GetInstanceAI<AI>(obj, NexusScriptName);
|
||||
}
|
||||
|
||||
#define RegisterNexusCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetNexusAI)
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user