1. #include "ScriptMgr.h"
  2. #include "ScriptedCreature.h"
  3. enum Spells
  4. {
  5. SPELL_DRUIDSLUMBER = 8040,
  6. SPELL_HEALINGTOUCH = 23381,
  7. SPELL_LIGHTNINGBOLT = 12167,
  8. };
  9. enum Events
  10. {
  11. EVENT_DRUIDSLUMBER = 1, // between 10 and 25 seconds
  12. EVENT_HEALINGTOUCH = 2, // between 10 and 15 seconds
  13. EVENT_LIGHTNINGBOLT = 3, // between 3 and 10 seconds
  14. };
  15. enum Texts
  16. {
  17. SAY_AGGRO = 0, // I am the Serpent King! I can do anything
  18. };
  19. enum Phases
  20. {
  21. PHASE_ELF = 1,
  22. PHASE_SERPENT = 2,
  23. };
  24. class boss_lord_serpentis : public CreatureScript
  25. {
  26. public:
  27. boss_lord_serpentis(): CreatureScript("boss_lord_serpentis"){}
  28. struct boss_lord_serpentisAI : public BossAI
  29. {
  30. boss_lord_serpentisAI(Creature* creature) : BossAI(creature,0) {}
  31. void Reset() override
  32. {
  33. _Reset();
  34. }
  35. void EnterCombat(Unit* who) override
  36. {
  37. _EnterCombat();
  38. Talk(SAY_AGGRO);
  39. events.ScheduleEvent(EVENT_DRUIDSLUMBER, urand(10000, 25000));
  40. events.ScheduleEvent(EVENT_HEALINGTOUCH, urand(10000, 15000));
  41. events.ScheduleEvent(EVENT_LIGHTNINGBOLT, urand(3000, 10000));
  42. }
  43. void UpdateAI(uint32 uiDiff) override
  44. {
  45. if (!UpdateVictim())
  46. return;
  47. events.Update(uiDiff);
  48. if (me->HasUnitState(UNIT_STATE_CASTING))
  49. return;
  50. while (uint32 eventId = events.ExecuteEvent())
  51. {
  52. switch (eventId)
  53. {
  54. case EVENT_DRUIDSLUMBER:
  55. if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0))
  56. DoCastVictim(SPELL_DRUIDSLUMBER);
  57. events.ScheduleEvent(EVENT_DRUIDSLUMBER, urand(10000, 25000));
  58. break;
  59. case EVENT_HEALINGTOUCH:
  60. if (Unit *target = DoSelectLowestHpFriendly(40.0f))
  61. DoCast(target, SPELL_HEALINGTOUCH);
  62. events.ScheduleEvent(EVENT_HEALINGTOUCH, urand(10000, 15000));
  63. break;
  64. case EVENT_LIGHTNINGBOLT:
  65. DoCastVictim(SPELL_LIGHTNINGBOLT);
  66. events.ScheduleEvent(EVENT_LIGHTNINGBOLT, urand(3000, 10000));
  67. break;
  68. }
  69. }
  70. DoMeleeAttackIfReady();
  71. }
  72. };
  73. CreatureAI* GetAI(Creature* creature) const override
  74. {
  75. return new boss_lord_serpentisAI(creature);
  76. }
  77. };
  78. void AddSC_boss_lord_serpentis()
  79. {
  80. new boss_lord_serpentis();
  81. }