Skadi Rewrite

Hello everyone,

I know I’m rather new to this project, anyways rewrote Skadi The Ruthless. The encounter works, but you can shoot Grauf in every position.

Here is the link to the patch: http://pastebin.com/xjUj3mPY

The waypoints are taken from the old script and some spells from ArcEmu. I have no possibilities to get sniffed data, so i can’t check if these are the correct spells or waypoints. But it works…

I would be glad to hear some feedback, before I do a PR.

Greetings

Jump into irc and we will talk /emoticons/default_smile.png

irc.rizon.net #trinity

I see no credits in the patch

Tried to patch this and it didnt work, got an error while patching.

Do you have a saved file of this you can upload?

Skadi falls through the floor and you cannot target him at all while the event is running.

I was hoping to find a fix, but i just found a bunch of old threads of people talking about it.

This patch should work with TrinityCore rev. a793f2714605+ 2014-04-05 19:25:23 +0200

[SPOILER]>>

diff --git a/sql/updates/world/2014_04_04_R_world_misc.sql b/sql/updates/world/2014_04_04_R_world_misc.sql
new file mode 100644
index 0000000…a87e2cb
— /dev/null
+++ b/sql/updates/world/2014_04_04_R_world_misc.sql
@@ -0,0 +1,20 @@
+DELETE FROM creature WHERE guid=126052;
+DELETE FROM linked_respawn WHERE guid=126052;
+DELETE FROM creature_addon WHERE guid=126052;
+
+UPDATE creature_template SET ScriptName = ‘npc_grauf’ WHERE entry = 26893;
+
+DELETE FROM creature_text WHERE entry=26693 AND groupid=2 AND type=41;
+DELETE FROM creature_text WHERE entry=26693 AND groupid=4 AND type=41;
+INSERT INTO creature_text (entry, groupid, id, text, type, language, probability, emote, duration, sound, comment) VALUES
+(26893, 2, 0, ‘%s in within range of the harpoon launchers!’, 41, 0, 100, 0, 0, 0, ‘Grauf EMOTE_RANGE’);
+
+DELETE FROM spell_target_position WHERE id = 61790;
+INSERT INTO spell_target_position (id, effIndex, target_map, target_position_x, target_position_y, target_position_z, target_orientation) VALUES
+(‘61790’, ‘0’, ‘575’, ‘480.84’, ‘-511.95’, ‘104.72’, ‘2.71’);
+
+DELETE FROM spelldifficulty_dbc WHERE spellid0 = 50228;
+INSERT INTO spelldifficulty_dbc (id, spellid0, spellid1, spellid2, spellid3) VALUES
+(‘50228’, ‘50228’, ‘59322’, ‘0’, ‘0’);
+
+
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
index 7c42f75…577bf85 100644
— a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
@@ -123,7 +123,7 @@ public:

currentPhase = PHASE_NONE;

  • for (uint8 i = DATA_FRENZIED_WORGEN; i <= DATA_FEROCIOUS_RHINO; ++i)
  • for (uint8 i = DATA_NPC_FRENZIED_WORGEN; i <= DATA_NPC_FEROCIOUS_RHINO; ++i)
    if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(i)))
    if (!temp->IsAlive())
    temp->Respawn();
    @@ -219,7 +219,7 @@ public:
    move = Sequence[AddCount++];

// send orb to summon spot

  • if (Creature* orb = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_GORTOK_ORB)))
  • if (Creature* orb = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_NPC_ORB)))
    if (orb->IsAlive())
    orb->GetMotionMaster()->MovePoint(move, moveLocs[move]);

