1. diff --git a/sql/updates/2018_01_16_00_world.sql b/sql/updates/2018_01_16_00_world.sql
  2. new file mode 100644
  3. index 00000000..34b274f1
  4. --- /dev/null
  5. +++ b/sql/updates/2018_01_16_00_world.sql
  6. @@ -0,0 +1,2 @@
  7. +-- add scripts Orb Naxxramas
  8. +UPDATE `gameobject_template` SET `data10` = 0, `ScriptName` = 'go_naxx_orb' WHERE `entry` = 202278;
  9. \ No newline at end of file
  10. diff --git a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp
  11. index cd43f59c..f1c4f512 100644
  12. --- a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp
  13. +++ b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp
  14. @@ -62,9 +62,9 @@ public:
  15. return new boss_anubrekhanAI (pCreature);
  16. }
  17. - struct boss_anubrekhanAI : public ScriptedAI
  18. + struct boss_anubrekhanAI : public BossAI
  19. {
  20. - boss_anubrekhanAI(Creature *c) : ScriptedAI(c), summons(me)
  21. + boss_anubrekhanAI(Creature *c) : BossAI(c, BOSS_ANUB), summons(me)
  22. {
  23. pInstance = c->GetInstanceScript();
  24. sayGreet = false;
  25. @@ -84,15 +84,15 @@ public:
  26. }
  27. }
  28. - void Reset()
  29. + void Reset()
  30. {
  31. + BossAI::Reset();
  32. events.Reset();
  33. summons.DespawnAll();
  34. SummonCryptGuards();
  35. if (pInstance)
  36. {
  37. - pInstance->SetData(EVENT_ANUB, NOT_STARTED);
  38. if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_ANUB_GATE)))
  39. go->SetGoState(GO_STATE_ACTIVE);
  40. }
  41. @@ -120,13 +120,13 @@ public:
  42. void SummonedCreatureDespawn(Creature* cr) { summons.Despawn(cr); }
  43. - void JustDied(Unit* Killer)
  44. + void JustDied(Unit* killer)
  45. {
  46. + BossAI::JustDied(killer);
  47. summons.DespawnAll();
  48. if (pInstance)
  49. {
  50. pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
  51. - pInstance->SetData(EVENT_ANUB, DONE);
  52. }
  53. }
  54. @@ -147,11 +147,11 @@ public:
  55. void EnterCombat(Unit *who)
  56. {
  57. + BossAI::EnterCombat(who);
  58. me->CallForHelp(30.0f); // catch helpers
  59. Talk(SAY_AGGRO);
  60. if (pInstance)
  61. {
  62. - pInstance->SetData(EVENT_ANUB, IN_PROGRESS);
  63. if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_ANUB_GATE)))
  64. go->SetGoState(GO_STATE_READY);
  65. }
  66. diff --git a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp
  67. index fcb1de43..08979b91 100644
  68. --- a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp
  69. +++ b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp
  70. @@ -66,9 +66,9 @@ public:
  71. return new boss_faerlinaAI (pCreature);
  72. }
  73. - struct boss_faerlinaAI : public ScriptedAI
  74. + struct boss_faerlinaAI : public BossAI
  75. {
  76. - boss_faerlinaAI(Creature *c) : ScriptedAI(c), summons(me)
  77. + boss_faerlinaAI(Creature *c) : BossAI(c, BOSS_FAERLINA), summons(me)
  78. {
  79. pInstance = me->GetInstanceScript();
  80. sayGreet = false;
  81. @@ -98,24 +98,21 @@ public:
  82. void Reset()
  83. {
  84. + BossAI::Reset();
  85. events.Reset();
  86. summons.DespawnAll();
  87. SummonHelpers();
  88. - if (pInstance)
  89. - pInstance->SetData(EVENT_FAERLINA, NOT_STARTED);
  90. }
  91. void EnterCombat(Unit *who)
  92. {
  93. + BossAI::EnterCombat(who);
  94. me->SetInCombatWithZone();
  95. Talk(SAY_AGGRO);
  96. events.ScheduleEvent(EVENT_SPELL_POISON_BOLT, urand(12000,15000));
  97. events.ScheduleEvent(EVENT_SPELL_RAIN_OF_FIRE, urand(6000,18000));
  98. events.ScheduleEvent(EVENT_SPELL_FRENZY, urand(60000,80000), 1);
  99. events.SetPhase(1);
  100. -
  101. - if (pInstance)
  102. - pInstance->SetData(EVENT_FAERLINA, IN_PROGRESS);
  103. }
  104. void MoveInLineOfSight(Unit *who)
  105. @@ -141,11 +138,10 @@ public:
  106. pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
  107. }
  108. - void JustDied(Unit* Killer)
  109. + void JustDied(Unit* killer)
  110. {
  111. + BossAI::JustDied(killer);
  112. Talk(SAY_DEATH);
  113. - if (pInstance)
  114. - pInstance->SetData(EVENT_FAERLINA, DONE);
  115. }
  116. void UpdateAI(uint32 diff)
  117. diff --git a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp
  118. index 0163c70b..46b37663 100644
  119. --- a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp
  120. +++ b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp
  121. @@ -134,9 +134,9 @@ public:
  122. return new boss_four_horsemenAI (pCreature);
  123. }
  124. - struct boss_four_horsemenAI : public ScriptedAI
  125. + struct boss_four_horsemenAI : public BossAI
  126. {
  127. - boss_four_horsemenAI(Creature *c) : ScriptedAI(c)
  128. + boss_four_horsemenAI(Creature *c) : BossAI(c, BOSS_HORSEMAN)
  129. {
  130. pInstance = me->GetInstanceScript();
  131. switch (me->GetEntry())
  132. @@ -187,15 +187,13 @@ public:
  133. void Reset()
  134. {
  135. + BossAI::Reset();
  136. me->SetPosition(me->GetHomePosition());
  137. movementPhase = MOVE_PHASE_NONE;
  138. currentWaypoint = 0;
  139. me->SetReactState(REACT_AGGRESSIVE);
  140. events.Reset();
  141. - if (pInstance)
  142. - pInstance->SetData(EVENT_HORSEMAN, NOT_STARTED);
  143. -
  144. // Schedule Events
  145. events.RescheduleEvent(EVENT_SPELL_MARK_CAST, 24000);
  146. events.RescheduleEvent(EVENT_BERSERK, 100*15000);
  147. @@ -263,23 +261,23 @@ public:
  148. void JustDied(Unit* killer)
  149. {
  150. + BossAI::JustDied(killer);
  151. if (pInstance)
  152. {
  153. - pInstance->SetData(EVENT_HORSEMAN, DONE);
  154. - if (pInstance->GetData(EVENT_HORSEMAN) == DONE)
  155. + if (pInstance->GetBossState(BOSS_HORSEMAN) == DONE)
  156. + {
  157. if (!me->GetMap()->GetPlayers().isEmpty())
  158. if (Player* player = me->GetMap()->GetPlayers().getFirst()->GetSource())
  159. player->SummonGameObject(RAID_MODE(GO_HORSEMEN_CHEST_10, GO_HORSEMEN_CHEST_25), 2514.8f, -2944.9f, 245.55f, 5.51f, 0, 0, 0, 0, 0);
  160. - }
  161. + }
  162. + }
  163. Talk(SAY_DEATH);
  164. }
  165. void EnterCombat(Unit *who)
  166. {
  167. - if (pInstance)
  168. - pInstance->SetData(EVENT_HORSEMAN, IN_PROGRESS);
  169. -
  170. + BossAI::EnterCombat(who);
  171. if (movementPhase == MOVE_PHASE_NONE)
  172. {
  173. Talk(SAY_AGGRO);
  174. diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp
  175. index bf4bb563..82b93616 100644
  176. --- a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp
  177. +++ b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp
  178. @@ -74,9 +74,9 @@ public:
  179. return new boss_gluthAI (pCreature);
  180. }
  181. - struct boss_gluthAI : public ScriptedAI
  182. + struct boss_gluthAI : public BossAI
  183. {
  184. - boss_gluthAI(Creature *c) : ScriptedAI(c), summons(me)
  185. + boss_gluthAI(Creature *c) : BossAI(c, BOSS_GLUTH), summons(me)
  186. {
  187. pInstance = me->GetInstanceScript();
  188. }
  189. @@ -88,14 +88,12 @@ public:
  190. void Reset()
  191. {
  192. + BossAI::Reset();
  193. me->ApplySpellImmune(29306, IMMUNITY_ID, 29306, true);
  194. events.Reset();
  195. summons.DespawnAll();
  196. gazeTarget = 0;
  197. me->SetReactState(REACT_AGGRESSIVE);
  198. -
  199. - if (pInstance)
  200. - pInstance->SetData(EVENT_GLUTH, NOT_STARTED);
  201. }
  202. void MoveInLineOfSight(Unit *who)
  203. @@ -111,6 +109,7 @@ public:
  204. void EnterCombat(Unit *who)
  205. {
  206. + BossAI::EnterCombat(who);
  207. me->SetInCombatWithZone();
  208. events.ScheduleEvent(EVENT_SPELL_MORTAL_WOUND, 10000);
  209. events.ScheduleEvent(EVENT_SPELL_ENRAGE, 30000);
  210. @@ -118,9 +117,6 @@ public:
  211. events.ScheduleEvent(EVENT_SPELL_BERSERK, 8*60000);
  212. events.ScheduleEvent(EVENT_SUMMON_ZOMBIE, 10000);
  213. events.ScheduleEvent(EVENT_CAN_EAT_ZOMBIE, 1000);
  214. -
  215. - if (pInstance)
  216. - pInstance->SetData(EVENT_GLUTH, IN_PROGRESS);
  217. }
  218. void JustSummoned(Creature *summon)
  219. @@ -142,11 +138,10 @@ public:
  220. pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
  221. }
  222. - void JustDied(Unit*)
  223. + void JustDied(Unit* killer)
  224. {
  225. + BossAI::JustDied(killer);
  226. summons.DespawnAll();
  227. - if (pInstance)
  228. - pInstance->SetData(EVENT_GLUTH, DONE);
  229. }
  230. bool SelectPlayerInRoom()
  231. diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp
  232. index 7d291cce..07c2d443 100644
  233. --- a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp
  234. +++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp
  235. @@ -148,9 +148,9 @@ public:
  236. return new boss_gothikAI (pCreature);
  237. }
  238. - struct boss_gothikAI : public ScriptedAI
  239. + struct boss_gothikAI : public BossAI
  240. {
  241. - boss_gothikAI(Creature *c) : ScriptedAI(c), summons(me)
  242. + boss_gothikAI(Creature *c) : BossAI(c, BOSS_GOTHIK), summons(me)
  243. {
  244. pInstance = me->GetInstanceScript();
  245. }
  246. @@ -175,6 +175,7 @@ public:
  247. void Reset()
  248. {
  249. + BossAI::Reset();
  250. events.Reset();
  251. summons.DespawnAll();
  252. me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_DISABLE_MOVE);
  253. @@ -185,7 +186,6 @@ public:
  254. if (pInstance)
  255. {
  256. - pInstance->SetData(EVENT_GOTHIK, NOT_STARTED);
  257. if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_GOTHIK_ENTER_GATE)))
  258. go->SetGoState(GO_STATE_ACTIVE);
  259. if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_GOTHIK_INNER_GATE)))
  260. @@ -197,6 +197,7 @@ public:
  261. void EnterCombat(Unit *who)
  262. {
  263. + BossAI::EnterCombat(who);
  264. me->SetInCombatWithZone();
  265. Talk(SAY_SPEECH);
  266. me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_DISABLE_MOVE);
  267. @@ -207,7 +208,6 @@ public:
  268. if (pInstance)
  269. {
  270. - pInstance->SetData(EVENT_GOTHIK, IN_PROGRESS);
  271. if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_GOTHIK_ENTER_GATE)))
  272. go->SetGoState(GO_STATE_READY);
  273. if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_GOTHIK_INNER_GATE)))
  274. @@ -238,14 +238,14 @@ public:
  275. pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
  276. }
  277. - void JustDied(Unit* Killer)
  278. + void JustDied(Unit* killer)
  279. {
  280. + BossAI::JustDied(killer);
  281. Talk(SAY_DEATH);
  282. summons.DespawnAll();
  283. if (pInstance)
  284. {
  285. - pInstance->SetData(EVENT_GOTHIK, DONE);
  286. if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_GOTHIK_ENTER_GATE)))
  287. go->SetGoState(GO_STATE_ACTIVE);
  288. if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_GOTHIK_INNER_GATE)))
  289. diff --git a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp
  290. index ab7e5a8b..f3f37273 100644
  291. --- a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp
  292. +++ b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp
  293. @@ -58,9 +58,9 @@ public:
  294. return new boss_grobbulusAI (pCreature);
  295. }
  296. - struct boss_grobbulusAI : public ScriptedAI
  297. + struct boss_grobbulusAI : public BossAI
  298. {
  299. - boss_grobbulusAI(Creature *c) : ScriptedAI(c), summons(me)
  300. + boss_grobbulusAI(Creature *c) : BossAI(c, BOSS_GROBBULUS), summons(me)
  301. {
  302. pInstance = me->GetInstanceScript();
  303. }
  304. @@ -72,24 +72,20 @@ public:
  305. void Reset()
  306. {
  307. + BossAI::Reset();
  308. events.Reset();
  309. summons.DespawnAll();
  310. dropSludgeTimer = 0;
  311. -
  312. - if (pInstance)
  313. - pInstance->SetData(EVENT_GROBBULUS, NOT_STARTED);
  314. }
  315. void EnterCombat(Unit *who)
  316. {
  317. + BossAI::EnterCombat(who);
  318. me->SetInCombatWithZone();
  319. events.ScheduleEvent(EVENT_SPELL_POISON_CLOUD, 15000);
  320. events.ScheduleEvent(EVENT_SPELL_MUTATING_INJECTION, 20000);
  321. events.ScheduleEvent(EVENT_SPELL_SLIME_SPRAY, 10000);
  322. events.ScheduleEvent(EVENT_SPELL_BERSERK, RAID_MODE(12*MINUTE*IN_MILLISECONDS, 9*MINUTE*IN_MILLISECONDS));
  323. -
  324. - if (pInstance)
  325. - pInstance->SetData(EVENT_GROBBULUS, IN_PROGRESS);
  326. }
  327. void SpellHitTarget(Unit *target, const SpellInfo* spellInfo)
  328. @@ -108,11 +104,10 @@ public:
  329. void SummonedCreatureDespawn(Creature* summon){ summons.Despawn(summon); }
  330. - void JustDied(Unit*)
  331. + void JustDied(Unit* killer)
  332. {
  333. + BossAI::JustDied(killer);
  334. summons.DespawnAll();
  335. - if (pInstance)
  336. - pInstance->SetData(EVENT_GROBBULUS, DONE);
  337. }
  338. void KilledUnit(Unit* who)
  339. diff --git a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp
  340. index 6f63e69f..6b6a87b1 100644
  341. --- a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp
  342. +++ b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp
  343. @@ -61,9 +61,9 @@ public:
  344. return new boss_heiganAI (pCreature);
  345. }
  346. - struct boss_heiganAI : public ScriptedAI
  347. + struct boss_heiganAI : public BossAI
  348. {
  349. - boss_heiganAI(Creature *c) : ScriptedAI(c)
  350. + boss_heiganAI(Creature *c) : BossAI(c, BOSS_HEIGAN)
  351. {
  352. pInstance = me->GetInstanceScript();
  353. }
  354. @@ -76,6 +76,7 @@ public:
  355. void Reset()
  356. {
  357. + BossAI::Reset();
  358. events.Reset();
  359. currentPhase = 0;
  360. currentSection = 3;
  361. @@ -83,7 +84,6 @@ public:
  362. if (pInstance)
  363. {
  364. - pInstance->SetData(EVENT_HEIGAN, NOT_STARTED);
  365. if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_HEIGAN_ENTER_GATE)))
  366. go->SetGoState(GO_STATE_ACTIVE);
  367. }
  368. @@ -101,20 +101,19 @@ public:
  369. pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
  370. }
  371. - void JustDied(Unit* Killer)
  372. + void JustDied(Unit* killer)
  373. {
  374. + BossAI::JustDied(killer);
  375. Talk(SAY_DEATH);
  376. - if (pInstance)
  377. - pInstance->SetData(EVENT_HEIGAN, DONE);
  378. }
  379. void EnterCombat(Unit *who)
  380. {
  381. + BossAI::EnterCombat(who);
  382. me->SetInCombatWithZone();
  383. Talk(SAY_AGGRO);
  384. if (pInstance)
  385. {
  386. - pInstance->SetData(EVENT_HEIGAN, IN_PROGRESS);
  387. if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_HEIGAN_ENTER_GATE)))
  388. go->SetGoState(GO_STATE_READY);
  389. }
  390. diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp
  391. index ff8d3a9c..9fd55a47 100644
  392. --- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp
  393. +++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp
  394. @@ -128,9 +128,9 @@ public:
  395. return new boss_kelthuzadAI (pCreature);
  396. }
  397. - struct boss_kelthuzadAI : public ScriptedAI
  398. + struct boss_kelthuzadAI : public BossAI
  399. {
  400. - boss_kelthuzadAI(Creature* c) : ScriptedAI(c), summons(me)
  401. + boss_kelthuzadAI(Creature* c) : BossAI(c, BOSS_KELTHUZAD), summons(me)
  402. {
  403. pInstance = me->GetInstanceScript();
  404. }
  405. @@ -175,6 +175,7 @@ public:
  406. void Reset()
  407. {
  408. + BossAI::Reset();
  409. events.Reset();
  410. summons.DespawnAll();
  411. me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_DISABLE_MOVE);
  412. @@ -182,7 +183,6 @@ public:
  413. if (pInstance)
  414. {
  415. - pInstance->SetData(EVENT_KELTHUZAD, NOT_STARTED);
  416. if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_KELTHUZAD_FLOOR)))
  417. {
  418. go->SetPhaseMask(1, true);
  419. @@ -211,12 +211,11 @@ public:
  420. pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
  421. }
  422. - void JustDied(Unit* Killer)
  423. + void JustDied(Unit* killer)
  424. {
  425. + BossAI::JustDied(killer);
  426. summons.DespawnAll();
  427. Talk(SAY_DEATH);
  428. - if (pInstance)
  429. - pInstance->SetData(EVENT_KELTHUZAD, DONE);
  430. }
  431. void MoveInLineOfSight(Unit* who)
  432. @@ -227,6 +226,7 @@ public:
  433. void EnterCombat(Unit* who)
  434. {
  435. + BossAI::EnterCombat(who);
  436. Talk(SAY_SUMMON_MINIONS);
  437. me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE);
  438. me->RemoveAllAttackers();
  439. @@ -242,7 +242,6 @@ public:
  440. events.ScheduleEvent(EVENT_START_SECOND_PHASE, 228000);
  441. if (pInstance)
  442. {
  443. - pInstance->SetData(EVENT_KELTHUZAD, IN_PROGRESS);
  444. if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_KELTHUZAD_FLOOR)))
  445. {
  446. events.ScheduleEvent(EVENT_FLOOR_CHANGE, 15000);
  447. diff --git a/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp b/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp
  448. index 67643566..b743df94 100644
  449. --- a/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp
  450. +++ b/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp
  451. @@ -56,9 +56,9 @@ public:
  452. return new boss_loathebAI (pCreature);
  453. }
  454. - struct boss_loathebAI : public ScriptedAI
  455. + struct boss_loathebAI : public BossAI
  456. {
  457. - boss_loathebAI(Creature *c) : ScriptedAI(c)
  458. + boss_loathebAI(Creature *c) : BossAI(c, BOSS_LOATHEB)
  459. {
  460. pInstance = me->GetInstanceScript();
  461. }
  462. @@ -68,10 +68,10 @@ public:
  463. void Reset()
  464. {
  465. + BossAI::Reset();
  466. events.Reset();
  467. if (pInstance)
  468. {
  469. - pInstance->SetData(EVENT_LOATHEB, NOT_STARTED);
  470. if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_LOATHEB_GATE)))
  471. go->SetGoState(GO_STATE_ACTIVE);
  472. }
  473. @@ -93,9 +93,9 @@ public:
  474. void EnterCombat(Unit *who)
  475. {
  476. + BossAI::EnterCombat(who);
  477. if (pInstance)
  478. {
  479. - pInstance->SetData(EVENT_LOATHEB, IN_PROGRESS);
  480. if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_LOATHEB_GATE)))
  481. go->SetGoState(GO_STATE_READY);
  482. }
  483. @@ -107,12 +107,6 @@ public:
  484. events.ScheduleEvent(EVENT_SPELL_BERSERK, 720000);
  485. }
  486. - void JustDied(Unit* Killer)
  487. - {
  488. - if (pInstance)
  489. - pInstance->SetData(EVENT_LOATHEB, DONE);
  490. - }
  491. -
  492. void UpdateAI(uint32 diff)
  493. {
  494. if (!UpdateVictim())
  495. diff --git a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp
  496. index 0415ecb4..e8bd7fda 100644
  497. --- a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp
  498. +++ b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp
  499. @@ -74,9 +74,9 @@ public:
  500. return new boss_maexxnaAI (pCreature);
  501. }
  502. - struct boss_maexxnaAI : public ScriptedAI
  503. + struct boss_maexxnaAI : public BossAI
  504. {
  505. - boss_maexxnaAI(Creature *c) : ScriptedAI(c), summons(me)
  506. + boss_maexxnaAI(Creature *c) : BossAI(c, BOSS_MAEXXNA), summons(me)
  507. {
  508. pInstance = me->GetInstanceScript();
  509. }
  510. @@ -98,13 +98,13 @@ public:
  511. void Reset()
  512. {
  513. + BossAI::Reset();
  514. events.Reset();
  515. summons.DespawnAll();
  516. if (pInstance)
  517. {
  518. - pInstance->SetData(EVENT_MAEXXNA, NOT_STARTED);
  519. - if (pInstance->GetData(EVENT_FAERLINA) == DONE)
  520. + if (pInstance->GetData(BOSS_FAERLINA) == DONE)
  521. if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_MAEXXNA_GATE)))
  522. go->SetGoState(GO_STATE_ACTIVE);
  523. }
  524. @@ -112,6 +112,7 @@ public:
  525. void EnterCombat(Unit *who)
  526. {
  527. + BossAI::EnterCombat(who);
  528. me->SetInCombatWithZone();
  529. events.ScheduleEvent(EVENT_WEB_WRAP, 20000);
  530. events.ScheduleEvent(EVENT_SPELL_WEB_SPRAY, 40000);
  531. @@ -122,18 +123,11 @@ public:
  532. if (pInstance)
  533. {
  534. - pInstance->SetData(EVENT_MAEXXNA, IN_PROGRESS);
  535. if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetData64(DATA_MAEXXNA_GATE)))
  536. go->SetGoState(GO_STATE_READY);
  537. }
  538. }
  539. - void JustDied(Unit* Killer)
  540. - {
  541. - if (pInstance)
  542. - pInstance->SetData(EVENT_MAEXXNA, DONE);
  543. - }
  544. -
  545. void JustSummoned(Creature* cr)
  546. {
  547. if (cr->GetEntry() == NPC_MAEXXNA_SPIDERLING)
  548. diff --git a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp
  549. index b6fd4475..f6e31d00 100644
  550. --- a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp
  551. +++ b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp
  552. @@ -86,9 +86,9 @@ public:
  553. return new boss_nothAI (pCreature);
  554. }
  555. - struct boss_nothAI : public ScriptedAI
  556. + struct boss_nothAI : public BossAI
  557. {
  558. - boss_nothAI(Creature *c) : ScriptedAI(c), summons(me)
  559. + boss_nothAI(Creature *c) : BossAI(c, BOSS_NOTH), summons(me)
  560. {
  561. pInstance = me->GetInstanceScript();
  562. }
  563. @@ -142,14 +142,12 @@ public:
  564. void Reset()
  565. {
  566. + BossAI::Reset();
  567. events.Reset();
  568. summons.DespawnAll();
  569. me->SetControlled(false, UNIT_STATE_ROOT);
  570. me->SetReactState(REACT_AGGRESSIVE);
  571. totalPhase = 0;
  572. -
  573. - if (pInstance)
  574. - pInstance->SetData(EVENT_NOTH, NOT_STARTED);
  575. }
  576. void EnterEvadeMode()
  577. @@ -160,10 +158,8 @@ public:
  578. void EnterCombat(Unit *who)
  579. {
  580. + BossAI::EnterCombat(who);
  581. Talk(SAY_AGGRO);
  582. - if (pInstance)
  583. - pInstance->SetData(EVENT_NOTH, IN_PROGRESS);
  584. -
  585. StartGroundPhase();
  586. }
  587. @@ -173,11 +169,10 @@ public:
  588. summon->SetInCombatWithZone();
  589. }
  590. - void JustDied(Unit* Killer)
  591. + void JustDied(Unit* killer)
  592. {
  593. + BossAI::JustDied(killer);
  594. Talk(SAY_DEATH);
  595. - if (pInstance)
  596. - pInstance->SetData(EVENT_NOTH, DONE);
  597. }
  598. void KilledUnit(Unit* who)
  599. diff --git a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp
  600. index 472e617a..785725c9 100644
  601. --- a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp
  602. +++ b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp
  603. @@ -60,9 +60,9 @@ public:
  604. return new boss_patchwerkAI (pCreature);
  605. }
  606. - struct boss_patchwerkAI : public ScriptedAI
  607. + struct boss_patchwerkAI : public BossAI
  608. {
  609. - boss_patchwerkAI(Creature *c) : ScriptedAI(c)
  610. + boss_patchwerkAI(Creature *c) : BossAI(c, BOSS_PATCHWERK)
  611. {
  612. pInstance = me->GetInstanceScript();
  613. }
  614. @@ -72,9 +72,8 @@ public:
  615. void Reset()
  616. {
  617. + BossAI::Reset();
  618. events.Reset();
  619. - if (pInstance)
  620. - pInstance->SetData(EVENT_PATCHWERK, NOT_STARTED);
  621. }
  622. void KilledUnit(Unit* who)
  623. @@ -89,15 +88,15 @@ public:
  624. pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
  625. }
  626. - void JustDied(Unit* Killer)
  627. + void JustDied(Unit* killer)
  628. {
  629. + BossAI::JustDied(killer);
  630. Talk(SAY_DEATH);
  631. - if (pInstance)
  632. - pInstance->SetData(EVENT_PATCHWERK, DONE);
  633. }
  634. void EnterCombat(Unit *who)
  635. {
  636. + BossAI::EnterCombat(who);
  637. Talk(SAY_AGGRO);
  638. me->SetInCombatWithZone();
  639. @@ -108,7 +107,6 @@ public:
  640. if (pInstance)
  641. {
  642. pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
  643. - pInstance->SetData(EVENT_PATCHWERK, IN_PROGRESS);
  644. }
  645. }
  646. diff --git a/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp b/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp
  647. index e4de4a28..3553c63c 100644
  648. --- a/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp
  649. +++ b/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp
  650. @@ -73,9 +73,9 @@ public:
  651. return new boss_razuviousAI (pCreature);
  652. }
  653. - struct boss_razuviousAI : public ScriptedAI
  654. + struct boss_razuviousAI : public BossAI
  655. {
  656. - boss_razuviousAI(Creature *c) : ScriptedAI(c), summons(me)
  657. + boss_razuviousAI(Creature *c) : BossAI(c, BOSS_RAZUVIOUS), summons(me)
  658. {
  659. pInstance = me->GetInstanceScript();
  660. }
  661. @@ -99,11 +99,10 @@ public:
  662. void Reset()
  663. {
  664. + BossAI::Reset();
  665. summons.DespawnAll();
  666. events.Reset();
  667. SpawnHelpers();
  668. - if (pInstance)
  669. - pInstance->SetData(EVENT_RAZUVIOUS, NOT_STARTED);
  670. }
  671. void KilledUnit(Unit* who)
  672. @@ -130,16 +129,16 @@ public:
  673. void JustDied(Unit* killer)
  674. {
  675. + BossAI::JustDied(killer);
  676. DoPlaySoundToSet(me, SOUND_DEATH);
  677. me->Yell("An honorable... death...", LANG_UNIVERSAL);
  678. me->CastSpell(me, SPELL_HOPELESS, true);
  679. - if (pInstance)
  680. - pInstance->SetData(EVENT_RAZUVIOUS, DONE);
  681. }
  682. void EnterCombat(Unit *who)
  683. {
  684. + BossAI::EnterCombat(who);
  685. switch (urand(0,2))
  686. {
  687. case 0:
  688. @@ -160,8 +159,6 @@ public:
  689. events.ScheduleEvent(EVENT_SPELL_DISRUPTING_SHOUT, 25000);
  690. events.ScheduleEvent(EVENT_SPELL_JAGGED_KNIFE, 15000);
  691. events.ScheduleEvent(EVENT_PLAY_COMMAND, 40000);
  692. - if (pInstance)
  693. - pInstance->SetData(EVENT_RAZUVIOUS, IN_PROGRESS);
  694. summons.DoZoneInCombat();
  695. }
  696. diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
  697. index de7fea9e..9eac7a89 100644
  698. --- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
  699. +++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
  700. @@ -90,9 +90,9 @@ public:
  701. return new boss_sapphironAI (pCreature);
  702. }
  703. - struct boss_sapphironAI : public ScriptedAI
  704. + struct boss_sapphironAI : public BossAI
  705. {
  706. - boss_sapphironAI(Creature* c) : ScriptedAI(c)
  707. + boss_sapphironAI(Creature* c) : BossAI(c, BOSS_SAPPHIRON)
  708. {
  709. pInstance = me->GetInstanceScript();
  710. }
  711. @@ -126,6 +126,7 @@ public:
  712. void Reset()
  713. {
  714. + BossAI::Reset();
  715. if (me->IsVisible())
  716. me->SetReactState(REACT_AGGRESSIVE);
  717. @@ -134,9 +135,6 @@ public:
  718. spawnTimer = 0;
  719. currentTarget = 0;
  720. blockList.clear();
  721. -
  722. - if (pInstance)
  723. - pInstance->SetData(EVENT_SAPPHIRON, NOT_STARTED);
  724. }
  725. void EnterCombatSelfFunction()
  726. @@ -162,6 +160,7 @@ public:
  727. void EnterCombat(Unit *who)
  728. {
  729. + BossAI::EnterCombat(who);
  730. EnterCombatSelfFunction();
  731. me->CastSpell(me, RAID_MODE(SPELL_FROST_AURA_10, SPELL_FROST_AURA_25), true);
  732. @@ -172,16 +171,12 @@ public:
  733. events.ScheduleEvent(EVENT_SPELL_BLIZZARD, 21000);
  734. events.ScheduleEvent(EVENT_FLIGHT_START, 45000);
  735. events.ScheduleEvent(EVENT_HUNDRED_CLUB, 5000);
  736. -
  737. - if (pInstance)
  738. - pInstance->SetData(EVENT_SAPPHIRON, IN_PROGRESS);
  739. }
  740. - void JustDied(Unit* who)
  741. + void JustDied(Unit* killer)
  742. {
  743. + BossAI::JustDied(killer);
  744. me->CastSpell(me, SPELL_SAPPHIRON_DIES, true);
  745. - if (pInstance)
  746. - pInstance->SetData(EVENT_SAPPHIRON, DONE);
  747. }
  748. void DoAction(int32 param)
  749. diff --git a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp
  750. index d235ec75..a261bae7 100644
  751. --- a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp
  752. +++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp
  753. @@ -107,9 +107,9 @@ public:
  754. return new boss_thaddiusAI (pCreature);
  755. }
  756. - struct boss_thaddiusAI : public ScriptedAI
  757. + struct boss_thaddiusAI : public BossAI
  758. {
  759. - boss_thaddiusAI(Creature *c) : ScriptedAI(c), summons(me)
  760. + boss_thaddiusAI(Creature *c) : BossAI(c, BOSS_THADDIUS), summons(me)
  761. {
  762. pInstance = me->GetInstanceScript();
  763. }
  764. @@ -154,6 +154,7 @@ public:
  765. void Reset()
  766. {
  767. + BossAI::Reset();
  768. events.Reset();
  769. summons.DespawnAll();
  770. me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  771. @@ -162,9 +163,6 @@ public:
  772. resetTimer = 1;
  773. me->SetPosition(me->GetHomePosition());
  774. - if (pInstance)
  775. - pInstance->SetData(EVENT_THADDIUS, NOT_STARTED);
  776. -
  777. me->SummonCreature(NPC_STALAGG, 3450.45f, -2931.42f, 312.091f, 5.49779f);
  778. me->SummonCreature(NPC_FEUGEN, 3508.14f, -2988.65f, 312.092f, 2.37365f);
  779. if (Creature* cr = me->SummonCreature(NPC_TESLA_COIL, 3527.34f, -2951.56f, 318.75f, 0.0f))
  780. @@ -195,12 +193,12 @@ public:
  781. pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
  782. }
  783. - void JustDied(Unit* Killer)
  784. - {
  785. + void JustDied(Unit* killer)
  786. + {
  787. + BossAI::JustDied(killer);
  788. Talk(SAY_DEATH);
  789. if (pInstance)
  790. {
  791. - pInstance->SetData(EVENT_THADDIUS, DONE);
  792. pInstance->DoRemoveAurasDueToSpellOnPlayers(28059);
  793. pInstance->DoRemoveAurasDueToSpellOnPlayers(28084);
  794. }
  795. @@ -210,12 +208,10 @@ public:
  796. void EnterCombat(Unit *who)
  797. {
  798. + BossAI::EnterCombat(who);
  799. me->SetInCombatWithZone();
  800. summons.DoZoneInCombat(NPC_FEUGEN);
  801. summons.DoZoneInCombat(NPC_STALAGG);
  802. -
  803. - if (pInstance)
  804. - pInstance->SetData(EVENT_THADDIUS, IN_PROGRESS);
  805. }
  806. void UpdateAI(uint32 diff)
  807. diff --git a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
  808. index 4329ba32..1837149a 100644
  809. --- a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
  810. +++ b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
  811. @@ -62,7 +62,7 @@ public:
  812. {
  813. instance_naxxramas_InstanceMapScript(Map* pMap) : InstanceScript(pMap)
  814. {
  815. - memset(&Encounters, 0, sizeof(Encounters));
  816. + SetBossNumber(MAX_ENCOUNTERS);
  817. for (uint8 i = 0; i < 4; ++i)
  818. HeiganEruption[i].clear();
  819. @@ -188,17 +188,17 @@ public:
  820. }
  821. }
  822. - bool IsEncounterInProgress() const
  823. + bool IsEncounterInProgress() const override
  824. {
  825. for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
  826. {
  827. - if (Encounters[i] == IN_PROGRESS)
  828. + if (GetBossState(i) == IN_PROGRESS)
  829. return true;
  830. }
  831. return false;
  832. }
  833. - void OnCreatureCreate(Creature* creature)
  834. + void OnCreatureCreate(Creature* creature) override
  835. {
  836. switch(creature->GetEntry())
  837. {
  838. @@ -235,7 +235,7 @@ public:
  839. }
  840. }
  841. - void OnGameObjectCreate(GameObject* pGo)
  842. + void OnGameObjectCreate(GameObject* pGo) override
  843. {
  844. if (pGo->GetGOInfo()->displayId == 6785 || pGo->GetGOInfo()->displayId == 1287)
  845. {
  846. @@ -247,57 +247,57 @@ public:
  847. {
  848. case GO_PATCHWERK_GATE:
  849. _patchwerkGateGUID = pGo->GetGUID();
  850. - if (Encounters[EVENT_PATCHWERK] == DONE)
  851. + if (GetBossState(BOSS_PATCHWERK) == DONE)
  852. pGo->SetGoState(GO_STATE_ACTIVE);
  853. break;
  854. case GO_GLUTH_GATE:
  855. _gluthGateGUID = pGo->GetGUID();
  856. - if (Encounters[EVENT_GLUTH] == DONE)
  857. + if (GetBossState(BOSS_GLUTH) == DONE)
  858. pGo->SetGoState(GO_STATE_ACTIVE);
  859. break;
  860. case GO_NOTH_GATE:
  861. _nothGateGUID = pGo->GetGUID();
  862. - if (Encounters[EVENT_NOTH] == DONE)
  863. + if (GetBossState(BOSS_NOTH) == DONE)
  864. pGo->SetGoState(GO_STATE_ACTIVE);
  865. break;
  866. case GO_HEIGAN_ENTERANCE_GATE:
  867. _heiganGateGUID = pGo->GetGUID();
  868. - if (Encounters[EVENT_HEIGAN] == DONE || Encounters[EVENT_NOTH] == DONE)
  869. + if (GetBossState(BOSS_HEIGAN) == DONE || GetBossState(BOSS_NOTH) == DONE)
  870. pGo->SetGoState(GO_STATE_ACTIVE);
  871. break;
  872. case GO_HEIGAN_EXIT_GATE:
  873. _heiganGateExitGUID = pGo->GetGUID();
  874. - if (Encounters[EVENT_HEIGAN] == DONE)
  875. + if (GetBossState(BOSS_HEIGAN) == DONE)
  876. pGo->SetGoState(GO_STATE_ACTIVE);
  877. break;
  878. case GO_LOATHEB_GATE:
  879. _loathebGateGUID = pGo->GetGUID();
  880. - if (Encounters[EVENT_LOATHEB] == DONE)
  881. + if (GetBossState(BOSS_LOATHEB) == DONE)
  882. pGo->SetGoState(GO_STATE_ACTIVE);
  883. break;
  884. case GO_ANUB_GATE:
  885. _anubGateGUID = pGo->GetGUID();
  886. - if (Encounters[EVENT_ANUB] == DONE)
  887. + if (GetBossState(BOSS_ANUB) == DONE)
  888. pGo->SetGoState(GO_STATE_ACTIVE);
  889. break;
  890. case GO_ANUB_NEXT_GATE:
  891. _anubNextGateGUID = pGo->GetGUID();
  892. - if (Encounters[EVENT_ANUB] == DONE)
  893. + if (GetBossState(BOSS_ANUB) == DONE)
  894. pGo->SetGoState(GO_STATE_ACTIVE);
  895. break;
  896. case GO_FAERLINA_GATE:
  897. _faerlinaGateGUID = pGo->GetGUID();
  898. - if (Encounters[EVENT_FAERLINA] == DONE)
  899. + if (GetBossState(BOSS_FAERLINA) == DONE)
  900. pGo->SetGoState(GO_STATE_ACTIVE);
  901. break;
  902. case GO_MAEXXNA_GATE:
  903. _maexxnaGateGUID = pGo->GetGUID();
  904. - if (Encounters[EVENT_FAERLINA] == DONE) // faerlina is correct
  905. + if (GetBossState(BOSS_FAERLINA) == DONE) // faerlina is correct
  906. pGo->SetGoState(GO_STATE_ACTIVE);
  907. break;
  908. case GO_THADDIUS_GATE:
  909. _thaddiusGateGUID = pGo->GetGUID();
  910. - if (Encounters[EVENT_GLUTH] == DONE) // gluth is correct
  911. + if (GetBossState(BOSS_GLUTH) == DONE) // gluth is correct
  912. pGo->SetGoState(GO_STATE_ACTIVE);
  913. break;
  914. case GO_GOTHIK_ENTER_GATE:
  915. @@ -308,12 +308,12 @@ public:
  916. break;
  917. case GO_GOTHIK_EXIT_GATE:
  918. _gothikExitGateGUID = pGo->GetGUID();
  919. - if (Encounters[EVENT_GOTHIK] == DONE)
  920. + if (GetBossState(BOSS_GOTHIK) == DONE)
  921. pGo->SetGoState(GO_STATE_ACTIVE);
  922. break;
  923. case GO_HORSEMAN_GATE:
  924. _horsemanGateGUID = pGo->GetGUID();
  925. - if (Encounters[EVENT_GOTHIK] == DONE) // correct
  926. + if (GetBossState(BOSS_GOTHIK) == DONE) // correct
  927. pGo->SetGoState(GO_STATE_ACTIVE);
  928. break;
  929. case GO_KELTHUZAD_FLOOR:
  930. @@ -323,34 +323,32 @@ public:
  931. _kelthuzadgateGUID = pGo->GetGUID();
  932. break;
  933. case GO_SAPPHIRON_GATE:
  934. - _sapphironGateGUID = pGo->GetGUID();
  935. - if (Encounters[EVENT_SAPPHIRON] == DONE && Encounters[EVENT_MAEXXNA] == DONE && Encounters[EVENT_HORSEMAN] == DONE && Encounters[EVENT_LOATHEB] == DONE && Encounters[EVENT_GLUTH] == DONE)
  936. - pGo->SetGoState(GO_STATE_ACTIVE);
  937. + _sapphironGateGUID = pGo->GetGUID();
  938. break;
  939. case GO_DEATHKNIGHT_WING:
  940. _loathebPortalGUID = pGo->GetGUID();
  941. - if (Encounters[EVENT_LOATHEB] == DONE)
  942. + if (GetBossState(BOSS_LOATHEB) == DONE)
  943. pGo->SetPhaseMask(1, true);
  944. break;
  945. case GO_THADDIUS_PORTAL:
  946. _thaddiusPortalGUID = pGo->GetGUID();
  947. - if (Encounters[EVENT_THADDIUS] == DONE)
  948. + if (GetBossState(BOSS_THADDIUS) == DONE)
  949. pGo->SetPhaseMask(1, true);
  950. break;
  951. case GO_MAEXXNA_PORTAL:
  952. _maexxnaPortalGUID = pGo->GetGUID();
  953. - if (Encounters[EVENT_MAEXXNA] == DONE)
  954. + if (GetBossState(BOSS_MAEXXNA) == DONE)
  955. pGo->SetPhaseMask(1, true);
  956. break;
  957. case GO_HORSEMAN_PORTAL:
  958. _horsemanPortalGUID = pGo->GetGUID();
  959. - if (Encounters[EVENT_HORSEMAN] == DONE)
  960. + if (GetBossState(BOSS_HORSEMAN) == DONE)
  961. pGo->SetPhaseMask(1, true);
  962. break;
  963. }
  964. }
  965. - void OnGameObjectRemove(GameObject* pGo)
  966. + void OnGameObjectRemove(GameObject* pGo) override
  967. {
  968. if (pGo->GetGOInfo()->displayId == 6785 || pGo->GetGOInfo()->displayId == 1287)
  969. {
  970. @@ -364,7 +362,7 @@ public:
  971. cr->AI()->DoAction(ACTION_SAPPHIRON_BIRTH);
  972. }
  973. - bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* source, Unit const* target = NULL, uint32 miscvalue1 = 0)
  974. + bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* source, Unit const* target = NULL, uint32 miscvalue1 = 0) override
  975. {
  976. switch(criteria_id)
  977. {
  978. @@ -408,7 +406,7 @@ public:
  979. {
  980. uint8 count = 0;
  981. for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
  982. - if (Encounters[i] == NOT_STARTED)
  983. + if (GetBossState(i) == NOT_STARTED)
  984. ++count;
  985. return !count && immortalAchievement;
  986. @@ -417,57 +415,11 @@ public:
  987. return false;
  988. }
  989. - void SetData(uint32 id, uint32 data)
  990. + void SetData(uint32 id, uint32 data) override
  991. {
  992. // Bosses data
  993. switch(id)
  994. {
  995. - case EVENT_PATCHWERK:
  996. - case EVENT_GROBBULUS:
  997. - case EVENT_GLUTH:
  998. - case EVENT_NOTH:
  999. - case EVENT_ANUB:
  1000. - case EVENT_MAEXXNA:
  1001. - case EVENT_RAZUVIOUS:
  1002. - case EVENT_GOTHIK:
  1003. - // EVENT_HORSEMAN HANDLED BELOW
  1004. - Encounters[id] = data;
  1005. - break;
  1006. - case EVENT_KELTHUZAD:
  1007. - if (data == NOT_STARTED)
  1008. - abominationsKilled = 0;
  1009. - Encounters[id] = data;
  1010. - break;
  1011. - case EVENT_FAERLINA:
  1012. - if (data == NOT_STARTED)
  1013. - faerlinaAchievement = true;
  1014. - Encounters[id] = data;
  1015. - break;
  1016. - case EVENT_THADDIUS:
  1017. - if (data == NOT_STARTED)
  1018. - thaddiusAchievement = true;
  1019. - Encounters[id] = data;
  1020. - break;
  1021. - case EVENT_LOATHEB:
  1022. - if (data == NOT_STARTED)
  1023. - loathebAchievement = true;
  1024. - Encounters[id] = data;
  1025. - break;
  1026. - case EVENT_HEIGAN:
  1027. - if (data == NOT_STARTED)
  1028. - heiganAchievement = true;
  1029. - Encounters[id] = data;
  1030. - break;
  1031. - case DATA_HEIGAN_ERUPTION:
  1032. - HeiganEruptSections(data);
  1033. - return;
  1034. - case EVENT_SAPPHIRON:
  1035. - Encounters[id] = data;
  1036. - if (data == DONE)
  1037. - _speakTimer = 1;
  1038. - else if (data == NOT_STARTED)
  1039. - sapphironAchievement = true;
  1040. - break;
  1041. case DATA_ABOMINATION_KILLED:
  1042. abominationsKilled++;
  1043. return;
  1044. @@ -490,17 +442,25 @@ public:
  1045. immortalAchievement = 0;
  1046. SaveToDB();
  1047. return;
  1048. + case DATA_HEIGAN_ERUPTION:
  1049. + HeiganEruptSections(data);
  1050. + return;
  1051. }
  1052. + }
  1053. +
  1054. + bool SetBossState(uint32 bossId, EncounterState state) override
  1055. + {
  1056. // Horseman handling
  1057. - if (id == EVENT_HORSEMAN)
  1058. + if (bossId == BOSS_HORSEMAN)
  1059. {
  1060. - if (data == DONE)
  1061. + if (state == DONE)
  1062. {
  1063. _horsemanTimer++;
  1064. _horsemanKilled++;
  1065. - if (_horsemanKilled < 4)
  1066. - return;
  1067. + if (_horsemanKilled < 4) {
  1068. + return false;
  1069. + }
  1070. // All horsemans are killed
  1071. if (Creature* cr = instance->GetCreature(_blaumeuxGUID))
  1072. @@ -508,7 +468,7 @@ public:
  1073. }
  1074. // respawn
  1075. - else if (data == NOT_STARTED && _horsemanKilled > 0)
  1076. + else if (state == NOT_STARTED && _horsemanKilled > 0)
  1077. {
  1078. Creature* cr;
  1079. _horsemanKilled = 0;
  1080. @@ -537,7 +497,7 @@ public:
  1081. cr->Respawn();
  1082. }
  1083. }
  1084. - else if (data == IN_PROGRESS)
  1085. + else if (state == IN_PROGRESS)
  1086. {
  1087. Creature* cr;
  1088. if (cr = instance->GetCreature(_blaumeuxGUID))
  1089. @@ -550,66 +510,98 @@ public:
  1090. cr->SetInCombatWithZone();
  1091. }
  1092. - if (data == NOT_STARTED)
  1093. + if (state == NOT_STARTED)
  1094. _horsemanTimer = 0;
  1095. -
  1096. - Encounters[id] = data;
  1097. }
  1098. + if (!InstanceScript::SetBossState(bossId, state))
  1099. + return false;
  1100. +
  1101. + // Bosses data
  1102. + switch(bossId)
  1103. + {
  1104. + case BOSS_KELTHUZAD:
  1105. + if (state == NOT_STARTED)
  1106. + abominationsKilled = 0;
  1107. + break;
  1108. + case BOSS_FAERLINA:
  1109. + if (state == NOT_STARTED)
  1110. + faerlinaAchievement = true;
  1111. + break;
  1112. + case BOSS_THADDIUS:
  1113. + if (state == NOT_STARTED)
  1114. + thaddiusAchievement = true;
  1115. + break;
  1116. + case BOSS_LOATHEB:
  1117. + if (state == NOT_STARTED)
  1118. + loathebAchievement = true;
  1119. + break;
  1120. + case BOSS_HEIGAN:
  1121. + if (state == NOT_STARTED)
  1122. + heiganAchievement = true;
  1123. + break;
  1124. + case BOSS_SAPPHIRON:
  1125. + if (state == DONE)
  1126. + _speakTimer = 1;
  1127. + else if (state == NOT_STARTED)
  1128. + sapphironAchievement = true;
  1129. + break;
  1130. + }
  1131. +
  1132. // Save instance and open gates
  1133. - if (data == DONE)
  1134. + if (state == DONE)
  1135. {
  1136. SaveToDB();
  1137. - switch (id)
  1138. + switch (bossId)
  1139. {
  1140. - case EVENT_PATCHWERK:
  1141. + case BOSS_PATCHWERK:
  1142. if (GameObject* go = instance->GetGameObject(_patchwerkGateGUID))
  1143. go->SetGoState(GO_STATE_ACTIVE);
  1144. break;
  1145. - case EVENT_GLUTH:
  1146. + case BOSS_GLUTH:
  1147. if (GameObject* go = instance->GetGameObject(_gluthGateGUID))
  1148. go->SetGoState(GO_STATE_ACTIVE);
  1149. if (GameObject* go = instance->GetGameObject(_thaddiusGateGUID))
  1150. go->SetGoState(GO_STATE_ACTIVE);
  1151. break;
  1152. - case EVENT_NOTH:
  1153. + case BOSS_NOTH:
  1154. if (GameObject* go = instance->GetGameObject(_nothGateGUID))
  1155. go->SetGoState(GO_STATE_ACTIVE);
  1156. if (GameObject* go = instance->GetGameObject(_heiganGateGUID))
  1157. go->SetGoState(GO_STATE_ACTIVE);
  1158. break;
  1159. - case EVENT_HEIGAN:
  1160. + case BOSS_HEIGAN:
  1161. if (GameObject* go = instance->GetGameObject(_heiganGateGUID))
  1162. go->SetGoState(GO_STATE_ACTIVE);
  1163. if (GameObject* go = instance->GetGameObject(_heiganGateExitGUID))
  1164. go->SetGoState(GO_STATE_ACTIVE);
  1165. break;
  1166. - case EVENT_LOATHEB:
  1167. + case BOSS_LOATHEB:
  1168. if (GameObject* go = instance->GetGameObject(_loathebGateGUID))
  1169. go->SetGoState(GO_STATE_ACTIVE);
  1170. if (GameObject* go = instance->GetGameObject(_loathebPortalGUID))
  1171. go->SetPhaseMask(1, true);
  1172. break;
  1173. - case EVENT_ANUB:
  1174. + case BOSS_ANUB:
  1175. if (GameObject* go = instance->GetGameObject(_anubGateGUID))
  1176. go->SetGoState(GO_STATE_ACTIVE);
  1177. if (GameObject* go = instance->GetGameObject(_anubNextGateGUID))
  1178. go->SetGoState(GO_STATE_ACTIVE);
  1179. break;
  1180. - case EVENT_FAERLINA:
  1181. + case BOSS_FAERLINA:
  1182. if (GameObject* go = instance->GetGameObject(_faerlinaGateGUID))
  1183. go->SetGoState(GO_STATE_ACTIVE);
  1184. if (GameObject* go = instance->GetGameObject(_maexxnaGateGUID))
  1185. go->SetGoState(GO_STATE_ACTIVE);
  1186. break;
  1187. - case EVENT_MAEXXNA:
  1188. + case BOSS_MAEXXNA:
  1189. if (GameObject* go = instance->GetGameObject(_maexxnaGateGUID))
  1190. go->SetGoState(GO_STATE_ACTIVE);
  1191. if (GameObject* go = instance->GetGameObject(_maexxnaPortalGUID))
  1192. go->SetPhaseMask(1, true);
  1193. break;
  1194. - case EVENT_GOTHIK:
  1195. + case BOSS_GOTHIK:
  1196. if (GameObject* go = instance->GetGameObject(_gothikEnterGateGUID))
  1197. go->SetGoState(GO_STATE_ACTIVE);
  1198. if (GameObject* go = instance->GetGameObject(_gothikExitGateGUID))
  1199. @@ -617,35 +609,27 @@ public:
  1200. if (GameObject* go = instance->GetGameObject(_horsemanGateGUID))
  1201. go->SetGoState(GO_STATE_ACTIVE);
  1202. break;
  1203. - case EVENT_SAPPHIRON:
  1204. + case BOSS_SAPPHIRON:
  1205. if (GameObject* go = instance->GetGameObject(_sapphironGateGUID))
  1206. go->SetGoState(GO_STATE_ACTIVE);
  1207. break;
  1208. - case EVENT_THADDIUS:
  1209. + case BOSS_THADDIUS:
  1210. if (GameObject* go = instance->GetGameObject(_thaddiusPortalGUID))
  1211. go->SetPhaseMask(1, true);
  1212. break;
  1213. - case EVENT_HORSEMAN:
  1214. + case BOSS_HORSEMAN:
  1215. if (GameObject* go = instance->GetGameObject(_horsemanPortalGUID))
  1216. go->SetPhaseMask(1, true);
  1217. break;
  1218. }
  1219. }
  1220. - }
  1221. - uint32 GetData(uint32 identifier) const
  1222. - {
  1223. - switch(identifier)
  1224. - {
  1225. - case EVENT_HORSEMAN:
  1226. - return Encounters[identifier];
  1227. - }
  1228. - return 0;
  1229. + return true;
  1230. }
  1231. - void Update(uint32 diff)
  1232. + void Update(uint32 diff) override
  1233. {
  1234. - if (screamsTimer && Encounters[EVENT_THADDIUS] != DONE)
  1235. + if (screamsTimer && GetBossState(BOSS_THADDIUS) != DONE)
  1236. {
  1237. if (screamsTimer <= diff)
  1238. {
  1239. @@ -696,7 +680,7 @@ public:
  1240. _horsemanTimer += diff;
  1241. }
  1242. - uint64 GetData64(uint32 id) const
  1243. + uint64 GetData64(uint32 id) const override
  1244. {
  1245. switch (id)
  1246. {
  1247. @@ -733,21 +717,18 @@ public:
  1248. return 0;
  1249. }
  1250. - std::string GetSaveData()
  1251. + std::string GetSaveData() override
  1252. {
  1253. OUT_SAVE_INST_DATA;
  1254. std::ostringstream saveStream;
  1255. - saveStream << "N X X " << Encounters[0] << ' ' << Encounters[1] << ' ' << Encounters[2] << ' ' << Encounters[3]
  1256. - << ' ' << Encounters[4] << ' ' << Encounters[5] << ' ' << Encounters[6] << ' ' << Encounters[7]
  1257. - << ' ' << Encounters[8] << ' ' << Encounters[9] << ' ' << Encounters[10] << ' ' << Encounters[11]
  1258. - << ' ' << Encounters[12] << ' ' << Encounters[13] << ' ' << Encounters[14] << ' ' << immortalAchievement;
  1259. + saveStream << "N X X " << GetBossSaveData() << ' ' << immortalAchievement;
  1260. OUT_SAVE_INST_DATA_COMPLETE;
  1261. return saveStream.str();
  1262. }
  1263. - void Load(const char* in)
  1264. + void Load(const char* in) override
  1265. {
  1266. if (!in)
  1267. {
  1268. @@ -765,9 +746,12 @@ public:
  1269. {
  1270. for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
  1271. {
  1272. - loadStream >> Encounters[i];
  1273. - if (Encounters[i] == IN_PROGRESS)
  1274. - Encounters[i] = NOT_STARTED;
  1275. + uint32 tmpState;
  1276. + loadStream >> tmpState;
  1277. + if (tmpState == IN_PROGRESS)
  1278. + tmpState = NOT_STARTED;
  1279. +
  1280. + SetBossState(i, EncounterState(tmpState));
  1281. }
  1282. loadStream >> immortalAchievement;
  1283. @@ -779,6 +763,7 @@ public:
  1284. };
  1285. };
  1286. +
  1287. class boss_naxxramas_misc : public CreatureScript
  1288. {
  1289. public:
  1290. @@ -838,8 +823,66 @@ public:
  1291. };
  1292. };
  1293. +class at_naxxramas_frostwyrm_wing : public AreaTriggerScript
  1294. +{
  1295. +public:
  1296. + at_naxxramas_frostwyrm_wing() : AreaTriggerScript("at_naxxramas_frostwyrm_wing") { }
  1297. +
  1298. + bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/)
  1299. + {
  1300. + if (player->IsInCombat())
  1301. + return true;
  1302. +
  1303. + if (InstanceScript* instance = player->GetInstanceScript())
  1304. + for (uint32 i = BOSS_PATCHWERK; i < BOSS_SAPPHIRON; ++i)
  1305. + if (instance->GetBossState(i) != DONE)
  1306. + return true;
  1307. +
  1308. + return false;
  1309. + }
  1310. +};
  1311. +
  1312. +#define MSG_GOSSIP_TEXT_ORB "Teleportation to Frostwyrm Wing"
  1313. +
  1314. +class go_naxx_orb : public GameObjectScript
  1315. +{
  1316. + public:
  1317. + go_naxx_orb() : GameObjectScript("go_naxx_orb") { }
  1318. +
  1319. + bool OnGossipHello(Player* player, GameObject* go) override
  1320. + {
  1321. + if (InstanceScript* instance = go->GetInstanceScript())
  1322. + {
  1323. + if (instance->GetBossState(BOSS_MAEXXNA) == DONE &&
  1324. + instance->GetBossState(BOSS_THADDIUS) == DONE &&
  1325. + instance->GetBossState(BOSS_LOATHEB) == DONE &&
  1326. + instance->GetBossState(BOSS_HORSEMAN) == DONE)
  1327. + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, MSG_GOSSIP_TEXT_ORB, GOSSIP_SENDER_MAIN, 1);
  1328. + }
  1329. +
  1330. + SendGossipMenuFor(player, DEFAULT_GOSSIP_MESSAGE, go->GetGUID());
  1331. + }
  1332. +
  1333. + bool OnGossipSelect(Player* player, GameObject* /*go*/, uint32 sender, uint32 action) override
  1334. + {
  1335. + switch (action)
  1336. + {
  1337. + if (player->IsInCombat())
  1338. + return true;
  1339. +
  1340. + case 1:
  1341. + player->CastSpell(player, SPELL_TELE_SAPPHIRON, true);
  1342. + CloseGossipMenuFor(player);
  1343. + break;
  1344. +
  1345. + }
  1346. + }
  1347. +};
  1348. +
  1349. void AddSC_instance_naxxramas()
  1350. {
  1351. new instance_naxxramas();
  1352. new boss_naxxramas_misc();
  1353. + new go_naxx_orb();
  1354. + new at_naxxramas_frostwyrm_wing();
  1355. }
  1356. diff --git a/src/server/scripts/Northrend/Naxxramas/naxxramas.h b/src/server/scripts/Northrend/Naxxramas/naxxramas.h
  1357. index 7ef0661e..0f06bdc0 100644
  1358. --- a/src/server/scripts/Northrend/Naxxramas/naxxramas.h
  1359. +++ b/src/server/scripts/Northrend/Naxxramas/naxxramas.h
  1360. @@ -18,23 +18,23 @@
  1361. #ifndef DEF_NAXXRAMAS_H
  1362. #define DEF_NAXXRAMAS_H
  1363. -enum NXEncounter
  1364. +enum Encouters
  1365. {
  1366. - EVENT_PATCHWERK = 0,
  1367. - EVENT_GROBBULUS = 1,
  1368. - EVENT_GLUTH = 2,
  1369. - EVENT_NOTH = 3,
  1370. - EVENT_HEIGAN = 4,
  1371. - EVENT_LOATHEB = 5,
  1372. - EVENT_ANUB = 6,
  1373. - EVENT_FAERLINA = 7,
  1374. - EVENT_MAEXXNA = 8,
  1375. - EVENT_THADDIUS = 9,
  1376. - EVENT_RAZUVIOUS = 10,
  1377. - EVENT_GOTHIK = 11,
  1378. - EVENT_HORSEMAN = 12,
  1379. - EVENT_SAPPHIRON = 13,
  1380. - EVENT_KELTHUZAD = 14,
  1381. + BOSS_PATCHWERK = 0,
  1382. + BOSS_GROBBULUS = 1,
  1383. + BOSS_GLUTH = 2,
  1384. + BOSS_NOTH = 3,
  1385. + BOSS_HEIGAN = 4,
  1386. + BOSS_LOATHEB = 5,
  1387. + BOSS_ANUB = 6,
  1388. + BOSS_FAERLINA = 7,
  1389. + BOSS_MAEXXNA = 8,
  1390. + BOSS_THADDIUS = 9,
  1391. + BOSS_RAZUVIOUS = 10,
  1392. + BOSS_GOTHIK = 11,
  1393. + BOSS_HORSEMAN = 12,
  1394. + BOSS_SAPPHIRON = 13,
  1395. + BOSS_KELTHUZAD = 14,
  1396. MAX_ENCOUNTERS,
  1397. };
  1398. @@ -93,6 +93,7 @@ enum NXGOs
  1399. GO_THADDIUS_PORTAL = 181576, //Thadius portal
  1400. GO_MAEXXNA_PORTAL = 181575, //Maexxna portal
  1401. GO_HORSEMAN_PORTAL = 181578, //Four Horseman portal
  1402. +// GO_FROSTWYRM_PORTAL = 202278, //Frost Wyrm Wind portal
  1403. };
  1404. enum NXNPCs
  1405. @@ -126,6 +127,7 @@ enum NXMisc
  1406. // Spells
  1407. SPELL_ERUPTION = 29371,
  1408. SPELL_FROGGER_EXPLODE = 28433,
  1409. + SPELL_TELE_SAPPHIRON = 72617, // need spell of teleport add i dont know it ))
  1410. // Actions
  1411. ACTION_SAPPHIRON_BIRTH = 1
  1412. --
  1413. 2.24.1