aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp300
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