diff options
6 files changed, 857 insertions, 932 deletions
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp index ec969ec9d46..2df55af0b02 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp @@ -66,166 +66,155 @@ enum MillhouseSpells      SPELL_PYROBLAST            = 33975,  }; -class npc_millhouse_manastorm : public CreatureScript +struct npc_millhouse_manastorm : public ScriptedAI  { -    public: -        npc_millhouse_manastorm() : CreatureScript("npc_millhouse_manastorm") { } +    npc_millhouse_manastorm(Creature* creature) : ScriptedAI(creature), Init(false) +    { +        Initialize(); +        instance = creature->GetInstanceScript(); +    } -        struct npc_millhouse_manastormAI : public ScriptedAI -        { -            npc_millhouse_manastormAI(Creature* creature) : ScriptedAI(creature), Init(false) -            { -                Initialize(); -                instance = creature->GetInstanceScript(); -            } - -            void Initialize() -            { -                EventProgress_Timer = 2000; -                LowHp = false; -                Phase = 1; - -                Pyroblast_Timer = 1000; -                Fireball_Timer = 2500; -            } +    void Initialize() +    { +        EventProgress_Timer = 2000; +        LowHp = false; +        Phase = 1; -            InstanceScript* instance; +        Pyroblast_Timer = 1000; +        Fireball_Timer = 2500; +    } -            uint32 EventProgress_Timer; -            uint32 Phase; -            bool Init; -            bool LowHp; - -            uint32 Pyroblast_Timer; -            uint32 Fireball_Timer; - -            void Reset() override -            { -                Initialize(); - -                if (instance->GetData(DATA_WARDEN_2) == DONE) -                { -                    Init = true; -                    me->SetImmuneToNPC(false); -                } +    InstanceScript* instance; -                if (instance->GetBossState(DATA_HARBINGER_SKYRISS) == DONE) -                    Talk(SAY_COMPLETE); -            } +    uint32 EventProgress_Timer; +    uint32 Phase; +    bool Init; +    bool LowHp; -            void AttackStart(Unit* who) override -            { -                if (me->Attack(who, true)) -                { -                    AddThreat(who, 0.0f); -                    me->SetInCombatWith(who); -                    who->SetInCombatWith(me); -                    me->GetMotionMaster()->MoveChase(who, 25.0f); -                } -            } +    uint32 Pyroblast_Timer; +    uint32 Fireball_Timer; -            void KilledUnit(Unit* who) override -            { -                if (who->GetTypeId() == TYPEID_PLAYER) -                    Talk(SAY_KILL); -            } +    void Reset() override +    { +        Initialize(); -            void JustDied(Unit* /*killer*/) override -            { -                Talk(SAY_DEATH); +        if (instance->GetData(DATA_WARDEN_2) == DONE) +        { +            Init = true; +            me->SetImmuneToNPC(false); +        } -                /*for questId 10886 (heroic mode only) -                if (instance->GetBossState(DATA_HARBINGER_SKYRISS) != DONE) -                ->FailQuest();*/ -            } +        if (instance->GetBossState(DATA_HARBINGER_SKYRISS) == DONE) +            Talk(SAY_COMPLETE); +    } -            void UpdateAI(uint32 diff) override +    void AttackStart(Unit* who) override +    { +        if (me->Attack(who, true)) +        { +            AddThreat(who, 0.0f); +            me->SetInCombatWith(who); +            who->SetInCombatWith(me); +            me->GetMotionMaster()->MoveChase(who, 25.0f); +        } +    } + +    void KilledUnit(Unit* who) override +    { +        if (who->GetTypeId() == TYPEID_PLAYER) +            Talk(SAY_KILL); +    } + +    void JustDied(Unit* /*killer*/) override +    { +        Talk(SAY_DEATH); + +        /*for questId 10886 (heroic mode only) +        if (instance->GetBossState(DATA_HARBINGER_SKYRISS) != DONE) +        ->FailQuest();*/ +    } + +    void UpdateAI(uint32 diff) override +    { +        if (!Init) +        { +            if (EventProgress_Timer <= diff)              { -                if (!Init) +                if (Phase < 8)                  { -                    if (EventProgress_Timer <= diff) +                    switch (Phase)                      { -                        if (Phase < 8) -                        { -                            switch (Phase) -                            { -                            case 1: -                                Talk(SAY_INTRO_1); -                                EventProgress_Timer = 18000; -                                break; -                            case 2: -                                Talk(SAY_INTRO_2); -                                EventProgress_Timer = 18000; -                                break; -                            case 3: -                                Talk(SAY_WATER); -                                DoCast(me, SPELL_CONJURE_WATER); -                                EventProgress_Timer = 7000; -                                break; -                            case 4: -                                Talk(SAY_BUFFS); -                                DoCast(me, SPELL_ICE_ARMOR); -                                EventProgress_Timer = 7000; -                                break; -                            case 5: -                                Talk(SAY_DRINK); -                                DoCast(me, SPELL_ARCANE_INTELLECT); -                                EventProgress_Timer = 7000; -                                break; -                            case 6: -                                Talk(SAY_READY); -                                EventProgress_Timer = 6000; -                                break; -                            case 7: -                                instance->SetData(DATA_WARDEN_2, DONE); -                                Init = true; -                                me->SetImmuneToNPC(false); -                                break; -                            } -                            ++Phase; -                        } +                    case 1: +                        Talk(SAY_INTRO_1); +                        EventProgress_Timer = 18000; +                        break; +                    case 2: +                        Talk(SAY_INTRO_2); +                        EventProgress_Timer = 18000; +                        break; +                    case 3: +                        Talk(SAY_WATER); +                        DoCast(me, SPELL_CONJURE_WATER); +                        EventProgress_Timer = 7000; +                        break; +                    case 4: +                        Talk(SAY_BUFFS); +                        DoCast(me, SPELL_ICE_ARMOR); +                        EventProgress_Timer = 7000; +                        break; +                    case 5: +                        Talk(SAY_DRINK); +                        DoCast(me, SPELL_ARCANE_INTELLECT); +                        EventProgress_Timer = 7000; +                        break; +                    case 6: +                        Talk(SAY_READY); +                        EventProgress_Timer = 6000; +                        break; +                    case 7: +                        instance->SetData(DATA_WARDEN_2, DONE); +                        Init = true; +                        me->SetImmuneToNPC(false); +                        break;                      } -                    else -                        EventProgress_Timer -= diff; +                    ++Phase;                  } +            } +            else +                EventProgress_Timer -= diff; +        } -                if (!UpdateVictim()) -                    return; -                if (!LowHp && HealthBelowPct(20)) -                { -                    Talk(SAY_LOWHP); -                    LowHp = true; -                } - -                if (Pyroblast_Timer <= diff) -                { -                    if (me->IsNonMeleeSpellCast(false)) -                        return; - -                    Talk(SAY_PYRO); +        if (!UpdateVictim()) +            return; +        if (!LowHp && HealthBelowPct(20)) +        { +            Talk(SAY_LOWHP); +            LowHp = true; +        } -                    DoCastVictim(SPELL_PYROBLAST); -                    Pyroblast_Timer = 40000; -                } -                else -                    Pyroblast_Timer -=diff; +        if (Pyroblast_Timer <= diff) +        { +            if (me->IsNonMeleeSpellCast(false)) +                return; -                if (Fireball_Timer <= diff) -                { -                    DoCastVictim(SPELL_FIREBALL); -                    Fireball_Timer = 4000; -                } -                else -                    Fireball_Timer -=diff; +            Talk(SAY_PYRO); -                DoMeleeAttackIfReady(); -            } -        }; +            DoCastVictim(SPELL_PYROBLAST); +            Pyroblast_Timer = 40000; +        } +        else +            Pyroblast_Timer -=diff; -        CreatureAI* GetAI(Creature* creature) const override +        if (Fireball_Timer <= diff)          { -            return GetArcatrazAI<npc_millhouse_manastormAI>(creature); +            DoCastVictim(SPELL_FIREBALL); +            Fireball_Timer = 4000;          } +        else +            Fireball_Timer -=diff; + +        DoMeleeAttackIfReady(); +    }  };  /*#####  # npc_warden_mellichar @@ -271,255 +260,244 @@ enum WardenSpells      SPELL_BUBBLE_VISUAL = 36849,  }; -class npc_warden_mellichar : public CreatureScript +struct npc_warden_mellichar : public ScriptedAI  { -    public: -        npc_warden_mellichar() : CreatureScript("npc_warden_mellichar") { } +    npc_warden_mellichar(Creature* creature) : ScriptedAI(creature) +    { +        Initialize(); +        instance = creature->GetInstanceScript(); +    } -        struct npc_warden_mellicharAI : public ScriptedAI -        { -            npc_warden_mellicharAI(Creature* creature) : ScriptedAI(creature) -            { -                Initialize(); -                instance = creature->GetInstanceScript(); -            } +    void Initialize() +    { +        IsRunning = false; +        CanSpawn = false; -            void Initialize() -            { -                IsRunning = false; -                CanSpawn = false; - -                EventProgress_Timer = 22000; -                Phase = 1; -            } +        EventProgress_Timer = 22000; +        Phase = 1; +    } -            InstanceScript* instance; +    InstanceScript* instance; -            bool IsRunning; -            bool CanSpawn; - -            uint32 EventProgress_Timer; -            uint32 Phase; - -            void Reset() override -            { -                Initialize(); +    bool IsRunning; +    bool CanSpawn; -                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); -                DoCast(me, SPELL_TARGET_OMEGA); +    uint32 EventProgress_Timer; +    uint32 Phase; -                instance->SetBossState(DATA_HARBINGER_SKYRISS, NOT_STARTED); -            } +    void Reset() override +    { +        Initialize(); -            void AttackStart(Unit* /*who*/) override { } +        me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); +        DoCast(me, SPELL_TARGET_OMEGA); -            void MoveInLineOfSight(Unit* who) override -            { -                if (IsRunning) -                    return; +        instance->SetBossState(DATA_HARBINGER_SKYRISS, NOT_STARTED); +    } -                if (!me->GetVictim() && me->CanCreatureAttack(who)) -                { -                    if (!me->CanFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE) -                        return; -                    if (who->GetTypeId() != TYPEID_PLAYER) -                        return; - -                    float attackRadius = me->GetAttackDistance(who)/10; -                    if (me->IsWithinDistInMap(who, attackRadius) && me->IsWithinLOSInMap(who)) -                        JustEngagedWith(who); -                } -            } +    void AttackStart(Unit* /*who*/) override { } -            void JustEngagedWith(Unit* /*who*/) override -            { -                Talk(YELL_INTRO1); -                DoCast(me, SPELL_BUBBLE_VISUAL); +    void MoveInLineOfSight(Unit* who) override +    { +        if (IsRunning) +            return; -                instance->SetBossState(DATA_HARBINGER_SKYRISS, IN_PROGRESS); +        if (!me->GetVictim() && me->CanCreatureAttack(who)) +        { +            if (!me->CanFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE) +                return; +            if (who->GetTypeId() != TYPEID_PLAYER) +                return; + +            float attackRadius = me->GetAttackDistance(who)/10; +            if (me->IsWithinDistInMap(who, attackRadius) && me->IsWithinLOSInMap(who)) +                JustEngagedWith(who); +        } +    } + +    void JustEngagedWith(Unit* /*who*/) override +    { +        Talk(YELL_INTRO1); +        DoCast(me, SPELL_BUBBLE_VISUAL); + +        instance->SetBossState(DATA_HARBINGER_SKYRISS, IN_PROGRESS); +        instance->HandleGameObject(instance->GetGuidData(DATA_WARDENS_SHIELD), false); +        IsRunning = true; +    } + +    void JustSummoned(Creature* summon) override +    { +        DoZoneInCombat(summon); +        if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) +            summon->AI()->AttackStart(target); +    } + +    bool CanProgress() +    { +        if (Phase == 7 && instance->GetData(DATA_WARDEN_4) == DONE) +            return true; +        if (Phase == 6 && instance->GetData(DATA_WARDEN_3) == DONE) +            return true; +        if (Phase == 5 && instance->GetData(DATA_WARDEN_2) == DONE) +            return true; +        if (Phase == 4) +            return true; +        if (Phase == 3 && instance->GetData(DATA_WARDEN_1) == DONE) +            return true; +        if (Phase == 2 && instance->GetBossState(DATA_HARBINGER_SKYRISS) == IN_PROGRESS) +            return true; +        if (Phase == 1 && instance->GetBossState(DATA_HARBINGER_SKYRISS) == IN_PROGRESS) +            return true; + +        return false; +    } + +    void DoPrepareForPhase() +    { +        me->InterruptNonMeleeSpells(true); +        me->RemoveAurasByType(SPELL_AURA_DUMMY); + +        switch (Phase) +        { +            case 2: +                DoCast(me, SPELL_TARGET_ALPHA); +                instance->SetData(DATA_WARDEN_1, IN_PROGRESS);                  instance->HandleGameObject(instance->GetGuidData(DATA_WARDENS_SHIELD), false); -                IsRunning = true; -            } +                break; +            case 3: +                DoCast(me, SPELL_TARGET_BETA); +                instance->SetData(DATA_WARDEN_2, IN_PROGRESS); +                break; +            case 5: +                DoCast(me, SPELL_TARGET_DELTA); +                instance->SetData(DATA_WARDEN_3, IN_PROGRESS); +                break; +            case 6: +                DoCast(me, SPELL_TARGET_GAMMA); +                instance->SetData(DATA_WARDEN_4, IN_PROGRESS); +                break; +            case 7: +                instance->SetData(DATA_WARDEN_5, IN_PROGRESS); +                break; +        } +        CanSpawn = true; +    } -            void JustSummoned(Creature* summon) override -            { -                DoZoneInCombat(summon); -                if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) -                    summon->AI()->AttackStart(target); -            } +    void UpdateAI(uint32 diff) override +    { +        if (!IsRunning) +            return; -            bool CanProgress() +        if (EventProgress_Timer <= diff) +        { +            if (instance->GetBossState(DATA_HARBINGER_SKYRISS) == FAIL)              { -                if (Phase == 7 && instance->GetData(DATA_WARDEN_4) == DONE) -                    return true; -                if (Phase == 6 && instance->GetData(DATA_WARDEN_3) == DONE) -                    return true; -                if (Phase == 5 && instance->GetData(DATA_WARDEN_2) == DONE) -                    return true; -                if (Phase == 4) -                    return true; -                if (Phase == 3 && instance->GetData(DATA_WARDEN_1) == DONE) -                    return true; -                if (Phase == 2 && instance->GetBossState(DATA_HARBINGER_SKYRISS) == IN_PROGRESS) -                    return true; -                if (Phase == 1 && instance->GetBossState(DATA_HARBINGER_SKYRISS) == IN_PROGRESS) -                    return true; - -                return false; +                Reset(); +                return;              } -            void DoPrepareForPhase() +            if (CanSpawn)              { -                me->InterruptNonMeleeSpells(true); -                me->RemoveAurasByType(SPELL_AURA_DUMMY); +                //continue beam omega pod, unless we are about to summon skyriss +                if (Phase != 7) +                    DoCast(me, SPELL_TARGET_OMEGA);                  switch (Phase)                  { -                    case 2: -                        DoCast(me, SPELL_TARGET_ALPHA); -                        instance->SetData(DATA_WARDEN_1, IN_PROGRESS); -                        instance->HandleGameObject(instance->GetGuidData(DATA_WARDENS_SHIELD), false); +                case 2: +                    switch (urand(0, 1)) +                    { +                    case 0: +                        me->SummonCreature(ENTRY_TRICKSTER, 472.231f, -150.86f, 42.6573f, 3.10669f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // random pos                          break; -                    case 3: -                        DoCast(me, SPELL_TARGET_BETA); -                        instance->SetData(DATA_WARDEN_2, IN_PROGRESS); +                    case 1: +                        me->SummonCreature(ENTRY_PH_HUNTER, 472.231f, -150.86f, 42.6573f, 3.10669f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // random pos                          break; -                    case 5: -                        DoCast(me, SPELL_TARGET_DELTA); -                        instance->SetData(DATA_WARDEN_3, IN_PROGRESS); +                    } +                    break; +                case 3: +                    me->SummonCreature(ENTRY_MILLHOUSE, 417.242f, -149.795f, 42.6548f, 0.191986f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // static pos +                    break; +                case 4: +                    Talk(YELL_RELEASE2B); +                    break; +                case 5: +                    switch (urand(0, 1)) +                    { +                    case 0: +                        me->SummonCreature(ENTRY_AKKIRIS, 420.851f, -174.337f, 42.6655f, 0.122173f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // random pos                          break; -                    case 6: -                        DoCast(me, SPELL_TARGET_GAMMA); -                        instance->SetData(DATA_WARDEN_4, IN_PROGRESS); +                    case 1: +                        me->SummonCreature(ENTRY_SULFURON, 420.851f, -174.337f, 42.6655f, 0.122173f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // random pos                          break; -                    case 7: -                        instance->SetData(DATA_WARDEN_5, IN_PROGRESS); +                    } +                    break; +                case 6: +                    switch (urand(0, 1)) +                    { +                    case 0: +                        me->SummonCreature(ENTRY_TW_DRAK, 470.364f, -174.656f, 42.6753f, 3.59538f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // random pos +                        break; +                    case 1: +                        me->SummonCreature(ENTRY_BL_DRAK, 470.364f, -174.656f, 42.6753f, 3.59538f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // random pos                          break; +                    } +                    break; +                case 7: +                    me->SummonCreature(ENTRY_SKYRISS, 446.086f, -182.506f, 44.0852f, 1.5708f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // static pos +                    Talk(YELL_WELCOME); +                    break;                  } -                CanSpawn = true; +                CanSpawn = false; +                ++Phase;              } - -            void UpdateAI(uint32 diff) override +            if (CanProgress())              { -                if (!IsRunning) -                    return; - -                if (EventProgress_Timer <= diff) +                switch (Phase)                  { -                    if (instance->GetBossState(DATA_HARBINGER_SKYRISS) == FAIL) -                    { -                        Reset(); -                        return; -                    } - -                    if (CanSpawn) -                    { -                        //continue beam omega pod, unless we are about to summon skyriss -                        if (Phase != 7) -                            DoCast(me, SPELL_TARGET_OMEGA); - -                        switch (Phase) -                        { -                        case 2: -                            switch (urand(0, 1)) -                            { -                            case 0: -                                me->SummonCreature(ENTRY_TRICKSTER, 472.231f, -150.86f, 42.6573f, 3.10669f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // random pos -                                break; -                            case 1: -                                me->SummonCreature(ENTRY_PH_HUNTER, 472.231f, -150.86f, 42.6573f, 3.10669f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // random pos -                                break; -                            } -                            break; -                        case 3: -                            me->SummonCreature(ENTRY_MILLHOUSE, 417.242f, -149.795f, 42.6548f, 0.191986f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // static pos -                            break; -                        case 4: -                            Talk(YELL_RELEASE2B); -                            break; -                        case 5: -                            switch (urand(0, 1)) -                            { -                            case 0: -                                me->SummonCreature(ENTRY_AKKIRIS, 420.851f, -174.337f, 42.6655f, 0.122173f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // random pos -                                break; -                            case 1: -                                me->SummonCreature(ENTRY_SULFURON, 420.851f, -174.337f, 42.6655f, 0.122173f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // random pos -                                break; -                            } -                            break; -                        case 6: -                            switch (urand(0, 1)) -                            { -                            case 0: -                                me->SummonCreature(ENTRY_TW_DRAK, 470.364f, -174.656f, 42.6753f, 3.59538f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // random pos -                                break; -                            case 1: -                                me->SummonCreature(ENTRY_BL_DRAK, 470.364f, -174.656f, 42.6753f, 3.59538f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // random pos -                                break; -                            } -                            break; -                        case 7: -                            me->SummonCreature(ENTRY_SKYRISS, 446.086f, -182.506f, 44.0852f, 1.5708f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10min); // static pos -                            Talk(YELL_WELCOME); -                            break; -                        } -                        CanSpawn = false; -                        ++Phase; -                    } -                    if (CanProgress()) -                    { -                        switch (Phase) -                        { -                        case 1: -                            Talk(YELL_INTRO2); -                            EventProgress_Timer = 10000; -                            ++Phase; -                            break; -                        case 2: -                            Talk(YELL_RELEASE1); -                            DoPrepareForPhase(); -                            EventProgress_Timer = 7000; -                            break; -                        case 3: -                            Talk(YELL_RELEASE2A); -                            DoPrepareForPhase(); -                            EventProgress_Timer = 10000; -                            break; -                        case 4: -                            DoPrepareForPhase(); -                            EventProgress_Timer = 15000; -                            break; -                        case 5: -                            Talk(YELL_RELEASE3); -                            DoPrepareForPhase(); -                            EventProgress_Timer = 15000; -                            break; -                        case 6: -                            Talk(YELL_RELEASE4); -                            DoPrepareForPhase(); -                            EventProgress_Timer = 15000; -                            break; -                        case 7: -                            DoPrepareForPhase(); -                            EventProgress_Timer = 15000; -                            break; -                        } -                    } +                case 1: +                    Talk(YELL_INTRO2); +                    EventProgress_Timer = 10000; +                    ++Phase; +                    break; +                case 2: +                    Talk(YELL_RELEASE1); +                    DoPrepareForPhase(); +                    EventProgress_Timer = 7000; +                    break; +                case 3: +                    Talk(YELL_RELEASE2A); +                    DoPrepareForPhase(); +                    EventProgress_Timer = 10000; +                    break; +                case 4: +                    DoPrepareForPhase(); +                    EventProgress_Timer = 15000; +                    break; +                case 5: +                    Talk(YELL_RELEASE3); +                    DoPrepareForPhase(); +                    EventProgress_Timer = 15000; +                    break; +                case 6: +                    Talk(YELL_RELEASE4); +                    DoPrepareForPhase(); +                    EventProgress_Timer = 15000; +                    break; +                case 7: +                    DoPrepareForPhase(); +                    EventProgress_Timer = 15000; +                    break;                  } -                else -                    EventProgress_Timer -= diff;              } -        }; - -        CreatureAI* GetAI(Creature* creature) const override -        { -            return GetArcatrazAI<npc_warden_mellicharAI>(creature);          } +        else +            EventProgress_Timer -= diff; +    }  };  void AddSC_arcatraz()  { -    new npc_millhouse_manastorm(); -    new npc_warden_mellichar(); +    RegisterArcatrazCreatureAI(npc_millhouse_manastorm); +    RegisterArcatrazCreatureAI(npc_warden_mellichar);  } diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h index 0c5c9d07d2f..9e30c8bb381 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h @@ -76,4 +76,6 @@ inline AI* GetArcatrazAI(T* obj)      return GetInstanceAI<AI>(obj, ArcatrazScriptName);  } +#define RegisterArcatrazCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetArcatrazAI) +  #endif // ARCATRAZ_H diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp index 1dda6152612..d445cd2b7e8 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp @@ -54,151 +54,140 @@ enum Events      EVENT_SOCCOTHRATES_DEATH        = 6  }; -class boss_dalliah_the_doomsayer : public CreatureScript +struct boss_dalliah_the_doomsayer : public BossAI  { -    public: -        boss_dalliah_the_doomsayer() : CreatureScript("boss_dalliah_the_doomsayer") { } - -        struct boss_dalliah_the_doomsayerAI : public BossAI +    boss_dalliah_the_doomsayer(Creature* creature) : BossAI(creature, DATA_DALLIAH) +    { +        soccothratesTaunt = false; +        soccothratesDeath = false; +    } + +    void Reset() override +    { +        _Reset(); +        soccothratesTaunt = false; +        soccothratesDeath = false; +    } + +    void JustDied(Unit* /*killer*/) override +    { +        _JustDied(); +        Talk(SAY_DEATH); + +        if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SOCCOTHRATES))) +            if (soccothrates->IsAlive() && !soccothrates->IsInCombat()) +                soccothrates->AI()->SetData(1, 1); +    } + +    void JustEngagedWith(Unit* who) override +    { +        BossAI::JustEngagedWith(who); +        events.ScheduleEvent(EVENT_GIFT_OF_THE_DOOMSAYER, 1s, 4s); +        events.ScheduleEvent(EVENT_WHIRLWIND, 7s, 9s); +        if (IsHeroic()) +            events.ScheduleEvent(EVENT_SHADOW_WAVE, 11s, 16s); +        events.ScheduleEvent(EVENT_ME_FIRST, 6s); +        Talk(SAY_AGGRO); +    } + +    void KilledUnit(Unit* /*victim*/) override +    { +        Talk(SAY_SLAY); +    } + +    void SetData(uint32 /*type*/, uint32 data) override +    { +        switch (data)          { -            boss_dalliah_the_doomsayerAI(Creature* creature) : BossAI(creature, DATA_DALLIAH) -            { -                soccothratesTaunt = false; -                soccothratesDeath = false; -            } - -            void Reset() override -            { -                _Reset(); -                soccothratesTaunt = false; -                soccothratesDeath = false; -            } - -            void JustDied(Unit* /*killer*/) override -            { -                _JustDied(); -                Talk(SAY_DEATH); - -                if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SOCCOTHRATES))) -                    if (soccothrates->IsAlive() && !soccothrates->IsInCombat()) -                        soccothrates->AI()->SetData(1, 1); -            } - -            void JustEngagedWith(Unit* who) override -            { -                BossAI::JustEngagedWith(who); -                events.ScheduleEvent(EVENT_GIFT_OF_THE_DOOMSAYER, 1s, 4s); -                events.ScheduleEvent(EVENT_WHIRLWIND, 7s, 9s); -                if (IsHeroic()) -                    events.ScheduleEvent(EVENT_SHADOW_WAVE, 11s, 16s); -                events.ScheduleEvent(EVENT_ME_FIRST, 6s); -                Talk(SAY_AGGRO); -            } - -            void KilledUnit(Unit* /*victim*/) override -            { -                Talk(SAY_SLAY); -            } - -            void SetData(uint32 /*type*/, uint32 data) override -            { -                switch (data) -                { -                    case 1: -                        events.ScheduleEvent(EVENT_SOCCOTHRATES_DEATH, 6s); -                        soccothratesDeath = true; -                        break; -                    default: -                        break; -                } -            } +            case 1: +                events.ScheduleEvent(EVENT_SOCCOTHRATES_DEATH, 6s); +                soccothratesDeath = true; +                break; +            default: +                break; +        } +    } -            void UpdateAI(uint32 diff) override +    void UpdateAI(uint32 diff) override +    { +        if (!UpdateVictim()) +        { +            if (soccothratesDeath)              { -                if (!UpdateVictim()) -                { -                    if (soccothratesDeath) -                    { -                        events.Update(diff); - -                        while (uint32 eventId = events.ExecuteEvent()) -                        { -                            switch (eventId) -                            { -                                case EVENT_SOCCOTHRATES_DEATH: -                                    Talk(SAY_SOCCOTHRATES_DEATH); -                                    break; -                                default: -                                    break; -                            } -                        } -                    } - -                    return; -                } -                  events.Update(diff); -                if (me->HasUnitState(UNIT_STATE_CASTING)) -                    return; -                  while (uint32 eventId = events.ExecuteEvent())                  {                      switch (eventId)                      { -                        case EVENT_GIFT_OF_THE_DOOMSAYER: -                            DoCastVictim(SPELL_GIFT_OF_THE_DOOMSAYER, true); -                            events.ScheduleEvent(EVENT_GIFT_OF_THE_DOOMSAYER, 16s, 21s); -                            break; -                        case EVENT_WHIRLWIND: -                            DoCast(me, SPELL_WHIRLWIND); -                            Talk(SAY_WHIRLWIND); -                            events.ScheduleEvent(EVENT_WHIRLWIND, 19s, 21s); -                            events.ScheduleEvent(EVENT_HEAL, 6s); -                            break; -                        case EVENT_HEAL: -                            DoCast(me, SPELL_HEAL); -                            Talk(SAY_HEAL); -                            break; -                        case EVENT_SHADOW_WAVE: -                            DoCastVictim(SPELL_SHADOW_WAVE, true); -                            events.ScheduleEvent(EVENT_SHADOW_WAVE, 11s, 16s); -                            break; -                        case EVENT_ME_FIRST: -                            if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SOCCOTHRATES))) -                                if (soccothrates->IsAlive() && !soccothrates->IsInCombat()) -                                    soccothrates->AI()->Talk(SAY_AGGRO_DALLIAH_FIRST); +                        case EVENT_SOCCOTHRATES_DEATH: +                            Talk(SAY_SOCCOTHRATES_DEATH);                              break;                          default:                              break;                      } - -                    if (me->HasUnitState(UNIT_STATE_CASTING)) -                        return;                  } +            } -                if (HealthBelowPct(25) && !soccothratesTaunt) -                { -                    if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SOCCOTHRATES))) -                        soccothrates->AI()->Talk(SAY_DALLIAH_25_PERCENT); -                    soccothratesTaunt = true; -                } +            return; +        } -                DoMeleeAttackIfReady(); +        events.Update(diff); + +        if (me->HasUnitState(UNIT_STATE_CASTING)) +            return; + +        while (uint32 eventId = events.ExecuteEvent()) +        { +            switch (eventId) +            { +                case EVENT_GIFT_OF_THE_DOOMSAYER: +                    DoCastVictim(SPELL_GIFT_OF_THE_DOOMSAYER, true); +                    events.ScheduleEvent(EVENT_GIFT_OF_THE_DOOMSAYER, 16s, 21s); +                    break; +                case EVENT_WHIRLWIND: +                    DoCast(me, SPELL_WHIRLWIND); +                    Talk(SAY_WHIRLWIND); +                    events.ScheduleEvent(EVENT_WHIRLWIND, 19s, 21s); +                    events.ScheduleEvent(EVENT_HEAL, 6s); +                    break; +                case EVENT_HEAL: +                    DoCast(me, SPELL_HEAL); +                    Talk(SAY_HEAL); +                    break; +                case EVENT_SHADOW_WAVE: +                    DoCastVictim(SPELL_SHADOW_WAVE, true); +                    events.ScheduleEvent(EVENT_SHADOW_WAVE, 11s, 16s); +                    break; +                case EVENT_ME_FIRST: +                    if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SOCCOTHRATES))) +                        if (soccothrates->IsAlive() && !soccothrates->IsInCombat()) +                            soccothrates->AI()->Talk(SAY_AGGRO_DALLIAH_FIRST); +                    break; +                default: +                    break;              } -        private: -            bool soccothratesTaunt; -            bool soccothratesDeath; -        }; +            if (me->HasUnitState(UNIT_STATE_CASTING)) +                return; +        } -        CreatureAI* GetAI(Creature* creature) const override +        if (HealthBelowPct(25) && !soccothratesTaunt)          { -            return GetArcatrazAI<boss_dalliah_the_doomsayerAI>(creature); +            if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SOCCOTHRATES))) +                soccothrates->AI()->Talk(SAY_DALLIAH_25_PERCENT); +            soccothratesTaunt = true;          } + +        DoMeleeAttackIfReady(); +    } + +private: +    bool soccothratesTaunt; +    bool soccothratesDeath;  };  void AddSC_boss_dalliah_the_doomsayer()  { -    new boss_dalliah_the_doomsayer(); +    RegisterArcatrazCreatureAI(boss_dalliah_the_doomsayer);  } diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp index adb7164d72e..da3ede6991c 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp @@ -59,251 +59,229 @@ enum Spells      H_SPELL_MIND_REND_IMAGE = 39021  }; -class boss_harbinger_skyriss : public CreatureScript +struct boss_harbinger_skyriss : public BossAI  { -    public: -        boss_harbinger_skyriss() : CreatureScript("boss_harbinger_skyriss") { } - -        struct boss_harbinger_skyrissAI : public BossAI +    boss_harbinger_skyriss(Creature* creature) : BossAI(creature, DATA_HARBINGER_SKYRISS) +    { +        Initialize(); +        Intro = false; +    } + +    void Initialize() +    { +        IsImage33 = false; +        IsImage66 = false; + +        Intro_Phase = 1; +        Intro_Timer = 5000; +        MindRend_Timer = 3000; +        Fear_Timer = 15000; +        Domination_Timer = 30000; +        ManaBurn_Timer = 25000; +    } + +    bool Intro; +    bool IsImage33; +    bool IsImage66; + +    uint32 Intro_Phase; +    uint32 Intro_Timer; +    uint32 MindRend_Timer; +    uint32 Fear_Timer; +    uint32 Domination_Timer; +    uint32 ManaBurn_Timer; + +    void Reset() override +    { +        _Reset(); + +        me->SetImmuneToAll(!Intro); +        Initialize(); +    } + +    void MoveInLineOfSight(Unit* who) override +    { +        if (!Intro) +            return; + +        ScriptedAI::MoveInLineOfSight(who); +    } + +    void JustEngagedWith(Unit* /*who*/) override { } + +    void JustDied(Unit* /*killer*/) override +    { +        Talk(SAY_DEATH); +        _JustDied(); +    } + +    void JustSummoned(Creature* summon) override +    { +        if (!summon) +            return; +        if (IsImage66) +            summon->SetHealth(summon->CountPctFromMaxHealth(33)); +        else +            summon->SetHealth(summon->CountPctFromMaxHealth(66)); +        if (me->GetVictim()) +            if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) +                summon->AI()->AttackStart(target); + +        summons.Summon(summon); +        summon->SetImmuneToAll(false); +    } + +    void KilledUnit(Unit* victim) override +    { +        //won't yell killing pet/other unit +        if (victim->GetEntry() == NPC_ALPHA_POD_TARGET) +            return; + +        Talk(SAY_KILL); +    } + +    void DoSplit(uint32 val) +    { +        if (me->IsNonMeleeSpellCast(false)) +            me->InterruptNonMeleeSpells(false); + +        Talk(SAY_IMAGE); + +        if (val == 66) +            DoCast(me, SPELL_66_ILLUSION); +        else +            DoCast(me, SPELL_33_ILLUSION); +    } + +    void UpdateAI(uint32 diff) override +    { +        if (!Intro)          { -            boss_harbinger_skyrissAI(Creature* creature) : BossAI(creature, DATA_HARBINGER_SKYRISS) -            { -                Initialize(); -                Intro = false; -            } - -            void Initialize() -            { -                IsImage33 = false; -                IsImage66 = false; - -                Intro_Phase = 1; -                Intro_Timer = 5000; -                MindRend_Timer = 3000; -                Fear_Timer = 15000; -                Domination_Timer = 30000; -                ManaBurn_Timer = 25000; -            } - -            bool Intro; -            bool IsImage33; -            bool IsImage66; - -            uint32 Intro_Phase; -            uint32 Intro_Timer; -            uint32 MindRend_Timer; -            uint32 Fear_Timer; -            uint32 Domination_Timer; -            uint32 ManaBurn_Timer; - -            void Reset() override -            { -                _Reset(); - -                me->SetImmuneToAll(!Intro); -                Initialize(); -            } - -            void MoveInLineOfSight(Unit* who) override -            { -                if (!Intro) -                    return; - -                ScriptedAI::MoveInLineOfSight(who); -            } - -            void JustEngagedWith(Unit* /*who*/) override { } - -            void JustDied(Unit* /*killer*/) override +            if (Intro_Timer <= diff)              { -                Talk(SAY_DEATH); -                _JustDied(); -            } - -            void JustSummoned(Creature* summon) override -            { -                if (!summon) -                    return; -                if (IsImage66) -                    summon->SetHealth(summon->CountPctFromMaxHealth(33)); -                else -                    summon->SetHealth(summon->CountPctFromMaxHealth(66)); -                if (me->GetVictim()) -                    if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) -                        summon->AI()->AttackStart(target); - -                summons.Summon(summon); -                summon->SetImmuneToAll(false); -            } - -            void KilledUnit(Unit* victim) override -            { -                //won't yell killing pet/other unit -                if (victim->GetEntry() == NPC_ALPHA_POD_TARGET) -                    return; - -                Talk(SAY_KILL); -            } - -            void DoSplit(uint32 val) -            { -                if (me->IsNonMeleeSpellCast(false)) -                    me->InterruptNonMeleeSpells(false); - -                Talk(SAY_IMAGE); - -                if (val == 66) -                    DoCast(me, SPELL_66_ILLUSION); -                else -                    DoCast(me, SPELL_33_ILLUSION); -            } - -            void UpdateAI(uint32 diff) override -            { -                if (!Intro) +                switch (Intro_Phase)                  { -                    if (Intro_Timer <= diff) +                case 1: +                    Talk(SAY_INTRO); +                    instance->HandleGameObject(instance->GetGuidData(DATA_WARDENS_SHIELD), true); +                    ++Intro_Phase; +                    Intro_Timer = 25000; +                    break; +                case 2: +                    Talk(SAY_AGGRO); +                    if (Unit* mellic = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_MELLICHAR)))                      { -                        switch (Intro_Phase) -                        { -                        case 1: -                            Talk(SAY_INTRO); -                            instance->HandleGameObject(instance->GetGuidData(DATA_WARDENS_SHIELD), true); -                            ++Intro_Phase; -                            Intro_Timer = 25000; -                            break; -                        case 2: -                            Talk(SAY_AGGRO); -                            if (Unit* mellic = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_MELLICHAR))) -                            { -                                //should have a better way to do this. possibly spell exist. -                                mellic->setDeathState(JUST_DIED); -                                mellic->SetHealth(0); -                                instance->HandleGameObject(instance->GetGuidData(DATA_WARDENS_SHIELD), false); -                            } -                            ++Intro_Phase; -                            Intro_Timer = 3000; -                            break; -                        case 3: -                            me->SetImmuneToAll(false); -                            Intro = true; -                            break; -                        } +                        //should have a better way to do this. possibly spell exist. +                        mellic->setDeathState(JUST_DIED); +                        mellic->SetHealth(0); +                        instance->HandleGameObject(instance->GetGuidData(DATA_WARDENS_SHIELD), false);                      } -                    else -                        Intro_Timer -=diff; +                    ++Intro_Phase; +                    Intro_Timer = 3000; +                    break; +                case 3: +                    me->SetImmuneToAll(false); +                    Intro = true; +                    break;                  } -                if (!UpdateVictim()) -                    return; +            } +            else +                Intro_Timer -=diff; +        } +        if (!UpdateVictim()) +            return; -                if (!IsImage66 && !HealthAbovePct(66)) -                { -                    DoSplit(66); -                    IsImage66 = true; -                } -                if (!IsImage33 && !HealthAbovePct(33)) -                { -                    DoSplit(33); -                    IsImage33 = true; -                } +        if (!IsImage66 && !HealthAbovePct(66)) +        { +            DoSplit(66); +            IsImage66 = true; +        } +        if (!IsImage33 && !HealthAbovePct(33)) +        { +            DoSplit(33); +            IsImage33 = true; +        } -                if (MindRend_Timer <= diff) -                { -                    if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) -                        DoCast(target, SPELL_MIND_REND); -                    else -                        DoCastVictim(SPELL_MIND_REND); +        if (MindRend_Timer <= diff) +        { +            if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) +                DoCast(target, SPELL_MIND_REND); +            else +                DoCastVictim(SPELL_MIND_REND); -                    MindRend_Timer = 8000; -                } -                else -                    MindRend_Timer -=diff; +            MindRend_Timer = 8000; +        } +        else +            MindRend_Timer -=diff; -                if (Fear_Timer <= diff) -                { -                    if (me->IsNonMeleeSpellCast(false)) -                        return; +        if (Fear_Timer <= diff) +        { +            if (me->IsNonMeleeSpellCast(false)) +                return; -                    Talk(SAY_FEAR); +            Talk(SAY_FEAR); -                    if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) -                        DoCast(target, SPELL_FEAR); -                    else -                        DoCastVictim(SPELL_FEAR); +            if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) +                DoCast(target, SPELL_FEAR); +            else +                DoCastVictim(SPELL_FEAR); -                    Fear_Timer = 25000; -                } -                else -                    Fear_Timer -=diff; +            Fear_Timer = 25000; +        } +        else +            Fear_Timer -=diff; -                if (Domination_Timer <= diff) -                { -                    if (me->IsNonMeleeSpellCast(false)) -                        return; +        if (Domination_Timer <= diff) +        { +            if (me->IsNonMeleeSpellCast(false)) +                return; -                    Talk(SAY_MIND); +            Talk(SAY_MIND); -                    if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) -                        DoCast(target, SPELL_DOMINATION); -                    else -                        DoCastVictim(SPELL_DOMINATION); +            if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) +                DoCast(target, SPELL_DOMINATION); +            else +                DoCastVictim(SPELL_DOMINATION); -                    Domination_Timer = 16000 + rand32() % 16000; -                } -                else -                    Domination_Timer -=diff; +            Domination_Timer = 16000 + rand32() % 16000; +        } +        else +            Domination_Timer -=diff; -                if (IsHeroic()) -                { -                    if (ManaBurn_Timer <= diff) -                    { -                        if (me->IsNonMeleeSpellCast(false)) -                            return; +        if (IsHeroic()) +        { +            if (ManaBurn_Timer <= diff) +            { +                if (me->IsNonMeleeSpellCast(false)) +                    return; -                        if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) -                            DoCast(target, H_SPELL_MANA_BURN); +                if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) +                    DoCast(target, H_SPELL_MANA_BURN); -                        ManaBurn_Timer = 16000 + rand32() % 16000; -                    } -                    else -                        ManaBurn_Timer -=diff; -                } -                DoMeleeAttackIfReady(); +                ManaBurn_Timer = 16000 + rand32() % 16000;              } -        }; - -        CreatureAI* GetAI(Creature* creature) const override -        { -            return GetArcatrazAI<boss_harbinger_skyrissAI>(creature); +            else +                ManaBurn_Timer -=diff;          } +        DoMeleeAttackIfReady(); +    }  }; -class boss_harbinger_skyriss_illusion : public CreatureScript +struct boss_harbinger_skyriss_illusion : public ScriptedAI  { -    public: -        boss_harbinger_skyriss_illusion() : CreatureScript("boss_harbinger_skyriss_illusion") { } +    boss_harbinger_skyriss_illusion(Creature* creature) : ScriptedAI(creature) { } -        struct boss_harbinger_skyriss_illusionAI : public ScriptedAI -        { -            boss_harbinger_skyriss_illusionAI(Creature* creature) : ScriptedAI(creature) { } +    void Reset() override +    { +        me->SetImmuneToPC(false); +        me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNINTERACTIBLE | UNIT_FLAG_NON_ATTACKABLE); +    } -            void Reset() override -            { -                me->SetImmuneToPC(false); -                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNINTERACTIBLE | UNIT_FLAG_NON_ATTACKABLE); -            } - -            void JustEngagedWith(Unit* /*who*/) override { } -        }; - -        CreatureAI* GetAI(Creature* creature) const override -        { -            return GetArcatrazAI<boss_harbinger_skyriss_illusionAI>(creature); -        } +    void JustEngagedWith(Unit* /*who*/) override { }  };  void AddSC_boss_harbinger_skyriss()  { -    new boss_harbinger_skyriss(); -    new boss_harbinger_skyriss_illusion(); +    RegisterArcatrazCreatureAI(boss_harbinger_skyriss); +    RegisterArcatrazCreatureAI(boss_harbinger_skyriss_illusion);  } diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp index a735d80f9eb..0af123ae289 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp @@ -77,216 +77,205 @@ enum Events      EVENT_DALLIAH_DEATH             = 13  }; -class boss_wrath_scryer_soccothrates : public CreatureScript +struct boss_wrath_scryer_soccothrates : public BossAI  { -    public: -        boss_wrath_scryer_soccothrates() : CreatureScript("boss_wrath_scryer_soccothrates") { } +    boss_wrath_scryer_soccothrates(Creature* creature) : BossAI(creature, DATA_SOCCOTHRATES) +    { +        preFight = false; +        dalliahTaunt = false; +        dalliahDeath = false; +    } -        struct boss_wrath_scryer_soccothratesAI : public BossAI -        { -            boss_wrath_scryer_soccothratesAI(Creature* creature) : BossAI(creature, DATA_SOCCOTHRATES) -            { -                preFight = false; -                dalliahTaunt = false; -                dalliahDeath = false; -            } +    void Reset() override +    { +        _Reset(); +        preFight = false; +        dalliahTaunt = false; +        dalliahDeath = false; +    } -            void Reset() override -            { -                _Reset(); -                preFight = false; -                dalliahTaunt = false; -                dalliahDeath = false; -            } +    void JustDied(Unit* /*killer*/) override +    { +        _JustDied(); +        Talk(SAY_DEATH); -            void JustDied(Unit* /*killer*/) override -            { -                _JustDied(); -                Talk(SAY_DEATH); +        if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) +            if (dalliah->IsAlive() && !dalliah->IsInCombat()) +                dalliah->AI()->SetData(1, 1); +    } -                if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) -                    if (dalliah->IsAlive() && !dalliah->IsInCombat()) -                        dalliah->AI()->SetData(1, 1); -            } +    void JustEngagedWith(Unit* who) override +    { +        BossAI::JustEngagedWith(who); +        events.ScheduleEvent(EVENT_FELFIRE_SHOCK, 12s, 14s); +        events.ScheduleEvent(EVENT_KNOCK_AWAY, 11s, 12s); +        events.ScheduleEvent(EVENT_ME_FIRST, 6s); +        Talk(SAY_AGGRO); +        preFight = false; +    } -            void JustEngagedWith(Unit* who) override -            { -                BossAI::JustEngagedWith(who); -                events.ScheduleEvent(EVENT_FELFIRE_SHOCK, 12s, 14s); -                events.ScheduleEvent(EVENT_KNOCK_AWAY, 11s, 12s); -                events.ScheduleEvent(EVENT_ME_FIRST, 6s); -                Talk(SAY_AGGRO); -                preFight = false; -            } +    void KilledUnit(Unit* /*victim*/) override +    { +        Talk(SAY_SLAY); +    } -            void KilledUnit(Unit* /*victim*/) override -            { -                Talk(SAY_SLAY); -            } +    void MoveInLineOfSight(Unit* who) override +    { +        if (instance->GetData(DATA_CONVERSATION) == NOT_STARTED && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 70.0f)) +        { +            Talk(SAY_SOCCOTHRATES_CONVO_1); +            instance->SetData(DATA_CONVERSATION, DONE); -            void MoveInLineOfSight(Unit* who) override -            { -                if (instance->GetData(DATA_CONVERSATION) == NOT_STARTED && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 70.0f)) -                { -                    Talk(SAY_SOCCOTHRATES_CONVO_1); -                    instance->SetData(DATA_CONVERSATION, DONE); +            preFight = true; +            events.ScheduleEvent(EVENT_PREFIGHT_1, 2s); +        } +    } -                    preFight = true; -                    events.ScheduleEvent(EVENT_PREFIGHT_1, 2s); -                } -            } +    void SetData(uint32 /*type*/, uint32 data) override +    { +        switch (data) +        { +            case 1: +                events.ScheduleEvent(EVENT_DALLIAH_DEATH, 6s); +                dalliahDeath = true; +                break; +            default: +                break; +        } +    } -            void SetData(uint32 /*type*/, uint32 data) override +    void UpdateAI(uint32 diff) override +    { +        if (!UpdateVictim()) +        { +            if (preFight)              { -                switch (data) -                { -                    case 1: -                        events.ScheduleEvent(EVENT_DALLIAH_DEATH, 6s); -                        dalliahDeath = true; -                        break; -                    default: -                        break; -                } -            } +                events.Update(diff); -            void UpdateAI(uint32 diff) override -            { -                if (!UpdateVictim()) +                while (uint32 eventId = events.ExecuteEvent())                  { -                    if (preFight) -                    { -                        events.Update(diff); - -                        while (uint32 eventId = events.ExecuteEvent()) -                        { -                            switch (eventId) -                            { -                                case EVENT_PREFIGHT_1: -                                    if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) -                                        dalliah->AI()->Talk(SAY_DALLIAH_CONVO_1); -                                    events.ScheduleEvent(EVENT_PREFIGHT_2, 3s); -                                    break; -                                case EVENT_PREFIGHT_2: -                                    Talk(SAY_SOCCOTHRATES_CONVO_2); -                                    events.ScheduleEvent(EVENT_PREFIGHT_3, 3s); -                                    break; -                                case EVENT_PREFIGHT_3: -                                    if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) -                                        dalliah->AI()->Talk(SAY_DALLIAH_CONVO_2); -                                    events.ScheduleEvent(EVENT_PREFIGHT_4, 6s); -                                    break; -                                case EVENT_PREFIGHT_4: -                                    Talk(SAY_SOCCOTHRATES_CONVO_3); -                                    events.ScheduleEvent(EVENT_PREFIGHT_5, 2s); -                                    break; -                                case EVENT_PREFIGHT_5: -                                    if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) -                                        dalliah->AI()->Talk(SAY_DALLIAH_CONVO_3); -                                    events.ScheduleEvent(EVENT_PREFIGHT_6, 3s); -                                    break; -                                case EVENT_PREFIGHT_6: -                                    Talk(SAY_SOCCOTHRATES_CONVO_4); -                                    events.ScheduleEvent(EVENT_PREFIGHT_7, 2s); -                                    break; -                                case EVENT_PREFIGHT_7: -                                    if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) -                                        dalliah->GetMotionMaster()->MovePoint(0, 118.6048f, 96.84852f, 22.44115f); -                                    events.ScheduleEvent(EVENT_PREFIGHT_8, 4s); -                                    break; -                                case EVENT_PREFIGHT_8: -                                    me->GetMotionMaster()->MovePoint(0, 122.1035f, 192.7203f, 22.44115f); -                                    events.ScheduleEvent(EVENT_PREFIGHT_9, 4s); -                                    break; -                                case EVENT_PREFIGHT_9: -                                    if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) -                                    { -                                        dalliah->SetFacingToObject(me); -                                        me->SetFacingToObject(dalliah); -                                        dalliah->SetHomePosition(dalliah->GetPositionX(), dalliah->GetPositionY(), dalliah->GetPositionZ(), 1.51737f); -                                        me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 4.725722f); -                                        preFight = false; -                                    } -                                    break; -                                default: -                                    break; -                            } -                        } -                    } - -                    if (dalliahDeath) +                    switch (eventId)                      { -                        events.Update(diff); - -                        while (uint32 eventId = events.ExecuteEvent()) -                        { -                            switch (eventId) +                        case EVENT_PREFIGHT_1: +                            if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) +                                dalliah->AI()->Talk(SAY_DALLIAH_CONVO_1); +                            events.ScheduleEvent(EVENT_PREFIGHT_2, 3s); +                            break; +                        case EVENT_PREFIGHT_2: +                            Talk(SAY_SOCCOTHRATES_CONVO_2); +                            events.ScheduleEvent(EVENT_PREFIGHT_3, 3s); +                            break; +                        case EVENT_PREFIGHT_3: +                            if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) +                                dalliah->AI()->Talk(SAY_DALLIAH_CONVO_2); +                            events.ScheduleEvent(EVENT_PREFIGHT_4, 6s); +                            break; +                        case EVENT_PREFIGHT_4: +                            Talk(SAY_SOCCOTHRATES_CONVO_3); +                            events.ScheduleEvent(EVENT_PREFIGHT_5, 2s); +                            break; +                        case EVENT_PREFIGHT_5: +                            if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) +                                dalliah->AI()->Talk(SAY_DALLIAH_CONVO_3); +                            events.ScheduleEvent(EVENT_PREFIGHT_6, 3s); +                            break; +                        case EVENT_PREFIGHT_6: +                            Talk(SAY_SOCCOTHRATES_CONVO_4); +                            events.ScheduleEvent(EVENT_PREFIGHT_7, 2s); +                            break; +                        case EVENT_PREFIGHT_7: +                            if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) +                                dalliah->GetMotionMaster()->MovePoint(0, 118.6048f, 96.84852f, 22.44115f); +                            events.ScheduleEvent(EVENT_PREFIGHT_8, 4s); +                            break; +                        case EVENT_PREFIGHT_8: +                            me->GetMotionMaster()->MovePoint(0, 122.1035f, 192.7203f, 22.44115f); +                            events.ScheduleEvent(EVENT_PREFIGHT_9, 4s); +                            break; +                        case EVENT_PREFIGHT_9: +                            if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH)))                              { -                                case EVENT_DALLIAH_DEATH: -                                    Talk(SAY_DALLIAH_DEATH); -                                    break; -                                default: -                                    break; +                                dalliah->SetFacingToObject(me); +                                me->SetFacingToObject(dalliah); +                                dalliah->SetHomePosition(dalliah->GetPositionX(), dalliah->GetPositionY(), dalliah->GetPositionZ(), 1.51737f); +                                me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 4.725722f); +                                preFight = false;                              } -                        } +                            break; +                        default: +                            break;                      } - -                    return;                  } +            } +            if (dalliahDeath) +            {                  events.Update(diff); -                if (me->HasUnitState(UNIT_STATE_CASTING)) -                    return; -                  while (uint32 eventId = events.ExecuteEvent())                  {                      switch (eventId)                      { -                        case EVENT_FELFIRE_SHOCK: -                            DoCastVictim(SPELL_FELFIRE_SHOCK, true); -                            events.ScheduleEvent(EVENT_FELFIRE_SHOCK, 12s, 14s); -                            break; -                        case EVENT_KNOCK_AWAY: -                            DoCast(me, SPELL_KNOCK_AWAY); -                            Talk(SAY_KNOCK_AWAY); -                            events.ScheduleEvent(EVENT_KNOCK_AWAY, 11s, 12s); -                            break; -                        case EVENT_ME_FIRST: -                            if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) -                                if (dalliah->IsAlive() && !dalliah->IsInCombat()) -                                    dalliah->AI()->Talk(SAY_AGGRO_SOCCOTHRATES_FIRST); +                        case EVENT_DALLIAH_DEATH: +                            Talk(SAY_DALLIAH_DEATH);                              break;                          default:                              break;                      } - -                    if (me->HasUnitState(UNIT_STATE_CASTING)) -                        return;                  } +            } -                if (HealthBelowPct(25) && !dalliahTaunt) -                { -                    if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) -                        dalliah->AI()->Talk(SAY_SOCCOTHRATES_25_PERCENT); -                    dalliahTaunt = true; -                } +            return; +        } -                DoMeleeAttackIfReady(); +        events.Update(diff); + +        if (me->HasUnitState(UNIT_STATE_CASTING)) +            return; + +        while (uint32 eventId = events.ExecuteEvent()) +        { +            switch (eventId) +            { +                case EVENT_FELFIRE_SHOCK: +                    DoCastVictim(SPELL_FELFIRE_SHOCK, true); +                    events.ScheduleEvent(EVENT_FELFIRE_SHOCK, 12s, 14s); +                    break; +                case EVENT_KNOCK_AWAY: +                    DoCast(me, SPELL_KNOCK_AWAY); +                    Talk(SAY_KNOCK_AWAY); +                    events.ScheduleEvent(EVENT_KNOCK_AWAY, 11s, 12s); +                    break; +                case EVENT_ME_FIRST: +                    if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) +                        if (dalliah->IsAlive() && !dalliah->IsInCombat()) +                            dalliah->AI()->Talk(SAY_AGGRO_SOCCOTHRATES_FIRST); +                    break; +                default: +                    break;              } -        private: -            bool preFight; -            bool dalliahTaunt; -            bool dalliahDeath; -        }; +            if (me->HasUnitState(UNIT_STATE_CASTING)) +                return; +        } -        CreatureAI* GetAI(Creature* creature) const override +        if (HealthBelowPct(25) && !dalliahTaunt)          { -            return GetArcatrazAI<boss_wrath_scryer_soccothratesAI>(creature); +            if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) +                dalliah->AI()->Talk(SAY_SOCCOTHRATES_25_PERCENT); +            dalliahTaunt = true;          } + +        DoMeleeAttackIfReady(); +    } + +private: +    bool preFight; +    bool dalliahTaunt; +    bool dalliahDeath;  };  void AddSC_boss_wrath_scryer_soccothrates()  { -    new boss_wrath_scryer_soccothrates(); +    RegisterArcatrazCreatureAI(boss_wrath_scryer_soccothrates);  } diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp index 6f6110445e4..5693d7a32c5 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp @@ -41,88 +41,77 @@ enum Events      EVENT_SEED_OF_CORRUPTION        = 3  }; -class boss_zereketh_the_unbound : public CreatureScript +struct boss_zereketh_the_unbound : public BossAI  { -    public: -        boss_zereketh_the_unbound() : CreatureScript("boss_zereketh_the_unbound") { } - -        struct boss_zereketh_the_unboundAI : public BossAI +    boss_zereketh_the_unbound(Creature* creature) : BossAI(creature, DATA_ZEREKETH) { } + +    void Reset() override +    { +        _Reset(); +    } + +    void JustDied(Unit* /*killer*/) override +    { +        _JustDied(); +        Talk(SAY_DEATH); +    } + +    void JustEngagedWith(Unit* who) override +    { +        BossAI::JustEngagedWith(who); +        events.ScheduleEvent(EVENT_VOID_ZONE, 6s, 10s); +        events.ScheduleEvent(EVENT_SHADOW_NOVA, 6s, 10s); +        events.ScheduleEvent(EVENT_SEED_OF_CORRUPTION, 12s, 20s); +        Talk(SAY_AGGRO); +    } + +    void KilledUnit(Unit* /*victim*/) override +    { +        Talk(SAY_SLAY); +    } + +    void UpdateAI(uint32 diff) override +    { +        if (!UpdateVictim()) +            return; + +        events.Update(diff); + +        if (me->HasUnitState(UNIT_STATE_CASTING)) +            return; + +        while (uint32 eventId = events.ExecuteEvent())          { -            boss_zereketh_the_unboundAI(Creature* creature) : BossAI(creature, DATA_ZEREKETH) { } - -            void Reset() override -            { -                _Reset(); -            } - -            void JustDied(Unit* /*killer*/) override -            { -                _JustDied(); -                Talk(SAY_DEATH); -            } - -            void JustEngagedWith(Unit* who) override +            switch (eventId)              { -                BossAI::JustEngagedWith(who); -                events.ScheduleEvent(EVENT_VOID_ZONE, 6s, 10s); -                events.ScheduleEvent(EVENT_SHADOW_NOVA, 6s, 10s); -                events.ScheduleEvent(EVENT_SEED_OF_CORRUPTION, 12s, 20s); -                Talk(SAY_AGGRO); +                case EVENT_VOID_ZONE: +                    if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100, true)) +                        DoCast(target, SPELL_VOID_ZONE); +                    events.ScheduleEvent(EVENT_VOID_ZONE, 6s, 10s); +                    break; +                case EVENT_SHADOW_NOVA: +                    DoCastVictim(SPELL_SHADOW_NOVA, true); +                    Talk(SAY_SHADOW_NOVA); +                    events.ScheduleEvent(EVENT_SHADOW_NOVA, 6s, 10s); +                    break; +                case EVENT_SEED_OF_CORRUPTION: +                    if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100, true)) +                        DoCast(target, SPELL_SEED_OF_CORRUPTION); +                    events.ScheduleEvent(EVENT_SEED_OF_CORRUPTION, 12s, 20s); +                    break; +                default: +                    break;              } -            void KilledUnit(Unit* /*victim*/) override -            { -                Talk(SAY_SLAY); -            } - -            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_VOID_ZONE: -                            if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100, true)) -                                DoCast(target, SPELL_VOID_ZONE); -                            events.ScheduleEvent(EVENT_VOID_ZONE, 6s, 10s); -                            break; -                        case EVENT_SHADOW_NOVA: -                            DoCastVictim(SPELL_SHADOW_NOVA, true); -                            Talk(SAY_SHADOW_NOVA); -                            events.ScheduleEvent(EVENT_SHADOW_NOVA, 6s, 10s); -                            break; -                        case EVENT_SEED_OF_CORRUPTION: -                            if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100, true)) -                                DoCast(target, SPELL_SEED_OF_CORRUPTION); -                            events.ScheduleEvent(EVENT_SEED_OF_CORRUPTION, 12s, 20s); -                            break; -                        default: -                            break; -                    } - -                    if (me->HasUnitState(UNIT_STATE_CASTING)) -                        return; -                } - -                DoMeleeAttackIfReady(); -            } -        }; - -        CreatureAI* GetAI(Creature* creature) const override -        { -            return GetArcatrazAI<boss_zereketh_the_unboundAI>(creature); +            if (me->HasUnitState(UNIT_STATE_CASTING)) +                return;          } + +        DoMeleeAttackIfReady(); +    }  };  void AddSC_boss_zereketh_the_unbound()  { -    new boss_zereketh_the_unbound(); +    RegisterArcatrazCreatureAI(boss_zereketh_the_unbound);  }  | 
