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