@@ -725,16 +725,16 @@ public:
switch (currentPhase)
{
case PHASE_FRENZIED_WORGEN:

  • nextBossId = DATA_FRENZIED_WORGEN;
  • nextBossId = DATA_NPC_FRENZIED_WORGEN;
    break;
    case PHASE_RAVENOUS_FURLBORG:
  • nextBossId = DATA_RAVENOUS_FURBOLG;
  • nextBossId = DATA_NPC_RAVENOUS_FURBOLG;
    break;
    case PHASE_MASSIVE_JORMUNGAR:
  • nextBossId = DATA_MASSIVE_JORMUNGAR;
  • nextBossId = DATA_NPC_MASSIVE_JORMUNGAR;
    break;
    case PHASE_FEROCIOUS_RHINO:
  • nextBossId = DATA_FEROCIOUS_RHINO;
  • nextBossId = DATA_NPC_FEROCIOUS_RHINO;
    break;
    case PHASE_GORTOK_PALEHOOF:
    nextBossId = DATA_GORTOK_PALEHOOF;
    @@ -769,16 +769,16 @@ public:
    switch (id)
    {
    case PHASE_FRENZIED_WORGEN:
  • nextBossId = DATA_FRENZIED_WORGEN;
  • nextBossId = DATA_NPC_FRENZIED_WORGEN;
    break;
    case PHASE_RAVENOUS_FURLBORG:
  • nextBossId = DATA_RAVENOUS_FURBOLG;
  • nextBossId = DATA_NPC_RAVENOUS_FURBOLG;
    break;
    case PHASE_MASSIVE_JORMUNGAR:
  • nextBossId = DATA_MASSIVE_JORMUNGAR;
  • nextBossId = DATA_NPC_MASSIVE_JORMUNGAR;
    break;
    case PHASE_FEROCIOUS_RHINO:
  • nextBossId = DATA_FEROCIOUS_RHINO;
  • nextBossId = DATA_NPC_FEROCIOUS_RHINO;
    break;
    case PHASE_GORTOK_PALEHOOF:
    nextBossId = DATA_GORTOK_PALEHOOF;
    diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
    index e9cf806…e39dd93 100644
    — a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
    +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
    @@ -1,29 +1,19 @@
    /*
    • Copyright (C) 2008-2014 TrinityCore
    • This program is free software; you can redistribute it and/or modify it
    • under the terms of the GNU General Public License as published by the
    • Free Software Foundation; either version 2 of the License, or (at your
    • option) any later version.
    • This program is distributed in the hope that it will be useful, but WITHOUT
    • ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    • FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
    • more details.
    • You should have received a copy of the GNU General Public License along
    • with this program. If not, see .
  • */

-/* Script Data Start
-SDName: Boss_Skadi
-SDAuthor: LordVanMartin, JohnHoliver
-SD%Complete: 90%
-SDComment:

  • After Unmount() he appears to still be flying even with SetFlying(false)

-SDCategory: Utgarde Pinnacle
-Script Data End /
+
Copyright (C) 2008-2014 TrinityCore
+*
+* This program is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License as published by the
+* Free Software Foundation; either version 2 of the License, or (at your
+* option) any later version.
+*
+* This program is distributed in the hope that it will be useful, but WITHOUT
+* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+* more details.
+*
+* You should have received a copy of the GNU General Public License along
+* with this program. If not, see .
+*/

#include “ScriptMgr.h”
#include “ScriptedCreature.h”
@@ -37,8 +27,8 @@ enum Yells
SAY_KILL = 1,
EMOTE_RANGE = 2,
SAY_DEATH = 3,

  • SAY_DRAKE_DEATH = 4,
  • EMOTE_BREATH = 5,
  • SAY_DRAKE_DEATH = 5,
  • //EMOTE_BREATH = 5,
    SAY_DRAKE_BREATH = 6
    };

@@ -54,90 +44,45 @@ static Position Location[]=
{341.740997f, -516.955017f, 104.66900f, 0}, // 5
{341.740997f, -516.955017f, 104.66900f, 0}, // 6
{341.740997f, -516.955017f, 104.66900f, 0}, // 7

  • // Triggers Left
  • {469.661f, -484.546f, 104.712f, 0}, // 8
  • {483.315f, -485.028f, 104.718f, 0}, // 9
  • {476.87f, -487.994f, 104.735f, 0}, //10
  • {477.512f, -497.772f, 104.728f, 0}, //11
  • {486.287f, -500.759f, 104.722f, 0}, //12
  • {480.1f, -503.895f, 104.722f, 0}, //13
  • {472.391f, -505.103f, 104.723f, 0}, //14
  • {478.885f, -510.803f, 104.723f, 0}, //15
  • {489.529f, -508.615f, 104.723f, 0}, //16
  • {484.272f, -508.589f, 104.723f, 0}, //17
  • {465.328f, -506.495f, 104.427f, 0}, //18
  • {456.885f, -508.104f, 104.447f, 0}, //19
  • {450.177f, -507.989f, 105.247f, 0}, //20
  • {442.273f, -508.029f, 104.813f, 0}, //21
  • {434.225f, -508.19f, 104.787f, 0}, //22
  • {423.902f, -508.525f, 104.274f, 0}, //23
  • {414.551f, -508.645f, 105.136f, 0}, //24
  • {405.787f, -508.755f, 104.988f, 0}, //25
  • {398.812f, -507.224f, 104.82f, 0}, //26
  • {389.702f, -506.846f, 104.729f, 0}, //27
  • {381.856f, -506.76f, 104.756f, 0}, //28
  • {372.881f, -507.254f, 104.779f, 0}, //29
  • {364.978f, -508.182f, 104.673f, 0}, //30
  • {357.633f, -508.075f, 104.647f, 0}, //31
  • {350.008f, -506.826f, 104.588f, 0}, //32
  • {341.69f, -506.77f, 104.499f, 0}, //33
  • {335.31f, -505.745f, 105.18f, 0}, //34
  • {471.178f, -510.74f, 104.723f, 0}, //35
  • {461.759f, -510.365f, 104.199f, 0}, //36
  • {424.07287f, -510.082916f, 104.711082f, 0}, //37
  • // Triggers Right
  • {489.46f, -513.297f, 105.413f, 0}, //38
  • {485.706f, -517.175f, 104.724f, 0}, //39
  • {480.98f, -519.313f, 104.724f, 0}, //40
  • {475.05f, -520.52f, 104.724f, 0}, //41
  • {482.97f, -512.099f, 104.724f, 0}, //42
  • {477.082f, -514.172f, 104.724f, 0}, //43
  • {468.991f, -516.691f, 104.724f, 0}, //44
  • {461.722f, -517.063f, 104.627f, 0}, //45
  • {455.88f, -517.681f, 104.707f, 0}, //46
  • {450.499f, -519.099f, 104.701f, 0}, //47
  • {444.889f, -518.963f, 104.82f, 0}, //48
  • {440.181f, -518.893f, 104.861f, 0}, //49
  • {434.393f, -518.758f, 104.891f, 0}, //50
  • {429.328f, -518.583f, 104.904f, 0}, //51
  • {423.844f, -518.394f, 105.004f, 0}, //52
  • {418.707f, -518.266f, 105.135f, 0}, //53
  • {413.377f, -518.085f, 105.153f, 0}, //54
  • {407.277f, -517.844f, 104.893f, 0}, //55
  • {401.082f, -517.443f, 104.723f, 0}, //56
  • {394.933f, -514.64f, 104.724f, 0}, //57
  • {388.917f, -514.688f, 104.734f, 0}, //58
  • {383.814f, -515.834f, 104.73f, 0}, //59
  • {377.887f, -518.653f, 104.777f, 0}, //60
  • {371.376f, -518.289f, 104.781f, 0}, //61
  • {365.669f, -517.822f, 104.758f, 0}, //62
  • {359.572f, -517.314f, 104.706f, 0}, //63
  • {353.632f, -517.146f, 104.647f, 0}, //64
  • {347.998f, -517.038f, 104.538f, 0}, //65
  • {341.803f, -516.98f, 104.584f, 0}, //66
  • {335.879f, -516.674f, 104.628f, 0}, //67
  • {329.871f, -515.92f, 104.711f, 0}, //68
    // Breach Zone
  • {485.4577f, -511.2515f, 115.3011f, 0}, //69
  • {435.1892f, -514.5232f, 118.6719f, 0}, //70
  • {413.9327f, -540.9407f, 138.2614f, 0}, //71
  • {485.4577f, -511.2515f, 115.3011f, 0}, //8
  • {435.1892f, -514.5232f, 118.6719f, 0}, //9
  • {413.9327f, -540.9407f, 138.2614f, 0}, //10
    };

-enum CombatPhase
+enum Phases
{

  • FLYING,
  • SKADI
  • PHASE_INTRO = 1,
  • PHASE_FLYING = 2,
  • PHASE_SHOOTABLE = 3,
  • PHASE_GROUND = 4
    +};

