Advertisement
Guest User

Untitled

a guest
Jun 25th, 2017
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.55 KB | None | 0 0
  1. diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp
  2. --- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp
  3. +++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp
  4. @@ -39,7 +39,7 @@
  5. EMOTE_PERMA = -1603268,
  6. };
  7.  
  8. -#define GOSSIP_ITEM_1 "Activate Harpoones!"
  9. +#define GOSSIP_ITEM_1 "Activate Harpoons!"
  10.  
  11. enum Spells
  12. {
  13. @@ -49,17 +49,34 @@
  14. SPELL_WINGBUFFET = 62666,
  15. SPELL_FLAMEBREATH = 63317,
  16. SPELL_FUSEARMOR = 64771,
  17. - SPELL_DEVOURING_FLAME = 63236,
  18. - SPELL_HARPOON = 54933,
  19. SPELL_FLAMED = 62696,
  20. SPELL_STUN = 9032,
  21. SPELL_BERSERK = 47008
  22. };
  23.  
  24. +enum DevouringFlameSpells
  25. +{
  26. + SPELL_DEVOURING_FLAME = 63236,
  27. + SPELL_DEVOURING_FLAME_DAMAGE = 64704,
  28. + SPELL_DEVOURING_FLAME_TRIGGER = 64709,
  29. +};
  30. +
  31. +enum HarpoonSpells
  32. +{//these spells stil need to be scripted into a spell script. the visual is the one that is used from bloody :/
  33. + SPELL_HARPOON_TRIGGER = 62505,
  34. + SPELL_HARPOON_DUMMY = 62509,
  35. + SPELL_HARPOON_SHOT_1 = 63524, //used by npc harpoon
  36. + SPELL_HARPOON_SHOT_2 = 63657,
  37. + SPELL_HARPOON_SHOT_3 = 63658,
  38. + SPELL_HARPOON_SHOT_4 = 63659,
  39. +
  40. + SPELL_HARPOON_VISUAL = 54933, //WRONG SPELL
  41. +};
  42. +
  43. const Position PosHarpoon[4] =
  44. {
  45. -{594.317f, -136.953f, 391.517f, 4.544f},
  46. -{577.449f, -136.953f, 391.517f, 4.877f},
  47. +{589.923f, -133.622f, 391.897f, 4.544f},
  48. +{571.947f, -136.012f, 391.517f, 4.877f},
  49. {607.726f, -146.857f, 391.517f, 4.041f},
  50. {561.449f, -146.857f, 391.517f, 5.426f}
  51. };
  52. @@ -90,12 +107,11 @@
  53. {560.231f, -153.677f, 391.517f, 5.403f}
  54. };
  55.  
  56. -const Position RazorFlight = {588.050f, -251.191f, 470.536f, 1.605f};
  57. +const Position RazorFlight = {588.050f, -251.191f, 470.536f, 0};
  58. const Position RazorGround = {586.966f, -175.534f, 391.517f, 1.692f};
  59.  
  60. enum Mobs
  61. {
  62. - RAZORSCALE = 33186,// ?? why not use instance?
  63. NPC_DARK_RUNE_GUARDIAN = 33388,
  64. NPC_DARK_RUNE_SENTINEL = 33846,
  65. NPC_DARK_RUNE_WATCHER = 33453,
  66. @@ -103,8 +119,7 @@
  67. NPC_COMMANDER = 33210,
  68. NPC_ENGINEER = 33287,
  69. NPC_DEFENDER = 33816,
  70. - NPC_HARPOON = 33184,
  71. - GOB_MOLE_MACHINE = 194316
  72. + NPC_HARPOON = 33282,
  73. };
  74.  
  75. enum DarkRuneSpells
  76. @@ -126,6 +141,8 @@
  77.  
  78. #define ACTION_EVENT_START 1
  79. #define ACTION_GROUND_PHASE 2
  80. +#define ACTION_HARPOON_DESTROY 3
  81. +#define ACTION_HARPOON_ACTIVATED 10
  82.  
  83. enum Phases
  84. {
  85. @@ -152,6 +169,129 @@
  86. EVENT_SUMMON
  87. };
  88.  
  89. +class boss_razorscale_controller : public CreatureScript
  90. +{
  91. + public:
  92. + boss_razorscale_controller() : CreatureScript("boss_razorscale_controller") { }
  93. +
  94. + struct boss_razorscale_controllerAI : public BossAI
  95. + {
  96. + boss_razorscale_controllerAI(Creature* pCreature) : BossAI(pCreature, DATA_RAZORSCALE_CONTROL)
  97. + {
  98. + me->SetDisplayId(11686);
  99. + }
  100. +
  101. + Creature* Harpoon[4];
  102. + uint8 HarpoonCounter;
  103. +
  104. + void Reset()
  105. + {
  106. + events.Reset();
  107. + me->SetReactState(REACT_PASSIVE);
  108. +
  109. + instance->SetBossState(DATA_RAZORSCALE_CONTROL, NOT_STARTED);
  110. + }
  111. +
  112. + void EnterCombat(Unit* who)
  113. + {
  114. + instance->SetBossState(DATA_RAZORSCALE_CONTROL, IN_PROGRESS);
  115. + // TODO: add support for gameobjects 4 different harpoon instead of npc
  116. + for (uint8 n = 0; n < RAID_MODE(2,4); ++n)
  117. + Harpoon[n] = me->SummonCreature(NPC_HARPOON, PosHarpoon[n], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 0);
  118. +
  119. + //DoCast(me, SPELL_HARPOON_TRIGGER);
  120. +
  121. + if (Creature* Razorscale = ObjectAccessor::GetCreature(*me, instance->GetData64(TYPE_RAZORSCALE)))
  122. + if (!Razorscale->isInCombat())
  123. + DoZoneInCombat(Razorscale);
  124. +
  125. + events.ScheduleEvent(EVENT_HARPOON, 60000);
  126. + }
  127. +
  128. + void SpellHit(Unit* /*caster*/, const SpellEntry* pSpell)
  129. + {
  130. + if ((pSpell->Id == SPELL_HARPOON_SHOT_1) | (pSpell->Id == SPELL_HARPOON_SHOT_2) | (pSpell->Id == SPELL_HARPOON_SHOT_3) | (pSpell->Id == SPELL_HARPOON_SHOT_4))
  131. + {
  132. + sLog.outError("Harpoon hit on controller");
  133. + HarpoonCounter++;
  134. + }
  135. + }
  136. +
  137. + void JustDied(Unit* /*killer*/)
  138. + {
  139. + _JustDied();
  140. + }
  141. +
  142. + void DoAction(const int32 action)
  143. + {
  144. + switch(action)
  145. + {
  146. + case ACTION_HARPOON_DESTROY:
  147. + sLog.outError("ACTION_HARPOON_DESTROY");
  148. + for (uint8 n = 0; n < RAID_MODE(2,4); ++n)
  149. + {
  150. + if (Harpoon[n])
  151. + Harpoon[n]->CastSpell(Harpoon[n], SPELL_FLAMED, true);
  152. +
  153. + events.ScheduleEvent(EVENT_HARPOON, 60000);
  154. + }
  155. + break;
  156. + }
  157. + }
  158. +
  159. + void UpdateAI(const uint32 diff)
  160. + {
  161. + if (instance->GetBossState(TYPE_RAZORSCALE) != IN_PROGRESS)
  162. + return;
  163. +
  164. + events.Update(diff);
  165. +
  166. + /*if (me->hasUnitState(UNIT_STAT_CASTING))
  167. + return;*/
  168. +
  169. + if (HarpoonCounter == RAID_MODE(2,4))
  170. + {
  171. + HarpoonCounter = 0;
  172. +
  173. + if (Creature* Razorscale = ObjectAccessor::GetCreature(*me, instance->GetData64(TYPE_RAZORSCALE)))
  174. + {
  175. + Razorscale->AI()->DoAction(ACTION_HARPOON_ACTIVATED);
  176. + }
  177. + }
  178. +
  179. + while (uint32 eventId = events.ExecuteEvent())
  180. + {
  181. + switch (eventId)
  182. + {
  183. + case EVENT_HARPOON:
  184. + {
  185. + if (Harpoon[0])
  186. + Harpoon[0]->MonsterTextEmote(EMOTE_HARPOON, 0, true);
  187. + for (uint8 n = 0; n < RAID_MODE(2,4); ++n)
  188. + {
  189. + if (Harpoon[n])
  190. + {
  191. + Harpoon[n]->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
  192. + Harpoon[n]->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
  193. + Harpoon[n]->SetDisplayId(22524);
  194. + }
  195. + }
  196. + events.CancelEvent(EVENT_HARPOON);
  197. + break;
  198. + }
  199. + default:
  200. + break;
  201. + }
  202. + }
  203. + }
  204. + };
  205. +
  206. + CreatureAI* GetAI(Creature* pCreature) const
  207. + {
  208. + return new boss_razorscale_controllerAI(pCreature);
  209. + }
  210. +};
  211. +
  212. class boss_razorscale : public CreatureScript
  213. {
  214. public:
  215. @@ -177,7 +317,6 @@
  216. uint32 EnrageTimer;
  217. uint32 FlyCount;
  218.  
  219. - Creature* Harpoon[4];
  220. bool PermaGround;
  221. bool Enraged;
  222.  
  223. @@ -187,14 +326,15 @@
  224. me->SetFlying(true);
  225. me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
  226. me->SetReactState(REACT_PASSIVE);
  227. - PermaGround = false;
  228. + PermaGround = false;
  229. }
  230.  
  231. void EnterCombat(Unit* /*who*/)
  232. {
  233. _EnterCombat();
  234. - for (uint8 n = 0; n < RAID_MODE(2,4); ++n)
  235. - Harpoon[n] = me->SummonCreature(NPC_HARPOON, PosHarpoon[n], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 0);
  236. + if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_RAZORSCALE_CONTROL)))
  237. + if (!controller->isInCombat())
  238. + DoZoneInCombat(controller);
  239. me->SetSpeed(MOVE_FLIGHT, 3.0f, true);
  240. me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  241. me->SetReactState(REACT_PASSIVE);
  242. @@ -216,7 +356,7 @@
  243. if (FlyCount <= 2)
  244. instance->DoCompleteAchievement(ACHIEVEMENT_QUICK_SHAVE);
  245. }
  246. - }
  247. + }
  248.  
  249. void UpdateAI(const uint32 diff)
  250. {
  251. @@ -236,7 +378,7 @@
  252. DoCast(me, SPELL_BERSERK);
  253. Enraged = true;
  254. }
  255. - else EnrageTimer -= diff;
  256. + else EnrageTimer -= diff;
  257.  
  258. if (phase == PHASE_GROUND)
  259. {
  260. @@ -256,27 +398,20 @@
  261. events.ScheduleEvent(EVENT_FIREBALL, 7000, 0, PHASE_FLIGHT);
  262. events.ScheduleEvent(EVENT_DEVOURING, 10000, 0, PHASE_FLIGHT);
  263. events.ScheduleEvent(EVENT_SUMMON, 5000, 0, PHASE_FLIGHT);
  264. - events.ScheduleEvent(EVENT_GROUND, 75000, 0, PHASE_FLIGHT);
  265. ++FlyCount;
  266. return;
  267. case EVENT_LAND:
  268. + sLog.outError("event land called");
  269. me->SetFlying(false);
  270. me->NearTeleportTo(586.966f, -175.534f, 391.517f, 1.692f);
  271. DoCast(me, SPELL_STUN, true);
  272. me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  273. if (Creature *pCommander = me->GetCreature(*me, instance->GetData64(DATA_EXP_COMMANDER)))
  274. pCommander->AI()->DoAction(ACTION_GROUND_PHASE);
  275. - events.ScheduleEvent(EVENT_HARPOON, 0, 0, PHASE_GROUND);
  276. events.ScheduleEvent(EVENT_BREATH, 30000, 0, PHASE_GROUND);
  277. events.ScheduleEvent(EVENT_BUFFET, 33000, 0, PHASE_GROUND);
  278. events.ScheduleEvent(EVENT_FLIGHT, 35000, 0, PHASE_GROUND);
  279. return;
  280. - case EVENT_HARPOON:
  281. - for (uint8 n = 0; n < RAID_MODE(2,4); ++n)
  282. - if (Harpoon[n])
  283. - Harpoon[n]->CastSpell(me, SPELL_HARPOON, true);
  284. - events.ScheduleEvent(EVENT_HARPOON, 1500, 0, PHASE_GROUND);
  285. - return;
  286. case EVENT_BREATH:
  287. me->MonsterTextEmote(EMOTE_BREATH, 0, true);
  288. DoCastAOE(SPELL_FLAMEBREATH);
  289. @@ -285,9 +420,8 @@
  290. return;
  291. case EVENT_BUFFET:
  292. DoCastAOE(SPELL_WINGBUFFET);
  293. - for (uint8 n = 0; n < RAID_MODE(2,4); ++n)
  294. - if (Harpoon[n])
  295. - Harpoon[n]->CastSpell(Harpoon[n], SPELL_FLAMED, true);
  296. + if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_RAZORSCALE_CONTROL)))
  297. + controller->AI()->DoAction(ACTION_HARPOON_DESTROY);
  298. events.CancelEvent(EVENT_BUFFET);
  299. return;
  300. }
  301. @@ -337,14 +471,6 @@
  302. {
  303. switch(eventId)
  304. {
  305. - case EVENT_GROUND:
  306. - phase = PHASE_GROUND;
  307. - events.SetPhase(PHASE_GROUND);
  308. - if (Harpoon[0])
  309. - Harpoon[0]->MonsterTextEmote(EMOTE_HARPOON, 0, true);
  310. - me->GetMotionMaster()->MovePoint(0,RazorGround);
  311. - events.ScheduleEvent(EVENT_LAND, 5500, 0, PHASE_GROUND);
  312. - return;
  313. case EVENT_FIREBALL:
  314. if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true))
  315. DoCast(pTarget, SPELL_FIREBALL);
  316. @@ -376,6 +502,7 @@
  317. me->SetSpeed(MOVE_FLIGHT, 1.0f, true);
  318. PermaGround = true;
  319. DoCastAOE(SPELL_FLAMEBREATH);
  320. + instance->SetBossState(DATA_RAZORSCALE_CONTROL, NOT_STARTED);
  321. events.ScheduleEvent(EVENT_FLAME, 15000, 0, PHASE_PERMAGROUND);
  322. events.RescheduleEvent(EVENT_DEVOURING, 15000, 0, PHASE_PERMAGROUND);
  323. events.RescheduleEvent(EVENT_BREATH, 20000, 0, PHASE_PERMAGROUND);
  324. @@ -408,6 +535,11 @@
  325. me->SetReactState(REACT_AGGRESSIVE);
  326. DoZoneInCombat();
  327. break;
  328. + case ACTION_HARPOON_ACTIVATED:
  329. + sLog.outError("doaction called");
  330. + me->GetMotionMaster()->MovePoint(0,RazorGround);
  331. + events.ScheduleEvent(EVENT_LAND, 5000, 0, PHASE_GROUND);
  332. + break;
  333. }
  334. }
  335. };
  336. @@ -587,7 +719,7 @@
  337.  
  338. void Reset()
  339. {
  340. - MoleMachine = me->SummonGameObject(GOB_MOLE_MACHINE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(),
  341. + MoleMachine = me->SummonGameObject(GO_MOLE_MACHINE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(),
  342. float(urand(0, 6)), 0, 0, 0, 0, 300);
  343. if (MoleMachine)
  344. MoleMachine->SetGoState(GO_STATE_ACTIVE);
  345. @@ -642,9 +774,10 @@
  346. struct npc_devouring_flameAI : public Scripted_NoMovementAI
  347. {
  348. npc_devouring_flameAI(Creature* pCreature) : Scripted_NoMovementAI(pCreature)
  349. - {
  350. - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_PACIFIED);
  351. + {
  352. me->SetDisplayId(11686);
  353. + me->SetReactState(REACT_PASSIVE);
  354. + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
  355. }
  356.  
  357. void Reset()
  358. @@ -817,9 +950,120 @@
  359.  
  360. };
  361.  
  362. +class boss_razorscale_harpoon : public CreatureScript
  363. +{
  364. +public:
  365. + boss_razorscale_harpoon() : CreatureScript("boss_razorscale_harpoon") {}
  366. +
  367. + CreatureAI* GetAI(Creature* pCreature) const
  368. + {
  369. + return new boss_razorscale_harpoonAI (pCreature);
  370. + }
  371. +
  372. + struct boss_razorscale_harpoonAI : public PassiveAI
  373. + {
  374. + boss_razorscale_harpoonAI(Creature *pCreature) : PassiveAI(pCreature)
  375. + {
  376. + pInstance = pCreature->GetInstanceScript();
  377. + }
  378. +
  379. + InstanceScript *pInstance;
  380. +
  381. + void DoAction(const int32 param)
  382. + {
  383. + if (param == EVENT_SPELLCLICK)
  384. + {
  385. + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
  386. + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
  387. + if (Creature* Razorscale = ObjectAccessor::GetCreature(*me, pInstance->GetData64(TYPE_RAZORSCALE)))
  388. + me->CastSpell(Razorscale, SPELL_HARPOON_VISUAL, true);
  389. + }
  390. + }
  391. + };
  392. +
  393. +};
  394. +
  395. +class spell_razorscale_devouring_flame : public SpellScriptLoader
  396. +{
  397. + public:
  398. + spell_razorscale_devouring_flame() : SpellScriptLoader("spell_razorscale_devouring_flame") { }
  399. +
  400. + class spell_razorscale_devouring_flame_AuraScript : public AuraScript
  401. + {
  402. + PrepareAuraScript(spell_razorscale_devouring_flame_AuraScript)
  403. +
  404. + bool Validate(SpellEntry const * /*spellEntry*/)
  405. + {
  406. + if (!sSpellStore.LookupEntry(SPELL_DEVOURING_FLAME_DAMAGE))//64704 10m
  407. + return false;
  408. + if (!sSpellStore.LookupEntry(SPELL_DEVOURING_FLAME_TRIGGER))//64709 10m
  409. + return false;
  410. + return true;
  411. + }
  412. +
  413. + void HandleEffectPeriodic(AuraEffect const * aurEff, AuraApplication const * aurApp)
  414. + {
  415. + Unit* aurEffCaster = aurEff->GetCaster();
  416. + if (!aurEffCaster)
  417. + return;
  418. +
  419. + Unit * target = aurApp->GetTarget();
  420. + aurEffCaster->CastSpell(target, SPELL_DEVOURING_FLAME_DAMAGE, true);
  421. + }
  422. +
  423. + void Register()
  424. + {
  425. + OnEffectPeriodic += AuraEffectPeriodicFn(spell_razorscale_devouring_flame_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
  426. + }
  427. + };
  428. +
  429. + AuraScript* GetAuraScript() const
  430. + {
  431. + return new spell_razorscale_devouring_flame_AuraScript();
  432. + }
  433. +};
  434. +
  435. +class spell_razorscale_harpoon_firestate : public SpellScriptLoader
  436. +{
  437. + public:
  438. + spell_razorscale_harpoon_firestate() : SpellScriptLoader("spell_razorscale_harpoon_firestate") { }
  439. +
  440. + class spell_razorscale_harpoon_firestate_AuraScript : public AuraScript
  441. + {
  442. + PrepareAuraScript(spell_razorscale_harpoon_firestate_AuraScript)
  443. +
  444. + bool Validate(SpellEntry const * /*spellEntry*/)
  445. + {
  446. + if (!sSpellStore.LookupEntry(SPELL_FLAMED))
  447. + return false;
  448. + return true;
  449. + }
  450. +
  451. + void HandleEffectRemove(AuraEffect const * /*aurEff*/, AuraApplication const * aurApp, AuraEffectHandleModes /*mode*/)
  452. + {
  453. + Unit * target = aurApp->GetTarget();
  454. + if (!target)
  455. + return;
  456. + if (target->GetEntry() == NPC_HARPOON)
  457. + target->SetDisplayId(11686);
  458. + }
  459. +
  460. + void Register()
  461. + {
  462. + OnEffectRemove += AuraEffectRemoveFn(spell_razorscale_harpoon_firestate_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
  463. + }
  464. + };
  465. +
  466. + AuraScript* GetAuraScript() const
  467. + {
  468. + return new spell_razorscale_harpoon_firestate_AuraScript();
  469. + }
  470. +};
  471. +
  472.  
  473. void AddSC_boss_razorscale()
  474. {
  475. + new boss_razorscale_controller();
  476. new boss_razorscale();
  477. new npc_expedition_commander();
  478. new npc_mole_machine_trigger();
  479. @@ -827,4 +1071,7 @@
  480. new npc_darkrune_watcher();
  481. new npc_darkrune_guardian();
  482. new npc_darkrune_sentinel();
  483. + new boss_razorscale_harpoon();
  484. + new spell_razorscale_devouring_flame();
  485. + new spell_razorscale_harpoon_firestate();
  486. }
  487. \ No newline at end of file
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement