Guest User

Untitled

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