+enum Events
+{

  • EVENT_CRUSH = 1,
  • EVENT_POISONED_SPEAR = 2,
  • EVENT_WHIRLWIND = 3,
  • EVENT_MOUNT = 4,
  • EVENT_MOVE = 5,
  • EVENT_STOP_CLOUD = 6,
  • EVENT_SUMMON = 7
    };

enum Spells
{

  • // Skadi Spells
  • SPELL_CRUSH = 50234,
  • SPELL_POISONED_SPEAR = 50225, //isn’t being cast
  • SPELL_WHIRLWIND = 50228, //random target, but not the tank approx. every 20s
  • SPELL_RAPID_FIRE = 56570,
  • SPELL_HARPOON_DAMAGE = 56578,
  • // PHASE_INTRO
  • SPELL_RIDE_VEHICLE = 61791,
  • // PHASE_FLYING
  • SPELL_HARPOON_DAMAGE = 48642,
    SPELL_FREEZING_CLOUD = 47579,
  • SPELL_FREEZING_CLOUD_L = 47590,
  • SPELL_FREEZING_CLOUD_R = 47592,
  • SPELL_SKADI_TELEPORT = 61790,
  • // PHASE_GROUND
  • SPELL_CRUSH = 50234,
  • SPELL_POISONED_SPEAR = 50225, //isn’t being casted =/
  • SPELL_WHIRLWIND = 50228 //random target, but not the tank approx. every 20s
    };

enum Creatures
@@ -145,9 +90,7 @@ enum Creatures
NPC_YMIRJAR_WARRIOR = 26690,
NPC_YMIRJAR_WITCH_DOCTOR = 26691,
NPC_YMIRJAR_HARPOONER = 26692,

  • NPC_GRAUF = 26893,
  • NPC_TRIGGER = 28351,
  • DATA_MOUNT = 27043,
  • NPC_TRIGGER = 28351
    };

enum Achievments
@@ -160,14 +103,9 @@ class boss_skadi : public CreatureScript
public:
boss_skadi() : CreatureScript(“boss_skadi”) { }

  • CreatureAI* GetAI(Creature* creature) const OVERRIDE
  • struct boss_skadiAI : public BossAI
    {
  • return GetInstanceAI(creature);
  • }
  • struct boss_skadiAI : public ScriptedAI
  • {
  • boss_skadiAI(Creature* creature) : ScriptedAI(creature), Summons(me)
  • boss_skadiAI(Creature* creature) : BossAI(creature, DATA_SKADI_THE_RUTHLESS), Summons(me)
    {
    instance = creature->GetInstanceScript();
    m_uiGraufGUID = 0;
    @@ -178,284 +116,317 @@ public:
    uint64 m_uiGraufGUID;
    std::vector triggersGUID;
  • uint32 m_uiCrushTimer;
  • uint32 m_uiPoisonedSpearTimer;
  • uint32 m_uiWhirlwindTimer;
  • uint32 m_uiWaypointId;
  • uint32 m_uiMovementTimer;
  • uint32 m_uiMountTimer;
  • uint32 m_uiSummonTimer;
  • uint8 m_uiSpellHitCount;
  • bool m_bSaidEmote;
  • CombatPhase Phase;

void Reset() OVERRIDE
{

  • _Reset();
    triggersGUID.clear();
  • m_uiCrushTimer = 8000;
  • m_uiPoisonedSpearTimer = 10000;
  • m_uiWhirlwindTimer = 20000;
  • m_uiMountTimer = 3000;
  • m_uiWaypointId = 0;
  • m_bSaidEmote = false;
  • m_uiSpellHitCount = 0;
  • Phase = SKADI;
  • events.SetPhase(PHASE_INTRO);

Summons.DespawnAll();
me->SetSpeed(MOVE_FLIGHT, 3.0f);

  • if ((Unit::GetCreature(*me, m_uiGraufGUID) == NULL) && !me->IsMounted())
  • me->SummonCreature(NPC_GRAUF, Location[0].GetPositionX(), Location[0].GetPositionY(), Location[0].GetPositionZ(), 3.0f);
  • instance->SetBossState(DATA_SKADI_THE_RUTHLESS, NOT_STARTED);
  • instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
  • if ((Unit::GetCreature(*me, instance->GetData64(DATA_NPC_GRAUF)) == NULL) && !me->IsMounted())
  • me->SummonCreature(NPC_GRAUF, Location[0].GetPositionX(), Location[0].GetPositionY(), Location[0].GetPositionZ(), 3.0f);
  • if (instance)
  • instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
    }

void JustReachedHome() OVERRIDE
{

  • me->SetCanFly(false);
    me->Dismount();
    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
  • if (!Unit::GetCreature(*me, m_uiGraufGUID))
  • if (!Unit::GetCreature(*me, instance->GetData64(DATA_NPC_GRAUF)))
    me->SummonCreature(NPC_GRAUF, Location[0].GetPositionX(), Location[0].GetPositionY(), Location[0].GetPositionZ(), 3.0f);
    }

void EnterCombat(Unit* /who/) OVERRIDE
{

  • _EnterCombat();
    Talk(SAY_AGGRO);

me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);

  • events.SetPhase(PHASE_FLYING);
  • events.ScheduleEvent(EVENT_MOUNT, 1 * IN_MILLISECONDS);
  • Phase = FLYING;
  • m_uiMovementTimer = 1000;
  • m_uiSummonTimer = 10000;
  • me->SetInCombatWithZone();
  • 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);
  • m_uiMountTimer = 1000;
  • Summons.DespawnEntry(NPC_GRAUF);
  • if (instance)
  • instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
    }

void JustSummoned(Creature* summoned) OVERRIDE
{
switch (summoned->GetEntry())
{

  • case NPC_GRAUF:
  • m_uiGraufGUID = summoned->GetGUID();
  • break;
  • case NPC_YMIRJAR_WARRIOR:
  • case NPC_YMIRJAR_WITCH_DOCTOR:
  • case NPC_YMIRJAR_HARPOONER:
  • summoned->setActive(true);
  • summoned->SetInCombatWithZone();
  • if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
  • summoned->AI()->AttackStart(target);
  • break;
  • case NPC_TRIGGER:
  • summoned->CastSpell((Unit*)NULL, SPELL_FREEZING_CLOUD, true);
  • summoned->DespawnOrUnsummon(10*IN_MILLISECONDS);
  • break;
  • case NPC_YMIRJAR_WARRIOR:
  • case NPC_YMIRJAR_WITCH_DOCTOR:
  • case NPC_YMIRJAR_HARPOONER:
  • summoned->setActive(true);
  • summoned->SetInCombatWithZone();
  • if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
  • summoned->AI()->AttackStart(target);
  • break;
    }
    Summons.Summon(summoned);
    }

