aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp170
1 files changed, 75 insertions, 95 deletions
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp
index 24f688ab4ad..77c3d618245 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp
@@ -15,70 +15,87 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "ScriptMgr.h"
#include "InstanceScript.h"
-#include "MotionMaster.h"
-#include "oculus.h"
#include "ScriptedCreature.h"
+#include "ScriptMgr.h"
+#include "SpellScript.h"
+#include "SpellInfo.h"
+#include "SpellMgr.h"
+#include "oculus.h"
-enum Spells
+enum Texts
{
- SPELL_MAGIC_PULL = 51336,
- SPELL_THUNDERING_STOMP = 50774,
- SPELL_UNSTABLE_SPHERE_PASSIVE = 50756,
- SPELL_UNSTABLE_SPHERE_PULSE = 50757,
- SPELL_UNSTABLE_SPHERE_TIMER = 50758,
- NPC_UNSTABLE_SPHERE = 28166,
+ SAY_AGGRO = 0,
+ SAY_KILL = 1,
+ SAY_DEATH = 2,
+ SAY_PULL = 3,
+ SAY_STOMP = 4,
+ EMOTE_PULL = 5
};
-enum Yells
+enum Spells
{
- SAY_AGGRO = 0,
- SAY_KILL = 1,
- SAY_DEATH = 2,
- SAY_PULL = 3,
- SAY_STOMP = 4
+ SPELL_SUMMON_UNSTABLE_SPHERE = 50754,
+ SPELL_MAGIC_PULL = 51336,
+ SPELL_THUNDERING_STOMP = 50774,
+
+ SPELL_MAGIC_PULL_EFFECT = 50770
};
-enum DrakosAchievement
+enum Events
{
- ACHIEV_TIMED_START_EVENT = 18153,
+ EVENT_BOMB_SUMMON = 1,
+ EVENT_MAGIC_PULL,
+ EVENT_STOMP
};
-enum DrakosEvents
+enum Misc
{
- EVENT_MAGIC_PULL = 1,
- EVENT_STOMP,
- EVENT_BOMB_SUMMON
+ ACHIEV_TIMED_START_EVENT = 18153
};
struct boss_drakos : public BossAI
{
- boss_drakos(Creature* creature) : BossAI(creature, DATA_DRAKOS)
+ boss_drakos(Creature* creature) : BossAI(creature, DATA_DRAKOS) { }
+
+ void JustEngagedWith(Unit* who) override
{
- Initialize();
+ BossAI::JustEngagedWith(who);
+ Talk(SAY_AGGRO);
+
+ events.ScheduleEvent(EVENT_BOMB_SUMMON, 2s);
+ events.ScheduleEvent(EVENT_MAGIC_PULL, 10s, 18s);
+ events.ScheduleEvent(EVENT_STOMP, 10s, 18s);
}
- void Initialize()
+ void OnSpellStart(SpellInfo const* spell) override
{
- postPull = false;
+ if (spell->Id == SPELL_MAGIC_PULL)
+ {
+ Talk(SAY_PULL);
+ Talk(EMOTE_PULL);
+ }
}
- void Reset() override
+ void OnSpellCast(SpellInfo const* spell) override
{
- _Reset();
-
- events.ScheduleEvent(EVENT_MAGIC_PULL, 15s);
- events.ScheduleEvent(EVENT_STOMP, 15s);
- events.ScheduleEvent(EVENT_BOMB_SUMMON, 2s);
+ if (spell->Id == sSpellMgr->GetSpellIdForDifficulty(SPELL_THUNDERING_STOMP, me))
+ if (roll_chance_i(50))
+ Talk(SAY_STOMP);
+ }
- Initialize();
+ void KilledUnit(Unit* /*victim*/) override
+ {
+ Talk(SAY_KILL);
}
- void JustEngagedWith(Unit* who) override
+ void JustDied(Unit* /*killer*/) override
{
- BossAI::JustEngagedWith(who);
- Talk(SAY_AGGRO);
+ _JustDied();
+ Talk(SAY_DEATH);
+
+ // start achievement timer (kill Eregos within 20 min)
+ instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
}
void UpdateAI(uint32 diff) override
@@ -96,24 +113,16 @@ struct boss_drakos : public BossAI
switch (eventId)
{
case EVENT_BOMB_SUMMON:
- {
- for (uint8 i = 0; i <= (postPull ? 3 : 0); i++)
- {
- Position position = me->GetRandomNearPosition(frand(0.0f, 10.0f));
- me->SummonCreature(NPC_UNSTABLE_SPHERE, position);
- }
- }
- events.ScheduleEvent(EVENT_BOMB_SUMMON, 2s);
+ DoCastSelf(SPELL_SUMMON_UNSTABLE_SPHERE);
+ events.Repeat(2s);
break;
case EVENT_MAGIC_PULL:
- DoCast(SPELL_MAGIC_PULL);
- postPull = true;
- events.ScheduleEvent(EVENT_MAGIC_PULL, 15s);
+ DoCastSelf(SPELL_MAGIC_PULL);
+ events.Repeat(6s, 14s);
break;
case EVENT_STOMP:
- Talk(SAY_STOMP);
- DoCast(SPELL_THUNDERING_STOMP);
- events.ScheduleEvent(EVENT_STOMP, 15s);
+ DoCastSelf(SPELL_THUNDERING_STOMP);
+ events.Repeat(10s, 20s);
break;
default:
break;
@@ -125,68 +134,39 @@ struct boss_drakos : public BossAI
DoMeleeAttackIfReady();
}
-
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
-
- Talk(SAY_DEATH);
-
- // start achievement timer (kill Eregos within 20 min)
- instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
- }
-
- void KilledUnit(Unit* /*victim*/) override
- {
- Talk(SAY_KILL);
- }
-
-private:
- bool postPull;
};
-struct npc_unstable_sphere : public ScriptedAI
+// 51336 - Magic Pull
+class spell_drakos_magic_pull : public SpellScript
{
- npc_unstable_sphere(Creature* creature) : ScriptedAI(creature)
+ PrepareSpellScript(spell_drakos_magic_pull);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
{
- Initialize();
+ return ValidateSpellInfo({ SPELL_MAGIC_PULL_EFFECT, SPELL_SUMMON_UNSTABLE_SPHERE });
}
- void Initialize()
+ void HandleDummy(SpellEffIndex /*effIndex*/)
{
- pulseTimer = 3000;
+ GetCaster()->CastSpell(GetHitUnit(), SPELL_MAGIC_PULL_EFFECT, true);
}
- void Reset() override
+ void HandleAfterCast()
{
- me->SetReactState(REACT_PASSIVE);
- me->GetMotionMaster()->MoveRandom(40.0f);
-
- me->AddAura(SPELL_UNSTABLE_SPHERE_PASSIVE, me);
- me->AddAura(SPELL_UNSTABLE_SPHERE_TIMER, me);
-
- Initialize();
-
- me->DespawnOrUnsummon(19s);
+ Unit* caster = GetCaster();
+ for (uint8 i = 0; i < 5; i++)
+ caster->CastSpell(caster, SPELL_SUMMON_UNSTABLE_SPHERE, true);
}
- void UpdateAI(uint32 diff) override
+ void Register() override
{
- if (pulseTimer <= diff)
- {
- DoCast(SPELL_UNSTABLE_SPHERE_PULSE);
- pulseTimer = 3 * IN_MILLISECONDS;
- }
- else
- pulseTimer -= diff;
+ OnEffectHitTarget += SpellEffectFn(spell_drakos_magic_pull::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ AfterCast += SpellCastFn(spell_drakos_magic_pull::HandleAfterCast);
}
-
-private:
- uint32 pulseTimer;
};
void AddSC_boss_drakos()
{
RegisterOculusCreatureAI(boss_drakos);
- RegisterOculusCreatureAI(npc_unstable_sphere);
+ RegisterSpellScript(spell_drakos_magic_pull);
}