bgtracker

Gunship Battle by Bgtracker

Feb 24th, 2012
930
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 67.30 KB | None | 0 0
  1. #include "ScriptPCH.h"
  2. #include "icecrown_citadel.h"
  3. #include "MapManager.h"
  4. #include "Transport.h"
  5.  
  6. // Fusileros
  7. #define NPC_ZAFOD_BOOMBOX                                       37184
  8. #define ITEM_GOBLIN_ROCKET_PACK                         49278
  9.  
  10. const Position SpawnZafodAlliance               =       {0.0f, 0.0f, 0.0f, 0.0f};
  11. const Position SpawnZafodHorde                  =       {0.0f, 0.0f, 0.0f, 0.0f};
  12.  
  13. #define ZAFOD_BOOMBOX_GOSSIP_GET                        1000
  14. #define ZAFOD_BOOMBOX_GOSSIP_CANCEL                     1001
  15.  
  16. // Do_Action
  17. #define DO_ACTION_START_GUNSHIP_BATTLE          0
  18. #define DO_ACTION_FINISH_GUNSHIP_BATTLE         1
  19.  
  20. // tp de fin
  21. const Position DeathbringerRise = { -549.80548f, 2211.19238f, 539.29119f, 6.27718f};
  22.  
  23. // Spawns de NPCs
  24. #define SPAWN_SERGEANT                                          0
  25. #define SPAWN_DISTANCE_0                                        1       // Soldado con Mortero o Lanza Cohetes
  26. #define SPAWN_CAC                                                       2       // Infante de marina o Saqueador
  27. #define SPAWN_CAST                                                      3       // Hechizero o Mago de batalla
  28. #define SPAWN_DISTANCE_1                                        4       // Fusileros o Lanzadores de hachas
  29.  
  30. // Zonas de Spawns
  31. const Position SpawnPosAlliance[] =
  32. {
  33.         {0.0f, 0.0f, 0.0f, 0.0f},
  34.         {0.0f, 0.0f, 0.0f, 0.0f},
  35.         {0.0f, 0.0f, 0.0f, 0.0f},
  36.         {0.0f, 0.0f, 0.0f, 0.0f},
  37.         {0.0f, 0.0f, 0.0f, 0.0f}
  38. };
  39. const Position SpawnPosHorde[] =
  40. {
  41.         {0.0f, 0.0f, 0.0f, 0.0f},
  42.         {0.0f, 0.0f, 0.0f, 0.0f},
  43.         {0.0f, 0.0f, 0.0f, 0.0f},
  44.         {0.0f, 0.0f, 0.0f, 0.0f},
  45.         {0.0f, 0.0f, 0.0f, 0.0f}
  46. };
  47.  
  48. //-----------------------------------------------------------------------
  49. // Alianza :
  50. #define GO_SKYBREAKER                                           192242
  51. #define GO_GUNSHIP_STAIRS_ALLIANCE                      201709  // Acceso innecesario, imposible
  52. #define GO_ALLIANCE_GUNSHIP_PORTAL                      195371  // z Ъtiles ?
  53. #define NPC_GUNSHIP_CANNON_ALLIANCE                     34929
  54.  
  55. #define SKYBREAKER_X                                            0
  56. #define SKYBREAKER_Y                                            0
  57. #define SKYBREAKER_Z                                            0
  58. #define SKYBREAKER_RAYON                                        0
  59.  
  60. #define NPC_MURADIN_BRONZEBEARD                         36948
  61.  
  62. // Dialogos
  63. #define ALLIANCE_GOSSIP_ACTION_START            10875
  64. #define ALLIANCE_GOSSIP_ACTION_CANCEL           1001
  65. #define ALLIANCE_GOSSIP_ACTION_TP                       1002
  66.  
  67. const Position PosMuradinBronzebeard[]=
  68. {
  69.     {-472.596f, 2466.8701f, 190.7371f, 6.204f}, // Primera posicion
  70.     {0.0f, 0.0f, 0.0f, 0.0f}                                    // Segunda posicion
  71. };
  72.  
  73. #define NPC_SKYBREAKER_SERGEANT                         36961
  74. #define NPC_SKYBREAKER_MORTAR_SOLDIER           36978
  75. #define NPC_SKYBREAKER_MARINE                           36950
  76. #define NPC_SKYBREAKER_SORCERER                         37026
  77. #define NPC_SKYBREAKER_RIFLEMAN                         36969
  78.  
  79. #define AURA_ON_SKYBREAKER                                      70120
  80.  
  81. //-----------------------------------------------------------------------
  82.  
  83. //-----------------------------------------------------------------------
  84. // HORDA :
  85. #define GO_OGRIM_HAMMER                                         192241
  86. #define GO_GUNSHIP_STAIRS_HORDE                         202211  // Innecesario.
  87. #define GO_HORDE_GUNSHIP_PORTAL                         196413  // z Ъtil ?
  88. #define NPC_GUNSHIP_CANNON_HORDE                        34935
  89.  
  90. #define OGRIM_HAMMER_X                                          0
  91. #define OGRIM_HAMMER_Y                                          0
  92. #define OGRIM_HAMMER_Z                                          0
  93. #define OGRIM_HAMMER_RAYON                                      0
  94.  
  95. #define NPC_HIGH_OVERLORD_VAROK_SAURFANG        36939
  96.  
  97. // Dialogos
  98. #define HORDE_GOSSIP_ACTION_START                       10876
  99. #define HORDE_GOSSIP_ACTION_CANCEL                      1004
  100. #define HORDE_GOSSIP_ACTION_TP                          1005
  101.  
  102. const Position PosHighOverlordVarokSaurfang[]=
  103. {
  104.         {0.0f, 0.0f, 0.0f, 0.0f},       // Primera posicion
  105.     {0.0f, 0.0f, 0.0f, 0.0f}    // Segunda posicion
  106. };
  107.  
  108. #define NPC_KORKRON_SERGEANT                            36960
  109. #define NPC_KORKRON_ROCKETEER                           36982
  110. #define NPC_KORKRON_REAVER                                      36957
  111. #define NPC_KORKRON_BATTLE_MAGE                         37117
  112. #define NPC_KORKRON_AXETHROWER                          36968
  113.  
  114. #define AURA_ON_OGRIM_HAMMER                            70121
  115.  
  116. //-----------------------------------------------------------------------
  117.  
  118. // CANON_GUNSHIP
  119. #define SPELL_CANNON_BLAST                                      69400
  120. #define SPELL_INCINERATING_BLAST                        69402
  121.  
  122. // MURADIN BARBABRONCE// ALTO_SENOR_SUPREMO_COLMILLOSAURIO
  123. #define SPELL_CLEAVE                                            15284
  124. #define SPELL_RENDING_THROW                                     70309
  125. #define SPELL_TASTE_OF_BLOOD                            69634
  126.  
  127. #define AURA_BATTLE_FURY_10                                     72306
  128. #define AURA_BATTLE_FURY_25                                     72307
  129.  
  130. // TODOS LOS ENEMIGOS TIENEN ESTE HECHIZO EXCEPTO LOS COMANDANTES
  131. #define SPELL_BURNING_PITCH                                     71335
  132.  
  133. // HECHICERO // MAGO_DE_BATALLA
  134. #define SPELL_BELOW_ZERO                                        69705
  135.  
  136. // SOLDADO_CON_MORTERO // LANZACOHETES
  137. #define SPELL_ROCKET_ARTILLERY                          69679
  138. #define SPELL_EXPLOSION                                         69680   // Efecto, cuando el cohete explosiona en el suelo.
  139.  
  140. // SARGENTO
  141. #define SPELL_BLADESTORM                                        69652
  142. #define SPELL_BLADESTORM_TRIGGER                        69653   // Uso innecesario SPELL_BLADESTORM
  143. #define SPELL_DESPERATE_RESOLVE_10_NM           69647
  144. #define SPELL_DESPERATE_RESOLVE_10_HM           72537
  145. #define SPELL_DESPERATE_RESOLVE_25_NM           72536
  146. #define SPELL_DESPERATE_RESOLVE_25_HM           72538
  147. #define SPELL_WOUNDING_STRIKE_10_NM                     69651
  148. #define SPELL_WOUNDING_STRIKE_10_HM                     72570
  149. #define SPELL_WOUNDING_STRIKE_25_NM                     72569
  150. #define SPELL_WOUNDING_STRIKE_25_HM                     72571
  151.  
  152. // FUSILEROS
  153. #define SPELL_SHOOT_10_NM                                       70162
  154. #define SPELL_SHOOT_10_HM                                       72567
  155. #define SPELL_SHOOT_25_NM                                       72566
  156. #define SPELL_SHOOT_25_HM                                       72568
  157.  
  158. // LANZADORES_DE_HACHAS
  159. #define SPELL_HURL_AXE_10_NM                            70161
  160. #define SPELL_HURL_AXE_10_HM                            72540
  161. #define SPELL_HURL_AXE_25_NM                            72539
  162. #define SPELL_HURL_AXE_25_HM                            72541
  163.  
  164. // BUFFOS_DE_EXPERIENCIA
  165. #define SPELL_EXPERIENCED                                       71188
  166. #define SPELL_VETERAN                                           71193
  167. #define SPELL_ELITE                                                     71195
  168.  
  169. //-----------------------------------------------------------------------
  170. //------------------------------ GRITOS ----------------------------------
  171. //-----------------------------------------------------------------------
  172. // HORDA ----------------------------------------------------------------
  173. //-----------------------------------------------------------------------
  174. // PRIMERA_ESCUADRA_ASISTIDA
  175. #define SAY_KORKRON_FIRST_SQUAD_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."
  176. #define SAY_KORKRON_FIRST_SQUAD_1       "This should be helpin'ya!"
  177.  
  178. // SEGUNDA_ESCUADRA_ASISTIDA
  179. #define SAY_KORKRON_SECOND_SQUAD_0      "Aka'Magosh, brave warriors. The alliance is in great number here."
  180. #define SAY_KORKRON_SECOND_SQUAD_1      "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."
  181.  
  182. // COMIENZA_EL_EVENTO
  183. #define YELL_EVENT_BEGIN_HORDE_HIGH_OVERLORD_SAURFANG_0 "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!"
  184. #define YELL_EVENT_BEGIN_HORDE_HIGH_OVERLORD_SAURFANG_1 "What is that?! Something approaching in the distance!"
  185. #define YELL_EVENT_BEGIN_HORDE_HIGH_OVERLORD_SAURFANG_2 "ALLIANCE GUNSHIP! ALL HANDS ON DECK!"
  186. #define YELL_EVENT_BEGIN_HORDE_MURADIN_BRONZEBEARD_0    "Move yer jalopy or we'll blow it out of the sky, orc! The Horde's got no business here!"
  187. #define YELL_EVENT_BEGIN_HORDE_HIGH_OVERLORD_SAURFANG_3 "You will know our business soon! KOR'KRON, ANNIHILATE THEM!"
  188.  
  189. // EMBARQUE AL MARTILLO ORGRIMMAR
  190. #define YELL_BOARDING_ORGRIM_S_HAMMER_MURADIN_BRONZEBEARD_0             "Marines, Sergeants, attack!"
  191. #define YELL_BOARDING_ORGRIM_S_HAMMER_HIGH_OVERLORD_SAURFANG_0  "You DARE board my ship? Your death will come swiftly."
  192.  
  193. // NUEVO_FUSILERO
  194. #define YELL_NEW_RIFLEMEN_MURADIN               "Riflemen, shoot faster!"
  195. // NUEVO_EQUIPO_DE_MORTERO
  196. #define YELL_NEW_MORTAR_TEAM_MURADIN    "Mortar team, reload!"
  197. // NUEVO_MAGO
  198. #define YELL_NEW_MAGE_MURADIN                   "We're taking hull damage, get a sorcerer out here to shut down those cannons!"
  199. // VICTORIA_HORDA
  200. #define YELL_HORDE_VICTORY_SAURFANG             "The Alliance falter. Onward to the Lich King!"
  201. // DERROTA_HORDA
  202. #define YELL_HORDE_DEFEAT_SAURFANG              "Damage control! Put those fires out! You haven't seen the last of the Horde!"
  203.  
  204. // ALIANZA -------------------------------------------------------------
  205. //-----------------------------------------------------------------------
  206. // PRIMERA_ESCUADRA_ASISTIDA
  207. #define SAY_SKYBREAKER_FIRST_SQUAD_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."
  208. #define SAY_SKYBREAKER_FIRST_SQUAD_1    "This ought to help!"
  209.  
  210. // SEGUNDA_ESCUADRA_ASISTIDA
  211. #define SAY_SKYBREAKER_SECOND_SQUAD_0   "You have my thanks. We were outnumbered until you arrived."
  212. #define SAY_SKYBREAKER_SECOND_SQUAD_1   "Captain Muradin is waiting aboard The Skybreaker. We'll secure the area until you are ready for take off."
  213. #define SAY_SKYBREAKER_SECOND_SQUAD_2   "Skybreaker infantry, hold position!"
  214.  
  215. // COMIENZA_EL_EVENTO
  216. #define YELL_EVENT_BEGIN_ALLIANCE_MURADIN_BRONZEBEARD_0         "Fire up the engines! We got a meetin' with destiny, lads!"
  217. #define YELL_EVENT_BEGIN_ALLIANCE_MURADIN_BRONZEBEARD_1         "Hold on to yer hats!"
  218. #define YELL_EVENT_BEGIN_ALLIANCE_MURADIN_BRONZEBEARD_2         "What in the world is that? Grab me spyglass, crewman!"
  219. #define YELL_EVENT_BEGIN_ALLIANCE_MURADIN_BRONZEBEARD_3         "By me own beard! HORDE SAILIN' IN FAST 'N HOT!"
  220. #define YELL_EVENT_BEGIN_ALLIANCE_MURADIN_BRONZEBEARD_4         "EVASIVE ACTION! MAN THE GUNS!"
  221. #define YELL_EVENT_BEGIN_ALLIANCE_MURADIN_BRONZEBEARD_5         "Cowardly dogs! Ye blindsided us!"
  222. #define YELL_EVENT_BEGIN_ALLIANCE_HIGH_OVERLORD_SAURFANG_0      "This is not your battle, dwarf. Back down or we will be forced to destroy your ship."
  223. #define YELL_EVENT_BEGIN_ALLIANCE_MURADIN_BRONZEBEARD_6         "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!"
  224.  
  225. // EMBARCANDO_EL_ROMPECIELOS
  226. #define YELL_BOARDING_THE_SKYBREAKER_HIGH_OVERLORD_SAURFANG_0   "Reavers, Sergeants, attack!"
  227. #define YELL_BOARDING_THE_SKYBREAKER_MURADIN_BRONZEBEARD_0              "What's this then?! Ye won't be takin' this son o' Ironforge's vessel without a fight!."
  228.  
  229. // NUEVO_LANZAHACHAS
  230. #define YELL_NEW_AXETHROWERS_HIGH_OVERLORD_SAURFANG_0   "Axethrowers, hurl faster!"
  231.  
  232. // NUEVO_FUSILEROS
  233. #define YELL_NEW_ROCKETEERS_HIGH_OVERLORD_SAURFANG_0    "Rocketeers, reload!"
  234.  
  235. // NUEVO_MAGO_DE_BATALLA
  236. #define YELL_NEW_BATTLE_MAGE_HIGH_OVERLORD_SAURFANG_0   "We're taking hull damage, get a battle-mage out here to shut down those cannons!"
  237.  
  238. // VICTORIA_ALIANZA
  239. #define YELL_ALLIANCE_VICTORY_MURADIN_BRONZEBEARD_0             "Don't say I didn't warn ya, scoundrels! Onward, brothers and sisters!"
  240.  
  241. // DERROTA_ALIANZA
  242. #define YELL_ALLIANCE_DEFEAT_MURADIN_BRONZEBEARD_0              "Captain Bartlett, get us out of here! We're taken too much damage to stay afloat!"
  243.  
  244.  
  245. //-----------------------------------------------------------------------
  246. #define SPELL_ACHIEVEMENT                                                               72959
  247.  
  248. //-----------------------------------------------------------------------
  249. #define PHASE_NOT_STARTED       0
  250. #define PHASE_DISTANCE          1
  251. #define PHASE_BOARDING          2
  252. #define PHASE_END                       3
  253.  
  254. #define EXP_NULL                        0
  255. #define EXP_EXPERIENCED         20000
  256. #define EXP_VETERAN                     40000
  257. #define EXP_ELITE                       80000
  258.  
  259. //-----------------------------------------------------------------------
  260.  
  261. void buffExp( ScriptedAI * _script, uint32 timer_Spawn)
  262. {
  263.         if( timer_Spawn < EXP_EXPERIENCED)
  264.                 return;
  265.         if( timer_Spawn > EXP_EXPERIENCED && timer_Spawn < EXP_VETERAN) {
  266.                 _script->DoCast( _script->me, SPELL_EXPERIENCED);
  267.                 return;
  268.         }
  269.         if( timer_Spawn > EXP_VETERAN && timer_Spawn < EXP_ELITE) {
  270.                 _script->DoCast( _script->me, SPELL_VETERAN);
  271.                 return;
  272.         }
  273.         if( timer_Spawn > EXP_ELITE) {
  274.                 _script->DoCast( _script->me, SPELL_ELITE);
  275.                 return;
  276.         }
  277. }
  278.  
  279. class npc_zafod_boombox : public CreatureScript
  280. {
  281.         public:
  282.                 npc_zafod_boombox() : CreatureScript("npc_zafod_boombox") { }
  283.  
  284.                 struct npc_zafod_boomboxAI : public ScriptedAI
  285.                 {
  286.                         npc_zafod_boomboxAI(Creature* pCreature) : ScriptedAI(pCreature)
  287.             { pInstance = me->GetInstanceScript(); }
  288.  
  289.                         void UpdateAI( const uint32 diff) { }
  290.  
  291.                         InstanceScript* pInstance;
  292.                 };
  293.  
  294.                 bool OnGossipHello(Player* pPlayer, Creature* pCreature)
  295.         {
  296.                         if ( pCreature->GetInstanceScript()->GetBossState(DATA_GUNSHIP_BATTLE_EVENT) == NOT_STARTED ||
  297.                                  pCreature->GetInstanceScript()->GetBossState(DATA_GUNSHIP_BATTLE_EVENT) == DONE)
  298.                 return false;
  299.  
  300.                         pPlayer->ADD_GOSSIP_ITEM(49278, "Dame una de estas maquinas", 1000, ZAFOD_BOOMBOX_GOSSIP_GET);
  301.                         pPlayer->ADD_GOSSIP_ITEM(0, "Tal vez, mas tarde", 1001, ZAFOD_BOOMBOX_GOSSIP_CANCEL);
  302.                         pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
  303.  
  304.                         return true;
  305.                 }
  306.  
  307.                 bool OnGossipSelect(Player* player, Creature* pCreature, uint32 /*sender*/, uint32 action)
  308.                 {
  309.                         player->PlayerTalkClass->ClearMenus();
  310.                         player->CLOSE_GOSSIP_MENU();
  311.  
  312.                         switch( action) {
  313.                                 case    ALLIANCE_GOSSIP_ACTION_START    :
  314.                                                         pCreature->AI()->DoAction( DO_ACTION_START_GUNSHIP_BATTLE); // lancement de la cannonicre !
  315.                                                         return true;
  316.                                 case    ALLIANCE_GOSSIP_ACTION_TP               :
  317.                                                         pCreature->AI()->DoAction( DO_ACTION_FINISH_GUNSHIP_BATTLE); // aprcs fin de la cannonicre !
  318.                                                         return true;
  319.                                 case    ALLIANCE_GOSSIP_ACTION_CANCEL   :
  320.                                                         return true;
  321.                         };
  322.  
  323.                         return false;
  324.                 }
  325.  
  326.         CreatureAI* GetAI(Creature* pCreature) const
  327.         {
  328.             return new npc_zafod_boomboxAI(pCreature);
  329.         }
  330. };
  331.  
  332. class boss_muradin_bronzebeard : public CreatureScript
  333. {
  334.     public:
  335.         boss_muradin_bronzebeard() : CreatureScript("boss_muradin_bronzebeard") { }
  336.  
  337.                 struct boss_muradin_bronzebardAI : public BossAI
  338.                 {
  339.                         boss_muradin_bronzebardAI(Creature* pCreature) : BossAI(pCreature, DATA_GUNSHIP_BATTLE_EVENT)
  340.             {
  341.                                 instance->SetBossState( DATA_GUNSHIP_BATTLE_EVENT, NOT_STARTED);
  342.  
  343.                                 instance->SetData( DATA_GUNSHIP_BATTLE, PHASE_NOT_STARTED);
  344.  
  345.                                 bDialog = false;
  346.                                 dialogID = 0;
  347.                                 dialogTimer = 0;
  348.                         }
  349.  
  350.                         void Reset()
  351.                         {
  352.                                 timer_Cleave            =       urand( 8000, 10000);
  353.                                 timer_RendingThrow      =       urand( 10000, 12000);
  354.                                 timer_TasteOfBlood      =       0;      // -40%
  355.  
  356.                                 bDialog = false;
  357.                                 dialogID = 0;
  358.                                 dialogTimer = 0;
  359.                         }
  360.  
  361.                         void DamageTaken(Unit* /*done_by*/, uint32& damage)
  362.                         {
  363.                                 if( !bBattleStart)
  364.                                         damage = 0;
  365.                         }
  366.  
  367.                         void EnterCombat(Unit* /*who*/)
  368.                         {
  369.                         }
  370.  
  371.                         void Spawn( uint32 code)
  372.                         {
  373.                                 uint8 spawn = floor( (long double) urand( 0, 5));
  374.                                 switch( code) {
  375.                                         case    SPAWN_SERGEANT          :
  376.                                                 lSummons.push_back( DoSpawnCreature( NPC_KORKRON_SERGEANT, SpawnPosHorde[spawn].GetPositionX(), SpawnPosHorde[spawn].GetPositionY(), SpawnPosHorde[spawn].GetPositionZ(), SpawnPosHorde[spawn].GetOrientation(), TEMPSUMMON_DEAD_DESPAWN,0));
  377.                                                 break;
  378.                                         case    SPAWN_DISTANCE_0        :
  379.                                                 lSummons.push_back( DoSpawnCreature( NPC_KORKRON_ROCKETEER, SpawnPosHorde[spawn].GetPositionX(), SpawnPosHorde[spawn].GetPositionY(), SpawnPosHorde[spawn].GetPositionZ(), SpawnPosHorde[spawn].GetOrientation(), TEMPSUMMON_DEAD_DESPAWN,0));
  380.                                                 break;
  381.                                         case    SPAWN_CAC                       :
  382.                                                 lSummons.push_back( DoSpawnCreature( NPC_KORKRON_REAVER, SpawnPosHorde[spawn].GetPositionX(), SpawnPosHorde[spawn].GetPositionY(), SpawnPosHorde[spawn].GetPositionZ(), SpawnPosHorde[spawn].GetOrientation(), TEMPSUMMON_DEAD_DESPAWN,0));
  383.                                                 break;
  384.                                         case    SPAWN_CAST                      :
  385.                                                 lSummons.push_back( DoSpawnCreature( NPC_KORKRON_BATTLE_MAGE, SpawnPosHorde[spawn].GetPositionX(), SpawnPosHorde[spawn].GetPositionY(), SpawnPosHorde[spawn].GetPositionZ(), SpawnPosHorde[spawn].GetOrientation(), TEMPSUMMON_DEAD_DESPAWN,0));
  386.                                                 break;
  387.                                         case    SPAWN_DISTANCE_1        :
  388.                                                 lSummons.push_back( DoSpawnCreature( NPC_KORKRON_AXETHROWER, SpawnPosHorde[spawn].GetPositionX(), SpawnPosHorde[spawn].GetPositionY(), SpawnPosHorde[spawn].GetPositionZ(), SpawnPosHorde[spawn].GetOrientation(), TEMPSUMMON_DEAD_DESPAWN,0));
  389.                                                 break;
  390.                                 };
  391.                         }
  392.  
  393.                         void Start()
  394.                         {
  395.                                 //zafodBoombox = DoSpawnCreature( NPC_ZAFOD_BOOMBOX, SpawnPosHorde[spawn].GetPositionX(), SpawnPosHorde[spawn].GetPositionY(), SpawnPosHorde[spawn].GetPositionZ(), SpawnPosHorde[spawn].GetOrientation(), TEMPSUMMON_DEAD_DESPAWN,0)
  396.                                
  397.                         }
  398.  
  399.                         void UpdateAI( const uint32 diff)
  400.                         {
  401.                                 if( bDialog) {
  402.                                         if( dialogTimer <= diff) {
  403.                                                 switch( dialogID) {
  404.  
  405.                                                 // START_EVENT
  406.                                                         case    0       :
  407.                                                                 me->MonsterYell( YELL_EVENT_BEGIN_ALLIANCE_MURADIN_BRONZEBEARD_0, LANG_UNIVERSAL, 0);
  408.                                                                 dialogID = 1;
  409.                                                                 dialogTimer = 2000;
  410.                                                                 break;
  411.                                                         case    1       :
  412.                                                                 me->MonsterYell( YELL_EVENT_BEGIN_ALLIANCE_MURADIN_BRONZEBEARD_1, LANG_UNIVERSAL, 0);
  413.                                                                 dialogID = 2;
  414.                                                                 dialogTimer = 2000;
  415.                                                                 break;
  416.                                                         case    2       :
  417.                                                                 me->MonsterYell( YELL_EVENT_BEGIN_ALLIANCE_MURADIN_BRONZEBEARD_2, LANG_UNIVERSAL, 0);
  418.                                                                 dialogID = 3;
  419.                                                                 dialogTimer = 2000;
  420.                                                                 break;
  421.                                                         case    3       :
  422.                                                                 me->MonsterYell( YELL_EVENT_BEGIN_ALLIANCE_MURADIN_BRONZEBEARD_3, LANG_UNIVERSAL, 0);
  423.                                                                 dialogID = 4;
  424.                                                                 dialogTimer = 2000;
  425.                                                                 break;
  426.                                                         case    4       :
  427.                                                                 me->MonsterYell( YELL_EVENT_BEGIN_ALLIANCE_MURADIN_BRONZEBEARD_4, LANG_UNIVERSAL, 0);
  428.                                                                 dialogID = 5;
  429.                                                                 dialogTimer = 2000;
  430.                                                                 break;
  431.                                                         case    5       :
  432.                                                                 me->MonsterYell( YELL_EVENT_BEGIN_ALLIANCE_MURADIN_BRONZEBEARD_5, LANG_UNIVERSAL, 0);
  433.                                                                 dialogID = 6;
  434.                                                                 dialogTimer = 2000;
  435.                                                                 break;
  436.                                                         case    6       :
  437.                                                                 if( Creature* pHighOverlordSaurfang = Unit::GetCreature(*me, instance->GetData64( NPC_HIGH_OVERLORD_VAROK_SAURFANG))) {
  438.                                                                         pHighOverlordSaurfang->MonsterYell( YELL_EVENT_BEGIN_ALLIANCE_HIGH_OVERLORD_SAURFANG_0, LANG_UNIVERSAL, 0);
  439.                                                                         dialogID = 7;
  440.                                                                         dialogTimer = 2000;
  441.                                                                 }
  442.                                                                 break;
  443.                                                         case    7       :
  444.                                                                 me->MonsterYell( YELL_EVENT_BEGIN_ALLIANCE_MURADIN_BRONZEBEARD_6, LANG_UNIVERSAL, 0);
  445.                                                                 dialogID = 8;
  446.                                                                 dialogTimer = 2000;
  447.                                                                 break;
  448.                                                         case    8       :
  449.                                                                 {
  450.                                                                         Position tp = PosMuradinBronzebeard[1];
  451.                                                                         Map::PlayerList const &PlayerList = me->GetMap()->GetPlayers();
  452.                                                                         if( !PlayerList.isEmpty()) {
  453.                                                                                 for(Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) {
  454.                                                                                         if( Player *pCurrent = i->getSource()) {
  455.                                                                                                 if( me->GetDistance(pCurrent) <= 100.0f)
  456.                                                                                                         DoTeleportPlayer( pCurrent, tp.GetPositionX(), tp.GetPositionY(), tp.GetPositionZ(), tp.GetOrientation());
  457.                                                                                         }
  458.                                                                                 }
  459.                                                                         }
  460.  
  461.                                                                         me->SetPosition( tp, true);
  462.                                                                         dialogID = 9;
  463.                                                                         dialogTimer = 10000;
  464.                                                                 }
  465.                                                                 break;
  466.  
  467.                                                 // EMBARQUE_EVENTO
  468.                                                         case    9       :
  469.                                                                 if( Creature* pHighOverlordSaurfang = Unit::GetCreature(*me, instance->GetData64( NPC_HIGH_OVERLORD_VAROK_SAURFANG))) {
  470.                                                                         pHighOverlordSaurfang->MonsterYell( YELL_BOARDING_ORGRIM_S_HAMMER_HIGH_OVERLORD_SAURFANG_0, LANG_UNIVERSAL, 0);
  471.                                                                         dialogID = 10;
  472.                                                                         dialogTimer = 2000;
  473.                                                                 }
  474.                                                                 break;
  475.                                                         case    10      :
  476.                                                                 me->MonsterYell( YELL_BOARDING_ORGRIM_S_HAMMER_MURADIN_BRONZEBEARD_0, LANG_UNIVERSAL, 0);
  477.                                                                 dialogID = 11;
  478.                                                                 dialogTimer = 2000;
  479.                                                                 break;
  480.                                                         case    11      :
  481.                                                                 // ? COMIENZO DE LA BATALLA DE LOS CANONES !
  482.                                                                 this->Start();
  483.                                                                 break;
  484.                                                 };
  485.                                         } else dialogTimer -= diff;
  486.                                 } else
  487.  
  488.                                 if( bBattleStart) {
  489.                                         if (!UpdateVictim())
  490.                                                 return;
  491.                                
  492.                                         if( ( me->GetHealth() / me->GetMaxHealth()) <= 0.4) {
  493.                                                 if( timer_TasteOfBlood <= diff) {
  494.                                                         DoCast( me, SPELL_TASTE_OF_BLOOD);
  495.                                                         timer_TasteOfBlood = 120000;
  496.                                                 } else timer_TasteOfBlood -= diff;
  497.                                         }
  498.                                
  499.                                         if( timer_Cleave <= diff) {
  500.                                                 DoCastVictim( SPELL_CLEAVE);
  501.                                                 timer_Cleave = urand( 8000, 10000);
  502.                                         } else timer_Cleave -= diff;
  503.  
  504.                                         if( timer_RendingThrow <= diff) {
  505.                                                 DoCastVictim( SPELL_RENDING_THROW);
  506.                                                 timer_RendingThrow = urand( 10000, 12000);
  507.                                         } else timer_RendingThrow -= diff;
  508.  
  509.                                         DoMeleeAttackIfReady();
  510.                                 }
  511.                         }
  512.  
  513.                         void DoAction(const int32 param)
  514.                         {
  515.                                 switch( param) {
  516.                                         case    DO_ACTION_START_GUNSHIP_BATTLE  :
  517.                                                 health_theSkybreaker = RAID_MODE( 600000, 1200000);
  518.                                                 health_ogrimsHammer = RAID_MODE( 600000, 1200000);
  519.  
  520.                                                 instance->SetBossState( DATA_GUNSHIP_BATTLE_EVENT, NOT_STARTED);
  521.                                                 instance->SetData( DATA_GUNSHIP_BATTLE, PHASE_NOT_STARTED);
  522.  
  523.                                                 bDialog = true;
  524.                                                 dialogID = 0;
  525.                                                 dialogTimer = 0;
  526.                                                 break;
  527.  
  528.                                         case    DO_ACTION_FINISH_GUNSHIP_BATTLE :
  529.                                                 Position tp = DeathbringerRise;
  530.                                                 Map::PlayerList const &PlayerList = me->GetMap()->GetPlayers();
  531.                                                 if( !PlayerList.isEmpty()) {
  532.                                                         for(Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) {
  533.                                                                 if( Player *pCurrent = i->getSource()) {
  534.                                                                         if( me->GetDistance(pCurrent) <= 100.0f)
  535.                                                                                 DoTeleportPlayer( pCurrent, tp.GetPositionX(), tp.GetPositionY(), tp.GetPositionZ(), tp.GetOrientation());
  536.                                                                 }
  537.                                                         }
  538.                                                 }
  539.                                                 break;
  540.                                 };
  541.                         }
  542.  
  543.                         uint32 health_theSkybreaker;
  544.                         uint32 health_ogrimsHammer;
  545.  
  546.                         std::list<Creature*> lSummons;
  547.                         Creature* zafodBoombox;
  548.  
  549.                         uint32 timer_Cleave;
  550.                         uint32 timer_RendingThrow;
  551.                         uint32 timer_TasteOfBlood;
  552.  
  553.                         bool bBattleStart;
  554.                         bool bDialog;
  555.                         uint32 dialogID;
  556.                         uint32 dialogTimer;
  557.                 };
  558.                
  559.         bool OnGossipHello(Player* pPlayer, Creature* pCreature)
  560.         {
  561.             if ( pPlayer->GetTeamId() == TEAM_ALLIANCE)
  562.                 return false;
  563.  
  564.             InstanceScript* pInstance = pCreature->GetInstanceScript();
  565.             if (pInstance && pInstance->GetBossState(DATA_GUNSHIP_BATTLE_EVENT) == NOT_STARTED)
  566.             {
  567.                                 pPlayer->ADD_GOSSIP_ITEM(0, "Mis aliados estan en buen estado, Muradin, Adelante", 10875, ALLIANCE_GOSSIP_ACTION_START);
  568.                                 pPlayer->ADD_GOSSIP_ITEM(0, "Volveremos mбs adelante", 631, ALLIANCE_GOSSIP_ACTION_CANCEL);
  569.                                 pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
  570.  
  571.                                 return true;
  572.                         }
  573.  
  574.             if (pInstance && pInstance->GetBossState(DATA_GUNSHIP_BATTLE_EVENT) == DONE)
  575.             {
  576.                                 pPlayer->ADD_GOSSIP_ITEM(0, "Vamos a la parte superior del Libramorte", 10876, ALLIANCE_GOSSIP_ACTION_TP);
  577.                                 pPlayer->ADD_GOSSIP_ITEM(0, "Volveremos mas adelante", 631, ALLIANCE_GOSSIP_ACTION_CANCEL);
  578.                                 pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
  579.  
  580.                                 return true;
  581.                         }
  582.             return false;
  583.         }
  584.  
  585.                 bool OnGossipSelect(Player* player, Creature* pCreature, uint32 /*sender*/, uint32 action)
  586.                 {
  587.                         player->PlayerTalkClass->ClearMenus();
  588.                         player->CLOSE_GOSSIP_MENU();
  589.  
  590.                         switch( action) {
  591.                                 case    ALLIANCE_GOSSIP_ACTION_START    :
  592.                                                         pCreature->AI()->DoAction( DO_ACTION_START_GUNSHIP_BATTLE); // ? Lanzamiento de los Canones !
  593.                                                         return true;
  594.                                 case    ALLIANCE_GOSSIP_ACTION_TP               :
  595.                                                         pCreature->AI()->DoAction( DO_ACTION_FINISH_GUNSHIP_BATTLE); // ? Fin de los canones !
  596.                                                         return true;
  597.                                 case    ALLIANCE_GOSSIP_ACTION_CANCEL   :
  598.                                                         return true;
  599.                         };
  600.  
  601.                         return false;
  602.                 }
  603.  
  604.         CreatureAI* GetAI(Creature* pCreature) const
  605.         {
  606.             return new boss_muradin_bronzebardAI(pCreature);
  607.         }
  608. };
  609.  
  610. class boss_high_overlord_varok_saurfang : public CreatureScript
  611. {
  612.     public:
  613.                 boss_high_overlord_varok_saurfang() : CreatureScript("boss_high_overlord_varok_saurfang") { }
  614.  
  615.                 struct boss_high_overlord_varok_saurfangAI : public BossAI
  616.                 {
  617.                         boss_high_overlord_varok_saurfangAI(Creature* pCreature) : BossAI(pCreature, DATA_GUNSHIP_BATTLE_EVENT)
  618.             {
  619.                                 instance->SetBossState( DATA_GUNSHIP_BATTLE_EVENT, NOT_STARTED);
  620.  
  621.                                 instance->SetData( DATA_GUNSHIP_BATTLE, PHASE_NOT_STARTED);
  622.  
  623.                                 bDialog = false;
  624.                                 dialogID = 0;
  625.                                 dialogTimer = 0;
  626.                         }
  627.  
  628.                         void Reset()
  629.                         {
  630.                                 timer_Cleave            =       urand( 8000, 10000);
  631.                                 timer_RendingThrow      =       urand( 10000, 12000);
  632.                                 timer_TasteOfBlood      =       0;      // -40%
  633.  
  634.                                 bDialog = false;
  635.                                 dialogID = 0;
  636.                                 dialogTimer = 0;
  637.                         }
  638.                        
  639.                         void DamageTaken(Unit* /*done_by*/, uint32& damage)
  640.                         {
  641.                                 if( !bBattleStart)
  642.                                         damage = 0;
  643.                         }
  644.  
  645.                         void EnterCombat(Unit* /*who*/)
  646.                         {
  647.                         }
  648.                        
  649.                         void Spawn( uint32 code)
  650.                         {
  651.                                 uint8 spawn = floor( (long double) urand( 0, 5));
  652.                                 switch( code) {
  653.                                         case    SPAWN_SERGEANT          :
  654.                                                 lSummons.push_back( DoSpawnCreature( NPC_SKYBREAKER_SERGEANT, SpawnPosAlliance[spawn].GetPositionX(), SpawnPosAlliance[spawn].GetPositionY(), SpawnPosAlliance[spawn].GetPositionZ(), SpawnPosAlliance[spawn].GetOrientation(), TEMPSUMMON_DEAD_DESPAWN,0));
  655.                                                 break;
  656.                                         case    SPAWN_DISTANCE_0        :
  657.                                                 lSummons.push_back( DoSpawnCreature( NPC_SKYBREAKER_MORTAR_SOLDIER, SpawnPosAlliance[spawn].GetPositionX(), SpawnPosAlliance[spawn].GetPositionY(), SpawnPosAlliance[spawn].GetPositionZ(), SpawnPosAlliance[spawn].GetOrientation(), TEMPSUMMON_DEAD_DESPAWN,0));
  658.                                                 break;
  659.                                         case    SPAWN_CAC                       :
  660.                                                 lSummons.push_back( DoSpawnCreature( NPC_SKYBREAKER_MARINE, SpawnPosAlliance[spawn].GetPositionX(), SpawnPosAlliance[spawn].GetPositionY(), SpawnPosAlliance[spawn].GetPositionZ(), SpawnPosAlliance[spawn].GetOrientation(), TEMPSUMMON_DEAD_DESPAWN,0));
  661.                                                 break;
  662.                                         case    SPAWN_CAST                      :
  663.                                                 lSummons.push_back( DoSpawnCreature( NPC_SKYBREAKER_SORCERER, SpawnPosAlliance[spawn].GetPositionX(), SpawnPosAlliance[spawn].GetPositionY(), SpawnPosAlliance[spawn].GetPositionZ(), SpawnPosAlliance[spawn].GetOrientation(), TEMPSUMMON_DEAD_DESPAWN,0));
  664.                                                 break;
  665.                                         case    SPAWN_DISTANCE_1        :
  666.                                                 lSummons.push_back( DoSpawnCreature( NPC_SKYBREAKER_RIFLEMAN, SpawnPosAlliance[spawn].GetPositionX(), SpawnPosAlliance[spawn].GetPositionY(), SpawnPosAlliance[spawn].GetPositionZ(), SpawnPosAlliance[spawn].GetOrientation(), TEMPSUMMON_DEAD_DESPAWN,0));
  667.                                                 break;
  668.                                 };
  669.                         }
  670.  
  671.                         void UpdateAI( const uint32 diff)
  672.                         {
  673.                                 if( bDialog) {
  674.                                         if( dialogTimer <= diff) {
  675.                                                 switch( dialogID) {
  676.  
  677.                                                 // COMIENZA_EL_EVENTO
  678.                                                         case    0       :
  679.                                                                 me->MonsterYell( YELL_EVENT_BEGIN_HORDE_HIGH_OVERLORD_SAURFANG_0, LANG_UNIVERSAL, 0);
  680.                                                                 dialogID = 1;
  681.                                                                 dialogTimer = 2000;
  682.                                                                 break;
  683.                                                         case    1       :
  684.                                                                 me->MonsterYell( YELL_EVENT_BEGIN_HORDE_HIGH_OVERLORD_SAURFANG_1, LANG_UNIVERSAL, 0);
  685.                                                                 dialogID = 2;
  686.                                                                 dialogTimer = 2000;
  687.                                                                 break;
  688.                                                         case    2       :
  689.                                                                 me->MonsterYell( YELL_EVENT_BEGIN_HORDE_HIGH_OVERLORD_SAURFANG_2, LANG_UNIVERSAL, 0);
  690.                                                                 dialogID = 3;
  691.                                                                 dialogTimer = 2000;
  692.                                                                 break;
  693.                                                         case    3       :
  694.                                                                 if( Creature* pMuradinBronzebeard = Unit::GetCreature(*me, instance->GetData64( NPC_MURADIN_BRONZEBEARD))) {
  695.                                                                         pMuradinBronzebeard->MonsterYell( YELL_EVENT_BEGIN_HORDE_MURADIN_BRONZEBEARD_0, LANG_UNIVERSAL, 0);
  696.                                                                         dialogID = 4;
  697.                                                                         dialogTimer = 2000;
  698.                                                                 }
  699.                                                                 break;
  700.                                                         case    4       :
  701.                                                                 me->MonsterYell( YELL_EVENT_BEGIN_HORDE_HIGH_OVERLORD_SAURFANG_3, LANG_UNIVERSAL, 0);
  702.                                                                 dialogID = 5;
  703.                                                                 dialogTimer = 2000;
  704.                                                                 break;
  705.                                                         case    5       :
  706.                                                                 {
  707.                                                                         Position tp = PosHighOverlordVarokSaurfang[1];
  708.                                                                         Map::PlayerList const &PlayerList = me->GetMap()->GetPlayers();
  709.                                                                         if( !PlayerList.isEmpty()) {
  710.                                                                                 for(Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) {
  711.                                                                                         if( Player *pCurrent = i->getSource()) {
  712.                                                                                                 if( me->GetDistance(pCurrent) <= 100.0f)
  713.                                                                                                         DoTeleportPlayer( pCurrent, tp.GetPositionX(), tp.GetPositionY(), tp.GetPositionZ(), tp.GetOrientation());
  714.                                                                                         }
  715.                                                                                 }
  716.                                                                         }
  717.  
  718.                                                                         me->SetPosition( tp, true);
  719.                                                                         dialogID = 6;
  720.                                                                         dialogTimer = 10000;
  721.                                                                 }
  722.                                                                 break;
  723.  
  724.                                                 // EMBARQUE_EVENTO
  725.                                                         case    6       :
  726.                                                                 if( Creature* pMuradinBronzebeard = Unit::GetCreature(*me, instance->GetData64( NPC_MURADIN_BRONZEBEARD))) {
  727.                                                                         pMuradinBronzebeard->MonsterYell( YELL_BOARDING_ORGRIM_S_HAMMER_MURADIN_BRONZEBEARD_0, LANG_UNIVERSAL, 0);
  728.                                                                         dialogID = 7;
  729.                                                                         dialogTimer = 2000;
  730.                                                                 }
  731.                                                                 break;
  732.                                                         case    7       :
  733.                                                                 me->MonsterYell( YELL_BOARDING_ORGRIM_S_HAMMER_HIGH_OVERLORD_SAURFANG_0, LANG_UNIVERSAL, 0);
  734.                                                                 dialogID = 8;
  735.                                                                 dialogTimer = 2000;
  736.                                                                 break;
  737.                                                         case    8       :
  738.                                                                 // ? COMIENZO DE LA BATALLA DE LOS CANONES !
  739.                                                                
  740.                                                                
  741.                                                                 break;
  742.                                                 };
  743.                                         } else dialogTimer -= diff;
  744.                                 }
  745.  
  746.                                 if( bBattleStart) {
  747.                                         if (!UpdateVictim())
  748.                                                 return;
  749.                                
  750.                                         if( ( me->GetHealth() / me->GetMaxHealth()) <= 0.4) {
  751.                                                 if( timer_TasteOfBlood <= diff) {
  752.                                                         DoCast( me, SPELL_TASTE_OF_BLOOD);
  753.                                                         timer_TasteOfBlood = 120000;
  754.                                                 } else timer_TasteOfBlood -= diff;
  755.                                         }
  756.                                
  757.                                         if( timer_Cleave <= diff) {
  758.                                                 DoCastVictim( SPELL_CLEAVE);
  759.                                                 timer_Cleave = urand( 8000, 10000);
  760.                                         } else timer_Cleave -= diff;
  761.  
  762.                                         if( timer_RendingThrow <= diff) {
  763.                                                 DoCastVictim( SPELL_RENDING_THROW);
  764.                                                 timer_RendingThrow = urand( 10000, 12000);
  765.                                         } else timer_RendingThrow -= diff;
  766.  
  767.                                         DoMeleeAttackIfReady();
  768.                                 }
  769.                         }
  770.  
  771.                         void DoAction(const int32 param)
  772.                         {
  773.                                 switch( param) {
  774.                                         case    DO_ACTION_START_GUNSHIP_BATTLE  :
  775.                                                 health_theSkybreaker = RAID_MODE( 600000, 1200000);
  776.                                                 health_ogrimsHammer = RAID_MODE( 600000, 1200000);
  777.  
  778.                                                 instance->SetBossState( DATA_GUNSHIP_BATTLE_EVENT, NOT_STARTED);
  779.                                                 instance->SetData( DATA_GUNSHIP_BATTLE, PHASE_NOT_STARTED);
  780.  
  781.                                                 bDialog = true;
  782.                                                 dialogID = 0;
  783.                                                 dialogTimer = 0;
  784.                                                 break;
  785.  
  786.                                         case    DO_ACTION_FINISH_GUNSHIP_BATTLE :
  787.                                                 Position tp = DeathbringerRise;
  788.                                                 Map::PlayerList const &PlayerList = me->GetMap()->GetPlayers();
  789.                                                 if( !PlayerList.isEmpty()) {
  790.                                                         for(Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) {
  791.                                                                 if( Player *pCurrent = i->getSource()) {
  792.                                                                         if( me->GetDistance(pCurrent) <= 100.0f)
  793.                                                                                 DoTeleportPlayer( pCurrent, tp.GetPositionX(), tp.GetPositionY(), tp.GetPositionZ(), tp.GetOrientation());
  794.                                                                 }
  795.                                                         }
  796.                                                 }
  797.                                                 break;
  798.                                 };
  799.                         }
  800.  
  801.                         uint32 health_theSkybreaker;
  802.                         uint32 health_ogrimsHammer;
  803.  
  804.                         std::list<Creature*> lSummons;
  805.  
  806.                         uint32 timer_Cleave;
  807.                         uint32 timer_RendingThrow;
  808.                         uint32 timer_TasteOfBlood;
  809.                        
  810.                         bool bBattleStart;
  811.                         bool bDialog;
  812.                         uint32 dialogID;
  813.                         uint32 dialogTimer;
  814.                 };
  815.                
  816.         bool OnGossipHello(Player* pPlayer, Creature* pCreature)
  817.         {
  818.             if ( pPlayer->GetTeamId() == TEAM_HORDE)
  819.                 return false;
  820.  
  821.             InstanceScript* pInstance = pCreature->GetInstanceScript();
  822.             if (pInstance && pInstance->GetBossState(DATA_GUNSHIP_BATTLE_EVENT) == NOT_STARTED)
  823.             {
  824.                                 pPlayer->ADD_GOSSIP_ITEM(0, "Listos para la batalla", 631, HORDE_GOSSIP_ACTION_START);
  825.                                 pPlayer->ADD_GOSSIP_ITEM(0, "Volveremos mбs adelante", 631, HORDE_GOSSIP_ACTION_CANCEL);
  826.                                 pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
  827.  
  828.                                 return true;
  829.                         }
  830.  
  831.             if (pInstance && pInstance->GetBossState(DATA_GUNSHIP_BATTLE_EVENT) == DONE)
  832.             {
  833.                                 pPlayer->ADD_GOSSIP_ITEM(0, "Vamos a la parte superior del Libramorte", 631, HORDE_GOSSIP_ACTION_TP);
  834.                                 pPlayer->ADD_GOSSIP_ITEM(0, "Volveremos mбs adelante", 631, HORDE_GOSSIP_ACTION_CANCEL);
  835.                                 pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
  836.  
  837.                                 return true;
  838.                         }
  839.             return false;
  840.         }
  841.  
  842.                 bool OnGossipSelect(Player* player, Creature* pCreature, uint32 /*sender*/, uint32 action)
  843.                 {
  844.                         player->PlayerTalkClass->ClearMenus();
  845.                         player->CLOSE_GOSSIP_MENU();
  846.  
  847.                         switch( action) {
  848.                                 case    HORDE_GOSSIP_ACTION_START       :
  849.                                                         pCreature->AI()->DoAction( DO_ACTION_START_GUNSHIP_BATTLE); // Comienzo !
  850.                                                         return true;
  851.                                 case    HORDE_GOSSIP_ACTION_TP          :
  852.                                                         pCreature->AI()->DoAction( DO_ACTION_FINISH_GUNSHIP_BATTLE); // Fin !
  853.                                                         return true;
  854.                                 case    HORDE_GOSSIP_ACTION_CANCEL      :
  855.                                                         return true;
  856.                         };
  857.  
  858.                         return false;
  859.                 }
  860.  
  861.         CreatureAI* GetAI(Creature* pCreature) const
  862.         {
  863.             return new boss_high_overlord_varok_saurfangAI(pCreature);
  864.         }
  865. };
  866.  
  867. class npc_sergeant : public CreatureScript
  868. {
  869.     public:
  870.         npc_sergeant() : CreatureScript("npc_sergeant") { }
  871.  
  872.                 struct npc_sergeantAI : public ScriptedAI
  873.                 {
  874.                         npc_sergeantAI(Creature* pCreature) : ScriptedAI(pCreature)
  875.             { pInstance = me->GetInstanceScript(); }
  876.  
  877.                         void Reset()
  878.                         {
  879.                                 timer_Spawn                             =       0;
  880.  
  881.                                 timer_Bladestorm                =       7000;
  882.                                 timer_WoundingStrike    =       urand( 10000, 12000);
  883.                                 timer_BurningPitch              =       60000;
  884.                                 timer_DesperateResolve  =       0; // -40% de Vida
  885.                         }
  886.  
  887.                         void UpdateAI( const uint32 diff)
  888.                         {
  889.                                 timer_Spawn += diff;
  890.                                 buffExp( this, timer_Spawn);
  891.                 if (!UpdateVictim())
  892.                     return;
  893.  
  894.                                 if( ( me->GetHealth() / me->GetMaxHealth()) <= 0.4) {
  895.                                         if( timer_DesperateResolve <= diff) {
  896.                                                 DoCast( me, RAID_MODE( SPELL_DESPERATE_RESOLVE_10_NM, SPELL_DESPERATE_RESOLVE_25_NM, SPELL_DESPERATE_RESOLVE_10_HM, SPELL_DESPERATE_RESOLVE_25_HM));
  897.                                                 timer_DesperateResolve = 120000;
  898.                                         } else timer_DesperateResolve -= diff;
  899.                                 }
  900.  
  901.                                 if( timer_Bladestorm <= diff) {
  902.                                         DoCast( me, SPELL_BLADESTORM);
  903.                                         timer_Bladestorm = 7000;
  904.                                 } else timer_Bladestorm -= diff;
  905.  
  906.                                 if( timer_BurningPitch <= diff) {
  907.                                         if( Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 10000, true)) {
  908.                                                 DoCast( pTarget, SPELL_BURNING_PITCH);
  909.                                                 timer_BurningPitch = 60000;
  910.                                         }
  911.                                 } else timer_BurningPitch -= diff;
  912.  
  913.                                 if( timer_WoundingStrike <= diff) {
  914.                                         DoCastVictim( RAID_MODE( SPELL_WOUNDING_STRIKE_10_NM, SPELL_WOUNDING_STRIKE_25_NM, SPELL_WOUNDING_STRIKE_10_HM, SPELL_WOUNDING_STRIKE_25_HM));
  915.                                         timer_WoundingStrike = urand( 10000, 12000);
  916.                                 } else timer_WoundingStrike -= diff;
  917.  
  918.                 DoMeleeAttackIfReady();
  919.                         }
  920.  
  921.                         uint32 timer_Bladestorm;
  922.                         uint32 timer_WoundingStrike;
  923.                         uint32 timer_DesperateResolve;
  924.                         uint32 timer_BurningPitch;
  925.  
  926.                         uint32 timer_Spawn;
  927.             InstanceScript* pInstance;
  928.                 };
  929.  
  930.         CreatureAI* GetAI(Creature* pCreature) const
  931.         {
  932.             return new npc_sergeantAI(pCreature);
  933.         }
  934. };
  935.  
  936. class npc_skybreaker_rifleman : public CreatureScript
  937. {
  938.     public:
  939.         npc_skybreaker_rifleman() : CreatureScript("npc_skybreaker_rifleman") { }
  940.  
  941.                 struct npc_skybreaker_riflemanAI : public ScriptedAI
  942.                 {
  943.                         npc_skybreaker_riflemanAI(Creature* pCreature) : ScriptedAI(pCreature)
  944.             { pInstance = me->GetInstanceScript(); }
  945.  
  946.                         void Reset()
  947.                         {
  948.                                 timer_Spawn                             =       0;
  949.  
  950.                                 timer_Shoot                             =       urand( 2000, 4000);
  951.                                 timer_BurningPitch              =       60000;
  952.                         }
  953.  
  954.                         void UpdateAI( const uint32 diff)
  955.                         {
  956.                                 timer_Spawn += diff;
  957.                                 buffExp( this, timer_Spawn);
  958.                 if (!UpdateVictim())
  959.                     return;
  960.  
  961.                                 if( timer_BurningPitch <= diff) {
  962.                                         if( Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 10000, true)) {
  963.                                                 DoCast( pTarget, SPELL_BURNING_PITCH);
  964.                                                 timer_BurningPitch = 60000;
  965.                                         }
  966.                                 } else timer_BurningPitch -= diff;
  967.  
  968.                                 if( timer_Shoot <= diff) {
  969.                                         DoCastVictim( RAID_MODE( SPELL_SHOOT_10_NM, SPELL_SHOOT_25_NM, SPELL_SHOOT_10_HM, SPELL_SHOOT_25_HM));
  970.                                         timer_Shoot = urand( 2000, 4000);
  971.                                 } else timer_Shoot -= diff;
  972.                         }
  973.  
  974.                         uint32 timer_Shoot;
  975.                         uint32 timer_BurningPitch;
  976.                        
  977.                         uint32 timer_Spawn;
  978.             InstanceScript* pInstance;
  979.                 };
  980.  
  981.         CreatureAI* GetAI(Creature* pCreature) const
  982.         {
  983.             return new npc_skybreaker_riflemanAI(pCreature);
  984.         }
  985. };
  986.  
  987. class npc_korkron_axethrower : public CreatureScript
  988. {
  989.     public:
  990.         npc_korkron_axethrower() : CreatureScript("npc_korkron_axethrower") { }
  991.  
  992.                 struct npc_korkron_axethrowerAI : public ScriptedAI
  993.                 {
  994.                         npc_korkron_axethrowerAI(Creature* pCreature) : ScriptedAI(pCreature)
  995.             { pInstance = me->GetInstanceScript(); }
  996.  
  997.                         void Reset()
  998.                         {
  999.                                 timer_Spawn                             =       0;
  1000.  
  1001.                                 timer_HurlAxe                   =       urand( 2000, 4000);
  1002.                                 timer_BurningPitch              =       60000;
  1003.                         }
  1004.  
  1005.                         void UpdateAI( const uint32 diff)
  1006.                         {
  1007.                                 timer_Spawn += diff;
  1008.                                 buffExp( this, timer_Spawn);
  1009.                 if (!UpdateVictim())
  1010.                     return;
  1011.  
  1012.                                 if( timer_BurningPitch <= diff) {
  1013.                                         if( Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 10000, true)) {
  1014.                                                 DoCast( pTarget, SPELL_BURNING_PITCH);
  1015.                                                 timer_BurningPitch = 60000;
  1016.                                         }
  1017.                                 } else timer_BurningPitch -= diff;
  1018.  
  1019.                                 if( timer_HurlAxe <= diff) {
  1020.                                         DoCastVictim( RAID_MODE( SPELL_HURL_AXE_10_NM, SPELL_HURL_AXE_25_NM, SPELL_HURL_AXE_10_HM, SPELL_HURL_AXE_25_HM));
  1021.                                         timer_HurlAxe = urand( 2000, 4000);
  1022.                                 } else timer_HurlAxe -= diff;
  1023.                         }
  1024.  
  1025.                         uint32 timer_HurlAxe;
  1026.                         uint32 timer_BurningPitch;
  1027.                        
  1028.                         uint32 timer_Spawn;
  1029.             InstanceScript* pInstance;
  1030.                 };
  1031.  
  1032.         CreatureAI* GetAI(Creature* pCreature) const
  1033.         {
  1034.             return new npc_korkron_axethrowerAI(pCreature);
  1035.         }
  1036. };
  1037.  
  1038. class npc_marine_or_reaver : public CreatureScript
  1039. {
  1040.     public:
  1041.         npc_marine_or_reaver() : CreatureScript("npc_marine_or_reaver") { }
  1042.  
  1043.                 struct npc_marine_or_reaverAI : public ScriptedAI
  1044.                 {
  1045.                         npc_marine_or_reaverAI(Creature* pCreature) : ScriptedAI(pCreature)
  1046.             { pInstance = me->GetInstanceScript(); }
  1047.  
  1048.                         void Reset()
  1049.                         {
  1050.                                 timer_Spawn                             =       0;
  1051.  
  1052.                                 timer_BurningPitch              =       60000;
  1053.                                 timer_DesperateResolve  =       0; // -40% de Vida
  1054.                         }
  1055.  
  1056.                         void UpdateAI( const uint32 diff)
  1057.                         {
  1058.                                 timer_Spawn += diff;
  1059.                                 buffExp( this, timer_Spawn);
  1060.                 if (!UpdateVictim())
  1061.                     return;
  1062.                                
  1063.                                 if( ( me->GetHealth() / me->GetMaxHealth()) <= 0.4) {
  1064.                                         if( timer_DesperateResolve <= diff) {
  1065.                                                 DoCast( me, RAID_MODE( SPELL_DESPERATE_RESOLVE_10_NM, SPELL_DESPERATE_RESOLVE_25_NM, SPELL_DESPERATE_RESOLVE_10_HM, SPELL_DESPERATE_RESOLVE_25_HM));
  1066.                                                 timer_DesperateResolve = 120000;
  1067.                                         } else timer_DesperateResolve -= diff;
  1068.                                 }
  1069.  
  1070.                                 if( timer_BurningPitch <= diff) {
  1071.                                         if( Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 10000, true)) {
  1072.                                                 DoCast( pTarget, SPELL_BURNING_PITCH);
  1073.                                                 timer_BurningPitch = 60000;
  1074.                                         }
  1075.                                 } else timer_BurningPitch -= diff;
  1076.  
  1077.                 DoMeleeAttackIfReady();
  1078.                         }
  1079.  
  1080.                         uint32 timer_DesperateResolve;
  1081.                         uint32 timer_BurningPitch;
  1082.                        
  1083.                         uint32 timer_Spawn;
  1084.             InstanceScript* pInstance;
  1085.                 };
  1086.  
  1087.         CreatureAI* GetAI(Creature* pCreature) const
  1088.         {
  1089.             return new npc_marine_or_reaverAI(pCreature);
  1090.         }
  1091. };
  1092.  
  1093. class npc_mortar_soldier_or_rocketeer : public CreatureScript
  1094. {
  1095.     public:
  1096.         npc_mortar_soldier_or_rocketeer() : CreatureScript("npc_mortar_soldier_or_rocketeer") { }
  1097.  
  1098.                 struct npc_mortar_soldier_or_rocketeerAI : public ScriptedAI
  1099.                 {
  1100.                         npc_mortar_soldier_or_rocketeerAI(Creature* pCreature) : ScriptedAI(pCreature)
  1101.             { pInstance = me->GetInstanceScript(); }
  1102.  
  1103.                         void Reset()
  1104.                         {
  1105.                                 timer_Spawn                             =       0;
  1106.  
  1107.                                 timer_RocketArtillery   =       urand( 10000, 15000);
  1108.                                 timer_BurningPitch              =       60000;
  1109.                         }
  1110.  
  1111.                         void UpdateAI( const uint32 diff)
  1112.                         {
  1113.                                 timer_Spawn += diff;
  1114.                                 buffExp( this, timer_Spawn);
  1115.                 if (!UpdateVictim())
  1116.                     return;
  1117.                                
  1118.                                 if( timer_BurningPitch <= diff) {
  1119.                                         if( Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 10000, true)) {
  1120.                                                 DoCast( pTarget, SPELL_BURNING_PITCH);
  1121.                                                 timer_BurningPitch = 60000;
  1122.                                         }
  1123.                                 } else timer_BurningPitch -= diff;
  1124.  
  1125.                                 if( timer_RocketArtillery <= diff) {
  1126.                                         if( Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 10000, true)) {
  1127.                                                 DoCast( pTarget, SPELL_ROCKET_ARTILLERY);
  1128.                                                 timer_RocketArtillery   =       urand( 10000, 15000);
  1129.                                         }
  1130.                                 } else timer_RocketArtillery -= diff;
  1131.                         }
  1132.  
  1133.                         uint32 timer_RocketArtillery;
  1134.                         uint32 timer_BurningPitch;
  1135.                        
  1136.                         uint32 timer_Spawn;
  1137.             InstanceScript* pInstance;
  1138.                 };
  1139.  
  1140.         CreatureAI* GetAI(Creature* pCreature) const
  1141.         {
  1142.             return new npc_mortar_soldier_or_rocketeerAI(pCreature);
  1143.         }
  1144. };
  1145.  
  1146. class npc_sorcerer_or_battle_mage : public CreatureScript
  1147. {
  1148.     public:
  1149.         npc_sorcerer_or_battle_mage() : CreatureScript("npc_sorcerer_or_battle_mage") { }
  1150.  
  1151.                 struct npc_sorcerer_or_battle_mageAI : public ScriptedAI
  1152.                 {
  1153.                         npc_sorcerer_or_battle_mageAI(Creature* pCreature) : ScriptedAI(pCreature)
  1154.             { pInstance = me->GetInstanceScript(); }
  1155.  
  1156.                         void Reset()
  1157.                         {
  1158.                                 timer_Spawn                             =       0;
  1159.  
  1160.                                 timer_BurningPitch              =       60000;
  1161.                                 timer_BelowZero                 =       urand( 10000, 15000);
  1162.                         }
  1163.  
  1164.                         void UpdateAI( const uint32 diff)
  1165.                         {
  1166.                                 timer_Spawn += diff;
  1167.                                 buffExp( this, timer_Spawn);
  1168.                 if (!UpdateVictim())
  1169.                     return;
  1170.                                
  1171.                                 if( timer_BurningPitch <= diff) {
  1172.                                         if( Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 10000, true)) {
  1173.                                                 DoCast( pTarget, SPELL_BURNING_PITCH);
  1174.                                                 timer_BurningPitch = 60000;
  1175.                                         }
  1176.                                 } else timer_BurningPitch -= diff;
  1177.  
  1178.                                 if( timer_BelowZero <= diff) {
  1179.                                         if( Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 10000, true)) {
  1180.                                                 DoCast( pTarget, SPELL_BELOW_ZERO);
  1181.                                                 timer_BelowZero = urand( 10000, 15000);
  1182.                                         }
  1183.                                 } else timer_BelowZero -= diff;
  1184.                         }
  1185.  
  1186.                         uint32 timer_BelowZero;
  1187.                         uint32 timer_BurningPitch;
  1188.                        
  1189.                         uint32 timer_Spawn;
  1190.             InstanceScript* pInstance;
  1191.                 };
  1192.  
  1193.         CreatureAI* GetAI(Creature* pCreature) const
  1194.         {
  1195.             return new npc_sorcerer_or_battle_mageAI(pCreature);
  1196.         }
  1197. };
  1198.  
  1199. void AddSC_boss_gunship_battle()
  1200. {
  1201.         new npc_sergeant();
  1202.         new npc_zafod_boombox();
  1203.         new npc_skybreaker_rifleman();
  1204.         new npc_korkron_axethrower();
  1205.         new npc_marine_or_reaver();
  1206.         new npc_mortar_soldier_or_rocketeer();
  1207.         new npc_sorcerer_or_battle_mage();
  1208.         new boss_muradin_bronzebeard();
  1209.         new boss_high_overlord_varok_saurfang();
  1210. }
Advertisement
Add Comment
Please, Sign In to add comment