1. #include "ScriptMgr.h"
  2. #include "ScriptedCreature.h"
  3. enum Spells
  4. {
  5. SPELL_DRUIDSLUMBER = 8040,
  6. SPELL_HEALINGTOUCH = 23381,
  7. SPELL_LIGHTNINGBOLT = 20805,
  8. SPELL_COBRAHNSERPENTFORM = 7965,
  9. SPELL_POISON = 744,
  10. };
  11. enum Events
  12. {
  13. EVENT_DRUIDSLUMBER = 1, // between 10 and 25 seconds
  14. EVENT_HEALINGTOUCH = 2, // between 10 and 15 seconds
  15. EVENT_LIGHTNINGBOLT = 3, // between 3 and 10 seconds
  16. EVENT_COBRAHNSERPENTFORM = 4, // change form if 45% HP or below
  17. EVENT_POISON = 5 //
  18. };
  19. enum Texts
  20. {
  21. SAY_AGGRO = 0, // You will never wake the dreamer!
  22. };
  23. enum Phases
  24. {
  25. PHASE_ELF = 1,
  26. PHASE_SERPENT = 2,
  27. };
  28. class boss_lord_cobrahn : public CreatureScript
  29. {
  30. public:
  31. boss_lord_cobrahn(): CreatureScript("boss_lord_cobrahn"){}
  32. struct boss_lord_cobrahnAI : public BossAI
  33. {
  34. boss_lord_cobrahnAI(Creature* creature) : BossAI(creature,0) {}
  35. void Reset() override
  36. {
  37. _Reset();
  38. }
  39. void EnterCombat(Unit* who) override
  40. {
  41. _EnterCombat();
  42. Talk(SAY_AGGRO);
  43. events.SetPhase(PHASE_ELF);
  44. events.ScheduleEvent(EVENT_DRUIDSLUMBER, urand(10000, 25000));
  45. events.ScheduleEvent(EVENT_HEALINGTOUCH, urand(10000, 15000));
  46. events.ScheduleEvent(EVENT_LIGHTNINGBOLT, urand(3000, 10000));
  47. }
  48. void UpdateAI(uint32 uiDiff) override
  49. {
  50. if (!UpdateVictim())
  51. return;
  52. events.Update(uiDiff);
  53. if (me->HasUnitState(UNIT_STATE_CASTING))
  54. return;
  55. if(events.IsInPhase(PHASE_ELF) && HealthBelowPct(75))
  56. {
  57. events.SetPhase(PHASE_SERPENT);
  58. DoCast(me, SPELL_COBRAHNSERPENTFORM);
  59. events.ScheduleEvent(EVENT_POISON,urand(5000,10000),0,PHASE_SERPENT);
  60. }
  61. while (uint32 eventId = events.ExecuteEvent())
  62. {
  63. switch (eventId)
  64. {
  65. case EVENT_DRUIDSLUMBER:
  66. if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0))
  67. DoCastVictim(SPELL_DRUIDSLUMBER);
  68. events.ScheduleEvent(EVENT_DRUIDSLUMBER,urand(10000, 25000),0,PHASE_ELF);
  69. break;
  70. case EVENT_HEALINGTOUCH:
  71. if (Unit *target = DoSelectLowestHpFriendly(40.0f))
  72. DoCast(target, SPELL_HEALINGTOUCH);
  73. events.ScheduleEvent(EVENT_HEALINGTOUCH,urand(10000, 15000),0,PHASE_ELF);
  74. break;
  75. case EVENT_LIGHTNINGBOLT:
  76. DoCastVictim(SPELL_LIGHTNINGBOLT);
  77. events.ScheduleEvent(EVENT_LIGHTNINGBOLT,urand(3000, 10000),0,PHASE_ELF);
  78. break;
  79. case EVENT_POISON:
  80. DoCastVictim(SPELL_POISON);
  81. events.ScheduleEvent(EVENT_POISON,urand(5000,10000),0,PHASE_SERPENT);
  82. break;
  83. }
  84. }
  85. DoMeleeAttackIfReady();
  86. }
  87. };
  88. CreatureAI* GetAI(Creature* creature) const override
  89. {
  90. return new boss_lord_cobrahnAI(creature);
  91. }
  92. };
  93. void AddSC_boss_lord_cobrahn()
  94. {
  95. new boss_lord_cobrahn();
  96. }