diff options
Diffstat (limited to 'src')
6 files changed, 701 insertions, 768 deletions
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp index b70bda76d76..77c19422da0 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp @@ -58,19 +58,14 @@ enum Creatures NPC_STASIS_CONTROLLER = 26688 }; -struct Locations +Position const moveLocs[] = { - float x, y, z; -}; - -struct Locations moveLocs[]= -{ - {261.6f, -449.3f, 109.5f}, - {263.3f, -454.0f, 109.5f}, - {291.5f, -450.4f, 109.5f}, - {291.5f, -454.0f, 109.5f}, - {310.0f, -453.4f, 109.5f}, - {238.6f, -460.7f, 109.5f} + { 261.6f, -449.3f, 109.5f, 0.0f }, + { 263.3f, -454.0f, 109.5f, 0.0f }, + { 291.5f, -450.4f, 109.5f, 0.0f }, + { 291.5f, -454.0f, 109.5f, 0.0f }, + { 310.0f, -453.4f, 109.5f, 0.0f }, + { 238.6f, -460.7f, 109.5f, 0.0f } }; enum Phase @@ -83,21 +78,20 @@ enum Phase PHASE_NONE }; +enum Misc +{ + ACTION_NEXT_PHASE, +}; + class boss_palehoof : public CreatureScript { public: boss_palehoof() : CreatureScript("boss_palehoof") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE + struct boss_palehoofAI : public BossAI { - return new boss_palehoofAI(creature); - } - - struct boss_palehoofAI : public ScriptedAI - { - boss_palehoofAI(Creature* creature) : ScriptedAI(creature) + boss_palehoofAI(Creature* creature) : BossAI(creature, DATA_GORTOK_PALEHOOF) { - instance = creature->GetInstanceScript(); } uint32 uiArcingSmashTimer; @@ -108,10 +102,10 @@ public: uint8 AddCount; Phase Sequence[4]; - InstanceScript* instance; - void Reset() OVERRIDE { + _Reset(); + /// There is a good reason to store them like this, we are going to shuffle the order. for (uint32 i = PHASE_FRENZIED_WORGEN; i < PHASE_GORTOK_PALEHOOF; ++i) Sequence[i] = Phase(i); @@ -129,32 +123,15 @@ public: currentPhase = PHASE_NONE; - if (instance) - { - instance->SetData(DATA_GORTOK_PALEHOOF_EVENT, NOT_STARTED); - - Creature* temp = Unit::GetCreature((*me), instance->GetData64(DATA_NPC_FRENZIED_WORGEN)); - if (temp && !temp->IsAlive()) - temp->Respawn(); + for (uint8 i = DATA_FRENZIED_WORGEN; i <= DATA_FEROCIOUS_RHINO; ++i) + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(i))) + if (!temp->IsAlive()) + temp->Respawn(); - temp = Unit::GetCreature((*me), instance->GetData64(DATA_NPC_FEROCIOUS_RHINO)); - if (temp && !temp->IsAlive()) - temp->Respawn(); - - temp = Unit::GetCreature((*me), instance->GetData64(DATA_NPC_MASSIVE_JORMUNGAR)); - if (temp && !temp->IsAlive()) - temp->Respawn(); - - temp = Unit::GetCreature((*me), instance->GetData64(DATA_NPC_RAVENOUS_FURBOLG)); - if (temp && !temp->IsAlive()) - temp->Respawn(); - - GameObject* go = instance->instance->GetGameObject(instance->GetData64(DATA_GORTOK_PALEHOOF_SPHERE)); - if (go) - { - go->SetGoState(GO_STATE_READY); - go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - } + if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_GORTOK_PALEHOOF_SPHERE))) + { + go->SetGoState(GO_STATE_READY); + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); } } @@ -185,14 +162,9 @@ public: if (currentPhase != PHASE_GORTOK_PALEHOOF) return; - //Return since we have no target if (!UpdateVictim()) return; - Creature* temp = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_NPC_ORB) : 0); - if (temp && temp->IsAlive()) - temp->DisappearAndDie(); - if (uiArcingSmashTimer <= diff) { DoCast(me, SPELL_ARCING_SMASH); @@ -217,12 +189,8 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - //Talk(SAY_DEATH); - if (instance) - instance->SetData(DATA_GORTOK_PALEHOOF_EVENT, DONE); - Creature* temp = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_NPC_ORB) : 0); - if (temp && temp->IsAlive()) - temp->DisappearAndDie(); + _JustDied(); + //Talk(SAY_DEATH); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -230,28 +198,30 @@ public: Talk(SAY_SLAY); } - void NextPhase() + void DoAction(int32 actionId) OVERRIDE { + if (actionId != ACTION_NEXT_PHASE) + return; + if (currentPhase == PHASE_NONE) { - if (instance) - instance->SetData(DATA_GORTOK_PALEHOOF_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_GORTOK_PALEHOOF, IN_PROGRESS); - me->SummonCreature(NPC_STASIS_CONTROLLER, moveLocs[5].x, moveLocs[5].y, moveLocs[5].z, 0, TEMPSUMMON_CORPSE_DESPAWN); + if (Creature* orb = me->SummonCreature(NPC_STASIS_CONTROLLER, moveLocs[5], TEMPSUMMON_CORPSE_DESPAWN)) + orb->CastSpell(me, SPELL_ORB_VISUAL, true); } + Phase move = PHASE_NONE; if (AddCount >= DUNGEON_MODE(2, 4)) move = PHASE_GORTOK_PALEHOOF; else move = Sequence[AddCount++]; - //send orb to summon spot - Creature* pOrb = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_NPC_ORB) : 0); - if (pOrb && pOrb->IsAlive()) - { - if (currentPhase == PHASE_NONE) - pOrb->CastSpell(me, SPELL_ORB_VISUAL, true); - pOrb->GetMotionMaster()->MovePoint(move, moveLocs[move].x, moveLocs[move].y, moveLocs[move].z); - } + + // send orb to summon spot + if (Creature* orb = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_GORTOK_ORB))) + if (orb->IsAlive()) + orb->GetMotionMaster()->MovePoint(move, moveLocs[move]); + currentPhase = move; } @@ -263,6 +233,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetUtgardePinnacleAI<boss_palehoofAI>(creature); + } }; //ravenous furbolg's spells @@ -305,13 +279,12 @@ public: me->GetMotionMaster()->MoveTargetedHome(); - if (instance) - if (instance->GetData(DATA_GORTOK_PALEHOOF_EVENT) == IN_PROGRESS) - { - Creature* pPalehoof = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0); - if (pPalehoof && pPalehoof->IsAlive()) - CAST_AI(boss_palehoof::boss_palehoofAI, pPalehoof->AI())->Reset(); - } + if (instance->GetBossState(DATA_GORTOK_PALEHOOF) == IN_PROGRESS) + { + Creature* palehoof = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_GORTOK_PALEHOOF)); + if (palehoof && palehoof->IsAlive()) + palehoof->AI()->Reset(); + } } void UpdateAI(uint32 diff) OVERRIDE @@ -360,12 +333,8 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - { - Creature* pPalehoof = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0); - if (pPalehoof) - CAST_AI(boss_palehoof::boss_palehoofAI, pPalehoof->AI())->NextPhase(); - } + if (Creature* palehoof = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_GORTOK_PALEHOOF))) + palehoof->AI()->DoAction(ACTION_NEXT_PHASE); } void JustReachedHome() OVERRIDE @@ -418,13 +387,12 @@ public: me->GetMotionMaster()->MoveTargetedHome(); - if (instance) - if (instance->GetData(DATA_GORTOK_PALEHOOF_EVENT) == IN_PROGRESS) - { - Creature* pPalehoof = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0); - if (pPalehoof && pPalehoof->IsAlive()) - CAST_AI(boss_palehoof::boss_palehoofAI, pPalehoof->AI())->Reset(); - } + if (instance->GetBossState(DATA_GORTOK_PALEHOOF) == IN_PROGRESS) + { + Creature* palehoof = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_GORTOK_PALEHOOF)); + if (palehoof && palehoof->IsAlive()) + palehoof->AI()->Reset(); + } } void UpdateAI(uint32 diff) OVERRIDE @@ -470,17 +438,13 @@ public: DoStartMovement(who); } if (instance) - instance->SetData(DATA_GORTOK_PALEHOOF_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_GORTOK_PALEHOOF, IN_PROGRESS); } void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - { - Creature* pPalehoof = Unit::GetCreature((*me), instance->GetData64(DATA_GORTOK_PALEHOOF)); - if (pPalehoof) - CAST_AI(boss_palehoof::boss_palehoofAI, pPalehoof->AI())->NextPhase(); - } + if (Creature* palehoof = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_GORTOK_PALEHOOF))) + palehoof->AI()->DoAction(ACTION_NEXT_PHASE); } void JustReachedHome() OVERRIDE @@ -534,13 +498,12 @@ public: me->GetMotionMaster()->MoveTargetedHome(); - if (instance) - if (instance->GetData(DATA_GORTOK_PALEHOOF_EVENT) == IN_PROGRESS) - { - Creature* pPalehoof = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0); - if (pPalehoof && pPalehoof->IsAlive()) - CAST_AI(boss_palehoof::boss_palehoofAI, pPalehoof->AI())->Reset(); - } + if (instance->GetBossState(DATA_GORTOK_PALEHOOF) == IN_PROGRESS) + { + Creature* palehoof = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_GORTOK_PALEHOOF)); + if (palehoof && palehoof->IsAlive()) + palehoof->AI()->Reset(); + } } void UpdateAI(uint32 diff) OVERRIDE @@ -590,12 +553,8 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - { - Creature* pPalehoof = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0); - if (pPalehoof) - CAST_AI(boss_palehoof::boss_palehoofAI, pPalehoof->AI())->NextPhase(); - } + if (Creature* palehoof = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_GORTOK_PALEHOOF))) + palehoof->AI()->DoAction(ACTION_NEXT_PHASE); } void JustReachedHome() OVERRIDE @@ -654,13 +613,12 @@ public: me->GetMotionMaster()->MoveTargetedHome(); - if (instance) - if (instance->GetData(DATA_GORTOK_PALEHOOF_EVENT) == IN_PROGRESS) - { - Creature* pPalehoof = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0); - if (pPalehoof && pPalehoof->IsAlive()) - CAST_AI(boss_palehoof::boss_palehoofAI, pPalehoof->AI())->Reset(); - } + if (instance->GetBossState(DATA_GORTOK_PALEHOOF) == IN_PROGRESS) + { + Creature* palehoof = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_GORTOK_PALEHOOF)); + if (palehoof && palehoof->IsAlive()) + palehoof->AI()->Reset(); + } } void UpdateAI(uint32 diff) OVERRIDE @@ -711,12 +669,8 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - { - Creature* pPalehoof = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0); - if (pPalehoof) - CAST_AI(boss_palehoof::boss_palehoofAI, pPalehoof->AI())->NextPhase(); - } + if (Creature* palehoof = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_GORTOK_PALEHOOF))) + palehoof->AI()->DoAction(ACTION_NEXT_PHASE); } void JustReachedHome() OVERRIDE @@ -767,52 +721,76 @@ public: if (SummonTimer <= diff) { - if (currentPhase<5&¤tPhase >= 0) + uint8 nextBossId = 0; + switch (currentPhase) { - Creature* pNext = NULL; - switch (currentPhase) - { - case PHASE_FRENZIED_WORGEN: pNext = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_NPC_FRENZIED_WORGEN) : 0); break; - case PHASE_RAVENOUS_FURLBORG: pNext = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_NPC_RAVENOUS_FURBOLG) : 0); break; - case PHASE_MASSIVE_JORMUNGAR: pNext = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_NPC_MASSIVE_JORMUNGAR) : 0); break; - case PHASE_FEROCIOUS_RHINO: pNext = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_NPC_FEROCIOUS_RHINO) : 0); break; - case PHASE_GORTOK_PALEHOOF: pNext = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0); break; - default: break; - } - - if (pNext) - { - pNext->RemoveAurasDueToSpell(SPELL_FREEZE); - pNext->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1 | UNIT_FLAG_IMMUNE_TO_PC); - pNext->SetStandState(UNIT_STAND_STATE_STAND); - pNext->SetInCombatWithZone(); - pNext->Attack(pNext->SelectNearestTarget(100), true); - - } - currentPhase = PHASE_NONE; + case PHASE_FRENZIED_WORGEN: + nextBossId = DATA_FRENZIED_WORGEN; + break; + case PHASE_RAVENOUS_FURLBORG: + nextBossId = DATA_RAVENOUS_FURBOLG; + break; + case PHASE_MASSIVE_JORMUNGAR: + nextBossId = DATA_MASSIVE_JORMUNGAR; + break; + case PHASE_FEROCIOUS_RHINO: + nextBossId = DATA_FEROCIOUS_RHINO; + break; + case PHASE_GORTOK_PALEHOOF: + nextBossId = DATA_GORTOK_PALEHOOF; + break; + default: + return; } - } else SummonTimer -= diff; + + if (Creature* nextBoss = ObjectAccessor::GetCreature(*me, instance->GetData64(nextBossId))) + { + nextBoss->RemoveAurasDueToSpell(SPELL_FREEZE); + nextBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1 | UNIT_FLAG_IMMUNE_TO_PC); + nextBoss->SetStandState(UNIT_STAND_STATE_STAND); + nextBoss->SetInCombatWithZone(); + nextBoss->Attack(nextBoss->SelectNearestTarget(100), true); + } + currentPhase = PHASE_NONE; + + if (nextBossId == DATA_GORTOK_PALEHOOF) + me->DespawnOrUnsummon(); + } + else + SummonTimer -= diff; } void MovementInform(uint32 type, uint32 id) OVERRIDE { if (type != POINT_MOTION_TYPE) return; - if (id > 4) - return; - Creature* pNext = NULL; + + uint8 nextBossId = 0; switch (id) { - case PHASE_FRENZIED_WORGEN: pNext = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_NPC_FRENZIED_WORGEN) : 0); break; - case PHASE_RAVENOUS_FURLBORG: pNext = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_NPC_RAVENOUS_FURBOLG) : 0); break; - case PHASE_MASSIVE_JORMUNGAR: pNext = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_NPC_MASSIVE_JORMUNGAR) : 0); break; - case PHASE_FEROCIOUS_RHINO: pNext = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_NPC_FEROCIOUS_RHINO) : 0); break; - case PHASE_GORTOK_PALEHOOF: pNext = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0); break; - default: break; + case PHASE_FRENZIED_WORGEN: + nextBossId = DATA_FRENZIED_WORGEN; + break; + case PHASE_RAVENOUS_FURLBORG: + nextBossId = DATA_RAVENOUS_FURBOLG; + break; + case PHASE_MASSIVE_JORMUNGAR: + nextBossId = DATA_MASSIVE_JORMUNGAR; + break; + case PHASE_FEROCIOUS_RHINO: + nextBossId = DATA_FEROCIOUS_RHINO; + break; + case PHASE_GORTOK_PALEHOOF: + nextBossId = DATA_GORTOK_PALEHOOF; + break; + default: + return; } - if (pNext) - DoCast(pNext, SPELL_ORB_CHANNEL, false); - currentPhase = (Phase)id; + + if (Creature* nextBoss = ObjectAccessor::GetCreature(*me, instance->GetData64(nextBossId))) + DoCast(nextBoss, SPELL_ORB_CHANNEL, false); + + currentPhase = Phase(id); SummonTimer = 5000; } }; @@ -821,23 +799,25 @@ public: class go_palehoof_sphere : public GameObjectScript { -public: - go_palehoof_sphere() : GameObjectScript("go_palehoof_sphere") { } - - bool OnGossipHello(Player* /*player*/, GameObject* go) OVERRIDE - { - InstanceScript* instance = go->GetInstanceScript(); + public: + go_palehoof_sphere() : GameObjectScript("go_palehoof_sphere") { } - Creature* pPalehoof = Unit::GetCreature(*go, instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0); - if (pPalehoof && pPalehoof->IsAlive()) + bool OnGossipHello(Player* /*player*/, GameObject* go) OVERRIDE { - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - go->SetGoState(GO_STATE_ACTIVE); + InstanceScript* instance = go->GetInstanceScript(); + if (!instance) + return false; + + Creature* palehoof = ObjectAccessor::GetCreature(*go, instance->GetData64(DATA_GORTOK_PALEHOOF)); + if (palehoof && palehoof->IsAlive()) + { + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + go->SetGoState(GO_STATE_ACTIVE); - CAST_AI(boss_palehoof::boss_palehoofAI, pPalehoof->AI())->NextPhase(); + palehoof->AI()->DoAction(ACTION_NEXT_PHASE); + } + return true; } - return true; - } }; diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp index 08670af939a..01fcd9a665d 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp @@ -210,7 +210,7 @@ public: me->SummonCreature(NPC_GRAUF, Location[0].GetPositionX(), Location[0].GetPositionY(), Location[0].GetPositionZ(), 3.0f); if (instance) { - instance->SetData(DATA_SKADI_THE_RUTHLESS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_SKADI_THE_RUTHLESS, NOT_STARTED); instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); } } @@ -237,7 +237,7 @@ public: me->SetInCombatWithZone(); if (instance) { - instance->SetData(DATA_SKADI_THE_RUTHLESS_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_SKADI_THE_RUTHLESS, IN_PROGRESS); instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); me->GetMotionMaster()->MoveJump(Location[0].GetPositionX(), Location[0].GetPositionY(), Location[0].GetPositionZ(), 5.0f, 10.0f); me->SetWalk(false); @@ -412,7 +412,7 @@ public: Talk(SAY_DEATH); Summons.DespawnAll(); if (instance) - instance->SetData(DATA_SKADI_THE_RUTHLESS_EVENT, DONE); + instance->SetBossState(DATA_SKADI_THE_RUTHLESS, DONE); } void KilledUnit(Unit* /*victim*/) OVERRIDE diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp index 818631788b6..1ab39048df2 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp @@ -74,7 +74,6 @@ enum Yells enum Creatures { NPC_ARTHAS = 29280, // Image of Arthas - NPC_SVALA_SORROWGRAVE = 26668, // Svala after transformation NPC_RITUAL_CHANNELER = 27281, NPC_SPECTATOR = 26667, NPC_RITUAL_TARGET = 27327, @@ -82,11 +81,6 @@ enum Creatures NPC_SCOURGE_HULK = 26555 }; -enum GameObjects -{ - GO_UTGARDE_MIRROR = 191745 -}; - enum SvalaPhase { IDLE, @@ -101,191 +95,159 @@ enum Misc DATA_INCREDIBLE_HULK = 2043 }; -static const float spectatorWP[2][3] = +Position const spectatorWP[2] = { - {296.95f, -312.76f, 86.36f}, - {297.69f, -275.81f, 86.36f} + {296.95f, -312.76f, 86.36f, 0.0f }, + {297.69f, -275.81f, 86.36f, 0.0f } }; -static Position ArthasPos = { 295.81f, -366.16f, 92.57f, 1.58f }; +Position const ArthasPos = { 295.81f, -366.16f, 92.57f, 1.58f }; class boss_svala : public CreatureScript { -public: - boss_svala() : CreatureScript("boss_svala") { } - - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new boss_svalaAI(creature); - } + public: + boss_svala() : CreatureScript("boss_svala") { } - struct boss_svalaAI : public ScriptedAI - { - boss_svalaAI(Creature* creature) : ScriptedAI(creature), summons(creature) + struct boss_svalaAI : public BossAI { - instance = creature->GetInstanceScript(); - Phase = IDLE; - - me->ApplySpellImmune(0, IMMUNITY_ID, SPELL_RITUAL_STRIKE_EFF_1, true); - me->ApplySpellImmune(0, IMMUNITY_ID, SPELL_RITUAL_STRIKE_EFF_2, true); - } - - InstanceScript* instance; - SummonList summons; - SvalaPhase Phase; - - Position pos; - float x, y, z; + boss_svalaAI(Creature* creature) : BossAI(creature, DATA_SVALA_SORROWGRAVE) + { + Phase = IDLE; + } - uint32 introTimer; - uint8 introPhase; - uint8 sacrePhase; + SvalaPhase Phase; - TempSummon* arthas; - uint64 arthasGUID; + uint32 introTimer; + uint8 introPhase; + uint8 sacrePhase; - uint32 sinsterStrikeTimer; - uint32 callFlamesTimer; - uint32 sacrificeTimer; + uint64 arthasGUID; - bool sacrificed; + uint32 sinsterStrikeTimer; + uint32 callFlamesTimer; + uint32 sacrificeTimer; - void Reset() OVERRIDE - { - sacrificed = false; - SetCombatMovement(true); + bool sacrificed; - summons.DespawnAll(); - me->RemoveAllAuras(); + void Reset() OVERRIDE + { + _Reset(); + sacrificed = false; + SetCombatMovement(true); - if (Phase > NORMAL) - Phase = NORMAL; + if (Phase > NORMAL) + Phase = NORMAL; - me->SetDisableGravity(Phase == NORMAL); + me->SetDisableGravity(Phase == NORMAL); - introTimer = 1 * IN_MILLISECONDS; - introPhase = 0; - arthasGUID = 0; + introTimer = 1 * IN_MILLISECONDS; + introPhase = 0; + sacrePhase = 0; + arthasGUID = 0; - if (instance) - { - instance->SetData(DATA_SVALA_SORROWGRAVE_EVENT, NOT_STARTED); instance->SetData64(DATA_SACRIFICED_PLAYER, 0); } - } - void EnterCombat(Unit* /*who*/) OVERRIDE - { - Talk(SAY_AGGRO); - - sinsterStrikeTimer = 7 * IN_MILLISECONDS; - callFlamesTimer = urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS); - - if (instance) - instance->SetData(DATA_SVALA_SORROWGRAVE_EVENT, IN_PROGRESS); - } - - void JustSummoned(Creature* summon) OVERRIDE - { - if (summon->GetEntry() == NPC_RITUAL_CHANNELER) - summon->CastSpell(summon, SPELL_SUMMONED_VIS, true); - - summons.Summon(summon); - } + void EnterCombat(Unit* /*who*/) OVERRIDE + { + _EnterCombat(); + Talk(SAY_AGGRO); - void SummonedCreatureDespawn(Creature* summon) OVERRIDE - { - summons.Despawn(summon); - } + sinsterStrikeTimer = 7 * IN_MILLISECONDS; + callFlamesTimer = urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS); + } - void MoveInLineOfSight(Unit* who) OVERRIDE + void JustSummoned(Creature* summon) OVERRIDE + { + if (summon->GetEntry() == NPC_RITUAL_CHANNELER) + summon->CastSpell(summon, SPELL_SUMMONED_VIS, true); - { - if (!who) - return; + summons.Summon(summon); + } - if (Phase == IDLE && me->IsValidAttackTarget(who) && me->IsWithinDistInMap(who, 40)) + void MoveInLineOfSight(Unit* who) OVERRIDE { - Phase = INTRO; - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - - if (GameObject* mirror = GetClosestGameObjectWithEntry(me, GO_UTGARDE_MIRROR, 100.0f)) - mirror->SetGoState(GO_STATE_READY); + if (!who) + return; - if (Creature* arthas = me->SummonCreature(NPC_ARTHAS, ArthasPos, TEMPSUMMON_MANUAL_DESPAWN)) + if (Phase == IDLE && me->IsValidAttackTarget(who) && me->IsWithinDistInMap(who, 40)) { - arthas->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - arthasGUID = arthas->GetGUID(); - } - } - } + Phase = INTRO; + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - void KilledUnit(Unit* victim) OVERRIDE - { - if (victim != me) - Talk(SAY_SLAY); - } + if (GameObject* mirror = ObjectAccessor::GetGameObject(*me, DATA_UTGARDE_MIRROR)) + mirror->SetGoState(GO_STATE_READY); - void JustDied(Unit* /*killer*/) OVERRIDE - { - if (Phase == SACRIFICING) - SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); + 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(); + } + } + } - me->HandleEmoteCommand(EMOTE_ONESHOT_FLYDEATH); + void KilledUnit(Unit* who) OVERRIDE + { + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } - summons.DespawnAll(); + void JustDied(Unit* /*killer*/) OVERRIDE + { + if (Phase == SACRIFICING) + SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); - if (instance) - instance->SetData(DATA_SVALA_SORROWGRAVE_EVENT, DONE); + me->HandleEmoteCommand(EMOTE_ONESHOT_FLYDEATH); - Talk(SAY_DEATH); - } + _JustDied(); + Talk(SAY_DEATH); + } - void SpellHitTarget(Unit* /*target*/, const SpellInfo* spell) OVERRIDE - { - if (spell->Id == SPELL_RITUAL_STRIKE_EFF_1 && Phase != NORMAL && Phase != SVALADEAD) + void SpellHitTarget(Unit* /*target*/, SpellInfo const* spellInfo) OVERRIDE { - Phase = NORMAL; - SetCombatMovement(true); + if (spellInfo->Id == SPELL_RITUAL_STRIKE_EFF_1 && Phase != NORMAL && Phase != SVALADEAD) + { + Phase = NORMAL; + SetCombatMovement(true); - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 300.0f, true)) - me->GetMotionMaster()->MoveChase(target); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 300.0f, true)) + me->GetMotionMaster()->MoveChase(target); + } } - } - - void UpdateAI(uint32 diff) OVERRIDE - { - if (Phase == IDLE) - return; - if (Phase == INTRO) + void UpdateAI(uint32 diff) OVERRIDE { - if (introTimer <= diff) - { - Creature* arthas = Unit::GetCreature(*me, arthasGUID); - if (!arthas) - return; + if (Phase == IDLE) + return; - switch (introPhase) + if (Phase == INTRO) + { + if (introTimer <= diff) { - case 0: - Talk(SAY_SVALA_INTRO_0); - ++introPhase; - introTimer = 8100; - break; - case 1: - arthas->AI()->Talk(SAY_DIALOG_OF_ARTHAS_1); - ++introPhase; - introTimer = 10000; - break; - case 2: - arthas->CastSpell(me, SPELL_TRANSFORMING_CHANNEL, false); - pos.Relocate(me); - pos.m_positionZ += 8.0f; - me->GetMotionMaster()->MoveTakeoff(0, pos); - // spectators flee event - if (instance) + Creature* arthas = ObjectAccessor::GetCreature(*me, arthasGUID); + if (!arthas) + return; + + switch (introPhase) + { + case 0: + Talk(SAY_SVALA_INTRO_0); + ++introPhase; + introTimer = 8100; + break; + case 1: + arthas->AI()->Talk(SAY_DIALOG_OF_ARTHAS_1); + ++introPhase; + introTimer = 10000; + break; + case 2: { + 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) @@ -294,257 +256,258 @@ public: { (*itr)->SetStandState(UNIT_STAND_STATE_STAND); (*itr)->SetWalk(false); - (*itr)->GetMotionMaster()->MovePoint(1, spectatorWP[0][0], spectatorWP[0][1], spectatorWP[0][2]); + (*itr)->GetMotionMaster()->MovePoint(1, spectatorWP[0]); } } + + ++introPhase; + introTimer = 4200; + break; } - ++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); - 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: - arthas->AI()->Talk(SAY_DIALOG_OF_ARTHAS_2); - ++introPhase; - introTimer = 7200; - break; - case 7: - Talk(SAY_SVALA_INTRO_2); - me->SetFacingTo(1.58f); - arthas->SetVisible(false); - ++introPhase; - introTimer = 13800; - break; - case 8: - 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 = GetClosestGameObjectWithEntry(me, GO_UTGARDE_MIRROR, 100.0f)) - mirror->SetGoState(GO_STATE_ACTIVE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - arthas->DespawnOrUnsummon(); - arthasGUID = 0; - Phase = NORMAL; - break; + case 3: + me->CastSpell(me, SPELL_SVALA_TRANSFORMING1, false); + ++introPhase; + introTimer = 6200; + break; + case 4: + me->CastSpell(me, SPELL_SVALA_TRANSFORMING2, false); + 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: + arthas->AI()->Talk(SAY_DIALOG_OF_ARTHAS_2); + ++introPhase; + introTimer = 7200; + break; + case 7: + Talk(SAY_SVALA_INTRO_2); + me->SetFacingTo(1.58f); + 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; - } + else + introTimer -= diff; - if (Phase == NORMAL) - { - //Return since we have no target - 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 (Phase == NORMAL) { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + if (!UpdateVictim()) + return; + + if (sinsterStrikeTimer <= diff) { - DoCast(target, SPELL_CALL_FLAMES); - callFlamesTimer = urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS); + DoCastVictim(SPELL_SINSTER_STRIKE); + sinsterStrikeTimer = urand(5 * IN_MILLISECONDS, 9 * IN_MILLISECONDS); } - } - else callFlamesTimer -= diff; + else + sinsterStrikeTimer -= diff; - if (!sacrificed) - { - if (HealthBelowPct(50)) + if (callFlamesTimer <= diff) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + { + DoCast(target, SPELL_CALL_FLAMES); + callFlamesTimer = urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS); + } + } + else + callFlamesTimer -= diff; + + if (!sacrificed) { - if (Unit* sacrificeTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 80.0f, true)) + if (HealthBelowPct(50)) { - if (instance) + if (Unit* sacrificeTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 80.0f, true)) + { instance->SetData64(DATA_SACRIFICED_PLAYER, sacrificeTarget->GetGUID()); - Talk(SAY_SACRIFICE_PLAYER); + Talk(SAY_SACRIFICE_PLAYER); - DoCast(sacrificeTarget, SPELL_RITUAL_PREPARATION); + DoCast(sacrificeTarget, SPELL_RITUAL_PREPARATION); - SetCombatMovement(false); + SetCombatMovement(false); - Phase = SACRIFICING; - sacrePhase = 0; - sacrificeTimer = 1 * IN_MILLISECONDS; + Phase = SACRIFICING; + sacrePhase = 0; + sacrificeTimer = 1 * IN_MILLISECONDS; - DoCast(me, SPELL_RITUAL_OF_THE_SWORD); - sacrificed = true; + DoCast(me, SPELL_RITUAL_OF_THE_SWORD); + sacrificed = true; + } } } - } - DoMeleeAttackIfReady(); - } - else //SACRIFICING - { - if (sacrificeTimer <= diff) + DoMeleeAttackIfReady(); + } + else // SACRIFICING { - switch (sacrePhase) + if (sacrificeTimer <= diff) { - case 0: - // spawn ritual channelers - if (instance) - { + 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; + ++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; + } } + else + sacrificeTimer -= diff; } - else sacrificeTimer -= diff; } - } - }; + }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetUtgardePinnacleAI<boss_svalaAI>(creature); + } }; class npc_ritual_channeler : public CreatureScript { -public: - npc_ritual_channeler() : CreatureScript("npc_ritual_channeler") { } - - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_ritual_channelerAI(creature); - } + public: + npc_ritual_channeler() : CreatureScript("npc_ritual_channeler") { } - struct npc_ritual_channelerAI : public ScriptedAI - { - npc_ritual_channelerAI(Creature* creature) :ScriptedAI(creature) + struct npc_ritual_channelerAI : public ScriptedAI { - instance = creature->GetInstanceScript(); + npc_ritual_channelerAI(Creature* creature) : ScriptedAI(creature) + { + instance = creature->GetInstanceScript(); - SetCombatMovement(false); - } + SetCombatMovement(false); + } - InstanceScript* instance; - uint32 paralyzeTimer; + InstanceScript* instance; + uint32 paralyzeTimer; + + void Reset() OVERRIDE + { + paralyzeTimer = 1600; - void Reset() OVERRIDE - { - paralyzeTimer = 1600; - if (instance) if (IsHeroic()) DoCast(me, SPELL_SHADOWS_IN_THE_DARK); - } - - void UpdateAI(uint32 diff) OVERRIDE - { - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + } - if (paralyzeTimer <= diff) + void UpdateAI(uint32 diff) OVERRIDE { - if (instance) - if (Unit* victim = me->GetUnit(*me, instance->GetData64(DATA_SACRIFICED_PLAYER))) + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + if (paralyzeTimer <= diff) + { + if (Player* victim = ObjectAccessor::GetPlayer(*me, instance->GetData64(DATA_SACRIFICED_PLAYER))) DoCast(victim, SPELL_PARALYZE, false); - paralyzeTimer = 200; + paralyzeTimer = 200; + } + else + paralyzeTimer -= diff; } - else - paralyzeTimer -= diff; + }; + + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetUtgardePinnacleAI<npc_ritual_channelerAI>(creature); } - }; }; class npc_spectator : public CreatureScript { -public: - npc_spectator() : CreatureScript("npc_spectator") { } - - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_spectatorAI(creature); - } + public: + npc_spectator() : CreatureScript("npc_spectator") { } - struct npc_spectatorAI : public ScriptedAI - { - npc_spectatorAI(Creature* creature) : ScriptedAI(creature) { } + struct npc_spectatorAI : public ScriptedAI + { + npc_spectatorAI(Creature* creature) : ScriptedAI(creature) { } - void Reset() OVERRIDE { } + void Reset() OVERRIDE { } - void MovementInform(uint32 motionType, uint32 pointId) OVERRIDE - { - if (motionType == POINT_MOTION_TYPE) + void MovementInform(uint32 motionType, uint32 pointId) OVERRIDE { - if (pointId == 1) - me->GetMotionMaster()->MovePoint(2, spectatorWP[1][0], spectatorWP[1][1], spectatorWP[1][2]); - else if (pointId == 2) - me->DespawnOrUnsummon(1000); + if (motionType == POINT_MOTION_TYPE) + { + if (pointId == 1) + me->GetMotionMaster()->MovePoint(2, spectatorWP[1]); + else if (pointId == 2) + me->DespawnOrUnsummon(1000); + } } + }; + + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetUtgardePinnacleAI<npc_spectatorAI>(creature); } - }; }; class RitualTargetCheck { public: - explicit RitualTargetCheck(Unit* _caster) : caster(_caster) { } + explicit RitualTargetCheck() { } - bool operator() (WorldObject* unit) const + bool operator() (WorldObject* obj) const { - if (InstanceScript* instance = caster->GetInstanceScript()) - if (instance->GetData64(DATA_SACRIFICED_PLAYER) == unit->GetGUID()) + if (InstanceScript* instance = obj->GetInstanceScript()) + if (instance->GetData64(DATA_SACRIFICED_PLAYER) == obj->GetGUID()) return false; return true; } - - private: - Unit* caster; }; class spell_paralyze_pinnacle : public SpellScriptLoader @@ -558,7 +521,7 @@ class spell_paralyze_pinnacle : public SpellScriptLoader void FilterTargets(std::list<WorldObject*>& unitList) { - unitList.remove_if(RitualTargetCheck(GetCaster())); + unitList.remove_if(RitualTargetCheck()); } void Register() OVERRIDE @@ -635,7 +598,7 @@ class npc_scourge_hulk : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_scourge_hulkAI(creature); + return GetUtgardePinnacleAI<npc_scourge_hulkAI>(creature); } }; diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp index f592a4b2bb2..f4c306c726a 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp @@ -103,16 +103,10 @@ class boss_ymiron : public CreatureScript public: boss_ymiron() : CreatureScript("boss_ymiron") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE + struct boss_ymironAI : public BossAI { - return new boss_ymironAI(creature); - } - - struct boss_ymironAI : public ScriptedAI - { - boss_ymironAI(Creature* creature) : ScriptedAI(creature) + boss_ymironAI(Creature* creature) : BossAI(creature, DATA_KING_YMIRON) { - instance = creature->GetInstanceScript(); for (int i = 0; i < 4; ++i) m_uiActiveOrder[i] = i; for (int i = 0; i < 3; ++i) @@ -122,9 +116,6 @@ public: m_uiActiveOrder[i] = m_uiActiveOrder[r]; m_uiActiveOrder[r] = temp; } - - m_uiActivedCreatureGUID = 0; - m_uiOrbGUID = 0; } bool m_bIsWalking; @@ -155,10 +146,9 @@ public: uint64 m_uiActivedCreatureGUID; uint64 m_uiOrbGUID; - InstanceScript* instance; - void Reset() OVERRIDE { + _Reset(); m_bIsWalking = false; m_bIsPause = false; m_bIsActiveWithBJORN = false; @@ -182,19 +172,14 @@ public: m_uiHealthAmountModifier = 1; m_uiHealthAmountMultipler = DUNGEON_MODE(20, 25); - DespawnBoatGhosts(m_uiActivedCreatureGUID); - DespawnBoatGhosts(m_uiOrbGUID); - - if (instance) - instance->SetData(DATA_KING_YMIRON_EVENT, NOT_STARTED); + m_uiActivedCreatureGUID = 0; + m_uiOrbGUID = 0; } void EnterCombat(Unit* /*who*/) OVERRIDE { + _EnterCombat(); Talk(SAY_AGGRO); - - if (instance) - instance->SetData(DATA_KING_YMIRON_EVENT, IN_PROGRESS); } void SpellHitTarget(Unit* who, SpellInfo const* spell) OVERRIDE @@ -371,21 +356,17 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { + _JustDied(); Talk(SAY_DEATH); - - DespawnBoatGhosts(m_uiActivedCreatureGUID); - DespawnBoatGhosts(m_uiOrbGUID); - - if (instance) - instance->SetData(DATA_KING_YMIRON_EVENT, DONE); } - void KilledUnit(Unit* /*victim*/) OVERRIDE + void KilledUnit(Unit* who) OVERRIDE { - Talk(SAY_SLAY); + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); } - void DespawnBoatGhosts(uint64 m_uiCreatureGUID) + void DespawnBoatGhosts(uint64& m_uiCreatureGUID) { if (m_uiCreatureGUID) if (Creature* temp = Unit::GetCreature(*me, m_uiCreatureGUID)) @@ -395,14 +376,16 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetUtgardePinnacleAI<boss_ymironAI>(creature); + } }; class achievement_kings_bane : public AchievementCriteriaScript { public: - achievement_kings_bane() : AchievementCriteriaScript("achievement_kings_bane") - { - } + achievement_kings_bane() : AchievementCriteriaScript("achievement_kings_bane") { } bool OnCheck(Player* /*player*/, Unit* target) OVERRIDE { diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp index 4959b3a6b58..46fabe41086 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp @@ -19,246 +19,235 @@ #include "InstanceScript.h" #include "utgarde_pinnacle.h" -#define MAX_ENCOUNTER 4 - -/* Utgarde Pinnacle encounters: -0 - Svala Sorrowgrave -1 - Gortok Palehoof -2 - Skadi the Ruthless -3 - King Ymiron -*/ - -enum GameObjects +DoorData const doorData[] = { - ENTRY_SKADI_THE_RUTHLESS_DOOR = 192173, - ENTRY_KING_YMIRON_DOOR = 192174, - ENTRY_GORK_PALEHOOF_SPHERE = 188593 + { GO_SKADI_THE_RUTHLESS_DOOR, DATA_SKADI_THE_RUTHLESS, DOOR_TYPE_PASSAGE, BOUNDARY_W }, + { GO_KING_YMIRON_DOOR, DATA_KING_YMIRON, DOOR_TYPE_PASSAGE, BOUNDARY_N }, + { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END }; class instance_utgarde_pinnacle : public InstanceMapScript { -public: - instance_utgarde_pinnacle() : InstanceMapScript("instance_utgarde_pinnacle", 575) { } - - InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE - { - return new instance_pinnacle(map); - } - - struct instance_pinnacle : public InstanceScript - { - instance_pinnacle(Map* map) : InstanceScript(map) { } - - uint64 uiSvalaSorrowgrave; - uint64 uiGortokPalehoof; - uint64 uiSkadiTheRuthless; - uint64 uiKingYmiron; - - uint64 uiSkadiTheRuthlessDoor; - uint64 uiKingYmironDoor; - uint64 uiGortokPalehoofSphere; + public: + instance_utgarde_pinnacle() : InstanceMapScript(UPScriptName, 575) { } - uint64 uiFrenziedWorgen; - uint64 uiRavenousFurbolg; - uint64 uiFerociousRhino; - uint64 uiMassiveJormungar; - uint64 uiPalehoofOrb; - - uint64 uiSvala; - uint64 uiSacrificedPlayer; - - uint32 m_auiEncounter[MAX_ENCOUNTER]; - - std::string str_data; - - void Initialize() OVERRIDE + struct instance_utgarde_pinnacle_InstanceMapScript : public InstanceScript { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - m_auiEncounter[i] = NOT_STARTED; - - uiSvalaSorrowgrave = 0; - uiGortokPalehoof = 0; - uiSkadiTheRuthless = 0; - uiKingYmiron = 0; - - uiSkadiTheRuthlessDoor = 0; - uiKingYmironDoor = 0; - uiGortokPalehoofSphere = 0; + instance_utgarde_pinnacle_InstanceMapScript(Map* map) : InstanceScript(map) + { + SetBossNumber(EncounterCount); + LoadDoorData(doorData); - uiFrenziedWorgen = 0; - uiRavenousFurbolg = 0; - uiFerociousRhino = 0; - uiMassiveJormungar = 0; - uiPalehoofOrb = 0; + SvalaSorrowgraveGUID = 0; + GortokPalehoofGUID = 0; + SkadiTheRuthlessGUID = 0; + KingYmironGUID = 0; - uiSvala = 0; - uiSacrificedPlayer = 0; - } + UtgardeMirrorGUID = 0; + GortokPalehoofSphereGUID = 0; - bool IsEncounterInProgress() const OVERRIDE - { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - return true; + FrenziedWorgenGUID = 0; + RavenousFurbolgGUID = 0; + FerociousRhinoGUID = 0; + MassiveJormungarGUID = 0; + PalehoofOrbGUID = 0; - return false; - } + SvalaGUID = 0; + SacrificedPlayerGUID = 0; + } - void OnCreatureCreate(Creature* creature) OVERRIDE - { - switch (creature->GetEntry()) + void OnCreatureCreate(Creature* creature) OVERRIDE { - case BOSS_SVALA_SORROWGRAVE: uiSvalaSorrowgrave = creature->GetGUID(); break; - case BOSS_GORTOK_PALEHOOF: uiGortokPalehoof = creature->GetGUID(); break; - case BOSS_SKADI_RUTHLESS: uiSkadiTheRuthless = creature->GetGUID(); break; - case BOSS_KING_YMIRON: uiKingYmiron = creature->GetGUID(); break; - case NPC_FRENZIED_WORGEN: uiFrenziedWorgen = creature->GetGUID(); break; - case NPC_RAVENOUS_FURBOLG: uiRavenousFurbolg = creature->GetGUID(); break; - case NPC_MASSIVE_JORMUNGAR: uiMassiveJormungar = creature->GetGUID(); break; - case NPC_FEROCIOUS_RHINO: uiFerociousRhino = creature->GetGUID(); break; - case NPC_SVALA: uiSvala = creature->GetGUID(); break; - case NPC_PALEHOOF_ORB: uiPalehoofOrb = creature->GetGUID(); break; + switch (creature->GetEntry()) + { + case NPC_SVALA_SORROWGRAVE: + SvalaSorrowgraveGUID = creature->GetGUID(); + break; + case NPC_GORTOK_PALEHOOF: + GortokPalehoofGUID = creature->GetGUID(); + break; + case NPC_SKADI_THE_RUTHLESS: + SkadiTheRuthlessGUID = creature->GetGUID(); + break; + case NPC_KING_YMIRON: + KingYmironGUID = creature->GetGUID(); + break; + case NPC_FRENZIED_WORGEN: + FrenziedWorgenGUID = creature->GetGUID(); + break; + case NPC_RAVENOUS_FURBOLG: + RavenousFurbolgGUID = creature->GetGUID(); + break; + case NPC_MASSIVE_JORMUNGAR: + MassiveJormungarGUID = creature->GetGUID(); + break; + case NPC_FEROCIOUS_RHINO: + FerociousRhinoGUID = creature->GetGUID(); + break; + case NPC_SVALA: + SvalaGUID = creature->GetGUID(); + break; + case NPC_PALEHOOF_ORB: + PalehoofOrbGUID = creature->GetGUID(); + break; + default: + break; + } } - } - void OnGameObjectCreate(GameObject* go) OVERRIDE - { - switch (go->GetEntry()) + void OnGameObjectCreate(GameObject* go) OVERRIDE { - case ENTRY_SKADI_THE_RUTHLESS_DOOR: - uiSkadiTheRuthlessDoor = go->GetGUID(); - if (m_auiEncounter[2] == DONE) HandleGameObject(0, true, go); - break; - case ENTRY_KING_YMIRON_DOOR: - uiKingYmironDoor = go->GetGUID(); - if (m_auiEncounter[3] == DONE) HandleGameObject(0, true, go); - break; - case ENTRY_GORK_PALEHOOF_SPHERE: - uiGortokPalehoofSphere = go->GetGUID(); - if (m_auiEncounter[1] == DONE) - { - HandleGameObject(0, true, go); - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - } - break; + switch (go->GetEntry()) + { + case GO_UTGARDE_MIRROR: + UtgardeMirrorGUID = go->GetGUID(); + break; + case GO_GORTOK_PALEHOOF_SPHERE: + GortokPalehoofSphereGUID = go->GetGUID(); + if (GetBossState(DATA_GORTOK_PALEHOOF) == DONE) + { + HandleGameObject(0, true, go); + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + } + break; + case GO_SKADI_THE_RUTHLESS_DOOR: + case GO_KING_YMIRON_DOOR: + AddDoor(go, true); + break; + default: + break; + } } - } - void SetData(uint32 type, uint32 data) OVERRIDE - { - switch (type) + void OnGameObjectRemove(GameObject* go) OVERRIDE { - case DATA_SVALA_SORROWGRAVE_EVENT: - m_auiEncounter[0] = data; - break; - case DATA_GORTOK_PALEHOOF_EVENT: - m_auiEncounter[1] = data; - break; - case DATA_SKADI_THE_RUTHLESS_EVENT: - if (data == DONE) - HandleGameObject(uiSkadiTheRuthlessDoor, true); - m_auiEncounter[2] = data; - break; - case DATA_KING_YMIRON_EVENT: - if (data == DONE) - HandleGameObject(uiKingYmironDoor, true); - m_auiEncounter[3] = data; - break; + switch (go->GetEntry()) + { + case GO_SKADI_THE_RUTHLESS_DOOR: + case GO_KING_YMIRON_DOOR: + AddDoor(go, false); + break; + default: + break; + } } - if (data == DONE) - SaveToDB(); - } - - void SetData64(uint32 type, uint64 data) OVERRIDE - { - switch (type) + void SetData64(uint32 type, uint64 data) OVERRIDE { - case DATA_SACRIFICED_PLAYER: - uiSacrificedPlayer = data; - break; + switch (type) + { + case DATA_SACRIFICED_PLAYER: + SacrificedPlayerGUID = data; + break; + default: + break; + } } - } - uint32 GetData(uint32 type) const OVERRIDE - { - switch (type) + uint64 GetData64(uint32 type) const OVERRIDE { - case DATA_SVALA_SORROWGRAVE_EVENT: return m_auiEncounter[0]; - case DATA_GORTOK_PALEHOOF_EVENT: return m_auiEncounter[1]; - case DATA_SKADI_THE_RUTHLESS_EVENT: return m_auiEncounter[2]; - case DATA_KING_YMIRON_EVENT: return m_auiEncounter[3]; + switch (type) + { + case DATA_SVALA_SORROWGRAVE: + return SvalaSorrowgraveGUID; + case DATA_GORTOK_PALEHOOF: + return GortokPalehoofGUID; + case DATA_SKADI_THE_RUTHLESS: + return SkadiTheRuthlessGUID; + case DATA_KING_YMIRON: + return KingYmironGUID; + case DATA_FRENZIED_WORGEN: + return FrenziedWorgenGUID; + case DATA_RAVENOUS_FURBOLG: + return RavenousFurbolgGUID; + case DATA_MASSIVE_JORMUNGAR: + return MassiveJormungarGUID; + case DATA_FEROCIOUS_RHINO: + return FerociousRhinoGUID; + case DATA_GORTOK_ORB: + return PalehoofOrbGUID; + case DATA_GORTOK_PALEHOOF_SPHERE: + return GortokPalehoofSphereGUID; + case DATA_UTGARDE_MIRROR: + return UtgardeMirrorGUID; + case DATA_SVALA: + return SvalaGUID; + case DATA_SACRIFICED_PLAYER: + return SacrificedPlayerGUID; + default: + break; + } + + return 0; } - return 0; - } - uint64 GetData64(uint32 identifier) const OVERRIDE - { - switch (identifier) + std::string GetSaveData() OVERRIDE { - case DATA_SVALA_SORROWGRAVE: return uiSvalaSorrowgrave; - case DATA_GORTOK_PALEHOOF: return uiGortokPalehoof; - case DATA_SKADI_THE_RUTHLESS: return uiSkadiTheRuthless; - case DATA_KING_YMIRON: return uiKingYmiron; - case DATA_NPC_FRENZIED_WORGEN: return uiFrenziedWorgen; - case DATA_NPC_RAVENOUS_FURBOLG: return uiRavenousFurbolg; - case DATA_NPC_MASSIVE_JORMUNGAR: return uiMassiveJormungar; - case DATA_NPC_FEROCIOUS_RHINO: return uiFerociousRhino; - case DATA_NPC_ORB: return uiPalehoofOrb; - case DATA_SVALA: return uiSvala; - case DATA_GORTOK_PALEHOOF_SPHERE: return uiGortokPalehoofSphere; - case DATA_SACRIFICED_PLAYER: return uiSacrificedPlayer; + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + saveStream << "U P " << GetBossSaveData(); + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); } - return 0; - } + void Load(char const* str) OVERRIDE + { + if (!str) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } - std::string GetSaveData() OVERRIDE - { - OUT_SAVE_INST_DATA; + OUT_LOAD_INST_DATA(str); - std::ostringstream saveStream; - saveStream << "U P " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' - << m_auiEncounter[2] << ' ' << m_auiEncounter[3]; + char dataHead1, dataHead2; - str_data = saveStream.str(); + std::istringstream loadStream(str); + loadStream >> dataHead1 >> dataHead2; - OUT_SAVE_INST_DATA_COMPLETE; - return str_data; - } + if (dataHead1 == 'U' && dataHead2 == 'P') + { + for (uint32 i = 0; i < EncounterCount; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + SetBossState(i, EncounterState(tmpState)); + } + } + else + OUT_LOAD_INST_DATA_FAIL; - void Load(const char* in) OVERRIDE - { - if (!in) - { - OUT_LOAD_INST_DATA_FAIL; - return; + OUT_LOAD_INST_DATA_COMPLETE; } - OUT_LOAD_INST_DATA(in); + protected: + uint64 SvalaSorrowgraveGUID; + uint64 GortokPalehoofGUID; + uint64 SkadiTheRuthlessGUID; + uint64 KingYmironGUID; - char dataHead1, dataHead2; - uint16 data0, data1, data2, data3; + uint64 UtgardeMirrorGUID; + uint64 GortokPalehoofSphereGUID; - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3; + uint64 FrenziedWorgenGUID; + uint64 RavenousFurbolgGUID; + uint64 FerociousRhinoGUID; + uint64 MassiveJormungarGUID; - if (dataHead1 == 'U' && dataHead2 == 'P') - { - m_auiEncounter[0] = data0; - m_auiEncounter[1] = data1; - m_auiEncounter[2] = data2; - m_auiEncounter[3] = data3; + uint64 PalehoofOrbGUID; - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - m_auiEncounter[i] = NOT_STARTED; + uint64 SvalaGUID; + uint64 SacrificedPlayerGUID; + }; - } else OUT_LOAD_INST_DATA_FAIL; - - OUT_LOAD_INST_DATA_COMPLETE; + InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE + { + return new instance_utgarde_pinnacle_InstanceMapScript(map); } - }; }; void AddSC_instance_utgarde_pinnacle() diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h index 6166b7c4891..ddf1d1e512a 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h @@ -15,46 +15,64 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef DEF_PINNACLE_H -#define DEF_PINNACLE_H +#ifndef UTGARDE_PINNACLE_H_ +#define UTGARDE_PINNACLE_H_ -enum Data +#define UPScriptName "instance_utgarde_pinnacle" + +uint32 const EncounterCount = 4; + +enum DataTypes { - DATA_SVALA_SORROWGRAVE_EVENT, - DATA_GORTOK_PALEHOOF_EVENT, - DATA_SKADI_THE_RUTHLESS_EVENT, - DATA_KING_YMIRON_EVENT + // Encounter States/Boss GUIDs + DATA_SVALA_SORROWGRAVE = 0, + DATA_GORTOK_PALEHOOF = 1, + DATA_SKADI_THE_RUTHLESS = 2, + DATA_KING_YMIRON = 3, + + // Additional Data + DATA_UTGARDE_MIRROR = 4, + DATA_SVALA = 5, + DATA_SACRIFICED_PLAYER = 6, + + DATA_FRENZIED_WORGEN = 7, + DATA_RAVENOUS_FURBOLG = 8, + DATA_MASSIVE_JORMUNGAR = 9, + DATA_FEROCIOUS_RHINO = 10, + DATA_GORTOK_ORB = 11, + DATA_GORTOK_PALEHOOF_SPHERE = 12 }; -enum Data64 +enum CreatureIds { - DATA_SVALA, - DATA_SVALA_SORROWGRAVE, - DATA_GORTOK_PALEHOOF, - DATA_SKADI_THE_RUTHLESS, - DATA_NPC_GRAUF, - DATA_KING_YMIRON, - DATA_NPC_FRENZIED_WORGEN, - DATA_NPC_RAVENOUS_FURBOLG, - DATA_NPC_MASSIVE_JORMUNGAR, - DATA_NPC_FEROCIOUS_RHINO, - DATA_NPC_ORB, - DATA_GORTOK_PALEHOOF_SPHERE, - DATA_SACRIFICED_PLAYER + NPC_SVALA_SORROWGRAVE = 26668, + NPC_GORTOK_PALEHOOF = 26687, + NPC_SKADI_THE_RUTHLESS = 26693, + NPC_KING_YMIRON = 26861, + + // Svala + NPC_SVALA = 29281, + + // Gortok Palehoof + NPC_FRENZIED_WORGEN = 26683, + NPC_RAVENOUS_FURBOLG = 26684, + NPC_MASSIVE_JORMUNGAR = 26685, + NPC_FEROCIOUS_RHINO = 26686, + NPC_PALEHOOF_ORB = 26688 }; -enum CreatureID +enum GameObjectIds { - BOSS_SVALA_SORROWGRAVE = 26668, - BOSS_GORTOK_PALEHOOF = 26687, - BOSS_SKADI_RUTHLESS = 26693, - BOSS_KING_YMIRON = 26861, - NPC_FRENZIED_WORGEN = 26683, - NPC_RAVENOUS_FURBOLG = 26684, - NPC_MASSIVE_JORMUNGAR = 26685, - NPC_FEROCIOUS_RHINO = 26686, - NPC_SVALA = 29281, - NPC_PALEHOOF_ORB = 26688 + GO_GORTOK_PALEHOOF_SPHERE = 188593, + GO_UTGARDE_MIRROR = 191745, + GO_SKADI_THE_RUTHLESS_DOOR = 192173, + GO_KING_YMIRON_DOOR = 192174 }; -#endif +template<class AI> +AI* GetUtgardePinnacleAI(Creature* creature) +{ + return GetInstanceAI<AI>(creature, UPScriptName); +} + +#endif // UTGARDE_PINNACLE_H_ |