mferrill

ICC -GUNSHIP - Untested

Jul 4th, 2012
584
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.    //Scripts/ICC: Gunship Battle -Achieve Handle
  2.    UNTESTED PATCH//
  3.  
  4. DELETE FROM `creature_template` WHERE (`entry`=50004);
  5. +INSERT INTO `creature_template` (`entry`, `difficulty_entry_1`, `difficulty_entry_2`, `difficulty_entry_3`, `KillCredit1`, `KillCredit2`, `modelid1`, `modelid2`, `modelid3`, `modelid4`, `name`, `subname`, `IconName`, `gossip_menu_id`, `minlevel`, `maxlevel`, `exp`, `faction_A`, `faction_H`, `npcflag`, `speed_walk`, `speed_run`, `scale`, `rank`, `mindmg`, `maxdmg`, `dmgschool`, `attackpower`, `dmg_multiplier`, `baseattacktime`, `rangeattacktime`, `unit_class`, `unit_flags`, `dynamicflags`, `family`, `trainer_type`, `trainer_spell`, `trainer_class`, `trainer_race`, `minrangedmg`, `maxrangedmg`, `rangedattackpower`, `type`, `type_flags`, `lootid`, `pickpocketloot`, `skinloot`, `resistance1`, `resistance2`, `resistance3`, `resistance4`, `resistance5`, `resistance6`, `spell1`, `spell2`, `spell3`, `spell4`, `spell5`, `spell6`, `spell7`, `spell8`, `PetSpellDataId`, `VehicleId`, `mingold`, `maxgold`, `AIName`, `MovementType`, `InhabitType`, `Health_mod`, `Mana_mod`, `Armor_mod`, `RacialLeader`, `questItem1`, `questItem2`, `questItem3`, `questItem4`, `questItem5`, `questItem6`, `movementId`, `RegenHealth`, `equipment_id`, `mechanic_immune_mask`, `flags_extra`, `ScriptName`, `WDBVerified`) VALUES
  6. +(50004, 0, 0, 0, 0, 0, 11686, 0, 0, 0, 'High Overlord Saurfang', '', '', 0, 80, 80, 3, 1802, 1802, 0, 0, 0, 1, 1, 252, 357, 0, 304, '7.5', 2000, 0, 1, 33554432, 8, 0, 0, 0, 0, 0, 215, 320, 44, 7, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', 0, 3, 1000, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, '', 12340);
  7. +
  8. +DELETE FROM `creature_template` WHERE (`entry`=50006);
  9. +INSERT INTO `creature_template` (`entry`, `difficulty_entry_1`, `difficulty_entry_2`, `difficulty_entry_3`, `KillCredit1`, `KillCredit2`, `modelid1`, `modelid2`, `modelid3`, `modelid4`, `name`, `subname`, `IconName`, `gossip_menu_id`, `minlevel`, `maxlevel`, `exp`, `faction_A`, `faction_H`, `npcflag`, `speed_walk`, `speed_run`, `scale`, `rank`, `mindmg`, `maxdmg`, `dmgschool`, `attackpower`, `dmg_multiplier`, `baseattacktime`, `rangeattacktime`, `unit_class`, `unit_flags`, `dynamicflags`, `family`, `trainer_type`, `trainer_spell`, `trainer_class`, `trainer_race`, `minrangedmg`, `maxrangedmg`, `rangedattackpower`, `type`, `type_flags`, `lootid`, `pickpocketloot`, `skinloot`, `resistance1`, `resistance2`, `resistance3`, `resistance4`, `resistance5`, `resistance6`, `spell1`, `spell2`, `spell3`, `spell4`, `spell5`, `spell6`, `spell7`, `spell8`, `PetSpellDataId`, `VehicleId`, `mingold`, `maxgold`, `AIName`, `MovementType`, `InhabitType`, `Health_mod`, `Mana_mod`, `Armor_mod`, `RacialLeader`, `questItem1`, `questItem2`, `questItem3`, `questItem4`, `questItem5`, `questItem6`, `movementId`, `RegenHealth`, `equipment_id`, `mechanic_immune_mask`, `flags_extra`, `ScriptName`, `WDBVerified`) VALUES
  10. +(50006, 0, 0, 0, 0, 0, 11686, 0, 0, 0, 'Muradin Bronzebeard', '', '', 10875, 83, 83, 2, 1802, 1802, 1, 1, '1.14286', 1, 1, 468, 702, 0, 175, '47.2', 2000, 2000, 1, 33554432, 8, 0, 0, 0, 0, 0, 374, 562, 140, 7, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15284, 70309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', 0, 3, 175, 1, 1, 0, 0, 0, 0, 0, 0, 0, 164, 1, 0, 0, 0, '', 12340);
  11. +UPDATE `creature_template` SET `flags_extra` = 2 WHERE `entry` IN (50004, 50006);
  12. +
  13. +UPDATE `creature_template` SET `npcflag` = 1 WHERE `entry` IN (36939, 38156, 38637, 38638);
  14. +
  15. +UPDATE `creature_template` SET `faction_A` = 1801, `faction_H` = 1801, `baseattacktime` = 2000, `rangeattacktime` = 2000, `unit_flags` = 32832, `spell1` = 71339, `spell2` = 70161, `spell3` = 72539, `mechanic_immune_mask` = 73745 WHERE `entry` IN (36968, 38403, 38675, 38676);
  16. +UPDATE `creature_template` SET `faction_A` = 1802, `faction_H` = 1802, `baseattacktime` = 2000, `rangeattacktime` = 2000, `unit_flags` = 32832, `spell1` = 71335, `spell2` = 70162, `spell3` = 72566, `mechanic_immune_mask` = 73745 WHERE `entry` IN (36969, 38408, 38689, 38690);
  17. +
  18. +-- Spawn fix for TDB GUIDs
  19. +DELETE FROM `creature` WHERE `id`=37003;
  20. +INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES
  21. +(200988, 37003, 631, 15, 1, 0, 0, -562.385, 2217.58, 199.969, 3.46228, 86400, 0, 0, 398434, 41690, 0, 0, 0, 0);
  22. +DELETE FROM `creature` WHERE `id`=37026;
  23. +INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES
  24. +(201020, 37026, 631, 15, 1, 0, 0, -571.091, 2219.71, 199.969, 5.06842, 86400, 0, 0, 269600, 91600, 0, 0, 0, 0);
  25. +
  26. +UPDATE `creature_template` SET `ScriptName` = 'npc_muradin_gunship' WHERE `entry` = 36948;
  27. +UPDATE `creature_template` SET `ScriptName` = 'npc_saurfang_gunship' WHERE `entry` = 36939;
  28. +UPDATE `creature_template` SET `ScriptName` = 'npc_zafod_boombox' WHERE `entry` = 37184;
  29. +UPDATE `creature_template` SET `ScriptName` = 'npc_korkron_defender' WHERE `entry` = 37032;
  30. +UPDATE `creature_template` SET `ScriptName` = 'npc_korkron_primalist' WHERE `entry` = 37030;
  31. +UPDATE `creature_template` SET `ScriptName` = 'npc_skybreaker_vindicator' WHERE `entry` = 37003;
  32. +UPDATE `creature_template` SET `ScriptName` = 'npc_skybreaker_protector' WHERE `entry` = 36998;
  33. +UPDATE `creature_template` SET `ScriptName` = 'npc_icc_spire_frostwyrm' WHERE `entry` = 37230;
  34. +UPDATE `creature_template` SET `ScriptName` = 'npc_korkron_axethrower_rifleman' WHERE `entry` = 36968;
  35. +UPDATE `creature_template` SET `ScriptName` = 'npc_korkron_axethrower_rifleman' WHERE `entry` = 36969;
  36. +UPDATE `creature_template` SET `ScriptName` = 'npc_mortar_soldier_or_rocketeer', AIName = '' WHERE `entry` = 36982;
  37. +UPDATE `creature_template` SET `ScriptName` = 'npc_mortar_soldier_or_rocketeer', AIName = '' WHERE `entry` = 36978;
  38. +UPDATE `creature_template` SET `ScriptName` = 'npc_gunship_mage' WHERE `entry` = 37117;
  39. +UPDATE `creature_template` SET `ScriptName` = 'npc_gunship_mage' WHERE `entry` = 37116;
  40. +UPDATE `creature_template` SET `ScriptName` = 'npc_gunship_trigger' WHERE `entry` = 37547;
  41. +UPDATE `creature_template` SET `ScriptName` = 'npc_gunship_portal' WHERE `entry` = 37227;
  42. +UPDATE `creature_template` SET `ScriptName` = 'npc_marine_or_reaver' WHERE `entry` = 36957;
  43. +UPDATE `creature_template` SET `ScriptName` = 'npc_marine_or_reaver' WHERE `entry` = 36950;
  44. +UPDATE `creature_template` SET `ScriptName` = 'npc_sergeant' WHERE `entry` = 36960;
  45. +UPDATE `creature_template` SET `ScriptName` = 'npc_sergeant' WHERE `entry` = 36961;
  46. +UPDATE `creature_template` SET `ScriptName` = 'npc_gunship_skybreaker' WHERE `entry` = 37540;
  47. +UPDATE `creature_template` SET `ScriptName` = 'npc_gunship_orgrimmar' WHERE `entry` = 37215;
  48. +UPDATE `creature_template` SET `ScriptName` = 'npc_gunship_cannon' WHERE `entry` = 36838;
  49. +UPDATE `creature_template` SET `ScriptName` = 'npc_gunship_cannon' WHERE `entry` = 36839;
  50. +
  51. +UPDATE `gameobject_template` SET `ScriptName` = 'transport_gunship' WHERE `entry` IN (201580, 201812);
  52. +
  53. +
  54. +DELETE FROM `areatrigger_scripts` WHERE `entry` IN (5630, 5628);
  55. +INSERT INTO `areatrigger_scripts` (`entry`,`ScriptName`) VALUES
  56. +(5628,'at_icc_land_frostwyrm'),
  57. +(5630,'at_icc_land_frostwyrm');
  58. +
  59. +-- SpellScripts
  60. +DELETE FROM `spell_script_names` WHERE `spell_id` IN (70713, 68645, 69471, 69488, 69402, 70175, 71335, 71339);
  61. +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
  62. +('70713', 'spell_icc_remove_rocket_pack'),
  63. +('68645', 'spell_rocket_pack'),
  64. +('69471', 'spell_gb_heat_drain'),
  65. +('69488', 'spell_gb_overheat_drain'),
  66. +('69402', 'spell_gb_incinerating_blast'),
  67. +('70175', 'spell_gb_incinerating_blast'),
  68. +('71335', 'spell_gb_burning_pitch'),
  69. +('71339', 'spell_gb_burning_pitch');
  70. +
  71. +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (69400, 70173, 69402, 70175, 70374, 70383, 72959);
  72. +SET @ENTRYA := 37540;
  73. +SET @ENTRYH := 37215;
  74. +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceEntry`, `ConditionTypeOrReference`, `ConditionValue1`, `ConditionValue2`) VALUES
  75. +('13', '69400', '18', '1', @ENTRYA),
  76. +('13', '70173', '18', '1', @ENTRYH),
  77. +('13', '69402', '18', '1', @ENTRYA),
  78. +('13', '70175', '18', '1', @ENTRYH),
  79. +('13', '70374', '18', '1', @ENTRYA),
  80. +('13', '70383', '18', '1', @ENTRYH),
  81. +('13', '72959', '18', '1', 0);
  82. +
  83. +DELETE FROM transports WHERE entry IN (201580, 201581, 201811, 201812);
  84. +DELETE FROM creature WHERE id IN (37230, 36838, 36839, 36948, 36939);
  85. +DELETE FROM `creature_template_addon` WHERE (`entry`=37547);
  86. +UPDATE `creature_template` SET `flags_extra` = 130 WHERE `entry` = 37547;
  87. +
  88. +UPDATE `creature_template` SET `exp` = 2, `VehicleId` = 554, `RegenHealth` = 0, `npcflag` = 16777216, `spell1` = 69399, `spell2` = 69401 WHERE entry = 36839;
  89. +UPDATE `creature_template` SET `exp` = 2, `VehicleId` = 554, `RegenHealth` = 0, `npcflag` = 16777216, `spell1` = 70172, `spell2` = 70174 WHERE entry = 36838;
  90. +REPLACE INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `quest_start`, `cast_flags`) VALUES
  91. +('36838', '46598', '0', '1'),
  92. +('36839', '46598', '0', '1');
  93. +
  94. +DELETE FROM `creature_template_addon` WHERE `entry` IN (36838, 36839);
  95. +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
  96. +(36838, 0, 0, 0, 1, 0, 69470),
  97. +(36839, 0, 0, 0, 1, 0, 69470);
  98. +
  99. +UPDATE `creature_template` SET `difficulty_entry_1` = '38129',`difficulty_entry_2` = '38701', `difficulty_entry_3` = '38702' WHERE `entry` =37215;
  100. +UPDATE `creature_template` SET `faction_A` = 35, `faction_H` = 35, `minlevel` = 83, `maxlevel` = 83, `unit_flags` = 4, `flags_extra` = 2, `modelid1` = 1126, `modelid2` = 11686 WHERE `entry` IN (37215, 38129, 38701, 38702, 37540, 38128, 38699, 38700);
  101. +
  102. +-- Add spell conditions for 69705 (Below Zero)
  103. +SET @SPELL := 69705;
  104. +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=@SPELL;
  105. +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
  106. +(13,0,@SPELL,0,18,1,36838,0,0,'','Gunship Battle - Spell 69705 (Below Zero) target creature 36838'),
  107. +(13,0,@SPELL,0,18,1,36839,0,0,'','Gunship Battle - Spell 69705 (Below Zero) target creature 36839');
  108. +
  109. +
  110. +-- Linked spells
  111. +-- TODO Need more love
  112. +DELETE FROM `spell_linked_spell` WHERE `spell_trigger` = 71193 AND `spell_effect` = -71188;
  113. +DELETE FROM `spell_linked_spell` WHERE `spell_trigger` = 71195 AND `spell_effect` = -71193;
  114. +DELETE FROM `spell_linked_spell` WHERE `spell_trigger` = 68645 AND `spell_effect` = 69193;
  115. +DELETE FROM `spell_linked_spell` WHERE `spell_trigger` = 73077 AND `spell_effect` = 69188;
  116. +DELETE FROM `spell_linked_spell` WHERE `spell_trigger` = 73077 AND `spell_effect` = 68721;
  117. +DELETE FROM `spell_linked_spell` WHERE `spell_trigger` = 69193 AND `spell_effect` = 69192;
  118. +INSERT INTO `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES
  119. +(71193, -71188, 0, 'Gunship Battle - Veteran removes Experimented'),
  120. +(71195, -71193, 0, 'Gunship Battle - Elite removes Veteran'),
  121. +(73077, 69188, 2, 'Gunship Battle - Fix visual for Rocket Pack'),
  122. +(68645, 69193, 0, 'Gunship Battle - Fix visual for Rocket Pack'),
  123. +(69193, 69192, 0, 'Gunship Battle - Cast Rocket Burst when landing with Rocket Pack');
  124. +
  125. +-- Battle Standards Spells
  126. +UPDATE `creature_template` SET `unit_flags` = 33554564, `flags_extra` = 2 WHERE `entry` IN (37044, 37041);
  127. +UPDATE `creature_template` SET `faction_A` = 1801, `faction_H` = 1801 WHERE `entry` = 37044;
  128. +UPDATE `creature_template` SET `faction_A` = 1802, `faction_H` = 1802 WHERE `entry` = 37041;
  129. +DELETE FROM `creature_template_addon` WHERE `entry` IN (37044, 37041);
  130. +SET @KORKRON := 37044; -- Kor'kron Battle Standard
  131. +SET @SKYBREAKER := 37041; -- Skybreaker Battle Standard
  132. +SET @HSPELL := 69809;
  133. +SET @ASPELL := 69808;
  134. +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN (@KORKRON, @SKYBREAKER);
  135. +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid` IN (@KORKRON, @SKYBREAKER);
  136. +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
  137. +(@KORKRON ,0,0,0,25,0,100,1,0,0,0,0,11,@HSPELL,2,0,0,0,0,1,0,0,0,0,0,0,0, 'Kor''kron Battle Standard - On spawn & reset - Cast spell 69809'),
  138. +(@SKYBREAKER,0,0,0,25,0,100,1,0,0,0,0,11,@ASPELL,2,0,0,0,0,1,0,0,0,0,0,0,0, 'Skybreaker Battle Standard - On spawn & reset - Cast spell 69808');
  139. +
  140. +
  141. +REPLACE INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES
  142. +(50004, 1, 0, 'Reavers, Sergeants, attack!.', 14, 0, 0, 0, 0, 17081, ''),
  143. +(50004, 0, 0, 'This is not your battle, dwarf. Back down or we will be forced to destroy your ship.', 14, 0, 0, 0, 0, 17093, ''),
  144. +(50006, 1, 0, 'Marines! Sergeants! Attack!', 14, 0, 0, 0, 0, 16956, ''),
  145. +(50006, 0, 0, 'Move yer jalopy or well blow it out of the sky, orc! The Hordes got no business here!', 14, 0, 0, 0, 0, 16969, '');
  146. +
  147. +-- Texts
  148. +SET @MURADIN := 36948;
  149. +SET @OVERLORD := 36939;
  150. +SET @PRIMALIST := 37030;
  151. +SET @INVOKER := 37033;
  152. +SET @DEFENDER := 37032;
  153. +SET @VINDICATOR := 37003;
  154. +SET @SORCERER := 37026;
  155. +SET @PROTECTOR := 36998;
  156. +SET @FROSTWYRM := 37230;
  157. +SET @SOUNDID :=0;
  158. +DELETE FROM `creature_text` WHERE `entry` IN (36948, 36939, 37030, 37033, 37032, 37003, 37026, 36998, 37230);
  159. +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
  160. +(@MURADIN,  0, 0, 'Fire up the engines! We got a meetin'' with destiny, lads!', 14, 0, 100, 0, 0, 16962, 'Muradin Bronzebeard - SAY_INTRO_ALLIANCE_0'),
  161. +(@MURADIN,  1, 0, 'Hold on to yer hats!', 14, 0, 100, 0, 0, 16963, 'Muradin Bronzebeard - SAY_INTRO_ALLIANCE_1'),
  162. +(@MURADIN,  2, 0, 'What in the world is that? Grab me spyglass, crewman!', 14, 0, 100, 0, 0, 16964, 'Muradin Bronzebeard - SAY_INTRO_ALLIANCE_2'),
  163. +(@MURADIN,  3, 0, 'By me own beard! HORDE SAILIN'' IN FAST ''N HOT!', 14, 0, 100, 0, 0, 16965, 'Muradin Bronzebeard - SAY_INTRO_ALLIANCE_3'),
  164. +(@MURADIN,  4, 0, 'EVASIVE ACTION! MAN THE GUNS!', 14, 0, 100, 0, 0, 16966, 'Muradin Bronzebeard - SAY_INTRO_ALLIANCE_4'),
  165. +(@MURADIN,  5, 0, 'Cowardly dogs! Ye blindsided us!', 14, 0, 100, 0, 0, 16967, 'Muradin Bronzebeard - SAY_INTRO_ALLIANCE_5'),
  166. +(@MURADIN,  6, 0, '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!', 14, 0, 100, 0, 0, 16968, 'Muradin Bronzebeard - SAY_INTRO_ALLIANCE_7'),
  167. +(@MURADIN,  7, 0, 'Move yer jalopy or we''ll blow it out of the sky, orc! The Horde''s got no business here!', 14, 0, 100, 0, 0, 16969, 'Muradin Bronzebeard - SAY_INTRO_HORDE_3'),
  168. +(@MURADIN,  8, 0, 'What''s this then?! Ye won''t be takin'' this son o'' Ironforge''s vessel without a fight!.', 14, 0, 100, 0, 0, 16958, 'Muradin Bronzebeard - SAY_BOARDING_SKYBREAKER_1'),
  169. +(@MURADIN,  9, 0, 'Marines, Sergeants, attack!', 14, 0, 100, 0, 0, 16956, 'Muradin Bronzebeard - SAY_BOARDING_ORGRIMS_HAMMER_0'),
  170. +(@MURADIN, 10, 0, 'Riflemen, shoot faster!', 14, 0, 100, 0, 0, 16954, 'Muradin Bronzebeard - SAY_NEW_RIFLEMEN_SPAWNED'),
  171. +(@MURADIN, 11, 0, 'Mortar team, reload!', 14, 0, 100, 0, 0, 16955, 'Muradin Bronzebeard - SAY_NEW_MORTAR_TEAM_SPAWNED'),
  172. +(@MURADIN, 12, 0, 'We''re taking hull damage, get a sorcerer out here to shut down those cannons!', 14, 0, 100, 0, 0, 16957, 'Muradin Bronzebeard - SAY_NEW_MAGE_SPAWNED'),
  173. +(@MURADIN, 13, 0, 'Don''t say I didn''t warn ya, scoundrels! Onward, brothers and sisters!', 14, 0, 100, 0, 0, 16959, 'Muradin Bronzebeard - SAY_ALLIANCE_VICTORY'),
  174. +(@MURADIN, 14, 0, 'Captain Bartlett, get us out of here! We''re taken too much damage to stay afloat!', 14, 0, 100, 0, 0, 16960, 'Muradin Bronzebeard - SAY_ALLIANCE_DEFEAT'),
  175. +(@OVERLORD, 0, 0, 'Rise up, sons and daughters of the Horde! Today we battle a hated enemy of the Horde! LOK''TAR OGAR!', 14, 0, 100, 0, 0, 17087, 'High Overlord Saurfang - SAY_INTRO_HORDE_0'),
  176. +(@OVERLORD, 1, 0, 'Kor''kron, take us out!', 14, 0, 100, 0, 0, 17088, 'High Overlord Saurfang - SAY_INTRO_HORDE_1_1'),
  177. +(@OVERLORD, 2, 0, 'What is that?! Something approaching in the distance!', 14, 0, 100, 0, 0, 17089, 'High Overlord Saurfang - SAY_INTRO_HORDE_1'),
  178. +(@OVERLORD, 3, 0, 'ALLIANCE GUNSHIP! ALL HANDS ON DECK!', 14, 0, 100, 0, 0, 17090, 'High Overlord Saurfang - SAY_INTRO_HORDE_2'),
  179. +(@OVERLORD, 4, 0, 'You will know our business soon! KOR''KRON, ANNIHILATE THEM!', 14, 0, 100, 0, 0, 17092, 'High Overlord Saurfang - SAY_INTRO_HORDE_4'),
  180. +(@OVERLORD, 5, 0, 'Reavers, Sergeants, attack!', 14, 0, 100, 0, 0, 17081, 'High Overlord Saurfang - SAY_BOARDING_SKYBREAKER_0'),
  181. +(@OVERLORD, 6, 0, 'You DARE board my ship? Your death will come swiftly.', 14, 0, 100, 0, 0, 17083, 'High Overlord Saurfang - SAY_BOARDING_ORGRIMS_HAMMER_1'),
  182. +(@OVERLORD, 7, 0, 'Axethrowers, hurl faster!', 14, 0, 100, 0, 0, 17079, 'High Overlord Saurfang - SAY_NEW_AXETHROWER_SPAWNED'),
  183. +(@OVERLORD, 8, 0, 'Rocketeers, reload!', 14, 0, 100, 0, 0, 17080, 'High Overlord Saurfang - SAY_NEW_ROCKETEERS_SPAWNED'),
  184. +(@OVERLORD, 9, 0, 'We''re taking hull damage, get a battle-mage out here to shut down those cannons!', 14, 0, 100, 0, 0, 17082, 'High Overlord Saurfang - SAY_NEW_BATTLE_MAGE_SPAWNED'),
  185. +(@OVERLORD, 10, 0, 'The Alliance falter. Onward to the Lich King!', 14, 0, 100, 0, 0, 17084, 'High Overlord Saurfang - SAY_HORDE_VICTORY'),
  186. +(@OVERLORD, 11, 0, 'Damage control! Put those fires out! You haven''t seen the last of the Horde!', 14, 0, 100, 0, 0, 17085, 'High Overlord Saurfang - SAY_HORDE_DEFEAT'),
  187. +(@OVERLORD, 12, 0, 'This is not your battle, dwarf. Back down or we will be forced to destroy your ship.', 14, 0, 100, 0, 0, 17093, 'High Overlord Saurfang - SAY_INTRO_ALLIANCE_6'),
  188. +(@PRIMALIST,0, 0, 'Thank the spirits for you, brothers and sisters. The Skybreaker has already left. Quickly now, to Orgrim''s Hammer! If you leave soon, you may be able to catch them.', 12, 0, 100, 0, 0, @SOUNDID, 'Kor''kron Primalist - SAY_FIRST_SQUAD_RESCUED_HORDE_0'),
  189. +(@INVOKER,  0, 0, 'This should be helpin''ya!', 12, 0, 100, 0, 0, @SOUNDID, 'Kor''kron Invoker - SAY_FIRST_SQUAD_RESCUED_HORDE_1'),
  190. +(@INVOKER,  1, 0, '%s summons a Kor''kron Battle Standard.', 16, 0, 100, 0, 0, @SOUNDID, 'Kor''kron Invoker - SAY_SUMMON_BATTLE_STANDARD'),
  191. +(@DEFENDER, 0, 0, 'Aka''Magosh, brave warriors. The alliance is in great number here.', 12, 0, 100, 0, 0, @SOUNDID, 'Kor''kron Defender - SAY_SECOND_SQUAD_RESCUED_HORDE_0'),
  192. +(@DEFENDER, 1, 0, 'Captain Saurfang will be pleased to see you aboard Orgrim''s Hammer. Make haste, we will secure the area until you are ready for take-off.', 12, 0, 100, 0, 0, @SOUNDID, 'Kor''kron Defender - SAY_SECOND_SQUAD_RESCUED_HORDE_1'),
  193. +(@DEFENDER, 2, 0, 'A screeching cry pierces the air above!',41, 0, 100, 0, 0, @SOUNDID, 'Frostwyrm - SAY_FROSTWYRM_SUMMON_0'),
  194. +(@VINDICATOR, 0, 0, 'Thank goodness you arrived when you did, heroes. Orgrim''s Hammer has already left. Quickly now, to The Skybreaker! If you leave soon, you may be able to catch them.', 12, 0, 100, 0, 0, @SOUNDID, 'Skybreaker Vindicator - SAY_FIRST_SQUAD_RESCUED_ALLIANCE_0'),
  195. +(@SORCERER, 0, 0, 'This ought to help!', 12, 0, 100, 0, 0, @SOUNDID, 'Skybreaker Sorcerer - SAY_FIRST_SQUAD_RESCUED_ALLIANCE_1'),
  196. +(@SORCERER, 1, 0, '%s summons a Skybreaker Battle Standard.', 16, 0, 100, 0, 0, @SOUNDID, 'Skybreaker Sorcerer - SAY_SUMMON_BATTLE_STANDARD'),
  197. +(@PROTECTOR,0, 0, 'You have my thanks. We were outnumbered until you arrived.', 12, 0, 100, 0, 0, @SOUNDID, 'Skybreaker Protector - SAY_SECOND_SQUAD_RESCUED_ALLIANCE_0'),
  198. +(@PROTECTOR,1, 0, 'Captain Muradin is waiting aboard The Skybreaker. We''ll secure the area until you are ready for take off.', 12, 0, 100, 0, 0, @SOUNDID, 'Skybreaker Protector - SAY_SECOND_SQUAD_RESCUED_ALLIANCE_1'),
  199. +(@PROTECTOR,2, 0, 'Skybreaker infantry, hold position!', 12, 0, 100, 0, 0, @SOUNDID, 'Skybreaker Protector - SAY_SECOND_SQUAD_RESCUED_ALLIANCE_2'),
  200. +(@PROTECTOR,3, 0, 'A screeching cry pierces the air above!',41, 0, 100, 0, 0, @SOUNDID, 'Frostwyrm - SAY_FROSTWYRM_SUMMON_0'),
  201. +(@FROSTWYRM,0, 0, 'A Spire Frostwyrm lands just before Orgrim''s Hammer.', 16, 0, 100, 0, 0, @SOUNDID, 'Frostwyrm - SAY_FROSTWYRM_LAND_H_1'),
  202. +(@FROSTWYRM,1, 0, 'A Spire Frostwyrm lands just before The Skybreaker. ', 16, 0, 100, 0, 0, @SOUNDID, 'Frostwyrm - SAY_FROSTWYRM_LAND_A_2');
  203. +
  204. +-- Chests loot
  205. +DELETE FROM `gameobject_loot_template` WHERE (`entry`=201872);
  206. +INSERT INTO `gameobject_loot_template` VALUES
  207. +(201872, 49426, 100, 1, 0, 2, 2),
  208. +(201872, 50340, 0, 1, 1, 1, 1),
  209. +(201872, 50787, 0, 1, 1, 1, 1),
  210. +(201872, 50788, 0, 1, 1, 1, 1),
  211. +(201872, 50789, 0, 1, 2, 1, 1),
  212. +(201872, 50790, 0, 1, 2, 1, 1),
  213. +(201872, 50791, 0, 1, 1, 1, 1),
  214. +(201872, 50792, 0, 1, 2, 1, 1),
  215. +(201872, 50793, 0, 1, 1, 1, 1),
  216. +(201872, 50794, 0, 1, 1, 1, 1),
  217. +(201872, 50795, 0, 1, 2, 1, 1),
  218. +(201872, 50796, 0, 1, 2, 1, 1),
  219. +(201872, 50797, 0, 1, 2, 1, 1);
  220. +
  221. +DELETE FROM `gameobject_loot_template` WHERE (`entry`=201873);
  222. +INSERT INTO `gameobject_loot_template` VALUES
  223. +(201873, 49426, 100, 1, 0, 2, 2),
  224. +(201873, 49908, 10, 1, 0, 1, 1),
  225. +(201873, 49998, 0, 1, 1, 1, 1),
  226. +(201873, 49999, 0, 1, 2, 1, 1),
  227. +(201873, 50000, 0, 1, 2, 1, 1),
  228. +(201873, 50001, 0, 1, 3, 1, 1),
  229. +(201873, 50002, 0, 1, 2, 1, 1),
  230. +(201873, 50003, 0, 1, 3, 1, 1),
  231. +(201873, 50005, 0, 1, 1, 1, 1),
  232. +(201873, 50006, 0, 1, 3, 1, 1),
  233. +(201873, 50008, 0, 1, 1, 1, 1),
  234. +(201873, 50009, 0, 1, 3, 1, 1),
  235. +(201873, 50010, 0, 1, 2, 1, 1),
  236. +(201873, 50011, 0, 1, 1, 1, 1),
  237. +(201873, 50274, 37.5, 1, 0, 1, 1),
  238. +(201873, 50352, 0, 1, 1, 1, 1),
  239. +(201873, 50359, 0, 1, 2, 1, 1),
  240. +(201873, 50411, 0, 1, 3, 1, 1);
  241. +
  242. +DELETE FROM `gameobject_loot_template` WHERE (`entry`=201874);
  243. +INSERT INTO `gameobject_loot_template` VALUES
  244. +(201874, 49426, 100, 1, 0, 2, 2),
  245. +(201874, 49908, 10, 1, 0, 1, 1),
  246. +(201874, 50345, 0, 1, 2, 1, 1),
  247. +(201874, 51906, 0, 1, 1, 1, 1),
  248. +(201874, 51907, 0, 1, 1, 1, 1),
  249. +(201874, 51908, 0, 1, 1, 1, 1),
  250. +(201874, 51909, 0, 1, 2, 1, 1),
  251. +(201874, 51910, 0, 1, 2, 1, 1),
  252. +(201874, 51911, 0, 1, 2, 1, 1),
  253. +(201874, 51912, 0, 1, 2, 1, 1),
  254. +(201874, 51913, 0, 1, 1, 1, 1),
  255. +(201874, 51914, 0, 1, 2, 1, 1),
  256. +(201874, 51915, 0, 1, 1, 1, 1),
  257. +(201874, 51916, 0, 1, 1, 1, 1);
  258. +
  259. +DELETE FROM `gameobject_loot_template` WHERE (`entry`=201875);
  260. +INSERT INTO `gameobject_loot_template` VALUES
  261. +(201875, 49426, 100, 1, 0, 2, 2),
  262. +(201875, 49908, 10, 1, 0, 1, 1),
  263. +(201875, 50274, 75, 1, 0, 1, 1),
  264. +(201875, 50349, 0, 1, 2, 1, 1),
  265. +(201875, 50366, 0, 1, 1, 1, 1),
  266. +(201875, 50653, 0, 1, 3, 1, 1),
  267. +(201875, 50654, 0, 1, 3, 1, 1),
  268. +(201875, 50655, 0, 1, 3, 1, 1),
  269. +(201875, 50656, 0, 1, 2, 1, 1),
  270. +(201875, 50657, 0, 1, 3, 1, 1),
  271. +(201875, 50658, 0, 1, 1, 1, 1),
  272. +(201875, 50659, 0, 1, 2, 1, 1),
  273. +(201875, 50660, 0, 1, 1, 1, 1),
  274. +(201875, 50661, 0, 1, 1, 1, 1),
  275. +(201875, 50663, 0, 1, 2, 1, 1),
  276. +(201875, 50664, 0, 1, 2, 1, 1),
  277. +(201875, 50665, 0, 1, 1, 1, 1),
  278. +(201875, 50667, 0, 1, 3, 1, 1);
  279. +
  280. +UPDATE `gameobject_template` SET `data1` = 201872 WHERE `entry` = 201872;
  281. +UPDATE `gameobject_template` SET `data1` = 201873 WHERE `entry` = 201873;
  282. +UPDATE `gameobject_template` SET `data1` = 201874 WHERE `entry` = 201874;
  283. +UPDATE `gameobject_template` SET `data1` = 201875 WHERE `entry` = 201875;
  284. +UPDATE `gameobject_template` SET `data1` = 201872 WHERE `entry` = 202177;
  285. +UPDATE `gameobject_template` SET `data1` = 201873 WHERE `entry` = 202178;
  286. +UPDATE `gameobject_template` SET `data1` = 201874 WHERE `entry` = 202179;
  287. +UPDATE `gameobject_template` SET `data1` = 201875 WHERE `entry` = 202180;
  288. +
  289. +UPDATE item_template SET ScriptName = 'item_icc_rocket_pack' WHERE entry = 49278;
  290. \ No newline at end of file
  291. diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp
  292. index f3b2d51..142f81b 100644
  293. --- a/src/server/game/Entities/Transport/Transport.cpp
  294. +++ b/src/server/game/Entities/Transport/Transport.cpp
  295. @@ -25,6 +25,7 @@
  296. #include "WorldPacket.h"
  297. #include "DBCStores.h"
  298. #include "World.h"
  299. +#include "Vehicle.h"
  300. #include "GameObjectAI.h"
  301.  
  302. void MapManager::LoadTransports()
  303. @@ -125,6 +126,81 @@ void MapManager::LoadTransports()
  304.     sLog->outString();
  305. }
  306.  
  307. +Transport* MapManager::LoadTransportInMap(Map* instance, uint32 goEntry, uint32 period)
  308. +{
  309. +    const GameObjectTemplate* goInfo = sObjectMgr->GetGameObjectTemplate(goEntry);
  310. +
  311. +    if (!goInfo)
  312. +    {
  313. +        sLog->outErrorDb("Transport ID:%u, will not be loaded, gameobject_template missing", goEntry);
  314. +        return NULL;
  315. +    }
  316. +
  317. +    if (goInfo->type != GAMEOBJECT_TYPE_MO_TRANSPORT)
  318. +    {
  319. +        sLog->outErrorDb("Transport ID:%u, Name: %s, will not be loaded, gameobject_template type wrong", goEntry, goInfo->name.c_str());
  320. +        return NULL;
  321. +    }
  322. +
  323. +    Transport* t = new Transport(period, goInfo->ScriptId);
  324. +    std::set<uint32> mapsUsed;
  325. +    if (!t->GenerateWaypoints(goInfo->moTransport.taxiPathId, mapsUsed))
  326. +    {
  327. +        sLog->outErrorDb("Transport (path id %u) path size = 0. Transport ignored, check DBC files or the gameobject's data0 field.", goInfo->moTransport.taxiPathId);
  328. +        delete t;
  329. +        return NULL;
  330. +    }
  331. +    uint32 transportLowGuid = sObjectMgr->GenerateLowGuid(HIGHGUID_MO_TRANSPORT);
  332. +
  333. +    if (!t->Create(transportLowGuid, goEntry, t->m_WayPoints[0].mapid, t->m_WayPoints[0].x, t->m_WayPoints[0].y, t->m_WayPoints[0].z-10, 0.0f, 0, 0))
  334. +    {
  335. +        delete t;
  336. +        return NULL;
  337. +    }
  338. +
  339. +    m_Transports.insert(t);
  340. +    m_TransportsByInstanceIdMap[instance->GetInstanceId()].insert(t);
  341. +    t->SetMap(instance);
  342. +    t->AddToWorld();
  343. +    t->BuildStartMovePacket(instance);
  344. +    t->BuildStopMovePacket(instance);
  345. +    // Make transport realy stoppped at server-side. Movement will be handled by scripts
  346. +    t->m_WayPoints.clear();
  347. +
  348. +    return t;
  349. +}
  350. +
  351. +void MapManager::UnLoadTransportFromMap(Transport* t)
  352. +{
  353. +    Map* map = t->GetMap();
  354. +
  355. +    for (Transport::CreatureSet::iterator itr = t->m_NPCPassengerSet.begin(); itr != t->m_NPCPassengerSet.end();)
  356. +    {
  357. +        if (Creature* npc = *itr)
  358. +        {
  359. +            npc->SetTransport(NULL);
  360. +            npc->setActive(false);
  361. +            npc->RemoveFromWorld();
  362. +        }
  363. +        ++itr;
  364. +    }
  365. +
  366. +    UpdateData transData;
  367. +    t->BuildOutOfRangeUpdateBlock(&transData);
  368. +    WorldPacket out_packet;
  369. +    transData.BuildPacket(&out_packet);
  370. +
  371. +    for (Map::PlayerList::const_iterator itr = map->GetPlayers().begin(); itr != map->GetPlayers().end(); ++itr)
  372. +        if (t != itr->getSource()->GetTransport())
  373. +            itr->getSource()->SendDirectMessage(&out_packet);
  374. +
  375. +    t->m_NPCPassengerSet.clear();     
  376. +    m_TransportsByInstanceIdMap[t->GetInstanceId()].erase(t);
  377. +    m_Transports.erase(t);
  378. +    t->m_WayPoints.clear();
  379. +    t->RemoveFromWorld();
  380. +}
  381. +
  382. void MapManager::LoadTransportNPCs()
  383. {
  384.     uint32 oldMSTime = getMSTime();
  385. @@ -180,8 +256,11 @@ Transport::~Transport()
  386. {
  387.     for (CreatureSet::iterator itr = m_NPCPassengerSet.begin(); itr != m_NPCPassengerSet.end(); ++itr)
  388.     {
  389. -        (*itr)->SetTransport(NULL);
  390. -        GetMap()->AddObjectToRemoveList(*itr);
  391. +        Creature* passenger = *itr;
  392. +       Map* map = passenger->GetMap();
  393. +       passenger->SetTransport(NULL);
  394. +       passenger->CleanupsBeforeDelete();
  395. +       map->RemoveFromMap(passenger, true);
  396.     }
  397.  
  398.     m_NPCPassengerSet.clear();
  399. @@ -529,6 +608,8 @@ bool Transport::RemovePassenger(Player* passenger)
  400.  
  401. void Transport::Update(uint32 p_diff)
  402. {
  403. +    UpdateNPCPositions();
  404. +    
  405.     if (!AI())
  406.     {
  407.         if (!AIM_Initialize())
  408. @@ -557,7 +638,6 @@ void Transport::Update(uint32 p_diff)
  409.         else
  410.         {
  411.             Relocate(m_curr->second.x, m_curr->second.y, m_curr->second.z, GetAngle(m_next->second.x, m_next->second.y) + float(M_PI));
  412. -            UpdateNPCPositions(); // COME BACK MARKER
  413.         }
  414.  
  415.         sScriptMgr->OnRelocate(this, m_curr->first, m_curr->second.mapid, m_curr->second.x, m_curr->second.y, m_curr->second.z);
  416. @@ -569,7 +649,6 @@ void Transport::Update(uint32 p_diff)
  417.  
  418.         sLog->outDebug(LOG_FILTER_TRANSPORTS, "%s moved to %d %f %f %f %d", m_name.c_str(), m_curr->second.id, m_curr->second.x, m_curr->second.y, m_curr->second.z, m_curr->second.mapid);
  419.     }
  420. -
  421.     sScriptMgr->OnTransportUpdate(this, p_diff);
  422. }
  423.  
  424. @@ -630,56 +709,87 @@ void Transport::BuildStopMovePacket(Map const* targetMap)
  425.     UpdateForMap(targetMap);
  426. }
  427.  
  428. -uint32 Transport::AddNPCPassenger(uint32 tguid, uint32 entry, float x, float y, float z, float o, uint32 anim)
  429. -{
  430. -    Map* map = GetMap();
  431. -    //make it world object so it will not be unloaded with grid
  432. -    Creature* creature = new Creature(true);
  433. -
  434. -    if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, GetPhaseMask(), entry, 0, GetGOInfo()->faction, 0, 0, 0, 0))
  435. -    {
  436. -        delete creature;
  437. -        return 0;
  438. + Creature* Transport::AddNPCPassenger(uint32 tguid, uint32 entry, float x, float y, float z, float o, uint32 anim)
  439. + {
  440. +        Map* map = GetMap();
  441. +        Creature* pCreature = new Creature;
  442. +
  443. +        if (!pCreature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, GetPhaseMask(), entry, 0, GetGOInfo()->faction, 0, 0, 0, 0))
  444. +        {
  445. +            delete pCreature;
  446. +            return 0;
  447.     }
  448. +
  449. +        pCreature->SetTransport(this);
  450. +        pCreature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
  451. +        pCreature->m_movementInfo.guid = GetGUID();
  452. +        pCreature->m_movementInfo.t_pos.Relocate(x, y, z, o);
  453. +        o += GetOrientation();
  454. +        MapManager::NormalizeOrientation(o);
  455. +
  456. +        pCreature->Relocate(
  457. +                 GetPositionX() + (x * cos(GetOrientation()) + y * sin(GetOrientation() + float(M_PI))),
  458. +                 GetPositionY() + (y * cos(GetOrientation()) + x * sin(GetOrientation())),
  459. +                 z + GetPositionZ(),
  460. +                o);
  461. +
  462. +        pCreature->SetHomePosition(pCreature->GetPositionX(), pCreature->GetPositionY(), pCreature->GetPositionZ(), pCreature->GetOrientation());
  463. +
  464. +        if (!pCreature->IsPositionValid())
  465. +         {
  466. +                sLog->outError("Creature (guidlow %d, entry %d) not created. Suggested coordinates isn't valid (X: %f Y: %f)", pCreature->GetGUIDLow(), pCreature->GetEntry(), pCreature->GetPositionX(), pCreature->GetPositionY());
  467. +                delete pCreature;
  468. +                 return 0;
  469. +         }
  470. +
  471. +
  472. +        map->AddToMap(pCreature);
  473. +        m_NPCPassengerSet.insert(pCreature);
  474. +
  475. +        pCreature->setActive(true);
  476. +        sScriptMgr->OnAddCreaturePassenger(this, pCreature);
  477. +        return pCreature;
  478. + }
  479. +      
  480. + Creature* Transport::AddNPCPassengerInInstance(uint32 entry, float x, float y, float z, float o, uint32 anim)
  481. + {
  482. +        Map* map = GetMap();
  483. +        Creature* pCreature = new Creature;
  484. +
  485. +        if (!pCreature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, GetPhaseMask(), entry, 0, GetGOInfo()->faction, 0, 0, 0, 0))
  486. +        {
  487. +                delete pCreature;
  488. +                return NULL;
  489. +        }
  490.  
  491. -    creature->SetTransport(this);
  492. -    creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
  493. -    creature->m_movementInfo.guid = GetGUID();
  494. -    creature->m_movementInfo.t_pos.Relocate(x, y, z, o);
  495. -
  496. -    if (anim)
  497. -        creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, anim);
  498. -
  499. -    creature->Relocate(
  500. -        GetPositionX() + (x * cos(GetOrientation()) + y * sin(GetOrientation() + float(M_PI))),
  501. -        GetPositionY() + (y * cos(GetOrientation()) + x * sin(GetOrientation())),
  502. -        z + GetPositionZ(),
  503. -        o + GetOrientation());
  504. +        pCreature->SetTransport(this);
  505. +        pCreature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
  506. +        pCreature->m_movementInfo.guid = GetGUID();
  507. +        pCreature->m_movementInfo.t_pos.Relocate(x, y, z, o);
  508. +        o += GetOrientation();
  509. +        MapManager::NormalizeOrientation(o);
  510.  
  511. -    creature->SetHomePosition(creature->GetPositionX(), creature->GetPositionY(), creature->GetPositionZ(), creature->GetOrientation());
  512. +        pCreature->Relocate(
  513. +                GetPositionX() + (x * cos(GetOrientation()) + y * sin(GetOrientation() + float(M_PI))),
  514. +                GetPositionY() + (y * cos(GetOrientation()) + x * sin(GetOrientation())),
  515. +                z + GetPositionZ() ,
  516. +                o);
  517.  
  518. -    if (!creature->IsPositionValid())
  519. -    {
  520. -        sLog->outError("Creature (guidlow %d, entry %d) not created. Suggested coordinates isn't valid (X: %f Y: %f)", creature->GetGUIDLow(), creature->GetEntry(), creature->GetPositionX(), creature->GetPositionY());
  521. -        delete creature;
  522. -        return 0;
  523. -    }
  524. +        pCreature->SetHomePosition(pCreature->GetPositionX(), pCreature->GetPositionY(), pCreature->GetPositionZ(), pCreature->GetOrientation());
  525.  
  526. -    map->AddToMap(creature);
  527. -    m_NPCPassengerSet.insert(creature);
  528. +        if (!pCreature->IsPositionValid())
  529. +        {
  530. +                sLog->outError("Creature (guidlow %d, entry %d) not created. Suggested coordinates isn't valid (X: %f Y: %f)", pCreature->GetGUIDLow(), pCreature->GetEntry(), pCreature->GetPositionX(), pCreature->GetPositionY());
  531. +                delete pCreature;
  532. +                return NULL;
  533. +        }
  534.  
  535. -    if (tguid == 0)
  536. -    {
  537. -        ++currenttguid;
  538. -        tguid = currenttguid;
  539. -    }
  540. -    else
  541. -        currenttguid = std::max(tguid, currenttguid);
  542. +        map->AddToMap(pCreature);
  543. +        m_NPCPassengerSet.insert(pCreature);
  544.  
  545. -    creature->setActive(true);
  546. -    creature->SetGUIDTransport(tguid);
  547. -    sScriptMgr->OnAddCreaturePassenger(this, creature);
  548. -    return tguid;
  549. +        pCreature->setActive(true);
  550. +        sScriptMgr->OnAddCreaturePassenger(this, pCreature);
  551. +        return pCreature;
  552. }
  553.  
  554. void Transport::UpdatePosition(MovementInfo* mi)
  555. @@ -701,10 +811,28 @@ void Transport::UpdateNPCPositions()
  556.  
  557.         float x, y, z, o;
  558.         o = GetOrientation() + npc->m_movementInfo.t_pos.m_orientation;
  559. +        MapManager::NormalizeOrientation(o);
  560.         x = GetPositionX() + (npc->m_movementInfo.t_pos.m_positionX * cos(GetOrientation()) + npc->m_movementInfo.t_pos.m_positionY * sin(GetOrientation() + M_PI));
  561.         y = GetPositionY() + (npc->m_movementInfo.t_pos.m_positionY * cos(GetOrientation()) + npc->m_movementInfo.t_pos.m_positionX * sin(GetOrientation()));
  562.         z = GetPositionZ() + npc->m_movementInfo.t_pos.m_positionZ;
  563.         npc->SetHomePosition(x, y, z, o);
  564.         GetMap()->CreatureRelocation(npc, x, y, z, o, false);
  565.     }
  566. -}
  567. +    
  568. +    for (PlayerSet::iterator itr = m_passengers.begin(); itr != m_passengers.end(); ++itr)
  569. +    {
  570. +        Player* plr = *itr;
  571. +
  572. +        float x, y, z, o;
  573. +        o = GetOrientation() + plr->m_movementInfo.t_pos.m_orientation;
  574. +        MapManager::NormalizeOrientation(o);
  575. +        x = GetPositionX() + (plr->m_movementInfo.t_pos.m_positionX * cos(GetOrientation()) + plr->m_movementInfo.t_pos.m_positionY * sin(GetOrientation() + M_PI));
  576. +        y = GetPositionY() + (plr->m_movementInfo.t_pos.m_positionY * cos(GetOrientation()) + plr->m_movementInfo.t_pos.m_positionX * sin(GetOrientation()));
  577. +        z = GetPositionZ() + plr->m_movementInfo.t_pos.m_positionZ;
  578. +        plr->Relocate(x, y, z, o);
  579. +        UpdateData transData;
  580. +        WorldPacket packet;
  581. +        transData.BuildPacket(&packet);
  582. +        plr->SendDirectMessage(&packet);
  583. +    }
  584. +}
  585. \ No newline at end of file
  586. diff --git a/src/server/game/Entities/Transport/Transport.h b/src/server/game/Entities/Transport/Transport.h
  587. index 518dcf6..381c99a 100755
  588. --- a/src/server/game/Entities/Transport/Transport.h
  589. +++ b/src/server/game/Entities/Transport/Transport.h
  590. @@ -44,7 +44,8 @@ class Transport : public GameObject
  591.  
  592.         typedef std::set<Creature*> CreatureSet;
  593.         CreatureSet m_NPCPassengerSet;
  594. -        uint32 AddNPCPassenger(uint32 tguid, uint32 entry, float x, float y, float z, float o, uint32 anim=0);
  595. +        Creature* AddNPCPassenger(uint32 tguid, uint32 entry, float x, float y, float z, float o, uint32 anim=0);
  596. +        Creature* AddNPCPassengerInInstance(uint32 entry, float x, float y, float z, float o, uint32 anim=0);
  597.         void UpdatePosition(MovementInfo* mi);
  598.         void UpdateNPCPositions();
  599.         void BuildStartMovePacket(Map const* targetMap);
  600. @@ -92,5 +93,4 @@ class Transport : public GameObject
  601.         void DoEventIfAny(WayPointMap::value_type const& node, bool departure);
  602.         WayPointMap::const_iterator GetNextWayPoint();
  603. };
  604. -#endif
  605. -
  606. +#endif
  607. \ No newline at end of file
  608. diff --git a/src/server/game/Maps/MapManager.h b/src/server/game/Maps/MapManager.h
  609. index 1049325..352c9e7 100755
  610. --- a/src/server/game/Maps/MapManager.h
  611. +++ b/src/server/game/Maps/MapManager.h
  612. @@ -123,6 +123,10 @@ class MapManager
  613.  
  614.         void LoadTransports();
  615.         void LoadTransportNPCs();
  616. +        //Load transport to instance
  617. +        Transport* LoadTransportInMap(Map* instance, uint32 goEntry, uint32 period);
  618. +
  619. +        void UnLoadTransportFromMap(Transport* t);
  620.  
  621.         typedef std::set<Transport*> TransportSet;
  622.         TransportSet m_Transports;
  623. @@ -130,6 +134,7 @@ class MapManager
  624.         typedef std::map<uint32, TransportSet> TransportMap;
  625.         TransportMap m_TransportsByMap;
  626.  
  627. +        TransportMap m_TransportsByInstanceIdMap;
  628.         bool CanPlayerEnter(uint32 mapid, Player* player, bool loginCheck = false);
  629.         void InitializeVisibilityDistanceInfo();
  630.  
  631. diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp
  632. index 65c7206..40ea398 100755
  633. --- a/src/server/game/Scripting/ScriptLoader.cpp
  634. +++ b/src/server/game/Scripting/ScriptLoader.cpp
  635. @@ -479,6 +479,7 @@ void AddSC_boss_lich_king_hr();
  636. void AddSC_boss_lord_marrowgar();       // Icecrown Citadel
  637. void AddSC_boss_lady_deathwhisper();
  638. void AddSC_boss_deathbringer_saurfang();
  639. +void AddSC_boss_gunship_battle();
  640. void AddSC_boss_festergut();
  641. void AddSC_boss_rotface();
  642. void AddSC_boss_professor_putricide();
  643. @@ -1195,6 +1196,7 @@ void AddNorthrendScripts()
  644.     AddSC_boss_lord_marrowgar();        // Icecrown Citadel
  645.     AddSC_boss_lady_deathwhisper();
  646.     AddSC_boss_deathbringer_saurfang();
  647. +    AddSC_boss_gunship_battle();
  648.     AddSC_boss_festergut();
  649.     AddSC_boss_rotface();
  650.     AddSC_boss_professor_putricide();
  651. diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
  652. index fbe2e91..c40709a 100644
  653. --- a/src/server/game/Spells/SpellMgr.cpp
  654. +++ b/src/server/game/Spells/SpellMgr.cpp
  655. @@ -3129,6 +3129,11 @@ void SpellMgr::LoadDbcDataCorrections()
  656.             case 54171: // Divine Storm
  657.                 spellInfo->MaxAffectedTargets = 3;
  658.                 break;
  659. +            case 68645: // Rocket Pack! Hack untill movejump will be implemented properly
  660. +                spellInfo->Effect[0] = SPELL_EFFECT_KNOCK_BACK_DEST;
  661. +                spellInfo->EffectMiscValue[0] = -250;
  662. +                spellInfo->EffectBasePoints[0] = 150;
  663. +                break;
  664.             case 38310: // Multi-Shot
  665.             case 53385: // Divine Storm (Damage)
  666.                 spellInfo->MaxAffectedTargets = 4;
  667. diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp
  668. index f2148b3..1221b0c 100644
  669. --- a/src/server/scripts/Commands/cs_npc.cpp
  670. +++ b/src/server/scripts/Commands/cs_npc.cpp
  671. @@ -65,7 +65,6 @@ public:
  672.             { "allowmove",      SEC_ADMINISTRATOR,  false, &HandleNpcSetAllowMovementCommand,  "", NULL },
  673.             { "entry",          SEC_ADMINISTRATOR,  false, &HandleNpcSetEntryCommand,          "", NULL },
  674.             { "factionid",      SEC_GAMEMASTER,     false, &HandleNpcSetFactionIdCommand,      "", NULL },
  675. -            { "emote",          SEC_ADMINISTRATOR,  false, &HandleNpcSetEmoteCommand,          "", NULL },
  676.             { "flag",           SEC_GAMEMASTER,     false, &HandleNpcSetFlagCommand,           "", NULL },
  677.             { "level",          SEC_GAMEMASTER,     false, &HandleNpcSetLevelCommand,          "", NULL },
  678.             { "link",           SEC_GAMEMASTER,     false, &HandleNpcSetLinkCommand,           "", NULL },
  679. @@ -104,7 +103,7 @@ public:
  680.         return commandTable;
  681.     }
  682.  
  683. -    //add spawn of creature
  684. +  //add spawn of creature
  685.     static bool HandleNpcAddCommand(ChatHandler* handler, const char* args)
  686.     {
  687.         if (!*args)
  688. @@ -129,11 +128,19 @@ public:
  689.  
  690.         if (chr->GetTransport())
  691.         {
  692. -            uint32 tguid = chr->GetTransport()->AddNPCPassenger(0, id, chr->GetTransOffsetX(), chr->GetTransOffsetY(), chr->GetTransOffsetZ(), chr->GetTransOffsetO());
  693. -            if (tguid > 0)
  694. -                WorldDatabase.PQuery("INSERT INTO creature_transport (guid, npc_entry, transport_entry,  TransOffsetX, TransOffsetY, TransOffsetZ, TransOffsetO) values (%u, %u, %f, %f, %f, %f, %u)", tguid, id, chr->GetTransport()->GetEntry(), chr->GetTransOffsetX(), chr->GetTransOffsetY(), chr->GetTransOffsetZ(), chr->GetTransOffsetO());
  695. -
  696. -            return true;
  697. +            if (!map->ToInstanceMap())
  698. +               {
  699. +                if(chr->GetTransport()->AddNPCPassenger(0, id, chr->GetTransOffsetX(), chr->GetTransOffsetY(), chr->GetTransOffsetZ(), chr->GetTransOffsetO()))
  700. +                {
  701. +                 WorldDatabase.PQuery("INSERT INTO creature_transport (guid, transport_entry, npc_entry, TransOffsetX, TransOffsetY, TransOffsetZ, TransOffsetO, emote) values (%u, %u, %u, %f, %f, %f, %f, 0)", 0, chr->GetTransport()->GetEntry(),id, chr->GetTransOffsetX(), chr->GetTransOffsetY(), chr->GetTransOffsetZ(), chr->GetTransOffsetO());
  702. +                 return true;
  703. +                }            
  704. +               }
  705. +               else
  706. +               {
  707. +                chr->GetTransport()->AddNPCPassengerInInstance(0, id, chr->GetTransOffsetX(), chr->GetTransOffsetY(), chr->GetTransOffsetZ(), chr->GetTransOffsetO());
  708. +               WorldDatabase.PQuery("INSERT INTO creature_transport (guid, transport_entry, npc_entry, TransOffsetX, TransOffsetY, TransOffsetZ, TransOffsetO, emote) values (%u, %u, %u, %f, %f, %f, %f, 0)", 0, chr->GetTransport()->GetEntry(),id, chr->GetTransOffsetX(), chr->GetTransOffsetY(), chr->GetTransOffsetZ(), chr->GetTransOffsetO());
  709. +               }
  710.         }
  711.  
  712.         Creature* creature = new Creature;
  713. @@ -157,7 +164,6 @@ public:
  714.         sObjectMgr->AddCreatureToGrid(db_guid, sObjectMgr->GetCreatureData(db_guid));
  715.         return true;
  716.     }
  717. -
  718.     //add item in vendorlist
  719.     static bool HandleNpcAddVendorItemCommand(ChatHandler* handler, char const* args)
  720.     {
  721. @@ -665,30 +671,6 @@ public:
  722.         return true;
  723.     }
  724.  
  725. -    // Set Emote
  726. -    static bool HandleNpcSetEmoteCommand(ChatHandler* handler, const char* args)
  727. -    {
  728. -        uint32 emote = atoi((char*)args);
  729. -        uint32 lowguid;
  730. -
  731. -        Creature* target = handler->getSelectedCreature();
  732. -        if (!target)
  733. -        {
  734. -            handler->SendSysMessage(LANG_SELECT_CREATURE);
  735. -            handler->SetSentErrorMessage(true);
  736. -            return false;
  737. -        }
  738. -
  739. -        lowguid = target->GetDBTableGUIDLow();
  740. -
  741. -        WorldDatabase.PExecute("DELETE FROM creature_addon WHERE guid = %u", lowguid);
  742. -        WorldDatabase.PExecute("INSERT INTO creature_addon (guid, emote) VALUES (%u, %u)", lowguid, emote);
  743. -
  744. -        target->SetUInt32Value(UNIT_NPC_EMOTESTATE, emote);
  745. -
  746. -        return true;
  747. -    }
  748. -
  749.     //play npc emote
  750.     static bool HandleNpcPlayEmoteCommand(ChatHandler* handler, const char* args)
  751.     {
  752. diff --git a/src/server/scripts/Northrend/CMakeLists.txt b/src/server/scripts/Northrend/CMakeLists.txt
  753. index 4774474..ca6dd6b 100644
  754. --- a/src/server/scripts/Northrend/CMakeLists.txt
  755. +++ b/src/server/scripts/Northrend/CMakeLists.txt
  756. @@ -168,6 +168,7 @@ set(scripts_STAT_SRCS
  757.   Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
  758.   Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
  759.   Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
  760. +  Northrend/IcecrownCitadel/boss_gunship_battle.cpp
  761.   Northrend/IcecrownCitadel/boss_festergut.cpp
  762.   Northrend/IcecrownCitadel/boss_rotface.cpp
  763.   Northrend/IcecrownCitadel/boss_professor_putricide.cpp
  764. diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_gunship_battle.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_gunship_battle.cpp
  765. new file mode 100644
  766. index 0000000..e1daa27
  767. --- /dev/null
  768. +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_gunship_battle.cpp
  769. @@ -0,0 +1,3306 @@
  770. +/*
  771. + * Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/>
  772. + *
  773. + * This program is free software; you can redistribute it and/or modify
  774. + * it under the terms of the GNU General Public License as published by
  775. + * the Free Software Foundation; either version 2 of the License, or
  776. + * (at your option) any later version.
  777. + *
  778. + * This program is distributed in the hope that it will be useful,
  779. + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  780. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  781. + * GNU General Public License for more details.
  782. + *
  783. + * You should have received a copy of the GNU General Public License
  784. + * along with this program; if not, write to the Free Software
  785. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  786. + */
  787. +
  788. +#include "icecrown_citadel.h"
  789. +#include "MapManager.h"
  790. +#include "Transport.h"
  791. +#include "Vehicle.h"
  792. +#include "Group.h"
  793. +
  794. +enum eAchievements
  795. +{
  796. +    IM_ON_A_BOAT_10    = 4536,
  797. +    IM_ON_A_BOAT_25    = 4612
  798. +};
  799. +
  800. +enum Actions
  801. +{
  802. +    ACTION_INTRO_START             = 1,
  803. +    ACTION_BATTLE_EVENT            = 2,
  804. +    ACTION_MAGE_DIE                = 3,
  805. +    ACTION_ROCK_DIE                = 4,
  806. +    ACTION_AXES_RIFL_DIE           = 5,
  807. +    ACTION_DONE                    = 6,
  808. +    ACTION_FAIL                    = 7,
  809. +};
  810. +
  811. +enum Spells
  812. +{
  813. +    SPELL_BURNING_PITCH_A             = 71335,
  814. +    SPELL_BURNING_PITCH_H             = 71339,
  815. +    SPELL_BURNING_PITCH_SIEGE_DMG_A   = 70383,
  816. +    SPELL_BURNING_PITCH_SIEGE_DMG_H   = 70374,
  817. +    SPELL_BURNING_PITCH_AOE_DAMAGE    = 69660,
  818. +
  819. +    SPELL_WOUNDING_STRIKE_10_NM       = 69651,
  820. +    SPELL_WOUNDING_STRIKE_10_HM       = 72570,
  821. +    SPELL_WOUNDING_STRIKE_25_NM       = 72569,
  822. +    SPELL_WOUNDING_STRIKE_25_HM       = 72571,
  823. +
  824. +    SPELL_TELEPORT_VISUAL             = 64446,
  825. +    SPELL_BLADESTORM                  = 69652,
  826. +    SPELL_BLADESTORM_TRIGGER          = 69653,
  827. +
  828. +    // Cannon
  829. +    SPELL_HEAT_DRAIN                  = 69470,
  830. +    SPELL_OVERHEAT                    = 69487, // Triggers spell #69488 every 0.25s. It should consume 10 Energy but does not.
  831. +    SPELL_CANNON_BLAST                = 69399,
  832. +    SPELL_INCINERATING_BLAST          = 69401,
  833. +
  834. +    // Auras
  835. +    SPELL_ON_ORGRIMS_HAMMERS_DECK     = 70121,
  836. +    SPELL_ON_SKYBREAKERS_DECK         = 70120,
  837. +
  838. +    // Achievement spell required target
  839. +    SPELL_ACHIEVEMENT                 = 72959,
  840. +
  841. +    // Rampart of Skulls NPCs Spells
  842. +    // Kor'kron Primalist
  843. +    SPELL_WRATH                       = 69968,
  844. +    SPELL_HEALING_TOUCH               = 69899,
  845. +    SPELL_REGROWTH                    = 69882,
  846. +    SPELL_REJUVENATION                = 69898,
  847. +
  848. +    SPELL_SUMMON_BATTLE_STANDART_A    = 69810,
  849. +    SPELL_SUMMON_BATTLE_STANDART_H    = 69811,
  850. +
  851. +    // Kor'kron Defender
  852. +    SPELL_DEVASTATE                   = 69902,
  853. +    SPELL_THUNDERCLAP                 = 69965,
  854. +    SPELL_SUNDER_ARMOR                = 57807,
  855. +    SPELL_SPELL_REFLECT               = 69901,
  856. +
  857. +    // Skybreaker Vindicator
  858. +    SPELL_AVENGERS_SHIELD             = 69927,
  859. +    SPELL_CONCENTRATION               = 69930,
  860. +    SPELL_HOLY_WRATH                  = 69934,
  861. +
  862. +    // Frostwyrm
  863. +    SPELL_FROST_BREATH                = 70116,
  864. +    SPELL_BLIZZARD                    = 70362,
  865. +    SPELL_FROST_CLEAVE                = 70361,
  866. +
  867. +    // Muradin Bronzebeard / High Overlord Saurfang
  868. +    SPELL_CLEAVE                      = 15284,
  869. +    SPELL_RENDING_THROW               = 70309,
  870. +    SPELL_TASTE_OF_BLOOD              = 69634,
  871. +
  872. +    // Kor'kron Battle-mage & Skybreaker Sorcerer
  873. +    SPELL_BELOW_ZERO                  = 69705,
  874. +    SPELL_SHADOW_CHANNELING           = 45104,
  875. +
  876. +    // Experience spells
  877. +    SPELL_EXPERIENCED                 = 71188,
  878. +    SPELL_VETERAN                     = 71193,
  879. +    SPELL_ELITE                       = 71195,
  880. +    SPELL_DESPERATE_RESOLVE_10_NM     = 69647,
  881. +    SPELL_DESPERATE_RESOLVE_10_HM     = 72537,
  882. +    SPELL_DESPERATE_RESOLVE_25_NM     = 72536,
  883. +    SPELL_DESPERATE_RESOLVE_25_HM     = 72538,
  884. +
  885. +    // Kor'kron Axethrower & Skybreaker Rifleman
  886. +    SPELL_HURL_AXE                    = 70161,
  887. +    SPELL_SHOOT                       = 70162,
  888. +
  889. +    // Kor'kron Rocketeer & Skybreaker Mortar Soldier
  890. +    SPELL_ROCKET_ARTILLERY_MARKER     = 71371,
  891. +    SPELL_ROCKET_ARTILLERY_TRIGGERED  = 69679,
  892. +    SPELL_ROCKET_ARTILLERY_HORDE      = 69678,
  893. +    SPELL_ROCKET_ARTILLERY_ALLIANCE   = 70609,
  894. +    SPELL_EXPLOSION                   = 69680,
  895. +
  896. +    // Ship Explsion
  897. +    SPELL_SHIP_EXPLOSION              = 72137,
  898. +
  899. +    // Remove Rocket Packs
  900. +    SPELL_REMOVE_ROCKET_PACK          = 70713,
  901. +
  902. +    // Achievements
  903. +    SPELL_ACHIEVEMENT_CHECK           = 72959,
  904. +};
  905. +
  906. +enum Events
  907. +{
  908. +    EVENT_NULL,
  909. +    EVENT_INTRO_ALLIANCE_1, // Muradin Bronzebeard yells: Fire up the engines! We got a meetin' with destiny, lads!
  910. +    EVENT_INTRO_ALLIANCE_2, // Muradin Bronzebeard yells: Hold on to yer hats!
  911. +    EVENT_INTRO_ALLIANCE_3, // Muradin Bronzebeard yells: What in the world is that? Grab me spyglass, crewman!
  912. +    EVENT_INTRO_ALLIANCE_4, // Muradin Bronzebeard yells: By me own beard! HORDE SAILIN' IN FAST 'N HOT!
  913. +    EVENT_INTRO_ALLIANCE_5, // Muradin Bronzebeard yells: EVASIVE ACTION! MAN THE GUNS!
  914. +    EVENT_INTRO_ALLIANCE_6, // Muradin Bronzebeard yells: Cowardly dogs! Ye blindsided us!
  915. +    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.
  916. +    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!
  917. +
  918. +    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!
  919. +    EVENT_INTRO_HORDE_1_1, // Kor'kron, take us out!
  920. +    EVENT_INTRO_HORDE_2, // High Overlord Saurfang yells: What is that?! Something approaching in the distance!
  921. +    EVENT_INTRO_HORDE_3, // High Overlord Saurfang yells: ALLIANCE GUNSHIP! ALL HANDS ON DECK!
  922. +    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!
  923. +    EVENT_INTRO_HORDE_5, // High Overlord Saurfang yells: You will know our business soon! KOR'KRON, ANNIHILATE THEM!
  924. +
  925. +    EVENT_OUTRO_ALLIANCE_1,
  926. +    EVENT_OUTRO_ALLIANCE_2,
  927. +    EVENT_OUTRO_ALLIANCE_3,
  928. +
  929. +    EVENT_OUTRO_HORDE_1,
  930. +    EVENT_OUTRO_HORDE_2,
  931. +    EVENT_OUTRO_HORDE_3,
  932. +    
  933. +   //Fly
  934. +    EVENT_START_FLY,
  935. +
  936. +   //Misc battle
  937. +    EVENT_WALK_MOBS,
  938. +    EVENT_SUMMON_PORTAL,
  939. +    EVENT_FREEZE_CANNON,
  940. +    EVENT_SHADOW_CHANNELING,
  941. +    EVENT_UNSUMMON_PORTAL,
  942. +    EVENT_BOARDING_GUNSHIP,
  943. +    EVENT_BOARDING_TALK,
  944. +    EVENT_BURNING_PITCH,
  945. +    EVENT_WOUNDING_STRIKE,
  946. +    EVENT_BLADE_STORM,
  947. +    EVENT_DONE,
  948. +    EVENT_FAIL,
  949. +    EVENT_RESTART_EVENT,
  950. +    EVENT_BOARDING_REAVERS_MARINE,
  951. +    EVENT_WIPE_CHECK,
  952. +
  953. +   // Rampart of Skulls NPCs Events
  954. +    EVENT_WRATH,
  955. +    EVENT_HEAL,
  956. +
  957. +    EVENT_SUNDER_ARMOR,
  958. +    EVENT_SPELL_REFLECT,
  959. +    EVENT_THUNDERCLAP,
  960. +    EVENT_DEVASTATE,
  961. +
  962. +    EVENT_FROST_BREATH,
  963. +    EVENT_BLIZZARD,
  964. +    EVENT_CLEAVE,
  965. +
  966. +    // Skybreaker Vindicator
  967. +    EVENT_AVENGERS_SHILED,
  968. +    EVENT_CONCENTRATION,
  969. +    EVENT_HOLY_WRATH,
  970. +
  971. +    // First Squad Assisted
  972. +    EVENT_FIRST_SQUAD_ASSISTED_1,
  973. +    EVENT_FIRST_SQUAD_ASSISTED_2,
  974. +
  975. +    // Second Squad Assisted
  976. +    EVENT_SECOND_SQUAD_ASSISTED_1,
  977. +    EVENT_SECOND_SQUAD_ASSISTED_2,
  978. +    EVENT_SECOND_SQUAD_ASSISTED_3,
  979. +
  980. +    // Shared experience events
  981. +    EVENT_EXPERIENCED,
  982. +    EVENT_VETERAN,
  983. +    EVENT_ELITE,
  984. +    EVENT_ATACK_START,
  985. +
  986. +    // Kor'kron Axethrower & Skybreaker Rifleman
  987. +    EVENT_HURL_AXE,
  988. +    EVENT_SHOOT,
  989. +
  990. +    // Kor'kron Rocketeer & Skybreaker Mortar Soldier
  991. +    EVENT_ROCKET_ART,
  992. +
  993. +    // Muradin Bronzebeard & High Overlord Saurfang
  994. +    EVENT_RENDING_THROW,
  995. +    EVENT_TASTE_OF_BLOOD,
  996. +
  997. +    // Misc (used in various NPCs)
  998. +    EVENT_SPAWN_MAGE,
  999. +    EVENT_RESPAWN_AXES_RIFLEMEN,
  1000. +    EVENT_RESPAWN_ROCKETEER,
  1001. +};
  1002. +
  1003. +enum Texts
  1004. +{
  1005. +    // Kor'kron Primalist
  1006. +    SAY_FIRST_SQUAD_RESCUED_HORDE_0  = 0,
  1007. +
  1008. +    // Kor'kron Invoker
  1009. +    SAY_FIRST_SQUAD_RESCUED_HORDE_1  = 0,
  1010. +
  1011. +    // Kor'kron Defender
  1012. +    SAY_SECOND_SQUAD_RESCUED_HORDE_0 = 0,
  1013. +    SAY_SECOND_SQUAD_RESCUED_HORDE_1 = 1,
  1014. +    SAY_FROSTWYRM_SUMMON_0           = 2,
  1015. +    SAY_FROSTWYRM_SUMMON_1           = 3,
  1016. +
  1017. +    // Skybreaker Vindicator
  1018. +    SAY_FIRST_SQUAD_RESCUED_ALLIANCE_0  = 0,
  1019. +
  1020. +    // Skybreaker Sorcerer
  1021. +    SAY_FIRST_SQUAD_RESCUED_ALLIANCE_1  = 0,
  1022. +
  1023. +    // Skybreaker Protector
  1024. +    SAY_SECOND_SQUAD_RESCUED_ALLIANCE_0 = 0,
  1025. +    SAY_SECOND_SQUAD_RESCUED_ALLIANCE_1 = 1,
  1026. +    SAY_SECOND_SQUAD_RESCUED_ALLIANCE_2 = 2,
  1027. +
  1028. +    // Kor'kron Invoker & Skybreaker Sorcerer
  1029. +    SAY_SUMMON_BATTLE_STANDARD          = 1,
  1030. +
  1031. +    // Froswyrm
  1032. +    SAY_FROSTWYRM_LAND_H_0           = 0,
  1033. +    SAY_FROSTWYRM_LAND_A_1           = 1,
  1034. +
  1035. +    // Muradin Bronzebeard
  1036. +    SAY_INTRO_ALLIANCE_0             = 0,
  1037. +    SAY_INTRO_ALLIANCE_1             = 1,
  1038. +    SAY_INTRO_ALLIANCE_2             = 2,
  1039. +    SAY_INTRO_ALLIANCE_3             = 3,
  1040. +    SAY_INTRO_ALLIANCE_4             = 4,
  1041. +    SAY_INTRO_ALLIANCE_5             = 5,
  1042. +    SAY_INTRO_ALLIANCE_7             = 6,
  1043. +    SAY_INTRO_HORDE_3                = 7,
  1044. +    SAY_BOARDING_SKYBREAKER_1        = 8,
  1045. +    SAY_BOARDING_ORGRIMS_HAMMER_0    = 9,
  1046. +    SAY_NEW_RIFLEMEN_SPAWNED         = 10,
  1047. +    SAY_NEW_MORTAR_TEAM_SPAWNED      = 11,
  1048. +    SAY_NEW_MAGE_SPAWNED             = 12,
  1049. +    SAY_ALLIANCE_VICTORY             = 13,
  1050. +    SAY_ALLIANCE_DEFEAT              = 14, // How will we handle that case ? Ie. the player loses
  1051. +
  1052. +    // High Overlord Saurfang
  1053. +    SAY_INTRO_HORDE_0                = 0,
  1054. +    SAY_INTRO_HORDE_0_1              = 1,
  1055. +    SAY_INTRO_HORDE_1                = 2,
  1056. +    SAY_INTRO_HORDE_2                = 3,
  1057. +    SAY_INTRO_HORDE_4                = 4,
  1058. +    SAY_BOARDING_SKYBREAKER_0        = 5,
  1059. +    SAY_BOARDING_ORGRIMS_HAMMER_1    = 6,
  1060. +    SAY_NEW_AXETHROWER_SPAWNED       = 7,
  1061. +    SAY_NEW_ROCKETEERS_SPAWNED       = 8,
  1062. +    SAY_NEW_BATTLE_MAGE_SPAWNED      = 9,
  1063. +    SAY_HORDE_VICTORY                = 10,
  1064. +    SAY_HORDE_DEFEAT                 = 11, // How will we handle that case ? Ie. the player loses
  1065. +
  1066. +    SAY_HIGH_OVERLORD_SAURFANG_NOT_VISUAL = 0,
  1067. +    SAY_BOARDING_SKYBREAKER_SAURFANG      = 1,
  1068. +    SAY_MURADIN_BRONZEBEARD_NOT_VISUAL    = 0,
  1069. +    SAY_BOARDING_SKYBREAKER_MURADIN       = 1,
  1070. +};
  1071. +
  1072. +Position const FrostWyrmPosH   = {-435.429f, 2077.556f, 219.1148f, 4.767166f};
  1073. +Position const FrostWyrmPosA   = {-437.409f, 2349.026f, 219.1148f, 1.483120f};
  1074. +
  1075. +struct mortarMarksLoc
  1076. +{
  1077. +    uint32 durationBeforeRefreshing;
  1078. +    Position location;
  1079. +};
  1080. +
  1081. +
  1082. +//Function find player special for Gunship battle
  1083. +typedef std::list<Player*> TPlayerLists;
  1084. +
  1085. +TPlayerLists GetPlayersInTheMaps(Map *pMap)
  1086. +{
  1087. +    TPlayerLists players;
  1088. +    const Map::PlayerList &PlayerList = pMap->GetPlayers();
  1089. +    if (!PlayerList.isEmpty())
  1090. +        for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
  1091. +            if (Player* player = i->getSource())
  1092. +                players.push_back(player);
  1093. +    return players;
  1094. +}
  1095. +
  1096. +Player* SelectRandomPlayerFromLists(TPlayerLists &players)
  1097. +{
  1098. +    if (players.empty())
  1099. +        return NULL;
  1100. +    TPlayerLists::iterator it = players.begin();
  1101. +    std::advance(it, urand(0, players.size()-1));
  1102. +    return *it;
  1103. +}
  1104. +
  1105. +Player* SelectRandomPlayerInTheMaps(Map* pMap)
  1106. +{
  1107. +    TPlayerLists players = GetPlayersInTheMaps(pMap);
  1108. +    return SelectRandomPlayerFromLists(players);
  1109. +}
  1110. +
  1111. +//Function start motion of the ship
  1112. +void StartFlyShip(Transport* t)
  1113. +{
  1114. +    t->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
  1115. +    t->SetGoState(GO_STATE_ACTIVE);
  1116. +    t->SetUInt32Value(GAMEOBJECT_DYNAMIC, 0x10830010); // Seen in sniffs
  1117. +    t->SetFloatValue(GAMEOBJECT_PARENTROTATION + 3, 1.0f);
  1118. +
  1119. +    Map* map = t->GetMap();
  1120. +    std::set<uint32> mapsUsed;
  1121. +    GameObjectTemplate const* goinfo = t->GetGOInfo();
  1122. +
  1123. +    t->GenerateWaypoints(goinfo->moTransport.taxiPathId, mapsUsed);
  1124. +
  1125. +    for (Map::PlayerList::const_iterator itr = map->GetPlayers().begin(); itr != map->GetPlayers().end(); ++itr)
  1126. +    {
  1127. +        if (Player* pPlayer = itr->getSource())
  1128. +        {
  1129. +            UpdateData transData;
  1130. +            t->BuildCreateUpdateBlockForPlayer(&transData, pPlayer);
  1131. +            WorldPacket packet;
  1132. +            transData.BuildPacket(&packet);
  1133. +            pPlayer->SendDirectMessage(&packet);
  1134. +        }
  1135. +    }
  1136. +}
  1137. +
  1138. +void RelocateTransport(Transport* t)
  1139. +{
  1140. +    Map* map = t->GetMap();
  1141. +    InstanceScript* instance = t->GetInstanceScript();
  1142. +
  1143. +    if (!t || !instance)
  1144. +        return;
  1145. +
  1146. +    // Transoprt movemend on server-side is ugly hack, so we do sincronize positions
  1147. +    switch (t->GetEntry())
  1148. +    {
  1149. +        case GO_THE_SKYBREAKER_ALLIANCE_ICC:
  1150. +            if (instance->GetBossState(DATA_GUNSHIP_EVENT) != DONE)
  1151. +                t->Relocate(-377.184021f, 2073.548584f, 445.753387f);
  1152. +            else if (instance->GetBossState(DATA_GUNSHIP_EVENT) == DONE)
  1153. +                t->Relocate(-583.942627f, 2212.364990f, 534.673889f);
  1154. +            break;
  1155. +        case GO_ORGRIM_S_HAMMER_ALLIANCE_ICC:
  1156. +            if (instance->GetBossState(DATA_GUNSHIP_EVENT) != DONE)
  1157. +                t->Relocate(-384.878479f, 1989.831665f, 431.549438f);
  1158. +            break;
  1159. +        case GO_ORGRIM_S_HAMMER_HORDE_ICC:
  1160. +            if (instance->GetBossState(DATA_GUNSHIP_EVENT) != DONE)
  1161. +                t->Relocate(-438.142365f, 2395.725830f, 436.781647f);
  1162. +            else if (instance->GetBossState(DATA_GUNSHIP_EVENT) == DONE)
  1163. +                t->Relocate(-583.942627f, 2212.364990f, 534.673889f);
  1164. +            break;
  1165. +        case GO_THE_SKYBREAKER_HORDE_ICC:
  1166. +            if (instance->GetBossState(DATA_GUNSHIP_EVENT) != DONE)
  1167. +                t->Relocate(-435.854156f, 2475.328125f, 449.364105f);
  1168. +            break;
  1169. +    }
  1170. +
  1171. +    t->Update(0);
  1172. +    t->UpdateNPCPositions();
  1173. +}
  1174. +
  1175. +
  1176. +//Function stop motion of the ship
  1177. +void StopFlyShip(Transport* t)
  1178. +{
  1179. +    Map* map = t->GetMap();
  1180. +    t->m_WayPoints.clear();
  1181. +    RelocateTransport(t);
  1182. +    t->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
  1183. +    t->SetGoState(GO_STATE_READY);
  1184. +
  1185. +    for (Map::PlayerList::const_iterator itr = map->GetPlayers().begin(); itr != map->GetPlayers().end(); ++itr)
  1186. +    {
  1187. +        if (Player* pPlayer = itr->getSource())
  1188. +        {
  1189. +            UpdateData transData;
  1190. +            t->BuildCreateUpdateBlockForPlayer(&transData, pPlayer);
  1191. +            WorldPacket packet;
  1192. +            transData.BuildPacket(&packet);
  1193. +            pPlayer->SendDirectMessage(&packet);
  1194. +        }
  1195. +    }
  1196. +}
  1197. +
  1198. +//Find Unfriendy transport
  1199. +Transport* CheckUnfriendlyShip(Creature* me, InstanceScript* instance, uint32 data)
  1200. +{
  1201. +    if(Creature* pCapitan = ObjectAccessor::GetCreature(*me, instance->GetData64(data)))
  1202. +        return pCapitan->GetTransport();
  1203. +    else
  1204. +        return NULL;
  1205. +}
  1206. +
  1207. +//Teleport players
  1208. +void TeleportPlayers(Map* map, uint64 TeamInInstance)
  1209. +{
  1210. +    if(map)
  1211. +    {
  1212. +        Map::PlayerList const &lPlayers = map->GetPlayers();
  1213. +        if (!lPlayers.isEmpty())
  1214. +        {
  1215. +            for(Map::PlayerList::const_iterator itr = lPlayers.begin(); itr != lPlayers.end(); ++itr)
  1216. +            {
  1217. +                if (Player* pPlayer = itr->getSource())
  1218. +                {
  1219. +                    if (pPlayer->isDead() && !pPlayer->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST))
  1220. +                        pPlayer->ResurrectPlayer(1.0f);
  1221. +
  1222. +                    if(TeamInInstance == ALLIANCE)
  1223. +                        pPlayer->TeleportTo(631, -437.498505f, 2425.954f, 192.997f, 2.247f);
  1224. +                    else
  1225. +                        pPlayer->TeleportTo(631, -437.498505f, 1997.954f, 192.997f, 2.247f);
  1226. +                }
  1227. +            }
  1228. +        }
  1229. +    }
  1230. +}
  1231. +
  1232. +//Ship explosion
  1233. +void DoShipExplosion(Transport* t)
  1234. +{
  1235. +    for (Transport::CreatureSet::iterator itr = t->m_NPCPassengerSet.begin(); itr != t->m_NPCPassengerSet.end();)
  1236. +    {
  1237. +        if (Creature* npc = *itr)
  1238. +        {
  1239. +            if(npc->GetEntry() == NPC_GB_GUNSHIP_HULL)
  1240. +                npc->CastSpell(npc, SPELL_SHIP_EXPLOSION, true);
  1241. +        }
  1242. +        ++itr;
  1243. +    }
  1244. +}
  1245. +
  1246. +//Wipe check
  1247. +bool DoWipeCheck(Transport* t)
  1248. +{
  1249. +    for (Transport::PlayerSet::const_iterator itr = t->GetPassengers().begin(); itr != t->GetPassengers().end();)
  1250. +    {
  1251. +        Player* plr = *itr;
  1252. +        ++itr;
  1253. +
  1254. +        if (plr && plr->isAlive())
  1255. +            return true;
  1256. +    }
  1257. +    return false;
  1258. +}
  1259. +
  1260. +//Check falling players
  1261. +void DoCheckFallingPlayer(Creature* me)
  1262. +{
  1263. +    Map* map = me->GetMap();
  1264. +
  1265. +    if(map)
  1266. +    {
  1267. +        Map::PlayerList const &lPlayers = map->GetPlayers();
  1268. +        if (!lPlayers.isEmpty())
  1269. +        {
  1270. +            for(Map::PlayerList::const_iterator itr = lPlayers.begin(); itr != lPlayers.end(); ++itr)
  1271. +            {
  1272. +                if (Player* pPlayer = itr->getSource())
  1273. +                {
  1274. +                    if (pPlayer->GetPositionZ() < 420.0f && pPlayer->IsWithinDistInMap(me, 300.0f))
  1275. +                        pPlayer->NearTeleportTo(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 5.0f, me->GetOrientation());
  1276. +                }
  1277. +            }
  1278. +        }
  1279. +    }
  1280. +}
  1281. +
  1282. +//Restart event
  1283. +void RestartEvent(Transport* t1, Transport* t2, Map* instance, uint64 TeamInInstance)
  1284. +{
  1285. +    sMapMgr->UnLoadTransportFromMap(t1);
  1286. +    sMapMgr->UnLoadTransportFromMap(t2);
  1287. +
  1288. +    Map::PlayerList const& players = instance->GetPlayers();
  1289. +    if (players.isEmpty())
  1290. +        return;
  1291. +
  1292. +                if(TeamInInstance == ALLIANCE)
  1293. +                {
  1294. +                    if(Transport* th = sMapMgr->LoadTransportInMap(instance, GO_ORGRIM_S_HAMMER_ALLIANCE_ICC, 108000))
  1295. +                    {
  1296. +                        th->AddNPCPassengerInInstance(NPC_GB_ORGRIMS_HAMMER, 1.845810f, 1.268872f, 34.526218f, 1.5890f);
  1297. +                        th->AddNPCPassengerInInstance(NPC_GB_HIGH_OVERLORD_SAURFANG, 37.18615f, 0.00016f, 36.78849f, 3.13683f);
  1298. +                        th->AddNPCPassengerInInstance(NPC_GB_INVISIBLE_STALKER, 37.18615f, 0.00016f, 36.78849f, 3.13683f);
  1299. +                        th->AddNPCPassengerInInstance(NPC_GB_KORKRON_BATTLE_MAGE, 47.2929f, -4.308941f, 37.5555f, 3.05033f);
  1300. +                        th->AddNPCPassengerInInstance(NPC_GB_KORKRON_BATTLE_MAGE, 47.34621f, 4.032004f, 37.70952f, 3.05033f);
  1301. +                        th->AddNPCPassengerInInstance(NPC_GB_KORKRON_BATTLE_MAGE, 15.03016f, 0.00016f, 37.70952f, 1.55138f);
  1302. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -13.19547f, -27.160213f, 35.47252f, 3.10672f);
  1303. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -18.33902f, -25.230491f, 33.04052f, 3.00672f);
  1304. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -60.1251f, -1.27014f, 42.8335f, 5.16073f);
  1305. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -48.2651f, 16.78034f, 34.2515f, 0.04292f);
  1306. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -14.8356f, 27.931688f, 33.363f, 1.73231f);
  1307. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 10.2702f, 20.62966f, 35.37483f, 1.6f);
  1308. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 39.32459f, 14.50176f, 36.88428f, 1.6f);
  1309. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 46.17223f, -6.638763f, 37.35444f, 1.32f);
  1310. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 27.4456f, -13.397498f, 36.34746f, 1.6f);
  1311. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 18.16184f, 1.37897f, 35.31705f, 1.6f);
  1312. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -18.11516f, -0.196236f, 45.15709f, 2.9f);
  1313. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -18.11844f, -0.19624f, 49.18192f, 1.6f);
  1314. +
  1315. +                        if (instance->ToInstanceMap()->GetMaxPlayers() == 10)
  1316. +                        {
  1317. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -3.170555f, 28.30652f, 34.21082f, 1.66527f);
  1318. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -12.0928f, 27.65942f, 33.58557f, 1.66527f);
  1319. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 14.92804f, 26.18018f, 35.47803f, 1.66527f);
  1320. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 24.70331f, 25.36584f, 35.97845f, 1.66527f);
  1321. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, -11.44849f, -25.71838f, 33.64343f, 1.49248f);
  1322. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, 12.30336f, -25.69653f, 35.32373f, 1.49248f);
  1323. +                        }                        
  1324. +                        else
  1325. +                        {
  1326. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -3.170555f, 28.30652f, 34.21082f, 1.66527f);
  1327. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -12.0928f, 27.65942f, 33.58557f, 1.66527f);
  1328. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 14.92804f, 26.18018f, 35.47803f, 1.66527f);
  1329. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 24.70331f, 25.36584f, 35.97845f, 1.66527f);
  1330. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 19.92804f, 27.18018f, 35.47803f, 1.66527f);
  1331. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -7.70331f, 28.36584f, 33.88557f, 1.66527f);
  1332. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, -11.44849f, -25.71838f, 33.64343f, 1.49248f);
  1333. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, 12.30336f, -25.69653f, 35.32373f, 1.49248f);
  1334. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, -3.44849f, -25.71838f, 34.21082f, 1.49248f);
  1335. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, 3.30336f, -25.69653f, 35.32373f, 1.49248f);
  1336. +                        }
  1337. +                    }
  1338. +
  1339. +                    if(Transport* t = sMapMgr->LoadTransportInMap(instance, GO_THE_SKYBREAKER_ALLIANCE_ICC, 108000))
  1340. +                    {
  1341. +                        t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER, -17.156807f, -1.633260f, 20.81273f, 4.52672f);
  1342. +                        t->AddNPCPassengerInInstance(NPC_GB_MURADIN_BRONZEBEARD, 13.51547f, -0.160213f, 20.87252f, 3.10672f);
  1343. +                        t->AddNPCPassengerInInstance(NPC_GB_HIHG_CAPTAIN_JUSTIN_BARTLETT, 42.78902f, -0.010491f, 25.24052f, 3.00672f);
  1344. +                        t->AddNPCPassengerInInstance(NPC_GB_HIGH_OVERLORD_SAURFANG_NOT_VISUAL, -12.9806f, -22.9462f, 21.659f, 4.72416f);
  1345. +                        t->AddNPCPassengerInInstance(NPC_GB_ZAFOD_BOOMBOX, 18.8042f, 9.907914f, 20.33559f, 3.10672f);
  1346. +                        t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_DECKHAND, -64.8423f, 4.4658f, 23.4352f, 2.698897f);
  1347. +                        t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_DECKHAND, 35.54972f, 19.93269f, 25.0333f, 4.71242f);
  1348. +                        t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_DECKHAND, -36.39837f, 3.13127f, 20.4496f, 1.5708f);
  1349. +                        t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_DECKHAND, -36.23974f, -2.75767f, 20.4506f, 4.69496f);
  1350. +                        t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_DECKHAND, 41.94677f, 44.08411f, 24.66587f, 1.62032f);
  1351. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 13.51547f, -0.160213f, 20.87252f, 3.10672f);
  1352. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 42.78902f, -0.010491f, 25.24052f, 3.00672f);
  1353. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 14.0551f, 3.65014f, 20.7935f, 3.16073f);
  1354. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 14.0551f, -4.65034f, 20.7915f, 3.04292f);
  1355. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -17.8356f, 0.031688f, 20.823f, 4.73231f);
  1356. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -34.2702f, -26.18966f, 21.37483f, 1.6f);
  1357. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -11.64459f, -19.85176f, 20.88428f, 1.6f);
  1358. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -19.88223f, -6.578763f, 20.57444f, 1.6f);
  1359. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -41.4456f, -7.647498f, 20.49746f, 1.6f);
  1360. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 0.554884f, -1.232897f, 20.53705f, 1.6f);
  1361. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -50.16516f, 9.716236f, 23.58709f, 1.6f);
  1362. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 11.45844f, 16.36624f, 20.54192f, 1.6f);
  1363. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 19.72286f, -2.193787f, 33.06982f, 1.6f);
  1364. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 19.72286f, -2.193787f, 33.06982f, 1.6f);
  1365. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 8.599396f, -28.55855f, 24.79919f, 1.6f);
  1366. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 38.94339f, -33.808f,  25.39618f, 1.6f);
  1367. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 58.15474f, 0.748094f, 41.87663f, 1.6f);
  1368. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 5.607554f, -6.350654f, 34.00357f, 1.6f);
  1369. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 4.780305f, -29.05227f, 35.09634f, 1.6f);
  1370. +
  1371. +                        if (instance->ToInstanceMap()->GetMaxPlayers() == 10)
  1372. +                        {
  1373. +                            t->AddNPCPassengerInInstance(NPC_GB_ALLIANCE_CANON, -5.15231f, -22.9462f, 21.659f, 4.72416f);
  1374. +                            t->AddNPCPassengerInInstance(NPC_GB_ALLIANCE_CANON, -28.0876f, -22.9462f, 21.659f, 4.72416f);
  1375. +                        }
  1376. +                        else
  1377. +                        {
  1378. +                            t->AddNPCPassengerInInstance(NPC_GB_ALLIANCE_CANON, -5.15231f, -22.9462f, 21.659f, 4.72416f);
  1379. +                            t->AddNPCPassengerInInstance(NPC_GB_ALLIANCE_CANON, -14.9806f, -22.9462f, 21.659f, 4.72416f);
  1380. +                            t->AddNPCPassengerInInstance(NPC_GB_ALLIANCE_CANON, -21.7406f, -22.9462f, 21.659f, 4.72416f);
  1381. +                            t->AddNPCPassengerInInstance(NPC_GB_ALLIANCE_CANON, -28.0876f, -22.9462f, 21.659f, 4.72416f);
  1382. +                        }
  1383. +                    }
  1384. +                }
  1385. +
  1386. +                if(TeamInInstance == HORDE)
  1387. +                {
  1388. +                    if(Transport* t = sMapMgr->LoadTransportInMap(instance, GO_THE_SKYBREAKER_HORDE_ICC, 77800))
  1389. +                    {
  1390. +                        t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER, -17.156807f, -1.633260f, 20.81273f, 4.52672f);
  1391. +                        t->AddNPCPassengerInInstance(NPC_GB_MURADIN_BRONZEBEARD, 13.51547f, -0.160213f, 20.87252f, 3.10672f);
  1392. +                        t->AddNPCPassengerInInstance(NPC_GB_HIHG_CAPTAIN_JUSTIN_BARTLETT, 42.78902f, -0.010491f, 25.24052f, 3.00672f);
  1393. +                        t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_SORCERERS, 14.0551f, 3.65014f, 20.7935f, 3.16073f);
  1394. +                        t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_SORCERERS, 14.0551f, -4.65034f, 20.7915f, 3.04292f);
  1395. +                        t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_SORCERERS, -17.8356f, 0.031688f, 20.823f, 4.73231f);
  1396. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 13.51547f, -0.160213f, 20.87252f, 3.10672f);
  1397. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 42.78902f, -0.010491f, 25.24052f, 3.00672f);
  1398. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 14.0551f, 3.65014f, 20.7935f, 3.16073f);
  1399. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 14.0551f, -4.65034f, 20.7915f, 3.04292f);
  1400. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -17.8356f, 0.031688f, 20.823f, 4.73231f);
  1401. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -34.2702f, -26.18966f, 21.37483f, 1.6f);
  1402. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -11.64459f, -19.85176f, 20.88428f, 1.6f);
  1403. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -19.88223f, -6.578763f, 20.57444f, 1.6f);
  1404. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -41.4456f, -7.647498f, 20.49746f, 1.6f);
  1405. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 0.554884f, -1.232897f, 20.53705f, 1.6f);
  1406. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -50.16516f, 9.716236f, 23.58709f, 1.6f);
  1407. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 11.45844f, 16.36624f, 20.54192f, 1.6f);
  1408. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 19.72286f, -2.193787f, 33.06982f, 1.6f);
  1409. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 19.72286f, -2.193787f, 33.06982f, 1.6f);
  1410. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 8.599396f, -28.55855f, 24.79919f, 1.6f);
  1411. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 38.94339f, -33.808f,  25.39618f, 1.6f);
  1412. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 58.15474f, 0.748094f, 41.87663f, 1.6f);
  1413. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 5.607554f, -6.350654f, 34.00357f, 1.6f);
  1414. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 4.780305f, -29.05227f, 35.09634f, 1.6f);
  1415. +
  1416. +                        if(instance->ToInstanceMap()->GetMaxPlayers() == 10)
  1417. +                        {
  1418. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -5.15231f, -22.9462f, 21.659f, 4.72416f);
  1419. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -14.9806f, -22.9462f, 21.659f, 4.72416f);
  1420. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -21.7406f, -22.9462f, 21.659f, 4.72416f);
  1421. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -28.0876f, -22.9462f, 21.659f, 4.72416f);
  1422. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -8.61003f, 15.483f, 20.4158f, 4.69854f);
  1423. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -27.9583f, 14.8875f, 20.4428f, 4.77865f);
  1424. +                        }
  1425. +                        else
  1426. +                        {
  1427. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, 0.15231f, -22.9462f, 21.659f, 4.72416f);
  1428. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -5.15231f, -22.9462f, 21.659f, 4.72416f);
  1429. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -14.9806f, -22.9462f, 21.659f, 4.72416f);
  1430. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -21.7406f, -22.9462f, 21.659f, 4.72416f);
  1431. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -28.0876f, -22.9462f, 21.659f, 4.72416f);
  1432. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -33.0876f, -22.9462f, 21.659f, 4.72416f);
  1433. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -8.61003f, 15.483f, 20.4158f, 4.69854f);
  1434. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -27.9583f, 14.8875f, 20.4428f, 4.77865f);
  1435. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -15.61003f, 15.483f, 20.4158f, 4.69854f);
  1436. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -20.9583f, 14.8875f, 20.4428f, 4.77865f);
  1437. +                        }
  1438. +                    }
  1439. +                
  1440. +                    if(Transport* th = sMapMgr->LoadTransportInMap(instance,GO_ORGRIM_S_HAMMER_HORDE_ICC, 77800))
  1441. +                    {
  1442. +                        th->AddNPCPassengerInInstance(NPC_GB_ORGRIMS_HAMMER, 1.845810f, 1.268872f, 34.526218f, 1.5890f);
  1443. +                        th->AddNPCPassengerInInstance(NPC_GB_HIGH_OVERLORD_SAURFANG, 37.18615f, 0.00016f, 36.78849f, 3.13683f);
  1444. +                        th->AddNPCPassengerInInstance(NPC_GB_MURADIN_BRONZEBEARD_NOT_VISUAL, -7.09684f, 30.582f, 34.5013f, 1.53591f);
  1445. +                        th->AddNPCPassengerInInstance(NPC_GB_INVISIBLE_STALKER, 37.30764f, -0.143823f, 36.7936f, 3.13683f);
  1446. +                        th->AddNPCPassengerInInstance(NPC_GB_ZAFOD_BOOMBOX, 35.18615f, 15.30652f, 37.64343f, 3.05033f);
  1447. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -13.19547f, -27.160213f, 35.47252f, 3.10672f);
  1448. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -18.33902f, -25.230491f, 33.04052f, 3.00672f);
  1449. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -60.1251f, -1.27014f, 42.8335f, 5.16073f);
  1450. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -48.2651f, 16.78034f, 34.2515f, 0.04292f);
  1451. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -14.8356f, 27.931688f, 33.363f, 1.73231f);
  1452. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 10.2702f, 20.62966f, 35.37483f, 1.6f);
  1453. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 39.32459f, 14.50176f, 36.88428f, 1.6f);
  1454. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 46.17223f, -6.638763f, 37.35444f, 1.32f);
  1455. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 27.4456f, -13.397498f, 36.34746f, 1.6f);
  1456. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 18.16184f, 1.37897f, 35.31705f, 1.6f);
  1457. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -18.11516f, -0.196236f, 45.15709f, 2.9f);
  1458. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -18.11844f, -0.19624f, 49.18192f, 1.6f);
  1459. +
  1460. +                        if(instance->ToInstanceMap()->GetMaxPlayers() == 10)
  1461. +                        {
  1462. +                            th->AddNPCPassengerInInstance(NPC_GB_HORDE_CANON, 22.6225f, 28.9309f, 36.3929f, 1.53591f);
  1463. +                            th->AddNPCPassengerInInstance(NPC_GB_HORDE_CANON, -21.7509f, 29.4207f, 34.2588f, 1.53591f);
  1464. +                        }
  1465. +                        else
  1466. +                        {
  1467. +                            th->AddNPCPassengerInInstance(NPC_GB_HORDE_CANON, 22.6225f, 28.9309f, 36.3929f, 1.53591f);
  1468. +                            th->AddNPCPassengerInInstance(NPC_GB_HORDE_CANON, 9.87745f, 30.5047f, 35.7147f, 1.53591f);
  1469. +                            th->AddNPCPassengerInInstance(NPC_GB_HORDE_CANON, -7.09684f, 30.582f, 34.5013f, 1.53591f);
  1470. +                            th->AddNPCPassengerInInstance(NPC_GB_HORDE_CANON, -21.7509f, 29.4207f, 34.2588f, 1.53591f);
  1471. +                        }
  1472. +                    }
  1473. +                }
  1474. +
  1475. +}
  1476. +
  1477. +//Stop Fight
  1478. +void StopFight(Transport* t1, Transport* t2)
  1479. +{
  1480. +    Map* map = t1->GetMap();
  1481. +
  1482. +    for (Transport::CreatureSet::iterator itr = t1->m_NPCPassengerSet.begin(); itr != t1->m_NPCPassengerSet.end();)
  1483. +    {
  1484. +        if (Creature *npc = *itr)
  1485. +        {
  1486. +            if(npc->GetEntry() != NPC_GB_SKYBREAKER && npc->GetEntry() != NPC_GB_ORGRIMS_HAMMER && npc->GetEntry() != NPC_GB_HIGH_OVERLORD_SAURFANG
  1487. +            && npc->GetEntry() != NPC_GB_MURADIN_BRONZEBEARD && npc->GetEntry() != NPC_GB_GUNSHIP_HULL)
  1488. +            {
  1489. +                if (Vehicle* veh = npc->GetVehicleKit())
  1490. +                    veh->RemoveAllPassengers();
  1491. +                npc->Kill(npc);
  1492. +            }
  1493. +        }
  1494. +        ++itr;
  1495. +    }
  1496. +
  1497. +    for (Transport::CreatureSet::iterator itr = t2->m_NPCPassengerSet.begin(); itr != t2->m_NPCPassengerSet.end();)
  1498. +    {
  1499. +        if (Creature *npc = *itr)
  1500. +        {
  1501. +            if(npc->GetEntry() != NPC_GB_GUNSHIP_HULL && npc->GetEntry() != NPC_GB_SKYBREAKER && npc->GetEntry() != NPC_GB_ORGRIMS_HAMMER)
  1502. +                npc->Kill(npc);
  1503. +        }
  1504. +        ++itr;
  1505. +    }
  1506. +
  1507. +    for (Map::PlayerList::const_iterator itr = map->GetPlayers().begin(); itr != map->GetPlayers().end(); ++itr)
  1508. +    {
  1509. +        if (Player* pPlayer = itr->getSource())
  1510. +            pPlayer->CombatStop();
  1511. +    }
  1512. +}
  1513. +
  1514. +//Muradin Bronzebeard
  1515. +class npc_muradin_gunship : public CreatureScript
  1516. +{
  1517. +    public:
  1518. +        npc_muradin_gunship() : CreatureScript("npc_muradin_gunship") { }
  1519. +
  1520. +        bool OnGossipHello(Player* player, Creature* pCreature)
  1521. +        {
  1522. +            InstanceScript* pInstance = pCreature->GetInstanceScript();
  1523. +            if (pInstance && pInstance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
  1524. +            {
  1525. +                if ((!player->GetGroup() || !player->GetGroup()->IsLeader(player->GetGUID())) && !player->isGameMaster())
  1526. +                {
  1527. +                    player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "I'm not the raid leader...", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
  1528. +                    player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, pCreature->GetGUID());
  1529. +                    return true;
  1530. +                }
  1531. +
  1532. +                player->ADD_GOSSIP_ITEM(0, "My companions are all accounted for, Muradin. Let's go!", 631, 1001);
  1533. +                player->SEND_GOSSIP_MENU(player->GetGossipTextId(pCreature), pCreature->GetGUID());
  1534. +                return true;
  1535. +            }
  1536. +            return false;
  1537. +        }
  1538. +
  1539. +        bool OnGossipSelect(Player* player, Creature* pCreature, uint32 /*sender*/, uint32 action)
  1540. +        {
  1541. +            InstanceScript* instance = pCreature->GetInstanceScript();
  1542. +            player->PlayerTalkClass->ClearMenus();
  1543. +            player->CLOSE_GOSSIP_MENU();
  1544. +
  1545. +            if (action == GOSSIP_ACTION_INFO_DEF+2)
  1546. +                pCreature->MonsterSay("I'll wait for the raid leader.", LANG_UNIVERSAL, player->GetGUID());
  1547. +
  1548. +            if (action == 1001)
  1549. +            {
  1550. +                pCreature->AI()->DoAction(ACTION_INTRO_START);
  1551. +                pCreature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
  1552. +            }
  1553. +            return true;
  1554. +        }
  1555. +
  1556. +        struct npc_muradin_gunshipAI : public ScriptedAI
  1557. +        {
  1558. +            npc_muradin_gunshipAI(Creature *creature) : ScriptedAI(creature),
  1559. +                _instance(creature->GetInstanceScript())
  1560. +            {
  1561. +
  1562. +            }
  1563. +
  1564. +            void Reset()
  1565. +            {
  1566. +                if (_instance->GetBossState(DATA_GUNSHIP_EVENT) == IN_PROGRESS)
  1567. +                    return;
  1568. +                me->SetReactState(REACT_PASSIVE);
  1569. +                me->setFaction(1802);
  1570. +                events.Reset();
  1571. +                map = me->GetMap();
  1572. +                skybreaker = me->GetTransport();
  1573. +                SummonCount = RAID_MODE(3, 5, 4, 6);
  1574. +                count = 0;
  1575. +                RocketerCount = RAID_MODE(2, 4, 2, 4);
  1576. +                RiflCount = RAID_MODE(4, 6, 4, 6);
  1577. +                RocketerDieCount = 0;
  1578. +                RiflDieCount = 0;
  1579. +                me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
  1580. +                EventScheduled = false;
  1581. +            }
  1582. +
  1583. +            void SendMusicToPlayers(uint32 musicId) const
  1584. +            {
  1585. +                WorldPacket data(SMSG_PLAY_MUSIC, 4);
  1586. +                data << uint32(musicId);
  1587. +                SendPacketToPlayers(&data);
  1588. +            }
  1589. +
  1590. +            // Send packet to all players
  1591. +            void SendPacketToPlayers(WorldPacket const* data) const
  1592. +            {
  1593. +                Map::PlayerList const& players = me->GetMap()->GetPlayers();
  1594. +                if (!players.isEmpty())
  1595. +                    for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
  1596. +                        if (Player* player = itr->getSource())
  1597. +                            player->GetSession()->SendPacket(data);
  1598. +            }
  1599. +
  1600. +            bool CanAIAttack(Unit const* target) const
  1601. +            {
  1602. +                if (target->GetEntry() == NPC_GB_KORKRON_SERGANTE || target->GetEntry() == NPC_GB_KORKRON_REAVERS)
  1603. +                    return true;
  1604. +
  1605. +                return false;
  1606. +            }
  1607. +
  1608. +            void DoAction(int32 const action)
  1609. +            {
  1610. +                switch (action)
  1611. +                {
  1612. +                    case ACTION_INTRO_START:
  1613. +                        events.ScheduleEvent(EVENT_INTRO_ALLIANCE_1, 1000);
  1614. +                        events.ScheduleEvent(EVENT_START_FLY, 2500);
  1615. +                        events.ScheduleEvent(EVENT_INTRO_ALLIANCE_2, 7000);
  1616. +                        events.ScheduleEvent(EVENT_INTRO_ALLIANCE_3, 28000);
  1617. +                        events.ScheduleEvent(EVENT_INTRO_ALLIANCE_4, 35000);
  1618. +                        events.ScheduleEvent(EVENT_INTRO_ALLIANCE_5, 40000);
  1619. +                        events.ScheduleEvent(EVENT_INTRO_ALLIANCE_6, 47000);
  1620. +                        events.ScheduleEvent(EVENT_INTRO_ALLIANCE_7, 53000);
  1621. +                        events.ScheduleEvent(EVENT_INTRO_ALLIANCE_8, 58900);
  1622. +                        break;
  1623. +                    case ACTION_BATTLE_EVENT:
  1624. +                    {
  1625. +                        if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
  1626. +                            events.ScheduleEvent(EVENT_WIPE_CHECK, 5000);
  1627. +
  1628. +                        Creature* pAllianceBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_SKYBREAKER_BOSS));
  1629. +                        Creature* pHordeBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ORGRIMMAR_HAMMER_BOSS));
  1630. +
  1631. +                        if (pHordeBoss && pAllianceBoss)
  1632. +                        {
  1633. +                             me->SetReactState(REACT_AGGRESSIVE);
  1634. +                             pHordeBoss->SetInCombatWith(pAllianceBoss);
  1635. +                             pAllianceBoss->SetInCombatWith(pHordeBoss);
  1636. +                             pAllianceBoss->AddThreat(pHordeBoss, 0.0f);
  1637. +                             pHordeBoss->AddThreat(pAllianceBoss, 0.0f);
  1638. +                             _instance->SetBossState(DATA_GUNSHIP_EVENT, IN_PROGRESS);
  1639. +                             events.ScheduleEvent(EVENT_SUMMON_PORTAL, 30000);
  1640. +                             RelocateTransport(skybreaker);
  1641. +                             RelocateTransport(CheckUnfriendlyShip(me,_instance, DATA_GB_HIGH_OVERLORD_SAURFANG));
  1642. +                        }
  1643. +                        else
  1644. +                            me->AI()->DoAction(ACTION_FAIL);
  1645. +                        break;
  1646. +                    }
  1647. +                    case ACTION_DONE:
  1648. +                        if (Creature* pAllianceBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_SKYBREAKER_BOSS)))
  1649. +                        {
  1650. +                            _instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, pAllianceBoss);
  1651. +                        }
  1652. +                        if (Creature* pHordeBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ORGRIMMAR_HAMMER_BOSS)))
  1653. +                        {
  1654. +                            _instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, pHordeBoss);
  1655. +                        }
  1656. +
  1657. +                        me->SetReactState(REACT_PASSIVE);
  1658. +                        _instance->SetBossState(DATA_GUNSHIP_EVENT, DONE);
  1659. +                        _instance->DoCastSpellOnPlayers(SPELL_REMOVE_ROCKET_PACK);
  1660. +                        Talk(SAY_ALLIANCE_VICTORY);
  1661. +                        StartFlyShip(CheckUnfriendlyShip(me, _instance, DATA_GB_HIGH_OVERLORD_SAURFANG));
  1662. +                        StopFight(skybreaker, CheckUnfriendlyShip(me, _instance, DATA_GB_HIGH_OVERLORD_SAURFANG));
  1663. +                        events.CancelEvent(EVENT_WIPE_CHECK);
  1664. +                        events.ScheduleEvent(EVENT_OUTRO_ALLIANCE_1, 3500);
  1665. +                        events.ScheduleEvent(EVENT_OUTRO_ALLIANCE_2, 23000);
  1666. +                        events.ScheduleEvent(EVENT_OUTRO_ALLIANCE_3, 32000);
  1667. +                        break;
  1668. +                    case ACTION_FAIL:
  1669. +                        events.CancelEvent(EVENT_WIPE_CHECK);
  1670. +                        Talk(SAY_ALLIANCE_DEFEAT);
  1671. +                        if (Creature* pAllianceBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_SKYBREAKER_BOSS)))
  1672. +                        {
  1673. +                            _instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, pAllianceBoss);
  1674. +                        }
  1675. +                        if (Creature* pHordeBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ORGRIMMAR_HAMMER_BOSS)))
  1676. +                        {
  1677. +                            _instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, pHordeBoss);
  1678. +                        }
  1679. +                        StopFight(skybreaker, CheckUnfriendlyShip(me, _instance, DATA_GB_HIGH_OVERLORD_SAURFANG));
  1680. +                        events.ScheduleEvent(EVENT_FAIL, 10000);
  1681. +                        break;
  1682. +                    case ACTION_MAGE_DIE:
  1683. +                        events.ScheduleEvent(EVENT_SPAWN_MAGE, 60000);
  1684. +                        break;
  1685. +                    case ACTION_ROCK_DIE:
  1686. +                        ++RocketerDieCount;
  1687. +                        if(RocketerDieCount == RocketerCount)
  1688. +                            events.ScheduleEvent(EVENT_RESPAWN_ROCKETEER, 60000);
  1689. +                        break;
  1690. +                    case ACTION_AXES_RIFL_DIE:
  1691. +                        ++RiflDieCount;
  1692. +                        if(RiflDieCount == RiflCount)
  1693. +                            events.ScheduleEvent(EVENT_RESPAWN_AXES_RIFLEMEN, 60000);
  1694. +                        break;
  1695. +                }
  1696. +            }
  1697. +
  1698. +            void DamageTaken(Unit* /*attacker*/, uint32& damage)
  1699. +            {
  1700. +                if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE && me->GetHealthPct() < 2.0f )
  1701. +                {
  1702. +                   damage = 0;
  1703. +                }
  1704. +                
  1705. +                if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE && me->GetHealthPct() < 2.0f )
  1706. +                {
  1707. +                   damage = 0;
  1708. +                   me->AI()->DoAction(ACTION_FAIL);
  1709. +                }
  1710. +            }
  1711. +
  1712. +            void MovementInform(uint32 type, uint32 pointId)
  1713. +            {
  1714. +                if (type != POINT_MOTION_TYPE)
  1715. +                    return;
  1716. +
  1717. +                if (pointId = 1)
  1718. +                    me->DespawnOrUnsummon(1000);
  1719. +            }
  1720. +
  1721. +            void UpdateAI(const uint32 diff)
  1722. +            {
  1723. +                if (me->HasUnitState(UNIT_STAT_CASTING))
  1724. +                    return;
  1725. +                
  1726. +                if (!HealthAbovePct(75))
  1727. +                {
  1728. +                    me->SetHealth(me->GetMaxHealth() / 100 * 76); // find a better way to avoid the hardcore spell spam ....
  1729. +                    DoCast(me, SPELL_TASTE_OF_BLOOD);
  1730. +                }
  1731. +
  1732. +                if (UpdateVictim())
  1733. +                {
  1734. +                    if (!EventScheduled)
  1735. +                    {
  1736. +                        EventScheduled = true; // should temp fix the hardcore casting
  1737. +                        events.ScheduleEvent(EVENT_RENDING_THROW, 3000);
  1738. +                    }
  1739. +                }
  1740. +
  1741. +                events.Update(diff);
  1742. +
  1743. +                while (uint32 eventId = events.ExecuteEvent())
  1744. +                {
  1745. +                    switch (eventId)
  1746. +                    {
  1747. +                        case EVENT_WIPE_CHECK:
  1748. +                            DoCheckFallingPlayer(me);
  1749. +                            if (DoWipeCheck(skybreaker))
  1750. +                                events.ScheduleEvent(EVENT_WIPE_CHECK, 3000);
  1751. +                            else
  1752. +                                me->AI()->DoAction(ACTION_FAIL);
  1753. +                            break;
  1754. +                        case EVENT_INTRO_ALLIANCE_1:
  1755. +                            Talk(SAY_INTRO_ALLIANCE_0);
  1756. +                            break;
  1757. +                        case EVENT_START_FLY:
  1758. +                            StartFlyShip(skybreaker);
  1759. +                            break;
  1760. +                        case EVENT_INTRO_ALLIANCE_2:
  1761. +                            Talk(SAY_INTRO_ALLIANCE_1);
  1762. +                            break;
  1763. +                        case EVENT_INTRO_ALLIANCE_3:
  1764. +                            Talk(SAY_INTRO_ALLIANCE_2);
  1765. +                            StartFlyShip(CheckUnfriendlyShip(me, _instance, DATA_GB_HIGH_OVERLORD_SAURFANG));
  1766. +                            break;
  1767. +                        case EVENT_INTRO_ALLIANCE_4:
  1768. +                            Talk(SAY_INTRO_ALLIANCE_3);
  1769. +                            break;
  1770. +                        case EVENT_INTRO_ALLIANCE_5:
  1771. +                            StopFlyShip(skybreaker);
  1772. +                            StopFlyShip(CheckUnfriendlyShip(me, _instance, DATA_GB_HIGH_OVERLORD_SAURFANG));
  1773. +                            Talk(SAY_INTRO_ALLIANCE_4);
  1774. +                            break;
  1775. +                        case EVENT_INTRO_ALLIANCE_6:
  1776. +                            Talk(SAY_INTRO_ALLIANCE_5);
  1777. +                            SendMusicToPlayers(17289);
  1778. +                            me->AI()->DoAction(ACTION_BATTLE_EVENT);
  1779. +                            break;
  1780. +                        case EVENT_INTRO_ALLIANCE_7:
  1781. +                            if (Creature* pSaurfang = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_HIGH_OVERLORD_SAURFANG_NOT_VISUAL)))
  1782. +                            {
  1783. +                                pSaurfang->AI()->Talk(SAY_HIGH_OVERLORD_SAURFANG_NOT_VISUAL);
  1784. +                                pSaurfang->SetReactState(REACT_PASSIVE);
  1785. +                                pSaurfang->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  1786. +                            }
  1787. +                            break;
  1788. +                        case EVENT_INTRO_ALLIANCE_8:
  1789. +                            Talk(SAY_INTRO_ALLIANCE_7);
  1790. +                            break;
  1791. +                        case EVENT_SUMMON_PORTAL:
  1792. +                            if(_instance->GetBossState(DATA_GUNSHIP_EVENT) == IN_PROGRESS)
  1793. +                            {
  1794. +                                events.ScheduleEvent(EVENT_BOARDING_TALK, 10000);
  1795. +                                events.ScheduleEvent(EVENT_BOARDING_GUNSHIP, 2500); // TODO: Fix the timers
  1796. +                                skybreaker->AddNPCPassengerInInstance(NPC_GB_PORTAL, -15.51547f, -0.160213f, 28.87252f, 1.56211f);
  1797. +                                CheckUnfriendlyShip(me, _instance, DATA_GB_HIGH_OVERLORD_SAURFANG)->AddNPCPassengerInInstance(NPC_GB_PORTAL, 47.55099f, -0.101778f, 37.61111f, 1.55138f);
  1798. +                            }
  1799. +                            break;
  1800. +                        case EVENT_RENDING_THROW:
  1801. +                            if (UpdateVictim())
  1802. +                                if (me->getVictim()->IsWithinDistInMap(me, 50.0f, false)) // Todo: Fix the distance
  1803. +                                {
  1804. +                                    DoCastVictim(SPELL_RENDING_THROW);
  1805. +                                    EventScheduled = false;
  1806. +                                }
  1807. +                                else
  1808. +                                    events.CancelEvent(EVENT_RENDING_THROW);
  1809. +                            break;
  1810. +                        case EVENT_TASTE_OF_BLOOD:
  1811. +                            DoCast(me, SPELL_TASTE_OF_BLOOD);
  1812. +                            break;
  1813. +                        case EVENT_BOARDING_TALK:
  1814. +                            Talk(SAY_BOARDING_SKYBREAKER_1);
  1815. +                            break;
  1816. +                        case EVENT_BOARDING_GUNSHIP:
  1817. +                            if (Creature* pSaurfang = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_HIGH_OVERLORD_SAURFANG_NOT_VISUAL)))
  1818. +                            {
  1819. +                                pSaurfang->AI()->Talk(SAY_BOARDING_SKYBREAKER_SAURFANG);
  1820. +                            }
  1821. +                            if(Creature* Sergante = skybreaker->AddNPCPassengerInInstance(NPC_GB_KORKRON_SERGANTE, -15.51547f, -0.160213f, 20.87252f, 1.56211f))
  1822. +                            {
  1823. +                                Sergante->CastSpell(Sergante, SPELL_TELEPORT_VISUAL, true);
  1824. +                            }
  1825. +                            events.ScheduleEvent(EVENT_SUMMON_PORTAL, 90000);
  1826. +                            events.ScheduleEvent(EVENT_BOARDING_REAVERS_MARINE, 3000);
  1827. +                            count = 0;
  1828. +                            break;
  1829. +                        case EVENT_BOARDING_REAVERS_MARINE:
  1830. +                            if(count <= SummonCount)
  1831. +                            {
  1832. +                                if(Creature* Reavers = skybreaker->AddNPCPassengerInInstance(NPC_GB_KORKRON_REAVERS, -15.51547f, -0.160213f, 20.87252f, 1.56211f))
  1833. +                                {
  1834. +                                    Reavers->CastSpell(Reavers, SPELL_TELEPORT_VISUAL, true);
  1835. +                                    events.ScheduleEvent(EVENT_BOARDING_REAVERS_MARINE, 21000 / SummonCount);
  1836. +                                    ++count;
  1837. +                                }
  1838. +                            }
  1839. +                            break;
  1840. +                        case EVENT_OUTRO_ALLIANCE_1:
  1841. +  //                          _instance->DoCompleteAchievement(RAID_MODE(IM_ON_A_BOAT_10,IM_ON_A_BOAT_25,IM_ON_A_BOAT_10,IM_ON_A_BOAT_25));
  1842. +                            _instance->DoCastSpellOnPlayers(SPELL_ACHIEVEMENT_CHECK);
  1843. +                            StartFlyShip(skybreaker);
  1844. +                            StopFlyShip(CheckUnfriendlyShip(me,_instance,DATA_GB_HIGH_OVERLORD_SAURFANG));
  1845. +                            break;
  1846. +                        case EVENT_OUTRO_ALLIANCE_2:
  1847. +                            StopFlyShip(skybreaker);
  1848. +                            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);
  1849. +                            me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
  1850. +                            me->GetMotionMaster()->MovePoint(0, -590.700f, 2213.01f, 539.1f);
  1851. +                            break;
  1852. +                        case EVENT_OUTRO_ALLIANCE_3:
  1853. +                            me->GetMotionMaster()->MovePoint(1, -555.59f, 2213.01f, 539.28f);
  1854. +                            break;
  1855. +                        case EVENT_FAIL:
  1856. +                            TeleportPlayers(map, ALLIANCE);
  1857. +                            events.ScheduleEvent(EVENT_RESTART_EVENT, 2000);
  1858. +                            _instance->SetBossState(DATA_GUNSHIP_EVENT, NOT_STARTED);
  1859. +                            break;
  1860. +                        case EVENT_RESTART_EVENT:
  1861. +                            _instance->SetBossState(DATA_GUNSHIP_EVENT, FAIL);
  1862. +                            RestartEvent(skybreaker, CheckUnfriendlyShip(me,_instance,DATA_GB_HIGH_OVERLORD_SAURFANG), map, ALLIANCE);
  1863. +                            break;
  1864. +                        case EVENT_SPAWN_MAGE:
  1865. +                            Talk(SAY_NEW_MAGE_SPAWNED);
  1866. +                            skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_SORCERERS, -17.8356f, 0.031688f, 20.823f, 4.73231f);
  1867. +                            break;
  1868. +                        case EVENT_RESPAWN_ROCKETEER:
  1869. +                            Talk(SAY_NEW_MORTAR_TEAM_SPAWNED);
  1870. +                            if(RocketerCount == 2)
  1871. +                            {
  1872. +                                skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -8.61003f, 15.483f, 20.4158f, 4.69854f);
  1873. +                                skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -27.9583f, 14.8875f, 20.4428f, 4.77865f);
  1874. +                            }
  1875. +                            if(RocketerCount == 4)
  1876. +                            {
  1877. +                                skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -8.61003f, 15.483f, 20.4158f, 4.69854f);
  1878. +                                skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -27.9583f, 14.8875f, 20.4428f, 4.77865f);
  1879. +                                skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -15.61003f, 15.483f, 20.4158f, 4.69854f);
  1880. +                                skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -20.9583f, 14.8875f, 20.4428f, 4.77865f);
  1881. +                            }
  1882. +                            break;
  1883. +                        case EVENT_RESPAWN_AXES_RIFLEMEN:
  1884. +                            Talk(SAY_NEW_RIFLEMEN_SPAWNED);
  1885. +                            if(RiflCount == 4)
  1886. +                            {
  1887. +                                skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -28.0876f, -22.9462f, 21.659f, 4.72416f);
  1888. +                                skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -21.7406f, -22.9462f, 21.659f, 4.72416f);
  1889. +                                skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -14.9806f, -22.9462f, 21.659f, 4.72416f);
  1890. +                                skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -5.15231f, -22.9462f, 21.659f, 4.72416f);
  1891. +                            }
  1892. +                            if(RiflCount == 6)
  1893. +                            {
  1894. +                                skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -33.0876f, -22.9462f, 21.659f, 4.72416f);
  1895. +                                skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -28.0876f, -22.9462f, 21.659f, 4.72416f);
  1896. +                                skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -21.7406f, -22.9462f, 21.659f, 4.72416f);
  1897. +                                skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -14.9806f, -22.9462f, 21.659f, 4.72416f);
  1898. +                                skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -5.15231f, -22.9462f, 21.659f, 4.72416f);
  1899. +                                skybreaker->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, 0.15231f, -22.9462f, 21.659f, 4.72416f);
  1900. +                            }
  1901. +                            break;
  1902. +                      }
  1903. +                }
  1904. +
  1905. +                if (!me->GetCurrentSpell(CURRENT_MELEE_SPELL))
  1906. +                    DoCastVictim(SPELL_CLEAVE);
  1907. +
  1908. +                DoMeleeAttackIfReady();
  1909. +            }
  1910. +
  1911. +            private:
  1912. +                Transport* skybreaker;
  1913. +                Map* map;
  1914. +                uint32 SummonCount;
  1915. +                EventMap events;
  1916. +                InstanceScript* _instance;
  1917. +                uint32 count;
  1918. +                uint32 RocketerDieCount;
  1919. +                uint32 RiflDieCount;
  1920. +                uint32 RocketerCount;
  1921. +                uint32 RiflCount;
  1922. +                bool EventScheduled;
  1923. +        };
  1924. +
  1925. +        CreatureAI* GetAI(Creature* pCreature) const
  1926. +        {
  1927. +            return new npc_muradin_gunshipAI(pCreature);
  1928. +        }
  1929. +};
  1930. +
  1931. +class npc_gunship_skybreaker : public CreatureScript
  1932. +{
  1933. +    public:
  1934. +        npc_gunship_skybreaker() : CreatureScript("npc_gunship_skybreaker") { }
  1935. +
  1936. +        struct npc_gunship_skybreakerAI : public Scripted_NoMovementAI
  1937. +        {
  1938. +            npc_gunship_skybreakerAI(Creature *creature) : Scripted_NoMovementAI(creature), _instance(creature->GetInstanceScript())
  1939. +            {
  1940. +                Reset();
  1941. +            }
  1942. +
  1943. +            void Reset()
  1944. +            {
  1945. +                ScriptedAI::Reset();
  1946. +                me->SetReactState(REACT_PASSIVE);
  1947. +                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  1948. +                me->SetDisplayId(11686);
  1949. +            }
  1950. +
  1951. +            void EnterCombat(Unit* /*who*/)
  1952. +            {
  1953. +                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  1954. +                SetCombatMovement(false);
  1955. +                _instance->SendEncounterUnit(ENCOUNTER_FRAME_ADD, me);
  1956. +                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
  1957. +            }
  1958. +
  1959. +            void JustDied(Unit* killer)
  1960. +            {
  1961. +                if (Transport* t = me->GetTransport())
  1962. +                    DoShipExplosion(t);
  1963. +
  1964. +                if(_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
  1965. +                {
  1966. +                    if (Creature* pMuradin = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_GB_MURADIN_BRONZEBEARD)))
  1967. +                        pMuradin->AI()->DoAction(ACTION_FAIL);
  1968. +                }
  1969. +                
  1970. +                else if(_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  1971. +                {
  1972. +                    if (Creature* pSaurfang = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_GB_HIGH_OVERLORD_SAURFANG)))
  1973. +                        pSaurfang->AI()->DoAction(ACTION_DONE);
  1974. +                }
  1975. +            }
  1976. +
  1977. +            private:
  1978. +                EventMap events;
  1979. +                InstanceScript* _instance;
  1980. +        };
  1981. +
  1982. +        CreatureAI* GetAI(Creature* pCreature) const
  1983. +        {
  1984. +            return new npc_gunship_skybreakerAI(pCreature);
  1985. +        }
  1986. +};
  1987. +
  1988. +class npc_gunship_orgrimmar : public CreatureScript
  1989. +{
  1990. +    public:
  1991. +        npc_gunship_orgrimmar() : CreatureScript("npc_gunship_orgrimmar") { }
  1992. +
  1993. +        struct npc_gunship_orgrimmarAI : public Scripted_NoMovementAI
  1994. +        {
  1995. +            npc_gunship_orgrimmarAI(Creature *creature) : Scripted_NoMovementAI(creature), _instance(creature->GetInstanceScript())
  1996. +            {
  1997. +                Reset();
  1998. +            }
  1999. +
  2000. +            void Reset()
  2001. +            {
  2002. +                ScriptedAI::Reset();
  2003. +                me->SetReactState(REACT_PASSIVE);
  2004. +                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  2005. +                me->SetDisplayId(11686);
  2006. +            }
  2007. +
  2008. +            void EnterCombat(Unit* /*who*/)
  2009. +            {
  2010. +                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  2011. +                SetCombatMovement(false);
  2012. +                _instance->SendEncounterUnit(ENCOUNTER_FRAME_ADD, me);
  2013. +                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
  2014. +            }
  2015. +
  2016. +            void JustDied(Unit* killer)
  2017. +            {
  2018. +                if (Transport* t = me->GetTransport())
  2019. +                    DoShipExplosion(t);
  2020. +
  2021. +                if(_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
  2022. +                {
  2023. +                    if (Creature* pMuradin = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_GB_MURADIN_BRONZEBEARD)))
  2024. +                        pMuradin->AI()->DoAction(ACTION_DONE);
  2025. +                }
  2026. +                
  2027. +                else if(_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  2028. +                {
  2029. +                    if (Creature* pSaurfang = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_GB_HIGH_OVERLORD_SAURFANG)))
  2030. +                        pSaurfang->AI()->DoAction(ACTION_FAIL);
  2031. +                }
  2032. +            }
  2033. +
  2034. +            private:
  2035. +                EventMap events;
  2036. +                InstanceScript* _instance;
  2037. +        };
  2038. +
  2039. +        CreatureAI* GetAI(Creature* pCreature) const
  2040. +        {
  2041. +            return new npc_gunship_orgrimmarAI(pCreature);
  2042. +        }
  2043. +};
  2044. +
  2045. +/* Kro'kron Axethrower */
  2046. +class npc_korkron_axethrower_rifleman : public CreatureScript
  2047. +{
  2048. +    public:
  2049. +        npc_korkron_axethrower_rifleman() : CreatureScript("npc_korkron_axethrower_rifleman") { }
  2050. +
  2051. +        struct npc_korkron_axethrower_riflemanAI : public Scripted_NoMovementAI
  2052. +        {
  2053. +            npc_korkron_axethrower_riflemanAI(Creature *creature) : Scripted_NoMovementAI(creature),_instance(creature->GetInstanceScript())
  2054. +            {
  2055. +                Reset();
  2056. +            }
  2057. +
  2058. +            void Reset()
  2059. +            {
  2060. +                ScriptedAI::Reset();
  2061. +                DesperateResolve = RAID_MODE( SPELL_DESPERATE_RESOLVE_10_NM, SPELL_DESPERATE_RESOLVE_25_NM, SPELL_DESPERATE_RESOLVE_10_HM, SPELL_DESPERATE_RESOLVE_25_HM);
  2062. +                desperated = false;
  2063. +                me->RemoveAurasDueToSpell(SPELL_EXPERIENCED);
  2064. +                me->RemoveAurasDueToSpell(SPELL_ELITE);
  2065. +                me->RemoveAurasDueToSpell(SPELL_VETERAN);
  2066. +                events.ScheduleEvent(EVENT_EXPERIENCED, urand(19000, 21000)); // ~20 sec
  2067. +                events.ScheduleEvent(EVENT_VETERAN, urand(39000, 41000));     // ~40 sec
  2068. +                events.ScheduleEvent(EVENT_ELITE, urand(59000, 61000));       // ~60 sec
  2069. +                attacktimer = urand(6000, 15000);
  2070. +                if (me->GetEntry() == NPC_GB_SKYBREAKER_RIFLEMAN)
  2071. +                    SetEquipmentSlots(false, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE, 47267);
  2072. +                else
  2073. +                    SetEquipmentSlots(false, 49691, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
  2074. +            }
  2075. +
  2076. +            void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/)
  2077. +            {
  2078. +                if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE && me->GetHealthPct() < 20.0f && !desperated)
  2079. +                {
  2080. +                    desperated = true;
  2081. +                    DoCast(me, DesperateResolve);
  2082. +                }
  2083. +            }
  2084. +
  2085. +            void JustDied(Unit* killer)
  2086. +            {
  2087. +                if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
  2088. +                {
  2089. +                    if (Creature* pSaurfangBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_GB_HIGH_OVERLORD_SAURFANG)))
  2090. +                        pSaurfangBoss->AI()->DoAction(ACTION_AXES_RIFL_DIE);
  2091. +                }
  2092. +                
  2093. +                if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  2094. +                {
  2095. +                    if (Creature* pMuradin = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_GB_MURADIN_BRONZEBEARD)))
  2096. +                        pMuradin->AI()->DoAction(ACTION_AXES_RIFL_DIE);
  2097. +                }
  2098. +            }
  2099. +
  2100. +            void UpdateAI(const uint32 diff)
  2101. +            {
  2102. +                if (_instance->GetBossState(DATA_GUNSHIP_EVENT) != IN_PROGRESS)
  2103. +                    return;
  2104. +                
  2105. +                if (me->HasUnitState(UNIT_STAT_CASTING))
  2106. +                    return;
  2107. +                    
  2108. +                me->AI()->AttackStart(SelectRandomPlayerInTheMaps(me->GetMap()));
  2109. +
  2110. +                if (!UpdateVictim())
  2111. +                    return;
  2112. +
  2113. +                events.Update(diff);
  2114. +
  2115. +                if (attacktimer <= diff)
  2116. +                {
  2117. +                    if(me->GetEntry() == NPC_GB_KORKRON_AXETHROWER)
  2118. +                        DoCast(me->getVictim(), SPELL_HURL_AXE);
  2119. +                    else if(me->GetEntry() == NPC_GB_SKYBREAKER_RIFLEMAN)
  2120. +                        DoCast(me->getVictim(), SPELL_SHOOT);
  2121. +                    attacktimer = urand(6000, 15000);
  2122. +                } else attacktimer -= diff;
  2123. +
  2124. +                while (uint32 eventId = events.ExecuteEvent())
  2125. +                {
  2126. +                    switch (eventId)
  2127. +                    {
  2128. +                        case EVENT_EXPERIENCED:
  2129. +                            DoCast(me, SPELL_EXPERIENCED);
  2130. +                            break;
  2131. +                        case EVENT_VETERAN:
  2132. +                            me->RemoveAurasDueToSpell(SPELL_EXPERIENCED);
  2133. +                            DoCast(me, SPELL_VETERAN);
  2134. +                            break;
  2135. +                        case EVENT_ELITE:
  2136. +                            me->RemoveAurasDueToSpell(SPELL_VETERAN);
  2137. +                            DoCast(me, SPELL_ELITE);
  2138. +                            break;
  2139. +                        default:
  2140. +                            break;
  2141. +                    }
  2142. +                }
  2143. +            }
  2144. +
  2145. +            uint32 DesperateResolve;
  2146. +            uint32 attacktimer;
  2147. +
  2148. +            private:
  2149. +                EventMap events;
  2150. +                bool desperated;
  2151. +                InstanceScript* _instance;
  2152. +        };
  2153. +
  2154. +        CreatureAI* GetAI(Creature* pCreature) const
  2155. +        {
  2156. +            return new npc_korkron_axethrower_riflemanAI(pCreature);
  2157. +        }
  2158. +};
  2159. +
  2160. +class npc_sergeant : public CreatureScript
  2161. +{
  2162. +    public:
  2163. +        npc_sergeant() : CreatureScript("npc_sergeant") { }
  2164. +
  2165. +        struct npc_sergeantAI : public ScriptedAI
  2166. +        {
  2167. +            npc_sergeantAI(Creature *creature) : ScriptedAI(creature),_instance(creature->GetInstanceScript())
  2168. +            {
  2169. +                Reset();
  2170. +            }
  2171. +
  2172. +            void Reset()
  2173. +            {
  2174. +                ScriptedAI::Reset();
  2175. +                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  2176. +                me->SetReactState(REACT_PASSIVE);
  2177. +                events.ScheduleEvent(EVENT_WALK_MOBS, 1500);
  2178. +                desperated = false;
  2179. +                me->RemoveAurasDueToSpell(SPELL_EXPERIENCED);
  2180. +                me->RemoveAurasDueToSpell(SPELL_ELITE);
  2181. +                DesperateResolve = RAID_MODE( SPELL_DESPERATE_RESOLVE_10_NM, SPELL_DESPERATE_RESOLVE_25_NM, SPELL_DESPERATE_RESOLVE_10_HM, SPELL_DESPERATE_RESOLVE_25_HM);
  2182. +                events.ScheduleEvent(EVENT_EXPERIENCED, urand(19000, 21000));  // ~20 sec
  2183. +                events.ScheduleEvent(EVENT_VETERAN, urand(39000, 41000));      // ~40 sec
  2184. +                events.ScheduleEvent(EVENT_BURNING_PITCH, urand(60000, 62000));// ~61 sec
  2185. +                if(me->GetMap()->ToInstanceMap()->GetMaxPlayers() == 25 && me->GetMap()->IsHeroic())
  2186. +                    events.ScheduleEvent(EVENT_ELITE, urand(59000, 61000));       // ~60 sec
  2187. +            }
  2188. +
  2189. +            void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/)
  2190. +            {
  2191. +                if (me->GetHealthPct() < 20.0f && !desperated)
  2192. +                {
  2193. +                    desperated = true;
  2194. +                    DoCast(me, DesperateResolve);
  2195. +                }
  2196. +            }
  2197. +
  2198. +            bool CanAIAttack(Unit const* target) const
  2199. +            {
  2200. +                if (target->GetEntry() == NPC_GB_GUNSHIP_HULL)
  2201. +                    return false;
  2202. +
  2203. +                return true;
  2204. +            }
  2205. +
  2206. +            void UpdateAI(const uint32 diff)
  2207. +            {
  2208. +                if(_instance->GetBossState(DATA_GUNSHIP_EVENT) != IN_PROGRESS)
  2209. +                    return;
  2210. +
  2211. +                if (me->HasUnitState(UNIT_STAT_CASTING))
  2212. +                    return;
  2213. +                    
  2214. +                events.Update(diff);
  2215. +
  2216. +                while (uint32 eventId = events.ExecuteEvent())
  2217. +                {
  2218. +                    switch (eventId)
  2219. +                    {
  2220. +                        case EVENT_WALK_MOBS:
  2221. +                            me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  2222. +                            me->SetReactState(REACT_AGGRESSIVE);
  2223. +                            switch (me->GetEntry())
  2224. +                            {
  2225. +                                case NPC_GB_KORKRON_SERGANTE:
  2226. +                                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, SPELL_ON_SKYBREAKERS_DECK))
  2227. +                                    {
  2228. +                                        me->GetMotionMaster()->MoveChase(target);
  2229. +                                        me->AI()->AttackStart(target);
  2230. +                                    }
  2231. +                                break;
  2232. +                                case NPC_GB_SKYBREAKER_SERGANTE:
  2233. +                                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, SPELL_ON_ORGRIMS_HAMMERS_DECK))
  2234. +                                    {
  2235. +                                        me->GetMotionMaster()->MoveChase(target);
  2236. +                                        me->AI()->AttackStart(target);
  2237. +                                    }
  2238. +                                break;
  2239. +                            }
  2240. +                            events.ScheduleEvent(EVENT_WOUNDING_STRIKE, 5000);
  2241. +                            events.ScheduleEvent(EVENT_BLADE_STORM, 3000);
  2242. +                            break;
  2243. +                        case EVENT_BURNING_PITCH:
  2244. +                            if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
  2245. +                            {
  2246. +                                if (me->GetEntry() == NPC_GB_KORKRON_SERGANTE)
  2247. +                                    DoCast(pTarget, SPELL_BURNING_PITCH_H);
  2248. +                                else
  2249. +                                    DoCast(pTarget, SPELL_BURNING_PITCH_A);
  2250. +                            }
  2251. +                            events.ScheduleEvent(EVENT_BURNING_PITCH, urand(60000, 62000));// ~61 sec
  2252. +                            break;
  2253. +                        case EVENT_EXPERIENCED:
  2254. +                            DoCast(me, SPELL_EXPERIENCED);
  2255. +                            break;
  2256. +                        case EVENT_VETERAN:
  2257. +                            me->RemoveAurasDueToSpell(SPELL_EXPERIENCED);
  2258. +                            DoCast(me, SPELL_VETERAN);
  2259. +                            break;
  2260. +                        case EVENT_ELITE:
  2261. +                            me->RemoveAurasDueToSpell(SPELL_VETERAN);
  2262. +                            DoCast(me, SPELL_ELITE);
  2263. +                            break;
  2264. +                        case EVENT_WOUNDING_STRIKE:
  2265. +                            if (UpdateVictim())
  2266. +                                DoCastVictim( RAID_MODE( SPELL_WOUNDING_STRIKE_10_NM, SPELL_WOUNDING_STRIKE_25_NM, SPELL_WOUNDING_STRIKE_10_HM, SPELL_WOUNDING_STRIKE_25_HM));
  2267. +                            events.ScheduleEvent(EVENT_WOUNDING_STRIKE, urand(5000, 8000));
  2268. +                            break;
  2269. +                        case EVENT_BLADE_STORM:
  2270. +                            DoCast(me, SPELL_BLADESTORM);
  2271. +                            events.ScheduleEvent(EVENT_BLADE_STORM, urand(9000, 16000));
  2272. +                            break;
  2273. +                    }
  2274. +                }
  2275. +
  2276. +                DoMeleeAttackIfReady();
  2277. +
  2278. +            }
  2279. +                uint32 DesperateResolve;
  2280. +                bool desperated;
  2281. +
  2282. +            private:
  2283. +                EventMap events;
  2284. +                InstanceScript* _instance;
  2285. +        };
  2286. +
  2287. +        CreatureAI* GetAI(Creature* pCreature) const
  2288. +        {
  2289. +            return new npc_sergeantAI(pCreature);
  2290. +        }
  2291. +};
  2292. +
  2293. +class npc_marine_or_reaver : public CreatureScript
  2294. +{
  2295. +    public:
  2296. +        npc_marine_or_reaver() : CreatureScript("npc_marine_or_reaver") { }
  2297. +
  2298. +        struct npc_marine_or_reaverAI : public ScriptedAI
  2299. +        {
  2300. +            npc_marine_or_reaverAI(Creature *creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
  2301. +            {
  2302. +                Reset();
  2303. +            }
  2304. +
  2305. +            void Reset()
  2306. +            {
  2307. +                ScriptedAI::Reset();
  2308. +                desperated = false;
  2309. +                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  2310. +                me->SetReactState(REACT_PASSIVE);
  2311. +                events.ScheduleEvent(EVENT_WALK_MOBS, 1500);
  2312. +                me->RemoveAurasDueToSpell(SPELL_EXPERIENCED);
  2313. +                me->RemoveAurasDueToSpell(SPELL_ELITE);
  2314. +                DesperateResolve = RAID_MODE( SPELL_DESPERATE_RESOLVE_10_NM, SPELL_DESPERATE_RESOLVE_25_NM, SPELL_DESPERATE_RESOLVE_10_HM, SPELL_DESPERATE_RESOLVE_25_HM);
  2315. +                events.ScheduleEvent(EVENT_EXPERIENCED, urand(19000, 21000));  // ~20 sec
  2316. +                events.ScheduleEvent(EVENT_VETERAN, urand(39000, 41000));      // ~40 sec
  2317. +                events.ScheduleEvent(EVENT_BURNING_PITCH, urand(60000, 62000));// ~61 sec
  2318. +            }
  2319. +
  2320. +            void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/)
  2321. +            {
  2322. +                if (me->GetHealthPct() < 20.0f && !desperated)
  2323. +                {
  2324. +                    desperated = true;
  2325. +                    DoCast(me, DesperateResolve);
  2326. +                }
  2327. +            }
  2328. +
  2329. +            bool CanAIAttack(Unit const* target) const
  2330. +            {
  2331. +                if (target->GetEntry() == NPC_GB_GUNSHIP_HULL)
  2332. +                    return false;
  2333. +
  2334. +                return true;
  2335. +            }
  2336. +
  2337. +            void UpdateAI(const uint32 diff)
  2338. +            {
  2339. +                if(_instance->GetBossState(DATA_GUNSHIP_EVENT) != IN_PROGRESS)
  2340. +                    return;
  2341. +
  2342. +                if (me->HasUnitState(UNIT_STAT_CASTING))
  2343. +                    return;
  2344. +
  2345. +                events.Update(diff);
  2346. +
  2347. +                while (uint32 eventId = events.ExecuteEvent())
  2348. +                {
  2349. +                    switch (eventId)
  2350. +                    {
  2351. +                        case EVENT_WALK_MOBS:
  2352. +                            me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  2353. +                            me->SetReactState(REACT_AGGRESSIVE);
  2354. +                            switch (me->GetEntry())
  2355. +                            {
  2356. +                                case NPC_GB_KORKRON_REAVERS:
  2357. +                                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, SPELL_ON_SKYBREAKERS_DECK))
  2358. +                                    {
  2359. +                                        me->GetMotionMaster()->MoveChase(target);
  2360. +                                        me->AI()->AttackStart(target);
  2361. +                                    }
  2362. +                                break;
  2363. +                                case NPC_GB_SKYBREAKER_MARINE:
  2364. +                                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, SPELL_ON_ORGRIMS_HAMMERS_DECK))
  2365. +                                    {
  2366. +                                        me->GetMotionMaster()->MoveChase(target);
  2367. +                                        me->AI()->AttackStart(target);
  2368. +                                    }
  2369. +                                break;
  2370. +                            }
  2371. +                            break;
  2372. +                        case EVENT_BURNING_PITCH:
  2373. +                            if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
  2374. +                            {
  2375. +                                if (me->GetEntry() == NPC_GB_KORKRON_REAVERS)
  2376. +                                    DoCast(pTarget, SPELL_BURNING_PITCH_H);
  2377. +                                else
  2378. +                                    DoCast(pTarget, SPELL_BURNING_PITCH_A);
  2379. +                            }
  2380. +                            events.ScheduleEvent(EVENT_BURNING_PITCH, urand(60000, 62000));// ~61 sec
  2381. +                            break;
  2382. +                        case EVENT_EXPERIENCED:
  2383. +                            DoCast(me, SPELL_EXPERIENCED);
  2384. +                            break;
  2385. +                        case EVENT_VETERAN:
  2386. +                            me->RemoveAurasDueToSpell(SPELL_EXPERIENCED);
  2387. +                            DoCast(me, SPELL_VETERAN);
  2388. +                            break;
  2389. +                    }
  2390. +                }
  2391. +
  2392. +                DoMeleeAttackIfReady();
  2393. +            }
  2394. +                uint32 DesperateResolve;
  2395. +                bool desperated;
  2396. +
  2397. +            private:
  2398. +                EventMap events;
  2399. +                InstanceScript* _instance;
  2400. +        };
  2401. +
  2402. +        CreatureAI* GetAI(Creature* pCreature) const
  2403. +        {
  2404. +            return new npc_marine_or_reaverAI(pCreature);
  2405. +        }
  2406. +};
  2407. +
  2408. +class npc_gunship_mage : public CreatureScript
  2409. +{
  2410. +    public:
  2411. +        npc_gunship_mage() : CreatureScript("npc_gunship_mage") { }
  2412. +
  2413. +        struct npc_gunship_mageAI : public Scripted_NoMovementAI
  2414. +        {
  2415. +            npc_gunship_mageAI(Creature *creature) : Scripted_NoMovementAI(creature),_instance(creature->GetInstanceScript())
  2416. +            {
  2417. +                Reset();
  2418. +            }
  2419. +
  2420. +            void Reset()
  2421. +            {
  2422. +                ScriptedAI::Reset();
  2423. +                timer_BelowZero = urand(10000, 15000);
  2424. +            }
  2425. +
  2426. +            void DoAction(int32 const action)
  2427. +            {
  2428. +                switch (action)
  2429. +                {
  2430. +                    case EVENT_FREEZE_CANNON:
  2431. +                        if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
  2432. +                        {
  2433. +                            std::list<Creature*> cannonsA;
  2434. +                            GetCreatureListWithEntryInGrid(cannonsA, me, NPC_GB_ALLIANCE_CANON, 500.0f);
  2435. +                            for (std::list<Creature*>::iterator itr = cannonsA.begin(); itr != cannonsA.end(); ++itr)
  2436. +                            {
  2437. +                                if (Vehicle* veh = (*itr)->GetVehicleKit())
  2438. +                                    veh->RemoveAllPassengers();
  2439. +                                  
  2440. +                                DoCast((*itr),SPELL_BELOW_ZERO,true);
  2441. +                            }
  2442. +                        }
  2443. +                        else if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  2444. +                        {
  2445. +                            std::list<Creature*> cannonsH;
  2446. +                            GetCreatureListWithEntryInGrid(cannonsH, me, NPC_GB_HORDE_CANON, 500.0f);
  2447. +                            for (std::list<Creature*>::iterator itr = cannonsH.begin(); itr != cannonsH.end(); ++itr)
  2448. +                            {
  2449. +                                if (Vehicle* veh = (*itr)->GetVehicleKit())
  2450. +                                    veh->RemoveAllPassengers();
  2451. +                                  
  2452. +                                 DoCast((*itr),SPELL_BELOW_ZERO,true);
  2453. +                            }
  2454. +                        }
  2455. +                    break;
  2456. +                }
  2457. +            }
  2458. +
  2459. +            void JustDied(Unit* killer)
  2460. +            {
  2461. +                if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
  2462. +                {
  2463. +                    if (me->GetGUID() == _instance->GetData64(DATA_GB_BATTLE_MAGE))
  2464. +                    {
  2465. +                        if (Creature* pSaurfangBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_GB_HIGH_OVERLORD_SAURFANG)))
  2466. +                            pSaurfangBoss->AI()->DoAction(ACTION_MAGE_DIE);
  2467. +                    }
  2468. +                 }
  2469. +                
  2470. +                 if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  2471. +                 {
  2472. +                     if (me->GetGUID() == _instance->GetData64(DATA_GB_BATTLE_MAGE))
  2473. +                     {
  2474. +                         if (Creature* pMuradin = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_GB_MURADIN_BRONZEBEARD)))
  2475. +                             pMuradin->AI()->DoAction(ACTION_MAGE_DIE);
  2476. +                     }
  2477. +                 }
  2478. +            }
  2479. +
  2480. +            void UpdateAI(const uint32 diff)
  2481. +            {
  2482. +                if(_instance->GetBossState(DATA_GUNSHIP_EVENT) != IN_PROGRESS)
  2483. +                    return;
  2484. +
  2485. +                if (me->HasUnitState(UNIT_STAT_CASTING))
  2486. +                    return;
  2487. +                    
  2488. +                if (me->GetGUID() == _instance->GetData64(DATA_GB_BATTLE_MAGE))
  2489. +                {
  2490. +                    if( timer_BelowZero <= diff)
  2491. +                    {
  2492. +                        me->AI()->DoAction(EVENT_FREEZE_CANNON);
  2493. +                        timer_BelowZero = urand(10000, 15000);
  2494. +                    } else timer_BelowZero -= diff;
  2495. +                }
  2496. +                else
  2497. +                {
  2498. +                    DoCast(me,SPELL_SHADOW_CHANNELING);
  2499. +                }
  2500. +            }
  2501. +                uint32 timer_BelowZero;
  2502. +            private:
  2503. +                EventMap events;
  2504. +                InstanceScript* _instance;
  2505. +        };
  2506. +
  2507. +        CreatureAI* GetAI(Creature* pCreature) const
  2508. +        {
  2509. +            return new npc_gunship_mageAI(pCreature);
  2510. +        }
  2511. +};
  2512. +
  2513. +/* Gunship Cannon (Horde / Ally) */
  2514. +class npc_gunship_cannon : public CreatureScript
  2515. +{
  2516. +    public:
  2517. +        npc_gunship_cannon() : CreatureScript("npc_gunship_cannon") { }
  2518. +
  2519. +        struct npc_gunship_cannonAI : public ScriptedAI
  2520. +        {
  2521. +            npc_gunship_cannonAI(Creature *creature) : ScriptedAI(creature) { }
  2522. +
  2523. +            void Reset()
  2524. +            {
  2525. +                me->SetReactState(REACT_PASSIVE);
  2526. +                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  2527. +                DoCast(me, SPELL_HEAT_DRAIN, true);
  2528. +            }
  2529. +
  2530. +            void SpellHit(Unit* /*caster*/, SpellInfo const* spellEntry)
  2531. +            {
  2532. +                if (spellEntry->Id == SPELL_BELOW_ZERO)
  2533. +                    me->GetVehicleKit()->RemoveAllPassengers();
  2534. +            }
  2535. +
  2536. +            void DamageTaken(Unit* attacker, uint32& damage)
  2537. +            {
  2538. +                if(me->GetEntry() == NPC_GB_ALLIANCE_CANON)
  2539. +                {
  2540. +                    if (Creature* pAllianceBoss = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(DATA_SKYBREAKER_BOSS)))
  2541. +                        attacker->DealDamage(pAllianceBoss, damage);
  2542. +                }
  2543. +
  2544. +                if(me->GetEntry() == NPC_GB_HORDE_CANON)
  2545. +                {
  2546. +                    if (Creature* pHordeBoss = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(DATA_ORGRIMMAR_HAMMER_BOSS)))
  2547. +                        attacker->DealDamage(pHordeBoss, damage);
  2548. +                }
  2549. +            }
  2550. +
  2551. +            void UpdateAI(const uint32 diff)
  2552. +            {
  2553. +                if(me->HasAura(SPELL_BELOW_ZERO))
  2554. +                {
  2555. +                    me->RemoveAurasByType(SPELL_AURA_CONTROL_VEHICLE);
  2556. +                    me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
  2557. +                  
  2558. +                    if (Vehicle* veh = me->GetVehicleKit())
  2559. +                        veh->RemoveAllPassengers();
  2560. +                }
  2561. +                else
  2562. +                {
  2563. +                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
  2564. +                }
  2565. +            }
  2566. +
  2567. +        };
  2568. +
  2569. +        CreatureAI* GetAI(Creature* pCreature) const
  2570. +        {
  2571. +            return new npc_gunship_cannonAI(pCreature);
  2572. +        }
  2573. +};
  2574. +
  2575. +class npc_mortar_soldier_or_rocketeer : public CreatureScript
  2576. +{
  2577. +    public:
  2578. +        npc_mortar_soldier_or_rocketeer() : CreatureScript("npc_mortar_soldier_or_rocketeer") { }
  2579. +
  2580. +        struct npc_mortar_soldier_or_rocketeerAI : public Scripted_NoMovementAI
  2581. +        {
  2582. +            npc_mortar_soldier_or_rocketeerAI(Creature *creature) : Scripted_NoMovementAI(creature),_instance(creature->GetInstanceScript())
  2583. +            {
  2584. +                Reset();
  2585. +            }
  2586. +
  2587. +            void Reset()
  2588. +            {
  2589. +                ScriptedAI::Reset();
  2590. +                me->RemoveAurasDueToSpell(SPELL_EXPERIENCED);
  2591. +                me->RemoveAurasDueToSpell(SPELL_ELITE);
  2592. +                me->RemoveAurasDueToSpell(SPELL_VETERAN);
  2593. +                events.ScheduleEvent(EVENT_EXPERIENCED, urand(19000, 21000)); // ~20 sec
  2594. +                events.ScheduleEvent(EVENT_VETERAN, urand(39000, 41000));     // ~40 sec
  2595. +                events.ScheduleEvent(EVENT_ELITE, urand(59000, 61000));       // ~60 sec
  2596. +                events.ScheduleEvent(EVENT_ROCKET_ART, urand(10000, 15000));   // ~12 sec
  2597. +            }
  2598. +
  2599. +            void JustDied(Unit* killer)
  2600. +            {
  2601. +                if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
  2602. +                {
  2603. +                    if (Creature* pSaurfangBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_GB_HIGH_OVERLORD_SAURFANG)))
  2604. +                        pSaurfangBoss->AI()->DoAction(ACTION_ROCK_DIE);
  2605. +                }
  2606. +                if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  2607. +                {
  2608. +                    if (Creature* pMuradin = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_GB_MURADIN_BRONZEBEARD)))
  2609. +                        pMuradin->AI()->DoAction(ACTION_ROCK_DIE);
  2610. +                }
  2611. +            }
  2612. +
  2613. +            void UpdateAI(const uint32 diff)
  2614. +            {
  2615. +                if(_instance->GetBossState(DATA_GUNSHIP_EVENT) != IN_PROGRESS)
  2616. +                    return;
  2617. +
  2618. +                if (me->HasUnitState(UNIT_STAT_CASTING))
  2619. +                    return;
  2620. +                    
  2621. +                events.Update(diff);
  2622. +
  2623. +                while (uint32 eventId = events.ExecuteEvent())
  2624. +                {
  2625. +                    switch (eventId)
  2626. +                    {
  2627. +                        case EVENT_EXPERIENCED:
  2628. +                            DoCast(me, SPELL_EXPERIENCED);
  2629. +                            break;
  2630. +                        case EVENT_VETERAN:
  2631. +                            me->RemoveAurasDueToSpell(SPELL_EXPERIENCED);
  2632. +                            DoCast(me, SPELL_VETERAN);
  2633. +                            break;
  2634. +                        case EVENT_ELITE:
  2635. +                            me->RemoveAurasDueToSpell(SPELL_VETERAN);
  2636. +                            DoCast(me, SPELL_ELITE);
  2637. +                            break;
  2638. +                        case EVENT_ROCKET_ART:
  2639. +                            if(Player* target = SelectRandomPlayerInTheMaps(me->GetMap()))
  2640. +                            {
  2641. +                                if(me->GetEntry() == NPC_GB_KORKRON_ROCKETEER && target->HasAura(SPELL_ON_SKYBREAKERS_DECK))
  2642. +                                {
  2643. +                                    me->CastSpell(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), SPELL_ROCKET_ARTILLERY_TRIGGERED, true);
  2644. +                                    me->CastSpell(target, 69400, true);
  2645. +                                }
  2646. +                                else if(me->GetEntry() == NPC_GB_SKYBREAKER_MORTAR_SOLDIER && target->HasAura(SPELL_ON_ORGRIMS_HAMMERS_DECK))
  2647. +                                {
  2648. +                                    me->CastSpell(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), SPELL_ROCKET_ARTILLERY_TRIGGERED, true);
  2649. +                                    me->CastSpell(target, 70173, true);
  2650. +                                }
  2651. +                            }
  2652. +                            events.ScheduleEvent(EVENT_ROCKET_ART, urand(10000, 15000));   // ~12 sec
  2653. +                            break;
  2654. +                        default:
  2655. +                            break;
  2656. +                    }
  2657. +                }
  2658. +            }
  2659. +
  2660. +            private:
  2661. +                EventMap events;
  2662. +                InstanceScript* _instance;
  2663. +        };
  2664. +
  2665. +        CreatureAI* GetAI(Creature* pCreature) const
  2666. +        {
  2667. +            return new npc_mortar_soldier_or_rocketeerAI(pCreature);
  2668. +        }
  2669. +};
  2670. +
  2671. +class npc_zafod_boombox : public CreatureScript
  2672. +{
  2673. +    public:
  2674. +        npc_zafod_boombox() : CreatureScript("npc_zafod_boombox") { }
  2675. +
  2676. +        bool OnGossipHello(Player* pPlayer, Creature* pCreature)
  2677. +        {
  2678. +            // Maybe this isn't blizzlike but I can't find any spell in the DBCs
  2679. +            if (pPlayer->GetItemCount(49278, false) == 0)
  2680. +                pPlayer->ADD_GOSSIP_ITEM(0, "Yeah, I'm sure safety is your top priority. Give me a rocket pack.", 631, 1);
  2681. +            pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
  2682. +            return true;
  2683. +        }
  2684. +
  2685. +        bool OnGossipSelect(Player* player, Creature* pCreature, uint32 /*sender*/, uint32 action)
  2686. +        {
  2687. +            player->PlayerTalkClass->ClearMenus();
  2688. +            player->CLOSE_GOSSIP_MENU();
  2689. +            if (action == 1)
  2690. +            {
  2691. +                // Seurity, this shouldn't happen. Maybe useless.
  2692. +                uint32 curItemCount = player->GetItemCount(49278, false);
  2693. +                if (curItemCount >= 1)
  2694. +                {
  2695. +                    pCreature->MonsterWhisper("You already have my rocket pack!", player->GetGUIDLow());
  2696. +                    return false;
  2697. +                }
  2698. +
  2699. +                ItemPosCountVec dest;
  2700. +                uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, 49278, 1);
  2701. +                if (msg == EQUIP_ERR_OK)
  2702. +                {
  2703. +                    Item* item = player->StoreNewItem(dest, 49278, true);
  2704. +                    player->SendNewItem(item, 1, true, false);
  2705. +                }
  2706. +                else
  2707. +                {
  2708. +                    pCreature->MonsterWhisper("You don't have any empty space for my rocket pack!", player->GetGUIDLow());
  2709. +                    return false;
  2710. +                }
  2711. +            }
  2712. +
  2713. +            return true;
  2714. +        }
  2715. +};
  2716. +
  2717. +//
  2718. +class npc_saurfang_gunship : public CreatureScript
  2719. +{
  2720. +    public:
  2721. +        npc_saurfang_gunship() : CreatureScript("npc_saurfang_gunship") { }
  2722. +
  2723. +        bool OnGossipHello(Player* player, Creature* pCreature)
  2724. +        {
  2725. +            InstanceScript* pInstance = pCreature->GetInstanceScript();
  2726. +            if (pInstance && pInstance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  2727. +            {
  2728. +                if ((!player->GetGroup() || !player->GetGroup()->IsLeader(player->GetGUID())) && !player->isGameMaster())
  2729. +                {
  2730. +                    player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "I'm not the raid leader...", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
  2731. +                    player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, pCreature->GetGUID());
  2732. +                    return true;
  2733. +                }
  2734. +
  2735. +                player->ADD_GOSSIP_ITEM(0, "My companions are all accounted for, Saurfang. Let's go!", 631, 1001);
  2736. +                player->SEND_GOSSIP_MENU(player->GetGossipTextId(pCreature), pCreature->GetGUID());
  2737. +                return true;
  2738. +            }
  2739. +            return false;
  2740. +        }
  2741. +
  2742. +        bool OnGossipSelect(Player* player, Creature* pCreature, uint32 /*sender*/, uint32 action)
  2743. +        {
  2744. +            InstanceScript* instance = pCreature->GetInstanceScript();
  2745. +            player->PlayerTalkClass->ClearMenus();
  2746. +            player->CLOSE_GOSSIP_MENU();
  2747. +
  2748. +            if (action == GOSSIP_ACTION_INFO_DEF+2)
  2749. +                pCreature->MonsterSay("I'll wait for the raid leader.", LANG_UNIVERSAL, player->GetGUID());
  2750. +
  2751. +            if (action == 1001)
  2752. +            {
  2753. +                pCreature->AI()->DoAction(ACTION_INTRO_START);
  2754. +                pCreature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
  2755. +            }
  2756. +            return true;
  2757. +        }
  2758. +        struct npc_saurfang_gunshipAI : public ScriptedAI
  2759. +        {
  2760. +            npc_saurfang_gunshipAI(Creature *creature) : ScriptedAI(creature),
  2761. +                _instance(creature->GetInstanceScript())
  2762. +            {
  2763. +            }
  2764. +
  2765. +            void Reset()
  2766. +            {
  2767. +                if (_instance->GetBossState(DATA_GUNSHIP_EVENT) == IN_PROGRESS)
  2768. +                    return;
  2769. +                me->SetReactState(REACT_PASSIVE);
  2770. +                me->setFaction(1801);
  2771. +                events.Reset();
  2772. +                map = me->GetMap();
  2773. +                orgrimmar = me->GetTransport();
  2774. +                RocketerDieCount = 0;
  2775. +                AxesDieCount = 0;
  2776. +                SummonCount = RAID_MODE(3, 5, 4, 6);
  2777. +                count = 0;
  2778. +                RocketerCount = RAID_MODE(2, 4, 2, 4);
  2779. +                AxesCount = RAID_MODE(4, 6, 4, 6);
  2780. +                EventScheduled = false;
  2781. +            }
  2782. +
  2783. +            void SendMusicToPlayers(uint32 musicId) const
  2784. +            {
  2785. +                WorldPacket data(SMSG_PLAY_MUSIC, 4);
  2786. +                data << uint32(musicId);
  2787. +                SendPacketToPlayers(&data);
  2788. +            }
  2789. +
  2790. +            // Send packet to all players
  2791. +            void SendPacketToPlayers(WorldPacket const* data) const
  2792. +            {
  2793. +                Map::PlayerList const& players = me->GetMap()->GetPlayers();
  2794. +                if (!players.isEmpty())
  2795. +                    for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
  2796. +                        if (Player* player = itr->getSource())
  2797. +                            player->GetSession()->SendPacket(data);
  2798. +            }
  2799. +
  2800. +            bool CanAIAttack(Unit const* target) const
  2801. +            {
  2802. +                if (target->GetEntry() == NPC_GB_SKYBREAKER_SERGANTE || target->GetEntry() == NPC_GB_SKYBREAKER_MARINE)
  2803. +                    return true;
  2804. +
  2805. +                return false;
  2806. +            }
  2807. +
  2808. +            void DoAction(int32 const action)
  2809. +            {
  2810. +                switch (action)
  2811. +                {
  2812. +                     case ACTION_INTRO_START:
  2813. +                         events.ScheduleEvent(EVENT_INTRO_HORDE_1, 1000);
  2814. +                         events.ScheduleEvent(EVENT_INTRO_HORDE_1_1, 11000);
  2815. +                         events.ScheduleEvent(EVENT_START_FLY, 5000);
  2816. +                         events.ScheduleEvent(EVENT_INTRO_HORDE_2, 32000);
  2817. +                         events.ScheduleEvent(EVENT_INTRO_HORDE_3, 51000);
  2818. +                         events.ScheduleEvent(EVENT_INTRO_HORDE_4, 57000);
  2819. +                         events.ScheduleEvent(EVENT_INTRO_HORDE_5, 62000);
  2820. +                         break;
  2821. +                     case ACTION_BATTLE_EVENT:
  2822. +                     {
  2823. +                         if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  2824. +                             events.ScheduleEvent(EVENT_WIPE_CHECK, 5000);
  2825. +
  2826. +                         Creature* pHordeBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ORGRIMMAR_HAMMER_BOSS));
  2827. +                         Creature* pAllianceBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_SKYBREAKER_BOSS));
  2828. +
  2829. +                         if (pHordeBoss && pAllianceBoss)
  2830. +                         {
  2831. +                             me->SetReactState(REACT_AGGRESSIVE);
  2832. +                             pHordeBoss->SetInCombatWith(pAllianceBoss);
  2833. +                             pAllianceBoss->SetInCombatWith(pHordeBoss);
  2834. +                             pAllianceBoss->AddThreat(pHordeBoss, 0.0f);
  2835. +                             pHordeBoss->AddThreat(pAllianceBoss, 0.0f);
  2836. +                             _instance->SetBossState(DATA_GUNSHIP_EVENT, IN_PROGRESS);
  2837. +                             events.ScheduleEvent(EVENT_SUMMON_PORTAL, 30000);
  2838. +                             RelocateTransport(orgrimmar);
  2839. +                             RelocateTransport(CheckUnfriendlyShip(me,_instance, DATA_GB_MURADIN_BRONZEBEARD));
  2840. +                         }
  2841. +                         else
  2842. +                             me->AI()->DoAction(ACTION_FAIL);
  2843. +                         break;
  2844. +                     }
  2845. +                     case ACTION_DONE:
  2846. +                         if (Creature* pAllianceBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_SKYBREAKER_BOSS)))
  2847. +                         {
  2848. +                             _instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, pAllianceBoss);
  2849. +                         }
  2850. +                         if (Creature* pHordeBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ORGRIMMAR_HAMMER_BOSS)))
  2851. +                         {
  2852. +                             _instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, pHordeBoss);
  2853. +                         }
  2854. +
  2855. +                         me->SetReactState(REACT_PASSIVE);
  2856. +                         _instance->SetBossState(DATA_GUNSHIP_EVENT, DONE);
  2857. +                         _instance->DoCastSpellOnPlayers(SPELL_REMOVE_ROCKET_PACK);
  2858. +                         Talk(SAY_HORDE_VICTORY);
  2859. +                         StartFlyShip(CheckUnfriendlyShip(me, _instance, DATA_GB_MURADIN_BRONZEBEARD));
  2860. +                         StopFight(orgrimmar,CheckUnfriendlyShip(me,_instance, DATA_GB_MURADIN_BRONZEBEARD));
  2861. +                         events.CancelEvent(EVENT_WIPE_CHECK);
  2862. +                         events.ScheduleEvent(EVENT_OUTRO_HORDE_1, 3500);
  2863. +                         events.ScheduleEvent(EVENT_OUTRO_HORDE_2, 21000);
  2864. +                         events.ScheduleEvent(EVENT_OUTRO_HORDE_3, 32000);
  2865. +                         break;
  2866. +                     case ACTION_FAIL:
  2867. +                         events.CancelEvent(EVENT_WIPE_CHECK);
  2868. +                         Talk(SAY_HORDE_DEFEAT);
  2869. +                         if (Creature* pHordeBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ORGRIMMAR_HAMMER_BOSS)))
  2870. +                         {
  2871. +                             _instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, pHordeBoss);
  2872. +                         }
  2873. +                         if (Creature* pAllianceBoss = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_SKYBREAKER_BOSS)))
  2874. +                         {
  2875. +                             _instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, pAllianceBoss);
  2876. +                         }
  2877. +                         StopFight(orgrimmar,CheckUnfriendlyShip(me,_instance, DATA_GB_MURADIN_BRONZEBEARD));
  2878. +                         events.ScheduleEvent(EVENT_FAIL, 10000);
  2879. +                         break;
  2880. +                     case ACTION_MAGE_DIE:
  2881. +                         events.ScheduleEvent(EVENT_SPAWN_MAGE, 60000);
  2882. +                         break;
  2883. +                     case ACTION_ROCK_DIE:
  2884. +                         ++RocketerDieCount;
  2885. +                         if(RocketerDieCount == RocketerCount)
  2886. +                             events.ScheduleEvent(EVENT_RESPAWN_ROCKETEER, 60000);
  2887. +                         break;
  2888. +                     case ACTION_AXES_RIFL_DIE:
  2889. +                         ++AxesDieCount;
  2890. +                         if(AxesDieCount == AxesCount)
  2891. +                             events.ScheduleEvent(EVENT_RESPAWN_AXES_RIFLEMEN, 60000);
  2892. +                         break;
  2893. +                 }
  2894. +            }
  2895. +
  2896. +            void DamageTaken(Unit* /*attacker*/, uint32& damage)
  2897. +            {
  2898. +                if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE && me->GetHealthPct() < 2.0f )
  2899. +                {
  2900. +                    damage = 0;
  2901. +                }
  2902. +                
  2903. +                if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE && me->GetHealthPct() < 2.0f )
  2904. +                {
  2905. +                    damage = 0;
  2906. +                    me->AI()->DoAction(ACTION_FAIL);
  2907. +                }
  2908. +            }
  2909. +
  2910. +            void MovementInform(uint32 type, uint32 pointId)
  2911. +            {
  2912. +                if (type != POINT_MOTION_TYPE)
  2913. +                    return;
  2914. +
  2915. +                if (pointId = 1)
  2916. +                    me->DespawnOrUnsummon(1000);
  2917. +            }
  2918. +
  2919. +            void UpdateAI(const uint32 diff)
  2920. +            {
  2921. +                if (me->HasUnitState(UNIT_STAT_CASTING))
  2922. +                    return;
  2923. +                    
  2924. +                if(_instance->GetBossState(DATA_GUNSHIP_EVENT) == IN_PROGRESS)
  2925. +                {
  2926. +                    if (!HealthAbovePct(75))
  2927. +                    {
  2928. +                        me->SetHealth(me->GetMaxHealth() / 100 * 76); // find a better way to avoid the hardcore spell spam ....
  2929. +                        DoCast(me, SPELL_TASTE_OF_BLOOD);
  2930. +                    }
  2931. +
  2932. +                    if (UpdateVictim())
  2933. +                    {
  2934. +                        if (!EventScheduled)
  2935. +                        {
  2936. +                            events.ScheduleEvent(EVENT_RENDING_THROW, 1500);
  2937. +                            EventScheduled = true;
  2938. +                        }
  2939. +                    }
  2940. +                }
  2941. +
  2942. +                events.Update(diff);
  2943. +
  2944. +                while (uint32 eventId = events.ExecuteEvent())
  2945. +                {
  2946. +                    switch (eventId)
  2947. +                    {
  2948. +                        case EVENT_WIPE_CHECK:
  2949. +                            DoCheckFallingPlayer(me);
  2950. +                            if (DoWipeCheck(orgrimmar))
  2951. +                                events.ScheduleEvent(EVENT_WIPE_CHECK, 3000);
  2952. +                            else
  2953. +                                me->AI()->DoAction(ACTION_FAIL);
  2954. +                            break;
  2955. +                        case EVENT_INTRO_HORDE_1:
  2956. +                            Talk(SAY_INTRO_HORDE_0);
  2957. +                            StartFlyShip(orgrimmar);
  2958. +                            break;
  2959. +                        case EVENT_INTRO_HORDE_1_1:
  2960. +                            Talk(SAY_INTRO_HORDE_0_1);
  2961. +                            break;
  2962. +                        case EVENT_START_FLY:
  2963. +                            break;
  2964. +                        case EVENT_INTRO_HORDE_2:
  2965. +                            StopFlyShip(orgrimmar);
  2966. +                            StartFlyShip(CheckUnfriendlyShip(me, _instance, DATA_GB_MURADIN_BRONZEBEARD));
  2967. +                            Talk(SAY_INTRO_HORDE_1);
  2968. +                            break;
  2969. +                        case EVENT_INTRO_HORDE_3:
  2970. +                            StopFlyShip(CheckUnfriendlyShip(me, _instance, DATA_GB_MURADIN_BRONZEBEARD));
  2971. +                            Talk(SAY_INTRO_HORDE_2);
  2972. +                            break;
  2973. +                        case EVENT_INTRO_HORDE_4:
  2974. +                            SendMusicToPlayers(17289);
  2975. +                            me->AI()->DoAction(ACTION_BATTLE_EVENT);
  2976. +                            if (Creature* pMuradin = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MURADIN_BRONZEBEARD_NOT_VISUAL)))
  2977. +                            {
  2978. +                                pMuradin->AI()->Talk(SAY_MURADIN_BRONZEBEARD_NOT_VISUAL);
  2979. +                                pMuradin->SetReactState(REACT_PASSIVE);
  2980. +                                pMuradin->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  2981. +                            }
  2982. +                            break;
  2983. +                        case EVENT_INTRO_HORDE_5:
  2984. +                            Talk(SAY_INTRO_HORDE_4);
  2985. +                            break;
  2986. +                        case EVENT_SUMMON_PORTAL:
  2987. +                            orgrimmar->AddNPCPassengerInInstance(NPC_GB_PORTAL, 15.03016f, -7.00016f, 37.70952f, 1.55138f);
  2988. +                            CheckUnfriendlyShip(me, _instance, DATA_MURADIN_BRONZEBEARD_NOT_VISUAL)->AddNPCPassengerInInstance(NPC_GB_PORTAL, 3.51547f, -0.160213f, 20.87252f, 3.05033f);
  2989. +                            events.ScheduleEvent(EVENT_BOARDING_TALK, 10000);
  2990. +                            events.ScheduleEvent(EVENT_BOARDING_GUNSHIP, 2500); // TODO: Fix the timers
  2991. +                            break;
  2992. +                        case EVENT_BOARDING_TALK:
  2993. +                            Talk(SAY_BOARDING_ORGRIMS_HAMMER_1);
  2994. +                            break;
  2995. +                        case EVENT_BOARDING_GUNSHIP:
  2996. +                             count = 0;
  2997. +                             if (Creature* pSaurfang = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MURADIN_BRONZEBEARD_NOT_VISUAL)))
  2998. +                             {
  2999. +                                 pSaurfang->AI()->Talk(SAY_BOARDING_SKYBREAKER_MURADIN);
  3000. +                             }
  3001. +                             if (Creature* Sergante = orgrimmar->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_SERGANTE, 15.03016f, -7.00016f, 37.70952f, 1.55138f))
  3002. +                             {
  3003. +                                 Sergante->CastSpell(Sergante, SPELL_TELEPORT_VISUAL, true);
  3004. +                             }
  3005. +                             events.ScheduleEvent(EVENT_BOARDING_REAVERS_MARINE, 3000);
  3006. +                             events.ScheduleEvent(EVENT_SUMMON_PORTAL, 90000);
  3007. +                            break;
  3008. +                        case EVENT_BOARDING_REAVERS_MARINE:
  3009. +                            if(count <= SummonCount)
  3010. +                            {
  3011. +                                if(Creature* Marine = orgrimmar->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MARINE, 15.03016f, -7.00016f, 37.70952f, 1.55138f))
  3012. +                                {
  3013. +                                    Marine->CastSpell(Marine, SPELL_TELEPORT_VISUAL, true);
  3014. +                                    count++;
  3015. +                                    events.ScheduleEvent(EVENT_BOARDING_REAVERS_MARINE, 2500);
  3016. +                                }
  3017. +                            }
  3018. +                            break;
  3019. +                        case EVENT_OUTRO_HORDE_1:
  3020. +//                            _instance->DoCompleteAchievement(RAID_MODE(IM_ON_A_BOAT_10,IM_ON_A_BOAT_25,IM_ON_A_BOAT_10,IM_ON_A_BOAT_25));
  3021. +                            _instance->DoCastSpellOnPlayers(SPELL_ACHIEVEMENT_CHECK);
  3022. +                            StartFlyShip(orgrimmar);
  3023. +                            StopFlyShip(CheckUnfriendlyShip(me,_instance,DATA_GB_MURADIN_BRONZEBEARD));
  3024. +                            break;
  3025. +                        case EVENT_OUTRO_HORDE_2:
  3026. +                            StopFlyShip(orgrimmar);
  3027. +                            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);
  3028. +                            me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
  3029. +                            me->GetMotionMaster()->MovePoint(0, -590.700f, 2213.01f, 539.1f);
  3030. +                            break;
  3031. +                        case EVENT_OUTRO_HORDE_3:
  3032. +                            me->GetMotionMaster()->MovePoint(1, -555.59f, 2213.01f, 539.28f);
  3033. +                            break;
  3034. +                        case EVENT_FAIL:
  3035. +                            TeleportPlayers(map, HORDE);
  3036. +                            events.ScheduleEvent(EVENT_RESTART_EVENT, 2000);
  3037. +                            _instance->SetBossState(DATA_GUNSHIP_EVENT, NOT_STARTED);
  3038. +                            break;
  3039. +                        case EVENT_RESTART_EVENT:
  3040. +                            _instance->SetBossState(DATA_GUNSHIP_EVENT, FAIL);
  3041. +                            RestartEvent(orgrimmar, CheckUnfriendlyShip(me,_instance,DATA_GB_MURADIN_BRONZEBEARD), map, HORDE);
  3042. +                            break;
  3043. +                        case EVENT_RENDING_THROW:
  3044. +                            if (UpdateVictim())
  3045. +                                if (me->getVictim()->IsWithinDistInMap(me, 50.0f, false)) // Todo: Fix the distance
  3046. +                                {
  3047. +                                    DoCastVictim(SPELL_RENDING_THROW);
  3048. +                                    EventScheduled = false;
  3049. +                               }
  3050. +                               else
  3051. +                                   events.CancelEvent(EVENT_RENDING_THROW);
  3052. +                            break;
  3053. +                        case EVENT_SPAWN_MAGE:
  3054. +                               Talk(SAY_NEW_BATTLE_MAGE_SPAWNED);
  3055. +                               orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_BATTLE_MAGE, 15.03016f, 0.00016f, 37.70952f, 1.55138f);
  3056. +                            break;
  3057. +                        case EVENT_RESPAWN_ROCKETEER:
  3058. +                            Talk(SAY_NEW_ROCKETEERS_SPAWNED);
  3059. +                            if(RocketerCount == 2)
  3060. +                            {
  3061. +                                orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, -11.44849f, -25.71838f, 33.64343f, 1.49248f);
  3062. +                                orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, 12.30336f, -25.69653f, 35.32373f, 1.49248f);
  3063. +                            }
  3064. +                            if(RocketerCount == 4)
  3065. +                            {
  3066. +                                orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, -11.44849f, -25.71838f, 33.64343f, 1.49248f);
  3067. +                                orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, 12.30336f, -25.69653f, 35.32373f, 1.49248f);
  3068. +                                orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, -3.44849f, -25.71838f, 34.21082f, 1.49248f);
  3069. +                                orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, 3.30336f, -25.69653f, 35.32373f, 1.49248f);
  3070. +                            }
  3071. +                            break;
  3072. +                         case EVENT_RESPAWN_AXES_RIFLEMEN:
  3073. +                            Talk(SAY_NEW_AXETHROWER_SPAWNED);
  3074. +                            if(AxesCount == 4)
  3075. +                            {
  3076. +                                orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -3.170555f, 28.30652f, 34.21082f, 1.66527f);
  3077. +                                orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -12.0928f, 27.65942f, 33.58557f, 1.66527f);
  3078. +                                orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 14.92804f, 26.18018f, 35.47803f, 1.66527f);
  3079. +                                orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 24.70331f, 25.36584f, 35.97845f, 1.66527f);
  3080. +                            }
  3081. +                            if(AxesCount == 6)
  3082. +                            {
  3083. +                                orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -3.170555f, 28.30652f, 34.21082f, 1.66527f);
  3084. +                                orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -12.0928f, 27.65942f, 33.58557f, 1.66527f);
  3085. +                                orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 14.92804f, 26.18018f, 35.47803f, 1.66527f);
  3086. +                                orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 24.70331f, 25.36584f, 35.97845f, 1.66527f);
  3087. +                                orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 19.92804f, 27.18018f, 35.47803f, 1.66527f);
  3088. +                                orgrimmar->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -7.70331f, 28.36584f, 33.88557f, 1.66527f);
  3089. +                           }
  3090. +                           break;
  3091. +                      }
  3092. +                }
  3093. +
  3094. +                if (!me->GetCurrentSpell(CURRENT_MELEE_SPELL))
  3095. +                    DoCastVictim(SPELL_CLEAVE);
  3096. +
  3097. +                DoMeleeAttackIfReady();
  3098. +            }
  3099. +
  3100. +
  3101. +            private:
  3102. +                Transport* orgrimmar;
  3103. +                uint32 RocketerDieCount;
  3104. +                uint32 AxesDieCount;
  3105. +                uint32 RocketerCount;
  3106. +                uint32 AxesCount;
  3107. +                uint32 SummonCount;
  3108. +                uint32 count;
  3109. +                bool EventScheduled;
  3110. +                Map* map;
  3111. +                EventMap events;
  3112. +                InstanceScript* _instance;
  3113. +        };
  3114. +
  3115. +        CreatureAI* GetAI(Creature* pCreature) const
  3116. +        {
  3117. +            return new npc_saurfang_gunshipAI(pCreature);
  3118. +        }
  3119. +};
  3120. +
  3121. +class npc_gunship_portal : public CreatureScript
  3122. +{
  3123. +    public:
  3124. +        npc_gunship_portal() : CreatureScript("npc_gunship_portal") { }
  3125. +
  3126. +        struct npc_gunship_portalAI : public Scripted_NoMovementAI
  3127. +        {
  3128. +            npc_gunship_portalAI(Creature *creature) : Scripted_NoMovementAI(creature),_instance(creature->GetInstanceScript())
  3129. +            {
  3130. +                Reset();
  3131. +            }
  3132. +
  3133. +            void Reset()
  3134. +            {
  3135. +               events.ScheduleEvent(EVENT_UNSUMMON_PORTAL, 20500); // TODO: Fix the timers
  3136. +               me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
  3137. +            }
  3138. +
  3139. +            void JustDied(Unit* killer)
  3140. +            {
  3141. +                me->RemoveFromWorld();
  3142. +            }
  3143. +
  3144. +            void UpdateAI( const uint32 diff)
  3145. +            {
  3146. +
  3147. +             events.Update(diff);
  3148. +
  3149. +                while (uint32 eventId = events.ExecuteEvent())
  3150. +                {
  3151. +                    switch (eventId)
  3152. +                    {
  3153. +                        case EVENT_UNSUMMON_PORTAL:
  3154. +                            me->RemoveFromWorld();
  3155. +                            break;
  3156. +                    }
  3157. +                }
  3158. +            }
  3159. +
  3160. +    private:
  3161. +        EventMap events;
  3162. +        InstanceScript* _instance;
  3163. +
  3164. +        };
  3165. +
  3166. +        CreatureAI* GetAI(Creature* pCreature) const
  3167. +        {
  3168. +            return new npc_gunship_portalAI(pCreature);
  3169. +        }
  3170. +};
  3171. +
  3172. +
  3173. +class npc_gunship_trigger : public CreatureScript
  3174. +{
  3175. +    public:
  3176. +        npc_gunship_trigger() : CreatureScript("npc_gunship_trigger") { }
  3177. +
  3178. +        struct npc_gunship_triggerAI : public Scripted_NoMovementAI
  3179. +        {
  3180. +            npc_gunship_triggerAI(Creature *creature) : Scripted_NoMovementAI(creature),_instance(creature->GetInstanceScript())
  3181. +            {
  3182. +
  3183. +                Reset();
  3184. +            }
  3185. +
  3186. +            void Reset()
  3187. +            {
  3188. +                ScriptedAI::Reset();
  3189. +                me->SetReactState(REACT_PASSIVE);
  3190. +                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  3191. +            }
  3192. +
  3193. +            void EnterCombat(Unit* /*who*/)
  3194. +            {
  3195. +                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
  3196. +                SetCombatMovement(false);
  3197. +            }
  3198. +
  3199. +            void DamageTaken(Unit* attacker, uint32& damage)
  3200. +            {
  3201. +                damage = 0;
  3202. +            }
  3203. +
  3204. +            void UpdateAI(const uint32 diff)
  3205. +            {
  3206. +
  3207. +            }
  3208. +
  3209. +            private:
  3210. +                EventMap events;
  3211. +                InstanceScript* _instance;
  3212. +        };
  3213. +
  3214. +        CreatureAI* GetAI(Creature* pCreature) const
  3215. +        {
  3216. +            return new npc_gunship_triggerAI(pCreature);
  3217. +        }
  3218. +};
  3219. +
  3220. +/* ----------------------------------- Rampart of Skulls NPCs ----------------------------------- */
  3221. +
  3222. +/* Kor'kron Primalist  37030*/
  3223. +class npc_korkron_primalist: public CreatureScript
  3224. +{
  3225. +    public:
  3226. +        npc_korkron_primalist() : CreatureScript("npc_korkron_primalist") { }
  3227. +
  3228. +        struct npc_korkron_primalistAI : public ScriptedAI
  3229. +        {
  3230. +            npc_korkron_primalistAI(Creature* creature) : ScriptedAI(creature)
  3231. +            {
  3232. +                instance = creature->GetInstanceScript();
  3233. +            }
  3234. +
  3235. +            void Reset()
  3236. +            {
  3237. +                _started = instance->GetBossState(DATA_GUNSHIP_EVENT) == DONE;
  3238. +                events.Reset();
  3239. +                events.ScheduleEvent(EVENT_WRATH, 10000); // TODO: Fix the timers
  3240. +                events.ScheduleEvent(EVENT_HEAL, 20000); // TODO: Fix the timers
  3241. +            }
  3242. +
  3243. +            void MoveInLineOfSight(Unit* who)
  3244. +            {
  3245. +                if (!instance)
  3246. +                    return;
  3247. +
  3248. +                if (instance->GetData(DATA_TEAM_IN_INSTANCE) != HORDE)
  3249. +                    return;
  3250. +
  3251. +                if (who->GetTypeId() != TYPEID_PLAYER)
  3252. +                    return;
  3253. +
  3254. +                if (instance->GetData(DATA_FIRST_SQUAD_STATE) == DONE)
  3255. +                    return;
  3256. +
  3257. +                if (!_started && me->IsWithinDistInMap(who, 25.0f))
  3258. +                {
  3259. +                    _started = true;
  3260. +                    events.ScheduleEvent(EVENT_FIRST_SQUAD_ASSISTED_1, 1000);
  3261. +                    events.ScheduleEvent(EVENT_FIRST_SQUAD_ASSISTED_2, 15000); // TODO : fix the timer
  3262. +                }
  3263. +            }
  3264. +
  3265. +            void UpdateAI(const uint32 diff)
  3266. +            {
  3267. +                if (!instance)
  3268. +                    return;
  3269. +
  3270. +                if (me->HasUnitState(UNIT_STAT_CASTING))
  3271. +                    return;
  3272. +
  3273. +                events.Update(diff);
  3274. +
  3275. +                while (uint32 eventId = events.ExecuteEvent())
  3276. +                {
  3277. +                    switch (eventId)
  3278. +                    {
  3279. +                        case EVENT_FIRST_SQUAD_ASSISTED_1:
  3280. +                            Talk(SAY_FIRST_SQUAD_RESCUED_HORDE_0);
  3281. +                            break;
  3282. +                        case EVENT_FIRST_SQUAD_ASSISTED_2:
  3283. +                            if (Creature* tempUnit = me->FindNearestCreature(NPC_KORKRON_INVOKER, 120.0f, true))
  3284. +                            {
  3285. +                                tempUnit->AI()->Talk(SAY_FIRST_SQUAD_RESCUED_HORDE_1);
  3286. +                                tempUnit->AI()->Talk(SAY_SUMMON_BATTLE_STANDARD);
  3287. +                                tempUnit->CastSpell(tempUnit, SPELL_SUMMON_BATTLE_STANDART_H, true);
  3288. +                            }
  3289. +                            instance->SetData(DATA_FIRST_SQUAD_STATE, DONE);
  3290. +                            break;
  3291. +                        case EVENT_WRATH:
  3292. +                            if (UpdateVictim())
  3293. +                                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 10.0f))
  3294. +                                    DoCast(target, SPELL_WRATH);
  3295. +                            events.ScheduleEvent(EVENT_WRATH, 10000);
  3296. +                            break;
  3297. +                        case EVENT_HEAL:
  3298. +                            if (UpdateVictim())
  3299. +                            {
  3300. +                                std::list<Unit*> TargetList;
  3301. +                                Unit* finalTarget = me;
  3302. +                                Trinity::AnyFriendlyUnitInObjectRangeCheck checker(me, me, 30.0f);
  3303. +                                Trinity::UnitListSearcher<Trinity::AnyFriendlyUnitInObjectRangeCheck> searcher(me, TargetList, checker);
  3304. +                                me->VisitNearbyObject(30.0f, searcher);
  3305. +                                for (std::list<Unit*>::iterator itr = TargetList.begin(); itr != TargetList.end(); ++itr)
  3306. +                                    if ((*itr)->GetHealthPct() < finalTarget->GetHealthPct())
  3307. +                                        finalTarget = *itr;
  3308. +
  3309. +                                uint32 spellId = SPELL_HEALING_TOUCH;
  3310. +                                uint32 healthPct = uint32(finalTarget->GetHealthPct());
  3311. +                                if (healthPct > 15 && healthPct < 20)
  3312. +                                    spellId = (urand (0, 1) ? SPELL_REGROWTH : SPELL_HEALING_TOUCH);
  3313. +                                else if (healthPct >= 20 && healthPct < 40)
  3314. +                                    spellId = SPELL_REGROWTH;
  3315. +                                else if (healthPct > 40)
  3316. +                                    spellId = (urand(0, 1) ? SPELL_REJUVENATION : SPELL_REGROWTH);
  3317. +
  3318. +                                me->CastSpell(finalTarget, spellId, false);
  3319. +                                events.ScheduleEvent(EVENT_HEAL, 20000);
  3320. +                            }
  3321. +                            break;
  3322. +                    }
  3323. +                }
  3324. +
  3325. +                DoMeleeAttackIfReady();
  3326. +            }
  3327. +
  3328. +            private:
  3329. +                bool _started;
  3330. +                EventMap events;
  3331. +                InstanceScript* instance;
  3332. +        };
  3333. +
  3334. +        CreatureAI* GetAI(Creature* pCreature) const
  3335. +        {
  3336. +            return new npc_korkron_primalistAI(pCreature);
  3337. +        }
  3338. +};
  3339. +
  3340. +/* Kor'kron Defender  37032*/
  3341. +class npc_korkron_defender: public CreatureScript
  3342. +{
  3343. +    public:
  3344. +        npc_korkron_defender() : CreatureScript("npc_korkron_defender") { }
  3345. +
  3346. +        struct npc_korkron_defenderAI : public ScriptedAI
  3347. +        {
  3348. +            npc_korkron_defenderAI(Creature* creature) : ScriptedAI(creature)
  3349. +            {
  3350. +                instance = creature->GetInstanceScript();
  3351. +            }
  3352. +
  3353. +            void Reset()
  3354. +            {
  3355. +                events.Reset();
  3356. +                events.ScheduleEvent(EVENT_DEVASTATE, 10000);
  3357. +                events.ScheduleEvent(EVENT_THUNDERCLAP, 20000);
  3358. +                events.ScheduleEvent(EVENT_SPELL_REFLECT, 25000);
  3359. +                events.ScheduleEvent(EVENT_SUNDER_ARMOR, 15000);
  3360. +            }
  3361. +
  3362. +            void MoveInLineOfSight(Unit* who)
  3363. +            {
  3364. +                if (!instance)
  3365. +                    return;
  3366. +
  3367. +                if (instance->GetData(DATA_TEAM_IN_INSTANCE) != HORDE)
  3368. +                    return;
  3369. +
  3370. +                if (who->GetTypeId() != TYPEID_PLAYER)
  3371. +                    return;
  3372. +
  3373. +                if (me->IsWithinDistInMap(who, 25.0f))
  3374. +                {
  3375. +                    if (instance->GetData(DATA_FIRST_SQUAD_STATE) == DONE && instance->GetData(DATA_SECOND_SQUAD_STATE) != DONE)
  3376. +                    {
  3377. +                        instance->SetData(DATA_SECOND_SQUAD_STATE, DONE);
  3378. +                        events.ScheduleEvent(EVENT_SECOND_SQUAD_ASSISTED_1, 1000);
  3379. +                        events.ScheduleEvent(EVENT_SECOND_SQUAD_ASSISTED_2, 15000); // TODO : fix the timer
  3380. +                    }
  3381. +                }
  3382. +            }
  3383. +
  3384. +            void UpdateAI(const uint32 diff)
  3385. +            {
  3386. +                if (!instance)
  3387. +                    return;
  3388. +
  3389. +                if (me->HasUnitState(UNIT_STAT_CASTING))
  3390. +                    return;
  3391. +
  3392. +                events.Update(diff);
  3393. +
  3394. +                while (uint32 eventId = events.ExecuteEvent())
  3395. +                {
  3396. +                    switch (eventId)
  3397. +                    {
  3398. +                        case EVENT_SECOND_SQUAD_ASSISTED_1:
  3399. +                            Talk(SAY_SECOND_SQUAD_RESCUED_HORDE_0);
  3400. +                            break;
  3401. +                        case EVENT_SECOND_SQUAD_ASSISTED_2:
  3402. +                            Talk(SAY_SECOND_SQUAD_RESCUED_HORDE_1);
  3403. +                            Talk(SAY_FROSTWYRM_SUMMON_0);
  3404. +                            break;
  3405. +                        case EVENT_DEVASTATE:
  3406. +                            if (UpdateVictim())
  3407. +                            {
  3408. +                                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
  3409. +                                    DoCast(target, SPELL_DEVASTATE);
  3410. +                            }
  3411. +                            events.ScheduleEvent(EVENT_DEVASTATE, 10000);
  3412. +                            break;
  3413. +                        case EVENT_SPELL_REFLECT:
  3414. +                            if (UpdateVictim())
  3415. +                            {
  3416. +                                DoCast(me, SPELL_SPELL_REFLECT);
  3417. +                            }
  3418. +                            events.ScheduleEvent(EVENT_SPELL_REFLECT, 25000);
  3419. +                            break;
  3420. +                        case EVENT_THUNDERCLAP:
  3421. +                            if (UpdateVictim())
  3422. +                            {
  3423. +                                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
  3424. +                                    DoCast(target, SPELL_THUNDERCLAP);
  3425. +                            }
  3426. +                            events.ScheduleEvent(EVENT_THUNDERCLAP, 20000);
  3427. +                            break;
  3428. +                        case EVENT_SUNDER_ARMOR:
  3429. +                            if (UpdateVictim())
  3430. +                            {
  3431. +                                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
  3432. +                                    DoCast(target, SPELL_SUNDER_ARMOR);
  3433. +                            }
  3434. +                            events.ScheduleEvent(EVENT_SUNDER_ARMOR, 15000);
  3435. +                            break;
  3436. +                    }
  3437. +                }
  3438. +
  3439. +                DoMeleeAttackIfReady();
  3440. +            }
  3441. +
  3442. +            private:
  3443. +                EventMap events;
  3444. +                InstanceScript* instance;
  3445. +        };
  3446. +
  3447. +        CreatureAI* GetAI(Creature* pCreature) const
  3448. +        {
  3449. +            return new npc_korkron_defenderAI(pCreature);
  3450. +        }
  3451. +};
  3452. +
  3453. +/* Skybreaker Vindicator  37003*/
  3454. +class npc_skybreaker_vindicator: public CreatureScript
  3455. +{
  3456. +    public:
  3457. +        npc_skybreaker_vindicator() : CreatureScript("npc_skybreaker_vindicator") { }
  3458. +
  3459. +        struct npc_skybreaker_vindicatorAI : public ScriptedAI
  3460. +        {
  3461. +            npc_skybreaker_vindicatorAI(Creature* creature) : ScriptedAI(creature)
  3462. +            {
  3463. +                instance = creature->GetInstanceScript();
  3464. +            }
  3465. +
  3466. +            void Reset()
  3467. +            {
  3468. +                _started = instance->GetBossState(DATA_GUNSHIP_EVENT) == DONE;
  3469. +                events.Reset();
  3470. +                events.ScheduleEvent(EVENT_AVENGERS_SHILED, 10000); // TODO: Fix the timers
  3471. +                events.ScheduleEvent(EVENT_CONCENTRATION, 20000); // TODO: Fix the timers
  3472. +                events.ScheduleEvent(EVENT_HOLY_WRATH, 20000); // TODO: Fix the timers
  3473. +            }
  3474. +
  3475. +            void MoveInLineOfSight(Unit* who)
  3476. +            {
  3477. +                if (!instance)
  3478. +                    return;
  3479. +
  3480. +                if (instance->GetData(DATA_TEAM_IN_INSTANCE) != ALLIANCE)
  3481. +                    return;
  3482. +
  3483. +                if (who->GetTypeId() != TYPEID_PLAYER)
  3484. +                    return;
  3485. +
  3486. +                if (instance->GetData(DATA_FIRST_SQUAD_STATE) == DONE)
  3487. +                    return;
  3488. +
  3489. +                if (!_started && me->IsWithinDistInMap(who, 25.0f))
  3490. +                {
  3491. +                    _started = true;
  3492. +                    events.ScheduleEvent(EVENT_FIRST_SQUAD_ASSISTED_1, 1000);
  3493. +                    events.ScheduleEvent(EVENT_FIRST_SQUAD_ASSISTED_2, 15000); // TODO : fix the timer
  3494. +                }
  3495. +            }
  3496. +
  3497. +            void UpdateAI(const uint32 diff)
  3498. +            {
  3499. +                if (!instance)
  3500. +                    return;
  3501. +
  3502. +                if (me->HasUnitState(UNIT_STAT_CASTING))
  3503. +                    return;
  3504. +
  3505. +                events.Update(diff);
  3506. +
  3507. +                while (uint32 eventId = events.ExecuteEvent())
  3508. +                {
  3509. +                    switch (eventId)
  3510. +                    {
  3511. +                        case EVENT_FIRST_SQUAD_ASSISTED_1:
  3512. +                            Talk(SAY_FIRST_SQUAD_RESCUED_ALLIANCE_0);
  3513. +                            break;
  3514. +                        case EVENT_FIRST_SQUAD_ASSISTED_2:
  3515. +                            if (Creature* tempUnit = me->FindNearestCreature(NPC_GB_SKYBREAKER_SORCERER, 120.0f, true))
  3516. +                            {
  3517. +                                tempUnit->AI()->Talk(SAY_FIRST_SQUAD_RESCUED_ALLIANCE_1);
  3518. +                                tempUnit->AI()->Talk(SAY_SUMMON_BATTLE_STANDARD);
  3519. +                                tempUnit->CastSpell(tempUnit, SPELL_SUMMON_BATTLE_STANDART_A, true);
  3520. +                            }
  3521. +                            instance->SetData(DATA_FIRST_SQUAD_STATE, DONE);
  3522. +                            break;
  3523. +                        case EVENT_AVENGERS_SHILED:
  3524. +                            if (UpdateVictim())
  3525. +                                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 10.0f))
  3526. +                                    DoCast(target, SPELL_WRATH);
  3527. +                            events.ScheduleEvent(EVENT_AVENGERS_SHILED, 10000);
  3528. +                            break;
  3529. +                        case EVENT_CONCENTRATION:
  3530. +                            if (UpdateVictim())
  3531. +                                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 10.0f))
  3532. +                                    DoCast(target, SPELL_CONCENTRATION);
  3533. +                            events.ScheduleEvent(EVENT_CONCENTRATION, 20000);
  3534. +                            break;
  3535. +                        case EVENT_HOLY_WRATH:
  3536. +                            if (UpdateVictim())
  3537. +                                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 10.0f))
  3538. +                                    DoCast(target, SPELL_HOLY_WRATH);
  3539. +                            events.ScheduleEvent(EVENT_HOLY_WRATH, 15000);
  3540. +                            break;
  3541. +                    }
  3542. +                }
  3543. +
  3544. +                DoMeleeAttackIfReady();
  3545. +            }
  3546. +
  3547. +            private:
  3548. +                bool _started;
  3549. +                EventMap events;
  3550. +                InstanceScript* instance;
  3551. +        };
  3552. +
  3553. +        CreatureAI* GetAI(Creature* pCreature) const
  3554. +        {
  3555. +            return new npc_skybreaker_vindicatorAI(pCreature);
  3556. +        }
  3557. +};
  3558. +
  3559. +/* Skybreaker Protector  36998*/
  3560. +class npc_skybreaker_protector: public CreatureScript
  3561. +{
  3562. +    public:
  3563. +        npc_skybreaker_protector() : CreatureScript("npc_skybreaker_protector") { }
  3564. +
  3565. +        struct npc_skybreaker_protectorAI : public ScriptedAI
  3566. +        {
  3567. +            npc_skybreaker_protectorAI(Creature* creature) : ScriptedAI(creature)
  3568. +            {
  3569. +                instance = creature->GetInstanceScript();
  3570. +            }
  3571. +
  3572. +            void Reset()
  3573. +            {
  3574. +                events.Reset();
  3575. +                events.ScheduleEvent(EVENT_DEVASTATE, 10000);
  3576. +                events.ScheduleEvent(EVENT_THUNDERCLAP, 20000);
  3577. +                events.ScheduleEvent(EVENT_SPELL_REFLECT, 25000);
  3578. +                events.ScheduleEvent(EVENT_SUNDER_ARMOR, 15000);
  3579. +            }
  3580. +
  3581. +            void MoveInLineOfSight(Unit* who)
  3582. +            {
  3583. +                if (!instance)
  3584. +                    return;
  3585. +
  3586. +                if (instance->GetData(DATA_TEAM_IN_INSTANCE) != ALLIANCE)
  3587. +                    return;
  3588. +
  3589. +                if (who->GetTypeId() != TYPEID_PLAYER)
  3590. +                    return;
  3591. +
  3592. +                if (me->IsWithinDistInMap(who, 25.0f))
  3593. +                {
  3594. +                    if (instance->GetData(DATA_FIRST_SQUAD_STATE) == DONE && instance->GetData(DATA_SECOND_SQUAD_STATE) != DONE)
  3595. +                    {
  3596. +                        instance->SetData(DATA_SECOND_SQUAD_STATE, DONE);
  3597. +                        events.ScheduleEvent(EVENT_SECOND_SQUAD_ASSISTED_1, 1000);
  3598. +                        events.ScheduleEvent(EVENT_SECOND_SQUAD_ASSISTED_2, 11000); // TODO : fix the timer
  3599. +                        events.ScheduleEvent(EVENT_SECOND_SQUAD_ASSISTED_3, 17000); // TODO : fix the timer
  3600. +                    }
  3601. +                }
  3602. +            }
  3603. +
  3604. +            void UpdateAI(const uint32 diff)
  3605. +            {
  3606. +                if (!instance)
  3607. +                    return;
  3608. +
  3609. +                if (me->HasUnitState(UNIT_STAT_CASTING))
  3610. +                    return;
  3611. +
  3612. +                events.Update(diff);
  3613. +
  3614. +                while (uint32 eventId = events.ExecuteEvent())
  3615. +                {
  3616. +                    switch (eventId)
  3617. +                    {
  3618. +                        case EVENT_SECOND_SQUAD_ASSISTED_1:
  3619. +                            Talk(SAY_SECOND_SQUAD_RESCUED_ALLIANCE_0);
  3620. +                            break;
  3621. +                        case EVENT_SECOND_SQUAD_ASSISTED_2:
  3622. +                            Talk(SAY_SECOND_SQUAD_RESCUED_ALLIANCE_1);
  3623. +                            break;
  3624. +                        case EVENT_SECOND_SQUAD_ASSISTED_3:
  3625. +                            Talk(SAY_SECOND_SQUAD_RESCUED_ALLIANCE_2);
  3626. +                            Talk(SAY_FROSTWYRM_SUMMON_1);
  3627. +                            break;
  3628. +                        case EVENT_DEVASTATE:
  3629. +                            if (UpdateVictim())
  3630. +                            {
  3631. +                                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
  3632. +                                    DoCast(target, SPELL_DEVASTATE);
  3633. +                            }
  3634. +                            events.ScheduleEvent(EVENT_DEVASTATE, 10000);
  3635. +                            break;
  3636. +                        case EVENT_SPELL_REFLECT:
  3637. +                            if (UpdateVictim())
  3638. +                            {
  3639. +                                DoCast(me, SPELL_SPELL_REFLECT);
  3640. +                            }
  3641. +                            events.ScheduleEvent(EVENT_SPELL_REFLECT, 25000);
  3642. +                            break;
  3643. +                        case EVENT_THUNDERCLAP:
  3644. +                            if (UpdateVictim())
  3645. +                            {
  3646. +                                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
  3647. +                                    DoCast(target, SPELL_THUNDERCLAP);
  3648. +                            }
  3649. +                            events.ScheduleEvent(EVENT_THUNDERCLAP, 20000);
  3650. +                            break;
  3651. +                        case EVENT_SUNDER_ARMOR:
  3652. +                            if (UpdateVictim())
  3653. +                            {
  3654. +                                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
  3655. +                                    DoCast(target, SPELL_SUNDER_ARMOR);
  3656. +                            }
  3657. +                            events.ScheduleEvent(EVENT_SUNDER_ARMOR, 15000);
  3658. +                            break;
  3659. +                    }
  3660. +                }
  3661. +
  3662. +                DoMeleeAttackIfReady();
  3663. +            }
  3664. +
  3665. +            private:
  3666. +                EventMap events;
  3667. +                InstanceScript* instance;
  3668. +        };
  3669. +        CreatureAI* GetAI(Creature* pCreature) const
  3670. +        {
  3671. +            return new npc_skybreaker_protectorAI(pCreature);
  3672. +        }
  3673. +};
  3674. +
  3675. +
  3676. +/* Spire Frostwyrm  37230*/
  3677. +class npc_icc_spire_frostwyrm: public CreatureScript
  3678. +{
  3679. +    public:
  3680. +        npc_icc_spire_frostwyrm() : CreatureScript("npc_icc_spire_frostwyrm") { }
  3681. +
  3682. +        struct npc_icc_spire_frostwyrmAI : public ScriptedAI
  3683. +        {
  3684. +            npc_icc_spire_frostwyrmAI(Creature* creature) : ScriptedAI(creature)
  3685. +            {
  3686. +                instance = creature->GetInstanceScript();
  3687. +            }
  3688. +
  3689. +            void Reset()
  3690. +            {
  3691. +                landed = false;
  3692. +                events.Reset();
  3693. +                me->SetFlying(true);
  3694. +                me->SetReactState(REACT_AGGRESSIVE);
  3695. +                me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
  3696. +                events.ScheduleEvent(EVENT_FROST_BREATH, 20000);
  3697. +                events.ScheduleEvent(EVENT_BLIZZARD, 25000);
  3698. +                events.ScheduleEvent(EVENT_CLEAVE, 10000);
  3699. +            }
  3700. +
  3701. +            void MoveInLineOfSight(Unit* who)
  3702. +            {
  3703. +                if (!instance)
  3704. +                    return;
  3705. +
  3706. +                if (who->GetTypeId() != TYPEID_PLAYER)
  3707. +                    return;
  3708. +
  3709. +                if (!who->isTargetableForAttack())
  3710. +                    return;
  3711. +
  3712. +                if (!landed && me->IsWithinDistInMap(who, 35.0f))
  3713. +                {
  3714. +                    if (instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
  3715. +                        Talk(SAY_FROSTWYRM_LAND_H_0);
  3716. +                    else
  3717. +                        Talk(SAY_FROSTWYRM_LAND_A_1);
  3718. +                    landed = true;
  3719. +                    me->SetFlying(false);
  3720. +                    me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
  3721. +                    me->SetInCombatWith(who);
  3722. +                    me->AddThreat(who, 1.0f);
  3723. +                    me->GetMotionMaster()->MoveChase(who);
  3724. +                }
  3725. +            }
  3726. +
  3727. +            void UpdateAI(const uint32 diff)
  3728. +            {
  3729. +                if (!UpdateVictim())
  3730. +                    return;
  3731. +
  3732. +                if (me->HasUnitState(UNIT_STAT_CASTING))
  3733. +                    return;
  3734. +
  3735. +                events.Update(diff);
  3736. +
  3737. +                while (uint32 eventId = events.ExecuteEvent())
  3738. +                {
  3739. +                    switch (eventId)
  3740. +                    {
  3741. +                        case EVENT_FROST_BREATH:
  3742. +                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 10.0f))
  3743. +                                DoCast(target, SPELL_FROST_BREATH);
  3744. +                            events.ScheduleEvent(EVENT_FROST_BREATH, 20000);
  3745. +                            break;
  3746. +                        case EVENT_BLIZZARD:
  3747. +                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 10.0f))
  3748. +                                DoCast(target, SPELL_BLIZZARD);
  3749. +                            events.ScheduleEvent(EVENT_BLIZZARD, 25000);
  3750. +                            break;
  3751. +                        case EVENT_CLEAVE:
  3752. +                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 10.0f))
  3753. +                                DoCast(target, SPELL_FROST_CLEAVE);
  3754. +                            events.ScheduleEvent(EVENT_CLEAVE, 10000);
  3755. +                            break;
  3756. +                    }
  3757. +                }
  3758. +
  3759. +                DoMeleeAttackIfReady();
  3760. +            }
  3761. +
  3762. +            private:
  3763. +                bool landed;
  3764. +                EventMap events;
  3765. +                InstanceScript* instance;
  3766. +        };
  3767. +
  3768. +        CreatureAI* GetAI(Creature* pCreature) const
  3769. +        {
  3770. +            return new npc_icc_spire_frostwyrmAI(pCreature);
  3771. +        }
  3772. +};
  3773. +
  3774. +/* ---------------------------------- AreaTrigger Scripts ------------------------------------- */
  3775. +class at_icc_land_frostwyrm : public AreaTriggerScript
  3776. +{
  3777. +    public:
  3778. +        at_icc_land_frostwyrm() : AreaTriggerScript("at_icc_land_frostwyrm") { }
  3779. +
  3780. +        bool OnTrigger(Player* player, AreaTriggerEntry const* areaTrigger)
  3781. +        {
  3782. +            if (InstanceScript* instance = player->GetInstanceScript())
  3783. +            {
  3784. +                if (instance->GetData(DATA_SPIRE_FROSTWYRM_STATE) == NOT_STARTED && instance->GetData(DATA_SECOND_SQUAD_STATE) == DONE)
  3785. +                {
  3786. +                    if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
  3787. +                        player->GetMap()->SummonCreature(NPC_SPIRE_FROSTWYRM, FrostWyrmPosA);
  3788. +                    else
  3789. +                        player->GetMap()->SummonCreature(NPC_SPIRE_FROSTWYRM, FrostWyrmPosH);
  3790. +
  3791. +                    instance->SetData(DATA_SPIRE_FROSTWYRM_STATE, IN_PROGRESS);
  3792. +                }
  3793. +            }
  3794. +
  3795. +            return true;
  3796. +        }
  3797. +};
  3798. +
  3799. +/* transport script */
  3800. +class transport_gunship : public TransportScript
  3801. +{
  3802. +    public:
  3803. +        transport_gunship() : TransportScript("transport_gunship") { }
  3804. +
  3805. +        void OnRelocate(Transport* transport, uint32 waypointId, uint32 mapId, float x, float y, float z)
  3806. +        {
  3807. +        }
  3808. +
  3809. +        void OnAddPassenger(Transport* transport, Player* player)
  3810. +        {
  3811. +            if (!transport || !player)
  3812. +                return;
  3813. +
  3814. +            switch (transport->GetEntry())
  3815. +            {
  3816. +                case GO_THE_SKYBREAKER_ALLIANCE_ICC:
  3817. +                    player->AddAura(SPELL_ON_SKYBREAKERS_DECK, player);
  3818. +                    break;
  3819. +                case GO_ORGRIM_S_HAMMER_HORDE_ICC:
  3820. +                    player->AddAura(SPELL_ON_ORGRIMS_HAMMERS_DECK, player);
  3821. +                    break;
  3822. +                default:
  3823. +                    break;
  3824. +            }
  3825. +        }
  3826. +
  3827. +        void OnRemovePassenger(Transport* /*transport*/, Player* player)
  3828. +        {
  3829. +            if (!player)
  3830. +                return;
  3831. +
  3832. +            player->RemoveAurasDueToSpell(SPELL_ON_ORGRIMS_HAMMERS_DECK);
  3833. +            player->RemoveAurasDueToSpell(SPELL_ON_SKYBREAKERS_DECK);
  3834. +        }
  3835. +};
  3836. +
  3837. +/* Remove Rocket Pack - 70713 */
  3838. +class spell_icc_remove_rocket_pack : public SpellScriptLoader
  3839. +{
  3840. +    public:
  3841. +        spell_icc_remove_rocket_pack() : SpellScriptLoader("spell_icc_remove_rocket_pack") { }
  3842. +
  3843. +        class spell_icc_remove_rocket_pack_SpellScript : public SpellScript
  3844. +        {
  3845. +            PrepareSpellScript(spell_icc_remove_rocket_pack_SpellScript);
  3846. +
  3847. +            void HandleEffect(SpellEffIndex /*effIndex*/)
  3848. +            {
  3849. +                Player* hitPlr = GetHitPlayer();
  3850. +                if (!hitPlr) // If player is offline
  3851. +                    return;
  3852. +
  3853. +                int32 itemId = GetEffectValue();
  3854. +                uint32 itemCount = hitPlr->GetItemCount(itemId, false); // Should be 1, but just in case.
  3855. +                hitPlr->DestroyItemCount(itemId, itemCount, true, false);
  3856. +            }
  3857. +
  3858. +            void Register()
  3859. +            {
  3860. +                OnEffectHitTarget += SpellEffectFn(spell_icc_remove_rocket_pack_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
  3861. +            }
  3862. +        };
  3863. +
  3864. +        SpellScript* GetSpellScript() const
  3865. +        {
  3866. +            return new spell_icc_remove_rocket_pack_SpellScript();
  3867. +        }
  3868. +};
  3869. +
  3870. +/* spell 69471 Heat Drain */
  3871. +class spell_gb_heat_drain : public SpellScriptLoader
  3872. +{
  3873. +    public:
  3874. +        spell_gb_heat_drain() : SpellScriptLoader("spell_gb_heat_drain") { }
  3875. +
  3876. +        class spell_gb_heat_drain_SpellScript : public SpellScript
  3877. +        {
  3878. +            PrepareSpellScript(spell_gb_heat_drain_SpellScript);
  3879. +
  3880. +            void HandleDummy(SpellEffIndex /*effIndex*/)
  3881. +            {
  3882. +                Unit* caster = GetCaster();
  3883. +
  3884. +                if (caster->GetPower(POWER_ENERGY) != 0)
  3885. +                    caster->ModifyPower(POWER_ENERGY, -1);
  3886. +
  3887. +                if (caster->GetPower(POWER_ENERGY) >= 99)
  3888. +                    caster->CastSpell(caster, SPELL_OVERHEAT, true);
  3889. +            }
  3890. +
  3891. +            void Register()
  3892. +            {
  3893. +                OnEffectHit += SpellEffectFn(spell_gb_heat_drain_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
  3894. +            }
  3895. +        };
  3896. +
  3897. +        SpellScript* GetSpellScript() const
  3898. +        {
  3899. +            return new spell_gb_heat_drain_SpellScript();
  3900. +        }
  3901. +};
  3902. +
  3903. +/* spell 69488 Overheat Drain */
  3904. +class spell_gb_overheat_drain : public SpellScriptLoader
  3905. +{
  3906. +    public:
  3907. +        spell_gb_overheat_drain() : SpellScriptLoader("spell_gb_overheat_drain") { }
  3908. +
  3909. +        class spell_gb_overheat_drain_SpellScript : public SpellScript
  3910. +        {
  3911. +            PrepareSpellScript(spell_gb_overheat_drain_SpellScript);
  3912. +
  3913. +            void HandleDummy(SpellEffIndex /*effIndex*/)
  3914. +            {
  3915. +                Unit* caster = GetCaster();
  3916. +
  3917. +                if (caster->GetPower(POWER_ENERGY) >= 10)
  3918. +                    caster->ModifyPower(POWER_ENERGY, -10);
  3919. +            }
  3920. +
  3921. +            void Register()
  3922. +            {
  3923. +                OnEffectHit += SpellEffectFn(spell_gb_overheat_drain_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
  3924. +            }
  3925. +        };
  3926. +
  3927. +        SpellScript* GetSpellScript() const
  3928. +        {
  3929. +            return new spell_gb_overheat_drain_SpellScript();
  3930. +        }
  3931. +};
  3932. +
  3933. +/* spell 69402 Incinerating Blast */
  3934. +class spell_gb_incinerating_blast : public SpellScriptLoader
  3935. +{
  3936. +    public:
  3937. +        spell_gb_incinerating_blast() : SpellScriptLoader("spell_gb_incinerating_blast") { }
  3938. +
  3939. +        class spell_gb_incinerating_blast_SpellScript : public SpellScript
  3940. +        {
  3941. +            PrepareSpellScript(spell_gb_incinerating_blast_SpellScript);
  3942. +
  3943. +            void AddExtraDamage()
  3944. +            {
  3945. +                Unit* caster = GetCaster();
  3946. +                if (!caster || !caster->GetPower(POWER_ENERGY))
  3947. +                    return;
  3948. +
  3949. +                SetHitDamage(int32(GetHitDamage() + (caster->GetPower(POWER_ENERGY) * 100.0f))); // TODO: How much should be?
  3950. +                caster->SetPower(POWER_ENERGY, 0);
  3951. +            }
  3952. +
  3953. +            void Register()
  3954. +            {
  3955. +                OnHit += SpellHitFn(spell_gb_incinerating_blast_SpellScript::AddExtraDamage);
  3956. +            }
  3957. +        };
  3958. +
  3959. +        SpellScript* GetSpellScript() const
  3960. +        {
  3961. +            return new spell_gb_incinerating_blast_SpellScript();
  3962. +        }
  3963. +};
  3964. +
  3965. +/* spell 71335, 70339 Burning Pitch */
  3966. +class spell_gb_burning_pitch : public SpellScriptLoader
  3967. +{
  3968. +    public:
  3969. +        spell_gb_burning_pitch() : SpellScriptLoader("spell_gb_burning_pitch") { }
  3970. +
  3971. +        class spell_gb_burning_pitch_SpellScript : public SpellScript
  3972. +        {
  3973. +            PrepareSpellScript(spell_gb_burning_pitch_SpellScript);
  3974. +
  3975. +            bool Validate(SpellInfo const* /*spellInfo*/)
  3976. +            {
  3977. +                if (!sSpellMgr->GetSpellInfo(SPELL_BURNING_PITCH_SIEGE_DMG_A))
  3978. +                    return false;
  3979. +                if (!sSpellMgr->GetSpellInfo(SPELL_BURNING_PITCH_SIEGE_DMG_H))
  3980. +                    return false;
  3981. +                if (!sSpellMgr->GetSpellInfo(SPELL_BURNING_PITCH_AOE_DAMAGE))
  3982. +                    return false;
  3983. +                return true;
  3984. +            }
  3985. +
  3986. +            void HandleDummy(SpellEffIndex /*effIndex*/)
  3987. +            {
  3988. +                Unit* caster = GetCaster();
  3989. +                Unit* target = GetHitUnit();
  3990. +
  3991. +                if (!caster || !target)
  3992. +                    return;
  3993. +
  3994. +                if (GetSpellInfo()->Id == SPELL_BURNING_PITCH_A)
  3995. +                    caster->CastSpell(target, SPELL_BURNING_PITCH_SIEGE_DMG_A, true);
  3996. +                else
  3997. +                    caster->CastSpell(target, SPELL_BURNING_PITCH_SIEGE_DMG_H, true);
  3998. +
  3999. +                caster->CastSpell(target, SPELL_BURNING_PITCH_AOE_DAMAGE, true);
  4000. +            }
  4001. +
  4002. +            void Register()
  4003. +            {
  4004. +                OnEffectHitTarget += SpellEffectFn(spell_gb_burning_pitch_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
  4005. +            }
  4006. +        };
  4007. +
  4008. +        SpellScript* GetSpellScript() const
  4009. +        {
  4010. +            return new spell_gb_burning_pitch_SpellScript();
  4011. +        }
  4012. +};
  4013. +
  4014. +/* spell 68645 Rocket Pack */
  4015. +class spell_rocket_pack : public SpellScriptLoader
  4016. +{
  4017. +    public:
  4018. +        spell_rocket_pack() : SpellScriptLoader("spell_rocket_pack") { }
  4019. +
  4020. +        class spell_rocket_pack_AuraScript : public AuraScript
  4021. +        {
  4022. +            PrepareAuraScript(spell_rocket_pack_AuraScript);
  4023. +
  4024. +            void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  4025. +            {
  4026. +                GetTarget()->CastSpell(GetTarget(), 68721, true);
  4027. +            }
  4028. +
  4029. +            void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
  4030. +            {
  4031. +                GetTarget()->RemoveAurasDueToSpell(68721);
  4032. +            }
  4033. +
  4034. +            void Register()
  4035. +            {
  4036. +                OnEffectApply += AuraEffectApplyFn(spell_rocket_pack_AuraScript::OnApply, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
  4037. +                OnEffectRemove += AuraEffectRemoveFn(spell_rocket_pack_AuraScript::OnRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
  4038. +            }
  4039. +        };
  4040. +
  4041. +        AuraScript* GetAuraScript() const
  4042. +        {
  4043. +            return new spell_rocket_pack_AuraScript();
  4044. +        }
  4045. +};
  4046. +
  4047. +void AddSC_boss_gunship_battle()
  4048. +{
  4049. +    new npc_muradin_gunship();
  4050. +    new npc_saurfang_gunship();
  4051. +    new npc_zafod_boombox();
  4052. +    new npc_korkron_axethrower_rifleman();
  4053. +    new npc_mortar_soldier_or_rocketeer();
  4054. +    new npc_gunship_mage();
  4055. +    new npc_gunship_cannon();
  4056. +    new npc_sergeant();
  4057. +    new npc_marine_or_reaver();
  4058. +    new npc_gunship_trigger();
  4059. +    new npc_gunship_portal();
  4060. +    new npc_korkron_primalist();
  4061. +    new npc_korkron_defender();
  4062. +    new npc_skybreaker_vindicator();
  4063. +    new npc_skybreaker_protector();
  4064. +    new npc_icc_spire_frostwyrm();
  4065. +    new at_icc_land_frostwyrm();
  4066. +    new npc_gunship_skybreaker();
  4067. +    new npc_gunship_orgrimmar();
  4068. +    new transport_gunship();
  4069. +    new spell_icc_remove_rocket_pack();
  4070. +    new spell_gb_heat_drain();
  4071. +    new spell_gb_overheat_drain();
  4072. +    new spell_gb_incinerating_blast();
  4073. +    new spell_gb_burning_pitch();
  4074. +    new spell_rocket_pack();
  4075. +}
  4076. \ No newline at end of file
  4077. diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
  4078. index 085aea1..0ce5de9 100755
  4079. --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
  4080. +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
  4081. @@ -110,6 +110,22 @@ enum DataTypes
  4082.      DATA_HIGHLORD_TIRION_FORDRING   = 37,
  4083.      DATA_ARTHAS_PLATFORM            = 38,
  4084.      DATA_TERENAS_MENETHIL           = 39,
  4085. +    // For Gunship
  4086. +    DATA_FIRST_SQUAD_STATE                  = 100,
  4087. +    DATA_SECOND_SQUAD_STATE                 = 101,
  4088. +    DATA_SPIRE_FROSTWYRM_STATE              = 102,
  4089. +    DATA_GB_HIGH_OVERLORD_SAURFANG          = 103,
  4090. +    DATA_GB_MURADIN_BRONZEBEARD             = 104,
  4091. +    DATA_HIGH_OVERLORD_SAURFANG_NOT_VISUAL  = 105,
  4092. +    DATA_GB_BATTLE_MAGE                     = 106,
  4093. +    DATA_SKYBREAKER_BOSS                    = 107,
  4094. +    DATA_ORGRIMMAR_HAMMER_BOSS              = 108,
  4095. +    DATA_MURADIN_BRONZEBEARD_NOT_VISUAL     = 109,
  4096. +
  4097. +    // misc
  4098. +    DATA_MURADIN_BRONZEBEARD        = 66,
  4099. +    DATA_GUNSHIP_BATTLE             = 67,
  4100. +    GUID_PLAYER_LOCATION            = 69,
  4101.  };
  4102.  
  4103.  enum CreaturesIds
  4104. @@ -163,6 +179,36 @@ enum CreaturesIds
  4105.      NPC_REANIMATED_ADHERENT                     = 38010,
  4106.      NPC_VENGEFUL_SHADE                          = 38222,
  4107.  
  4108. +    // Gunship Battle
  4109. +    NPC_GB_SKYBREAKER                           = 37540,
  4110. +    NPC_GB_ORGRIMS_HAMMER                       = 37215,
  4111. +    NPC_GB_HIGH_OVERLORD_SAURFANG               = 36939,
  4112. +    NPC_GB_MURADIN_BRONZEBEARD                  = 36948,
  4113. +    NPC_GB_HIHG_CAPTAIN_JUSTIN_BARTLETT         = 37182,
  4114. +    NPC_GB_HIGH_OVERLORD_SAURFANG_NOT_VISUAL    = 50004,
  4115. +    NPC_GB_MURADIN_BRONZEBEARD_NOT_VISUAL       = 50006,
  4116. +    NPC_GB_SKYBREAKER_SORCERER                 = 37026,
  4117. +    NPC_GB_SKYBREAKER_SORCERERS                 = 37116,
  4118. +    NPC_GB_KORKRON_REAVER                       = 37920,
  4119. +    NPC_GB_KORKRON_REAVERS                      = 36957,
  4120. +    NPC_GB_KORKRON_SERGANTE                     = 36960,
  4121. +    NPC_GB_SKYBREAKER_SERGANTE                  = 36961,
  4122. +    NPC_GB_KORKRON_BATTLE_MAGE                  = 37117,
  4123. +    NPC_GB_SKYBREAKER_MARINE                    = 36950,
  4124. +    NPC_GB_KORKRON_ROCKETEER                    = 36982,
  4125. +    NPC_GB_SKYBREAKER_MORTAR_SOLDIER            = 36978,
  4126. +    NPC_GB_KORKRON_AXETHROWER                   = 36968,
  4127. +    NPC_GB_SKYBREAKER_RIFLEMAN                  = 36969,
  4128. +    NPC_GB_SKYBREAKER_DECKHAND                  = 36970,
  4129. +    NPC_GB_ZAFOD_BOOMBOX                        = 37184,
  4130. +    NPC_GB_ALLIANCE_CANON                       = 36838,
  4131. +    NPC_GB_HORDE_CANON                          = 36839,
  4132. +    NPC_GB_INVISIBLE_STALKER                    = 32780,
  4133. +    NPC_GB_PORTAL                               = 37227,
  4134. +    NPC_GB_GUNSHIP_HULL                         = 37547,
  4135. +    NPC_KORKRON_INVOKER                         = 37033,
  4136. +    NPC_SPIRE_FROSTWYRM                            = 37230,
  4137. +
  4138.      // Deathbringer Saurfang
  4139.      NPC_DEATHBRINGER_SAURFANG                   = 37813,
  4140.      NPC_BLOOD_BEAST                             = 38508,
  4141. @@ -294,6 +340,20 @@ enum GameObjectsIds
  4142.      GO_ORATORY_OF_THE_DAMNED_ENTRANCE       = 201563,
  4143.      GO_LADY_DEATHWHISPER_ELEVATOR           = 202220,
  4144.  
  4145. +    //Gunship Battle
  4146. +    GO_ORGRIM_S_HAMMER_HORDE_ICC            = 201812,
  4147. +    GO_ORGRIM_S_HAMMER_ALLIANCE_ICC         = 201581,
  4148. +    GO_THE_SKYBREAKER_HORDE_ICC             = 201811,
  4149. +    GO_THE_SKYBREAKER_ALLIANCE_ICC          = 201580,
  4150. +    GO_CAPITAN_CHEST_A_10N                  = 201872,
  4151. +    GO_CAPITAN_CHEST_A_25N                  = 201873,
  4152. +    GO_CAPITAN_CHEST_A_10H                  = 201874,
  4153. +    GO_CAPITAN_CHEST_A_25H                  = 201875,
  4154. +    GO_CAPITAN_CHEST_H_10N                  = 202177,
  4155. +    GO_CAPITAN_CHEST_H_25N                  = 202178,
  4156. +    GO_CAPITAN_CHEST_H_10H                  = 202179,
  4157. +    GO_CAPITAN_CHEST_H_25H                  = 202180,
  4158. +
  4159.      // Deathbringer Saurfang
  4160.      GO_SAURFANG_S_DOOR                      = 201825,
  4161.      GO_DEATHBRINGER_S_CACHE_10N             = 202239,
  4162. diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
  4163. index ca6eddf..6338ab7 100755
  4164. --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
  4165. +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
  4166. @@ -20,6 +20,8 @@
  4167.  #include "InstanceScript.h"
  4168.  #include "ScriptedCreature.h"
  4169.  #include "Map.h"
  4170. +#include "MapManager.h"
  4171. +#include "Transport.h"
  4172.  #include "PoolMgr.h"
  4173.  #include "AccountMgr.h"
  4174.  #include "icecrown_citadel.h"
  4175. @@ -103,6 +105,18 @@ class instance_icecrown_citadel : public InstanceMapScript
  4176.                  TeamInInstance = 0;
  4177.                  HeroicAttempts = MaxHeroicAttempts;
  4178.                  LadyDeathwisperElevatorGUID = 0;
  4179. +                // Gunship Battle
  4180. +                FirstSquadState = 0;
  4181. +                SecondSquadState = 0;
  4182. +//                SpireSquadState = 0;
  4183. +                SkybreakerBossGUID = 0;
  4184. +                OrgrimmarBossGUID = 0;
  4185. +                DeathbringerSaurfangGbGUID = 0;
  4186. +                MuradinBronzebeardGbGUID = 0;
  4187. +                DeathbringerSaurfangNotVisualGUID = 0;
  4188. +                MuradinBronzebeardNotVisualGUID = 0;
  4189. +                GbBattleMageGUID = 0;
  4190. +                // Gunship Battle
  4191.                  DeathbringerSaurfangGUID = 0;
  4192.                  DeathbringerSaurfangDoorGUID = 0;
  4193.                  DeathbringerSaurfangEventGUID = 0;
  4194. @@ -163,6 +177,8 @@ class instance_icecrown_citadel : public InstanceMapScript
  4195.              {
  4196.                  if (!TeamInInstance)
  4197.                      TeamInInstance = player->GetTeam();
  4198. +
  4199. +                PrepareGunshipEvent(); // Spawn Gunship Event
  4200.              }
  4201.  
  4202.              void OnCreatureCreate(Creature* creature)
  4203. @@ -177,6 +193,28 @@ class instance_icecrown_citadel : public InstanceMapScript
  4204.  
  4205.                  switch (creature->GetEntry())
  4206.                  {
  4207. +                     case NPC_GB_SKYBREAKER:
  4208. +                         SkybreakerBossGUID = creature->GetGUID();
  4209. +                         break;
  4210. +                     case NPC_GB_ORGRIMS_HAMMER:
  4211. +                         OrgrimmarBossGUID = creature->GetGUID();
  4212. +                         break;
  4213. +                     case NPC_GB_HIGH_OVERLORD_SAURFANG:
  4214. +                         DeathbringerSaurfangGbGUID = creature->GetGUID();
  4215. +                         break;
  4216. +                     case NPC_GB_MURADIN_BRONZEBEARD:
  4217. +                         MuradinBronzebeardGbGUID = creature->GetGUID();
  4218. +                         break;
  4219. +                     case NPC_GB_HIGH_OVERLORD_SAURFANG_NOT_VISUAL:
  4220. +                         DeathbringerSaurfangNotVisualGUID = creature->GetGUID();
  4221. +                         break;
  4222. +                     case NPC_GB_MURADIN_BRONZEBEARD_NOT_VISUAL:
  4223. +                         MuradinBronzebeardNotVisualGUID = creature->GetGUID();
  4224. +                         break;
  4225. +                     case NPC_GB_SKYBREAKER_SORCERERS:
  4226. +                     case NPC_GB_KORKRON_BATTLE_MAGE:
  4227. +                         GbBattleMageGUID = creature->GetGUID();
  4228. +                         break;
  4229.                      case NPC_KOR_KRON_GENERAL:
  4230.                          if (TeamInInstance == ALLIANCE)
  4231.                              creature->UpdateEntry(NPC_ALLIANCE_COMMANDER, ALLIANCE);
  4232. @@ -558,6 +596,22 @@ class instance_icecrown_citadel : public InstanceMapScript
  4233.              {
  4234.                  switch (type)
  4235.                  {
  4236. +                   //Gunship battle
  4237. +                    case DATA_SKYBREAKER_BOSS:
  4238. +                        return SkybreakerBossGUID;
  4239. +                    case DATA_ORGRIMMAR_HAMMER_BOSS:
  4240. +                        return OrgrimmarBossGUID;
  4241. +                    case DATA_GB_HIGH_OVERLORD_SAURFANG:
  4242. +                        return DeathbringerSaurfangGbGUID;
  4243. +                    case DATA_GB_MURADIN_BRONZEBEARD:
  4244. +                        return MuradinBronzebeardGbGUID;
  4245. +                    case DATA_HIGH_OVERLORD_SAURFANG_NOT_VISUAL:
  4246. +                        return DeathbringerSaurfangNotVisualGUID;
  4247. +                    case DATA_MURADIN_BRONZEBEARD_NOT_VISUAL:
  4248. +                        return MuradinBronzebeardNotVisualGUID;
  4249. +                    case DATA_GB_BATTLE_MAGE:
  4250. +                        return GbBattleMageGUID;
  4251. +                   //
  4252.                      case DATA_DEATHBRINGER_SAURFANG:
  4253.                          return DeathbringerSaurfangGUID;
  4254.                      case DATA_SAURFANG_EVENT_NPC:
  4255. @@ -628,7 +682,6 @@ class instance_icecrown_citadel : public InstanceMapScript
  4256.                  switch (type)
  4257.                  {
  4258.                      case DATA_LADY_DEATHWHISPER:
  4259. -                        SetBossState(DATA_GUNSHIP_EVENT, state);    // TEMP HACK UNTIL GUNSHIP SCRIPTED
  4260.                          if (state == DONE)
  4261.                          {
  4262.                              if (GameObject* elevator = instance->GetGameObject(LadyDeathwisperElevatorGUID))
  4263. @@ -952,7 +1005,7 @@ class instance_icecrown_citadel : public InstanceMapScript
  4264.                  return false;
  4265.              }
  4266.  
  4267. -            /*bool CheckRequiredBosses(uint32 bossId, Player const* player = NULL) const
  4268. +            bool CheckRequiredBosses(uint32 bossId, Player const* player = NULL) const
  4269.              {
  4270.                  if (player && AccountMgr::IsGMAccount(player->GetSession()->GetSecurity()))
  4271.                      return true;
  4272. @@ -991,9 +1044,9 @@ class instance_icecrown_citadel : public InstanceMapScript
  4273.                      return false;
  4274.  
  4275.                  return true;
  4276. -            }*/
  4277. +            }
  4278.  
  4279. -            /*bool CheckPlagueworks(uint32 bossId) const
  4280. +            bool CheckPlagueworks(uint32 bossId) const
  4281.              {
  4282.                  switch (bossId)
  4283.                  {
  4284. @@ -1010,9 +1063,9 @@ class instance_icecrown_citadel : public InstanceMapScript
  4285.                  }
  4286.  
  4287.                  return true;
  4288. -            }*/
  4289. +            }
  4290.  
  4291. -            /*bool CheckCrimsonHalls(uint32 bossId) const
  4292. +            bool CheckCrimsonHalls(uint32 bossId) const
  4293.              {
  4294.                  switch (bossId)
  4295.                  {
  4296. @@ -1029,9 +1082,9 @@ class instance_icecrown_citadel : public InstanceMapScript
  4297.                  }
  4298.  
  4299.                  return true;
  4300. -            }*/
  4301. +            }
  4302.  
  4303. -            /*bool CheckFrostwingHalls(uint32 bossId) const
  4304. +            bool CheckFrostwingHalls(uint32 bossId) const
  4305.              {
  4306.                  switch (bossId)
  4307.                  {
  4308. @@ -1048,9 +1101,9 @@ class instance_icecrown_citadel : public InstanceMapScript
  4309.                  }
  4310.  
  4311.                  return true;
  4312. -            }*/
  4313. +            }
  4314.  
  4315. -            /*bool CheckLowerSpire(uint32 bossId) const
  4316. +            bool CheckLowerSpire(uint32 bossId) const
  4317.              {
  4318.                  switch (bossId)
  4319.                  {
  4320. @@ -1083,7 +1136,7 @@ class instance_icecrown_citadel : public InstanceMapScript
  4321.                  }
  4322.  
  4323.                  return true;
  4324. -            }*/
  4325. +            }
  4326.  
  4327.              std::string GetSaveData()
  4328.              {
  4329. @@ -1236,9 +1289,210 @@ class instance_icecrown_citadel : public InstanceMapScript
  4330.                  }
  4331.              }
  4332.  
  4333. +            void PrepareGunshipEvent()
  4334. +            {
  4335. +                if (isPrepared || GetBossState(DATA_GUNSHIP_EVENT) == DONE)
  4336. +                    return;
  4337. +
  4338. +                if(TeamInInstance == ALLIANCE)
  4339. +                {
  4340. +                    if(Transport* th = sMapMgr->LoadTransportInMap(instance, GO_ORGRIM_S_HAMMER_ALLIANCE_ICC, 108000))
  4341. +                    {
  4342. +                        th->AddNPCPassengerInInstance(NPC_GB_ORGRIMS_HAMMER, 1.845810f, 1.268872f, 34.526218f, 1.5890f);
  4343. +                        th->AddNPCPassengerInInstance(NPC_GB_HIGH_OVERLORD_SAURFANG, 37.18615f, 0.00016f, 36.78849f, 3.13683f);
  4344. +                        th->AddNPCPassengerInInstance(NPC_GB_INVISIBLE_STALKER, 37.18615f, 0.00016f, 36.78849f, 3.13683f);
  4345. +                        th->AddNPCPassengerInInstance(NPC_GB_KORKRON_BATTLE_MAGE, 47.2929f, -4.308941f, 37.5555f, 3.05033f);
  4346. +                        th->AddNPCPassengerInInstance(NPC_GB_KORKRON_BATTLE_MAGE, 47.34621f, 4.032004f, 37.70952f, 3.05033f);
  4347. +                        th->AddNPCPassengerInInstance(NPC_GB_KORKRON_BATTLE_MAGE, 15.03016f, 0.00016f, 37.70952f, 1.55138f);
  4348. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -13.19547f, -27.160213f, 35.47252f, 3.10672f);
  4349. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -18.33902f, -25.230491f, 33.04052f, 3.00672f);
  4350. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -60.1251f, -1.27014f, 42.8335f, 5.16073f);
  4351. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -48.2651f, 16.78034f, 34.2515f, 0.04292f);
  4352. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -14.8356f, 27.931688f, 33.363f, 1.73231f);
  4353. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 10.2702f, 20.62966f, 35.37483f, 1.6f);
  4354. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 39.32459f, 14.50176f, 36.88428f, 1.6f);
  4355. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 46.17223f, -6.638763f, 37.35444f, 1.32f);
  4356. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 27.4456f, -13.397498f, 36.34746f, 1.6f);
  4357. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 18.16184f, 1.37897f, 35.31705f, 1.6f);
  4358. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -18.11516f, -0.196236f, 45.15709f, 2.9f);
  4359. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -18.11844f, -0.19624f, 49.18192f, 1.6f);
  4360. +
  4361. +                        if (instance->ToInstanceMap()->GetMaxPlayers() == 10)
  4362. +                        {
  4363. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -3.170555f, 28.30652f, 34.21082f, 1.66527f);
  4364. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -12.0928f, 27.65942f, 33.58557f, 1.66527f);
  4365. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 14.92804f, 26.18018f, 35.47803f, 1.66527f);
  4366. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 24.70331f, 25.36584f, 35.97845f, 1.66527f);
  4367. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, -11.44849f, -25.71838f, 33.64343f, 1.49248f);
  4368. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, 12.30336f, -25.69653f, 35.32373f, 1.49248f);
  4369. +                        }
  4370. +                        else
  4371. +                        {
  4372. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -3.170555f, 28.30652f, 34.21082f, 1.66527f);
  4373. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -12.0928f, 27.65942f, 33.58557f, 1.66527f);
  4374. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 14.92804f, 26.18018f, 35.47803f, 1.66527f);
  4375. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 24.70331f, 25.36584f, 35.97845f, 1.66527f);
  4376. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, 19.92804f, 27.18018f, 35.47803f, 1.66527f);
  4377. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_AXETHROWER, -7.70331f, 28.36584f, 33.88557f, 1.66527f);
  4378. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, -11.44849f, -25.71838f, 33.64343f, 1.49248f);
  4379. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, 12.30336f, -25.69653f, 35.32373f, 1.49248f);
  4380. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, -3.44849f, -25.71838f, 34.21082f, 1.49248f);
  4381. +                            th->AddNPCPassengerInInstance(NPC_GB_KORKRON_ROCKETEER, 3.30336f, -25.69653f, 35.32373f, 1.49248f);
  4382. +                        }
  4383. +                    }
  4384. +
  4385. +                    if(Transport* t = sMapMgr->LoadTransportInMap(instance, GO_THE_SKYBREAKER_ALLIANCE_ICC, 108000))
  4386. +                    {
  4387. +                        t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER, -17.156807f, -1.633260f, 20.81273f, 4.52672f);
  4388. +                        t->AddNPCPassengerInInstance(NPC_GB_MURADIN_BRONZEBEARD, 13.51547f, -0.160213f, 20.87252f, 3.10672f);
  4389. +                        t->AddNPCPassengerInInstance(NPC_GB_HIHG_CAPTAIN_JUSTIN_BARTLETT, 42.78902f, -0.010491f, 25.24052f, 3.00672f);
  4390. +                        t->AddNPCPassengerInInstance(NPC_GB_HIGH_OVERLORD_SAURFANG_NOT_VISUAL, -12.9806f, -22.9462f, 21.659f, 4.72416f);
  4391. +                        t->AddNPCPassengerInInstance(NPC_GB_ZAFOD_BOOMBOX, 18.8042f, 9.907914f, 20.33559f, 3.10672f);
  4392. +                        t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_DECKHAND, -64.8423f, 4.4658f, 23.4352f, 2.698897f);
  4393. +                        t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_DECKHAND, 35.54972f, 19.93269f, 25.0333f, 4.71242f);
  4394. +                        t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_DECKHAND, -36.39837f, 3.13127f, 20.4496f, 1.5708f);
  4395. +                        t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_DECKHAND, -36.23974f, -2.75767f, 20.4506f, 4.69496f);
  4396. +                        t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_DECKHAND, 41.94677f, 44.08411f, 24.66587f, 1.62032f);
  4397. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 13.51547f, -0.160213f, 20.87252f, 3.10672f);
  4398. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 42.78902f, -0.010491f, 25.24052f, 3.00672f);
  4399. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 14.0551f, 3.65014f, 20.7935f, 3.16073f);
  4400. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 14.0551f, -4.65034f, 20.7915f, 3.04292f);
  4401. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -17.8356f, 0.031688f, 20.823f, 4.73231f);
  4402. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -34.2702f, -26.18966f, 21.37483f, 1.6f);
  4403. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -11.64459f, -19.85176f, 20.88428f, 1.6f);
  4404. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -19.88223f, -6.578763f, 20.57444f, 1.6f);
  4405. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -41.4456f, -7.647498f, 20.49746f, 1.6f);
  4406. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 0.554884f, -1.232897f, 20.53705f, 1.6f);
  4407. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -50.16516f, 9.716236f, 23.58709f, 1.6f);
  4408. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 11.45844f, 16.36624f, 20.54192f, 1.6f);
  4409. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 19.72286f, -2.193787f, 33.06982f, 1.6f);
  4410. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 19.72286f, -2.193787f, 33.06982f, 1.6f);
  4411. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 8.599396f, -28.55855f, 24.79919f, 1.6f);
  4412. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 38.94339f, -33.808f,  25.39618f, 1.6f);
  4413. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 58.15474f, 0.748094f, 41.87663f, 1.6f);
  4414. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 5.607554f, -6.350654f, 34.00357f, 1.6f);
  4415. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 4.780305f, -29.05227f, 35.09634f, 1.6f);
  4416. +
  4417. +                        if (instance->ToInstanceMap()->GetMaxPlayers() == 10)
  4418. +                        {
  4419. +                            t->AddNPCPassengerInInstance(NPC_GB_ALLIANCE_CANON, -5.15231f, -22.9462f, 21.659f, 4.72416f);
  4420. +                            t->AddNPCPassengerInInstance(NPC_GB_ALLIANCE_CANON, -28.0876f, -22.9462f, 21.659f, 4.72416f);
  4421. +                        }
  4422. +                        else
  4423. +                        {
  4424. +                            t->AddNPCPassengerInInstance(NPC_GB_ALLIANCE_CANON, -5.15231f, -22.9462f, 21.659f, 4.72416f);
  4425. +                            t->AddNPCPassengerInInstance(NPC_GB_ALLIANCE_CANON, -14.9806f, -22.9462f, 21.659f, 4.72416f);
  4426. +                            t->AddNPCPassengerInInstance(NPC_GB_ALLIANCE_CANON, -21.7406f, -22.9462f, 21.659f, 4.72416f);
  4427. +                            t->AddNPCPassengerInInstance(NPC_GB_ALLIANCE_CANON, -28.0876f, -22.9462f, 21.659f, 4.72416f);
  4428. +                        }
  4429. +                    }
  4430. +                }
  4431. +
  4432. +               if(TeamInInstance == HORDE)
  4433. +                {
  4434. +                 if(Transport* t = sMapMgr->LoadTransportInMap(instance, GO_THE_SKYBREAKER_HORDE_ICC, 77800))
  4435. +                {
  4436. +                        t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER, -17.156807f, -1.633260f, 20.81273f, 4.52672f);
  4437. +                        t->AddNPCPassengerInInstance(NPC_GB_MURADIN_BRONZEBEARD, 13.51547f, -0.160213f, 20.87252f, 3.10672f);
  4438. +                        t->AddNPCPassengerInInstance(NPC_GB_HIHG_CAPTAIN_JUSTIN_BARTLETT, 42.78902f, -0.010491f, 25.24052f, 3.00672f);
  4439. +                        t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_SORCERERS, 14.0551f, 3.65014f, 20.7935f, 3.16073f);
  4440. +                        t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_SORCERERS, 14.0551f, -4.65034f, 20.7915f, 3.04292f);
  4441. +                        t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_SORCERERS, -17.8356f, 0.031688f, 20.823f, 4.73231f);
  4442. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 13.51547f, -0.160213f, 20.87252f, 3.10672f);
  4443. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 42.78902f, -0.010491f, 25.24052f, 3.00672f);
  4444. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 14.0551f, 3.65014f, 20.7935f, 3.16073f);
  4445. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 14.0551f, -4.65034f, 20.7915f, 3.04292f);
  4446. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -17.8356f, 0.031688f, 20.823f, 4.73231f);
  4447. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -34.2702f, -26.18966f, 21.37483f, 1.6f);
  4448. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -11.64459f, -19.85176f, 20.88428f, 1.6f);
  4449. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -19.88223f, -6.578763f, 20.57444f, 1.6f);
  4450. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -41.4456f, -7.647498f, 20.49746f, 1.6f);
  4451. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 0.554884f, -1.232897f, 20.53705f, 1.6f);
  4452. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -50.16516f, 9.716236f, 23.58709f, 1.6f);
  4453. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 11.45844f, 16.36624f, 20.54192f, 1.6f);
  4454. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 19.72286f, -2.193787f, 33.06982f, 1.6f);
  4455. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 19.72286f, -2.193787f, 33.06982f, 1.6f);
  4456. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 8.599396f, -28.55855f, 24.79919f, 1.6f);
  4457. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 38.94339f, -33.808f,  25.39618f, 1.6f);
  4458. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 58.15474f, 0.748094f, 41.87663f, 1.6f);
  4459. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 5.607554f, -6.350654f, 34.00357f, 1.6f);
  4460. +                        t->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 4.780305f, -29.05227f, 35.09634f, 1.6f);
  4461. +
  4462. +                        if(instance->ToInstanceMap()->GetMaxPlayers() == 10)
  4463. +                      {
  4464. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -5.15231f, -22.9462f, 21.659f, 4.72416f);
  4465. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -14.9806f, -22.9462f, 21.659f, 4.72416f);
  4466. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -21.7406f, -22.9462f, 21.659f, 4.72416f);
  4467. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -28.0876f, -22.9462f, 21.659f, 4.72416f);
  4468. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -8.61003f, 15.483f, 20.4158f, 4.69854f);
  4469. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -27.9583f, 14.8875f, 20.4428f, 4.77865f);
  4470. +                      }
  4471. +                        else
  4472. +                      {
  4473. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, 0.15231f, -22.9462f, 21.659f, 4.72416f);
  4474. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -5.15231f, -22.9462f, 21.659f, 4.72416f);
  4475. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -14.9806f, -22.9462f, 21.659f, 4.72416f);
  4476. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -21.7406f, -22.9462f, 21.659f, 4.72416f);
  4477. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -28.0876f, -22.9462f, 21.659f, 4.72416f);
  4478. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_RIFLEMAN, -33.0876f, -22.9462f, 21.659f, 4.72416f);
  4479. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -8.61003f, 15.483f, 20.4158f, 4.69854f);
  4480. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -27.9583f, 14.8875f, 20.4428f, 4.77865f);
  4481. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -15.61003f, 15.483f, 20.4158f, 4.69854f);
  4482. +                            t->AddNPCPassengerInInstance(NPC_GB_SKYBREAKER_MORTAR_SOLDIER, -20.9583f, 14.8875f, 20.4428f, 4.77865f);
  4483. +                      }
  4484. +                 }
  4485. +                
  4486. +                    if(Transport* th = sMapMgr->LoadTransportInMap(instance,GO_ORGRIM_S_HAMMER_HORDE_ICC, 77800))
  4487. +                  {
  4488. +                        th->AddNPCPassengerInInstance(NPC_GB_ORGRIMS_HAMMER, 1.845810f, 1.268872f, 34.526218f, 1.5890f);
  4489. +                        th->AddNPCPassengerInInstance(NPC_GB_HIGH_OVERLORD_SAURFANG, 37.18615f, 0.00016f, 36.78849f, 3.13683f);
  4490. +                        th->AddNPCPassengerInInstance(NPC_GB_MURADIN_BRONZEBEARD_NOT_VISUAL, -7.09684f, 30.582f, 34.5013f, 1.53591f);
  4491. +                        th->AddNPCPassengerInInstance(NPC_GB_INVISIBLE_STALKER, 37.30764f, -0.143823f, 36.7936f, 3.13683f);
  4492. +                        th->AddNPCPassengerInInstance(NPC_GB_ZAFOD_BOOMBOX, 35.18615f, 15.30652f, 37.64343f, 3.05033f);
  4493. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -13.19547f, -27.160213f, 35.47252f, 3.10672f);
  4494. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -18.33902f, -25.230491f, 33.04052f, 3.00672f);
  4495. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -60.1251f, -1.27014f, 42.8335f, 5.16073f);
  4496. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -48.2651f, 16.78034f, 34.2515f, 0.04292f);
  4497. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -14.8356f, 27.931688f, 33.363f, 1.73231f);
  4498. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 10.2702f, 20.62966f, 35.37483f, 1.6f);
  4499. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 39.32459f, 14.50176f, 36.88428f, 1.6f);
  4500. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 46.17223f, -6.638763f, 37.35444f, 1.32f);
  4501. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 27.4456f, -13.397498f, 36.34746f, 1.6f);
  4502. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, 18.16184f, 1.37897f, 35.31705f, 1.6f);
  4503. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -18.11516f, -0.196236f, 45.15709f, 2.9f);
  4504. +                        th->AddNPCPassengerInInstance(NPC_GB_GUNSHIP_HULL, -18.11844f, -0.19624f, 49.18192f, 1.6f);
  4505. +
  4506. +                        if(instance->ToInstanceMap()->GetMaxPlayers() == 10)
  4507. +                        {
  4508. +                            th->AddNPCPassengerInInstance(NPC_GB_HORDE_CANON, 22.6225f, 28.9309f, 36.3929f, 1.53591f);
  4509. +                            th->AddNPCPassengerInInstance(NPC_GB_HORDE_CANON, -21.7509f, 29.4207f, 34.2588f, 1.53591f);
  4510. +                        }
  4511. +                        else
  4512. +                        {
  4513. +                            th->AddNPCPassengerInInstance(NPC_GB_HORDE_CANON, 22.6225f, 28.9309f, 36.3929f, 1.53591f);
  4514. +                            th->AddNPCPassengerInInstance(NPC_GB_HORDE_CANON, 9.87745f, 30.5047f, 35.7147f, 1.53591f);
  4515. +                            th->AddNPCPassengerInInstance(NPC_GB_HORDE_CANON, -7.09684f, 30.582f, 34.5013f, 1.53591f);
  4516. +                            th->AddNPCPassengerInInstance(NPC_GB_HORDE_CANON, -21.7509f, 29.4207f, 34.2588f, 1.53591f);
  4517. +                        }
  4518. +                  }
  4519. +                }
  4520. +                isPrepared = true;
  4521. +            }
  4522. +
  4523.          protected:
  4524.              EventMap Events;
  4525.              uint64 LadyDeathwisperElevatorGUID;
  4526. +            // Gunship battle
  4527. +            uint32 FirstSquadState;
  4528. +            uint32 SecondSquadState;
  4529. +            uint64 SkybreakerBossGUID;
  4530. +            uint64 OrgrimmarBossGUID;
  4531. +            uint64 DeathbringerSaurfangGbGUID;
  4532. +            uint64 MuradinBronzebeardGbGUID;
  4533. +            uint64 DeathbringerSaurfangNotVisualGUID;
  4534. +            uint64 MuradinBronzebeardNotVisualGUID;
  4535. +            uint64 GbBattleMageGUID;
  4536. +           //
  4537.              uint64 DeathbringerSaurfangGUID;
  4538.              uint64 DeathbringerSaurfangDoorGUID;
  4539.              uint64 DeathbringerSaurfangEventGUID;   // Muradin Bronzebeard or High Overlord Saurfang
  4540. @@ -1277,6 +1531,11 @@ class instance_icecrown_citadel : public InstanceMapScript
  4541.              uint64 FrozenBolvarGUID;
  4542.              uint64 PillarsChainedGUID;
  4543.              uint64 PillarsUnchainedGUID;
  4544. +            uint64 GunShipControllerGUID;
  4545. +            uint64 GBMuradinGUID;
  4546. +            uint64 GBSaurfangGUID;
  4547. +            uint64 GBSkybreakerGUID;
  4548. +            uint64 GBOgrimsHammerGUID;
  4549.              uint32 TeamInInstance;
  4550.              uint32 ColdflameJetsState;
  4551.              uint32 FrostwyrmCount;
  4552. @@ -1289,6 +1548,7 @@ class instance_icecrown_citadel : public InstanceMapScript
  4553.              bool IsOozeDanceEligible;
  4554.              bool IsNauseaEligible;
  4555.              bool IsOrbWhispererEligible;
  4556. +            bool isPrepared;
Advertisement
Add Comment
Please, Sign In to add comment