Advertisement
Guest User

Skadi Rewrite

a guest
Oct 13th, 2013
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 68.27 KB | None | 0 0
  1.  
  2. ---
  3. sql/updates/world/2013_10_11_R_00_world_misc.sql   |  19 +
  4.  .../UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp  |  24 +-
  5.  .../UtgardeKeep/UtgardePinnacle/boss_skadi.cpp     | 943 ++++++++++-----------
  6.  .../UtgardeKeep/UtgardePinnacle/boss_svala.cpp     |  19 +-
  7.  .../UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp    |  16 +-
  8.  .../UtgardePinnacle/instance_utgarde_pinnacle.cpp  | 492 +++++------
  9.  .../UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h |  53 +-
  10.  7 files changed, 748 insertions(+), 818 deletions(-)
  11.  create mode 100644 sql/updates/world/2013_10_11_R_00_world_misc.sql
  12.  rewrite src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp (73%)
  13.  rewrite src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp (81%)
  14.  
  15. diff --git a/sql/updates/world/2013_10_11_R_00_world_misc.sql b/sql/updates/world/2013_10_11_R_00_world_misc.sql
  16. new file mode 100644
  17. index 0000000..6f67dac
  18. --- /dev/null
  19. +++ b/sql/updates/world/2013_10_11_R_00_world_misc.sql
  20. @@ -0,0 +1,19 @@
  21. +DELETE FROM `creature` WHERE `guid`=126052;
  22. +DELETE FROM `linked_respawn` WHERE `guid`=126052;
  23. +DELETE FROM `creature_addon` WHERE `guid`=126052;
  24. +
  25. +UPDATE `creature_template` SET `ScriptName` = 'npc_grauf' WHERE `entry` = 26893;
  26. +
  27. +DELETE FROM `creature_text` WHERE `entry`=26693 AND `groupid`=2 AND `type`=41;
  28. +DELETE FROM `creature_text` WHERE `entry`=26693 AND `groupid`=4 AND `type`=41;
  29. +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES
  30. +(26893, 2, 0, '%s in within range of the harpoon launchers!', 41, 0, 100, 0, 0, 0, 'Grauf EMOTE_RANGE');
  31. +
  32. +DELETE FROM `spell_target_position` WHERE `id` = 61790;
  33. +INSERT INTO `spell_target_position` (`id`, `effIndex`, `target_map`, `target_position_x`, `target_position_y`, `target_position_z`, `target_orientation`) VALUES
  34. +('61790', '0', '575', '480.84', '-511.95', '104.72', '2.71');
  35. +
  36. +DELETE FROM `spelldifficulty_dbc` WHERE `spellid0` = 50228;
  37. +INSERT INTO `spelldifficulty_dbc` (`id`, `spellid0`, `spellid1`, `spellid2`, `spellid3`) VALUES
  38. +('50228', '50228', '59322', '0', '0');
  39. +
  40. diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
  41. index b70bda7..77cb648 100644
  42. --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
  43. +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
  44. @@ -93,9 +93,9 @@ public:
  45.          return new boss_palehoofAI(creature);
  46.      }
  47.  
  48. -    struct boss_palehoofAI : public ScriptedAI
  49. +    struct boss_palehoofAI : public BossAI
  50.      {
  51. -        boss_palehoofAI(Creature* creature) : ScriptedAI(creature)
  52. +        boss_palehoofAI(Creature* creature) : BossAI(creature, DATA_GORTOK_PALEHOOF)
  53.          {
  54.              instance = creature->GetInstanceScript();
  55.          }
  56. @@ -112,6 +112,7 @@ public:
  57.  
  58.          void Reset() OVERRIDE
  59.          {
  60. +            _Reset();
  61.              /// There is a good reason to store them like this, we are going to shuffle the order.
  62.              for (uint32 i = PHASE_FRENZIED_WORGEN; i < PHASE_GORTOK_PALEHOOF; ++i)
  63.                  Sequence[i] = Phase(i);
  64. @@ -131,8 +132,6 @@ public:
  65.  
  66.              if (instance)
  67.              {
  68. -                instance->SetData(DATA_GORTOK_PALEHOOF_EVENT, NOT_STARTED);
  69. -
  70.                  Creature* temp = Unit::GetCreature((*me), instance->GetData64(DATA_NPC_FRENZIED_WORGEN));
  71.                  if (temp && !temp->IsAlive())
  72.                      temp->Respawn();
  73. @@ -217,9 +216,8 @@ public:
  74.  
  75.          void JustDied(Unit* /*killer*/) OVERRIDE
  76.          {
  77. +            _JustDied();
  78.            //Talk(SAY_DEATH);
  79. -            if (instance)
  80. -                instance->SetData(DATA_GORTOK_PALEHOOF_EVENT, DONE);
  81.              Creature* temp = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_NPC_ORB) : 0);
  82.              if (temp && temp->IsAlive())
  83.                  temp->DisappearAndDie();
  84. @@ -234,9 +232,7 @@ public:
  85.          {
  86.              if (currentPhase == PHASE_NONE)
  87.              {
  88. -                if (instance)
  89. -                    instance->SetData(DATA_GORTOK_PALEHOOF_EVENT, IN_PROGRESS);
  90. -
  91. +                instance->SetBossState(DATA_GORTOK_PALEHOOF, IN_PROGRESS);
  92.                  me->SummonCreature(NPC_STASIS_CONTROLLER, moveLocs[5].x, moveLocs[5].y, moveLocs[5].z, 0, TEMPSUMMON_CORPSE_DESPAWN);
  93.              }
  94.              Phase move = PHASE_NONE;
  95. @@ -306,7 +302,7 @@ public:
  96.              me->GetMotionMaster()->MoveTargetedHome();
  97.  
  98.              if (instance)
  99. -                if (instance->GetData(DATA_GORTOK_PALEHOOF_EVENT) == IN_PROGRESS)
  100. +                if (instance->GetBossState(DATA_GORTOK_PALEHOOF) == IN_PROGRESS)
  101.                  {
  102.                      Creature* pPalehoof = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0);
  103.                      if (pPalehoof && pPalehoof->IsAlive())
  104. @@ -419,7 +415,7 @@ public:
  105.              me->GetMotionMaster()->MoveTargetedHome();
  106.  
  107.              if (instance)
  108. -                if (instance->GetData(DATA_GORTOK_PALEHOOF_EVENT) == IN_PROGRESS)
  109. +                if (instance->GetBossState(DATA_GORTOK_PALEHOOF) == IN_PROGRESS)
  110.                  {
  111.                      Creature* pPalehoof = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0);
  112.                      if (pPalehoof && pPalehoof->IsAlive())
  113. @@ -470,7 +466,7 @@ public:
  114.                  DoStartMovement(who);
  115.              }
  116.              if (instance)
  117. -                instance->SetData(DATA_GORTOK_PALEHOOF_EVENT, IN_PROGRESS);
  118. +                instance->SetBossState(DATA_GORTOK_PALEHOOF, IN_PROGRESS);
  119.          }
  120.  
  121.          void JustDied(Unit* /*killer*/) OVERRIDE
  122. @@ -535,7 +531,7 @@ public:
  123.              me->GetMotionMaster()->MoveTargetedHome();
  124.  
  125.              if (instance)
  126. -                if (instance->GetData(DATA_GORTOK_PALEHOOF_EVENT) == IN_PROGRESS)
  127. +                if (instance->GetBossState(DATA_GORTOK_PALEHOOF) == IN_PROGRESS)
  128.                  {
  129.                      Creature* pPalehoof = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0);
  130.                      if (pPalehoof && pPalehoof->IsAlive())
  131. @@ -655,7 +651,7 @@ public:
  132.              me->GetMotionMaster()->MoveTargetedHome();
  133.  
  134.              if (instance)
  135. -                if (instance->GetData(DATA_GORTOK_PALEHOOF_EVENT) == IN_PROGRESS)
  136. +                if (instance->GetBossState(DATA_GORTOK_PALEHOOF) == IN_PROGRESS)
  137.                  {
  138.                      Creature* pPalehoof = Unit::GetCreature((*me), instance ? instance->GetData64(DATA_GORTOK_PALEHOOF) : 0);
  139.                      if (pPalehoof && pPalehoof->IsAlive())
  140. diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
  141. dissimilarity index 73%
  142. index 08670af..f8c2f3b 100644
  143. --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
  144. +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
  145. @@ -1,490 +1,453 @@
  146. -/*
  147. - * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
  148. - *
  149. - * This program is free software; you can redistribute it and/or modify it
  150. - * under the terms of the GNU General Public License as published by the
  151. - * Free Software Foundation; either version 2 of the License, or (at your
  152. - * option) any later version.
  153. - *
  154. - * This program is distributed in the hope that it will be useful, but WITHOUT
  155. - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  156. - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  157. - * more details.
  158. - *
  159. - * You should have received a copy of the GNU General Public License along
  160. - * with this program. If not, see <http://www.gnu.org/licenses/>.
  161. - */
  162. -
  163. -/* Script Data Start
  164. -SDName: Boss_Skadi
  165. -SDAuthor: LordVanMartin, JohnHoliver
  166. -SD%Complete: 90%
  167. -SDComment: <Known Bugs>
  168. -               After Unmount() he appears to still be flying even with SetFlying(false)
  169. -           </Known Bugs>
  170. -SDCategory: Utgarde Pinnacle
  171. -Script Data End */
  172. -
  173. -#include "ScriptMgr.h"
  174. -#include "ScriptedCreature.h"
  175. -#include "utgarde_pinnacle.h"
  176. -#include "Player.h"
  177. -#include "SpellInfo.h"
  178. -
  179. -enum Yells
  180. -{
  181. -    SAY_AGGRO                           = 0,
  182. -    SAY_KILL                            = 1,
  183. -    EMOTE_RANGE                         = 2,
  184. -    SAY_DEATH                           = 3,
  185. -    SAY_DRAKE_DEATH                     = 4,
  186. -    EMOTE_BREATH                        = 5,
  187. -    SAY_DRAKE_BREATH                    = 6
  188. -};
  189. -
  190. -static Position SpawnLoc = {468.931f, -513.555f, 104.723f, 0};
  191. -static Position Location[]=
  192. -{
  193. -    // Boss
  194. -    {341.740997f, -516.955017f, 104.66900f, 0}, // 0
  195. -    {293.299f, -505.95f, 142.03f, 0},           // 1
  196. -    {301.664f, -535.164f, 146.097f, 0},         // 2
  197. -    {521.031006f, -544.667847f, 128.80064f, 0}, // 3
  198. -    {477.311981f, -509.296814f, 104.72308f, 0}, // 4
  199. -    {341.740997f, -516.955017f, 104.66900f, 0}, // 5
  200. -    {341.740997f, -516.955017f, 104.66900f, 0}, // 6
  201. -    {341.740997f, -516.955017f, 104.66900f, 0}, // 7
  202. -    // Triggers Left
  203. -    {469.661f, -484.546f, 104.712f, 0},         // 8
  204. -    {483.315f, -485.028f, 104.718f, 0},         // 9
  205. -    {476.87f, -487.994f, 104.735f, 0},          //10
  206. -    {477.512f, -497.772f, 104.728f, 0},         //11
  207. -    {486.287f, -500.759f, 104.722f, 0},         //12
  208. -    {480.1f, -503.895f, 104.722f, 0},           //13
  209. -    {472.391f, -505.103f, 104.723f, 0},         //14
  210. -    {478.885f, -510.803f, 104.723f, 0},         //15
  211. -    {489.529f, -508.615f, 104.723f, 0},         //16
  212. -    {484.272f, -508.589f, 104.723f, 0},         //17
  213. -    {465.328f, -506.495f, 104.427f, 0},         //18
  214. -    {456.885f, -508.104f, 104.447f, 0},         //19
  215. -    {450.177f, -507.989f, 105.247f, 0},         //20
  216. -    {442.273f, -508.029f, 104.813f, 0},         //21
  217. -    {434.225f, -508.19f, 104.787f, 0},          //22
  218. -    {423.902f, -508.525f, 104.274f, 0},         //23
  219. -    {414.551f, -508.645f, 105.136f, 0},         //24
  220. -    {405.787f, -508.755f, 104.988f, 0},         //25
  221. -    {398.812f, -507.224f, 104.82f, 0},          //26
  222. -    {389.702f, -506.846f, 104.729f, 0},         //27
  223. -    {381.856f, -506.76f, 104.756f, 0},          //28
  224. -    {372.881f, -507.254f, 104.779f, 0},         //29
  225. -    {364.978f, -508.182f, 104.673f, 0},         //30
  226. -    {357.633f, -508.075f, 104.647f, 0},         //31
  227. -    {350.008f, -506.826f, 104.588f, 0},         //32
  228. -    {341.69f, -506.77f, 104.499f, 0},           //33
  229. -    {335.31f, -505.745f, 105.18f, 0},           //34
  230. -    {471.178f, -510.74f, 104.723f, 0},          //35
  231. -    {461.759f, -510.365f, 104.199f, 0},         //36
  232. -    {424.07287f, -510.082916f, 104.711082f, 0}, //37
  233. -    // Triggers Right
  234. -    {489.46f, -513.297f, 105.413f, 0},          //38
  235. -    {485.706f, -517.175f, 104.724f, 0},         //39
  236. -    {480.98f, -519.313f, 104.724f, 0},          //40
  237. -    {475.05f, -520.52f, 104.724f, 0},           //41
  238. -    {482.97f, -512.099f, 104.724f, 0},          //42
  239. -    {477.082f, -514.172f, 104.724f, 0},         //43
  240. -    {468.991f, -516.691f, 104.724f, 0},         //44
  241. -    {461.722f, -517.063f, 104.627f, 0},         //45
  242. -    {455.88f, -517.681f, 104.707f, 0},          //46
  243. -    {450.499f, -519.099f, 104.701f, 0},         //47
  244. -    {444.889f, -518.963f, 104.82f, 0},          //48
  245. -    {440.181f, -518.893f, 104.861f, 0},         //49
  246. -    {434.393f, -518.758f, 104.891f, 0},         //50
  247. -    {429.328f, -518.583f, 104.904f, 0},         //51
  248. -    {423.844f, -518.394f, 105.004f, 0},         //52
  249. -    {418.707f, -518.266f, 105.135f, 0},         //53
  250. -    {413.377f, -518.085f, 105.153f, 0},         //54
  251. -    {407.277f, -517.844f, 104.893f, 0},         //55
  252. -    {401.082f, -517.443f, 104.723f, 0},         //56
  253. -    {394.933f, -514.64f, 104.724f, 0},          //57
  254. -    {388.917f, -514.688f, 104.734f, 0},         //58
  255. -    {383.814f, -515.834f, 104.73f, 0},          //59
  256. -    {377.887f, -518.653f, 104.777f, 0},         //60
  257. -    {371.376f, -518.289f, 104.781f, 0},         //61
  258. -    {365.669f, -517.822f, 104.758f, 0},         //62
  259. -    {359.572f, -517.314f, 104.706f, 0},         //63
  260. -    {353.632f, -517.146f, 104.647f, 0},         //64
  261. -    {347.998f, -517.038f, 104.538f, 0},         //65
  262. -    {341.803f, -516.98f, 104.584f, 0},          //66
  263. -    {335.879f, -516.674f, 104.628f, 0},         //67
  264. -    {329.871f, -515.92f, 104.711f, 0},          //68
  265. -    // Breach Zone
  266. -    {485.4577f, -511.2515f, 115.3011f, 0},      //69
  267. -    {435.1892f, -514.5232f, 118.6719f, 0},      //70
  268. -    {413.9327f, -540.9407f, 138.2614f, 0},      //71
  269. -};
  270. -
  271. -enum CombatPhase
  272. -{
  273. -    FLYING,
  274. -    SKADI
  275. -};
  276. -
  277. -enum Spells
  278. -{
  279. -    // Skadi Spells
  280. -    SPELL_CRUSH             = 50234,
  281. -    SPELL_POISONED_SPEAR    = 50225, //isn't being casted =/
  282. -    SPELL_WHIRLWIND         = 50228, //random target, but not the tank approx. every 20s
  283. -    SPELL_RAPID_FIRE        = 56570,
  284. -    SPELL_HARPOON_DAMAGE    = 56578,
  285. -    SPELL_FREEZING_CLOUD    = 47579,
  286. -};
  287. -
  288. -enum Creatures
  289. -{
  290. -    NPC_YMIRJAR_WARRIOR       = 26690,
  291. -    NPC_YMIRJAR_WITCH_DOCTOR  = 26691,
  292. -    NPC_YMIRJAR_HARPOONER     = 26692,
  293. -    NPC_GRAUF                 = 26893,
  294. -    NPC_TRIGGER               = 28351,
  295. -    DATA_MOUNT                     = 27043,
  296. -};
  297. -
  298. -enum Achievments
  299. -{
  300. -    ACHIEV_TIMED_START_EVENT                      = 17726,
  301. -};
  302. -
  303. -class boss_skadi : public CreatureScript
  304. -{
  305. -public:
  306. -    boss_skadi() : CreatureScript("boss_skadi") { }
  307. -
  308. -    CreatureAI* GetAI(Creature* creature) const OVERRIDE
  309. -    {
  310. -        return new boss_skadiAI(creature);
  311. -    }
  312. -
  313. -    struct boss_skadiAI : public ScriptedAI
  314. -    {
  315. -        boss_skadiAI(Creature* creature) : ScriptedAI(creature), Summons(me)
  316. -        {
  317. -            instance = creature->GetInstanceScript();
  318. -            m_uiGraufGUID = 0;
  319. -        }
  320. -
  321. -        InstanceScript* instance;
  322. -        SummonList Summons;
  323. -        uint64 m_uiGraufGUID;
  324. -        std::vector<uint64> triggersGUID;
  325. -
  326. -        uint32 m_uiCrushTimer;
  327. -        uint32 m_uiPoisonedSpearTimer;
  328. -        uint32 m_uiWhirlwindTimer;
  329. -        uint32 m_uiWaypointId;
  330. -        uint32 m_uiMovementTimer;
  331. -        uint32 m_uiMountTimer;
  332. -        uint32 m_uiSummonTimer;
  333. -        uint8  m_uiSpellHitCount;
  334. -        bool   m_bSaidEmote;
  335. -
  336. -        CombatPhase Phase;
  337. -
  338. -        void Reset() OVERRIDE
  339. -        {
  340. -            triggersGUID.clear();
  341. -
  342. -            m_uiCrushTimer = 8000;
  343. -            m_uiPoisonedSpearTimer = 10000;
  344. -            m_uiWhirlwindTimer = 20000;
  345. -            m_uiMountTimer = 3000;
  346. -            m_uiWaypointId = 0;
  347. -            m_bSaidEmote = false;
  348. -            m_uiSpellHitCount = 0;
  349. -
  350. -            Phase = SKADI;
  351. -
  352. -            Summons.DespawnAll();
  353. -            me->SetSpeed(MOVE_FLIGHT, 3.0f);
  354. -            if ((Unit::GetCreature(*me, m_uiGraufGUID) == NULL) && !me->IsMounted())
  355. -                 me->SummonCreature(NPC_GRAUF, Location[0].GetPositionX(), Location[0].GetPositionY(), Location[0].GetPositionZ(), 3.0f);
  356. -            if (instance)
  357. -            {
  358. -                instance->SetData(DATA_SKADI_THE_RUTHLESS_EVENT, NOT_STARTED);
  359. -                instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
  360. -            }
  361. -        }
  362. -
  363. -        void JustReachedHome() OVERRIDE
  364. -        {
  365. -            me->SetCanFly(false);
  366. -            me->Dismount();
  367. -            me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
  368. -            if (!Unit::GetCreature(*me, m_uiGraufGUID))
  369. -                me->SummonCreature(NPC_GRAUF, Location[0].GetPositionX(), Location[0].GetPositionY(), Location[0].GetPositionZ(), 3.0f);
  370. -        }
  371. -
  372. -        void EnterCombat(Unit* /*who*/) OVERRIDE
  373. -        {
  374. -            Talk(SAY_AGGRO);
  375. -
  376. -            me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
  377. -
  378. -            Phase = FLYING;
  379. -
  380. -            m_uiMovementTimer = 1000;
  381. -            m_uiSummonTimer = 10000;
  382. -            me->SetInCombatWithZone();
  383. -            if (instance)
  384. -            {
  385. -                instance->SetData(DATA_SKADI_THE_RUTHLESS_EVENT, IN_PROGRESS);
  386. -                instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
  387. -                me->GetMotionMaster()->MoveJump(Location[0].GetPositionX(), Location[0].GetPositionY(), Location[0].GetPositionZ(), 5.0f, 10.0f);
  388. -                me->SetWalk(false);
  389. -                m_uiMountTimer = 1000;
  390. -                Summons.DespawnEntry(NPC_GRAUF);
  391. -            }
  392. -        }
  393. -
  394. -        void JustSummoned(Creature* summoned) OVERRIDE
  395. -        {
  396. -            switch (summoned->GetEntry())
  397. -            {
  398. -                case NPC_GRAUF:
  399. -                    m_uiGraufGUID = summoned->GetGUID();
  400. -                    break;
  401. -                case NPC_YMIRJAR_WARRIOR:
  402. -                case NPC_YMIRJAR_WITCH_DOCTOR:
  403. -                case NPC_YMIRJAR_HARPOONER:
  404. -                    summoned->setActive(true);
  405. -                    summoned->SetInCombatWithZone();
  406. -                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
  407. -                        summoned->AI()->AttackStart(target);
  408. -                    break;
  409. -                case NPC_TRIGGER:
  410. -                    summoned->CastSpell((Unit*)NULL, SPELL_FREEZING_CLOUD, true);
  411. -                    summoned->DespawnOrUnsummon(10*IN_MILLISECONDS);
  412. -                    break;
  413. -            }
  414. -            Summons.Summon(summoned);
  415. -        }
  416. -
  417. -        void SummonedCreatureDespawn(Creature* summoned) OVERRIDE
  418. -        {
  419. -            if (summoned->GetEntry() == NPC_GRAUF)
  420. -                m_uiGraufGUID = 0;
  421. -            Summons.Despawn(summoned);
  422. -        }
  423. -
  424. -        void SpellHit(Unit* /*caster*/, const SpellInfo* spell) OVERRIDE
  425. -        {
  426. -            if (spell->Id == SPELL_HARPOON_DAMAGE)
  427. -            {
  428. -                m_uiSpellHitCount++;
  429. -                if (m_uiSpellHitCount >= 3)
  430. -                {
  431. -                    Phase = SKADI;
  432. -                    me->SetCanFly(false);
  433. -                    me->Dismount();
  434. -                    if (Creature* pGrauf = me->SummonCreature(NPC_GRAUF, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3*IN_MILLISECONDS))
  435. -                    {
  436. -                        pGrauf->GetMotionMaster()->MoveFall();
  437. -                        pGrauf->HandleEmoteCommand(EMOTE_ONESHOT_FLYDEATH);
  438. -                    }
  439. -                    me->GetMotionMaster()->MoveJump(Location[4].GetPositionX(), Location[4].GetPositionY(), Location[4].GetPositionZ(), 5.0f, 10.0f);
  440. -                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
  441. -                    Talk(SAY_DRAKE_DEATH);
  442. -                    m_uiCrushTimer = 8000;
  443. -                    m_uiPoisonedSpearTimer = 10000;
  444. -                    m_uiWhirlwindTimer = 20000;
  445. -                    me->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM));
  446. -                }
  447. -            }
  448. -        }
  449. -
  450. -        void UpdateAI(uint32 diff) OVERRIDE
  451. -        {
  452. -            switch (Phase)
  453. -            {
  454. -                case FLYING:
  455. -                    if (!UpdateVictim())
  456. -                        return;
  457. -
  458. -                    if (me->GetPositionX() >= 519)
  459. -                    {
  460. -                        me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
  461. -                        if (!m_bSaidEmote)
  462. -                        {
  463. -                            Talk(EMOTE_RANGE);
  464. -                            m_bSaidEmote = true;
  465. -                        }
  466. -                    }
  467. -                    else
  468. -                    {
  469. -                        me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
  470. -                        m_bSaidEmote = false;
  471. -                    }
  472. -
  473. -                    if (m_uiMountTimer && m_uiMountTimer <= diff)
  474. -                    {
  475. -                        me->Mount(DATA_MOUNT);
  476. -                        me->SetCanFly(true);
  477. -                        m_uiMountTimer = 0;
  478. -                    } else m_uiMountTimer -= diff;
  479. -
  480. -                    if (m_uiSummonTimer <= diff)
  481. -                    {
  482. -                        SpawnMobs();
  483. -                        m_uiSummonTimer = 25000;
  484. -                    } else m_uiSummonTimer -= diff;
  485. -
  486. -                    if (m_uiMovementTimer <= diff)
  487. -                    {
  488. -                        switch (m_uiWaypointId)
  489. -                        {
  490. -                            case 0:
  491. -                                me->GetMotionMaster()->MovePoint(0, Location[1].GetPositionX(), Location[1].GetPositionY(), Location[1].GetPositionZ());
  492. -                                m_uiMovementTimer = 5000;
  493. -                                break;
  494. -                            case 1:
  495. -                                me->GetMotionMaster()->MovePoint(0, Location[2].GetPositionX(), Location[2].GetPositionY(), Location[2].GetPositionZ());
  496. -                                m_uiMovementTimer = 2000;
  497. -                                break;
  498. -                            case 2:
  499. -                                me->GetMotionMaster()->MovePoint(0, Location[3].GetPositionX(), Location[3].GetPositionY(), Location[3].GetPositionZ());
  500. -                                m_uiMovementTimer = 15000;
  501. -                                break;
  502. -                            case 3:
  503. -                                me->GetMotionMaster()->MovePoint(0, Location[69].GetPositionX(), Location[69].GetPositionY(), Location[69].GetPositionZ());
  504. -                                Talk(SAY_DRAKE_BREATH);
  505. -                                Talk(EMOTE_BREATH);
  506. -                                m_uiMovementTimer = 2500;
  507. -                                break;
  508. -                            case 4:
  509. -                                me->GetMotionMaster()->MovePoint(0, Location[70].GetPositionX(), Location[70].GetPositionY(), Location[70].GetPositionZ());
  510. -                                m_uiMovementTimer = 2000;
  511. -                                SpawnTrigger();
  512. -                                break;
  513. -                            case 5:
  514. -                                me->GetMotionMaster()->MovePoint(0, Location[71].GetPositionX(), Location[71].GetPositionY(), Location[71].GetPositionZ());
  515. -                                m_uiMovementTimer = 3000;
  516. -                                break;
  517. -                            case 6:
  518. -                                me->GetMotionMaster()->MovePoint(0, Location[3].GetPositionX(), Location[3].GetPositionY(), Location[3].GetPositionZ());
  519. -                                m_uiWaypointId = 2;
  520. -                                m_uiMovementTimer = 15000;
  521. -                                break;
  522. -                        }
  523. -                        m_uiWaypointId++;
  524. -                    } else m_uiMovementTimer -= diff;
  525. -                    break;
  526. -                case SKADI:
  527. -                    //Return since we have no target
  528. -                    if (!UpdateVictim())
  529. -                        return;
  530. -
  531. -                    if (m_uiCrushTimer <= diff)
  532. -                    {
  533. -                        DoCastVictim(SPELL_CRUSH);
  534. -                        m_uiCrushTimer = 8000;
  535. -                    } else m_uiCrushTimer -= diff;
  536. -
  537. -                    if (m_uiPoisonedSpearTimer <= diff)
  538. -                    {
  539. -                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
  540. -                            DoCast(target, SPELL_POISONED_SPEAR);
  541. -                        m_uiPoisonedSpearTimer = 10000;
  542. -                    } else m_uiPoisonedSpearTimer -= diff;
  543. -
  544. -                    if (m_uiWhirlwindTimer <= diff)
  545. -                    {
  546. -                        DoCastAOE(SPELL_WHIRLWIND);
  547. -                        m_uiWhirlwindTimer = 20000;
  548. -                    } else m_uiWhirlwindTimer -= diff;
  549. -
  550. -                    DoMeleeAttackIfReady();
  551. -                    break;
  552. -            }
  553. -        }
  554. -
  555. -        void JustDied(Unit* /*killer*/) OVERRIDE
  556. -        {
  557. -            Talk(SAY_DEATH);
  558. -            Summons.DespawnAll();
  559. -            if (instance)
  560. -                instance->SetData(DATA_SKADI_THE_RUTHLESS_EVENT, DONE);
  561. -        }
  562. -
  563. -        void KilledUnit(Unit* /*victim*/) OVERRIDE
  564. -        {
  565. -            Talk(SAY_KILL);
  566. -        }
  567. -
  568. -        void SpawnMobs()
  569. -        {
  570. -            for (uint8 i = 0; i < DUNGEON_MODE(5, 6); ++i)
  571. -            {
  572. -                switch (urand(0, 2))
  573. -                {
  574. -                    case 0:
  575. -                        me->SummonCreature(NPC_YMIRJAR_WARRIOR, SpawnLoc.GetPositionX()+rand()%5, SpawnLoc.GetPositionY()+rand()%5, SpawnLoc.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
  576. -                        break;
  577. -
  578. -                    case 1:
  579. -                        me->SummonCreature(NPC_YMIRJAR_WITCH_DOCTOR, SpawnLoc.GetPositionX()+rand()%5, SpawnLoc.GetPositionY()+rand()%5, SpawnLoc.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
  580. -                        break;
  581. -
  582. -                    case 2:
  583. -                        me->SummonCreature(NPC_YMIRJAR_HARPOONER, SpawnLoc.GetPositionX()+rand()%5, SpawnLoc.GetPositionY()+rand()%5, SpawnLoc.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
  584. -                        break;
  585. -                }
  586. -            }
  587. -        }
  588. -
  589. -        void SpawnTrigger()
  590. -        {
  591. -            uint8 iStart = 0, iEnd = 0;
  592. -            switch (urand(0, 1))
  593. -            {
  594. -                case 0:
  595. -                    iStart = 8;
  596. -                    iEnd = 37;
  597. -                    break;
  598. -                case 1:
  599. -                    iStart = 38;
  600. -                    iEnd = 68;
  601. -                    break;
  602. -                default:
  603. -                    break;
  604. -            }
  605. -            for (uint32 i = iStart; i < iEnd; ++i)
  606. -                me->SummonCreature(NPC_TRIGGER, Location[i]);
  607. -        }
  608. -    };
  609. -
  610. -};
  611. -
  612. -class go_harpoon_launcher : public GameObjectScript
  613. -{
  614. -public:
  615. -    go_harpoon_launcher() : GameObjectScript("go_harpoon_launcher") { }
  616. -
  617. -    bool OnGossipHello(Player* player, GameObject* go) OVERRIDE
  618. -    {
  619. -        InstanceScript* instance = go->GetInstanceScript();
  620. -        if (!instance)
  621. -            return false;
  622. -
  623. -        if (Creature* pSkadi = Unit::GetCreature(*go, instance->GetData64(DATA_SKADI_THE_RUTHLESS)))
  624. -            player->CastSpell(pSkadi, SPELL_RAPID_FIRE, true);
  625. -
  626. -        return false;
  627. -    }
  628. -
  629. -};
  630. -
  631. -void AddSC_boss_skadi()
  632. -{
  633. -    new boss_skadi();
  634. -    new go_harpoon_launcher();
  635. -}
  636. +/*
  637. +* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
  638. +*
  639. +* This program is free software; you can redistribute it and/or modify it
  640. +* under the terms of the GNU General Public License as published by the
  641. +* Free Software Foundation; either version 2 of the License, or (at your
  642. +* option) any later version.
  643. +*
  644. +* This program is distributed in the hope that it will be useful, but WITHOUT
  645. +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  646. +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  647. +* more details.
  648. +*
  649. +* You should have received a copy of the GNU General Public License along
  650. +* with this program. If not, see <http://www.gnu.org/licenses/>.
  651. +*/
  652. +
  653. +#include "ScriptMgr.h"
  654. +#include "ScriptedCreature.h"
  655. +#include "utgarde_pinnacle.h"
  656. +#include "Player.h"
  657. +#include "SpellInfo.h"
  658. +
  659. +enum Yells
  660. +{
  661. +    SAY_AGGRO                           = 0,
  662. +    SAY_KILL                            = 1,
  663. +    EMOTE_RANGE                         = 2,
  664. +    SAY_DEATH                           = 3,
  665. +    SAY_DRAKE_DEATH                     = 5,
  666. +    //EMOTE_BREATH                        = 5,
  667. +    SAY_DRAKE_BREATH                    = 6
  668. +};
  669. +
  670. +static Position SpawnLoc = {468.931f, -513.555f, 104.723f, 0};
  671. +static Position Location[]=
  672. +{
  673. +    // Boss
  674. +    {341.740997f, -516.955017f, 104.66900f, 0}, // 0
  675. +    {293.299f, -505.95f, 142.03f, 0},           // 1
  676. +    {301.664f, -535.164f, 146.097f, 0},         // 2
  677. +    {521.031006f, -544.667847f, 128.80064f, 0}, // 3
  678. +    {477.311981f, -509.296814f, 104.72308f, 0}, // 4
  679. +    {341.740997f, -516.955017f, 104.66900f, 0}, // 5
  680. +    {341.740997f, -516.955017f, 104.66900f, 0}, // 6
  681. +    {341.740997f, -516.955017f, 104.66900f, 0}, // 7
  682. +    // Breach Zone
  683. +    {485.4577f, -511.2515f, 115.3011f, 0},      //8
  684. +    {435.1892f, -514.5232f, 118.6719f, 0},      //9
  685. +    {413.9327f, -540.9407f, 138.2614f, 0},      //10
  686. +};
  687. +
  688. +enum Phases
  689. +{
  690. +    PHASE_INTRO     = 1,
  691. +    PHASE_FLYING    = 2,
  692. +    PHASE_SHOOTABLE = 3,
  693. +    PHASE_GROUND    = 4
  694. +};
  695. +
  696. +enum Events
  697. +{
  698. +    EVENT_CRUSH             = 1,
  699. +    EVENT_POISONED_SPEAR    = 2,
  700. +    EVENT_WHIRLWIND         = 3,
  701. +    EVENT_MOUNT             = 4,
  702. +    EVENT_MOVE              = 5,
  703. +    EVENT_STOP_CLOUD        = 6,
  704. +    EVENT_SUMMON            = 7
  705. +};
  706. +
  707. +enum Spells
  708. +{
  709. +    // PHASE_INTRO
  710. +    SPELL_RIDE_VEHICLE      = 61791,
  711. +    // PHASE_FLYING
  712. +    SPELL_HARPOON_DAMAGE    = 48642,
  713. +    SPELL_FREEZING_CLOUD    = 47579,
  714. +    SPELL_FREEZING_CLOUD_L  = 47590,
  715. +    SPELL_FREEZING_CLOUD_R  = 47592,
  716. +    SPELL_SKADI_TELEPORT    = 61790,
  717. +    // PHASE_GROUND
  718. +    SPELL_CRUSH             = 50234,
  719. +    SPELL_POISONED_SPEAR    = 50225, //isn't being casted =/
  720. +    SPELL_WHIRLWIND         = 50228 //random target, but not the tank approx. every 20s
  721. +};
  722. +
  723. +enum Creatures
  724. +{
  725. +    NPC_YMIRJAR_WARRIOR       = 26690,
  726. +    NPC_YMIRJAR_WITCH_DOCTOR  = 26691,
  727. +    NPC_YMIRJAR_HARPOONER     = 26692,
  728. +    NPC_TRIGGER               = 28351
  729. +};
  730. +
  731. +enum Achievments
  732. +{
  733. +    ACHIEV_TIMED_START_EVENT                      = 17726,
  734. +};
  735. +
  736. +class boss_skadi : public CreatureScript
  737. +{
  738. +public:
  739. +    boss_skadi() : CreatureScript("boss_skadi") { }
  740. +
  741. +    struct boss_skadiAI : public BossAI
  742. +    {
  743. +        boss_skadiAI(Creature* creature) : BossAI(creature, DATA_SKADI_THE_RUTHLESS), Summons(me)
  744. +        {
  745. +            instance = creature->GetInstanceScript();
  746. +            m_uiGraufGUID = 0;
  747. +        }
  748. +
  749. +        InstanceScript* instance;
  750. +        SummonList Summons;
  751. +        uint64 m_uiGraufGUID;
  752. +        std::vector<uint64> triggersGUID;
  753. +
  754. +        void Reset() OVERRIDE
  755. +        {
  756. +            _Reset();
  757. +            triggersGUID.clear();
  758. +
  759. +            events.SetPhase(PHASE_INTRO);
  760. +
  761. +            Summons.DespawnAll();
  762. +            me->SetSpeed(MOVE_FLIGHT, 3.0f);
  763. +
  764. +            if ((Unit::GetCreature(*me, instance->GetData64(DATA_NPC_GRAUF)) == NULL) && !me->IsMounted())
  765. +                me->SummonCreature(NPC_GRAUF, Location[0].GetPositionX(), Location[0].GetPositionY(), Location[0].GetPositionZ(), 3.0f);
  766. +            if (instance)  
  767. +                instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
  768. +        }
  769. +
  770. +        void JustReachedHome() OVERRIDE
  771. +        {
  772. +            me->Dismount();
  773. +            me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
  774. +            if (!Unit::GetCreature(*me, instance->GetData64(DATA_NPC_GRAUF)))
  775. +                me->SummonCreature(NPC_GRAUF, Location[0].GetPositionX(), Location[0].GetPositionY(), Location[0].GetPositionZ(), 3.0f);
  776. +        }
  777. +
  778. +        void EnterCombat(Unit* /*who*/) OVERRIDE
  779. +        {
  780. +             _EnterCombat();
  781. +            Talk(SAY_AGGRO);
  782. +            me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
  783. +            events.SetPhase(PHASE_INTRO);
  784. +            events.ScheduleEvent(EVENT_MOUNT, 1 * IN_MILLISECONDS);
  785. +
  786. +            if (instance)
  787. +                instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
  788. +        }
  789. +
  790. +        void JustSummoned(Creature* summoned) OVERRIDE
  791. +        {
  792. +            switch (summoned->GetEntry())
  793. +            {
  794. +            case NPC_YMIRJAR_WARRIOR:
  795. +            case NPC_YMIRJAR_WITCH_DOCTOR:
  796. +            case NPC_YMIRJAR_HARPOONER:
  797. +                summoned->setActive(true);
  798. +                summoned->SetInCombatWithZone();
  799. +                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
  800. +                    summoned->AI()->AttackStart(target);
  801. +                break;
  802. +            }
  803. +            Summons.Summon(summoned);
  804. +        }
  805. +
  806. +        void SummonedCreatureDespawn(Creature* summoned) OVERRIDE
  807. +        {
  808. +            Summons.Despawn(summoned);
  809. +        }
  810. +
  811. +        void SpellHit(Unit* /*caster*/, const SpellInfo* spell) OVERRIDE
  812. +        {
  813. +            if(spell->Id == SPELL_SKADI_TELEPORT)
  814. +            {
  815. +                events.SetPhase(PHASE_GROUND);
  816. +                events.ScheduleEvent(EVENT_CRUSH, 8000, 0, PHASE_GROUND);
  817. +                events.ScheduleEvent(EVENT_POISONED_SPEAR, 10000, 0, PHASE_GROUND);
  818. +                events.ScheduleEvent(EVENT_WHIRLWIND, 20000, 0, PHASE_GROUND);
  819. +                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE );
  820. +            }
  821. +        }
  822. +
  823. +        void KilledUnit(Unit* victim) OVERRIDE
  824. +        {
  825. +            if(victim->GetTypeId() == TYPEID_PLAYER)
  826. +                Talk(SAY_KILL);
  827. +        }
  828. +
  829. +        void JustDied(Unit* /*killer*/) OVERRIDE
  830. +        {
  831. +            Talk(SAY_DEATH);
  832. +            _JustDied();
  833. +        }
  834. +
  835. +        void UpdateAI(uint32 diff) OVERRIDE
  836. +        {
  837. +            events.Update(diff);
  838. +
  839. +            if((events.IsInPhase(PHASE_FLYING) || events.IsInPhase(PHASE_GROUND)) && !UpdateVictim())
  840. +                return;
  841. +
  842. +            if(events.IsInPhase(PHASE_GROUND))
  843. +                DoMeleeAttackIfReady();
  844. +
  845. +            while (uint32 eventId = events.ExecuteEvent())
  846. +            {
  847. +                switch (eventId)
  848. +                {
  849. +                case EVENT_MOUNT:                    
  850. +                    me->CastSpell(me->GetUnit(*me, instance->GetData64(DATA_NPC_GRAUF)), SPELL_RIDE_VEHICLE);
  851. +                    events.SetPhase(PHASE_FLYING);
  852. +                    events.ScheduleEvent(EVENT_SUMMON, 10000, 0, PHASE_FLYING);
  853. +                    break;
  854. +                case EVENT_SUMMON:
  855. +                    SpawnMobs();
  856. +                    events.ScheduleEvent(EVENT_SUMMON, 20000, 0, PHASE_FLYING); //20000
  857. +                    break;
  858. +                case EVENT_CRUSH:
  859. +                    DoCastVictim(SPELL_CRUSH);
  860. +                    events.ScheduleEvent(EVENT_CRUSH, 8000, 0, PHASE_GROUND);  
  861. +                    break;
  862. +                case EVENT_POISONED_SPEAR:
  863. +                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
  864. +                        DoCast(target, SPELL_POISONED_SPEAR);
  865. +                    events.ScheduleEvent(EVENT_POISONED_SPEAR, 10000, 0, PHASE_GROUND);
  866. +                    break;
  867. +                case EVENT_WHIRLWIND:
  868. +                    DoCastAOE(SPELL_WHIRLWIND);
  869. +                    events.ScheduleEvent(EVENT_WHIRLWIND, 23000, 0, PHASE_GROUND);
  870. +                    break;                        
  871. +                }
  872. +            }
  873. +        }
  874. +
  875. +        void SpawnMobs()
  876. +        {
  877. +            for (uint8 i = 0; i < DUNGEON_MODE(5, 6); ++i)
  878. +            {
  879. +                switch (urand(0, 2))
  880. +                {
  881. +                case 0:
  882. +                    me->SummonCreature(NPC_YMIRJAR_WARRIOR, SpawnLoc.GetPositionX()+rand()%5, SpawnLoc.GetPositionY()+rand()%5, SpawnLoc.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
  883. +                    break;
  884. +                case 1:
  885. +                    me->SummonCreature(NPC_YMIRJAR_WITCH_DOCTOR, SpawnLoc.GetPositionX()+rand()%5, SpawnLoc.GetPositionY()+rand()%5, SpawnLoc.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
  886. +                    break;
  887. +                case 2:
  888. +                    me->SummonCreature(NPC_YMIRJAR_HARPOONER, SpawnLoc.GetPositionX()+rand()%5, SpawnLoc.GetPositionY()+rand()%5, SpawnLoc.GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
  889. +                    break;
  890. +                }
  891. +            }
  892. +        }
  893. +    };
  894. +    CreatureAI* GetAI(Creature* creature) const OVERRIDE
  895. +    {
  896. +        return new boss_skadiAI(creature);
  897. +    }
  898. +};
  899. +
  900. +class npc_grauf : public CreatureScript
  901. +{
  902. +public:
  903. +    npc_grauf() : CreatureScript("npc_grauf") { }
  904. +
  905. +    struct npc_graufAI : public ScriptedAI
  906. +    {
  907. +        npc_graufAI(Creature* creature) : ScriptedAI(creature)
  908. +        {
  909. +            SetCombatMovement(false);
  910. +            instance = me->GetInstanceScript();
  911. +        }
  912. +
  913. +        InstanceScript* instance;
  914. +        EventMap events;
  915. +        uint32 m_uiWaypointId;
  916. +        std::list<Creature*> CloudTriggerList;
  917. +        uint8 harpoonsHit;
  918. +
  919. +        void Reset() OVERRIDE
  920. +        {
  921. +            events.SetPhase(PHASE_INTRO);
  922. +            m_uiWaypointId = 0;
  923. +            harpoonsHit = 0;
  924. +        }
  925. +
  926. +        void JustReachedHome() OVERRIDE
  927. +        {
  928. +            if(Creature* pSkadi = Unit::GetCreature(*me, DATA_SKADI_THE_RUTHLESS))
  929. +            {
  930. +                pSkadi->AI()->EnterEvadeMode();
  931. +            }
  932. +            me->SetCanFly(false);
  933. +        }
  934. +
  935. +        void SpellHit(Unit* /*caster*/, const SpellInfo* spell) OVERRIDE
  936. +        {
  937. +            if(!instance)
  938. +                return;
  939. +
  940. +            if(spell->Id == SPELL_HARPOON_DAMAGE)
  941. +            {
  942. +                if(me->GetHealth() <= me->GetMaxHealth() * (IsHeroic() ? 0.17f : 0.27f))
  943. +                {
  944. +                    if(Creature* pSkadi = Unit::GetCreature(*me, instance->GetData64(DATA_SKADI_THE_RUTHLESS)))
  945. +                    {
  946. +                        me->RemoveAllAuras();
  947. +                        pSkadi->CastSpell(pSkadi, SPELL_SKADI_TELEPORT, true);
  948. +                        pSkadi->AI()->Talk(SAY_DRAKE_DEATH);
  949. +                    }
  950. +                }
  951. +                me->DealDamage(me, me->GetMaxHealth() * (IsHeroic() ? 0.17f : 0.25f), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false);
  952. +                harpoonsHit++;
  953. +            }
  954. +
  955. +            if(spell->Id == SPELL_RIDE_VEHICLE)
  956. +            {
  957. +                events.SetPhase(PHASE_FLYING);
  958. +                events.ScheduleEvent(EVENT_MOVE, 1000, 0, PHASE_FLYING);
  959. +                me->SetCanFly(true);
  960. +                me->SetDisableGravity(true);
  961. +                me->SetHover(true);
  962. +                me->SetWalk(false);
  963. +            }
  964. +        }
  965. +
  966. +        void CastFreezingCloud(bool triggerLeft) {
  967. +            me->GetCreatureListWithEntryInGrid(CloudTriggerList, NPC_TRIGGER, 200.0f);
  968. +            if(!CloudTriggerList.empty())
  969. +            {
  970. +                for (std::list<Creature*>::const_iterator itr = CloudTriggerList.begin(); itr != CloudTriggerList.end(); ++itr)
  971. +                {
  972. +                    if (Creature* trigger = *itr)
  973. +                    {
  974. +                        if (trigger->GetPositionY() > -511.0f && triggerLeft == true)
  975. +                            trigger->CastSpell(trigger, SPELL_FREEZING_CLOUD, true);
  976. +                        else if (trigger->GetPositionY() < -511.0f && triggerLeft == false)
  977. +                            trigger->CastSpell(trigger, SPELL_FREEZING_CLOUD, true);
  978. +                    }
  979. +                }
  980. +            }
  981. +        }
  982. +
  983. +        void UpdateAI(uint32 diff) OVERRIDE
  984. +        {
  985. +            events.Update(diff);
  986. +
  987. +            //if (me->GetPositionX() >= 519)
  988. +            //{
  989. +            //    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
  990. +            //    Talk(EMOTE_RANGE);
  991. +            //}
  992. +            //else
  993. +            //{
  994. +            //    me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
  995. +            //}
  996. +
  997. +            while (uint32 eventId = events.ExecuteEvent())
  998. +            {
  999. +                switch (eventId)
  1000. +                {
  1001. +                case EVENT_MOVE:
  1002. +                    switch (m_uiWaypointId)
  1003. +                    {
  1004. +                    case 0:
  1005. +                        me->GetMotionMaster()->MovePoint(0, Location[1].GetPositionX(), Location[1].GetPositionY(), Location[1].GetPositionZ());
  1006. +                        events.ScheduleEvent(EVENT_MOVE, 5*IN_MILLISECONDS, 0, PHASE_FLYING);
  1007. +                        break;
  1008. +                    case 1:
  1009. +                        me->GetMotionMaster()->MovePoint(0, Location[2].GetPositionX(), Location[2].GetPositionY(), Location[2].GetPositionZ());
  1010. +                        events.ScheduleEvent(EVENT_MOVE, 2*IN_MILLISECONDS, 0, PHASE_FLYING);
  1011. +                        break;
  1012. +                    case 2:
  1013. +                        me->GetMotionMaster()->MovePoint(0, Location[3].GetPositionX(), Location[3].GetPositionY(), Location[3].GetPositionZ());
  1014. +                        events.ScheduleEvent(EVENT_MOVE, 1.5*IN_MILLISECONDS, 0, PHASE_FLYING);
  1015. +                        break;
  1016. +                    case 3:
  1017. +                        me->GetMotionMaster()->MovePoint(0, Location[8].GetPositionX(), Location[8].GetPositionY(), Location[8].GetPositionZ());
  1018. +                        if(Creature* pSkadi = Unit::GetCreature(*me, instance->GetData64(DATA_SKADI_THE_RUTHLESS)))
  1019. +                        {
  1020. +                            pSkadi->AI()->Talk(SAY_DRAKE_BREATH);
  1021. +                        }
  1022. +                        events.ScheduleEvent(EVENT_MOVE, 2.5*IN_MILLISECONDS, 0, PHASE_FLYING);
  1023. +                        break;
  1024. +                    case 4:
  1025. +                        me->GetMotionMaster()->MovePoint(0, Location[9].GetPositionX(), Location[9].GetPositionY(), Location[9].GetPositionZ());
  1026. +                        switch(urand(0,1))
  1027. +                        {
  1028. +                        case 0 :
  1029. +                            DoCast(SPELL_FREEZING_CLOUD_L);
  1030. +                            CastFreezingCloud(true);
  1031. +                            break;
  1032. +                        case 1 :
  1033. +                            DoCast(SPELL_FREEZING_CLOUD_R);
  1034. +                            CastFreezingCloud(false);
  1035. +                            break;
  1036. +                        }
  1037. +                        events.ScheduleEvent(EVENT_STOP_CLOUD, 5*IN_MILLISECONDS, 0, PHASE_FLYING);
  1038. +                        events.ScheduleEvent(EVENT_MOVE, 2*IN_MILLISECONDS, 0, PHASE_FLYING);
  1039. +                        break;
  1040. +                    case 5:
  1041. +                        me->GetMotionMaster()->MovePoint(0, Location[10].GetPositionX(), Location[10].GetPositionY(), Location[10].GetPositionZ());
  1042. +                        events.ScheduleEvent(EVENT_MOVE, 3*IN_MILLISECONDS, 0, PHASE_FLYING);
  1043. +                        break;
  1044. +                    case 6:
  1045. +                        me->GetMotionMaster()->MovePoint(0, Location[3].GetPositionX(), Location[3].GetPositionY(), Location[3].GetPositionZ());
  1046. +                        m_uiWaypointId = 2;
  1047. +                        events.ScheduleEvent(EVENT_MOVE, 15*IN_MILLISECONDS, 0, PHASE_FLYING);
  1048. +                        break;
  1049. +                    }
  1050. +                    m_uiWaypointId++;
  1051. +                    break;
  1052. +                case EVENT_STOP_CLOUD:
  1053. +                    me->RemoveAurasDueToSpell(SPELL_FREEZING_CLOUD_L);
  1054. +                    me->RemoveAurasDueToSpell(SPELL_FREEZING_CLOUD_R);
  1055. +                    break;
  1056. +                }
  1057. +            }
  1058. +        }
  1059. +    };
  1060. +
  1061. +    CreatureAI* GetAI(Creature* creature) const OVERRIDE
  1062. +    {
  1063. +        return new npc_graufAI(creature);
  1064. +    }
  1065. +};
  1066. +
  1067. +class go_harpoon_launcher : public GameObjectScript
  1068. +{
  1069. +public:
  1070. +    go_harpoon_launcher() : GameObjectScript("go_harpoon_launcher") { }
  1071. +
  1072. +    bool OnGossipHello(Player* player, GameObject* go) OVERRIDE
  1073. +    {
  1074. +        InstanceScript* instance = go->GetInstanceScript();
  1075. +
  1076. +        if (!instance)
  1077. +            return false;
  1078. +
  1079. +        return false;
  1080. +    }
  1081. +};
  1082. +
  1083. +void AddSC_boss_skadi()
  1084. +{
  1085. +    new boss_skadi();
  1086. +    new npc_grauf();
  1087. +    new go_harpoon_launcher();
  1088. +}
  1089. \ No newline at end of file
  1090. diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
  1091. index b8fa871..2c0b72c 100644
  1092. --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
  1093. +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
  1094. @@ -82,11 +82,6 @@ enum Creatures
  1095.      NPC_SCOURGE_HULK                                = 26555
  1096.  };
  1097.  
  1098. -enum GameObjects
  1099. -{
  1100. -    GO_UTGARDE_MIRROR                             = 191745
  1101. -};
  1102. -
  1103.  enum SvalaPhase
  1104.  {
  1105.      IDLE,
  1106. @@ -119,9 +114,9 @@ public:
  1107.          return new boss_svalaAI(creature);
  1108.      }
  1109.  
  1110. -    struct boss_svalaAI : public ScriptedAI
  1111. +    struct boss_svalaAI : public BossAI
  1112.      {
  1113. -        boss_svalaAI(Creature* creature) : ScriptedAI(creature), summons(creature)
  1114. +        boss_svalaAI(Creature* creature) : BossAI(creature, DATA_SVALA_SORROWGRAVE), summons(creature)
  1115.          {
  1116.              instance = creature->GetInstanceScript();
  1117.              Phase = IDLE;
  1118. @@ -152,6 +147,7 @@ public:
  1119.  
  1120.          void Reset() OVERRIDE
  1121.          {
  1122. +            _Reset();
  1123.              sacrificed = false;
  1124.              SetCombatMovement(true);
  1125.  
  1126. @@ -169,20 +165,17 @@ public:
  1127.  
  1128.              if (instance)
  1129.              {
  1130. -                instance->SetData(DATA_SVALA_SORROWGRAVE_EVENT, NOT_STARTED);
  1131.                  instance->SetData64(DATA_SACRIFICED_PLAYER, 0);
  1132.              }
  1133.          }
  1134.  
  1135.          void EnterCombat(Unit* /*who*/) OVERRIDE
  1136.          {
  1137. +            _EnterCombat();
  1138.              Talk(SAY_AGGRO);
  1139.  
  1140.              sinsterStrikeTimer = 7 * IN_MILLISECONDS;
  1141.              callFlamesTimer = urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
  1142. -
  1143. -            if (instance)
  1144. -                instance->SetData(DATA_SVALA_SORROWGRAVE_EVENT, IN_PROGRESS);
  1145.          }
  1146.  
  1147.          void JustSummoned(Creature* summon) OVERRIDE
  1148. @@ -228,6 +221,7 @@ public:
  1149.  
  1150.          void JustDied(Unit* /*killer*/) OVERRIDE
  1151.          {
  1152. +            _JustDied();
  1153.              if (Phase == SACRIFICING)
  1154.                  SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
  1155.  
  1156. @@ -235,9 +229,6 @@ public:
  1157.  
  1158.              summons.DespawnAll();
  1159.  
  1160. -            if (instance)
  1161. -                instance->SetData(DATA_SVALA_SORROWGRAVE_EVENT, DONE);
  1162. -
  1163.              Talk(SAY_DEATH);
  1164.          }
  1165.  
  1166. diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
  1167. index f592a4b..ac14f0a 100644
  1168. --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
  1169. +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
  1170. @@ -108,9 +108,9 @@ public:
  1171.          return new boss_ymironAI(creature);
  1172.      }
  1173.  
  1174. -    struct boss_ymironAI : public ScriptedAI
  1175. +    struct boss_ymironAI : public BossAI
  1176.      {
  1177. -        boss_ymironAI(Creature* creature) : ScriptedAI(creature)
  1178. +        boss_ymironAI(Creature* creature) : BossAI(creature, DATA_KING_YMIRON)
  1179.          {
  1180.              instance = creature->GetInstanceScript();
  1181.              for (int i = 0; i < 4; ++i)
  1182. @@ -159,6 +159,7 @@ public:
  1183.  
  1184.          void Reset() OVERRIDE
  1185.          {
  1186. +            _Reset();
  1187.              m_bIsWalking = false;
  1188.              m_bIsPause = false;
  1189.              m_bIsActiveWithBJORN = false;
  1190. @@ -185,16 +186,13 @@ public:
  1191.              DespawnBoatGhosts(m_uiActivedCreatureGUID);
  1192.              DespawnBoatGhosts(m_uiOrbGUID);
  1193.  
  1194. -            if (instance)
  1195. -                instance->SetData(DATA_KING_YMIRON_EVENT, NOT_STARTED);
  1196. +
  1197.          }
  1198.  
  1199.          void EnterCombat(Unit* /*who*/) OVERRIDE
  1200.          {
  1201. +            _EnterCombat();
  1202.              Talk(SAY_AGGRO);
  1203. -
  1204. -            if (instance)
  1205. -                instance->SetData(DATA_KING_YMIRON_EVENT, IN_PROGRESS);
  1206.          }
  1207.  
  1208.          void SpellHitTarget(Unit* who, SpellInfo const* spell) OVERRIDE
  1209. @@ -371,13 +369,11 @@ public:
  1210.  
  1211.          void JustDied(Unit* /*killer*/) OVERRIDE
  1212.          {
  1213. +            _JustDied();
  1214.              Talk(SAY_DEATH);
  1215.  
  1216.              DespawnBoatGhosts(m_uiActivedCreatureGUID);
  1217.              DespawnBoatGhosts(m_uiOrbGUID);
  1218. -
  1219. -            if (instance)
  1220. -                instance->SetData(DATA_KING_YMIRON_EVENT, DONE);
  1221.          }
  1222.  
  1223.          void KilledUnit(Unit* /*victim*/) OVERRIDE
  1224. diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp
  1225. dissimilarity index 81%
  1226. index 0277c21..e1064f6 100644
  1227. --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp
  1228. +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp
  1229. @@ -1,267 +1,225 @@
  1230. -/*
  1231. - * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
  1232. - *
  1233. - * This program is free software; you can redistribute it and/or modify it
  1234. - * under the terms of the GNU General Public License as published by the
  1235. - * Free Software Foundation; either version 2 of the License, or (at your
  1236. - * option) any later version.
  1237. - *
  1238. - * This program is distributed in the hope that it will be useful, but WITHOUT
  1239. - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  1240. - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  1241. - * more details.
  1242. - *
  1243. - * You should have received a copy of the GNU General Public License along
  1244. - * with this program. If not, see <http://www.gnu.org/licenses/>.
  1245. - */
  1246. -
  1247. -#include "ScriptMgr.h"
  1248. -#include "InstanceScript.h"
  1249. -#include "utgarde_pinnacle.h"
  1250. -
  1251. -#define MAX_ENCOUNTER     4
  1252. -
  1253. -/* Utgarde Pinnacle encounters:
  1254. -0 - Svala Sorrowgrave
  1255. -1 - Gortok Palehoof
  1256. -2 - Skadi the Ruthless
  1257. -3 - King Ymiron
  1258. -*/
  1259. -
  1260. -enum GameObjects
  1261. -{
  1262. -    ENTRY_SKADI_THE_RUTHLESS_DOOR                 = 192173,
  1263. -    ENTRY_KING_YMIRON_DOOR                        = 192174,
  1264. -    ENTRY_GORK_PALEHOOF_SPHERE                    = 188593
  1265. -};
  1266. -
  1267. -class instance_utgarde_pinnacle : public InstanceMapScript
  1268. -{
  1269. -public:
  1270. -    instance_utgarde_pinnacle() : InstanceMapScript("instance_utgarde_pinnacle", 575) { }
  1271. -
  1272. -    InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
  1273. -    {
  1274. -        return new instance_pinnacle(map);
  1275. -    }
  1276. -
  1277. -    struct instance_pinnacle : public InstanceScript
  1278. -    {
  1279. -        instance_pinnacle(Map* map) : InstanceScript(map) {}
  1280. -
  1281. -        uint64 uiSvalaSorrowgrave;
  1282. -        uint64 uiGortokPalehoof;
  1283. -        uint64 uiSkadiTheRuthless;
  1284. -        uint64 uiKingYmiron;
  1285. -
  1286. -        uint64 uiSkadiTheRuthlessDoor;
  1287. -        uint64 uiKingYmironDoor;
  1288. -        uint64 uiGortokPalehoofSphere;
  1289. -
  1290. -        uint64 uiFrenziedWorgen;
  1291. -        uint64 uiRavenousFurbolg;
  1292. -        uint64 uiFerociousRhino;
  1293. -        uint64 uiMassiveJormungar;
  1294. -        uint64 uiPalehoofOrb;
  1295. -
  1296. -        uint64 uiSvala;
  1297. -        uint64 uiSacrificedPlayer;
  1298. -
  1299. -        uint32 m_auiEncounter[MAX_ENCOUNTER];
  1300. -
  1301. -        std::string str_data;
  1302. -
  1303. -        void Initialize() OVERRIDE
  1304. -        {
  1305. -            for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
  1306. -               m_auiEncounter[i] = NOT_STARTED;
  1307. -
  1308. -            uiSvalaSorrowgrave = 0;
  1309. -            uiGortokPalehoof = 0;
  1310. -            uiSkadiTheRuthless = 0;
  1311. -            uiKingYmiron = 0;
  1312. -
  1313. -            uiSkadiTheRuthlessDoor = 0;
  1314. -            uiKingYmironDoor = 0;
  1315. -            uiGortokPalehoofSphere = 0;
  1316. -
  1317. -            uiFrenziedWorgen = 0;
  1318. -            uiRavenousFurbolg = 0;
  1319. -            uiFerociousRhino = 0;
  1320. -            uiMassiveJormungar = 0;
  1321. -            uiPalehoofOrb = 0;
  1322. -
  1323. -            uiSvala = 0;
  1324. -            uiSacrificedPlayer = 0;
  1325. -        }
  1326. -
  1327. -        bool IsEncounterInProgress() const OVERRIDE
  1328. -        {
  1329. -            for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
  1330. -                if (m_auiEncounter[i] == IN_PROGRESS)
  1331. -                    return true;
  1332. -
  1333. -            return false;
  1334. -        }
  1335. -
  1336. -        void OnCreatureCreate(Creature* creature) OVERRIDE
  1337. -        {
  1338. -            switch (creature->GetEntry())
  1339. -            {
  1340. -                case BOSS_SVALA_SORROWGRAVE:  uiSvalaSorrowgrave = creature->GetGUID();  break;
  1341. -                case BOSS_GORTOK_PALEHOOF:    uiGortokPalehoof = creature->GetGUID();    break;
  1342. -                case BOSS_SKADI_RUTHLESS:     uiSkadiTheRuthless = creature->GetGUID();  break;
  1343. -                case BOSS_KING_YMIRON:        uiKingYmiron = creature->GetGUID();        break;
  1344. -                case NPC_FRENZIED_WORGEN:     uiFrenziedWorgen = creature->GetGUID();    break;
  1345. -                case NPC_RAVENOUS_FURBOLG:    uiRavenousFurbolg = creature->GetGUID();   break;
  1346. -                case NPC_MASSIVE_JORMUNGAR:   uiMassiveJormungar = creature->GetGUID();  break;
  1347. -                case NPC_FEROCIOUS_RHINO:     uiFerociousRhino = creature->GetGUID();    break;
  1348. -                case NPC_SVALA:               uiSvala = creature->GetGUID();             break;
  1349. -                case NPC_PALEHOOF_ORB:        uiPalehoofOrb = creature->GetGUID();       break;
  1350. -            }
  1351. -        }
  1352. -
  1353. -        void OnGameObjectCreate(GameObject* go) OVERRIDE
  1354. -        {
  1355. -            switch (go->GetEntry())
  1356. -            {
  1357. -                case ENTRY_SKADI_THE_RUTHLESS_DOOR:
  1358. -                    uiSkadiTheRuthlessDoor = go->GetGUID();
  1359. -                    if (m_auiEncounter[2] == DONE) HandleGameObject(0, true, go);
  1360. -                    break;
  1361. -                case ENTRY_KING_YMIRON_DOOR:
  1362. -                    uiKingYmironDoor = go->GetGUID();
  1363. -                    if (m_auiEncounter[3] == DONE) HandleGameObject(0, true, go);
  1364. -                    break;
  1365. -                case ENTRY_GORK_PALEHOOF_SPHERE:
  1366. -                    uiGortokPalehoofSphere = go->GetGUID();
  1367. -                    if (m_auiEncounter[1] == DONE)
  1368. -                    {
  1369. -                        HandleGameObject(0, true, go);
  1370. -                        go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
  1371. -                    }
  1372. -                    break;
  1373. -            }
  1374. -        }
  1375. -
  1376. -        void SetData(uint32 type, uint32 data) OVERRIDE
  1377. -        {
  1378. -            switch (type)
  1379. -            {
  1380. -                case DATA_SVALA_SORROWGRAVE_EVENT:
  1381. -                    m_auiEncounter[0] = data;
  1382. -                    break;
  1383. -                case DATA_GORTOK_PALEHOOF_EVENT:
  1384. -                    m_auiEncounter[1] = data;
  1385. -                    break;
  1386. -                case DATA_SKADI_THE_RUTHLESS_EVENT:
  1387. -                    if (data == DONE)
  1388. -                        HandleGameObject(uiSkadiTheRuthlessDoor, true);
  1389. -                    m_auiEncounter[2] = data;
  1390. -                    break;
  1391. -                case DATA_KING_YMIRON_EVENT:
  1392. -                    if (data == DONE)
  1393. -                        HandleGameObject(uiKingYmironDoor, true);
  1394. -                    m_auiEncounter[3] = data;
  1395. -                    break;
  1396. -            }
  1397. -
  1398. -            if (data == DONE)
  1399. -                SaveToDB();
  1400. -        }
  1401. -
  1402. -        void SetData64(uint32 type, uint64 data) OVERRIDE
  1403. -        {
  1404. -            switch (type)
  1405. -            {
  1406. -                case DATA_SACRIFICED_PLAYER:
  1407. -                    uiSacrificedPlayer = data;
  1408. -                    break;
  1409. -            }
  1410. -        }
  1411. -
  1412. -        uint32 GetData(uint32 type) const OVERRIDE
  1413. -        {
  1414. -            switch (type)
  1415. -            {
  1416. -                case DATA_SVALA_SORROWGRAVE_EVENT:        return m_auiEncounter[0];
  1417. -                case DATA_GORTOK_PALEHOOF_EVENT:          return m_auiEncounter[1];
  1418. -                case DATA_SKADI_THE_RUTHLESS_EVENT:       return m_auiEncounter[2];
  1419. -                case DATA_KING_YMIRON_EVENT:              return m_auiEncounter[3];
  1420. -            }
  1421. -            return 0;
  1422. -        }
  1423. -
  1424. -        uint64 GetData64(uint32 identifier) const OVERRIDE
  1425. -        {
  1426. -            switch (identifier)
  1427. -            {
  1428. -                case DATA_SVALA_SORROWGRAVE:      return uiSvalaSorrowgrave;
  1429. -                case DATA_GORTOK_PALEHOOF:        return uiGortokPalehoof;
  1430. -                case DATA_SKADI_THE_RUTHLESS:     return uiSkadiTheRuthless;
  1431. -                case DATA_KING_YMIRON:            return uiKingYmiron;
  1432. -                case DATA_NPC_FRENZIED_WORGEN:    return uiFrenziedWorgen;
  1433. -                case DATA_NPC_RAVENOUS_FURBOLG:   return uiRavenousFurbolg;
  1434. -                case DATA_NPC_MASSIVE_JORMUNGAR:  return uiMassiveJormungar;
  1435. -                case DATA_NPC_FEROCIOUS_RHINO:    return uiFerociousRhino;
  1436. -                case DATA_NPC_ORB:                return uiPalehoofOrb;
  1437. -                case DATA_SVALA:                  return uiSvala;
  1438. -                case DATA_GORTOK_PALEHOOF_SPHERE: return uiGortokPalehoofSphere;
  1439. -                case DATA_SACRIFICED_PLAYER:      return uiSacrificedPlayer;
  1440. -            }
  1441. -
  1442. -            return 0;
  1443. -        }
  1444. -
  1445. -        std::string GetSaveData() OVERRIDE
  1446. -        {
  1447. -            OUT_SAVE_INST_DATA;
  1448. -
  1449. -            std::ostringstream saveStream;
  1450. -            saveStream << "U P " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' '
  1451. -                << m_auiEncounter[2] << ' ' << m_auiEncounter[3];
  1452. -
  1453. -            str_data = saveStream.str();
  1454. -
  1455. -            OUT_SAVE_INST_DATA_COMPLETE;
  1456. -            return str_data;
  1457. -        }
  1458. -
  1459. -        void Load(const char* in) OVERRIDE
  1460. -        {
  1461. -            if (!in)
  1462. -            {
  1463. -                OUT_LOAD_INST_DATA_FAIL;
  1464. -                return;
  1465. -            }
  1466. -
  1467. -            OUT_LOAD_INST_DATA(in);
  1468. -
  1469. -            char dataHead1, dataHead2;
  1470. -            uint16 data0, data1, data2, data3;
  1471. -
  1472. -            std::istringstream loadStream(in);
  1473. -            loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3;
  1474. -
  1475. -            if (dataHead1 == 'U' && dataHead2 == 'P')
  1476. -            {
  1477. -                m_auiEncounter[0] = data0;
  1478. -                m_auiEncounter[1] = data1;
  1479. -                m_auiEncounter[2] = data2;
  1480. -                m_auiEncounter[3] = data3;
  1481. -
  1482. -                for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
  1483. -                    if (m_auiEncounter[i] == IN_PROGRESS)
  1484. -                        m_auiEncounter[i] = NOT_STARTED;
  1485. -
  1486. -            } else OUT_LOAD_INST_DATA_FAIL;
  1487. -
  1488. -            OUT_LOAD_INST_DATA_COMPLETE;
  1489. -        }
  1490. -    };
  1491. -};
  1492. -
  1493. -void AddSC_instance_utgarde_pinnacle()
  1494. -{
  1495. -    new instance_utgarde_pinnacle();
  1496. -}
  1497. +/*
  1498. +* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
  1499. +*
  1500. +* This program is free software; you can redistribute it and/or modify it
  1501. +* under the terms of the GNU General Public License as published by the
  1502. +* Free Software Foundation; either version 2 of the License, or (at your
  1503. +* option) any later version.
  1504. +*
  1505. +* This program is distributed in the hope that it will be useful, but WITHOUT
  1506. +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  1507. +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  1508. +* more details.
  1509. +*
  1510. +* You should have received a copy of the GNU General Public License along
  1511. +* with this program. If not, see <http://www.gnu.org/licenses/>.
  1512. +*/
  1513. +
  1514. +//#include "ScriptMgr.h"
  1515. +#include "InstanceScript.h"
  1516. +#include "utgarde_pinnacle.h"
  1517. +
  1518. +/* Utgarde Pinnacle encounters:
  1519. +0 - Svala Sorrowgrave
  1520. +1 - Gortok Palehoof
  1521. +2 - Skadi the Ruthless
  1522. +3 - King Ymiron
  1523. +*/
  1524. +
  1525. +DoorData const doorData[] =
  1526. +{
  1527. +    { GO_SKADI_THE_RUTHLESS_DOOR, DATA_SKADI_THE_RUTHLESS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
  1528. +    { GO_KING_YMIRON_DOOR,        DATA_KING_YMIRON,        DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
  1529. +    { 0,                          0,                       DOOR_TYPE_ROOM,    BOUNDARY_NONE } // END    
  1530. +};
  1531. +
  1532. +class instance_utgarde_pinnacle : public InstanceMapScript
  1533. +{
  1534. +public:
  1535. +    instance_utgarde_pinnacle() : InstanceMapScript("instance_utgarde_pinnacle", 575) { }
  1536. +
  1537. +    InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
  1538. +    {
  1539. +        return new instance_pinnacle(map);
  1540. +    }
  1541. +
  1542. +    struct instance_pinnacle : public InstanceScript
  1543. +    {
  1544. +        instance_pinnacle(Map* map) : InstanceScript(map)
  1545. +        {
  1546. +            SetBossNumber(EncounterCount);
  1547. +            LoadDoorData(doorData);
  1548. +
  1549. +            SvalaGUID               = 0;
  1550. +            SvalaSorrowgraveGUID    = 0;
  1551. +            SacrificedPlayerGUID     = 0;
  1552. +
  1553. +            GortokPalehoofGUID      = 0;
  1554. +            FrenziedWorgenGUID      = 0;
  1555. +            RavenousFurbolgGUID     = 0;
  1556. +            MassiveJormungarGUID    = 0;
  1557. +            FerociousRhinoGUID      = 0;
  1558. +            PalehoofOrbGUID         = 0;
  1559. +            PalehoofSphereGUID      = 0;
  1560. +
  1561. +            SkadiTheRuthlessGUID    = 0;
  1562. +            GraufGUID               = 0;
  1563. +            SkadiTheRuthlessDoorGUID= 0;
  1564. +
  1565. +            KingYmironGUID          = 0;
  1566. +            KingYmironDoorGUID      = 0;
  1567. +        }
  1568. +
  1569. +        void OnCreatureCreate(Creature* creature) OVERRIDE
  1570. +        {
  1571. +            switch (creature->GetEntry())
  1572. +            {
  1573. +            case BOSS_SVALA_SORROWGRAVE:  SvalaSorrowgraveGUID = creature->GetGUID();  break;
  1574. +            case BOSS_GORTOK_PALEHOOF:    GortokPalehoofGUID = creature->GetGUID();    break;
  1575. +            case BOSS_SKADI_RUTHLESS:     SkadiTheRuthlessGUID = creature->GetGUID();  break;
  1576. +            case BOSS_KING_YMIRON:        KingYmironGUID = creature->GetGUID();        break;
  1577. +            case NPC_FRENZIED_WORGEN:     FrenziedWorgenGUID = creature->GetGUID();    break;
  1578. +            case NPC_RAVENOUS_FURBOLG:    RavenousFurbolgGUID = creature->GetGUID();   break;
  1579. +            case NPC_MASSIVE_JORMUNGAR:   MassiveJormungarGUID = creature->GetGUID();  break;
  1580. +            case NPC_FEROCIOUS_RHINO:     FerociousRhinoGUID = creature->GetGUID();    break;
  1581. +            case NPC_SVALA:               SvalaGUID = creature->GetGUID();             break;
  1582. +            case NPC_PALEHOOF_ORB:        PalehoofOrbGUID = creature->GetGUID();       break;
  1583. +            case NPC_GRAUF:               GraufGUID = creature->GetGUID();             break;
  1584. +            }
  1585. +        }
  1586. +
  1587. +        void OnGameObjectCreate(GameObject* go) OVERRIDE
  1588. +        {
  1589. +            switch (go->GetEntry())
  1590. +            {
  1591. +            case GO_PALEHOOF_SPHERE:
  1592. +                PalehoofSphereGUID = go->GetGUID();
  1593. +                if (GetBossState(DATA_GORTOK_PALEHOOF) == DONE)
  1594. +                {
  1595. +                    HandleGameObject(0, true, go);
  1596. +                    go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
  1597. +                }
  1598. +                break;
  1599. +            case GO_SKADI_THE_RUTHLESS_DOOR:
  1600. +                AddDoor(go, true);
  1601. +                break;
  1602. +            case GO_KING_YMIRON_DOOR:
  1603. +                AddDoor(go, true);
  1604. +                break;
  1605. +
  1606. +            }
  1607. +        }
  1608. +        
  1609. +        void OnGameObjectRemove(GameObject* go) OVERRIDE
  1610. +        {
  1611. +            switch (go->GetEntry())
  1612. +            {
  1613. +            case GO_SKADI_THE_RUTHLESS_DOOR:
  1614. +                AddDoor(go, false);
  1615. +                break;
  1616. +            case GO_KING_YMIRON_DOOR:
  1617. +                AddDoor(go, false);
  1618. +                break;
  1619. +            }
  1620. +        }
  1621. +
  1622. +        void SetData64(uint32 type, uint64 data) OVERRIDE
  1623. +        {
  1624. +            switch (type)
  1625. +            {
  1626. +            case DATA_SACRIFICED_PLAYER:
  1627. +                SacrificedPlayerGUID = data;
  1628. +                break;
  1629. +            }
  1630. +        }
  1631. +
  1632. +        uint64 GetData64(uint32 type) const OVERRIDE
  1633. +        {
  1634. +            switch (type)
  1635. +            {
  1636. +            case DATA_SVALA_SORROWGRAVE:      return SvalaSorrowgraveGUID;
  1637. +            case DATA_GORTOK_PALEHOOF:        return GortokPalehoofGUID;
  1638. +            case DATA_SKADI_THE_RUTHLESS:     return SkadiTheRuthlessGUID;
  1639. +            case DATA_KING_YMIRON:            return KingYmironGUID;
  1640. +            case DATA_NPC_FRENZIED_WORGEN:    return FrenziedWorgenGUID;
  1641. +            case DATA_NPC_RAVENOUS_FURBOLG:   return RavenousFurbolgGUID;
  1642. +            case DATA_NPC_MASSIVE_JORMUNGAR:  return MassiveJormungarGUID;
  1643. +            case DATA_NPC_FEROCIOUS_RHINO:    return FerociousRhinoGUID;
  1644. +            case DATA_NPC_ORB:                return PalehoofOrbGUID;
  1645. +            case DATA_NPC_GRAUF:              return GraufGUID;
  1646. +            case DATA_SVALA:                  return SvalaGUID;
  1647. +            case DATA_GORTOK_PALEHOOF_SPHERE: return PalehoofSphereGUID;
  1648. +            case DATA_SACRIFICED_PLAYER:      return SacrificedPlayerGUID;
  1649. +            }
  1650. +
  1651. +            return 0;
  1652. +        }
  1653. +
  1654. +        std::string GetSaveData() OVERRIDE
  1655. +        {
  1656. +            OUT_SAVE_INST_DATA;
  1657. +
  1658. +            std::ostringstream saveStream;
  1659. +            saveStream << "U P " << GetBossSaveData();
  1660. +
  1661. +            OUT_SAVE_INST_DATA_COMPLETE;
  1662. +            return saveStream.str();
  1663. +        }
  1664. +
  1665. +        void Load(const char* str) OVERRIDE
  1666. +        {
  1667. +            if (!str)
  1668. +            {
  1669. +                OUT_LOAD_INST_DATA_FAIL;
  1670. +                return;
  1671. +            }
  1672. +
  1673. +            OUT_LOAD_INST_DATA(str);
  1674. +
  1675. +            char dataHead1, dataHead2;
  1676. +
  1677. +            std::istringstream loadStream(str);
  1678. +            loadStream >> dataHead1 >> dataHead2;
  1679. +
  1680. +            if (dataHead1 == 'U' && dataHead2 == 'P')
  1681. +            {
  1682. +                for (uint8 i = 0; i < EncounterCount; ++i)
  1683. +                {
  1684. +                    uint32 tmpState;
  1685. +                    loadStream >> tmpState;
  1686. +                    if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
  1687. +                        tmpState = NOT_STARTED;
  1688. +                    SetBossState(i, EncounterState(tmpState));
  1689. +                }
  1690. +
  1691. +            } else OUT_LOAD_INST_DATA_FAIL;
  1692. +
  1693. +            OUT_LOAD_INST_DATA_COMPLETE;
  1694. +        }
  1695. +
  1696. +    protected:
  1697. +        uint64 SvalaGUID;
  1698. +        uint64 SvalaSorrowgraveGUID;
  1699. +        uint64 SacrificedPlayerGUID;
  1700. +
  1701. +        uint64 GortokPalehoofGUID;
  1702. +        uint64 FrenziedWorgenGUID;
  1703. +        uint64 RavenousFurbolgGUID;
  1704. +        uint64 MassiveJormungarGUID;
  1705. +        uint64 FerociousRhinoGUID;  
  1706. +        uint64 PalehoofOrbGUID;    
  1707. +        uint64 PalehoofSphereGUID;
  1708. +
  1709. +        uint64 SkadiTheRuthlessGUID;
  1710. +        uint64 GraufGUID;
  1711. +        uint64 SkadiTheRuthlessDoorGUID;          
  1712. +
  1713. +        uint64 KingYmironGUID;
  1714. +        uint64 KingYmironDoorGUID;      
  1715. +    };
  1716. +};
  1717. +
  1718. +void AddSC_instance_utgarde_pinnacle()
  1719. +{
  1720. +    new instance_utgarde_pinnacle();
  1721. +}
  1722. diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
  1723. index 6166b7c..68930e1 100644
  1724. --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
  1725. +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
  1726. @@ -18,31 +18,29 @@
  1727.  #ifndef DEF_PINNACLE_H
  1728.  #define DEF_PINNACLE_H
  1729.  
  1730. -enum Data
  1731. -{
  1732. -    DATA_SVALA_SORROWGRAVE_EVENT,
  1733. -    DATA_GORTOK_PALEHOOF_EVENT,
  1734. -    DATA_SKADI_THE_RUTHLESS_EVENT,
  1735. -    DATA_KING_YMIRON_EVENT
  1736. -};
  1737. +uint32 const EncounterCount = 4;
  1738.  
  1739. -enum Data64
  1740. +enum DataTypes
  1741.  {
  1742. -    DATA_SVALA,
  1743. -    DATA_SVALA_SORROWGRAVE,
  1744. -    DATA_GORTOK_PALEHOOF,
  1745. -    DATA_SKADI_THE_RUTHLESS,
  1746. -    DATA_NPC_GRAUF,
  1747. -    DATA_KING_YMIRON,
  1748. -    DATA_NPC_FRENZIED_WORGEN,
  1749. -    DATA_NPC_RAVENOUS_FURBOLG,
  1750. -    DATA_NPC_MASSIVE_JORMUNGAR,
  1751. -    DATA_NPC_FEROCIOUS_RHINO,
  1752. -    DATA_NPC_ORB,
  1753. -    DATA_GORTOK_PALEHOOF_SPHERE,
  1754. -    DATA_SACRIFICED_PLAYER
  1755. +    DATA_SVALA                  = 0,
  1756. +    DATA_GORTOK_PALEHOOF        = 1,
  1757. +    DATA_SKADI_THE_RUTHLESS     = 2,
  1758. +    DATA_KING_YMIRON            = 3,  
  1759. +
  1760. +    DATA_SVALA_SORROWGRAVE      = 4,
  1761. +    DATA_SACRIFICED_PLAYER      = 5,
  1762. +
  1763. +    DATA_NPC_FRENZIED_WORGEN    = 6,
  1764. +    DATA_NPC_RAVENOUS_FURBOLG   = 7,
  1765. +    DATA_NPC_MASSIVE_JORMUNGAR  = 8,
  1766. +    DATA_NPC_FEROCIOUS_RHINO    = 9,
  1767. +    DATA_NPC_ORB                = 10,
  1768. +    DATA_GORTOK_PALEHOOF_SPHERE = 11,
  1769. +
  1770. +    DATA_NPC_GRAUF              = 12
  1771.  };
  1772.  
  1773. +
  1774.  enum CreatureID
  1775.  {
  1776.      BOSS_SVALA_SORROWGRAVE   = 26668,
  1777. @@ -54,7 +52,16 @@ enum CreatureID
  1778.      NPC_MASSIVE_JORMUNGAR    = 26685,
  1779.      NPC_FEROCIOUS_RHINO      = 26686,
  1780.      NPC_SVALA                = 29281,
  1781. -    NPC_PALEHOOF_ORB         = 26688
  1782. +    NPC_PALEHOOF_ORB         = 26688,
  1783. +    NPC_GRAUF                = 26893
  1784. +};
  1785. +
  1786. +enum GameObjects
  1787. +{
  1788. +    GO_SKADI_THE_RUTHLESS_DOOR            = 192173,
  1789. +    GO_KING_YMIRON_DOOR                   = 192174,
  1790. +    GO_PALEHOOF_SPHERE                    = 188593,
  1791. +    GO_UTGARDE_MIRROR                     = 191745
  1792.  };
  1793.  
  1794. -#endif
  1795. +#endif
  1796. \ No newline at end of file
  1797. --
  1798. 1.8.3.msysgit.0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement