diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp | 300 | 
1 files changed, 145 insertions, 155 deletions
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp index 3cd2587affe..e4f86852bbf 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp @@ -43,7 +43,9 @@ enum Spells      SPELL_ELECTRICAL_STORM      = 43648,      SPELL_BERSERK               = 45078,      SPELL_ELECTRICAL_OVERLOAD   = 43658, -    SPELL_EAGLE_SWOOP           = 44732 +    SPELL_EAGLE_SWOOP           = 44732, +    SPELL_ZAP                   = 43137, +    SPELL_SAND_STORM            = 25160  };  enum Says @@ -65,54 +67,35 @@ enum Misc      SE_LOC_Y_MIN                = 1370  }; +enum Events +{ +    EVENT_STATIC_DISRUPTION     = 1, +    EVENT_GUST_OF_WIND          = 2, +    EVENT_CALL_LIGHTNING        = 3, +    EVENT_ELECTRICAL_STORM      = 4, +    EVENT_RAIN                  = 5, +    EVENT_SUMMON_EAGLES         = 6, +    EVENT_STORM_SEQUENCE        = 7, +    EVENT_ENRAGE                = 8 +}; +  class boss_akilzon : public CreatureScript  {      public: +        boss_akilzon() : CreatureScript("boss_akilzon") { } -        boss_akilzon() -            : CreatureScript("boss_akilzon") -        { -        } - -        struct boss_akilzonAI : public ScriptedAI +        struct boss_akilzonAI : public BossAI          { -            boss_akilzonAI(Creature* creature) : ScriptedAI(creature) +            boss_akilzonAI(Creature* creature) : BossAI(creature, DATA_AKILZONEVENT)              { -                instance = creature->GetInstanceScript();                  memset(BirdGUIDs, 0, sizeof(BirdGUIDs));              } -            InstanceScript* instance; - -            uint64 BirdGUIDs[8]; -            uint64 TargetGUID; -            uint64 CycloneGUID; -            uint64 CloudGUID; - -            uint32 StaticDisruption_Timer; -            uint32 GustOfWind_Timer; -            uint32 CallLighting_Timer; -            uint32 ElectricalStorm_Timer; -            uint32 SummonEagles_Timer; -            uint32 Enrage_Timer; - -            uint32 StormCount; -            uint32 StormSequenceTimer; - -            bool isRaining; -              void Reset()              {                  if (instance)                      instance->SetData(DATA_AKILZONEVENT, NOT_STARTED); -                StaticDisruption_Timer = urand(10000, 20000); //10 to 20 seconds (bosskillers) -                GustOfWind_Timer = urand(20000, 30000); //20 to 30 seconds(bosskillers) -                CallLighting_Timer = urand(10000, 20000); //totaly random timer. can't find any info on this -                ElectricalStorm_Timer = 60000; //60 seconds(bosskillers) -                Enrage_Timer = 10*MINUTE*IN_MILLISECONDS; //10 minutes till enrage(bosskillers) -                SummonEagles_Timer = 99999; -                  TargetGUID = 0;                  CloudGUID = 0;                  CycloneGUID = 0; @@ -129,6 +112,13 @@ class boss_akilzon : public CreatureScript              void EnterCombat(Unit* /*who*/)              { +                events.ScheduleEvent(EVENT_STATIC_DISRUPTION, urand(10000, 20000)); // 10 to 20 seconds (bosskillers) +                events.ScheduleEvent(EVENT_GUST_OF_WIND, urand(20000, 30000));      // 20 to 30 seconds(bosskillers) +                events.ScheduleEvent(EVENT_CALL_LIGHTNING, urand(10000, 20000));    // totaly random timer. can't find any info on this +                events.ScheduleEvent(EVENT_ELECTRICAL_STORM, 60000);                // 60 seconds(bosskillers) +                events.ScheduleEvent(EVENT_RAIN, urand(47000, 52000)); +                events.ScheduleEvent(EVENT_ENRAGE, 10*MINUTE*IN_MILLISECONDS);      // 10 minutes till enrage(bosskillers) +                  Talk(SAY_AGGRO);                  //DoZoneInCombat();                  if (instance) @@ -204,7 +194,7 @@ class boss_akilzon : public CreatureScript                          if (Unit* target = (*i))                          {                              if (!Cloud->IsWithinDist(target, 6, false)) -                                Cloud->CastCustomSpell(target, 43137, &bp0, NULL, NULL, true, 0, 0, me->GetGUID()); +                                Cloud->CastCustomSpell(target, SPELL_ZAP, &bp0, NULL, NULL, true, 0, 0, me->GetGUID());                          }                      }                      // visual @@ -221,7 +211,7 @@ class boss_akilzon : public CreatureScript                              trigger->SetHealth(100000);                              trigger->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);                              if (Cloud) -                                Cloud->CastCustomSpell(trigger, /*43661*/43137, &bp0, NULL, NULL, true, 0, 0, Cloud->GetGUID()); +                                Cloud->CastCustomSpell(trigger, /*43661*/SPELL_ZAP, &bp0, NULL, NULL, true, 0, 0, Cloud->GetGUID());                          }                      }                  } @@ -229,7 +219,7 @@ class boss_akilzon : public CreatureScript                  if (StormCount > 10)                  {                      StormCount = 0; // finish -                    SummonEagles_Timer = 5000; +                    events.ScheduleEvent(EVENT_SUMMON_EAGLES, 5000);                      me->InterruptNonMeleeSpells(false);                      CloudGUID = 0;                      if (Cloud) @@ -237,7 +227,7 @@ class boss_akilzon : public CreatureScript                      SetWeather(WEATHER_STATE_FINE, 0.0f);                      isRaining = false;                  } -                StormSequenceTimer = 1000; +                events.ScheduleEvent(EVENT_STORM_SEQUENCE, 1000);              }              void UpdateAI(uint32 diff) @@ -245,133 +235,133 @@ class boss_akilzon : public CreatureScript                  if (!UpdateVictim())                      return; -                if (StormCount) -                { -                    Unit* target = Unit::GetUnit(*me, CloudGUID); -                    if (!target || !target->IsAlive()) -                    { -                        EnterEvadeMode(); -                        return; -                    } -                    else if (Unit* Cyclone = Unit::GetUnit(*me, CycloneGUID)) -                        Cyclone->CastSpell(target, 25160, true); // keep casting or... - -                    if (StormSequenceTimer <= diff) -                        HandleStormSequence(target); -                    else -                        StormSequenceTimer -= diff; - -                    return; -                } - -                if (Enrage_Timer <= diff) -                { -                    Talk(SAY_ENRAGE); -                    DoCast(me, SPELL_BERSERK, true); -                    Enrage_Timer = 600000; -                } else Enrage_Timer -= diff; - -                if (StaticDisruption_Timer <= diff) -                { -                    Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1); -                    if (!target) target = me->GetVictim(); -                    TargetGUID = target->GetGUID(); -                    DoCast(target, SPELL_STATIC_DISRUPTION, false); -                    me->SetInFront(me->GetVictim()); -                    StaticDisruption_Timer = (10+rand()%8)*1000; // < 20s - -                    /*if (float dist = me->IsWithinDist3d(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 5.0f) dist = 5.0f; -                    SDisruptAOEVisual_Timer = 1000 + floor(dist / 30 * 1000.0f);*/ -                } else StaticDisruption_Timer -= diff; - -                if (GustOfWind_Timer <= diff) -                { -                    Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1); -                    if (!target) target = me->GetVictim(); -                    DoCast(target, SPELL_GUST_OF_WIND); -                    GustOfWind_Timer = urand(20, 30) * 1000; //20 to 30 seconds(bosskillers) -                } else GustOfWind_Timer -= diff; - -                if (CallLighting_Timer <= diff) -                { -                    DoCast(me->GetVictim(), SPELL_CALL_LIGHTNING); -                    CallLighting_Timer = urand(12, 17) * 1000; //totaly random timer. can't find any info on this -                } else CallLighting_Timer -= diff; - -                if (!isRaining && ElectricalStorm_Timer < uint32(8000 + rand() % 5000)) -                { -                    SetWeather(WEATHER_STATE_HEAVY_RAIN, 0.9999f); -                    isRaining = true; -                } - -                if (ElectricalStorm_Timer <= diff) -                { -                    Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true); -                    if (!target) -                    { -                        EnterEvadeMode(); -                        return; -                    } -                    target->CastSpell(target, 44007, true);//cloud visual -                    DoCast(target, SPELL_ELECTRICAL_STORM, false);//storm cyclon + visual -                    float x, y, z; -                    target->GetPosition(x, y, z); -                    if (target) -                    { -                        target->SetDisableGravity(true); -                        target->MonsterMoveWithSpeed(x, y, me->GetPositionZ()+15, 0); -                    } -                    Unit* Cloud = me->SummonTrigger(x, y, me->GetPositionZ()+16, 0, 15000); -                    if (Cloud) -                    { -                        CloudGUID = Cloud->GetGUID(); -                        Cloud->SetDisableGravity(true); -                        Cloud->StopMoving(); -                        Cloud->SetObjectScale(1.0f); -                        Cloud->setFaction(35); -                        Cloud->SetMaxHealth(9999999); -                        Cloud->SetHealth(9999999); -                        Cloud->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); -                    } -                    ElectricalStorm_Timer = 60000; //60 seconds(bosskillers) -                    StormCount = 1; -                    StormSequenceTimer = 0; -                } else ElectricalStorm_Timer -= diff; +                events.Update(diff); -                if (SummonEagles_Timer <= diff) +                while (uint32 eventId = events.ExecuteEvent())                  { -                    Talk(SAY_SUMMON); - -                    float x, y, z; -                    me->GetPosition(x, y, z); - -                    for (uint8 i = 0; i < 8; ++i) +                    switch (eventId)                      { -                        Unit* bird = Unit::GetUnit(*me, BirdGUIDs[i]); -                        if (!bird) //they despawned on die -                        { -                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) +                        case EVENT_STATIC_DISRUPTION: +                            Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1); +                            if (!target) target = me->GetVictim(); +                            TargetGUID = target->GetGUID(); +                            DoCast(target, SPELL_STATIC_DISRUPTION, false); +                            me->SetInFront(me->GetVictim()); +                            /*if (float dist = me->IsWithinDist3d(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 5.0f) dist = 5.0f; +                            SDisruptAOEVisual_Timer = 1000 + floor(dist / 30 * 1000.0f);*/ +                            events.ScheduleEvent(EVENT_STATIC_DISRUPTION, urand(10000, 18000)); +                            break; +                        case EVENT_GUST_OF_WIND: +                            Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1); +                            if (!target) target = me->GetVictim(); +                            DoCast(target, SPELL_GUST_OF_WIND); +                            events.ScheduleEvent(EVENT_GUST_OF_WIND, urand(20000, 30000)); +                            break; +                        case EVENT_CALL_LIGHTNING: +                            DoCast(me->GetVictim(), SPELL_CALL_LIGHTNING); +                            events.ScheduleEvent(EVENT_CALL_LIGHTNING, urand(12000, 17000)); // totaly random timer. can't find any info on this +                            break; +                        case EVENT_ELECTRICAL_STORM: +                            Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true); +                            if (!target)                              { -                                x = target->GetPositionX() + irand(-10, 10); -                                y = target->GetPositionY() + irand(-10, 10); -                                z = target->GetPositionZ() + urand(16, 20); -                                if (z > 95) -                                    z = 95.0f - urand(0, 5); +                                EnterEvadeMode(); +                                return;                              } -                            Creature* creature = me->SummonCreature(MOB_SOARING_EAGLE, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); -                            if (creature) +                            target->CastSpell(target, 44007, true); // cloud visual +                            DoCast(target, SPELL_ELECTRICAL_STORM, false); // storm cyclon + visual +                            float x, y, z; +                            target->GetPosition(x, y, z); +                            if (target)                              { -                                creature->AddThreat(me->GetVictim(), 1.0f); -                                creature->AI()->AttackStart(me->GetVictim()); -                                BirdGUIDs[i] = creature->GetGUID(); +                                target->SetDisableGravity(true); +                                target->MonsterMoveWithSpeed(x, y, me->GetPositionZ()+15, 0);                              } -                        } +                            Unit* Cloud = me->SummonTrigger(x, y, me->GetPositionZ()+16, 0, 15000); +                            if (Cloud) +                            { +                                CloudGUID = Cloud->GetGUID(); +                                Cloud->SetDisableGravity(true); +                                Cloud->StopMoving(); +                                Cloud->SetObjectScale(1.0f); +                                Cloud->setFaction(35); +                                Cloud->SetMaxHealth(9999999); +                                Cloud->SetHealth(9999999); +                                Cloud->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); +                            } +                            StormCount = 1; +                            events.ScheduleEvent(EVENT_ELECTRICAL_STORM, 60000); // 60 seconds(bosskillers) +                            events.ScheduleEvent(EVENT_RAIN, urand(47000, 52000)); +                            break; +                        case EVENT_RAIN: +                            if (!isRaining) +                            { +                                SetWeather(WEATHER_STATE_HEAVY_RAIN, 0.9999f); +                                isRaining = true; +                            } +                            else +                                events.ScheduleEvent(EVENT_RAIN, 1000); +                            break; +                        case EVENT_STORM_SEQUENCE: +                            Unit* target = Unit::GetUnit(*me, CloudGUID); +                            if (!target || !target->IsAlive()) +                            { +                                EnterEvadeMode(); +                                return; +                            } +                            else if (Unit* Cyclone = Unit::GetUnit(*me, CycloneGUID)) +                                Cyclone->CastSpell(target, SPELL_SAND_STORM, true); // keep casting or... +                            HandleStormSequence(target); +                            break; +                        case EVENT_SUMMON_EAGLES: +                            Talk(SAY_SUMMON); + +                            float x, y, z; +                            me->GetPosition(x, y, z); + +                            for (uint8 i = 0; i < 8; ++i) +                            { +                                Unit* bird = Unit::GetUnit(*me, BirdGUIDs[i]); +                                if (!bird) //they despawned on die +                                { +                                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) +                                    { +                                        x = target->GetPositionX() + irand(-10, 10); +                                        y = target->GetPositionY() + irand(-10, 10); +                                        z = target->GetPositionZ() + urand(16, 20); +                                        if (z > 95) +                                            z = 95.0f - urand(0, 5); +                                    } +                                    Creature* creature = me->SummonCreature(MOB_SOARING_EAGLE, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); +                                    if (creature) +                                    { +                                        creature->AddThreat(me->GetVictim(), 1.0f); +                                        creature->AI()->AttackStart(me->GetVictim()); +                                        BirdGUIDs[i] = creature->GetGUID(); +                                    } +                                } +                            } +                            break; +                        case EVENT_ENRAGE: +                             Talk(SAY_ENRAGE); +                             DoCast(me, SPELL_BERSERK, true); +                            events.ScheduleEvent(EVENT_ENRAGE, 600000); +                            break; +                        default: +                            break;                      } -                    SummonEagles_Timer = 999999; -                } else SummonEagles_Timer -= diff; +                }                  DoMeleeAttackIfReady();              } + +            private: +                uint64 BirdGUIDs[8]; +                uint64 TargetGUID; +                uint64 CycloneGUID; +                uint64 CloudGUID; +                uint8  StormCount; +                bool   isRaining;          };          CreatureAI* GetAI(Creature* creature) const  | 