void SummonedCreatureDespawn(Creature* summoned) OVERRIDE
{

  • if (summoned->GetEntry() == NPC_GRAUF)
  • m_uiGraufGUID = 0;
    Summons.Despawn(summoned);
    }

void SpellHit(Unit* /caster/, const SpellInfo* spell) OVERRIDE
{

  • if (spell->Id == SPELL_HARPOON_DAMAGE)
  • if(spell->Id == SPELL_SKADI_TELEPORT)
    {
  • m_uiSpellHitCount++;
  • if (m_uiSpellHitCount >= 3)
  • {
  • Phase = SKADI;
  • me->SetCanFly(false);
  • me->Dismount();
  • if (Creature* pGrauf = me->SummonCreature(NPC_GRAUF, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3*IN_MILLISECONDS))
  • {
  • pGrauf->GetMotionMaster()->MoveFall();
  • pGrauf->HandleEmoteCommand(EMOTE_ONESHOT_FLYDEATH);
  • }
  • me->GetMotionMaster()->MoveJump(Location[4].GetPositionX(), Location[4].GetPositionY(), Location[4].GetPositionZ(), 5.0f, 10.0f);
  • me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
  • Talk(SAY_DRAKE_DEATH);
  • m_uiCrushTimer = 8000;
  • m_uiPoisonedSpearTimer = 10000;
  • m_uiWhirlwindTimer = 20000;
  • AttackStart(SelectTarget(SELECT_TARGET_RANDOM));
  • }
  • events.SetPhase(PHASE_GROUND);
  • events.ScheduleEvent(EVENT_CRUSH, 8000, 0, PHASE_GROUND);
  • events.ScheduleEvent(EVENT_POISONED_SPEAR, 10000, 0, PHASE_GROUND);
  • events.ScheduleEvent(EVENT_WHIRLWIND, 20000, 0, PHASE_GROUND);
  • me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE );
    }
    }
  • void UpdateAI(uint32 diff) OVERRIDE
  • void KilledUnit(Unit* victim) OVERRIDE
    {
  • switch (Phase)
  • {
  • case FLYING:
  • if (!UpdateVictim())
  • return;
  • if (me->GetPositionX() >= 519)
  • {
  • me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
  • if (!m_bSaidEmote)
  • {
  • Talk(EMOTE_RANGE);
  • m_bSaidEmote = true;
  • }
  • }
  • else
  • {
  • me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
  • m_bSaidEmote = false;
  • }
  • if (m_uiMountTimer && m_uiMountTimer <= diff)
  • {
  • me->Mount(DATA_MOUNT);
  • me->SetCanFly(true);
  • m_uiMountTimer = 0;
  • } else m_uiMountTimer -= diff;
  • if(victim->GetTypeId() == TYPEID_PLAYER)
  • Talk(SAY_KILL);
  • }
  • if (m_uiSummonTimer <= diff)
  • {
  • SpawnMobs();
  • m_uiSummonTimer = 25000;
  • } else m_uiSummonTimer -= diff;
  • void JustDied(Unit* /killer/) OVERRIDE
  • {
  • Talk(SAY_DEATH);
  • _JustDied();
  • }
  • if (m_uiMovementTimer <= diff)
  • {
  • switch (m_uiWaypointId)
  • {
  • case 0:
  • me->GetMotionMaster()->MovePoint(0, Location[1].GetPositionX(), Location[1].GetPositionY(), Location[1].GetPositionZ());
  • m_uiMovementTimer = 5000;
  • break;
  • case 1:
  • me->GetMotionMaster()->MovePoint(0, Location[2].GetPositionX(), Location[2].GetPositionY(), Location[2].GetPositionZ());
  • m_uiMovementTimer = 2000;
  • break;
  • case 2:
  • me->GetMotionMaster()->MovePoint(0, Location[3].GetPositionX(), Location[3].GetPositionY(), Location[3].GetPositionZ());
  • m_uiMovementTimer = 15000;
  • break;
  • case 3:
  • me->GetMotionMaster()->MovePoint(0, Location[69].GetPositionX(), Location[69].GetPositionY(), Location[69].GetPositionZ());
  • Talk(SAY_DRAKE_BREATH);
  • Talk(EMOTE_BREATH);
  • m_uiMovementTimer = 2500;
  • break;
  • case 4:
  • me->GetMotionMaster()->MovePoint(0, Location[70].GetPositionX(), Location[70].GetPositionY(), Location[70].GetPositionZ());
  • m_uiMovementTimer = 2000;
  • SpawnTrigger();
  • break;
  • case 5:
  • me->GetMotionMaster()->MovePoint(0, Location[71].GetPositionX(), Location[71].GetPositionY(), Location[71].GetPositionZ());
  • m_uiMovementTimer = 3000;
  • break;
  • case 6:
  • me->GetMotionMaster()->MovePoint(0, Location[3].GetPositionX(), Location[3].GetPositionY(), Location[3].GetPositionZ());
  • m_uiWaypointId = 2;
  • m_uiMovementTimer = 15000;
  • break;
  • }
  • m_uiWaypointId++;
  • } else m_uiMovementTimer -= diff;
  • break;
  • case SKADI:
  • //Return since we have no target
  • if (!UpdateVictim())
  • return;
  • void UpdateAI(uint32 diff) OVERRIDE
  • {
  • events.Update(diff);
  • if (m_uiCrushTimer <= diff)
  • {
  • DoCastVictim(SPELL_CRUSH);
  • m_uiCrushTimer = 8000;
  • } else m_uiCrushTimer -= diff;
  • if((events.IsInPhase(PHASE_FLYING) || events.IsInPhase(PHASE_GROUND)) && !UpdateVictim())
  • return;
  • if (m_uiPoisonedSpearTimer <= diff)
  • {
  • if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
  • DoCast(target, SPELL_POISONED_SPEAR);
  • m_uiPoisonedSpearTimer = 10000;
  • } else m_uiPoisonedSpearTimer -= diff;
  • if(events.IsInPhase(PHASE_GROUND))
  • DoMeleeAttackIfReady();
  • if (m_uiWhirlwindTimer <= diff)
  • {
  • DoCastAOE(SPELL_WHIRLWIND);
  • m_uiWhirlwindTimer = 20000;
  • } else m_uiWhirlwindTimer -= diff;
  • while (uint32 eventId = events.ExecuteEvent())
  • {
  • switch (eventId)
  • {
  • case EVENT_MOUNT:
  • me->CastSpell(me->GetUnit(*me, instance->GetData64(DATA_NPC_GRAUF)), SPELL_RIDE_VEHICLE);
  • events.SetPhase(PHASE_FLYING);
  • events.ScheduleEvent(EVENT_SUMMON, 10000, 0, PHASE_FLYING);
  • break;
  • case EVENT_SUMMON:
  • SpawnMobs();
  • events.ScheduleEvent(EVENT_SUMMON, 20000, 0, PHASE_FLYING); //20000
  • break;
  • case EVENT_CRUSH:
  • DoCastVictim(SPELL_CRUSH);
  • events.ScheduleEvent(EVENT_CRUSH, 8000, 0, PHASE_GROUND);
  • break;
  • case EVENT_POISONED_SPEAR:
  • if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
  • DoCast(target, SPELL_POISONED_SPEAR);
  • events.ScheduleEvent(EVENT_POISONED_SPEAR, 10000, 0, PHASE_GROUND);
  • break;
  • case EVENT_WHIRLWIND:
  • DoCastAOE(SPELL_WHIRLWIND);
  • events.ScheduleEvent(EVENT_WHIRLWIND, 23000, 0, PHASE_GROUND);
  • break;
  • }
  • }
  • }
  • DoMeleeAttackIfReady();
  • void SpawnMobs()
  • {
  • for (uint8 i = 0; i < DUNGEON_MODE(5, 6); ++i)
  • {
  • switch (urand(0, 2))
  • {
  • case 0:
  • me->SummonCreature(NPC_YMIRJAR_WARRIOR, SpawnLoc.GetPositionX()+rand()%5, SpawnLoc.GetPositionY()+rand()%5, SpawnLoc.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
  • break;
  • case 1:
  • me->SummonCreature(NPC_YMIRJAR_WITCH_DOCTOR, SpawnLoc.GetPositionX()+rand()%5, SpawnLoc.GetPositionY()+rand()%5, SpawnLoc.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
    break;
  • case 2:
  • me->SummonCreature(NPC_YMIRJAR_HARPOONER, SpawnLoc.GetPositionX()+rand()%5, SpawnLoc.GetPositionY()+rand()%5, SpawnLoc.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
  • break;
  • }
    }
    }
  • };
  • CreatureAI* GetAI(Creature* creature) const OVERRIDE
  • {
  • return new boss_skadiAI(creature);
  • }
    +};
  • void JustDied(Unit* /killer/) OVERRIDE
    +class npc_grauf : public CreatureScript
    +{
    +public:
  • npc_grauf() : CreatureScript(“npc_grauf”) { }
  • struct npc_graufAI : public ScriptedAI
  • {
  • npc_graufAI(Creature* creature) : ScriptedAI(creature)
    {
  • Talk(SAY_DEATH);
  • Summons.DespawnAll();
  • instance->SetBossState(DATA_SKADI_THE_RUTHLESS, DONE);
  • SetCombatMovement(false);
  • instance = me->GetInstanceScript();
    }
  • void KilledUnit(Unit* who) OVERRIDE
  • InstanceScript* instance;
  • EventMap events;
  • uint32 m_uiWaypointId;
  • std::list CloudTriggerList;
  • uint8 harpoonsHit;
  • void Reset() OVERRIDE
    {
  • if (who->GetTypeId() == TYPEID_PLAYER)
  • Talk(SAY_KILL);
  • events.SetPhase(PHASE_INTRO);
  • m_uiWaypointId = 0;
  • harpoonsHit = 0;
    }
  • void SpawnMobs()
  • void JustReachedHome() OVERRIDE
    {
  • for (uint8 i = 0; i < DUNGEON_MODE(5, 6); ++i)
  • if(Creature* pSkadi = Unit::GetCreature(*me, DATA_SKADI_THE_RUTHLESS))
    {
  • switch (urand(0, 2))
  • pSkadi->AI()->EnterEvadeMode();
  • }
  • me->SetCanFly(false);
  • }
  • void SpellHit(Unit* /caster/, const SpellInfo* spell) OVERRIDE
  • {
  • if(!instance)
  • return;
  • if(spell->Id == SPELL_HARPOON_DAMAGE)
  • {
  • if(me->GetHealth() <= me->GetMaxHealth() * (IsHeroic() ? 0.17f : 0.27f))
    {
  • case 0:
  • me->SummonCreature(NPC_YMIRJAR_WARRIOR, SpawnLoc.GetPositionX()+rand()%5, SpawnLoc.GetPositionY()+rand()%5, SpawnLoc.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
  • break;
  • if(Creature* pSkadi = Unit::GetCreature(*me, instance->GetData64(DATA_SKADI_THE_RUTHLESS)))
  • {
  • me->RemoveAllAuras();
  • pSkadi->CastSpell(pSkadi, SPELL_SKADI_TELEPORT, true);
  • pSkadi->AI()->Talk(SAY_DRAKE_DEATH);
  • }
  • }
  • me->DealDamage(me, me->GetMaxHealth() * (IsHeroic() ? 0.17f : 0.25f), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false);
  • harpoonsHit++;
  • }
  • case 1:
  • me->SummonCreature(NPC_YMIRJAR_WITCH_DOCTOR, SpawnLoc.GetPositionX()+rand()%5, SpawnLoc.GetPositionY()+rand()%5, SpawnLoc.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
  • break;
  • if(spell->Id == SPELL_RIDE_VEHICLE)
  • {
  • events.SetPhase(PHASE_FLYING);
  • events.ScheduleEvent(EVENT_MOVE, 1000, 0, PHASE_FLYING);
  • me->SetCanFly(true);
  • me->SetDisableGravity(true);
  • me->SetHover(true);
  • me->SetWalk(false);
  • }
  • }
  • case 2:
  • me->SummonCreature(NPC_YMIRJAR_HARPOONER, SpawnLoc.GetPositionX()+rand()%5, SpawnLoc.GetPositionY()+rand()%5, SpawnLoc.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
  • break;
  • void CastFreezingCloud(bool triggerLeft) {
  • me->GetCreatureListWithEntryInGrid(CloudTriggerList, NPC_TRIGGER, 200.0f);
  • if(!CloudTriggerList.empty())
  • {
  • for (std::list::const_iterator itr = CloudTriggerList.begin(); itr != CloudTriggerList.end(); ++itr)
  • {
  • if (Creature* trigger = *itr)
  • {
  • if (trigger->GetPositionY() > -511.0f && triggerLeft == true)
  • trigger->CastSpell(trigger, SPELL_FREEZING_CLOUD, true);
  • else if (trigger->GetPositionY() < -511.0f && triggerLeft == false)
  • trigger->CastSpell(trigger, SPELL_FREEZING_CLOUD, true);
  • }
    }
    }
    }
  • void SpawnTrigger()
  • void UpdateAI(uint32 diff) OVERRIDE
    {
  • uint8 iStart = 0, iEnd = 0;
  • switch (urand(0, 1))
  • events.Update(diff);
  • /*if (me->GetPositionX() >= 519)
  • //{
  • // me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
  • // Talk(EMOTE_RANGE);
  • //}
  • //else
  • //{
  • // me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
  • } */
  • while (uint32 eventId = events.ExecuteEvent())
    {
  • case 0:
  • iStart = 8;
  • iEnd = 37;
  • break;
  • case 1:
  • iStart = 38;
  • iEnd = 68;
  • switch (eventId)
  • {
  • case EVENT_MOVE:
  • switch (m_uiWaypointId)
  • {
  • case 0:
  • me->GetMotionMaster()->MovePoint(0, Location[1].GetPositionX(), Location[1].GetPositionY(), Location[1].GetPositionZ());
  • events.ScheduleEvent(EVENT_MOVE, 5*IN_MILLISECONDS, 0, PHASE_FLYING);
  • break;
  • case 1:
  • me->GetMotionMaster()->MovePoint(0, Location[2].GetPositionX(), Location[2].GetPositionY(), Location[2].GetPositionZ());
  • events.ScheduleEvent(EVENT_MOVE, 2*IN_MILLISECONDS, 0, PHASE_FLYING);
  • break;
  • case 2:
  • me->GetMotionMaster()->MovePoint(0, Location[3].GetPositionX(), Location[3].GetPositionY(), Location[3].GetPositionZ());
  • events.ScheduleEvent(EVENT_MOVE, 1.5*IN_MILLISECONDS, 0, PHASE_FLYING);
  • break;
  • case 3:
  • me->GetMotionMaster()->MovePoint(0, Location[8].GetPositionX(), Location[8].GetPositionY(), Location[8].GetPositionZ());
  • if(Creature* pSkadi = Unit::GetCreature(*me, instance->GetData64(DATA_SKADI_THE_RUTHLESS)))
  • {
  • pSkadi->AI()->Talk(SAY_DRAKE_BREATH);
  • }
  • events.ScheduleEvent(EVENT_MOVE, 2.5*IN_MILLISECONDS, 0, PHASE_FLYING);
  • break;
  • case 4:
  • me->GetMotionMaster()->MovePoint(0, Location[9].GetPositionX(), Location[9].GetPositionY(), Location[9].GetPositionZ());
  • switch(urand(0,1))
  • {
  • case 0 :
  • DoCast(SPELL_FREEZING_CLOUD_L);
  • CastFreezingCloud(true);
  • break;
  • case 1 :
  • DoCast(SPELL_FREEZING_CLOUD_R);
  • CastFreezingCloud(false);
  • break;
  • }
  • events.ScheduleEvent(EVENT_STOP_CLOUD, 5*IN_MILLISECONDS, 0, PHASE_FLYING);
  • events.ScheduleEvent(EVENT_MOVE, 2*IN_MILLISECONDS, 0, PHASE_FLYING);
  • break;
  • case 5:
  • me->GetMotionMaster()->MovePoint(0, Location[10].GetPositionX(), Location[10].GetPositionY(), Location[10].GetPositionZ());
  • events.ScheduleEvent(EVENT_MOVE, 3*IN_MILLISECONDS, 0, PHASE_FLYING);
  • break;
  • case 6:
  • me->GetMotionMaster()->MovePoint(0, Location[3].GetPositionX(), Location[3].GetPositionY(), Location[3].GetPositionZ());
  • m_uiWaypointId = 2;
  • events.ScheduleEvent(EVENT_MOVE, 15*IN_MILLISECONDS, 0, PHASE_FLYING);
  • break;
  • }
  • m_uiWaypointId++;
    break;
  • default:
  • case EVENT_STOP_CLOUD:
  • me->RemoveAurasDueToSpell(SPELL_FREEZING_CLOUD_L);
  • me->RemoveAurasDueToSpell(SPELL_FREEZING_CLOUD_R);
    break;
  • }
    }
  • for (uint32 i = iStart; i < iEnd; ++i)
  • me->SummonCreature(NPC_TRIGGER, Location[i]);
    }
    };
  • CreatureAI* GetAI(Creature* creature) const OVERRIDE
  • {
  • return new npc_graufAI(creature);
  • }
    };

class go_harpoon_launcher : public GameObjectScript
@@ -466,19 +437,17 @@ public:
bool OnGossipHello(Player* player, GameObject* go) OVERRIDE
{
InstanceScript* instance = go->GetInstanceScript();
+
if (!instance)
return false;

  • if (Creature* pSkadi = Unit::GetCreature(*go, instance->GetData64(DATA_SKADI_THE_RUTHLESS)))
  • player->CastSpell(pSkadi, SPELL_RAPID_FIRE, true);

return false;
}

};

void AddSC_boss_skadi()
{
new boss_skadi();

  • new npc_grauf();
    new go_harpoon_launcher();
    -}
    +}
    No newline at end of file
    diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
    index 2a24b11…f92433a 100644
    — a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
    +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
    @@ -181,7 +181,7 @@ class boss_svala : public CreatureScript
    events.SetPhase(INTRO);
    me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  • if (GameObject* mirror = ObjectAccessor::GetGameObject(*me, DATA_UTGARDE_MIRROR))
  • if (GameObject* mirror = ObjectAccessor::GetGameObject(*me, GO_UTGARDE_MIRROR))
    mirror->SetGoState(GO_STATE_READY);

if (Creature* arthas = me->SummonCreature(NPC_ARTHAS, ArthasPos, TEMPSUMMON_MANUAL_DESPAWN))
@@ -324,7 +324,7 @@ class boss_svala : public CreatureScript
break;
}
case EVENT_INTRO_DESPAWN_ARTHAS:

  • if (GameObject* mirror = ObjectAccessor::GetGameObject(*me, DATA_UTGARDE_MIRROR))
  • if (GameObject* mirror = ObjectAccessor::GetGameObject(me, GO_UTGARDE_MIRROR))
    mirror->SetGoState(GO_STATE_ACTIVE);
    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
    if (Creature
    arthas = ObjectAccessor::GetCreature(me, _arthasGUID))
    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 5068abd…8d2082f 100644
    — a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp
    +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp
    @@ -1,256 +1,226 @@
    /
    • Copyright (C) 2008-2014 TrinityCore
    • This program is free software; you can redistribute it and/or modify it
    • under the terms of the GNU General Public License as published by the
    • Free Software Foundation; either version 2 of the License, or (at your
    • option) any later version.
    • This program is distributed in the hope that it will be useful, but WITHOUT
    • ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    • FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
    • more details.
    • You should have received a copy of the GNU General Public License along
    • with this program. If not, see .
  • */

-#include “ScriptMgr.h”
+* Copyright (C) 2008-2014 TrinityCore
+*
+* This program is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License as published by the
+* Free Software Foundation; either version 2 of the License, or (at your
+* option) any later version.
+*
+* This program is distributed in the hope that it will be useful, but WITHOUT
+* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+* more details.
+*
+* You should have received a copy of the GNU General Public License along
+* with this program. If not, see .
+*/
+
+//#include “ScriptMgr.h”
#include “InstanceScript.h”
#include “utgarde_pinnacle.h”

+/* Utgarde Pinnacle encounters:
+0 - Svala Sorrowgrave
+1 - Gortok Palehoof
+2 - Skadi the Ruthless
+3 - King Ymiron
+*/
+
DoorData const doorData[] =
{

  • { 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
  • { GO_SKADI_THE_RUTHLESS_DOOR, DATA_SKADI_THE_RUTHLESS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
  • { GO_KING_YMIRON_DOOR, DATA_KING_YMIRON, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
  • { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
    };

class instance_utgarde_pinnacle : public InstanceMapScript
{

  • public:
  • instance_utgarde_pinnacle() : InstanceMapScript(UPScriptName, 575) { }
  • struct instance_utgarde_pinnacle_InstanceMapScript : public InstanceScript
  • {
  • instance_utgarde_pinnacle_InstanceMapScript(Map* map) : InstanceScript(map)
  • {
  • SetBossNumber(EncounterCount);
  • LoadDoorData(doorData);
  • SvalaSorrowgraveGUID = 0;
  • GortokPalehoofGUID = 0;
  • SkadiTheRuthlessGUID = 0;
  • KingYmironGUID = 0;
  • UtgardeMirrorGUID = 0;
  • GortokPalehoofSphereGUID = 0;
  • FrenziedWorgenGUID = 0;
  • RavenousFurbolgGUID = 0;
  • FerociousRhinoGUID = 0;
  • MassiveJormungarGUID = 0;
  • PalehoofOrbGUID = 0;
  • SvalaGUID = 0;
  • SacrificedPlayerGUID = 0;
  • }
  • void OnCreatureCreate(Creature* creature) OVERRIDE
  • {
  • 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())
  • {
  • 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 OnGameObjectRemove(GameObject* go) OVERRIDE
  • {
  • switch (go->GetEntry())
  • {
  • case GO_SKADI_THE_RUTHLESS_DOOR:
  • case GO_KING_YMIRON_DOOR:
  • AddDoor(go, false);
  • break;
  • default:
  • break;
  • }
  • }
  • void SetData64(uint32 type, uint64 data) OVERRIDE
  • {
  • switch (type)
  • {
  • case DATA_SACRIFICED_PLAYER:
  • SacrificedPlayerGUID = data;
  • break;
  • default:
  • break;
  • }
  • }
  • uint64 GetData64(uint32 type) const OVERRIDE
  • {
  • 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;
  • }
  • std::string GetSaveData() OVERRIDE
  • {
  • OUT_SAVE_INST_DATA;
  • std::ostringstream saveStream;
  • saveStream << "U P " << GetBossSaveData();
  • OUT_SAVE_INST_DATA_COMPLETE;
  • return saveStream.str();
  • }
  • void Load(char const* str) OVERRIDE
  • {
  • if (!str)
  • {
  • OUT_LOAD_INST_DATA_FAIL;
  • return;
  • }
  • OUT_LOAD_INST_DATA(str);
  • char dataHead1, dataHead2;
  • std::istringstream loadStream(str);
  • loadStream >> dataHead1 >> dataHead2;
  • 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;
  • OUT_LOAD_INST_DATA_COMPLETE;
  • }
  • protected:
  • uint64 SvalaSorrowgraveGUID;
  • uint64 GortokPalehoofGUID;
  • uint64 SkadiTheRuthlessGUID;
  • uint64 KingYmironGUID;
  • uint64 UtgardeMirrorGUID;
  • uint64 GortokPalehoofSphereGUID;
  • uint64 FrenziedWorgenGUID;
  • uint64 RavenousFurbolgGUID;
  • uint64 FerociousRhinoGUID;
  • uint64 MassiveJormungarGUID;
  • uint64 PalehoofOrbGUID;
  • uint64 SvalaGUID;
  • uint64 SacrificedPlayerGUID;
  • };
  • InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
  • {
  • return new instance_utgarde_pinnacle_InstanceMapScript(map);
  • }
    +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)
  • {
  • SetBossNumber(EncounterCount);
  • LoadDoorData(doorData);
  • SvalaGUID = 0;
  • SvalaSorrowgraveGUID = 0;
  • SacrificedPlayerGUID = 0;
  • GortokPalehoofGUID = 0;
  • FrenziedWorgenGUID = 0;
  • RavenousFurbolgGUID = 0;
  • MassiveJormungarGUID = 0;
  • FerociousRhinoGUID = 0;
  • PalehoofOrbGUID = 0;
  • PalehoofSphereGUID = 0;
  • SkadiTheRuthlessGUID = 0;
  • GraufGUID = 0;
  • SkadiTheRuthlessDoorGUID = 0;
  • KingYmironGUID = 0;
  • KingYmironDoorGUID = 0;
  • }
  • void OnCreatureCreate(Creature* creature) OVERRIDE
  • {
  • 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;
  • case NPC_GRAUF: GraufGUID = creature->GetGUID(); break;
  • }
  • }
  • void OnGameObjectCreate(GameObject* go) OVERRIDE
  • {
  • switch (go->GetEntry())
  • {
  • case GO_PALEHOOF_SPHERE:
  • PalehoofSphereGUID = 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:
  • AddDoor(go, true);
  • break;
  • case GO_KING_YMIRON_DOOR:
  • AddDoor(go, true);
  • break;
  • }
  • }
  • void OnGameObjectRemove(GameObject* go) OVERRIDE
  • {
  • switch (go->GetEntry())
  • {
  • case GO_SKADI_THE_RUTHLESS_DOOR:
  • AddDoor(go, false);
  • break;
  • case GO_KING_YMIRON_DOOR:
  • AddDoor(go, false);
  • break;
  • }
  • }
  • void SetData64(uint32 type, uint64 data) OVERRIDE
  • {
  • switch (type)
  • {
  • case DATA_SACRIFICED_PLAYER:
  • SacrificedPlayerGUID = data;
  • break;
  • }
  • }
  • uint64 GetData64(uint32 type) const OVERRIDE
  • {
  • 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_NPC_FRENZIED_WORGEN: return FrenziedWorgenGUID;
  • case DATA_NPC_RAVENOUS_FURBOLG: return RavenousFurbolgGUID;
  • case DATA_NPC_MASSIVE_JORMUNGAR: return MassiveJormungarGUID;
  • case DATA_NPC_FEROCIOUS_RHINO: return FerociousRhinoGUID;
  • case DATA_NPC_ORB: return PalehoofOrbGUID;
  • case DATA_NPC_GRAUF: return GraufGUID;
  • case DATA_SVALA: return SvalaGUID;
  • case DATA_GORTOK_PALEHOOF_SPHERE: return PalehoofSphereGUID;
  • case DATA_SACRIFICED_PLAYER: return SacrificedPlayerGUID;
  • }
  • return 0;
  • }
  • std::string GetSaveData() OVERRIDE
  • {
  • OUT_SAVE_INST_DATA;
  • std::ostringstream saveStream;
  • saveStream << "U P " << GetBossSaveData();
  • OUT_SAVE_INST_DATA_COMPLETE;
  • return saveStream.str();
  • }
  • void Load(const char* str) OVERRIDE
  • {
  • if (!str)
  • {
  • OUT_LOAD_INST_DATA_FAIL;
  • return;
  • }
  • OUT_LOAD_INST_DATA(str);
  • char dataHead1, dataHead2;
  • std::istringstream loadStream(str);
  • loadStream >> dataHead1 >> dataHead2;
  • if (dataHead1 == ‘U’ && dataHead2 == ‘P’)
  • {
  • for (uint8 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;
  • OUT_LOAD_INST_DATA_COMPLETE;
  • }
  • protected:
  • uint64 SvalaGUID;
  • uint64 SvalaSorrowgraveGUID;
  • uint64 SacrificedPlayerGUID;
  • uint64 GortokPalehoofGUID;
  • uint64 FrenziedWorgenGUID;
  • uint64 RavenousFurbolgGUID;
  • uint64 MassiveJormungarGUID;
  • uint64 FerociousRhinoGUID;
  • uint64 PalehoofOrbGUID;
  • uint64 PalehoofSphereGUID;
  • uint64 SkadiTheRuthlessGUID;
  • uint64 GraufGUID;
  • uint64 SkadiTheRuthlessDoorGUID;
  • uint64 KingYmironGUID;
  • uint64 KingYmironDoorGUID;
  • };
    };

void AddSC_instance_utgarde_pinnacle()
{

  • new instance_utgarde_pinnacle();
    -}
  • new instance_utgarde_pinnacle();
    +}
    No newline at end of file
    diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
    index 99acef0…c1c35ed 100644
    — a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
    +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
    @@ -24,25 +24,25 @@ uint32 const EncounterCount = 4;

enum DataTypes
{

  • // Encounter States/Boss GUIDs
  • DATA_SVALA_SORROWGRAVE = 0,
  • DATA_GORTOK_PALEHOOF = 1,
  • DATA_SKADI_THE_RUTHLESS = 2,
  • DATA_KING_YMIRON = 3,
  • // Encounter States/Boss GUIDs
  • DATA_SVALA = 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,
  • // Additional Data
  • DATA_SVALA_SORROWGRAVE = 4,
  • DATA_SACRIFICED_PLAYER = 5,
  • 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
    -};
  • DATA_NPC_FRENZIED_WORGEN = 6,

  • DATA_NPC_RAVENOUS_FURBOLG = 7,

  • DATA_NPC_MASSIVE_JORMUNGAR = 8,

  • DATA_NPC_FEROCIOUS_RHINO = 9,

  • DATA_NPC_ORB = 10,

  • DATA_GORTOK_PALEHOOF_SPHERE = 11,

  • DATA_NPC_GRAUF = 12
    +};
    enum CreatureIds
    {
    NPC_SVALA_SORROWGRAVE = 26668,
    @@ -58,15 +58,16 @@ enum CreatureIds
    NPC_RAVENOUS_FURBOLG = 26684,
    NPC_MASSIVE_JORMUNGAR = 26685,
    NPC_FEROCIOUS_RHINO = 26686,

  • NPC_PALEHOOF_ORB = 26688
  • NPC_PALEHOOF_ORB = 26688,
  • NPC_GRAUF = 26893
    };

-enum GameObjectIds
+enum GameObjects
{

  • GO_GORTOK_PALEHOOF_SPHERE = 188593,
  • GO_UTGARDE_MIRROR = 191745,
  • GO_SKADI_THE_RUTHLESS_DOOR = 192173,
  • GO_KING_YMIRON_DOOR = 192174
  • GO_SKADI_THE_RUTHLESS_DOOR = 192173,
  • GO_KING_YMIRON_DOOR = 192174,
  • GO_PALEHOOF_SPHERE = 188593,
  • GO_UTGARDE_MIRROR = 191745
    };
    template

[/SPOILER]

Thanks to @Carbenium for all the work done on this script! It is really appreciated