aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoschiwald <joschiwald@online.de>2013-12-10 07:29:00 -0800
committerjoschiwald <joschiwald@online.de>2013-12-10 07:29:00 -0800
commitbb45db65a0a5c72a527b42cf6bea5215e9b710eb (patch)
treeb812405a1f36de392377e3f52f82483322b1985f
parent74facef60dda7e18a3c854160709c0d51071f975 (diff)
parent000bfbb7322e5c131e4a2411e47836e725424cef (diff)
Merge pull request #11275 from Carbenium/UtgardePinnacle
Scripts/UtgardePinnacle: Convert Svala Sorrowgrave to event system
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp379
1 files changed, 175 insertions, 204 deletions
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
index d518747a462..f7e8d9ea7d6 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
@@ -81,15 +81,40 @@ enum Creatures
NPC_SCOURGE_HULK = 26555
};
-enum SvalaPhase
+enum Phases
{
- IDLE,
+ IDLE = 1,
INTRO,
NORMAL,
SACRIFICING,
SVALADEAD
};
+enum Events
+{
+ //INTRO
+ EVENT_INTRO_SVALA_TALK_0 = 1,
+ EVENT_INTRO_ARTHAS_TALK_0,
+ EVENT_INTRO_TRANSFORM_0,
+ EVENT_INTRO_TRANSFORM_1,
+ EVENT_INTRO_TRANSFORM_2,
+ EVENT_INTRO_SVALA_TALK_1,
+ EVENT_INTRO_ARTHAS_TALK_1,
+ EVENT_INTRO_SVALA_TALK_2,
+ EVENT_INTRO_RELOCATE_SVALA,
+ EVENT_INTRO_DESPAWN_ARTHAS,
+
+ //NORMAL
+ EVENT_SINISTER_STRIKE,
+ EVENT_CALL_FLAMES,
+ EVENT_RITUAL_PREPARATION,
+
+ //SACRIFICING
+ EVENT_SPAWN_RITUAL_CHANNELERS,
+ EVENT_RITUAL_STRIKE,
+ EVENT_RITUAL_DISARM
+};
+
enum Misc
{
DATA_INCREDIBLE_HULK = 2043
@@ -112,38 +137,23 @@ class boss_svala : public CreatureScript
{
boss_svalaAI(Creature* creature) : BossAI(creature, DATA_SVALA_SORROWGRAVE)
{
- Phase = IDLE;
+ _introCompleted = false;
}
- SvalaPhase Phase;
-
- uint32 introTimer;
- uint8 introPhase;
- uint8 sacrePhase;
-
- uint64 arthasGUID;
-
- uint32 sinsterStrikeTimer;
- uint32 callFlamesTimer;
- uint32 sacrificeTimer;
-
- bool sacrificed;
-
void Reset() OVERRIDE
{
_Reset();
- sacrificed = false;
+ _sacrificed = false;
SetCombatMovement(true);
- if (Phase > NORMAL)
- Phase = NORMAL;
+ if (_introCompleted)
+ events.SetPhase(NORMAL);
+ else
+ events.SetPhase(IDLE);
- me->SetDisableGravity(Phase == NORMAL);
+ me->SetDisableGravity(events.IsInPhase(NORMAL));
- introTimer = 1 * IN_MILLISECONDS;
- introPhase = 0;
- sacrePhase = 0;
- arthasGUID = 0;
+ _arthasGUID = 0;
instance->SetData64(DATA_SACRIFICED_PLAYER, 0);
}
@@ -152,16 +162,12 @@ class boss_svala : public CreatureScript
{
_EnterCombat();
Talk(SAY_AGGRO);
-
- sinsterStrikeTimer = 7 * IN_MILLISECONDS;
- callFlamesTimer = urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
}
void JustSummoned(Creature* summon) OVERRIDE
{
if (summon->GetEntry() == NPC_RITUAL_CHANNELER)
summon->CastSpell(summon, SPELL_SUMMONED_VIS, true);
-
summons.Summon(summon);
}
@@ -170,9 +176,9 @@ class boss_svala : public CreatureScript
if (!who)
return;
- if (Phase == IDLE && me->IsValidAttackTarget(who) && me->IsWithinDistInMap(who, 40))
+ if (events.IsInPhase(IDLE) && me->IsValidAttackTarget(who) && me->IsWithinDistInMap(who, 40))
{
- Phase = INTRO;
+ events.SetPhase(INTRO);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
if (GameObject* mirror = ObjectAccessor::GetGameObject(*me, DATA_UTGARDE_MIRROR))
@@ -181,8 +187,9 @@ class boss_svala : public CreatureScript
if (Creature* arthas = me->SummonCreature(NPC_ARTHAS, ArthasPos, TEMPSUMMON_MANUAL_DESPAWN))
{
arthas->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
- arthasGUID = arthas->GetGUID();
+ _arthasGUID = arthas->GetGUID();
}
+ events.ScheduleEvent(EVENT_INTRO_SVALA_TALK_0, 1 * IN_MILLISECONDS, 0, INTRO);
}
}
@@ -194,20 +201,20 @@ class boss_svala : public CreatureScript
void JustDied(Unit* /*killer*/) OVERRIDE
{
- if (Phase == SACRIFICING)
+ if (events.IsInPhase(SACRIFICING))
SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
-
me->HandleEmoteCommand(EMOTE_ONESHOT_FLYDEATH);
-
_JustDied();
Talk(SAY_DEATH);
}
void SpellHitTarget(Unit* /*target*/, SpellInfo const* spellInfo) OVERRIDE
{
- if (spellInfo->Id == SPELL_RITUAL_STRIKE_EFF_1 && Phase != NORMAL && Phase != SVALADEAD)
+ if (spellInfo->Id == SPELL_RITUAL_STRIKE_EFF_1 && !events.IsInPhase(NORMAL) && !events.IsInPhase(SVALADEAD))
{
- Phase = NORMAL;
+ events.SetPhase(NORMAL);
+ events.ScheduleEvent(EVENT_SINISTER_STRIKE, 7 * IN_MILLISECONDS, 0, NORMAL);
+ events.ScheduleEvent(EVENT_CALL_FLAMES, urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS), 0, NORMAL);
SetCombatMovement(true);
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 300.0f, true))
@@ -217,199 +224,163 @@ class boss_svala : public CreatureScript
void UpdateAI(uint32 diff) OVERRIDE
{
- if (Phase == IDLE)
+ if (events.IsInPhase(IDLE))
return;
- if (Phase == INTRO)
+ if (events.IsInPhase(NORMAL) && !UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (!_sacrificed && HealthBelowPct(50))
{
- if (introTimer <= diff)
- {
- Creature* arthas = ObjectAccessor::GetCreature(*me, arthasGUID);
- if (!arthas)
- return;
+ _sacrificed = true;
+ events.SetPhase(SACRIFICING);
+ events.ScheduleEvent(EVENT_RITUAL_PREPARATION, 0, 0, SACRIFICING);
+ }
- switch (introPhase)
- {
- case 0:
- Talk(SAY_SVALA_INTRO_0);
- ++introPhase;
- introTimer = 8100;
- break;
- case 1:
+ if (events.IsInPhase(NORMAL))
+ DoMeleeAttackIfReady();
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_INTRO_SVALA_TALK_0:
+ Talk(SAY_SVALA_INTRO_0);
+ events.ScheduleEvent(EVENT_INTRO_ARTHAS_TALK_0, 8.1 * IN_MILLISECONDS, 0, INTRO);
+ break;
+ case EVENT_INTRO_ARTHAS_TALK_0:
+ if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID))
arthas->AI()->Talk(SAY_DIALOG_OF_ARTHAS_1);
- ++introPhase;
- introTimer = 10000;
- break;
- case 2:
- {
+ events.ScheduleEvent(EVENT_INTRO_TRANSFORM_0, 10 * IN_MILLISECONDS, 0, INTRO);
+ break;
+ case EVENT_INTRO_TRANSFORM_0:
+ {
+ if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID))
arthas->CastSpell(me, SPELL_TRANSFORMING_CHANNEL, false);
- Position pos;
- pos.Relocate(me);
- pos.m_positionZ += 8.0f;
- me->GetMotionMaster()->MoveTakeoff(0, pos);
- // spectators flee event
- std::list<Creature*> lspectatorList;
- GetCreatureListWithEntryInGrid(lspectatorList, me, NPC_SPECTATOR, 100.0f);
- for (std::list<Creature*>::iterator itr = lspectatorList.begin(); itr != lspectatorList.end(); ++itr)
+ Position pos;
+ pos.Relocate(me);
+ pos.m_positionZ += 8.0f;
+ me->GetMotionMaster()->MoveTakeoff(0, pos);
+ // spectators flee event
+ std::list<Creature*> lspectatorList;
+ GetCreatureListWithEntryInGrid(lspectatorList, me, NPC_SPECTATOR, 100.0f);
+ for (std::list<Creature*>::iterator itr = lspectatorList.begin(); itr != lspectatorList.end(); ++itr)
+ {
+ if ((*itr)->IsAlive())
{
- if ((*itr)->IsAlive())
- {
- (*itr)->SetStandState(UNIT_STAND_STATE_STAND);
- (*itr)->SetWalk(false);
- (*itr)->GetMotionMaster()->MovePoint(1, spectatorWP[0]);
- }
+ (*itr)->SetStandState(UNIT_STAND_STATE_STAND);
+ (*itr)->SetWalk(false);
+ (*itr)->GetMotionMaster()->MovePoint(1, spectatorWP[0]);
}
-
- ++introPhase;
- introTimer = 4200;
- break;
}
- case 3:
- me->CastSpell(me, SPELL_SVALA_TRANSFORMING1, false);
- ++introPhase;
- introTimer = 6200;
- break;
- case 4:
- me->CastSpell(me, SPELL_SVALA_TRANSFORMING2, false);
+ events.ScheduleEvent(EVENT_INTRO_TRANSFORM_1, 4.2 * IN_MILLISECONDS, 0, INTRO);
+ break;
+ }
+ case EVENT_INTRO_TRANSFORM_1:
+ me->CastSpell(me, SPELL_SVALA_TRANSFORMING1, false);
+ events.ScheduleEvent(EVENT_INTRO_TRANSFORM_2, 6.2 * IN_MILLISECONDS, 0, INTRO);
+ break;
+ case EVENT_INTRO_TRANSFORM_2:
+ me->CastSpell(me, SPELL_SVALA_TRANSFORMING2, false);
+ if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID))
+ {
arthas->InterruptNonMeleeSpells(true);
- me->RemoveAllAuras();
- me->UpdateEntry(NPC_SVALA_SORROWGRAVE);
me->SetFacingToObject(arthas);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- ++introPhase;
- introTimer = 3200;
- break;
- case 5:
- Talk(SAY_SVALA_INTRO_1);
- ++introPhase;
- introTimer = 10000;
- break;
- case 6:
+ }
+ me->RemoveAllAuras();
+ me->UpdateEntry(NPC_SVALA_SORROWGRAVE);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ events.ScheduleEvent(EVENT_INTRO_SVALA_TALK_1, 10 * IN_MILLISECONDS, 0, INTRO);
+ break;
+ case EVENT_INTRO_SVALA_TALK_1:
+ Talk(SAY_SVALA_INTRO_1);
+ events.ScheduleEvent(EVENT_INTRO_ARTHAS_TALK_1, 3.2 * IN_MILLISECONDS, 0, INTRO);
+ break;
+ case EVENT_INTRO_ARTHAS_TALK_1:
+ if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID))
arthas->AI()->Talk(SAY_DIALOG_OF_ARTHAS_2);
- ++introPhase;
- introTimer = 7200;
- break;
- case 7:
- Talk(SAY_SVALA_INTRO_2);
- me->SetFacingTo(1.58f);
+ events.ScheduleEvent(EVENT_INTRO_SVALA_TALK_2, 7.2 * IN_MILLISECONDS, 0, INTRO);
+ break;
+ case EVENT_INTRO_SVALA_TALK_2:
+ Talk(SAY_SVALA_INTRO_2);
+ me->SetFacingTo(1.58f);
+ if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID))
arthas->SetVisible(false);
- ++introPhase;
- introTimer = 13800;
- break;
- case 8:
- {
- Position pos;
- pos.Relocate(me);
- pos.m_positionX = me->GetHomePosition().GetPositionX();
- pos.m_positionY = me->GetHomePosition().GetPositionY();
- pos.m_positionZ = 90.6065f;
- me->GetMotionMaster()->MoveLand(0, pos);
- me->SetDisableGravity(false, true);
- me->SetHover(true);
- ++introPhase;
- introTimer = 3000;
- break;
- }
- case 9:
- if (GameObject* mirror = ObjectAccessor::GetGameObject(*me, DATA_UTGARDE_MIRROR))
- mirror->SetGoState(GO_STATE_ACTIVE);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- arthas->DespawnOrUnsummon();
- arthasGUID = 0;
- Phase = NORMAL;
- break;
- }
- }
- else
- introTimer -= diff;
-
- return;
- }
-
- if (Phase == NORMAL)
- {
- if (!UpdateVictim())
- return;
-
- if (sinsterStrikeTimer <= diff)
- {
- DoCastVictim(SPELL_SINSTER_STRIKE);
- sinsterStrikeTimer = urand(5 * IN_MILLISECONDS, 9 * IN_MILLISECONDS);
- }
- else
- sinsterStrikeTimer -= diff;
-
- if (callFlamesTimer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
+ events.ScheduleEvent(EVENT_INTRO_RELOCATE_SVALA, 13.8 * IN_MILLISECONDS, 0, INTRO);
+ break;
+ case EVENT_INTRO_RELOCATE_SVALA:
{
- DoCast(target, SPELL_CALL_FLAMES);
- callFlamesTimer = urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
+ Position pos;
+ pos.Relocate(me);
+ pos.m_positionX = me->GetHomePosition().GetPositionX();
+ pos.m_positionY = me->GetHomePosition().GetPositionY();
+ pos.m_positionZ = 90.6065f;
+ me->GetMotionMaster()->MoveLand(0, pos);
+ me->SetDisableGravity(false, true);
+ me->SetHover(true);
+ events.ScheduleEvent(EVENT_INTRO_DESPAWN_ARTHAS, 3 * IN_MILLISECONDS, 0, INTRO);
+ break;
}
- }
- else
- callFlamesTimer -= diff;
-
- if (!sacrificed)
- {
- if (HealthBelowPct(50))
- {
+ case EVENT_INTRO_DESPAWN_ARTHAS:
+ if (GameObject* mirror = ObjectAccessor::GetGameObject(*me, DATA_UTGARDE_MIRROR))
+ mirror->SetGoState(GO_STATE_ACTIVE);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID))
+ arthas->DespawnOrUnsummon();
+ _arthasGUID = 0;
+ events.SetPhase(NORMAL);
+ _introCompleted = true;
+ events.ScheduleEvent(EVENT_SINISTER_STRIKE, 7 * IN_MILLISECONDS, 0, NORMAL);
+ events.ScheduleEvent(EVENT_CALL_FLAMES, urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS), 0, NORMAL);
+ break;
+ case EVENT_SINISTER_STRIKE:
+ DoCastVictim(SPELL_SINSTER_STRIKE);
+ events.ScheduleEvent(EVENT_SINISTER_STRIKE, urand(5 * IN_MILLISECONDS, 9 * IN_MILLISECONDS), 0, NORMAL);
+ break;
+ case EVENT_CALL_FLAMES:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
+ DoCast(target, SPELL_CALL_FLAMES);
+ events.ScheduleEvent(EVENT_CALL_FLAMES, urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS), 0, NORMAL);
+ break;
+ case EVENT_RITUAL_PREPARATION:
if (Unit* sacrificeTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 80.0f, true))
{
instance->SetData64(DATA_SACRIFICED_PLAYER, sacrificeTarget->GetGUID());
-
Talk(SAY_SACRIFICE_PLAYER);
-
DoCast(sacrificeTarget, SPELL_RITUAL_PREPARATION);
-
SetCombatMovement(false);
-
- Phase = SACRIFICING;
- sacrePhase = 0;
- sacrificeTimer = 1 * IN_MILLISECONDS;
-
DoCast(me, SPELL_RITUAL_OF_THE_SWORD);
- sacrificed = true;
}
- }
- }
-
- DoMeleeAttackIfReady();
- }
- else // SACRIFICING
- {
- if (sacrificeTimer <= diff)
- {
- switch (sacrePhase)
- {
- case 0:
- // spawn ritual channelers
- DoCast(me, SPELL_RITUAL_CHANNELER_1, true);
- DoCast(me, SPELL_RITUAL_CHANNELER_2, true);
- DoCast(me, SPELL_RITUAL_CHANNELER_3, true);
- ++sacrePhase;
- sacrificeTimer = 2 * IN_MILLISECONDS;
- break;
- case 1:
- me->StopMoving();
- me->GetMotionMaster()->MoveIdle();
- me->InterruptNonMeleeSpells(true);
- DoCast(me, SPELL_RITUAL_STRIKE_TRIGGER, true);
- ++sacrePhase;
- sacrificeTimer = 200;
- break;
- case 2:
- DoCast(me, SPELL_RITUAL_DISARM);
- ++sacrePhase;
- break;
- case 3:
- break;
- }
+ events.ScheduleEvent(EVENT_SPAWN_RITUAL_CHANNELERS, 1 * IN_MILLISECONDS, 0, SACRIFICING);
+ break;
+ case EVENT_SPAWN_RITUAL_CHANNELERS:
+ DoCast(me, SPELL_RITUAL_CHANNELER_1, true);
+ DoCast(me, SPELL_RITUAL_CHANNELER_2, true);
+ DoCast(me, SPELL_RITUAL_CHANNELER_3, true);
+ events.ScheduleEvent(EVENT_RITUAL_STRIKE, 2 * IN_MILLISECONDS, 0, SACRIFICING);
+ break;
+ case EVENT_RITUAL_STRIKE:
+ me->StopMoving();
+ me->GetMotionMaster()->MoveIdle();
+ me->InterruptNonMeleeSpells(true);
+ DoCast(me, SPELL_RITUAL_STRIKE_TRIGGER, true);
+ events.ScheduleEvent(EVENT_RITUAL_DISARM, 200, 0, SACRIFICING);
+ break;
+ case EVENT_RITUAL_DISARM:
+ DoCast(me, SPELL_RITUAL_DISARM);
+ break;
+ default:
+ break;
}
- else
- sacrificeTimer -= diff;
}
}
+
+ private:
+ uint64 _arthasGUID;
+ bool _sacrificed;
+ bool _introCompleted;
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE