diff --git a/src/server/scripts/Draenor/Dungeons/Auchindoun/boss_vigilant_kaathar.cpp b/src/server/scripts/Draenor/Dungeons/Auchindoun/boss_vigilant_kaathar.cpp index c602f52..24ca5c2 100644 --- a/src/server/scripts/Draenor/Dungeons/Auchindoun/boss_vigilant_kaathar.cpp +++ b/src/server/scripts/Draenor/Dungeons/Auchindoun/boss_vigilant_kaathar.cpp @@ -15,10 +15,295 @@ * with this program. If not, see . */ +#include "ObjectMgr.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "PassiveAI.h" +#include "SpellScript.h" +#include "MoveSplineInit.h" +#include "Cell.h" +#include "CellImpl.h" +#include "GridNotifiers.h" +#include "GridNotifiersImpl.h" +#include "Auchindoun.h" -void AddSC_boss_vigilant_Kaathar() +enum Spells { - + SPELL_SHIELD_DAMAGE = 153480, + SPELL_SHIELD_OBJECT = 153002, + // SPELL_LINES_LEFT = 163559 + // SPELL_LINES_RIGHT= 165064 + SPELL_AOE = 153006, + SPELL_JUMP = 71809 // for start +}; + +enum Events +{ + EVENT_SHIELD_DMG = 1, + EVENT_SHIELD_OBJ = 2, + EVENT_AOE_PHASE = 3, + EVENT_BACK = 4 +}; + +Position const startpoint = { 1911.47f, 3183.50f, 30.79f, 0.85f }; +class boss_kaathar : public CreatureScript +{ +public: + boss_kaathar() : CreatureScript("boss_kaathar") {} + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } + + struct boss_kaatharAI : public BossAI + { + boss_kaatharAI(Creature* creature) : BossAI(creature, BOSS_KAATHAR) + { + Initialize(); + Reset(); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); + SetEquipmentSlots(false, 114923, 114923, 0); + } + + void Initialize() + { + Holly_Barier(false); + } + bool check; + void EnterCombat(Unit* /*who*/) override + { + _EnterCombat(); + DoZoneInCombat(); + Holly_Barier(true); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); + me->SetReactState(REACT_AGGRESSIVE); + events.ScheduleEvent(EVENT_SHIELD_OBJ, 25000); + } + + void Reset() override + { + _Reset(); + Initialize(); + } + + void Holly_Barier(bool state) + { + switch (state) + { + case false: + if (GameObject* gameobject = ObjectAccessor::GetGameObject(*me, Holly_bar)) + gameobject->Delete(); + break; + case true: + if (GameObject* gameobject = me->SummonGameObject(OBJECT_Holly_barier, 1911.47f, 3183.50f, 30.79f, 0.85f, 0, 0, 0, 0, 0)) + Holly_bar = gameobject->GetGUID(); + break; + } + } + + void MovementInform (uint32 type, uint32 id) override + { + if (id == 1) + { + me->StopMoving(); + DoCastAOE(SPELL_AOE); + events.ScheduleEvent(EVENT_BACK, 10000); + } + } + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + instance->SetBossState(BOSS_KAATHAR, DONE); + Holly_Barier(false); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_SHIELD_DMG: + DoCast(SelectTarget(SELECT_TARGET_RANDOM), SPELL_SHIELD_DAMAGE); + events.ScheduleEvent(EVENT_SHIELD_OBJ, 25000); + me->SetReactState(REACT_PASSIVE); + me->GetMotionMaster()->MovePoint(1, startpoint); + me->AttackStop(); + break; + case EVENT_SHIELD_OBJ: + DoCast(SelectTarget(SELECT_TARGET_RANDOM), SPELL_SHIELD_OBJECT); + events.ScheduleEvent(EVENT_SHIELD_DMG, 1000); + break; + case EVENT_BACK: + me->SetReactState(REACT_AGGRESSIVE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + private: + ObjectGuid crystalguid; + ObjectGuid Holly_bar; + }; +}; +class crystal_trigger : public CreatureScript +{ +public: + crystal_trigger() : CreatureScript("crystal_trigger") {} + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } + + struct crystal_triggerAI : public ScriptedAI + { + crystal_triggerAI(Creature* creature) : ScriptedAI(creature) + { + } + EventMap events; + + void UpdateAI(uint32 diff) override + { + events.Update(diff); + } + }; +}; + +enum Spells_of_Niami +{ + SPELL_STASIS_OF_VOID = 154840, + SPELL_LIGHT = 166933 +}; + +enum Events_of_Niami +{ + EVENT_DOOR_OPEN = 10, + EVENT_COUNTINUE = 11, + EVENT_STASIS = 12, + EVENT_WENT=13, + EVENT_PROCESS=14 +}; + +enum Yells +{ + SAY_HELLO_01 = 0, + SAY_HELLO_02 = 1, + SAY_TALKWITH = 2, + SAY_QUESTION = 3, + SAY_LETS = 4, + SAY_DESCRIBE = 5 +}; +class npc_tuulani : public CreatureScript +{ +public: + npc_tuulani() : CreatureScript("npc_tuulani") {} + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } + struct npc_tuulaniAI : public ScriptedAI + { + npc_tuulaniAI(Creature* creature) : ScriptedAI(creature) + { + _count = 0; + _check = false; + _st = false; + } + EventMap events; + uint32 _count; + bool _check; + bool _st; + void MovementInform(uint32 type, uint32 id) override + { + if (type != POINT_MOTION_TYPE) + return; + switch (id) + { + case 2: + _count++; + Talk(SAY_TALKWITH); + break; + case 3: + if (!_st) + { + me->StopMoving(); + Talk(SAY_QUESTION); + events.ScheduleEvent(EVENT_DOOR_OPEN, 1000); + _st = true; + } + break; + case 6: + _count++; + Talk(SAY_DESCRIBE); + break; + case 10: + me->StopMoving(); + DoCast(me, SPELL_STASIS_OF_VOID); + me->setActive(false); + break; + default: + _count++; + break; + } + } + void UpdateAI(uint32 diff) override + { + + if (!_check) + if (Unit* nearPlayer = me->SelectNearestPlayer(10.0f)) + { + Talk(SAY_HELLO_01); + events.ScheduleEvent(EVENT_WENT, 8000); + events.ScheduleEvent(EVENT_PROCESS, 15000); + _check = true; + } + events.Update(diff); + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_DOOR_OPEN: + DoCastAOE(SPELL_LIGHT); + events.ScheduleEvent(EVENT_COUNTINUE, 5500); + break; + case EVENT_COUNTINUE: + Talk(SAY_LETS); + if (GameObject* gm = me->FindNearestGameObject(OBJECT_Holly_barier_Wall, 20.0f)) + gm->UseDoorOrButton(0, false, me); + _count++; + break; + case EVENT_WENT: + Talk(SAY_HELLO_02); + break; + case EVENT_PROCESS: + me->GetMotionMaster()->MovePoint(_count, Niami_waypoints[_count]); + events.ScheduleEvent(EVENT_PROCESS,3500); + break; + default: + break; + } + } + } + private: + ObjectGuid holyshield; + }; +}; +void AddSC_boss_kaathar() +{ + new boss_kaathar(); + new crystal_trigger(); + new npc_tuulani(); }