Advertisement
stoneharry

Untitled

Jan 22nd, 2012
4,214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 132.45 KB | None | 0 0
  1. /*
  2. * Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/>
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation; either version 2 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the Free Software
  16. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17. */
  18.  
  19. /* The script is NOT originaly created by ME!!! I dont know WHO is the ORIGINAL AUTHOR!!!!
  20. *
  21. *              
  22. *   If you have ANY BUILD ERRORS, you must solve them BY YOURSELF
  23. *     I CAN NOT Prommise that the code will run smooth without
  24. *           build errors in latest Trinity Revisions.
  25. *         PLEASE SHARE ANY CODE OPTIMIZATIONS AND FIXES
  26. *                  you've made with others!!!
  27. */
  28.  
  29.  
  30. #include "icecrown_citadel.h"
  31. #include "MapManager.h"
  32. #include "Transport.h"
  33. #include "Vehicle.h"
  34. #include "Group.h"
  35.  
  36. enum eAchievements
  37. {
  38.     IM_ON_A_BOAT_10    = 4536,
  39.     IM_ON_A_BOAT_25    = 4612
  40. };
  41.  
  42. enum Actions
  43. {
  44.     ACTION_INTRO_START             = 1,
  45.     ACTION_BATTLE_EVENT            = 2,
  46.     ACTION_MAGE_DIE                = 3,
  47.     ACTION_ROCK_DIE                = 4,
  48.     ACTION_AXES_RIFL_DIE           = 5,
  49.     ACTION_DONE                    = 6,
  50.     ACTION_FAIL                    = 7,
  51. };
  52.  
  53. enum Spells
  54. {
  55.     SPELL_BURNING_PITCH_A             = 71335,
  56.     SPELL_BURNING_PITCH_H             = 71339,
  57.     SPELL_BURNING_PITCH_SIEGE_DMG_A   = 70383,
  58.     SPELL_BURNING_PITCH_SIEGE_DMG_H   = 70374,
  59.     SPELL_BURNING_PITCH_AOE_DAMAGE    = 69660,
  60.  
  61.     SPELL_WOUNDING_STRIKE_10_NM       = 69651,
  62.     SPELL_WOUNDING_STRIKE_10_HM       = 72570,
  63.     SPELL_WOUNDING_STRIKE_25_NM       = 72569,
  64.     SPELL_WOUNDING_STRIKE_25_HM       = 72571,
  65.  
  66.     SPELL_TELEPORT_VISUAL             = 64446,
  67.     SPELL_BLADESTORM                  = 69652,
  68.     SPELL_BLADESTORM_TRIGGER          = 69653,
  69.  
  70.     // Cannon
  71.     SPELL_HEAT_DRAIN                  = 69470,
  72.     SPELL_OVERHEAT                    = 69487,
  73.     SPELL_CANNON_BLAST                = 69399,
  74.     SPELL_INCINERATING_BLAST          = 69401,
  75.  
  76.     // Auras
  77.     SPELL_ON_ORGRIMS_HAMMERS_DECK     = 70121,
  78.     SPELL_ON_SKYBREAKERS_DECK         = 70120,
  79.  
  80.     // Achievement spell required target
  81.     SPELL_ACHIEVEMENT                 = 72959,
  82.  
  83.     // Rampart of Skulls NPCs Spells
  84.     // Kor'kron Primalist
  85.     SPELL_WRATH                       = 69968,
  86.     SPELL_HEALING_TOUCH               = 69899,
  87.     SPELL_REGROWTH                    = 69882,
  88.     SPELL_REJUVENATION                = 69898,
  89.  
  90.     SPELL_SUMMON_BATTLE_STANDART_A    = 69810,
  91.     SPELL_SUMMON_BATTLE_STANDART_H    = 69811,
  92.  
  93.     // Kor'kron Defender
  94.     SPELL_DEVASTATE                   = 69902,
  95.     SPELL_THUNDERCLAP                 = 69965,
  96.     SPELL_SUNDER_ARMOR                = 57807,
  97.     SPELL_SPELL_REFLECT               = 69901,
  98.  
  99.     // Skybreaker Vindicator
  100.     SPELL_AVENGERS_SHIELD             = 69927,
  101.     SPELL_CONCENTRATION               = 69930,
  102.     SPELL_HOLY_WRATH                  = 69934,
  103.  
  104.     // Frostwyrm
  105.     SPELL_FROST_BREATH                = 70116,
  106.     SPELL_BLIZZARD                    = 70362,
  107.     SPELL_FROST_CLEAVE                = 70361,
  108.  
  109.     // Muradin Bronzebeard / High Overlord Saurfang
  110.     SPELL_CLEAVE                      = 15284,
  111.     SPELL_RENDING_THROW               = 70309,
  112.     SPELL_TASTE_OF_BLOOD              = 69634,
  113.  
  114.     // Kor'kron Battle-mage & Skybreaker Sorcerer
  115.     SPELL_BELOW_ZERO                  = 69705,
  116.     SPELL_SHADOW_CHANNELING           = 45104,
  117.  
  118.     // Experience spells
  119.     SPELL_EXPERIENCED                 = 71188,
  120.     SPELL_VETERAN                     = 71193,
  121.     SPELL_ELITE                       = 71195,
  122.     SPELL_DESPERATE_RESOLVE_10_NM     = 69647,
  123.     SPELL_DESPERATE_RESOLVE_10_HM     = 72537,
  124.     SPELL_DESPERATE_RESOLVE_25_NM     = 72536,
  125.     SPELL_DESPERATE_RESOLVE_25_HM     = 72538,
  126.  
  127.     // Kor'kron Axethrower & Skybreaker Rifleman
  128.     SPELL_HURL_AXE                    = 70161,
  129.     SPELL_SHOOT                       = 70162,
  130.  
  131.     // Kor'kron Rocketeer & Skybreaker Mortar Soldier
  132.     SPELL_ROCKET_ARTILLERY_MARKER     = 71371,
  133.     SPELL_ROCKET_ARTILLERY_TRIGGERED  = 69679,
  134.     SPELL_ROCKET_ARTILLERY_HORDE      = 69678,
  135.     SPELL_ROCKET_ARTILLERY_ALLIANCE   = 70609,
  136.     SPELL_EXPLOSION                   = 69680,
  137.  
  138.     // Ship Explsion
  139.     SPELL_SHIP_EXPLOSION              = 72137,
  140.  
  141.     // Remove Rocket Packs
  142.     SPELL_REMOVE_ROCKET_PACK          = 70713,
  143.  
  144.     // Achievements
  145.     SPELL_ACHIEVEMENT_CHECK           = 72959,
  146. };
  147.  
  148. enum Events
  149. {
  150.     EVENT_NULL,
  151.     EVENT_INTRO_ALLIANCE_1, // Muradin Bronzebeard yells: Fire up the engines! We got a meetin' with destiny, lads!
  152.     EVENT_INTRO_ALLIANCE_2, // Muradin Bronzebeard yells: Hold on to yer hats!
  153.     EVENT_INTRO_ALLIANCE_3, // Muradin Bronzebeard yells: What in the world is that? Grab me spyglass, crewman!
  154.     EVENT_INTRO_ALLIANCE_4, // Muradin Bronzebeard yells: By me own beard! HORDE SAILIN' IN FAST 'N HOT!
  155.     EVENT_INTRO_ALLIANCE_5, // Muradin Bronzebeard yells: EVASIVE ACTION! MAN THE GUNS!
  156.     EVENT_INTRO_ALLIANCE_6, // Muradin Bronzebeard yells: Cowardly dogs! Ye blindsided us!
  157.     EVENT_INTRO_ALLIANCE_7, // High Overlord Saurfang yells: This is not your battle, dwarf. Back down or we will be forced to destroy your ship.
  158.     EVENT_INTRO_ALLIANCE_8, // Muradin Bronzebeard yells: Not me battle? I dunnae who ye think ye are, mister, but I got a score to settle with Arthas and yer not gettin' in me way! FIRE ALL GUNS! FIRE! FIRE!
  159.  
  160.     EVENT_INTRO_HORDE_1, // High Overlord Saurfang yells: Rise up, sons and daughters of the Horde! Today we battle a hated enemy of the Horde! LOK'TAR OGAR! Kor'kron, take us out!
  161.     EVENT_INTRO_HORDE_1_1, // Kor'kron, take us out!
  162.     EVENT_INTRO_HORDE_2, // High Overlord Saurfang yells: What is that?! Something approaching in the distance!
  163.     EVENT_INTRO_HORDE_3, // High Overlord Saurfang yells: ALLIANCE GUNSHIP! ALL HANDS ON DECK!
  164.     EVENT_INTRO_HORDE_4, // Muradin Bronzebeard yells: Move yer jalopy or we'll blow it out of the sky, orc! The Horde's got no business here!
  165.     EVENT_INTRO_HORDE_5, // High Overlord Saurfang yells: You will know our business soon! KOR'KRON, ANNIHILATE THEM!
  166.  
  167.     EVENT_OUTRO_ALLIANCE_1,
  168.     EVENT_OUTRO_ALLIANCE_2,
  169.     EVENT_OUTRO_ALLIANCE_3,
  170.  
  171.     EVENT_OUTRO_HORDE_1,
  172.     EVENT_OUTRO_HORDE_2,
  173.     EVENT_OUTRO_HORDE_3,
  174.  
  175.     //Fly
  176.     EVENT_START_FLY,
  177.  
  178.     //Misc battle
  179.     EVENT_WALK_MOBS,
  180.     EVENT_SUMMON_PORTAL,
  181.     EVENT_FREEZE_CANNON,
  182.     EVENT_SHADOW_CHANNELING,
  183.     EVENT_UNSUMMON_PORTAL,
  184.     EVENT_BOARDING_GUNSHIP,
  185.     EVENT_BOARDING_TALK,
  186.     EVENT_BURNING_PITCH,
  187.     EVENT_WOUNDING_STRIKE,
  188.     EVENT_BLADE_STORM,
  189.     EVENT_DONE,
  190.     EVENT_FAIL,
  191.     EVENT_RESTART_EVENT,
  192.     EVENT_BOARDING_REAVERS_MARINE,
  193.     EVENT_WIPE_CHECK,
  194.  
  195.     // Rampart of Skulls NPCs Events
  196.     EVENT_WRATH,
  197.     EVENT_HEAL,
  198.  
  199.     EVENT_SUNDER_ARMOR,
  200.     EVENT_SPELL_REFLECT,
  201.     EVENT_THUNDERCLAP,
  202.     EVENT_DEVASTATE,
  203.  
  204.     EVENT_FROST_BREATH,
  205.     EVENT_BLIZZARD,
  206.     EVENT_CLEAVE,
  207.  
  208.     // Skybreaker Vindicator
  209.     EVENT_AVENGERS_SHILED,
  210.     EVENT_CONCENTRATION,
  211.     EVENT_HOLY_WRATH,
  212.  
  213.     // First Squad Assisted
  214.     EVENT_FIRST_SQUAD_ASSISTED_1,
  215.     EVENT_FIRST_SQUAD_ASSISTED_2,
  216.  
  217.     // Second Squad Assisted
  218.     EVENT_SECOND_SQUAD_ASSISTED_1,
  219.     EVENT_SECOND_SQUAD_ASSISTED_2,
  220.     EVENT_SECOND_SQUAD_ASSISTED_3,
  221.  
  222.     // Shared experience events
  223.     EVENT_EXPERIENCED,
  224.     EVENT_VETERAN,
  225.     EVENT_ELITE,
  226.     EVENT_ATACK_START,
  227.  
  228.     // Kor'kron Axethrower & Skybreaker Rifleman
  229.     EVENT_HURL_AXE,
  230.     EVENT_SHOOT,
  231.  
  232.     // Kor'kron Rocketeer & Skybreaker Mortar Soldier
  233.     EVENT_ROCKET_ART,
  234.  
  235.     // Muradin Bronzebeard & High Overlord Saurfang
  236.     EVENT_RENDING_THROW,
  237.     EVENT_TASTE_OF_BLOOD,
  238.  
  239.     // Misc (used in various NPCs)
  240.     EVENT_SPAWN_MAGE,
  241.     EVENT_RESPAWN_AXES_RIFLEMEN,
  242.     EVENT_RESPAWN_ROCKETEER,
  243. };
  244.  
  245. enum Texts
  246. {
  247.     // Kor'kron Primalist
  248.     SAY_FIRST_SQUAD_RESCUED_HORDE_0  = 0,
  249.  
  250.     // Kor'kron Invoker
  251.     SAY_FIRST_SQUAD_RESCUED_HORDE_1  = 0,
  252.  
  253.     // Kor'kron Defender
  254.     SAY_SECOND_SQUAD_RESCUED_HORDE_0 = 0,
  255.     SAY_SECOND_SQUAD_RESCUED_HORDE_1 = 1,
  256.     SAY_FROSTWYRM_SUMMON_0           = 2,
  257.     SAY_FROSTWYRM_SUMMON_1           = 3,
  258.  
  259.     // Skybreaker Vindicator
  260.     SAY_FIRST_SQUAD_RESCUED_ALLIANCE_0  = 0,
  261.  
  262.     // Skybreaker Sorcerer
  263.     SAY_FIRST_SQUAD_RESCUED_ALLIANCE_1  = 0,
  264.  
  265.     // Skybreaker Protector
  266.     SAY_SECOND_SQUAD_RESCUED_ALLIANCE_0 = 0,
  267.     SAY_SECOND_SQUAD_RESCUED_ALLIANCE_1 = 1,
  268.     SAY_SECOND_SQUAD_RESCUED_ALLIANCE_2 = 2,
  269.  
  270.     // Kor'kron Invoker & Skybreaker Sorcerer
  271.     SAY_SUMMON_BATTLE_STANDARD          = 1,
  272.  
  273.     // Froswyrm
  274.     SAY_FROSTWYRM_LAND_H_0           = 0,
  275.     SAY_FROSTWYRM_LAND_A_1           = 1,
  276.  
  277.     // Muradin Bronzebeard
  278.     SAY_INTRO_ALLIANCE_0             = 0,
  279.     SAY_INTRO_ALLIANCE_1             = 1,
  280.     SAY_INTRO_ALLIANCE_2             = 2,
  281.     SAY_INTRO_ALLIANCE_3             = 3,
  282.     SAY_INTRO_ALLIANCE_4             = 4,
  283.     SAY_INTRO_ALLIANCE_5             = 5,
  284.     SAY_INTRO_ALLIANCE_7             = 6,
  285.     SAY_INTRO_HORDE_3                = 7,
  286.     SAY_BOARDING_SKYBREAKER_1        = 8,
  287.     SAY_BOARDING_ORGRIMS_HAMMER_0    = 9,
  288.     SAY_NEW_RIFLEMEN_SPAWNED         = 10,
  289.     SAY_NEW_MORTAR_TEAM_SPAWNED      = 11,
  290.     SAY_NEW_MAGE_SPAWNED             = 12,
  291.     SAY_ALLIANCE_VICTORY             = 13,
  292.     SAY_ALLIANCE_DEFEAT              = 14, // How will we handle that case ? Ie. the player loses
  293.  
  294.     // High Overlord Saurfang
  295.     SAY_INTRO_HORDE_0                = 0,
  296.     SAY_INTRO_HORDE_0_1              = 1,
  297.     SAY_INTRO_HORDE_1                = 2,
  298.     SAY_INTRO_HORDE_2                = 3,
  299.     SAY_INTRO_HORDE_4                = 4,
  300.     SAY_BOARDING_SKYBREAKER_0        = 5,
  301.     SAY_BOARDING_ORGRIMS_HAMMER_1    = 6,
  302.     SAY_NEW_AXETHROWER_SPAWNED       = 7,
  303.     SAY_NEW_ROCKETEERS_SPAWNED       = 8,
  304.     SAY_NEW_BATTLE_MAGE_SPAWNED      = 9,
  305.     SAY_HORDE_VICTORY                = 10,
  306.     SAY_HORDE_DEFEAT                 = 11, // How will we handle that case ? Ie. the player loses
  307.  
  308.     SAY_HIGH_OVERLORD_SAURFANG_NOT_VISUAL = 0,
  309.     SAY_BOARDING_SKYBREAKER_SAURFANG      = 1,
  310.     SAY_MURADIN_BRONZEBEARD_NOT_VISUAL    = 0,
  311.     SAY_BOARDING_SKYBREAKER_MURADIN       = 1,
  312. };
  313.  
  314. Position const FrostWyrmPosH   = {-435.429f, 2077.556f, 219.1148f, 4.767166f};
  315. Position const FrostWyrmPosA   = {-437.409f, 2349.026f, 219.1148f, 1.483120f};
  316.  
  317. struct mortarMarksLoc
  318. {
  319.     uint32 durationBeforeRefreshing;
  320.     Position location;
  321. };
  322.  
  323.  
  324. //Function find player special for Gunship battle
  325. typedef std::list<Player*> TPlayerLists;
  326.  
  327. TPlayerLists GetPlayersInTheMaps(Map *pMap)
  328. {
  329.     TPlayerLists players;
  330.     const Map::PlayerList &PlayerList = pMap->GetPlayers();
  331.     if (!PlayerList.isEmpty())
  332.         for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
  333.             if (Player* player = i->getSource())
  334.                 players.push_back(player);
  335.     return players;
  336. }
  337.  
  338. Player* SelectRandomPlayerFromLists(TPlayerLists &players)
  339. {
  340.     if (players.empty())
  341.         return NULL;
  342.     TPlayerLists::iterator it = players.begin();
  343.     std::advance(it, urand(0, players.size()-1));
  344.     return *it;
  345. }
  346.  
  347. Player* SelectRandomPlayerInTheMaps(Map* pMap)
  348. {
  349.     TPlayerLists players = GetPlayersInTheMaps(pMap);
  350.     return SelectRandomPlayerFromLists(players);
  351. }
  352.  
  353. //Function start motion of the ship
  354. void StartFlyShip(Transport* t)
  355. {
  356.     t->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
  357.     t->SetGoState(GO_STATE_ACTIVE);
  358.     t->SetUInt32Value(GAMEOBJECT_DYNAMIC, 0x10830010); // Seen in sniffs
  359.     t->SetFloatValue(GAMEOBJECT_PARENTROTATION + 3, 1.0f);
  360.  
  361.     Map* map = t->GetMap();
  362.     std::set<uint32> mapsUsed;
  363.     GameObjectTemplate const* goinfo = t->GetGOInfo();
  364.  
  365.     t->GenerateWaypoints(goinfo->moTransport.taxiPathId, mapsUsed);
  366.  
  367.     for (Map::PlayerList::const_iterator itr = map->GetPlayers().begin(); itr != map->GetPlayers().end(); ++itr)
  368.     {
  369.         if (Player* pPlayer = itr->getSource())
  370.         {
  371.             UpdateData transData;
  372.             t->BuildCreateUpdateBlockForPlayer(&transData, pPlayer);
  373.             WorldPacket packet;
  374.             transData.BuildPacket(&packet);
  375.             pPlayer->SendDirectMessage(&packet);
  376.         }
  377.     }
  378. }
  379.  
  380. void RelocateTransport(Transport* t)
  381. {
  382.     Map* map = t->GetMap();
  383.     InstanceScript* instance = t->GetInstanceScript();
  384.  
  385.     if (!t || !instance)
  386.         return;
  387.  
  388.     // Transoprt movemend on server-side is ugly hack, so we do sincronize positions
  389.     switch (t->GetEntry())
  390.     {
  391.     case GO_THE_SKYBREAKER_ALLIANCE_ICC:
  392.         if (instance->GetBossState(DATA_GUNSHIP_EVENT) != DONE)
  393.             t->Relocate(-377.184021f, 2073.548584f, 445.753387f);
  394.         else if (instance->GetBossState(DATA_GUNSHIP_EVENT) == DONE)
  395.             t->Relocate(-583.942627f, 2212.364990f, 534.673889f);
  396.         break;
  397.     case GO_ORGRIM_S_HAMMER_ALLIANCE_ICC:
  398.         if (instance->GetBossState(DATA_GUNSHIP_EVENT) != DONE)
  399.             t->Relocate(-384.878479f, 1989.831665f, 431.549438f);
  400.         break;
  401.     case GO_ORGRIM_S_HAMMER_HORDE_ICC:
  402.         if (instance->GetBossState(DATA_GUNSHIP_EVENT) != DONE)
  403.             t->Relocate(-438.142365f, 2395.725830f, 436.781647f);
  404.         else if (instance->GetBossState(DATA_GUNSHIP_EVENT) == DONE)
  405.             t->Relocate(-583.942627f, 2212.364990f, 534.673889f);
  406.         break;
  407.     case GO_THE_SKYBREAKER_HORDE_ICC:
  408.         if (instance->GetBossState(DATA_GUNSHIP_EVENT) != DONE)
  409.             t->Relocate(-435.854156f, 2475.328125f, 449.364105f);
  410.         break;
  411.     }
  412.  
  413.     t->Update(0);
  414.     t->UpdateNPCPositions();
  415. }
  416.  
  417.  
  418. //Function stop motion of the ship
  419. void StopFlyShip(Transport* t)
  420. {
  421.     Map* map = t->GetMap();
  422.     t->m_WayPoints.clear();
  423.     RelocateTransport(t);
  424.     t->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
  425.     t->SetGoState(GO_STATE_READY);
  426.  
  427.     for (Map::PlayerList::const_iterator itr = map->GetPlayers().begin(); itr != map->GetPlayers().end(); ++itr)
  428.     {
  429.         if (Player* pPlayer = itr->getSource())
  430.         {
  431.             UpdateData transData;
  432.             t->BuildCreateUpdateBlockForPlayer(&transData, pPlayer);
  433.             WorldPacket packet;
  434.             transData.BuildPacket(&packet);
  435.             pPlayer->SendDirectMessage(&packet);
  436.         }
  437.     }
  438. }
  439.  
  440. //Find Unfriendy transport
  441. Transport* CheckUnfriendlyShip(Creature* me, InstanceScript* instance, uint32 data)
  442. {
  443.     if(Creature* pCapitan = ObjectAccessor::GetCreature(*me, instance->GetData64(data)))
  444.         return pCapitan->GetTransport();
  445.     else
  446.         return NULL;
  447. }
  448.  
  449. //Teleport players
  450. void TeleportPlayers(Map* map, uint64 TeamInInstance)
  451. {
  452.     if(map)
  453.     {
  454.         Map::PlayerList const &lPlayers = map->GetPlayers();
  455.         if (!lPlayers.isEmpty())
  456.         {
  457.             for(Map::PlayerList::const_iterator itr = lPlayers.begin(); itr != lPlayers.end(); ++itr)
  458.             {
  459.                 if (Player* pPlayer = itr->getSource())
  460.                 {
  461.                     if (pPlayer->isDead() && !pPlayer->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST))
  462.                         pPlayer->ResurrectPlayer(1.0f);
  463.  
  464.                     if(TeamInInstance == ALLIANCE)
  465.                         pPlayer->TeleportTo(631, -437.498505f, 2425.954f, 192.997f, 2.247f);
  466.                     else
  467.                         pPlayer->TeleportTo(631, -437.498505f, 1997.954f, 192.997f, 2.247f);
  468.                 }
  469.             }
  470.         }
  471.     }
  472. }
  473.  
  474. //Ship explosion
  475. void DoShipExplosion(Transport* t)
  476. {
  477.     for (Transport::CreatureSet::iterator itr = t->m_NPCPassengerSet.begin(); itr != t->m_NPCPassengerSet.end();)
  478.     {
  479.         if (Creature* npc = *itr)
  480.         {
  481.             if(npc->GetEntry() == NPC_GB_GUNSHIP_HULL)
  482.                 npc->CastSpell(npc, SPELL_SHIP_EXPLOSION, true);
  483.         }
  484.         ++itr;
  485.     }
  486. }
  487.  
  488. //Wipe check
  489. bool DoWipeCheck(Transport* t)
  490. {
  491.     for (Transport::PlayerSet::const_iterator itr = t->GetPassengers().begin(); itr != t->GetPassengers().end();)
  492.     {
  493.         Player* plr = *itr;
  494.         ++itr;
  495.  
  496.         if (plr && plr->isAlive())
  497.             return true;
  498.     }
  499.     return false;
  500. }
  501.  
  502. //Check falling players
  503. void DoCheckFallingPlayer(Creature* me)
  504. {
  505.     Map* map = me->GetMap();
  506.  
  507.     if(map)
  508.     {
  509.         Map::PlayerList const &lPlayers = map->GetPlayers();
  510.         if (!lPlayers.isEmpty())
  511.         {
  512.             for(Map::PlayerList::const_iterator itr = lPlayers.begin(); itr != lPlayers.end(); ++itr)
  513.             {
  514.                 if (Player* pPlayer = itr->getSource())
  515.                 {
  516.                     if (pPlayer->GetPositionZ() < 420.0f && pPlayer->IsWithinDistInMap(me, 300.0f))
  517.                         pPlayer->NearTeleportTo(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 5.0f, me->GetOrientation());
  518.                 }
  519.             }
  520.         }
  521.     }
  522. }
  523.  
  524. //Restart event
  525. void RestartEvent(Transport* t1, Transport* t2, Map* instance, uint64 TeamInInstance)
  526. {
  527.     sMapMgr->UnLoadTransportFromMap(t1);
  528.     sMapMgr->UnLoadTransportFromMap(t2);
  529.  
  530.     Map::PlayerList const& players = instance->GetPlayers();
  531.     if (players.isEmpty())
  532.         return;
  533.  
  534.     if(TeamInInstance == ALLIANCE)
  535.     {
  536.         if(Transport* th = sMapMgr->LoadTransportInMap(instance, GO_ORGRIM_S_HAMMER_ALLIANCE_ICC, 108000))
  537.         {
  538.             th->AddNPCPassengerInInstance(NPC_GB_ORGRIMS_HAMMER, 1.845810f, 1.268872f, 34.526218f, 1.5890f);
  539.             th->AddNPCPassengerInInstance(NPC_GB_HIGH_OVERLORD_SAURFANG, 37.18615f, 0.00016f, 36.78849f, 3.13683f);
  540.             th->AddNPCPassengerInInstance(NPC_GB_INVISIBLE_STALKER, 37.18615f, 0.00016f, 36.78849f, 3.13683f);
  541.             th->AddNPCPassengerInInstance(NPC_GB_KORKRON_BATTLE_MAGE, 47.2929f, -4.308941f, 37.5555f, 3.05033f);
  542.             th->AddNPCPassengerInInstance(NPC_GB_KORKRON_BATTLE_MAGE, 47.34621f, 4.032004f, 37.70952f, 3.05033f);
  543.             th->AddNPCPassengerInInstance(NPC_GB_KORKRON_BATTLE_MAGE, 15.03016f, 0.00016f, 37.70952f, 1.55138f);
  544.             th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -13.19547f, -27.160213f, 35.47252f, 3.10672f);
  545.             th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -18.33902f, -25.230491f, 33.04052f, 3.00672f);
  546.             th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -60.1251f, -1.27014f, 42.8335f, 5.16073f);
  547.             th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -48.2651f, 16.78034f, 34.2515f, 0.04292f);
  548.             th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -14.8356f, 27.931688f, 33.363f, 1.73231f);
  549.             th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 10.2702f, 20.62966f, 35.37483f, 1.6f);
  550.             th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 39.32459f, 14.50176f, 36.88428f, 1.6f);
  551.             th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 46.17223f, -6.638763f, 37.35444f, 1.32f);
  552.             th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 27.4456f, -13.397498f, 36.34746f, 1.6f);
  553.             th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 18.16184f, 1.37897f, 35.31705f, 1.6f);
  554.             th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -18.11516f, -0.196236f, 45.15709f, 2.9f);
  555.             th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -18.11844f, -0.19624f, 49.18192f, 1.6f);
  556.  
  557.             if (instance->ToInstanceMap()->GetMaxPlayers() == 10)
  558.             {
  559.                 th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -3.170555f, 28.30652f, 34.21082f, 1.66527f);
  560.                 th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -12.0928f, 27.65942f, 33.58557f, 1.66527f);
  561.                 th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 14.92804f, 26.18018f, 35.47803f, 1.66527f);
  562.                 th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 24.70331f, 25.36584f, 35.97845f, 1.66527f);
  563.                 th->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, -11.44849f, -25.71838f, 33.64343f, 1.49248f);
  564.                 th->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, 12.30336f, -25.69653f, 35.32373f, 1.49248f);
  565.             }                        
  566.             else
  567.             {
  568.                 th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -3.170555f, 28.30652f, 34.21082f, 1.66527f);
  569.                 th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -12.0928f, 27.65942f, 33.58557f, 1.66527f);
  570.                 th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 14.92804f, 26.18018f, 35.47803f, 1.66527f);
  571.                 th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 24.70331f, 25.36584f, 35.97845f, 1.66527f);
  572.                 th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 19.92804f, 27.18018f, 35.47803f, 1.66527f);
  573.                 th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -7.70331f, 28.36584f, 33.88557f, 1.66527f);
  574.                 th->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, -11.44849f, -25.71838f, 33.64343f, 1.49248f);
  575.                 th->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, 12.30336f, -25.69653f, 35.32373f, 1.49248f);
  576.                 th->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, -3.44849f, -25.71838f, 34.21082f, 1.49248f);
  577.                 th->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, 3.30336f, -25.69653f, 35.32373f, 1.49248f);
  578.             }
  579.         }
  580.  
  581.         if(Transport* t = sMapMgr->LoadTransportInMap(instance, GO_THE_SKYBREAKER_ALLIANCE_ICC, 108000))
  582.         {
  583.             t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER, -17.156807f, -1.633260f, 20.81273f, 4.52672f);
  584.             t->AddNPCPassengerInInstance(NPC_GB_MURADIN_BRONZEBEARD, 13.51547f, -0.160213f, 20.87252f, 3.10672f);
  585.             t->AddNPCPassengerInInstance(NPC_GB_HIHG_CAPTAIN_JUSTIN_BARTLETT, 42.78902f, -0.010491f, 25.24052f, 3.00672f);
  586.             t->AddNPCPassengerInInstance(NPC_GB_HIGH_OVERLORD_SAURFANG_NOT_VISUAL, -12.9806f, -22.9462f, 21.659f, 4.72416f);
  587.             t->AddNPCPassengerInInstance(NPC_GB_ZAFOD_BOOMBOX, 18.8042f, 9.907914f, 20.33559f, 3.10672f);
  588.             t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_DECKHAND, -64.8423f, 4.4658f, 23.4352f, 2.698897f);
  589.             t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_DECKHAND, 35.54972f, 19.93269f, 25.0333f, 4.71242f);
  590.             t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_DECKHAND, -36.39837f, 3.13127f, 20.4496f, 1.5708f);
  591.             t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_DECKHAND, -36.23974f, -2.75767f, 20.4506f, 4.69496f);
  592.             t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_DECKHAND, 41.94677f, 44.08411f, 24.66587f, 1.62032f);
  593.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 13.51547f, -0.160213f, 20.87252f, 3.10672f);
  594.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 42.78902f, -0.010491f, 25.24052f, 3.00672f);
  595.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 14.0551f, 3.65014f, 20.7935f, 3.16073f);
  596.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 14.0551f, -4.65034f, 20.7915f, 3.04292f);
  597.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -17.8356f, 0.031688f, 20.823f, 4.73231f);
  598.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -34.2702f, -26.18966f, 21.37483f, 1.6f);
  599.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -11.64459f, -19.85176f, 20.88428f, 1.6f);
  600.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -19.88223f, -6.578763f, 20.57444f, 1.6f);
  601.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -41.4456f, -7.647498f, 20.49746f, 1.6f);
  602.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 0.554884f, -1.232897f, 20.53705f, 1.6f);
  603.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -50.16516f, 9.716236f, 23.58709f, 1.6f);
  604.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 11.45844f, 16.36624f, 20.54192f, 1.6f);
  605.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 19.72286f, -2.193787f, 33.06982f, 1.6f);
  606.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 19.72286f, -2.193787f, 33.06982f, 1.6f);
  607.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 8.599396f, -28.55855f, 24.79919f, 1.6f);
  608.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 38.94339f, -33.808f,  25.39618f, 1.6f);
  609.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 58.15474f, 0.748094f, 41.87663f, 1.6f);
  610.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 5.607554f, -6.350654f, 34.00357f, 1.6f);
  611.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 4.780305f, -29.05227f, 35.09634f, 1.6f);
  612.  
  613.             if (instance->ToInstanceMap()->GetMaxPlayers() == 10)
  614.             {
  615.                 t->AddNPCPassengerInInstance(NPC_GB_ALLIANCE_CANON, -5.15231f, -22.9462f, 21.659f, 4.72416f);
  616.                 t->AddNPCPassengerInInstance(NPC_GB_ALLIANCE_CANON, -28.0876f, -22.9462f, 21.659f, 4.72416f);
  617.             }
  618.             else
  619.             {
  620.                 t->AddNPCPassengerInInstance(NPC_GB_ALLIANCE_CANON, -5.15231f, -22.9462f, 21.659f, 4.72416f);
  621.                 t->AddNPCPassengerInInstance(NPC_GB_ALLIANCE_CANON, -14.9806f, -22.9462f, 21.659f, 4.72416f);
  622.                 t->AddNPCPassengerInInstance(NPC_GB_ALLIANCE_CANON, -21.7406f, -22.9462f, 21.659f, 4.72416f);
  623.                 t->AddNPCPassengerInInstance(NPC_GB_ALLIANCE_CANON, -28.0876f, -22.9462f, 21.659f, 4.72416f);
  624.             }
  625.         }
  626.     }
  627.  
  628.     if(TeamInInstance == HORDE)
  629.     {
  630.         if(Transport* t = sMapMgr->LoadTransportInMap(instance, GO_THE_SKYBREAKER_HORDE_ICC, 77800))
  631.         {
  632.             t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER, -17.156807f, -1.633260f, 20.81273f, 4.52672f);
  633.             t->AddNPCPassengerInInstance(NPC_GB_MURADIN_BRONZEBEARD, 13.51547f, -0.160213f, 20.87252f, 3.10672f);
  634.             t->AddNPCPassengerInInstance(NPC_GB_HIHG_CAPTAIN_JUSTIN_BARTLETT, 42.78902f, -0.010491f, 25.24052f, 3.00672f);
  635.             t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_SORCERERS, 14.0551f, 3.65014f, 20.7935f, 3.16073f);
  636.             t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_SORCERERS, 14.0551f, -4.65034f, 20.7915f, 3.04292f);
  637.             t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_SORCERERS, -17.8356f, 0.031688f, 20.823f, 4.73231f);
  638.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 13.51547f, -0.160213f, 20.87252f, 3.10672f);
  639.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 42.78902f, -0.010491f, 25.24052f, 3.00672f);
  640.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 14.0551f, 3.65014f, 20.7935f, 3.16073f);
  641.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 14.0551f, -4.65034f, 20.7915f, 3.04292f);
  642.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -17.8356f, 0.031688f, 20.823f, 4.73231f);
  643.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -34.2702f, -26.18966f, 21.37483f, 1.6f);
  644.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -11.64459f, -19.85176f, 20.88428f, 1.6f);
  645.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -19.88223f, -6.578763f, 20.57444f, 1.6f);
  646.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -41.4456f, -7.647498f, 20.49746f, 1.6f);
  647.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 0.554884f, -1.232897f, 20.53705f, 1.6f);
  648.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -50.16516f, 9.716236f, 23.58709f, 1.6f);
  649.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 11.45844f, 16.36624f, 20.54192f, 1.6f);
  650.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 19.72286f, -2.193787f, 33.06982f, 1.6f);
  651.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 19.72286f, -2.193787f, 33.06982f, 1.6f);
  652.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 8.599396f, -28.55855f, 24.79919f, 1.6f);
  653.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 38.94339f, -33.808f,  25.39618f, 1.6f);
  654.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 58.15474f, 0.748094f, 41.87663f, 1.6f);
  655.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 5.607554f, -6.350654f, 34.00357f, 1.6f);
  656.             t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 4.780305f, -29.05227f, 35.09634f, 1.6f);
  657.  
  658.             if(instance->ToInstanceMap()->GetMaxPlayers() == 10)
  659.             {
  660.                 t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -5.15231f, -22.9462f, 21.659f, 4.72416f);
  661.                 t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -14.9806f, -22.9462f, 21.659f, 4.72416f);
  662.                 t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -21.7406f, -22.9462f, 21.659f, 4.72416f);
  663.                 t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -28.0876f, -22.9462f, 21.659f, 4.72416f);
  664.                 t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -8.61003f, 15.483f, 20.4158f, 4.69854f);
  665.                 t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -27.9583f, 14.8875f, 20.4428f, 4.77865f);
  666.             }
  667.             else
  668.             {
  669.                 t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, 0.15231f, -22.9462f, 21.659f, 4.72416f);
  670.                 t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -5.15231f, -22.9462f, 21.659f, 4.72416f);
  671.                 t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -14.9806f, -22.9462f, 21.659f, 4.72416f);
  672.                 t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -21.7406f, -22.9462f, 21.659f, 4.72416f);
  673.                 t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -28.0876f, -22.9462f, 21.659f, 4.72416f);
  674.                 t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -33.0876f, -22.9462f, 21.659f, 4.72416f);
  675.                 t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -8.61003f, 15.483f, 20.4158f, 4.69854f);
  676.                 t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -27.9583f, 14.8875f, 20.4428f, 4.77865f);
  677.                 t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -15.61003f, 15.483f, 20.4158f, 4.69854f);
  678.                 t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -20.9583f, 14.8875f, 20.4428f, 4.77865f);
  679.             }
  680.         }
  681.  
  682.         if(Transport* th = sMapMgr->LoadTransportInMap(instance,GO_ORGRIM_S_HAMMER_HORDE_ICC, 77800))
  683.         {
  684.             th->AddNPCPassengerInInstance(NPC_GB_ORGRIMS_HAMMER, 1.845810f, 1.268872f, 34.526218f, 1.5890f);
  685.             th->AddNPCPassengerInInstance(NPC_GB_HIGH_OVERLORD_SAURFANG, 37.18615f, 0.00016f, 36.78849f, 3.13683f);
  686.             th->AddNPCPassengerInInstance(NPC_GB_MURADIN_BRONZEBEARD_NOT_VISUAL, -7.09684f, 30.582f, 34.5013f, 1.53591f);
  687.             th->AddNPCPassengerInInstance(NPC_GB_INVISIBLE_STALKER, 37.30764f, -0.143823f, 36.7936f, 3.13683f);
  688.             th->AddNPCPassengerInInstance(NPC_GB_ZAFOD_BOOMBOX, 35.18615f, 15.30652f, 37.64343f, 3.05033f);
  689.             th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -13.19547f, -27.160213f, 35.47252f, 3.10672f);
  690.             th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -18.33902f, -25.230491f, 33.04052f, 3.00672f);
  691.             th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -60.1251f, -1.27014f, 42.8335f, 5.16073f);
  692.             th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -48.2651f, 16.78034f, 34.2515f, 0.04292f);
  693.             th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -14.8356f, 27.931688f, 33.363f, 1.73231f);
  694.             th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 10.2702f, 20.62966f, 35.37483f, 1.6f);
  695.             th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 39.32459f, 14.50176f, 36.88428f, 1.6f);
  696.             th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 46.17223f, -6.638763f, 37.35444f, 1.32f);
  697.             th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 27.4456f, -13.397498f, 36.34746f, 1.6f);
  698.             th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 18.16184f, 1.37897f, 35.31705f, 1.6f);
  699.             th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -18.11516f, -0.196236f, 45.15709f, 2.9f);
  700.             th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -18.11844f, -0.19624f, 49.18192f, 1.6f);
  701.  
  702.             if(instance->ToInstanceMap()->GetMaxPlayers() == 10)
  703.             {
  704.                 th->AddNPCPassengerInInstance(NPC_GB_HORDE_CANON, 22.6225f, 28.9309f, 36.3929f, 1.53591f);
  705.                 th->AddNPCPassengerInInstance(NPC_GB_HORDE_CANON, -21.7509f, 29.4207f, 34.2588f, 1.53591f);
  706.             }
  707.             else
  708.             {
  709.                 th->AddNPCPassengerInInstance(NPC_GB_HORDE_CANON, 22.6225f, 28.9309f, 36.3929f, 1.53591f);
  710.                 th->AddNPCPassengerInInstance(NPC_GB_HORDE_CANON, 9.87745f, 30.5047f, 35.7147f, 1.53591f);
  711.                 th->AddNPCPassengerInInstance(NPC_GB_HORDE_CANON, -7.09684f, 30.582f, 34.5013f, 1.53591f);
  712.                 th->AddNPCPassengerInInstance(NPC_GB_HORDE_CANON, -21.7509f, 29.4207f, 34.2588f, 1.53591f);
  713.             }
  714.         }
  715.     }
  716.  
  717. }
  718.  
  719. //Stop Fight
  720. void StopFight(Transport* t1, Transport* t2)
  721. {
  722.     Map* map = t1->GetMap();
  723.  
  724.     for (Transport::CreatureSet::iterator itr = t1->m_NPCPassengerSet.begin(); itr != t1->m_NPCPassengerSet.end();)
  725.     {
  726.         if (Creature *npc = *itr)
  727.         {
  728.             if(npc->GetEntry() != NPC_GB_SKYBREAKER && npc->GetEntry() != NPC_GB_ORGRIMS_HAMMER && npc->GetEntry() != NPC_GB_HIGH_OVERLORD_SAURFANG
  729.                 && npc->GetEntry() != NPC_GB_MURADIN_BRONZEBEARD && npc->GetEntry() != NPC_GB_GUNSHIP_HULL)
  730.             {
  731.                 if (Vehicle* veh = npc->GetVehicleKit())
  732.                     veh->RemoveAllPassengers();
  733.                 npc->Kill(npc);
  734.             }
  735.         }
  736.         ++itr;
  737.     }
  738.  
  739.     for (Transport::CreatureSet::iterator itr = t2->m_NPCPassengerSet.begin(); itr != t2->m_NPCPassengerSet.end();)
  740.     {
  741.         if (Creature *npc = *itr)
  742.         {
  743.             if(npc->GetEntry() != NPC_GB_GUNSHIP_HULL && npc->GetEntry() != NPC_GB_SKYBREAKER && npc->GetEntry() != NPC_GB_ORGRIMS_HAMMER)
  744.                 npc->Kill(npc);
  745.         }
  746.         ++itr;
  747.     }
  748.  
  749.     for (Map::PlayerList::const_iterator itr = map->GetPlayers().begin(); itr != map->GetPlayers().end(); ++itr)
  750.     {
  751.         if (Player* pPlayer = itr->getSource())
  752.             pPlayer->CombatStop();
  753.     }
  754. }
  755.  
  756. //Muradin Bronzebeard
  757. class npc_muradin_gunship : public CreatureScript
  758. {
  759. public:
  760.     npc_muradin_gunship() : CreatureScript("npc_muradin_gunship") { }
  761.  
  762.     bool OnGossipHello(Player* player, Creature* pCreature)
  763.     {
  764.         InstanceScript* pInstance = pCreature->GetInstanceScript();
  765.         if (pInstance && pInstance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
  766.         {
  767.             if ((!player->GetGroup() || !player->GetGroup()->IsLeader(player->GetGUID())) && !player->isGameMaster())
  768.             {
  769.                 player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "I'm not the raid leader...", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
  770.                 player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, pCreature->GetGUID());
  771.                 return true;
  772.             }
  773.  
  774.             player->ADD_GOSSIP_ITEM(0, "My companions are all accounted for, Muradin. Let's go!", 631, 1001);
  775.             player->SEND_GOSSIP_MENU(player->GetGossipTextId(pCreature), pCreature->GetGUID());
  776.             return true;
  777.         }
  778.         return false;
  779.     }
  780.  
  781.     bool OnGossipSelect(Player* player, Creature* pCreature, uint32 /*sender*/, uint32 action)
  782.     {
  783.         InstanceScript* instance = pCreature->GetInstanceScript();
  784.         player->PlayerTalkClass->ClearMenus();
  785.         player->CLOSE_GOSSIP_MENU();
  786.  
  787.         if (action == GOSSIP_ACTION_INFO_DEF+2)
  788.             pCreature->MonsterSay("I'll wait for the raid leader.", LANG_UNIVERSAL, player->GetGUID());
  789.  
  790.         if (action == 1001)
  791.         {
  792.             pCreature->AI()->DoAction(ACTION_INTRO_START);
  793.             pCreature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
  794.         }
  795.         return true;
  796.     }
  797.  
  798.     struct npc_muradin_gunshipAI : public ScriptedAI
  799.     {
  800.         npc_muradin_gunshipAI(Creature *creature) : ScriptedAI(creature),
  801.             _instance(creature->GetInstanceScript())
  802.         {
  803.  
  804.         }
  805.  
  806.         void Reset()
  807.         {
  808.             if (_instance->GetBossState(DATA_GUNSHIP_EVENT) == IN_PROGRESS)
  809.                 return;
  810.             me->SetReactState(REACT_PASSIVE);
  811.             me->setFaction(1802);
  812.             events.Reset();
  813.             map = me->GetMap();
  814.             skybreaker = me->GetTransport();
  815.             SummonCount = RAID_MODE(3, 5, 4, 6);
  816.             count = 0;
  817.             RocketerCount = RAID_MODE(2, 4, 2, 4);
  818.             RiflCount = RAID_MODE(4, 6, 4, 6);
  819.             RocketerDieCount = 0;
  820.             RiflDieCount = 0;
  821.             me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
  822.             EventScheduled = false;
  823.         }
  824.  
  825.         void SendMusicToPlayers(uint32 musicId) const
  826.         {
  827.             WorldPacket data(SMSG_PLAY_MUSIC, 4);
  828.             data << uint32(musicId);
  829.             SendPacketToPlayers(&data);
  830.         }
  831.  
  832.         // Send packet to all players
  833.         void SendPacketToPlayers(WorldPacket const* data) const
  834.         {
  835.             Map::PlayerList const& players = me->GetMap()->GetPlayers();
  836.             if (!players.isEmpty())
  837.                 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
  838.                     if (Player* player = itr->getSource())
  839.                         player->GetSession()->SendPacket(data);
  840.         }
  841.  
  842.         bool CanAIAttack(Unit const* target) const
  843.         {
  844.             if (target->GetEntry() == NPC_GB_KORKRON_SERGANTE || target->GetEntry() == NPC_GB_KORKRON_REAVERS)
  845.                 return true;
  846.  
  847.             return false;
  848.         }
  849.  
  850.         void DoAction(int32 const action)
  851.         {
  852.             switch (action)
  853.             {
  854.             case ACTION_INTRO_START:
  855.                 events.ScheduleEvent(EVENT_INTRO_ALLIANCE_1, 1000);
  856.                 events.ScheduleEvent(EVENT_START_FLY, 2500);
  857.                 events.ScheduleEvent(EVENT_INTRO_ALLIANCE_2, 7000);
  858.                 events.ScheduleEvent(EVENT_INTRO_ALLIANCE_3, 28000);
  859.                 events.ScheduleEvent(EVENT_INTRO_ALLIANCE_4, 35000);
  860.                 events.ScheduleEvent(EVENT_INTRO_ALLIANCE_5, 40000);
  861.                 events.ScheduleEvent(EVENT_INTRO_ALLIANCE_6, 47000);
  862.                 events.ScheduleEvent(EVENT_INTRO_ALLIANCE_7, 53000);
  863.                 events.ScheduleEvent(EVENT_INTRO_ALLIANCE_8, 58900);
  864.                 break;
  865.             case ACTION_BATTLE_EVENT:
  866.                 {
  867.                     if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
  868.                         events.ScheduleEvent(EVENT_WIPE_CHECK, 5000);
  869.  
  870.                     Creature* pAllianceBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_SKYBREAKER_BOSS));
  871.                     Creature* pHordeBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ORGRIMMAR_HAMMER_BOSS));
  872.  
  873.                     if (pHordeBoss && pAllianceBoss)
  874.                     {
  875.                         me->SetReactState(REACT_AGGRESSIVE);
  876.                         pHordeBoss->SetInCombatWith(pAllianceBoss);
  877.                         pAllianceBoss->SetInCombatWith(pHordeBoss);
  878.                         pAllianceBoss->AddThreat(pHordeBoss, 0.0f);
  879.                         pHordeBoss->AddThreat(pAllianceBoss, 0.0f);
  880.                         _instance->SetBossState(DATA_GUNSHIP_EVENT, IN_PROGRESS);
  881.                         events.ScheduleEvent(EVENT_SUMMON_PORTAL, 30000);
  882.                         RelocateTransport(skybreaker);
  883.                         RelocateTransport(CheckUnfriendlyShip(me,_instance, DATA_GB_HIGH_OVERLORD_SAURFANG));
  884.                     }
  885.                     else
  886.                         me->AI()->DoAction(ACTION_FAIL);
  887.                     break;
  888.                 }
  889.             case ACTION_DONE:
  890.                 if (Creature* pAllianceBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_SKYBREAKER_BOSS)))
  891.                 {
  892.                     _instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, pAllianceBoss);
  893.                 }
  894.                 if (Creature* pHordeBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ORGRIMMAR_HAMMER_BOSS)))
  895.                 {
  896.                     _instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, pHordeBoss);
  897.                 }
  898.  
  899.                 me->SetReactState(REACT_PASSIVE);
  900.                 _instance->SetBossState(DATA_GUNSHIP_EVENT, DONE);
  901.                 _instance->DoCastSpellOnPlayers(SPELL_REMOVE_ROCKET_PACK);
  902.                 Talk(SAY_ALLIANCE_VICTORY);
  903.                 StartFlyShip(CheckUnfriendlyShip(me, _instance, DATA_GB_HIGH_OVERLORD_SAURFANG));
  904.                 StopFight(skybreaker, CheckUnfriendlyShip(me, _instance, DATA_GB_HIGH_OVERLORD_SAURFANG));
  905.                 events.CancelEvent(EVENT_WIPE_CHECK);
  906.                 events.ScheduleEvent(EVENT_OUTRO_ALLIANCE_1, 3500);
  907.                 events.ScheduleEvent(EVENT_OUTRO_ALLIANCE_2, 23000);
  908.                 events.ScheduleEvent(EVENT_OUTRO_ALLIANCE_3, 32000);
  909.                 break;
  910.             case ACTION_FAIL:
  911.                 events.CancelEvent(EVENT_WIPE_CHECK);
  912.                 Talk(SAY_ALLIANCE_DEFEAT);
  913.                 if (Creature* pAllianceBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_SKYBREAKER_BOSS)))
  914.                 {
  915.                     _instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, pAllianceBoss);
  916.                 }
  917.                 if (Creature* pHordeBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ORGRIMMAR_HAMMER_BOSS)))
  918.                 {
  919.                     _instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, pHordeBoss);
  920.                 }
  921.                 StopFight(skybreaker, CheckUnfriendlyShip(me, _instance, DATA_GB_HIGH_OVERLORD_SAURFANG));
  922.                 events.ScheduleEvent(EVENT_FAIL, 10000);
  923.                 break;
  924.             case ACTION_MAGE_DIE:
  925.                 events.ScheduleEvent(EVENT_SPAWN_MAGE, 60000);
  926.                 break;
  927.             case ACTION_ROCK_DIE:
  928.                 ++RocketerDieCount;
  929.                 if(RocketerDieCount == RocketerCount)
  930.                     events.ScheduleEvent(EVENT_RESPAWN_ROCKETEER, 60000);
  931.                 break;
  932.             case ACTION_AXES_RIFL_DIE:
  933.                 ++RiflDieCount;
  934.                 if(RiflDieCount == RiflCount)
  935.                     events.ScheduleEvent(EVENT_RESPAWN_AXES_RIFLEMEN, 60000);
  936.                 break;
  937.             }
  938.         }
  939.  
  940.         void DamageTaken(Unit* /*attacker*/, uint32& damage)
  941.         {
  942.             if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE && me->GetHealthPct() < 2.0f )
  943.             {
  944.                 damage = 0;
  945.             }
  946.  
  947.             if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE && me->GetHealthPct() < 2.0f )
  948.             {
  949.                 damage = 0;
  950.                 me->AI()->DoAction(ACTION_FAIL);
  951.             }
  952.         }
  953.  
  954.         void MovementInform(uint32 type, uint32 pointId)
  955.         {
  956.             if (type != POINT_MOTION_TYPE)
  957.                 return;
  958.  
  959.             if (pointId = 1)
  960.                 me->DespawnOrUnsummon(1000);
  961.         }
  962.  
  963.         void UpdateAI(const uint32 diff)
  964.         {
  965.             if (me->HasUnitState(UNIT_STAT_CASTING))
  966.                 return;
  967.  
  968.             if (!HealthAbovePct(75))
  969.             {
  970.                 me->SetHealth(me->GetMaxHealth() / 100 * 76);
  971.                 DoCast(me, SPELL_TASTE_OF_BLOOD);
  972.             }
  973.  
  974.             if (UpdateVictim())
  975.             {
  976.                 if (!EventScheduled)
  977.                 {
  978.                     EventScheduled = true;
  979.                     events.ScheduleEvent(EVENT_RENDING_THROW, 3000);
  980.                 }
  981.             }
  982.  
  983.             events.Update(diff);
  984.  
  985.             while (uint32 eventId = events.ExecuteEvent())
  986.             {
  987.                 switch (eventId)
  988.                 {
  989.                 case EVENT_WIPE_CHECK:
  990.                     DoCheckFallingPlayer(me);
  991.                     if (DoWipeCheck(skybreaker))
  992.                         events.ScheduleEvent(EVENT_WIPE_CHECK, 3000);
  993.                     else
  994.                         me->AI()->DoAction(ACTION_FAIL);
  995.                     break;
  996.                 case EVENT_INTRO_ALLIANCE_1:
  997.                     Talk(SAY_INTRO_ALLIANCE_0);
  998.                     break;
  999.                 case EVENT_START_FLY:
  1000.                     StartFlyShip(skybreaker);
  1001.                     break;
  1002.                 case EVENT_INTRO_ALLIANCE_2:
  1003.                     Talk(SAY_INTRO_ALLIANCE_1);
  1004.                     break;
  1005.                 case EVENT_INTRO_ALLIANCE_3:
  1006.                     Talk(SAY_INTRO_ALLIANCE_2);
  1007.                     StartFlyShip(CheckUnfriendlyShip(me, _instance, DATA_GB_HIGH_OVERLORD_SAURFANG));
  1008.                     break;
  1009.                 case EVENT_INTRO_ALLIANCE_4:
  1010.                     Talk(SAY_INTRO_ALLIANCE_3);
  1011.                     break;
  1012.                 case EVENT_INTRO_ALLIANCE_5:
  1013.                     StopFlyShip(skybreaker);
  1014.                     StopFlyShip(CheckUnfriendlyShip(me, _instance, DATA_GB_HIGH_OVERLORD_SAURFANG));
  1015.                     Talk(SAY_INTRO_ALLIANCE_4);
  1016.                     break;
  1017.                 case EVENT_INTRO_ALLIANCE_6:
  1018.                     Talk(SAY_INTRO_ALLIANCE_5);
  1019.                     SendMusicToPlayers(17289);
  1020.                     me->AI()->DoAction(ACTION_BATTLE_EVENT);
  1021.                     break;
  1022.                 case EVENT_INTRO_ALLIANCE_7:
  1023.                     if (Creature* pSaurfang = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_HIGH_OVERLORD_SAURFANG_NOT_VISUAL)))
  1024.                     {
  1025.                         pSaurfang->AI()->Talk(SAY_HIGH_OVERLORD_SAURFANG_NOT_VISUAL);
  1026.                         pSaurfang->SetReactState(REACT_PASSIVE);
  1027.                         pSaurfang->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  1028.                     }
  1029.                     break;
  1030.                 case EVENT_INTRO_ALLIANCE_8:
  1031.                     Talk(SAY_INTRO_ALLIANCE_7);
  1032.                     break;
  1033.                 case EVENT_SUMMON_PORTAL:
  1034.                     if(_instance->GetBossState(DATA_GUNSHIP_EVENT) == IN_PROGRESS)
  1035.                     {
  1036.                         events.ScheduleEvent(EVENT_BOARDING_TALK, 10000);
  1037.                         events.ScheduleEvent(EVENT_BOARDING_GUNSHIP, 2500);
  1038.                         skybreaker->AddNPCPassengerInInstance(NPC_GB_PORTAL, -15.51547f, -0.160213f, 28.87252f, 1.56211f);
  1039.                         CheckUnfriendlyShip(me, _instance, DATA_GB_HIGH_OVERLORD_SAURFANG)->AddNPCPassengerInInstance(NPC_GB_PORTAL, 47.55099f, -0.101778f, 37.61111f, 1.55138f);
  1040.                     }
  1041.                     break;
  1042.                 case EVENT_RENDING_THROW:
  1043.                     if (UpdateVictim())
  1044.                         if (me->getVictim()->IsWithinDistInMap(me, 50.0f, false))
  1045.                         {
  1046.                             DoCastVictim(SPELL_RENDING_THROW);
  1047.                             EventScheduled = false;
  1048.                         }
  1049.                         else
  1050.                             events.CancelEvent(EVENT_RENDING_THROW);
  1051.                     break;
  1052.                 case EVENT_TASTE_OF_BLOOD:
  1053.                     DoCast(me, SPELL_TASTE_OF_BLOOD);
  1054.                     break;
  1055.                 case EVENT_BOARDING_TALK:
  1056.                     Talk(SAY_BOARDING_SKYBREAKER_1);
  1057.                     break;
  1058.                 case EVENT_BOARDING_GUNSHIP:
  1059.                     if (Creature* pSaurfang = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_HIGH_OVERLORD_SAURFANG_NOT_VISUAL)))
  1060.                     {
  1061.                         pSaurfang->AI()->Talk(SAY_BOARDING_SKYBREAKER_SAURFANG);
  1062.                     }
  1063.                     if(Creature* Sergante = skybreaker->AddNPCPassengerInInstance(NPC_GB_KORKRON_SERGANTE, -15.51547f, -0.160213f, 20.87252f, 1.56211f))
  1064.                     {
  1065.                         Sergante->CastSpell(Sergante, SPELL_TELEPORT_VISUAL, true);
  1066.                     }
  1067.                     events.ScheduleEvent(EVENT_SUMMON_PORTAL, 90000);
  1068.                     events.ScheduleEvent(EVENT_BOARDING_REAVERS_MARINE, 3000);
  1069.                     count = 0;
  1070.                     break;
  1071.                 case EVENT_BOARDING_REAVERS_MARINE:
  1072.                     if(count <= SummonCount)
  1073.                     {
  1074.                         if(Creature* Reavers = skybreaker->AddNPCPassengerInInstance(NPC_GB_KORKRON_REAVERS, -15.51547f, -0.160213f, 20.87252f, 1.56211f))
  1075.                         {
  1076.                             Reavers->CastSpell(Reavers, SPELL_TELEPORT_VISUAL, true);
  1077.                             events.ScheduleEvent(EVENT_BOARDING_REAVERS_MARINE, 21000 / SummonCount);
  1078.                             ++count;
  1079.                         }
  1080.                     }
  1081.                     break;
  1082.                 case EVENT_OUTRO_ALLIANCE_1:
  1083.                     _instance->DoCompleteAchievement(RAID_MODE(IM_ON_A_BOAT_10,IM_ON_A_BOAT_25,IM_ON_A_BOAT_10,IM_ON_A_BOAT_25));
  1084.                     _instance->DoCastSpellOnPlayers(SPELL_ACHIEVEMENT_CHECK);
  1085.                     StartFlyShip(skybreaker);
  1086.                     StopFlyShip(CheckUnfriendlyShip(me,_instance,DATA_GB_HIGH_OVERLORD_SAURFANG));
  1087.                     break;
  1088.                 case EVENT_OUTRO_ALLIANCE_2:
  1089.                     StopFlyShip(skybreaker);
  1090.                     me->SummonGameObject(RAID_MODE(GO_CAPITAN_CHEST_A_10N, GO_CAPITAN_CHEST_A_25N, GO_CAPITAN_CHEST_A_10H, GO_CAPITAN_CHEST_A_25H), -590.200022f, 2241.193115f, 538.588269f, 0, 0, 0, 0, 0, 100000);
  1091.                     me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
  1092.                     me->GetMotionMaster()->MovePoint(0, -590.700f, 2213.01f, 539.1f);
  1093.                     break;
  1094.                 case EVENT_OUTRO_ALLIANCE_3:
  1095.                     me->GetMotionMaster()->MovePoint(1, -555.59f, 2213.01f, 539.28f);
  1096.                     break;
  1097.                 case EVENT_FAIL:
  1098.                     TeleportPlayers(map, ALLIANCE);
  1099.                     events.ScheduleEvent(EVENT_RESTART_EVENT, 2000);
  1100.                     _instance->SetBossState(DATA_GUNSHIP_EVENT, NOT_STARTED);
  1101.                     break;
  1102.                 case EVENT_RESTART_EVENT:
  1103.                     _instance->SetBossState(DATA_GUNSHIP_EVENT, FAIL);
  1104.                     RestartEvent(skybreaker, CheckUnfriendlyShip(me,_instance,DATA_GB_HIGH_OVERLORD_SAURFANG), map, ALLIANCE);
  1105.                     break;
  1106.                 case EVENT_SPAWN_MAGE:
  1107.                     Talk(SAY_NEW_MAGE_SPAWNED);
  1108.                     skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_SORCERERS, -17.8356f, 0.031688f, 20.823f, 4.73231f);
  1109.                     break;
  1110.                 case EVENT_RESPAWN_ROCKETEER:
  1111.                     Talk(SAY_NEW_MORTAR_TEAM_SPAWNED);
  1112.                     if(RocketerCount == 2)
  1113.                     {
  1114.                         skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -8.61003f, 15.483f, 20.4158f, 4.69854f);
  1115.                         skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -27.9583f, 14.8875f, 20.4428f, 4.77865f);
  1116.                     }
  1117.                     if(RocketerCount == 4)
  1118.                     {
  1119.                         skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -8.61003f, 15.483f, 20.4158f, 4.69854f);
  1120.                         skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -27.9583f, 14.8875f, 20.4428f, 4.77865f);
  1121.                         skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -15.61003f, 15.483f, 20.4158f, 4.69854f);
  1122.                         skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -20.9583f, 14.8875f, 20.4428f, 4.77865f);
  1123.                     }
  1124.                     break;
  1125.                 case EVENT_RESPAWN_AXES_RIFLEMEN:
  1126.                     Talk(SAY_NEW_RIFLEMEN_SPAWNED);
  1127.                     if(RiflCount == 4)
  1128.                     {
  1129.                         skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -28.0876f, -22.9462f, 21.659f, 4.72416f);
  1130.                         skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -21.7406f, -22.9462f, 21.659f, 4.72416f);
  1131.                         skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -14.9806f, -22.9462f, 21.659f, 4.72416f);
  1132.                         skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -5.15231f, -22.9462f, 21.659f, 4.72416f);
  1133.                     }
  1134.                     if(RiflCount == 6)
  1135.                     {
  1136.                         skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -33.0876f, -22.9462f, 21.659f, 4.72416f);
  1137.                         skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -28.0876f, -22.9462f, 21.659f, 4.72416f);
  1138.                         skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -21.7406f, -22.9462f, 21.659f, 4.72416f);
  1139.                         skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -14.9806f, -22.9462f, 21.659f, 4.72416f);
  1140.                         skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -5.15231f, -22.9462f, 21.659f, 4.72416f);
  1141.                         skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, 0.15231f, -22.9462f, 21.659f, 4.72416f);
  1142.                     }
  1143.                     break;
  1144.                 }
  1145.             }
  1146.  
  1147.             if (!me->GetCurrentSpell(CURRENT_MELEE_SPELL))
  1148.                 DoCastVictim(SPELL_CLEAVE);
  1149.  
  1150.             DoMeleeAttackIfReady();
  1151.         }
  1152.  
  1153.     private:
  1154.         Transport* skybreaker;
  1155.         Map* map;
  1156.         uint32 SummonCount;
  1157.         EventMap events;
  1158.         InstanceScript* _instance;
  1159.         uint32 count;
  1160.         uint32 RocketerDieCount;
  1161.         uint32 RiflDieCount;
  1162.         uint32 RocketerCount;
  1163.         uint32 RiflCount;
  1164.         bool EventScheduled;
  1165.     };
  1166.  
  1167.     CreatureAI* GetAI(Creature* pCreature) const
  1168.     {
  1169.         return new npc_muradin_gunshipAI(pCreature);
  1170.     }
  1171. }
  1172.  
  1173. class npc_gunship_skybreaker : public CreatureScript
  1174. {
  1175. public:
  1176.     npc_gunship_skybreaker() : CreatureScript("npc_gunship_skybreaker") { }
  1177.  
  1178.     struct npc_gunship_skybreakerAI : public Scripted_NoMovementAI
  1179.     {
  1180.         npc_gunship_skybreakerAI(Creature *creature) : Scripted_NoMovementAI(creature), _instance(creature->GetInstanceScript())
  1181.         {
  1182.             Reset();
  1183.         }
  1184.  
  1185.         void Reset()
  1186.         {
  1187.             ScriptedAI::Reset();
  1188.             me->SetReactState(REACT_PASSIVE);
  1189.             me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  1190.             me->SetDisplayId(11686);
  1191.         }
  1192.  
  1193.         void EnterCombat(Unit* /*who*/)
  1194.         {
  1195.             me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  1196.             SetCombatMovement(false);
  1197.             _instance->SendEncounterUnit(ENCOUNTER_FRAME_ADD, me);
  1198.             me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
  1199.         }
  1200.  
  1201.         void JustDied(Unit* killer)
  1202.         {
  1203.             if (Transport* t = me->GetTransport())
  1204.                 DoShipExplosion(t);
  1205.  
  1206.             if(_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
  1207.             {
  1208.                 if (Creature* pMuradin = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_GB_MURADIN_BRONZEBEARD)))
  1209.                     pMuradin->AI()->DoAction(ACTION_FAIL);
  1210.             }
  1211.  
  1212.             else if(_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  1213.             {
  1214.                 if (Creature* pSaurfang = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_GB_HIGH_OVERLORD_SAURFANG)))
  1215.                     pSaurfang->AI()->DoAction(ACTION_DONE);
  1216.             }
  1217.         }
  1218.  
  1219.     private:
  1220.         EventMap events;
  1221.         InstanceScript* _instance;
  1222.     };
  1223.  
  1224.     CreatureAI* GetAI(Creature* pCreature) const
  1225.     {
  1226.         return new npc_gunship_skybreakerAI(pCreature);
  1227.     }
  1228. };
  1229.  
  1230. class npc_gunship_orgrimmar : public CreatureScript
  1231. {
  1232. public:
  1233.     npc_gunship_orgrimmar() : CreatureScript("npc_gunship_orgrimmar") { }
  1234.  
  1235.     struct npc_gunship_orgrimmarAI : public Scripted_NoMovementAI
  1236.     {
  1237.         npc_gunship_orgrimmarAI(Creature *creature) : Scripted_NoMovementAI(creature), _instance(creature->GetInstanceScript())
  1238.         {
  1239.             Reset();
  1240.         }
  1241.  
  1242.         void Reset()
  1243.         {
  1244.             ScriptedAI::Reset();
  1245.             me->SetReactState(REACT_PASSIVE);
  1246.             me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  1247.             me->SetDisplayId(11686);
  1248.         }
  1249.  
  1250.         void EnterCombat(Unit* /*who*/)
  1251.         {
  1252.             me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  1253.             SetCombatMovement(false);
  1254.             _instance->SendEncounterUnit(ENCOUNTER_FRAME_ADD, me);
  1255.             me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
  1256.         }
  1257.  
  1258.         void JustDied(Unit* killer)
  1259.         {
  1260.             if (Transport* t = me->GetTransport())
  1261.                 DoShipExplosion(t);
  1262.  
  1263.             if(_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
  1264.             {
  1265.                 if (Creature* pMuradin = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_GB_MURADIN_BRONZEBEARD)))
  1266.                     pMuradin->AI()->DoAction(ACTION_DONE);
  1267.             }
  1268.  
  1269.             else if(_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  1270.             {
  1271.                 if (Creature* pSaurfang = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_GB_HIGH_OVERLORD_SAURFANG)))
  1272.                     pSaurfang->AI()->DoAction(ACTION_FAIL);
  1273.             }
  1274.         }
  1275.  
  1276.     private:
  1277.         EventMap events;
  1278.         InstanceScript* _instance;
  1279.     };
  1280.  
  1281.     CreatureAI* GetAI(Creature* pCreature) const
  1282.     {
  1283.         return new npc_gunship_orgrimmarAI(pCreature);
  1284.     }
  1285. };
  1286.  
  1287. /* Kro'kron Axethrower */
  1288. class npc_korkron_axethrower_rifleman : public CreatureScript
  1289. {
  1290. public:
  1291.     npc_korkron_axethrower_rifleman() : CreatureScript("npc_korkron_axethrower_rifleman") { }
  1292.  
  1293.     struct npc_korkron_axethrower_riflemanAI : public Scripted_NoMovementAI
  1294.     {
  1295.         npc_korkron_axethrower_riflemanAI(Creature *creature) : Scripted_NoMovementAI(creature),_instance(creature->GetInstanceScript())
  1296.         {
  1297.             Reset();
  1298.         }
  1299.  
  1300.         void Reset()
  1301.         {
  1302.             ScriptedAI::Reset();
  1303.             DesperateResolve = RAID_MODE( SPELL_DESPERATE_RESOLVE_10_NM, SPELL_DESPERATE_RESOLVE_25_NM, SPELL_DESPERATE_RESOLVE_10_HM, SPELL_DESPERATE_RESOLVE_25_HM);
  1304.             desperated = false;
  1305.             me->RemoveAurasDueToSpell(SPELL_EXPERIENCED);
  1306.             me->RemoveAurasDueToSpell(SPELL_ELITE);
  1307.             me->RemoveAurasDueToSpell(SPELL_VETERAN);
  1308.             events.ScheduleEvent(EVENT_EXPERIENCED, urand(19000, 21000)); // ~20 sec
  1309.             events.ScheduleEvent(EVENT_VETERAN, urand(39000, 41000));     // ~40 sec
  1310.             events.ScheduleEvent(EVENT_ELITE, urand(59000, 61000));       // ~60 sec
  1311.             attacktimer = urand(6000, 15000);
  1312.             if (me->GetEntry() == NPC_GB_SKYBREAKER_RIFLEMAN)
  1313.                 SetEquipmentSlots(false, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE, 47267);
  1314.             else
  1315.                 SetEquipmentSlots(false, 49691, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
  1316.         }
  1317.  
  1318.         void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/)
  1319.         {
  1320.             if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE && me->GetHealthPct() < 20.0f && !desperated)
  1321.             {
  1322.                 desperated = true;
  1323.                 DoCast(me, DesperateResolve);
  1324.             }
  1325.         }
  1326.  
  1327.         void JustDied(Unit* killer)
  1328.         {
  1329.             if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
  1330.             {
  1331.                 if (Creature* pSaurfangBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_GB_HIGH_OVERLORD_SAURFANG)))
  1332.                     pSaurfangBoss->AI()->DoAction(ACTION_AXES_RIFL_DIE);
  1333.             }
  1334.  
  1335.             if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  1336.             {
  1337.                 if (Creature* pMuradin = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_GB_MURADIN_BRONZEBEARD)))
  1338.                     pMuradin->AI()->DoAction(ACTION_AXES_RIFL_DIE);
  1339.             }
  1340.         }
  1341.  
  1342.         void UpdateAI(const uint32 diff)
  1343.         {
  1344.             if (_instance->GetBossState(DATA_GUNSHIP_EVENT) != IN_PROGRESS)
  1345.                 return;
  1346.  
  1347.             if (me->HasUnitState(UNIT_STAT_CASTING))
  1348.                 return;
  1349.  
  1350.             me->AI()->AttackStart(SelectRandomPlayerInTheMaps(me->GetMap()));
  1351.  
  1352.             if (!UpdateVictim())
  1353.                 return;
  1354.  
  1355.             events.Update(diff);
  1356.  
  1357.             if (attacktimer <= diff)
  1358.             {
  1359.                 if(me->GetEntry() == NPC_GB_KORKRON_AXETHROWER)
  1360.                     DoCast(me->getVictim(), SPELL_HURL_AXE);
  1361.                 else if(me->GetEntry() == NPC_GB_SKYBREAKER_RIFLEMAN)
  1362.                     DoCast(me->getVictim(), SPELL_SHOOT);
  1363.                 attacktimer = urand(6000, 15000);
  1364.             } else attacktimer -= diff;
  1365.  
  1366.             while (uint32 eventId = events.ExecuteEvent())
  1367.             {
  1368.                 switch (eventId)
  1369.                 {
  1370.                 case EVENT_EXPERIENCED:
  1371.                     DoCast(me, SPELL_EXPERIENCED);
  1372.                     break;
  1373.                 case EVENT_VETERAN:
  1374.                     me->RemoveAurasDueToSpell(SPELL_EXPERIENCED);
  1375.                     DoCast(me, SPELL_VETERAN);
  1376.                     break;
  1377.                 case EVENT_ELITE:
  1378.                     me->RemoveAurasDueToSpell(SPELL_VETERAN);
  1379.                     DoCast(me, SPELL_ELITE);
  1380.                     break;
  1381.                 default:
  1382.                     break;
  1383.                 }
  1384.             }
  1385.         }
  1386.  
  1387.         uint32 DesperateResolve;
  1388.         uint32 attacktimer;
  1389.  
  1390.     private:
  1391.         EventMap events;
  1392.         bool desperated;
  1393.         InstanceScript* _instance;
  1394.     };
  1395.  
  1396.     CreatureAI* GetAI(Creature* pCreature) const
  1397.     {
  1398.         return new npc_korkron_axethrower_riflemanAI(pCreature);
  1399.     }
  1400. };
  1401.  
  1402. class npc_sergeant : public CreatureScript
  1403. {
  1404. public:
  1405.     npc_sergeant() : CreatureScript("npc_sergeant") { }
  1406.  
  1407.     struct npc_sergeantAI : public ScriptedAI
  1408.     {
  1409.         npc_sergeantAI(Creature *creature) : ScriptedAI(creature),_instance(creature->GetInstanceScript())
  1410.         {
  1411.             Reset();
  1412.         }
  1413.  
  1414.         void Reset()
  1415.         {
  1416.             ScriptedAI::Reset();
  1417.             me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  1418.             me->SetReactState(REACT_PASSIVE);
  1419.             events.ScheduleEvent(EVENT_WALK_MOBS, 1500);
  1420.             desperated = false;
  1421.             me->RemoveAurasDueToSpell(SPELL_EXPERIENCED);
  1422.             me->RemoveAurasDueToSpell(SPELL_ELITE);
  1423.             DesperateResolve = RAID_MODE( SPELL_DESPERATE_RESOLVE_10_NM, SPELL_DESPERATE_RESOLVE_25_NM, SPELL_DESPERATE_RESOLVE_10_HM, SPELL_DESPERATE_RESOLVE_25_HM);
  1424.             events.ScheduleEvent(EVENT_EXPERIENCED, urand(19000, 21000));  // ~20 sec
  1425.             events.ScheduleEvent(EVENT_VETERAN, urand(39000, 41000));      // ~40 sec
  1426.             events.ScheduleEvent(EVENT_BURNING_PITCH, urand(60000, 62000));// ~61 sec
  1427.             if(me->GetMap()->ToInstanceMap()->GetMaxPlayers() == 25 && me->GetMap()->IsHeroic())
  1428.                 events.ScheduleEvent(EVENT_ELITE, urand(59000, 61000));       // ~60 sec
  1429.         }
  1430.  
  1431.         void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/)
  1432.         {
  1433.             if (me->GetHealthPct() < 20.0f && !desperated)
  1434.             {
  1435.                 desperated = true;
  1436.                 DoCast(me, DesperateResolve);
  1437.             }
  1438.         }
  1439.  
  1440.         bool CanAIAttack(Unit const* target) const
  1441.         {
  1442.             if (target->GetEntry() == NPC_GB_GUNSHIP_HULL)
  1443.                 return false;
  1444.  
  1445.             return true;
  1446.         }
  1447.  
  1448.         void UpdateAI(const uint32 diff)
  1449.         {
  1450.             if(_instance->GetBossState(DATA_GUNSHIP_EVENT) != IN_PROGRESS)
  1451.                 return;
  1452.  
  1453.             if (me->HasUnitState(UNIT_STAT_CASTING))
  1454.                 return;
  1455.  
  1456.             events.Update(diff);
  1457.  
  1458.             while (uint32 eventId = events.ExecuteEvent())
  1459.             {
  1460.                 switch (eventId)
  1461.                 {
  1462.                 case EVENT_WALK_MOBS:
  1463.                     me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  1464.                     me->SetReactState(REACT_AGGRESSIVE);
  1465.                     switch (me->GetEntry())
  1466.                     {
  1467.                     case NPC_GB_KORKRON_SERGANTE:
  1468.                         if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, SPELL_ON_SKYBREAKERS_DECK))
  1469.                         {
  1470.                             me->GetMotionMaster()->MoveChase(target);
  1471.                             me->AI()->AttackStart(target);
  1472.                         }
  1473.                         break;
  1474.                     case NPC_GB_SKYBREAKER_SERGANTE:
  1475.                         if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, SPELL_ON_ORGRIMS_HAMMERS_DECK))
  1476.                         {
  1477.                             me->GetMotionMaster()->MoveChase(target);
  1478.                             me->AI()->AttackStart(target);
  1479.                         }
  1480.                         break;
  1481.                     }
  1482.                     events.ScheduleEvent(EVENT_WOUNDING_STRIKE, 5000);
  1483.                     events.ScheduleEvent(EVENT_BLADE_STORM, 3000);
  1484.                     break;
  1485.                 case EVENT_BURNING_PITCH:
  1486.                     if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
  1487.                     {
  1488.                         if (me->GetEntry() == NPC_GB_KORKRON_SERGANTE)
  1489.                             DoCast(pTarget, SPELL_BURNING_PITCH_H);
  1490.                         else
  1491.                             DoCast(pTarget, SPELL_BURNING_PITCH_A);
  1492.                     }
  1493.                     events.ScheduleEvent(EVENT_BURNING_PITCH, urand(60000, 62000));// ~61 sec
  1494.                     break;
  1495.                 case EVENT_EXPERIENCED:
  1496.                     DoCast(me, SPELL_EXPERIENCED);
  1497.                     break;
  1498.                 case EVENT_VETERAN:
  1499.                     me->RemoveAurasDueToSpell(SPELL_EXPERIENCED);
  1500.                     DoCast(me, SPELL_VETERAN);
  1501.                     break;
  1502.                 case EVENT_ELITE:
  1503.                     me->RemoveAurasDueToSpell(SPELL_VETERAN);
  1504.                     DoCast(me, SPELL_ELITE);
  1505.                     break;
  1506.                 case EVENT_WOUNDING_STRIKE:
  1507.                     if (UpdateVictim())
  1508.                         DoCastVictim( RAID_MODE( SPELL_WOUNDING_STRIKE_10_NM, SPELL_WOUNDING_STRIKE_25_NM, SPELL_WOUNDING_STRIKE_10_HM, SPELL_WOUNDING_STRIKE_25_HM));
  1509.                     events.ScheduleEvent(EVENT_WOUNDING_STRIKE, urand(5000, 8000));
  1510.                     break;
  1511.                 case EVENT_BLADE_STORM:
  1512.                     DoCast(me, SPELL_BLADESTORM);
  1513.                     events.ScheduleEvent(EVENT_BLADE_STORM, urand(9000, 16000));
  1514.                     break;
  1515.                 }
  1516.             }
  1517.  
  1518.             DoMeleeAttackIfReady();
  1519.  
  1520.         }
  1521.         uint32 DesperateResolve;
  1522.         bool desperated;
  1523.  
  1524.     private:
  1525.         EventMap events;
  1526.         InstanceScript* _instance;
  1527.     };
  1528.  
  1529.     CreatureAI* GetAI(Creature* pCreature) const
  1530.     {
  1531.         return new npc_sergeantAI(pCreature);
  1532.     }
  1533. };
  1534.  
  1535. class npc_marine_or_reaver : public CreatureScript
  1536. {
  1537. public:
  1538.     npc_marine_or_reaver() : CreatureScript("npc_marine_or_reaver") { }
  1539.  
  1540.     struct npc_marine_or_reaverAI : public ScriptedAI
  1541.     {
  1542.         npc_marine_or_reaverAI(Creature *creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
  1543.         {
  1544.             Reset();
  1545.         }
  1546.  
  1547.         void Reset()
  1548.         {
  1549.             ScriptedAI::Reset();
  1550.             desperated = false;
  1551.             me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  1552.             me->SetReactState(REACT_PASSIVE);
  1553.             events.ScheduleEvent(EVENT_WALK_MOBS, 1500);
  1554.             me->RemoveAurasDueToSpell(SPELL_EXPERIENCED);
  1555.             me->RemoveAurasDueToSpell(SPELL_ELITE);
  1556.             DesperateResolve = RAID_MODE( SPELL_DESPERATE_RESOLVE_10_NM, SPELL_DESPERATE_RESOLVE_25_NM, SPELL_DESPERATE_RESOLVE_10_HM, SPELL_DESPERATE_RESOLVE_25_HM);
  1557.             events.ScheduleEvent(EVENT_EXPERIENCED, urand(19000, 21000));  // ~20 sec
  1558.             events.ScheduleEvent(EVENT_VETERAN, urand(39000, 41000));      // ~40 sec
  1559.             events.ScheduleEvent(EVENT_BURNING_PITCH, urand(60000, 62000));// ~61 sec
  1560.         }
  1561.  
  1562.         void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/)
  1563.         {
  1564.             if (me->GetHealthPct() < 20.0f && !desperated)
  1565.             {
  1566.                 desperated = true;
  1567.                 DoCast(me, DesperateResolve);
  1568.             }
  1569.         }
  1570.  
  1571.         bool CanAIAttack(Unit const* target) const
  1572.         {
  1573.             if (target->GetEntry() == NPC_GB_GUNSHIP_HULL)
  1574.                 return false;
  1575.  
  1576.             return true;
  1577.         }
  1578.  
  1579.         void UpdateAI(const uint32 diff)
  1580.         {
  1581.             if(_instance->GetBossState(DATA_GUNSHIP_EVENT) != IN_PROGRESS)
  1582.                 return;
  1583.  
  1584.             if (me->HasUnitState(UNIT_STAT_CASTING))
  1585.                 return;
  1586.  
  1587.             events.Update(diff);
  1588.  
  1589.             while (uint32 eventId = events.ExecuteEvent())
  1590.             {
  1591.                 switch (eventId)
  1592.                 {
  1593.                 case EVENT_WALK_MOBS:
  1594.                     me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  1595.                     me->SetReactState(REACT_AGGRESSIVE);
  1596.                     switch (me->GetEntry())
  1597.                     {
  1598.                     case NPC_GB_KORKRON_REAVERS:
  1599.                         if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, SPELL_ON_SKYBREAKERS_DECK))
  1600.                         {
  1601.                             me->GetMotionMaster()->MoveChase(target);
  1602.                             me->AI()->AttackStart(target);
  1603.                         }
  1604.                         break;
  1605.                     case NPC_GB_SKYBREAKER_MARINE:
  1606.                         if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, SPELL_ON_ORGRIMS_HAMMERS_DECK))
  1607.                         {
  1608.                             me->GetMotionMaster()->MoveChase(target);
  1609.                             me->AI()->AttackStart(target);
  1610.                         }
  1611.                         break;
  1612.                     }
  1613.                     break;
  1614.                 case EVENT_BURNING_PITCH:
  1615.                     if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
  1616.                     {
  1617.                         if (me->GetEntry() == NPC_GB_KORKRON_REAVERS)
  1618.                             DoCast(pTarget, SPELL_BURNING_PITCH_H);
  1619.                         else
  1620.                             DoCast(pTarget, SPELL_BURNING_PITCH_A);
  1621.                     }
  1622.                     events.ScheduleEvent(EVENT_BURNING_PITCH, urand(60000, 62000));// ~61 sec
  1623.                     break;
  1624.                 case EVENT_EXPERIENCED:
  1625.                     DoCast(me, SPELL_EXPERIENCED);
  1626.                     break;
  1627.                 case EVENT_VETERAN:
  1628.                     me->RemoveAurasDueToSpell(SPELL_EXPERIENCED);
  1629.                     DoCast(me, SPELL_VETERAN);
  1630.                     break;
  1631.                 }
  1632.             }
  1633.  
  1634.             DoMeleeAttackIfReady();
  1635.         }
  1636.         uint32 DesperateResolve;
  1637.         bool desperated;
  1638.  
  1639.     private:
  1640.         EventMap events;
  1641.         InstanceScript* _instance;
  1642.     };
  1643.  
  1644.     CreatureAI* GetAI(Creature* pCreature) const
  1645.     {
  1646.         return new npc_marine_or_reaverAI(pCreature);
  1647.     }
  1648. };
  1649.  
  1650. class npc_gunship_mage : public CreatureScript
  1651. {
  1652. public:
  1653.     npc_gunship_mage() : CreatureScript("npc_gunship_mage") { }
  1654.  
  1655.     struct npc_gunship_mageAI : public Scripted_NoMovementAI
  1656.     {
  1657.         npc_gunship_mageAI(Creature *creature) : Scripted_NoMovementAI(creature),_instance(creature->GetInstanceScript())
  1658.         {
  1659.             Reset();
  1660.         }
  1661.  
  1662.         void Reset()
  1663.         {
  1664.             ScriptedAI::Reset();
  1665.             timer_BelowZero = urand(10000, 15000);
  1666.         }
  1667.  
  1668.         void DoAction(int32 const action)
  1669.         {
  1670.             switch (action)
  1671.             {
  1672.             case EVENT_FREEZE_CANNON:
  1673.                 if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
  1674.                 {
  1675.                     std::list<Creature*> cannonsA;
  1676.                     GetCreatureListWithEntryInGrid(cannonsA, me, NPC_GB_ALLIANCE_CANON, 500.0f);
  1677.                     for (std::list<Creature*>::iterator itr = cannonsA.begin(); itr != cannonsA.end(); ++itr)
  1678.                     {
  1679.                         if (Vehicle* veh = (*itr)->GetVehicleKit())
  1680.                             veh->RemoveAllPassengers();
  1681.  
  1682.                         DoCast((*itr),SPELL_BELOW_ZERO,true);
  1683.                     }
  1684.                 }
  1685.                 else if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  1686.                 {
  1687.                     std::list<Creature*> cannonsH;
  1688.                     GetCreatureListWithEntryInGrid(cannonsH, me, NPC_GB_HORDE_CANON, 500.0f);
  1689.                     for (std::list<Creature*>::iterator itr = cannonsH.begin(); itr != cannonsH.end(); ++itr)
  1690.                     {
  1691.                         if (Vehicle* veh = (*itr)->GetVehicleKit())
  1692.                             veh->RemoveAllPassengers();
  1693.  
  1694.                         DoCast((*itr),SPELL_BELOW_ZERO,true);
  1695.                     }
  1696.                 }
  1697.                 break;
  1698.             }
  1699.         }
  1700.  
  1701.         void JustDied(Unit* killer)
  1702.         {
  1703.             if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
  1704.             {
  1705.                 if (me->GetGUID() == _instance->GetData64(DATA_GB_BATTLE_MAGE))
  1706.                 {
  1707.                     if (Creature* pSaurfangBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_GB_HIGH_OVERLORD_SAURFANG)))
  1708.                         pSaurfangBoss->AI()->DoAction(ACTION_MAGE_DIE);
  1709.                 }
  1710.             }
  1711.  
  1712.             if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  1713.             {
  1714.                 if (me->GetGUID() == _instance->GetData64(DATA_GB_BATTLE_MAGE))
  1715.                 {
  1716.                     if (Creature* pMuradin = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_GB_MURADIN_BRONZEBEARD)))
  1717.                         pMuradin->AI()->DoAction(ACTION_MAGE_DIE);
  1718.                 }
  1719.             }
  1720.         }
  1721.  
  1722.         void UpdateAI(const uint32 diff)
  1723.         {
  1724.             if(_instance->GetBossState(DATA_GUNSHIP_EVENT) != IN_PROGRESS)
  1725.                 return;
  1726.  
  1727.             if (me->HasUnitState(UNIT_STAT_CASTING))
  1728.                 return;
  1729.  
  1730.             if (me->GetGUID() == _instance->GetData64(DATA_GB_BATTLE_MAGE))
  1731.             {
  1732.                 if( timer_BelowZero <= diff)
  1733.                 {
  1734.                     me->AI()->DoAction(EVENT_FREEZE_CANNON);
  1735.                     timer_BelowZero = urand(10000, 15000);
  1736.                 } else timer_BelowZero -= diff;
  1737.             }
  1738.             else
  1739.             {
  1740.                 DoCast(me,SPELL_SHADOW_CHANNELING);
  1741.             }
  1742.         }
  1743.         uint32 timer_BelowZero;
  1744.     private:
  1745.         EventMap events;
  1746.         InstanceScript* _instance;
  1747.     };
  1748.  
  1749.     CreatureAI* GetAI(Creature* pCreature) const
  1750.     {
  1751.         return new npc_gunship_mageAI(pCreature);
  1752.     }
  1753. };
  1754.  
  1755. /* Gunship Cannon (Horde / Ally) */
  1756. class npc_gunship_cannon : public CreatureScript
  1757. {
  1758. public:
  1759.     npc_gunship_cannon() : CreatureScript("npc_gunship_cannon") { }
  1760.  
  1761.     struct npc_gunship_cannonAI : public ScriptedAI
  1762.     {
  1763.         npc_gunship_cannonAI(Creature *creature) : ScriptedAI(creature) { }
  1764.  
  1765.         void Reset()
  1766.         {
  1767.             me->SetReactState(REACT_PASSIVE);
  1768.             me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  1769.             DoCast(me, SPELL_HEAT_DRAIN, true);
  1770.         }
  1771.  
  1772.         void SpellHit(Unit* /*caster*/, SpellEntry const* spellEntry)
  1773.         {
  1774.             if (spellEntry->Id == SPELL_BELOW_ZERO)
  1775.                 me->GetVehicleKit()->RemoveAllPassengers();
  1776.         }
  1777.  
  1778.         void DamageTaken(Unit* attacker, uint32& damage)
  1779.         {
  1780.             if(me->GetEntry() == NPC_GB_ALLIANCE_CANON)
  1781.             {
  1782.                 if (Creature* pAllianceBoss = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(DATA_SKYBREAKER_BOSS)))
  1783.                     attacker->DealDamage(pAllianceBoss, damage);
  1784.             }
  1785.  
  1786.             if(me->GetEntry() == NPC_GB_HORDE_CANON)
  1787.             {
  1788.                 if (Creature* pHordeBoss = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(DATA_ORGRIMMAR_HAMMER_BOSS)))
  1789.                     attacker->DealDamage(pHordeBoss, damage);
  1790.             }
  1791.         }
  1792.  
  1793.         void UpdateAI(const uint32 diff)
  1794.         {
  1795.             if(me->HasAura(SPELL_BELOW_ZERO))
  1796.             {
  1797.                 me->RemoveAurasByType(SPELL_AURA_CONTROL_VEHICLE);
  1798.                 me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
  1799.  
  1800.                 if (Vehicle* veh = me->GetVehicleKit())
  1801.                     veh->RemoveAllPassengers();
  1802.             }
  1803.             else
  1804.             {
  1805.                 me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
  1806.             }
  1807.         }
  1808.  
  1809.     };
  1810.  
  1811.     CreatureAI* GetAI(Creature* pCreature) const
  1812.     {
  1813.         return new npc_gunship_cannonAI(pCreature);
  1814.     }
  1815. };
  1816.  
  1817. class npc_mortar_soldier_or_rocketeer : public CreatureScript
  1818. {
  1819. public:
  1820.     npc_mortar_soldier_or_rocketeer() : CreatureScript("npc_mortar_soldier_or_rocketeer") { }
  1821.  
  1822.     struct npc_mortar_soldier_or_rocketeerAI : public Scripted_NoMovementAI
  1823.     {
  1824.         npc_mortar_soldier_or_rocketeerAI(Creature *creature) : Scripted_NoMovementAI(creature),_instance(creature->GetInstanceScript())
  1825.         {
  1826.             Reset();
  1827.         }
  1828.  
  1829.         void Reset()
  1830.         {
  1831.             ScriptedAI::Reset();
  1832.             me->RemoveAurasDueToSpell(SPELL_EXPERIENCED);
  1833.             me->RemoveAurasDueToSpell(SPELL_ELITE);
  1834.             me->RemoveAurasDueToSpell(SPELL_VETERAN);
  1835.             events.ScheduleEvent(EVENT_EXPERIENCED, urand(19000, 21000)); // ~20 sec
  1836.             events.ScheduleEvent(EVENT_VETERAN, urand(39000, 41000));     // ~40 sec
  1837.             events.ScheduleEvent(EVENT_ELITE, urand(59000, 61000));       // ~60 sec
  1838.             events.ScheduleEvent(EVENT_ROCKET_ART, urand(10000, 15000));   // ~12 sec
  1839.         }
  1840.  
  1841.         void JustDied(Unit* killer)
  1842.         {
  1843.             if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
  1844.             {
  1845.                 if (Creature* pSaurfangBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_GB_HIGH_OVERLORD_SAURFANG)))
  1846.                     pSaurfangBoss->AI()->DoAction(ACTION_ROCK_DIE);
  1847.             }
  1848.             if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  1849.             {
  1850.                 if (Creature* pMuradin = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_GB_MURADIN_BRONZEBEARD)))
  1851.                     pMuradin->AI()->DoAction(ACTION_ROCK_DIE);
  1852.             }
  1853.         }
  1854.  
  1855.         void UpdateAI(const uint32 diff)
  1856.         {
  1857.             if(_instance->GetBossState(DATA_GUNSHIP_EVENT) != IN_PROGRESS)
  1858.                 return;
  1859.  
  1860.             if (me->HasUnitState(UNIT_STAT_CASTING))
  1861.                 return;
  1862.  
  1863.             events.Update(diff);
  1864.  
  1865.             while (uint32 eventId = events.ExecuteEvent())
  1866.             {
  1867.                 switch (eventId)
  1868.                 {
  1869.                 case EVENT_EXPERIENCED:
  1870.                     DoCast(me, SPELL_EXPERIENCED);
  1871.                     break;
  1872.                 case EVENT_VETERAN:
  1873.                     me->RemoveAurasDueToSpell(SPELL_EXPERIENCED);
  1874.                     DoCast(me, SPELL_VETERAN);
  1875.                     break;
  1876.                 case EVENT_ELITE:
  1877.                     me->RemoveAurasDueToSpell(SPELL_VETERAN);
  1878.                     DoCast(me, SPELL_ELITE);
  1879.                     break;
  1880.                 case EVENT_ROCKET_ART:
  1881.                     if(Player* target = SelectRandomPlayerInTheMaps(me->GetMap()))
  1882.                     {
  1883.                         if(me->GetEntry() == NPC_GB_KORKRON_ROCKETEER && target->HasAura(SPELL_ON_SKYBREAKERS_DECK))
  1884.                         {
  1885.                             me->CastSpell(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), SPELL_ROCKET_ARTILLERY_TRIGGERED, true);
  1886.                             me->CastSpell(target, 69400, true);
  1887.                         }
  1888.                         else if(me->GetEntry() == NPC_GB_SKYBREAKER_MORTAR_SOLDIER && target->HasAura(SPELL_ON_ORGRIMS_HAMMERS_DECK))
  1889.                         {
  1890.                             me->CastSpell(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), SPELL_ROCKET_ARTILLERY_TRIGGERED, true);
  1891.                             me->CastSpell(target, 70173, true);
  1892.                         }
  1893.                     }
  1894.                     events.ScheduleEvent(EVENT_ROCKET_ART, urand(10000, 15000));   // ~12 sec
  1895.                     break;
  1896.                 default:
  1897.                     break;
  1898.                 }
  1899.             }
  1900.         }
  1901.  
  1902.     private:
  1903.         EventMap events;
  1904.         InstanceScript* _instance;
  1905.     };
  1906.  
  1907.     CreatureAI* GetAI(Creature* pCreature) const
  1908.     {
  1909.         return new npc_mortar_soldier_or_rocketeerAI(pCreature);
  1910.     }
  1911. };
  1912.  
  1913. class npc_zafod_boombox : public CreatureScript
  1914. {
  1915. public:
  1916.     npc_zafod_boombox() : CreatureScript("npc_zafod_boombox") { }
  1917.  
  1918.     bool OnGossipHello(Player* pPlayer, Creature* pCreature)
  1919.     {
  1920.         // Maybe this isn't blizzlike but I can't find any spell in the DBCs
  1921.         if (pPlayer->GetItemCount(49278, false) == 0)
  1922.             pPlayer->ADD_GOSSIP_ITEM(0, "Yeah, I'm sure safety is your top priority. Give me a rocket pack.", 631, 1);
  1923.         pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
  1924.         return true;
  1925.     }
  1926.  
  1927.     bool OnGossipSelect(Player* player, Creature* pCreature, uint32 /*sender*/, uint32 action)
  1928.     {
  1929.         player->PlayerTalkClass->ClearMenus();
  1930.         player->CLOSE_GOSSIP_MENU();
  1931.         if (action == 1)
  1932.         {
  1933.             // Seurity, this shouldn't happen. Maybe useless.
  1934.             uint32 curItemCount = player->GetItemCount(49278, false);
  1935.             if (curItemCount >= 1)
  1936.             {
  1937.                 pCreature->MonsterWhisper("You already have my rocket pack!", player->GetGUIDLow());
  1938.                 return false;
  1939.             }
  1940.  
  1941.             ItemPosCountVec dest;
  1942.             uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, 49278, 1);
  1943.             if (msg == EQUIP_ERR_OK)
  1944.             {
  1945.                 Item* item = player->StoreNewItem(dest, 49278, true);
  1946.                 player->SendNewItem(item, 1, true, false);
  1947.             }
  1948.             else
  1949.             {
  1950.                 pCreature->MonsterWhisper("You don't have any empty space for my rocket pack!", player->GetGUIDLow());
  1951.                 return false;
  1952.             }
  1953.         }
  1954.  
  1955.         return true;
  1956.     }
  1957. };
  1958.  
  1959. //
  1960. class npc_saurfang_gunship : public CreatureScript
  1961. {
  1962. public:
  1963.     npc_saurfang_gunship() : CreatureScript("npc_saurfang_gunship") { }
  1964.  
  1965.     bool OnGossipHello(Player* player, Creature* pCreature)
  1966.     {
  1967.         InstanceScript* pInstance = pCreature->GetInstanceScript();
  1968.         if (pInstance && pInstance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  1969.         {
  1970.             if ((!player->GetGroup() || !player->GetGroup()->IsLeader(player->GetGUID())) && !player->isGameMaster())
  1971.             {
  1972.                 player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "I'm not the raid leader...", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
  1973.                 player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, pCreature->GetGUID());
  1974.                 return true;
  1975.             }
  1976.  
  1977.             player->ADD_GOSSIP_ITEM(0, "My companions are all accounted for, Saurfang. Let's go!", 631, 1001);
  1978.             player->SEND_GOSSIP_MENU(player->GetGossipTextId(pCreature), pCreature->GetGUID());
  1979.             return true;
  1980.         }
  1981.         return false;
  1982.     }
  1983.  
  1984.     bool OnGossipSelect(Player* player, Creature* pCreature, uint32 /*sender*/, uint32 action)
  1985.     {
  1986.         InstanceScript* instance = pCreature->GetInstanceScript();
  1987.         player->PlayerTalkClass->ClearMenus();
  1988.         player->CLOSE_GOSSIP_MENU();
  1989.  
  1990.         if (action == GOSSIP_ACTION_INFO_DEF+2)
  1991.             pCreature->MonsterSay("I'll wait for the raid leader.", LANG_UNIVERSAL, player->GetGUID());
  1992.  
  1993.         if (action == 1001)
  1994.         {
  1995.             pCreature->AI()->DoAction(ACTION_INTRO_START);
  1996.             pCreature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
  1997.         }
  1998.         return true;
  1999.     }
  2000.     struct npc_saurfang_gunshipAI : public ScriptedAI
  2001.     {
  2002.         npc_saurfang_gunshipAI(Creature *creature) : ScriptedAI(creature),
  2003.             _instance(creature->GetInstanceScript())
  2004.         {
  2005.         }
  2006.  
  2007.         void Reset()
  2008.         {
  2009.             if (_instance->GetBossState(DATA_GUNSHIP_EVENT) == IN_PROGRESS)
  2010.                 return;
  2011.             me->SetReactState(REACT_PASSIVE);
  2012.             me->setFaction(1801);
  2013.             events.Reset();
  2014.             map = me->GetMap();
  2015.             orgrimmar = me->GetTransport();
  2016.             RocketerDieCount = 0;
  2017.             AxesDieCount = 0;
  2018.             SummonCount = RAID_MODE(3, 5, 4, 6);
  2019.             count = 0;
  2020.             RocketerCount = RAID_MODE(2, 4, 2, 4);
  2021.             AxesCount = RAID_MODE(4, 6, 4, 6);
  2022.             EventScheduled = false;
  2023.         }
  2024.  
  2025.         void SendMusicToPlayers(uint32 musicId) const
  2026.         {
  2027.             WorldPacket data(SMSG_PLAY_MUSIC, 4);
  2028.             data << uint32(musicId);
  2029.             SendPacketToPlayers(&data);
  2030.         }
  2031.  
  2032.         // Send packet to all players
  2033.         void SendPacketToPlayers(WorldPacket const* data) const
  2034.         {
  2035.             Map::PlayerList const& players = me->GetMap()->GetPlayers();
  2036.             if (!players.isEmpty())
  2037.                 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
  2038.                     if (Player* player = itr->getSource())
  2039.                         player->GetSession()->SendPacket(data);
  2040.         }
  2041.  
  2042.         bool CanAIAttack(Unit const* target) const
  2043.         {
  2044.             if (target->GetEntry() == NPC_GB_SKYBREAKER_SERGANTE || target->GetEntry() == NPC_GB_SKYBREAKER_MARINE)
  2045.                 return true;
  2046.  
  2047.             return false;
  2048.         }
  2049.  
  2050.         void DoAction(int32 const action)
  2051.         {
  2052.             switch (action)
  2053.             {
  2054.             case ACTION_INTRO_START:
  2055.                 events.ScheduleEvent(EVENT_INTRO_HORDE_1, 1000);
  2056.                 events.ScheduleEvent(EVENT_INTRO_HORDE_1_1, 11000);
  2057.                 events.ScheduleEvent(EVENT_START_FLY, 5000);
  2058.                 events.ScheduleEvent(EVENT_INTRO_HORDE_2, 32000);
  2059.                 events.ScheduleEvent(EVENT_INTRO_HORDE_3, 51000);
  2060.                 events.ScheduleEvent(EVENT_INTRO_HORDE_4, 57000);
  2061.                 events.ScheduleEvent(EVENT_INTRO_HORDE_5, 62000);
  2062.                 break;
  2063.             case ACTION_BATTLE_EVENT:
  2064.                 {
  2065.                     if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  2066.                         events.ScheduleEvent(EVENT_WIPE_CHECK, 5000);
  2067.  
  2068.                     Creature* pHordeBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ORGRIMMAR_HAMMER_BOSS));
  2069.                     Creature* pAllianceBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_SKYBREAKER_BOSS));
  2070.  
  2071.                     if (pHordeBoss && pAllianceBoss)
  2072.                     {
  2073.                         me->SetReactState(REACT_AGGRESSIVE);
  2074.                         /* pHordeBoss->SetInCombatWith(pAllianceBoss);
  2075.                         pAllianceBoss->SetInCombatWith(pHordeBoss);
  2076.                         pAllianceBoss->AddThreat(pHordeBoss, 0.0f);
  2077.                         pHordeBoss->AddThreat(pAllianceBoss, 0.0f); */
  2078.                         _instance->SetBossState(DATA_GUNSHIP_EVENT, IN_PROGRESS);
  2079.                         events.ScheduleEvent(EVENT_SUMMON_PORTAL, 30000);
  2080.                         RelocateTransport(orgrimmar);
  2081.                         RelocateTransport(CheckUnfriendlyShip(me,_instance, DATA_GB_MURADIN_BRONZEBEARD));
  2082.                     }
  2083.                     else
  2084.                         me->AI()->DoAction(ACTION_FAIL);
  2085.                     break;
  2086.                 }
  2087.             case ACTION_DONE:
  2088.                 if (Creature* pAllianceBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_SKYBREAKER_BOSS)))
  2089.                 {
  2090.                     _instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, pAllianceBoss);
  2091.                 }
  2092.                 if (Creature* pHordeBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ORGRIMMAR_HAMMER_BOSS)))
  2093.                 {
  2094.                     _instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, pHordeBoss);
  2095.                 }
  2096.  
  2097.                 me->SetReactState(REACT_PASSIVE);
  2098.                 _instance->SetBossState(DATA_GUNSHIP_EVENT, DONE);
  2099.                 _instance->DoCastSpellOnPlayers(SPELL_REMOVE_ROCKET_PACK);
  2100.                 Talk(SAY_HORDE_VICTORY);
  2101.                 StartFlyShip(CheckUnfriendlyShip(me, _instance, DATA_GB_MURADIN_BRONZEBEARD));
  2102.                 StopFight(orgrimmar,CheckUnfriendlyShip(me,_instance, DATA_GB_MURADIN_BRONZEBEARD));
  2103.                 events.CancelEvent(EVENT_WIPE_CHECK);
  2104.                 events.ScheduleEvent(EVENT_OUTRO_HORDE_1, 3500);
  2105.                 events.ScheduleEvent(EVENT_OUTRO_HORDE_2, 21000);
  2106.                 events.ScheduleEvent(EVENT_OUTRO_HORDE_3, 32000);
  2107.                 break;
  2108.             case ACTION_FAIL:
  2109.                 events.CancelEvent(EVENT_WIPE_CHECK);
  2110.                 Talk(SAY_HORDE_DEFEAT);
  2111.                 if (Creature* pHordeBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ORGRIMMAR_HAMMER_BOSS)))
  2112.                 {
  2113.                     _instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, pHordeBoss);
  2114.                 }
  2115.                 if (Creature* pAllianceBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_SKYBREAKER_BOSS)))
  2116.                 {
  2117.                     _instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, pAllianceBoss);
  2118.                 }
  2119.                 StopFight(orgrimmar,CheckUnfriendlyShip(me,_instance, DATA_GB_MURADIN_BRONZEBEARD));
  2120.                 events.ScheduleEvent(EVENT_FAIL, 10000);
  2121.                 break;
  2122.             case ACTION_MAGE_DIE:
  2123.                 events.ScheduleEvent(EVENT_SPAWN_MAGE, 60000);
  2124.                 break;
  2125.             case ACTION_ROCK_DIE:
  2126.                 ++RocketerDieCount;
  2127.                 if(RocketerDieCount == RocketerCount)
  2128.                     events.ScheduleEvent(EVENT_RESPAWN_ROCKETEER, 60000);
  2129.                 break;
  2130.             case ACTION_AXES_RIFL_DIE:
  2131.                 ++AxesDieCount;
  2132.                 if(AxesDieCount == AxesCount)
  2133.                     events.ScheduleEvent(EVENT_RESPAWN_AXES_RIFLEMEN, 60000);
  2134.                 break;
  2135.             }
  2136.         }
  2137.  
  2138.         void DamageTaken(Unit* /*attacker*/, uint32& damage)
  2139.         {
  2140.             if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE && me->GetHealthPct() < 2.0f )
  2141.             {
  2142.                 damage = 0;
  2143.             }
  2144.  
  2145.             if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE && me->GetHealthPct() < 2.0f )
  2146.             {
  2147.                 damage = 0;
  2148.                 me->AI()->DoAction(ACTION_FAIL);
  2149.             }
  2150.         }
  2151.  
  2152.         void MovementInform(uint32 type, uint32 pointId)
  2153.         {
  2154.             if (type != POINT_MOTION_TYPE)
  2155.                 return;
  2156.  
  2157.             if (pointId = 1)
  2158.                 me->DespawnOrUnsummon(1000);
  2159.         }
  2160.  
  2161.         void UpdateAI(const uint32 diff)
  2162.         {
  2163.             if (me->HasUnitState(UNIT_STAT_CASTING))
  2164.                 return;
  2165.  
  2166.             if(_instance->GetBossState(DATA_GUNSHIP_EVENT) == IN_PROGRESS)
  2167.             {
  2168.                 if (!HealthAbovePct(75))
  2169.                 {
  2170.                     me->SetHealth(me->GetMaxHealth() / 100 * 76); // find a better way to avoid the hardcore spell spam ....
  2171.                     DoCast(me, SPELL_TASTE_OF_BLOOD);
  2172.                 }
  2173.  
  2174.                 if (UpdateVictim())
  2175.                 {
  2176.                     if (!EventScheduled)
  2177.                     {
  2178.                         events.ScheduleEvent(EVENT_RENDING_THROW, 1500);
  2179.                         EventScheduled = true;
  2180.                     }
  2181.                 }
  2182.             }
  2183.  
  2184.             events.Update(diff);
  2185.  
  2186.             while (uint32 eventId = events.ExecuteEvent())
  2187.             {
  2188.                 switch (eventId)
  2189.                 {
  2190.                 case EVENT_WIPE_CHECK:
  2191.                     DoCheckFallingPlayer(me);
  2192.                     if (DoWipeCheck(orgrimmar))
  2193.                         events.ScheduleEvent(EVENT_WIPE_CHECK, 3000);
  2194.                     else
  2195.                         me->AI()->DoAction(ACTION_FAIL);
  2196.                     break;
  2197.                 case EVENT_INTRO_HORDE_1:
  2198.                     Talk(SAY_INTRO_HORDE_0);
  2199.                     StartFlyShip(orgrimmar);
  2200.                     break;
  2201.                 case EVENT_INTRO_HORDE_1_1:
  2202.                     Talk(SAY_INTRO_HORDE_0_1);
  2203.                     break;
  2204.                 case EVENT_START_FLY:
  2205.                     break;
  2206.                 case EVENT_INTRO_HORDE_2:
  2207.                     StopFlyShip(orgrimmar);
  2208.                     StartFlyShip(CheckUnfriendlyShip(me, _instance, DATA_GB_MURADIN_BRONZEBEARD));
  2209.                     Talk(SAY_INTRO_HORDE_1);
  2210.                     break;
  2211.                 case EVENT_INTRO_HORDE_3:
  2212.                     StopFlyShip(CheckUnfriendlyShip(me, _instance, DATA_GB_MURADIN_BRONZEBEARD));
  2213.                     Talk(SAY_INTRO_HORDE_2);
  2214.                     break;
  2215.                 case EVENT_INTRO_HORDE_4:
  2216.                     SendMusicToPlayers(17289);
  2217.                     me->AI()->DoAction(ACTION_BATTLE_EVENT);
  2218.                     if (Creature* pMuradin = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MURADIN_BRONZEBEARD_NOT_VISUAL)))
  2219.                     {
  2220.                         pMuradin->AI()->Talk(SAY_MURADIN_BRONZEBEARD_NOT_VISUAL);
  2221.                         pMuradin->SetReactState(REACT_PASSIVE);
  2222.                         pMuradin->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  2223.                     }
  2224.                     break;
  2225.                 case EVENT_INTRO_HORDE_5:
  2226.                     Talk(SAY_INTRO_HORDE_4);
  2227.                     break;
  2228.                 case EVENT_SUMMON_PORTAL:
  2229.                     orgrimmar->AddNPCPassengerInInstance(NPC_GB_PORTAL, 15.03016f, -7.00016f, 37.70952f, 1.55138f);
  2230.                     CheckUnfriendlyShip(me, _instance, DATA_MURADIN_BRONZEBEARD_NOT_VISUAL)->AddNPCPassengerInInstance(NPC_GB_PORTAL, 3.51547f, -0.160213f, 20.87252f, 3.05033f);
  2231.                     events.ScheduleEvent(EVENT_BOARDING_TALK, 10000);
  2232.                     events.ScheduleEvent(EVENT_BOARDING_GUNSHIP, 2500); // TODO: Fix the timers
  2233.                     break;
  2234.                 case EVENT_BOARDING_TALK:
  2235.                     Talk(SAY_BOARDING_ORGRIMS_HAMMER_1);
  2236.                     break;
  2237.                 case EVENT_BOARDING_GUNSHIP:
  2238.                     count = 0;
  2239.                     if (Creature* pSaurfang = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MURADIN_BRONZEBEARD_NOT_VISUAL)))
  2240.                     {
  2241.                         pSaurfang->AI()->Talk(SAY_BOARDING_SKYBREAKER_MURADIN);
  2242.                     }
  2243.                     if (Creature* Sergante = orgrimmar->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_SERGANTE, 15.03016f, -7.00016f, 37.70952f, 1.55138f))
  2244.                     {
  2245.                         Sergante->CastSpell(Sergante, SPELL_TELEPORT_VISUAL, true);
  2246.                     }
  2247.                     events.ScheduleEvent(EVENT_BOARDING_REAVERS_MARINE, 3000);
  2248.                     events.ScheduleEvent(EVENT_SUMMON_PORTAL, 90000);
  2249.                     break;
  2250.                 case EVENT_BOARDING_REAVERS_MARINE:
  2251.                     if(count <= SummonCount)
  2252.                     {
  2253.                         if(Creature* Marine = orgrimmar->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MARINE, 15.03016f, -7.00016f, 37.70952f, 1.55138f))
  2254.                         {
  2255.                             Marine->CastSpell(Marine, SPELL_TELEPORT_VISUAL, true);
  2256.                             count++;
  2257.                             events.ScheduleEvent(EVENT_BOARDING_REAVERS_MARINE, 2500);
  2258.                         }
  2259.                     }
  2260.                     break;
  2261.                 case EVENT_OUTRO_HORDE_1:
  2262.                     _instance->DoCompleteAchievement(RAID_MODE(IM_ON_A_BOAT_10,IM_ON_A_BOAT_25,IM_ON_A_BOAT_10,IM_ON_A_BOAT_25));
  2263.                     _instance->DoCastSpellOnPlayers(SPELL_ACHIEVEMENT_CHECK);
  2264.                     StartFlyShip(orgrimmar);
  2265.                     StopFlyShip(CheckUnfriendlyShip(me,_instance,DATA_GB_MURADIN_BRONZEBEARD));
  2266.                     break;
  2267.                 case EVENT_OUTRO_HORDE_2:
  2268.                     StopFlyShip(orgrimmar);
  2269.                     me->SummonGameObject(RAID_MODE(GO_CAPITAN_CHEST_H_10N, GO_CAPITAN_CHEST_H_25N, GO_CAPITAN_CHEST_H_10H, GO_CAPITAN_CHEST_H_25H), -590.200022f, 2241.193115f, 539.588269f, 0, 0, 0, 0, 0, 100000);
  2270.                     me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
  2271.                     me->GetMotionMaster()->MovePoint(0, -590.700f, 2213.01f, 539.1f);
  2272.                     break;
  2273.                 case EVENT_OUTRO_HORDE_3:
  2274.                     me->GetMotionMaster()->MovePoint(1, -555.59f, 2213.01f, 539.28f);
  2275.                     break;
  2276.                 case EVENT_FAIL:
  2277.                     TeleportPlayers(map, HORDE);
  2278.                     events.ScheduleEvent(EVENT_RESTART_EVENT, 2000);
  2279.                     _instance->SetBossState(DATA_GUNSHIP_EVENT, NOT_STARTED);
  2280.                     break;
  2281.                 case EVENT_RESTART_EVENT:
  2282.                     _instance->SetBossState(DATA_GUNSHIP_EVENT, FAIL);
  2283.                     RestartEvent(orgrimmar, CheckUnfriendlyShip(me,_instance,DATA_GB_MURADIN_BRONZEBEARD), map, HORDE);
  2284.                     break;
  2285.                 case EVENT_RENDING_THROW:
  2286.                     if (UpdateVictim())
  2287.                         if (me->getVictim()->IsWithinDistInMap(me, 50.0f, false)) // Todo: Fix the distance
  2288.                         {
  2289.                             DoCastVictim(SPELL_RENDING_THROW);
  2290.                             EventScheduled = false;
  2291.                         }
  2292.                         else
  2293.                             events.CancelEvent(EVENT_RENDING_THROW);
  2294.                     break;
  2295.                 case EVENT_SPAWN_MAGE:
  2296.                     Talk(SAY_NEW_BATTLE_MAGE_SPAWNED);
  2297.                     orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_BATTLE_MAGE, 15.03016f, 0.00016f, 37.70952f, 1.55138f);
  2298.                     break;
  2299.                 case EVENT_RESPAWN_ROCKETEER:
  2300.                     Talk(SAY_NEW_ROCKETEERS_SPAWNED);
  2301.                     if(RocketerCount == 2)
  2302.                     {
  2303.                         orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, -11.44849f, -25.71838f, 33.64343f, 1.49248f);
  2304.                         orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, 12.30336f, -25.69653f, 35.32373f, 1.49248f);
  2305.                     }
  2306.                     if(RocketerCount == 4)
  2307.                     {
  2308.                         orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, -11.44849f, -25.71838f, 33.64343f, 1.49248f);
  2309.                         orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, 12.30336f, -25.69653f, 35.32373f, 1.49248f);
  2310.                         orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, -3.44849f, -25.71838f, 34.21082f, 1.49248f);
  2311.                         orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, 3.30336f, -25.69653f, 35.32373f, 1.49248f);
  2312.                     }
  2313.                     break;
  2314.                 case EVENT_RESPAWN_AXES_RIFLEMEN:
  2315.                     Talk(SAY_NEW_AXETHROWER_SPAWNED);
  2316.                     if(AxesCount == 4)
  2317.                     {
  2318.                         orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -3.170555f, 28.30652f, 34.21082f, 1.66527f);
  2319.                         orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -12.0928f, 27.65942f, 33.58557f, 1.66527f);
  2320.                         orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 14.92804f, 26.18018f, 35.47803f, 1.66527f);
  2321.                         orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 24.70331f, 25.36584f, 35.97845f, 1.66527f);
  2322.                     }
  2323.                     if(AxesCount == 6)
  2324.                     {
  2325.                         orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -3.170555f, 28.30652f, 34.21082f, 1.66527f);
  2326.                         orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -12.0928f, 27.65942f, 33.58557f, 1.66527f);
  2327.                         orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 14.92804f, 26.18018f, 35.47803f, 1.66527f);
  2328.                         orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 24.70331f, 25.36584f, 35.97845f, 1.66527f);
  2329.                         orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 19.92804f, 27.18018f, 35.47803f, 1.66527f);
  2330.                         orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -7.70331f, 28.36584f, 33.88557f, 1.66527f);
  2331.                     }
  2332.                     break;
  2333.                 }
  2334.             }
  2335.  
  2336.             if (!me->GetCurrentSpell(CURRENT_MELEE_SPELL))
  2337.                 DoCastVictim(SPELL_CLEAVE);
  2338.  
  2339.             DoMeleeAttackIfReady();
  2340.         }
  2341.  
  2342.  
  2343.     private:
  2344.         Transport* orgrimmar;
  2345.         uint32 RocketerDieCount;
  2346.         uint32 AxesDieCount;
  2347.         uint32 RocketerCount;
  2348.         uint32 AxesCount;
  2349.         uint32 SummonCount;
  2350.         uint32 count;
  2351.         bool EventScheduled;
  2352.         Map* map;
  2353.         EventMap events;
  2354.         InstanceScript* _instance;
  2355.     };
  2356.  
  2357.     CreatureAI* GetAI(Creature* pCreature) const
  2358.     {
  2359.         return new npc_saurfang_gunshipAI(pCreature);
  2360.     }
  2361. };
  2362.  
  2363. class npc_gunship_portal : public CreatureScript
  2364. {
  2365. public:
  2366.     npc_gunship_portal() : CreatureScript("npc_gunship_portal") { }
  2367.  
  2368.     struct npc_gunship_portalAI : public Scripted_NoMovementAI
  2369.     {
  2370.         npc_gunship_portalAI(Creature *creature) : Scripted_NoMovementAI(creature),_instance(creature->GetInstanceScript())
  2371.         {
  2372.             Reset();
  2373.         }
  2374.  
  2375.         void Reset()
  2376.         {
  2377.             events.ScheduleEvent(EVENT_UNSUMMON_PORTAL, 20500); // TODO: Fix the timers
  2378.             me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
  2379.         }
  2380.  
  2381.         void JustDied(Unit* killer)
  2382.         {
  2383.             me->RemoveFromWorld();
  2384.         }
  2385.  
  2386.         void UpdateAI( const uint32 diff)
  2387.         {
  2388.  
  2389.             events.Update(diff);
  2390.  
  2391.             while (uint32 eventId = events.ExecuteEvent())
  2392.             {
  2393.                 switch (eventId)
  2394.                 {
  2395.                 case EVENT_UNSUMMON_PORTAL:
  2396.                     me->RemoveFromWorld();
  2397.                     break;
  2398.                 }
  2399.             }
  2400.         }
  2401.  
  2402.     private:
  2403.         EventMap events;
  2404.         InstanceScript* _instance;
  2405.  
  2406.     };
  2407.  
  2408.     CreatureAI* GetAI(Creature* pCreature) const
  2409.     {
  2410.         return new npc_gunship_portalAI(pCreature);
  2411.     }
  2412. };
  2413.  
  2414.  
  2415. class npc_gunship_trigger : public CreatureScript
  2416. {
  2417. public:
  2418.     npc_gunship_trigger() : CreatureScript("npc_gunship_trigger") { }
  2419.  
  2420.     struct npc_gunship_triggerAI : public Scripted_NoMovementAI
  2421.     {
  2422.         npc_gunship_triggerAI(Creature *creature) : Scripted_NoMovementAI(creature),_instance(creature->GetInstanceScript())
  2423.         {
  2424.  
  2425.             Reset();
  2426.         }
  2427.  
  2428.         void Reset()
  2429.         {
  2430.             ScriptedAI::Reset();
  2431.             me->SetReactState(REACT_PASSIVE);
  2432.             me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  2433.         }
  2434.  
  2435.         void EnterCombat(Unit* /*who*/)
  2436.         {
  2437.             me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  2438.             SetCombatMovement(false);
  2439.         }
  2440.  
  2441.         void DamageTaken(Unit* attacker, uint32& damage)
  2442.         {
  2443.             damage = 0;
  2444.         }
  2445.  
  2446.         void UpdateAI(const uint32 diff)
  2447.         {
  2448.  
  2449.         }
  2450.  
  2451.     private:
  2452.         EventMap events;
  2453.         InstanceScript* _instance;
  2454.     };
  2455.  
  2456.     CreatureAI* GetAI(Creature* pCreature) const
  2457.     {
  2458.         return new npc_gunship_triggerAI(pCreature);
  2459.     }
  2460. };
  2461.  
  2462. /* ----------------------------------- Rampart of Skulls NPCs ----------------------------------- */
  2463.  
  2464. /* Kor'kron Primalist  37030*/
  2465. class npc_korkron_primalist: public CreatureScript
  2466. {
  2467. public:
  2468.     npc_korkron_primalist() : CreatureScript("npc_korkron_primalist") { }
  2469.  
  2470.     struct npc_korkron_primalistAI : public ScriptedAI
  2471.     {
  2472.         npc_korkron_primalistAI(Creature* creature) : ScriptedAI(creature)
  2473.         {
  2474.             instance = creature->GetInstanceScript();
  2475.         }
  2476.  
  2477.         void Reset()
  2478.         {
  2479.             _started = instance->GetBossState(DATA_GUNSHIP_EVENT) == DONE;
  2480.             events.Reset();
  2481.             events.ScheduleEvent(EVENT_WRATH, 10000); // TODO: Fix the timers
  2482.             events.ScheduleEvent(EVENT_HEAL, 20000); // TODO: Fix the timers
  2483.         }
  2484.  
  2485.         void MoveInLineOfSight(Unit* who)
  2486.         {
  2487.             if (!instance)
  2488.                 return;
  2489.  
  2490.             if (instance->GetData(DATA_TEAM_IN_INSTANCE) != HORDE)
  2491.                 return;
  2492.  
  2493.             if (who->GetTypeId() != TYPEID_PLAYER)
  2494.                 return;
  2495.  
  2496.             if (instance->GetData(DATA_FIRST_SQUAD_STATE) == DONE)
  2497.                 return;
  2498.  
  2499.             if (!_started && me->IsWithinDistInMap(who, 25.0f))
  2500.             {
  2501.                 _started = true;
  2502.                 events.ScheduleEvent(EVENT_FIRST_SQUAD_ASSISTED_1, 1000);
  2503.                 events.ScheduleEvent(EVENT_FIRST_SQUAD_ASSISTED_2, 15000); // TODO : fix the timer
  2504.             }
  2505.         }
  2506.  
  2507.         void UpdateAI(const uint32 diff)
  2508.         {
  2509.             if (!instance)
  2510.                 return;
  2511.  
  2512.             if (me->HasUnitState(UNIT_STAT_CASTING))
  2513.                 return;
  2514.  
  2515.             events.Update(diff);
  2516.  
  2517.             while (uint32 eventId = events.ExecuteEvent())
  2518.             {
  2519.                 switch (eventId)
  2520.                 {
  2521.                 case EVENT_FIRST_SQUAD_ASSISTED_1:
  2522.                     Talk(SAY_FIRST_SQUAD_RESCUED_HORDE_0);
  2523.                     break;
  2524.                 case EVENT_FIRST_SQUAD_ASSISTED_2:
  2525.                     if (Creature* tempUnit = me->FindNearestCreature(NPC_KORKRON_INVOKER, 120.0f, true))
  2526.                     {
  2527.                         tempUnit->AI()->Talk(SAY_FIRST_SQUAD_RESCUED_HORDE_1);
  2528.                         tempUnit->AI()->Talk(SAY_SUMMON_BATTLE_STANDARD);
  2529.                         tempUnit->CastSpell(tempUnit, SPELL_SUMMON_BATTLE_STANDART_H, true);
  2530.                     }
  2531.                     instance->SetData(DATA_FIRST_SQUAD_STATE, DONE);
  2532.                     break;
  2533.                 case EVENT_WRATH:
  2534.                     if (UpdateVictim())
  2535.                         if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 10.0f))
  2536.                             DoCast(target, SPELL_WRATH);
  2537.                     events.ScheduleEvent(EVENT_WRATH, 10000);
  2538.                     break;
  2539.                 case EVENT_HEAL:
  2540.                     if (UpdateVictim())
  2541.                     {
  2542.                         std::list<Unit*> TargetList;
  2543.                         Unit* finalTarget = me;
  2544.                         Trinity::AnyFriendlyUnitInObjectRangeCheck checker(me, me, 30.0f);
  2545.                         Trinity::UnitListSearcher<Trinity::AnyFriendlyUnitInObjectRangeCheck> searcher(me, TargetList, checker);
  2546.                         me->VisitNearbyObject(30.0f, searcher);
  2547.                         for (std::list<Unit*>::iterator itr = TargetList.begin(); itr != TargetList.end(); ++itr)
  2548.                             if ((*itr)->GetHealthPct() < finalTarget->GetHealthPct())
  2549.                                 finalTarget = *itr;
  2550.  
  2551.                         uint32 spellId = SPELL_HEALING_TOUCH;
  2552.                         uint32 healthPct = uint32(finalTarget->GetHealthPct());
  2553.                         if (healthPct > 15 && healthPct < 20)
  2554.                             spellId = (urand (0, 1) ? SPELL_REGROWTH : SPELL_HEALING_TOUCH);
  2555.                         else if (healthPct >= 20 && healthPct < 40)
  2556.                             spellId = SPELL_REGROWTH;
  2557.                         else if (healthPct > 40)
  2558.                             spellId = (urand(0, 1) ? SPELL_REJUVENATION : SPELL_REGROWTH);
  2559.  
  2560.                         me->CastSpell(finalTarget, spellId, false);
  2561.                         events.ScheduleEvent(EVENT_HEAL, 20000);
  2562.                     }
  2563.                     break;
  2564.                 }
  2565.             }
  2566.  
  2567.             DoMeleeAttackIfReady();
  2568.         }
  2569.  
  2570.     private:
  2571.         bool _started;
  2572.         EventMap events;
  2573.         InstanceScript* instance;
  2574.     };
  2575.  
  2576.     CreatureAI* GetAI(Creature* pCreature) const
  2577.     {
  2578.         return new npc_korkron_primalistAI(pCreature);
  2579.     }
  2580. };
  2581.  
  2582. /* Kor'kron Defender  37032*/
  2583. class npc_korkron_defender: public CreatureScript
  2584. {
  2585. public:
  2586.     npc_korkron_defender() : CreatureScript("npc_korkron_defender") { }
  2587.  
  2588.     struct npc_korkron_defenderAI : public ScriptedAI
  2589.     {
  2590.         npc_korkron_defenderAI(Creature* creature) : ScriptedAI(creature)
  2591.         {
  2592.             instance = creature->GetInstanceScript();
  2593.         }
  2594.  
  2595.         void Reset()
  2596.         {
  2597.             events.Reset();
  2598.             events.ScheduleEvent(EVENT_DEVASTATE, 10000);
  2599.             events.ScheduleEvent(EVENT_THUNDERCLAP, 20000);
  2600.             events.ScheduleEvent(EVENT_SPELL_REFLECT, 25000);
  2601.             events.ScheduleEvent(EVENT_SUNDER_ARMOR, 15000);
  2602.         }
  2603.  
  2604.         void MoveInLineOfSight(Unit* who)
  2605.         {
  2606.             if (!instance)
  2607.                 return;
  2608.  
  2609.             if (instance->GetData(DATA_TEAM_IN_INSTANCE) != HORDE)
  2610.                 return;
  2611.  
  2612.             if (who->GetTypeId() != TYPEID_PLAYER)
  2613.                 return;
  2614.  
  2615.             if (me->IsWithinDistInMap(who, 25.0f))
  2616.             {
  2617.                 if (instance->GetData(DATA_FIRST_SQUAD_STATE) == DONE && instance->GetData(DATA_SECOND_SQUAD_STATE) != DONE)
  2618.                 {
  2619.                     instance->SetData(DATA_SECOND_SQUAD_STATE, DONE);
  2620.                     events.ScheduleEvent(EVENT_SECOND_SQUAD_ASSISTED_1, 1000);
  2621.                     events.ScheduleEvent(EVENT_SECOND_SQUAD_ASSISTED_2, 15000); // TODO : fix the timer
  2622.                 }
  2623.             }
  2624.         }
  2625.  
  2626.         void UpdateAI(const uint32 diff)
  2627.         {
  2628.             if (!instance)
  2629.                 return;
  2630.  
  2631.             if (me->HasUnitState(UNIT_STAT_CASTING))
  2632.                 return;
  2633.  
  2634.             events.Update(diff);
  2635.  
  2636.             while (uint32 eventId = events.ExecuteEvent())
  2637.             {
  2638.                 switch (eventId)
  2639.                 {
  2640.                 case EVENT_SECOND_SQUAD_ASSISTED_1:
  2641.                     Talk(SAY_SECOND_SQUAD_RESCUED_HORDE_0);
  2642.                     break;
  2643.                 case EVENT_SECOND_SQUAD_ASSISTED_2:
  2644.                     Talk(SAY_SECOND_SQUAD_RESCUED_HORDE_1);
  2645.                     Talk(SAY_FROSTWYRM_SUMMON_0);
  2646.                     break;
  2647.                 case EVENT_DEVASTATE:
  2648.                     if (UpdateVictim())
  2649.                     {
  2650.                         if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
  2651.                             DoCast(target, SPELL_DEVASTATE);
  2652.                     }
  2653.                     events.ScheduleEvent(EVENT_DEVASTATE, 10000);
  2654.                     break;
  2655.                 case EVENT_SPELL_REFLECT:
  2656.                     if (UpdateVictim())
  2657.                     {
  2658.                         DoCast(me, SPELL_SPELL_REFLECT);
  2659.                     }
  2660.                     events.ScheduleEvent(EVENT_SPELL_REFLECT, 25000);
  2661.                     break;
  2662.                 case EVENT_THUNDERCLAP:
  2663.                     if (UpdateVictim())
  2664.                     {
  2665.                         if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
  2666.                             DoCast(target, SPELL_THUNDERCLAP);
  2667.                     }
  2668.                     events.ScheduleEvent(EVENT_THUNDERCLAP, 20000);
  2669.                     break;
  2670.                 case EVENT_SUNDER_ARMOR:
  2671.                     if (UpdateVictim())
  2672.                     {
  2673.                         if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
  2674.                             DoCast(target, SPELL_SUNDER_ARMOR);
  2675.                     }
  2676.                     events.ScheduleEvent(EVENT_SUNDER_ARMOR, 15000);
  2677.                     break;
  2678.                 }
  2679.             }
  2680.  
  2681.             DoMeleeAttackIfReady();
  2682.         }
  2683.  
  2684.     private:
  2685.         EventMap events;
  2686.         InstanceScript* instance;
  2687.     };
  2688.  
  2689.     CreatureAI* GetAI(Creature* pCreature) const
  2690.     {
  2691.         return new npc_korkron_defenderAI(pCreature);
  2692.     }
  2693. };
  2694.  
  2695. /* Skybreaker Vindicator  37003*/
  2696. class npc_skybreaker_vindicator: public CreatureScript
  2697. {
  2698. public:
  2699.     npc_skybreaker_vindicator() : CreatureScript("npc_skybreaker_vindicator") { }
  2700.  
  2701.     struct npc_skybreaker_vindicatorAI : public ScriptedAI
  2702.     {
  2703.         npc_skybreaker_vindicatorAI(Creature* creature) : ScriptedAI(creature)
  2704.         {
  2705.             instance = creature->GetInstanceScript();
  2706.         }
  2707.  
  2708.         void Reset()
  2709.         {
  2710.             _started = instance->GetBossState(DATA_GUNSHIP_EVENT) == DONE;
  2711.             events.Reset();
  2712.             events.ScheduleEvent(EVENT_AVENGERS_SHILED, 10000); // TODO: Fix the timers
  2713.             events.ScheduleEvent(EVENT_CONCENTRATION, 20000); // TODO: Fix the timers
  2714.             events.ScheduleEvent(EVENT_HOLY_WRATH, 20000); // TODO: Fix the timers
  2715.         }
  2716.  
  2717.         void MoveInLineOfSight(Unit* who)
  2718.         {
  2719.             if (!instance)
  2720.                 return;
  2721.  
  2722.             if (instance->GetData(DATA_TEAM_IN_INSTANCE) != ALLIANCE)
  2723.                 return;
  2724.  
  2725.             if (who->GetTypeId() != TYPEID_PLAYER)
  2726.                 return;
  2727.  
  2728.             if (instance->GetData(DATA_FIRST_SQUAD_STATE) == DONE)
  2729.                 return;
  2730.  
  2731.             if (!_started && me->IsWithinDistInMap(who, 25.0f))
  2732.             {
  2733.                 _started = true;
  2734.                 events.ScheduleEvent(EVENT_FIRST_SQUAD_ASSISTED_1, 1000);
  2735.                 events.ScheduleEvent(EVENT_FIRST_SQUAD_ASSISTED_2, 15000); // TODO : fix the timer
  2736.             }
  2737.         }
  2738.  
  2739.         void UpdateAI(const uint32 diff)
  2740.         {
  2741.             if (!instance)
  2742.                 return;
  2743.  
  2744.             if (me->HasUnitState(UNIT_STAT_CASTING))
  2745.                 return;
  2746.  
  2747.             events.Update(diff);
  2748.  
  2749.             while (uint32 eventId = events.ExecuteEvent())
  2750.             {
  2751.                 switch (eventId)
  2752.                 {
  2753.                 case EVENT_FIRST_SQUAD_ASSISTED_1:
  2754.                     Talk(SAY_FIRST_SQUAD_RESCUED_ALLIANCE_0);
  2755.                     break;
  2756.                 case EVENT_FIRST_SQUAD_ASSISTED_2:
  2757.                     if (Creature* tempUnit = me->FindNearestCreature(NPC_GB_SKYBREAKER_SORCERER, 120.0f, true))
  2758.                     {
  2759.                         tempUnit->AI()->Talk(SAY_FIRST_SQUAD_RESCUED_ALLIANCE_1);
  2760.                         tempUnit->AI()->Talk(SAY_SUMMON_BATTLE_STANDARD);
  2761.                         tempUnit->CastSpell(tempUnit, SPELL_SUMMON_BATTLE_STANDART_A, true);
  2762.                     }
  2763.                     instance->SetData(DATA_FIRST_SQUAD_STATE, DONE);
  2764.                     break;
  2765.                 case EVENT_AVENGERS_SHILED:
  2766.                     if (UpdateVictim())
  2767.                         if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 10.0f))
  2768.                             DoCast(target, SPELL_WRATH);
  2769.                     events.ScheduleEvent(EVENT_AVENGERS_SHILED, 10000);
  2770.                     break;
  2771.                 case EVENT_CONCENTRATION:
  2772.                     if (UpdateVictim())
  2773.                         if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 10.0f))
  2774.                             DoCast(target, SPELL_CONCENTRATION);
  2775.                     events.ScheduleEvent(EVENT_CONCENTRATION, 20000);
  2776.                     break;
  2777.                 case EVENT_HOLY_WRATH:
  2778.                     if (UpdateVictim())
  2779.                         if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 10.0f))
  2780.                             DoCast(target, SPELL_HOLY_WRATH);
  2781.                     events.ScheduleEvent(EVENT_HOLY_WRATH, 15000);
  2782.                     break;
  2783.                 }
  2784.             }
  2785.  
  2786.             DoMeleeAttackIfReady();
  2787.         }
  2788.  
  2789.     private:
  2790.         bool _started;
  2791.         EventMap events;
  2792.         InstanceScript* instance;
  2793.     };
  2794.  
  2795.     CreatureAI* GetAI(Creature* pCreature) const
  2796.     {
  2797.         return new npc_skybreaker_vindicatorAI(pCreature);
  2798.     }
  2799. };
  2800.  
  2801. /* Skybreaker Protector  36998*/
  2802. class npc_skybreaker_protector: public CreatureScript
  2803. {
  2804. public:
  2805.     npc_skybreaker_protector() : CreatureScript("npc_skybreaker_protector") { }
  2806.  
  2807.     struct npc_skybreaker_protectorAI : public ScriptedAI
  2808.     {
  2809.         npc_skybreaker_protectorAI(Creature* creature) : ScriptedAI(creature)
  2810.         {
  2811.             instance = creature->GetInstanceScript();
  2812.         }
  2813.  
  2814.         void Reset()
  2815.         {
  2816.             events.Reset();
  2817.             events.ScheduleEvent(EVENT_DEVASTATE, 10000);
  2818.             events.ScheduleEvent(EVENT_THUNDERCLAP, 20000);
  2819.             events.ScheduleEvent(EVENT_SPELL_REFLECT, 25000);
  2820.             events.ScheduleEvent(EVENT_SUNDER_ARMOR, 15000);
  2821.         }
  2822.  
  2823.         void MoveInLineOfSight(Unit* who)
  2824.         {
  2825.             if (!instance)
  2826.                 return;
  2827.  
  2828.             if (instance->GetData(DATA_TEAM_IN_INSTANCE) != ALLIANCE)
  2829.                 return;
  2830.  
  2831.             if (who->GetTypeId() != TYPEID_PLAYER)
  2832.                 return;
  2833.  
  2834.             if (me->IsWithinDistInMap(who, 25.0f))
  2835.             {
  2836.                 if (instance->GetData(DATA_FIRST_SQUAD_STATE) == DONE && instance->GetData(DATA_SECOND_SQUAD_STATE) != DONE)
  2837.                 {
  2838.                     instance->SetData(DATA_SECOND_SQUAD_STATE, DONE);
  2839.                     events.ScheduleEvent(EVENT_SECOND_SQUAD_ASSISTED_1, 1000);
  2840.                     events.ScheduleEvent(EVENT_SECOND_SQUAD_ASSISTED_2, 11000); // TODO : fix the timer
  2841.                     events.ScheduleEvent(EVENT_SECOND_SQUAD_ASSISTED_3, 17000); // TODO : fix the timer
  2842.                 }
  2843.             }
  2844.         }
  2845.  
  2846.         void UpdateAI(const uint32 diff)
  2847.         {
  2848.             if (!instance)
  2849.                 return;
  2850.  
  2851.             if (me->HasUnitState(UNIT_STAT_CASTING))
  2852.                 return;
  2853.  
  2854.             events.Update(diff);
  2855.  
  2856.             while (uint32 eventId = events.ExecuteEvent())
  2857.             {
  2858.                 switch (eventId)
  2859.                 {
  2860.                 case EVENT_SECOND_SQUAD_ASSISTED_1:
  2861.                     Talk(SAY_SECOND_SQUAD_RESCUED_ALLIANCE_0);
  2862.                     break;
  2863.                 case EVENT_SECOND_SQUAD_ASSISTED_2:
  2864.                     Talk(SAY_SECOND_SQUAD_RESCUED_ALLIANCE_1);
  2865.                     break;
  2866.                 case EVENT_SECOND_SQUAD_ASSISTED_3:
  2867.                     Talk(SAY_SECOND_SQUAD_RESCUED_ALLIANCE_2);
  2868.                     Talk(SAY_FROSTWYRM_SUMMON_1);
  2869.                     break;
  2870.                 case EVENT_DEVASTATE:
  2871.                     if (UpdateVictim())
  2872.                     {
  2873.                         if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
  2874.                             DoCast(target, SPELL_DEVASTATE);
  2875.                     }
  2876.                     events.ScheduleEvent(EVENT_DEVASTATE, 10000);
  2877.                     break;
  2878.                 case EVENT_SPELL_REFLECT:
  2879.                     if (UpdateVictim())
  2880.                     {
  2881.                         DoCast(me, SPELL_SPELL_REFLECT);
  2882.                     }
  2883.                     events.ScheduleEvent(EVENT_SPELL_REFLECT, 25000);
  2884.                     break;
  2885.                 case EVENT_THUNDERCLAP:
  2886.                     if (UpdateVictim())
  2887.                     {
  2888.                         if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
  2889.                             DoCast(target, SPELL_THUNDERCLAP);
  2890.                     }
  2891.                     events.ScheduleEvent(EVENT_THUNDERCLAP, 20000);
  2892.                     break;
  2893.                 case EVENT_SUNDER_ARMOR:
  2894.                     if (UpdateVictim())
  2895.                     {
  2896.                         if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
  2897.                             DoCast(target, SPELL_SUNDER_ARMOR);
  2898.                     }
  2899.                     events.ScheduleEvent(EVENT_SUNDER_ARMOR, 15000);
  2900.                     break;
  2901.                 }
  2902.             }
  2903.  
  2904.             DoMeleeAttackIfReady();
  2905.         }
  2906.  
  2907.     private:
  2908.         EventMap events;
  2909.         InstanceScript* instance;
  2910.     };
  2911.     CreatureAI* GetAI(Creature* pCreature) const
  2912.     {
  2913.         return new npc_skybreaker_protectorAI(pCreature);
  2914.     }
  2915. };
  2916.  
  2917.  
  2918. /* Spire Frostwyrm  37230*/
  2919. class npc_icc_spire_frostwyrm: public CreatureScript
  2920. {
  2921. public:
  2922.     npc_icc_spire_frostwyrm() : CreatureScript("npc_icc_spire_frostwyrm") { }
  2923.  
  2924.     struct npc_icc_spire_frostwyrmAI : public ScriptedAI
  2925.     {
  2926.         npc_icc_spire_frostwyrmAI(Creature* creature) : ScriptedAI(creature)
  2927.         {
  2928.             instance = creature->GetInstanceScript();
  2929.         }
  2930.  
  2931.         void Reset()
  2932.         {
  2933.             landed = false;
  2934.             events.Reset();
  2935.             me->SetFlying(true);
  2936.             me->SetReactState(REACT_AGGRESSIVE);
  2937.             me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
  2938.             events.ScheduleEvent(EVENT_FROST_BREATH, 20000);
  2939.             events.ScheduleEvent(EVENT_BLIZZARD, 25000);
  2940.             events.ScheduleEvent(EVENT_CLEAVE, 10000);
  2941.         }
  2942.  
  2943.         void MoveInLineOfSight(Unit* who)
  2944.         {
  2945.             if (!instance)
  2946.                 return;
  2947.  
  2948.             if (who->GetTypeId() != TYPEID_PLAYER)
  2949.                 return;
  2950.  
  2951.             if (!who->isTargetableForAttack())
  2952.                 return;
  2953.  
  2954.             if (!landed && me->IsWithinDistInMap(who, 35.0f))
  2955.             {
  2956.                 if (instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  2957.                     Talk(SAY_FROSTWYRM_LAND_H_0);
  2958.                 else
  2959.                     Talk(SAY_FROSTWYRM_LAND_A_1);
  2960.                 landed = true;
  2961.                 me->SetFlying(false);
  2962.                 me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
  2963.                 me->SetInCombatWith(who);
  2964.                 me->AddThreat(who, 1.0f);
  2965.                 me->GetMotionMaster()->MoveChase(who);
  2966.             }
  2967.         }
  2968.  
  2969.         void UpdateAI(const uint32 diff)
  2970.         {
  2971.             if (!UpdateVictim())
  2972.                 return;
  2973.  
  2974.             if (me->HasUnitState(UNIT_STAT_CASTING))
  2975.                 return;
  2976.  
  2977.             events.Update(diff);
  2978.  
  2979.             while (uint32 eventId = events.ExecuteEvent())
  2980.             {
  2981.                 switch (eventId)
  2982.                 {
  2983.                 case EVENT_FROST_BREATH:
  2984.                     if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 10.0f))
  2985.                         DoCast(target, SPELL_FROST_BREATH);
  2986.                     events.ScheduleEvent(EVENT_FROST_BREATH, 20000);
  2987.                     break;
  2988.                 case EVENT_BLIZZARD:
  2989.                     if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 10.0f))
  2990.                         DoCast(target, SPELL_BLIZZARD);
  2991.                     events.ScheduleEvent(EVENT_BLIZZARD, 25000);
  2992.                     break;
  2993.                 case EVENT_CLEAVE:
  2994.                     if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 10.0f))
  2995.                         DoCast(target, SPELL_FROST_CLEAVE);
  2996.                     events.ScheduleEvent(EVENT_CLEAVE, 10000);
  2997.                     break;
  2998.                 }
  2999.             }
  3000.  
  3001.             DoMeleeAttackIfReady();
  3002.         }
  3003.  
  3004.     private:
  3005.         bool landed;
  3006.         EventMap events;
  3007.         InstanceScript* instance;
  3008.     };
  3009.  
  3010.     CreatureAI* GetAI(Creature* pCreature) const
  3011.     {
  3012.         return new npc_icc_spire_frostwyrmAI(pCreature);
  3013.     }
  3014. };
  3015.  
  3016. /* ---------------------------------- AreaTrigger Scripts ------------------------------------- */
  3017. class at_icc_land_frostwyrm : public AreaTriggerScript
  3018. {
  3019. public:
  3020.     at_icc_land_frostwyrm() : AreaTriggerScript("at_icc_land_frostwyrm") { }
  3021.  
  3022.     bool OnTrigger(Player* player, AreaTriggerEntry const* areaTrigger)
  3023.     {
  3024.         if (InstanceScript* instance = player->GetInstanceScript())
  3025.         {
  3026.             if (instance->GetData(DATA_SPIRE_FROSTWYRM_STATE) == NOT_STARTED && instance->GetData(DATA_SECOND_SQUAD_STATE) == DONE)
  3027.             {
  3028.                 if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
  3029.                     player->GetMap()->SummonCreature(NPC_SPIRE_FROSTWYRM, FrostWyrmPosA);
  3030.                 else
  3031.                     player->GetMap()->SummonCreature(NPC_SPIRE_FROSTWYRM, FrostWyrmPosH);
  3032.  
  3033.                 instance->SetData(DATA_SPIRE_FROSTWYRM_STATE, IN_PROGRESS);
  3034.             }
  3035.         }
  3036.  
  3037.         return true;
  3038.     }
  3039. };
  3040.  
  3041. /* transport script */
  3042. class transport_gunship : public TransportScript
  3043. {
  3044. public:
  3045.     transport_gunship() : TransportScript("transport_gunship") { }
  3046.  
  3047.     void OnRelocate(Transport* transport, uint32 waypointId, uint32 mapId, float x, float y, float z)
  3048.     {
  3049.     }
  3050.  
  3051.     void OnAddPassenger(Transport* transport, Player* player)
  3052.     {
  3053.         if (!transport || !player)
  3054.             return;
  3055.  
  3056.         switch (transport->GetEntry())
  3057.         {
  3058.         case GO_THE_SKYBREAKER_ALLIANCE_ICC:
  3059.             player->AddAura(SPELL_ON_SKYBREAKERS_DECK, player);
  3060.             break;
  3061.         case GO_ORGRIM_S_HAMMER_HORDE_ICC:
  3062.             player->AddAura(SPELL_ON_ORGRIMS_HAMMERS_DECK, player);
  3063.             break;
  3064.         default:
  3065.             break;
  3066.         }
  3067.     }
  3068.  
  3069.     void OnRemovePassenger(Transport* /*transport*/, Player* player)
  3070.     {
  3071.         if (!player)
  3072.             return;
  3073.  
  3074.         player->RemoveAurasDueToSpell(SPELL_ON_ORGRIMS_HAMMERS_DECK);
  3075.         player->RemoveAurasDueToSpell(SPELL_ON_SKYBREAKERS_DECK);
  3076.     }
  3077. };
  3078.  
  3079. /* Remove Rocket Pack - 70713 */
  3080. class spell_icc_remove_rocket_pack : public SpellScriptLoader
  3081. {
  3082. public:
  3083.     spell_icc_remove_rocket_pack() : SpellScriptLoader("spell_icc_remove_rocket_pack") { }
  3084.  
  3085.     class spell_icc_remove_rocket_pack_SpellScript : public SpellScript
  3086.     {
  3087.         PrepareSpellScript(spell_icc_remove_rocket_pack_SpellScript);
  3088.  
  3089.         void HandleEffect(SpellEffIndex /*effIndex*/)
  3090.         {
  3091.             Player* hitPlr = GetHitPlayer();
  3092.             if (!hitPlr) // If player is offline
  3093.                 return;
  3094.  
  3095.             int32 itemId = GetEffectValue();
  3096.             uint32 itemCount = hitPlr->GetItemCount(itemId, false); // Should be 1, but just in case.
  3097.             hitPlr->DestroyItemCount(itemId, itemCount, true, false);
  3098.         }
  3099.  
  3100.         void Register()
  3101.         {
  3102.             OnEffect += SpellEffectFn(spell_icc_remove_rocket_pack_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
  3103.         }
  3104.     };
  3105.  
  3106.     SpellScript* GetSpellScript() const
  3107.     {
  3108.         return new spell_icc_remove_rocket_pack_SpellScript();
  3109.     }
  3110. };
  3111.  
  3112. /* spell 69471 Heat Drain */
  3113. class spell_gb_heat_drain : public SpellScriptLoader
  3114. {
  3115. public:
  3116.     spell_gb_heat_drain() : SpellScriptLoader("spell_gb_heat_drain") { }
  3117.  
  3118.     class spell_gb_heat_drain_SpellScript : public SpellScript
  3119.     {
  3120.         PrepareSpellScript(spell_gb_heat_drain_SpellScript);
  3121.  
  3122.         void HandleDummy(SpellEffIndex /*effIndex*/)
  3123.         {
  3124.             Unit* caster = GetCaster();
  3125.  
  3126.             if (caster->GetPower(POWER_ENERGY) != 0)
  3127.                 caster->ModifyPower(POWER_ENERGY, -1);
  3128.  
  3129.             if (caster->GetPower(POWER_ENERGY) >= 99)
  3130.                 caster->CastSpell(caster, SPELL_OVERHEAT, true);
  3131.         }
  3132.  
  3133.         void Register()
  3134.         {
  3135.             OnEffect += SpellEffectFn(spell_gb_heat_drain_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
  3136.         }
  3137.     };
  3138.  
  3139.     SpellScript* GetSpellScript() const
  3140.     {
  3141.         return new spell_gb_heat_drain_SpellScript();
  3142.     }
  3143. };
  3144.  
  3145. /* spell 69488 Overheat Drain */
  3146. class spell_gb_overheat_drain : public SpellScriptLoader
  3147. {
  3148. public:
  3149.     spell_gb_overheat_drain() : SpellScriptLoader("spell_gb_overheat_drain") { }
  3150.  
  3151.     class spell_gb_overheat_drain_SpellScript : public SpellScript
  3152.     {
  3153.         PrepareSpellScript(spell_gb_overheat_drain_SpellScript);
  3154.  
  3155.         void HandleDummy(SpellEffIndex /*effIndex*/)
  3156.         {
  3157.             Unit* caster = GetCaster();
  3158.  
  3159.             if (caster->GetPower(POWER_ENERGY) >= 10)
  3160.                 caster->ModifyPower(POWER_ENERGY, -10);
  3161.         }
  3162.  
  3163.         void Register()
  3164.         {
  3165.             OnEffect += SpellEffectFn(spell_gb_overheat_drain_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
  3166.         }
  3167.     };
  3168.  
  3169.     SpellScript* GetSpellScript() const
  3170.     {
  3171.         return new spell_gb_overheat_drain_SpellScript();
  3172.     }
  3173. };
  3174.  
  3175. /* spell 69402 Incinerating Blast */
  3176. class spell_gb_incinerating_blast : public SpellScriptLoader
  3177. {
  3178. public:
  3179.     spell_gb_incinerating_blast() : SpellScriptLoader("spell_gb_incinerating_blast") { }
  3180.  
  3181.     class spell_gb_incinerating_blast_SpellScript : public SpellScript
  3182.     {
  3183.         PrepareSpellScript(spell_gb_incinerating_blast_SpellScript);
  3184.  
  3185.         void AddExtraDamage()
  3186.         {
  3187.             Unit* caster = GetCaster();
  3188.             if (!caster || !caster->GetPower(POWER_ENERGY))
  3189.                 return;
  3190.  
  3191.             SetHitDamage(int32(GetHitDamage() + (caster->GetPower(POWER_ENERGY) * 100.0f))); // TODO: How much should be?
  3192.             caster->SetPower(POWER_ENERGY, 0);
  3193.         }
  3194.  
  3195.         void Register()
  3196.         {
  3197.             OnHit += SpellHitFn(spell_gb_incinerating_blast_SpellScript::AddExtraDamage);
  3198.         }
  3199.     };
  3200.  
  3201.     SpellScript* GetSpellScript() const
  3202.     {
  3203.         return new spell_gb_incinerating_blast_SpellScript();
  3204.     }
  3205. };
  3206.  
  3207. /* spell 71335, 70339 Burning Pitch */
  3208. class spell_gb_burning_pitch : public SpellScriptLoader
  3209. {
  3210. public:
  3211.     spell_gb_burning_pitch() : SpellScriptLoader("spell_gb_burning_pitch") { }
  3212.  
  3213.     class spell_gb_burning_pitch_SpellScript : public SpellScript
  3214.     {
  3215.         PrepareSpellScript(spell_gb_burning_pitch_SpellScript);
  3216.  
  3217.         bool Validate(SpellEntry const* /*spellInfo*/)
  3218.         {
  3219.             if (!sSpellMgr->GetSpellEntry(SPELL_BURNING_PITCH_SIEGE_DMG_A))
  3220.                 return false;
  3221.             if (!sSpellMgr->GetSpellEntry(SPELL_BURNING_PITCH_SIEGE_DMG_H))
  3222.                 return false;
  3223.             if (!sSpellMgr->GetSpellEntry(SPELL_BURNING_PITCH_AOE_DAMAGE))
  3224.                 return false;
  3225.             return true;
  3226.         }
  3227.  
  3228.         void HandleDummy(SpellEffIndex /*effIndex*/)
  3229.         {
  3230.             Unit* caster = GetCaster();
  3231.             Unit* target = GetHitUnit();
  3232.  
  3233.             if (!caster || !target)
  3234.                 return;
  3235.  
  3236.             if (GetSpellEntry()->Id == SPELL_BURNING_PITCH_A)
  3237.                 caster->CastSpell(target, SPELL_BURNING_PITCH_SIEGE_DMG_A, true);
  3238.             else
  3239.                 caster->CastSpell(target, SPELL_BURNING_PITCH_SIEGE_DMG_H, true);
  3240.  
  3241.             caster->CastSpell(target, SPELL_BURNING_PITCH_AOE_DAMAGE, true);
  3242.         }
  3243.  
  3244.         void Register()
  3245.         {
  3246.             OnEffect += SpellEffectFn(spell_gb_burning_pitch_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
  3247.         }
  3248.     };
  3249.  
  3250.     SpellScript* GetSpellScript() const
  3251.     {
  3252.         return new spell_gb_burning_pitch_SpellScript();
  3253.     }
  3254. };
  3255.  
  3256. /* spell 68645 Rocket Pack */
  3257. class spell_rocket_pack : public SpellScriptLoader
  3258. {
  3259. public:
  3260.     spell_rocket_pack() : SpellScriptLoader("spell_rocket_pack") { }
  3261.  
  3262.     class spell_rocket_pack_AuraScript : public AuraScript
  3263.     {
  3264.         PrepareAuraScript(spell_rocket_pack_AuraScript);
  3265.  
  3266.         void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  3267.         {
  3268.             GetTarget()->CastSpell(GetTarget(), 68721, true);
  3269.         }
  3270.  
  3271.         void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  3272.         {
  3273.             GetTarget()->RemoveAurasDueToSpell(68721);
  3274.         }
  3275.  
  3276.         void Register()
  3277.         {
  3278.             OnEffectApply += AuraEffectApplyFn(spell_rocket_pack_AuraScript::OnApply, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
  3279.             OnEffectRemove += AuraEffectRemoveFn(spell_rocket_pack_AuraScript::OnRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
  3280.         }
  3281.     };
  3282.  
  3283.     AuraScript* GetAuraScript() const
  3284.     {
  3285.         return new spell_rocket_pack_AuraScript();
  3286.     }
  3287. };
  3288.  
  3289. void AddSC_boss_gunship_battle()
  3290. {
  3291.     new npc_muradin_gunship();
  3292.     new npc_saurfang_gunship();
  3293.     new npc_zafod_boombox();
  3294.     new npc_korkron_axethrower_rifleman();
  3295.     new npc_mortar_soldier_or_rocketeer();
  3296.     new npc_gunship_mage();
  3297.     new npc_gunship_cannon();
  3298.     new npc_sergeant();
  3299.     new npc_marine_or_reaver();
  3300.     new npc_gunship_trigger();
  3301.     new npc_gunship_portal();
  3302.     new npc_korkron_primalist();
  3303.     new npc_korkron_defender();
  3304.     new npc_skybreaker_vindicator();
  3305.     new npc_skybreaker_protector();
  3306.     new npc_icc_spire_frostwyrm();
  3307.     new at_icc_land_frostwyrm();
  3308.     new npc_gunship_skybreaker();
  3309.     new npc_gunship_orgrimmar();
  3310.     new transport_gunship();
  3311.     new spell_icc_remove_rocket_pack();
  3312.     new spell_gb_heat_drain();
  3313.     new spell_gb_overheat_drain();
  3314.     new spell_gb_incinerating_blast();
  3315.     new spell_gb_burning_pitch();
  3316.     new spell_rocket_pack();
  3317. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement