- #include "ScriptMgr.h"
- #include "ScriptedCreature.h"
- enum Spells
- {
- SPELL_DRUIDSLUMBER = 8040,
- SPELL_HEALINGTOUCH = 23381,
- SPELL_LIGHTNINGBOLT = 20805,
- SPELL_COBRAHNSERPENTFORM = 7965,
- SPELL_POISON = 744,
- };
- enum Events
- {
- EVENT_DRUIDSLUMBER = 1, // between 10 and 25 seconds
- EVENT_HEALINGTOUCH = 2, // between 10 and 15 seconds
- EVENT_LIGHTNINGBOLT = 3, // between 3 and 10 seconds
- EVENT_COBRAHNSERPENTFORM = 4, // change form if 45% HP or below
- EVENT_POISON = 5 //
- };
- enum Texts
- {
- SAY_AGGRO = 0, // You will never wake the dreamer!
- };
- enum Phases
- {
- PHASE_ELF = 1,
- PHASE_SERPENT = 2,
- };
- class boss_lord_cobrahn : public CreatureScript
- {
- public:
- boss_lord_cobrahn(): CreatureScript("boss_lord_cobrahn"){}
- struct boss_lord_cobrahnAI : public BossAI
- {
- boss_lord_cobrahnAI(Creature* creature) : BossAI(creature,0) {}
- void Reset() override
- {
- _Reset();
- }
- void EnterCombat(Unit* who) override
- {
- _EnterCombat();
- Talk(SAY_AGGRO);
- events.SetPhase(PHASE_ELF);
- events.ScheduleEvent(EVENT_DRUIDSLUMBER, urand(10000, 25000));
- events.ScheduleEvent(EVENT_HEALINGTOUCH, urand(10000, 15000));
- events.ScheduleEvent(EVENT_LIGHTNINGBOLT, urand(3000, 10000));
- }
- void UpdateAI(uint32 uiDiff) override
- {
- if (!UpdateVictim())
- return;
- events.Update(uiDiff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
- if(events.IsInPhase(PHASE_ELF) && HealthBelowPct(75))
- {
- events.SetPhase(PHASE_SERPENT);
- DoCast(me, SPELL_COBRAHNSERPENTFORM);
- events.ScheduleEvent(EVENT_POISON,urand(5000,10000),0,PHASE_SERPENT);
- }
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_DRUIDSLUMBER:
- if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCastVictim(SPELL_DRUIDSLUMBER);
- events.ScheduleEvent(EVENT_DRUIDSLUMBER,urand(10000, 25000),0,PHASE_ELF);
- break;
- case EVENT_HEALINGTOUCH:
- if (Unit *target = DoSelectLowestHpFriendly(40.0f))
- DoCast(target, SPELL_HEALINGTOUCH);
- events.ScheduleEvent(EVENT_HEALINGTOUCH,urand(10000, 15000),0,PHASE_ELF);
- break;
- case EVENT_LIGHTNINGBOLT:
- DoCastVictim(SPELL_LIGHTNINGBOLT);
- events.ScheduleEvent(EVENT_LIGHTNINGBOLT,urand(3000, 10000),0,PHASE_ELF);
- break;
- case EVENT_POISON:
- DoCastVictim(SPELL_POISON);
- events.ScheduleEvent(EVENT_POISON,urand(5000,10000),0,PHASE_SERPENT);
- break;
- }
- }
- DoMeleeAttackIfReady();
- }
- };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new boss_lord_cobrahnAI(creature);
- }
- };
- void AddSC_boss_lord_cobrahn()
- {
- new boss_lord_cobrahn();
- }