Advertisement
Guest User

Untitled

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