diff --git a/src/server/scripts/Draenor/Dungeons/Auchindoun/boss_azzakel.cpp b/src/server/scripts/Draenor/Dungeons/Auchindoun/boss_azzakel.cpp index ab09b62..0d78564 100644 --- a/src/server/scripts/Draenor/Dungeons/Auchindoun/boss_azzakel.cpp +++ b/src/server/scripts/Draenor/Dungeons/Auchindoun/boss_azzakel.cpp @@ -15,102 +15,254 @@ * with this program. If not, see . */ +#include "ObjectMgr.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" -#include "auchindoun.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" -enum eAzzakelSpells +enum spells { - SpellClawsOfArgusBuff = 153762, - SpellClawsOfArgusVisual = 153764, - SpellClawsOfArgusDmg = 153772, - SpellCurtainOfFlameAura = 153392, - SpellCurtainOfFlameForceCast = 153396, - SpellCurtainOfFlameVisual = 153400, - SpellFelLashVisual = 153234, - SpellFelLashDummy = 174872, - SpellFelLashDebuff = 177120, - SpellFelLashDebuffTwo = 177121, - SpellMalevilentCrush = 153499, - SpellFelPoolAreatriger = 153500, - SpellFelPoolDebuffDmg = 153616, - SpellVisualFelBurst = 169682, - SpellFelSparkAreaTrigger = 153725, - SpellFelSparkDamage = 153726, - SpellFelSparkPerioidicCreation = 153727, - SpellSummonImp = 153775, - SpellFelGuard = 164080, - SpellSummonPyromaniac = 164127, - SpellFly = 161778 + SPELL_FEAL_LASH = 153234, + SPELL_CURTAIN_OF_FLAME = 153396, + SPELL_ARGUS = 153764 }; -enum eAzzakelTalks +enum npc { - AzzakelIntro = 37, ///< Who Dares Meddlie In The Works Of The Legion?! (46776) - AzzakelAggro = 38, ///< This World...All World...Shell Burn!(46774) - AzzakelSpell03 = 39, ///< Die, Insect!(46781) - AzzakelSpell02 = 40, ///< Burn In The Master'S Fire!(46780) - AzzakelSpell01 = 41, ///< Come Forth, Servants!(46779) - AzzakelKill01 = 42, ///< The Masters Blase Your Soul! (46777) - AzzakelKill02 = 43, ///< Burn! (46778) - AzzakelDeath = 44 ///< (46775) + NPC_FIREMAN = 79510, + NPC_BLAZING_ROGUE = 79511, + NPC_FELGUARDIAN = 76259, + NPC_AZZAKEL_TRIGGER = 100102 }; -enum eAzzakelCreatures +enum spells_of_npc { - TriggerFelPool = 326526, - TriggerFelSpark = 326527, - TriggerDemonSummoning = 432636, - CreatureFelguard = 76259, - CreatureCacklingPyromaniac = 76260, - CreatureBlazingTrickster = 79511, - CreatureBlazingTrickster02 = 76220 + SPELL_FEL_DETONATE = 167092, + SPELL_IGNITION = 154018, + SPELL_FEL_TREAD = 157173 }; -enum eAzzakelActions +enum events { - ActionFelSpark = 1, - ActionSummonDemons, - ActionRenewEvents, - ActionBoolActivate, - ActionBoolDeactivate, - ActionMalevolentCrash + EVENT_FEAL_LASH = 1, + EVENT_CURTAIN_OF_FLAME = 2, + EVENT_FLYPHASE = 3, + EVENT_BACK = 4, + EVENT_FEL_POOl = 5 }; -enum eAzzakelMovements +enum points { - MovementAzzakelMalevolentCrash = 2 + POINT_AIR = 0, + POINT_GROUND = 1 }; +Position const Flypost = { 1949.93f, 2721.15f, 56.16f, 0.0f }; +Position const Landpost = { 1926.27f, 2723.02f, 30.79f, 0.0f }; +#define count 3 +Position const Summ_pos [count] = +{ + {1907.84f,2749.25f,30.80f,4.6f}, + {1883.98f,2726.08f,30.79f,6.15f}, + {1905.36f,2699.54f,30.79f,1.43f} +}; +class boss_azakel : public CreatureScript +{ +public: + boss_azakel() : CreatureScript("boss_azakel") {} -Position const g_PositionAzzakel_Blackgate = { 1929.65f, 2699.27f, 30.799f, 4.428220f }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } -Position const g_PositionSpawningFlyCoords[2] = -{ - { 1912.13f, 2720.44f, 49.818f, 1.600908f }, - { 1911.65f, 2757.73f, 30.799f, 4.748000f } + struct boss_azakelAI : public BossAI + { + boss_azakelAI(Creature* creature) : BossAI(creature, BOSS_AZAKEL) + { + me->SetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_VALUE, float(400)); + me->UpdateAttackPowerAndDamage(); + } + + void Reset() override + { + _Reset(); + Initialize(); + } + + void Initialize() + { + DemonicPortal(false); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); + me->SetReactState(REACT_AGGRESSIVE); + } + + void EnterCombat(Unit* /*who*/) override + { + _EnterCombat(); + DemonicPortal(true); + _MainActions(); + } + + void _summon() + { + me->SummonCreature(NPC_FELGUARDIAN,Summ_pos[0],TEMPSUMMON_CORPSE_DESPAWN,0); + me->SummonCreature(NPC_FIREMAN, Summ_pos[1], TEMPSUMMON_CORPSE_DESPAWN, 0); + me->SummonCreature(NPC_BLAZING_ROGUE, Summ_pos[2], TEMPSUMMON_CORPSE_DESPAWN, 0); + } + + void MovementInform(uint32 type, uint32 id) override + { + switch (id) + { + case POINT_AIR: + events.ScheduleEvent(EVENT_BACK, 9500); + DoCastAOE(SPELL_ARGUS); + _summon(); + break; + case POINT_GROUND: + events.Reset(); + me->SetCanFly(false); + me->SetDisableGravity(false); + _MainActions(); + events.ScheduleEvent(EVENT_FEL_POOl, 1000); + break; + default: + break; + } + } + void _MainActions() + { + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->SetReactState(REACT_AGGRESSIVE); + events.ScheduleEvent(EVENT_FEAL_LASH, 2000); + events.ScheduleEvent(EVENT_CURTAIN_OF_FLAME, 4000); + events.ScheduleEvent(EVENT_FLYPHASE, 30000); + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + DemonicPortal(false); + } + + void DemonicPortal(bool state) + { + switch (state) + { + case true: + if (GameObject* gameobject = me->SummonGameObject(OBJECT_Fel_barier, 1911.64f, 2722.51f, 31.57f, 3.14f, 0, 0, 0, 0, 0)) + FelBarier = gameobject->GetGUID(); + if (GameObject* gameobject = me->SummonGameObject(OBJECT_DemonicPortal, 1911.64f, 2722.51f, 31.57f, 3.14f, 0, 0, 0, 0, 0)) + DemonPortal = gameobject->GetGUID(); + break; + case false: + if (GameObject* gameobject = ObjectAccessor::GetGameObject(*me, FelBarier)) + gameobject->Delete(); + if (GameObject* gameobject = ObjectAccessor::GetGameObject(*me, DemonPortal)) + gameobject->Delete(); + break; + } + } + + 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_FEAL_LASH: + DoCast(SelectTarget(SELECT_TARGET_TOPAGGRO), SPELL_FEAL_LASH); + events.ScheduleEvent(EVENT_FEAL_LASH, 6000); + break; + case EVENT_CURTAIN_OF_FLAME: + DoCast(SelectTarget(SELECT_TARGET_RANDOM), SPELL_CURTAIN_OF_FLAME); + events.ScheduleEvent(EVENT_CURTAIN_OF_FLAME, 8000); + break; + case EVENT_FLYPHASE: + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->SetCanFly(true); + me->SetDisableGravity(true); + me->GetMotionMaster()->MovePoint(POINT_AIR,Flypost); + break; + case EVENT_BACK: + me->GetMotionMaster()->MovePoint(POINT_GROUND, Landpost); + break; + case EVENT_FEL_POOl: + for (uint32 i = 0; i < 2; i++) + if (Unit* player = me->SelectNearestPlayer(50.0f)) + me->SummonCreature(NPC_AZZAKEL_TRIGGER, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetOrientation(), TEMPSUMMON_CORPSE_DESPAWN, 0); + events.ScheduleEvent(EVENT_FEL_POOl, 10000); + break; + default: + break; + } + } + DoMeleeAttackIfReady(); + } + private: + ObjectGuid DemonPortal; + ObjectGuid FelBarier; + }; }; -Position const g_PositionAzzakelBlackgateLittle[4] = +enum spells_dummy { - { 1911.90f, 2680.62f, 31.418f, 1.450705f }, - { 1911.79f, 2764.35f, 31.418f, 4.721891f }, - { 1953.55f, 2722.47f, 31.418f, 3.139304f }, - { 1869.70f, 2722.45f, 31.418f, 0.001632f } + SPELL_TRIGGER = 183142, + SPELL_AURA = 153726 }; -static void HandleDoors(Unit* p_Me) +class Azzakel_trigger : public CreatureScript { - std::list l_ListGameObjects; - p_Me->GetGameObjectListWithEntryInGrid(l_ListGameObjects, eAuchindounObjects::GameobjectFelBarrier, 100.0f); - if (l_ListGameObjects.empty()) - return; +public: + Azzakel_trigger() : CreatureScript("Azzakel_trigger") {} - for (GameObject* l_Itr : l_ListGameObjects) - l_Itr->Delete(); -} + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } + + struct Azzakel_triggerAI : public ScriptedAI + { + Azzakel_triggerAI(Creature* creature) : ScriptedAI(creature) + { + } + EventMap events; -void AddSC_boss_azzakel() + void IsSummonedBy(Unit* summoner) + { + DoCast(me, SPELL_TRIGGER); + me->DespawnOrUnsummon(15000); + } + + void UpdateAI(uint32 diff) override + { + events.Update(diff); + if (Unit* nearPlayer = me->SelectNearestPlayer(3.0f)) + if (!nearPlayer->HasAura(SPELL_AURA)) + nearPlayer->AddAura(SPELL_AURA, nearPlayer); + if (Unit* nearPlayer = me->SelectNearestPlayer(6.0f)) + if (nearPlayer->GetDistance2d(me) > 3) + nearPlayer->RemoveAura(SPELL_AURA); + } + }; +}; + +void AddSC_boss_azakel() { - + new boss_azakel(); + new Azzakel_trigger(); + }