aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/scripts/eastern_kingdoms/sunwell_plateau/boss_felmyst.cpp501
1 files changed, 235 insertions, 266 deletions
diff --git a/src/scripts/eastern_kingdoms/sunwell_plateau/boss_felmyst.cpp b/src/scripts/eastern_kingdoms/sunwell_plateau/boss_felmyst.cpp
index 99c50ba8928..d45e29f916d 100644
--- a/src/scripts/eastern_kingdoms/sunwell_plateau/boss_felmyst.cpp
+++ b/src/scripts/eastern_kingdoms/sunwell_plateau/boss_felmyst.cpp
@@ -23,104 +23,92 @@ EndScriptData */
#include "ScriptedPch.h"
#include "sunwell_plateau.h"
-enum Quotes
+enum Yells
{
- YELL_BIRTH = -1580036,
- YELL_KILL1 = -1580037,
- YELL_KILL2 = -1580038,
- YELL_BREATH = -1580039,
- YELL_TAKEOFF = -1580040,
- YELL_BERSERK = -1580041,
- YELL_DEATH = -1580042,
- YELL_KALECGOS = -1580043 //after felmyst's death spawned and say this
+ YELL_BIRTH = -1580036,
+ YELL_KILL1 = -1580037,
+ YELL_KILL2 = -1580038,
+ YELL_BREATH = -1580039,
+ YELL_TAKEOFF = -1580040,
+ YELL_BERSERK = -1580041,
+ YELL_DEATH = -1580042,
+ YELL_KALECGOS = -1580043, // after felmyst's death spawned and say this
};
enum Spells
{
//Aura
- AURA_SUNWELL_RADIANCE = 45769,
- AURA_NOXIOUS_FUMES = 47002,
+ AURA_SUNWELL_RADIANCE = 45769,
+ AURA_NOXIOUS_FUMES = 47002,
//Land phase
- SPELL_CLEAVE = 19983,
- SPELL_CORROSION = 45866,
- SPELL_GAS_NOVA = 45855,
- SPELL_ENCAPSULATE_CHANNEL = 45661,
- // SPELL_ENCAPSULATE_EFFECT = 45665,
- // SPELL_ENCAPSULATE_AOE = 45662,
+ SPELL_CLEAVE = 19983,
+ SPELL_CORROSION = 45866,
+ SPELL_GAS_NOVA = 45855,
+ SPELL_ENCAPSULATE_CHANNEL = 45661,
+ // SPELL_ENCAPSULATE_EFFECT = 45665,
+ // SPELL_ENCAPSULATE_AOE = 45662,
//Flight phase
- SPELL_VAPOR_SELECT = 45391, // fel to player, force cast 45392, 50000y selete target
- SPELL_VAPOR_SUMMON = 45392, // player summon vapor, radius around caster, 5y,
- SPELL_VAPOR_FORCE = 45388, // vapor to fel, force cast 45389
- SPELL_VAPOR_CHANNEL = 45389, // fel to vapor, green beam channel
- SPELL_VAPOR_TRIGGER = 45411, // linked to 45389, vapor to self, trigger 45410 and 46931
- SPELL_VAPOR_DAMAGE = 46931, // vapor damage, 4000
- SPELL_TRAIL_SUMMON = 45410, // vapor summon trail
- SPELL_TRAIL_TRIGGER = 45399, // trail to self, trigger 45402
- SPELL_TRAIL_DAMAGE = 45402, // trail damage, 2000 + 2000 dot
- SPELL_DEAD_SUMMON = 45400, // summon blazing dead, 5min
- SPELL_DEAD_PASSIVE = 45415,
- SPELL_FOG_BREATH = 45495, // fel to self, speed burst
- SPELL_FOG_TRIGGER = 45582, // fog to self, trigger 45782
- SPELL_FOG_FORCE = 45782, // fog to player, force cast 45714
- SPELL_FOG_INFORM = 45714, // player let fel cast 45717, script effect
- SPELL_FOG_CHARM = 45717, // fel to player
- SPELL_FOG_CHARM2 = 45726, // link to 45717
-
- SPELL_TRANSFORM_TRIGGER = 44885, // madrigosa to self, trigger 46350
- SPELL_TRANSFORM_VISUAL = 46350, //46411stun?
- SPELL_TRANSFORM_FELMYST = 45068, // become fel
- SPELL_FELMYST_SUMMON = 45069,
+ SPELL_VAPOR_SELECT = 45391, // fel to player, force cast 45392, 50000y selete target
+ SPELL_VAPOR_SUMMON = 45392, // player summon vapor, radius around caster, 5y,
+ SPELL_VAPOR_FORCE = 45388, // vapor to fel, force cast 45389
+ SPELL_VAPOR_CHANNEL = 45389, // fel to vapor, green beam channel
+ SPELL_VAPOR_TRIGGER = 45411, // linked to 45389, vapor to self, trigger 45410 and 46931
+ SPELL_VAPOR_DAMAGE = 46931, // vapor damage, 4000
+ SPELL_TRAIL_SUMMON = 45410, // vapor summon trail
+ SPELL_TRAIL_TRIGGER = 45399, // trail to self, trigger 45402
+ SPELL_TRAIL_DAMAGE = 45402, // trail damage, 2000 + 2000 dot
+ SPELL_DEAD_SUMMON = 45400, // summon blazing dead, 5min
+ SPELL_DEAD_PASSIVE = 45415,
+ SPELL_FOG_BREATH = 45495, // fel to self, speed burst
+ SPELL_FOG_TRIGGER = 45582, // fog to self, trigger 45782
+ SPELL_FOG_FORCE = 45782, // fog to player, force cast 45714
+ SPELL_FOG_INFORM = 45714, // player let fel cast 45717, script effect
+ SPELL_FOG_CHARM = 45717, // fel to player
+ SPELL_FOG_CHARM2 = 45726, // link to 45717
+
+ SPELL_TRANSFORM_TRIGGER = 44885, // madrigosa to self, trigger 46350
+ SPELL_TRANSFORM_VISUAL = 46350, // 46411stun?
+ SPELL_TRANSFORM_FELMYST = 45068, // become fel
+ SPELL_FELMYST_SUMMON = 45069,
//Other
- SPELL_BERSERK = 45078,
- SPELL_CLOUD_VISUAL = 45212,
- SPELL_CLOUD_SUMMON = 45884
+ SPELL_BERSERK = 45078,
+ SPELL_CLOUD_VISUAL = 45212,
+ SPELL_CLOUD_SUMMON = 45884,
};
enum Creatures
{
- MOB_FELMYST = 25038,
- //MOB_BRUTALLUS =
- //MOB_KALECGOS =
- MOB_DEAD = 25268,
- MOB_MADRIGOSA = 25160,
- MOB_FELMYST_VISUAL = 25041,
- MOB_FLIGHT_LEFT = 25357,
- MOB_FLIGHT_RIGHT = 25358,
- MOB_DEATH_CLOUD = 25703,
- MOB_VAPOR = 25265,
- MOB_VAPOR_TRAIL = 25267
+ MOB_DEAD = 25268,
+ MOB_FLIGHT_LEFT = 25357,
+ MOB_FLIGHT_RIGHT = 25358,
+ MOB_DEATH_CLOUD = 25703,
+ MOB_VAPOR = 25265,
+ MOB_VAPOR_TRAIL = 25267,
};
enum PhaseFelmyst
{
- PHASE_NULL = 0,
- PHASE_GROUND = 1,
- PHASE_FLIGHT = 2,
+ PHASE_NONE,
+ PHASE_GROUND,
+ PHASE_FLIGHT,
};
enum EventFelmyst
{
- EVENT_NULL = 0,
- EVENT_BERSERK = 1,
-
- EVENT_CLEAVE = 2,
- EVENT_CORROSION = 3,
- EVENT_GAS_NOVA = 4,
- EVENT_ENCAPSULATE = 5,
- EVENT_FLIGHT = 6,
-
- EVENT_FLIGHT_SEQUENCE = 2,
- EVENT_SUMMON_DEAD = 3,
- EVENT_SUMMON_FOG = 4
-};
+ EVENT_NONE,
+ EVENT_BERSERK,
-static EventFelmyst MaxTimer[]=
-{
- EVENT_NULL,
+ EVENT_CLEAVE,
+ EVENT_CORROSION,
+ EVENT_GAS_NOVA,
+ EVENT_ENCAPSULATE,
EVENT_FLIGHT,
+
+ EVENT_FLIGHT_SEQUENCE,
+ EVENT_SUMMON_DEAD,
EVENT_SUMMON_FOG,
};
@@ -143,21 +131,21 @@ struct boss_felmystAI : public ScriptedAI
}
ScriptedInstance *pInstance;
- PhaseFelmyst Phase;
- EventFelmyst Event;
- uint32 Timer[EVENT_FLIGHT + 1];
+ PhaseFelmyst phase;
+ EventMap events;
- uint32 FlightCount;
- uint32 BreathCount;
+ uint32 uiFlightCount;
+ uint32 uiBreathCount;
- float BreathX, BreathY;
+ float breathX, breathY;
void Reset()
{
- Phase = PHASE_NULL;
- Event = EVENT_NULL;
- Timer[EVENT_BERSERK] = 600000;
- FlightCount = 0;
+ phase = PHASE_NONE;
+
+ events.Reset();
+
+ uiFlightCount = 0;
me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 10);
@@ -172,6 +160,8 @@ struct boss_felmystAI : public ScriptedAI
void EnterCombat(Unit * /*who*/)
{
+ events.ScheduleEvent(EVENT_BERSERK, 600000);
+
me->setActive(true);
DoZoneInCombat();
DoCast(me, AURA_SUNWELL_RADIANCE, true);
@@ -184,13 +174,13 @@ struct boss_felmystAI : public ScriptedAI
void AttackStart(Unit *who)
{
- if (Phase != PHASE_FLIGHT)
+ if (phase != PHASE_FLIGHT)
ScriptedAI::AttackStart(who);
}
void MoveInLineOfSight(Unit *who)
{
- if (Phase != PHASE_FLIGHT)
+ if (phase != PHASE_FLIGHT)
ScriptedAI::MoveInLineOfSight(who);
}
@@ -239,7 +229,7 @@ struct boss_felmystAI : public ScriptedAI
{
if (summon->GetEntry() == MOB_DEAD)
{
- summon->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0));
+ summon->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM));
DoZoneInCombat(summon);
summon->CastSpell(summon, SPELL_DEAD_PASSIVE, true);
}
@@ -247,12 +237,13 @@ struct boss_felmystAI : public ScriptedAI
void MovementInform(uint32, uint32)
{
- Timer[EVENT_FLIGHT_SEQUENCE] = 1;
+ if (phase == PHASE_FLIGHT)
+ events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1);
}
void DamageTaken(Unit*, uint32 &damage)
{
- if (Phase != PHASE_GROUND && damage >= me->GetHealth())
+ if (phase != PHASE_GROUND && damage >= me->GetHealth())
damage = 0;
}
@@ -261,254 +252,236 @@ struct boss_felmystAI : public ScriptedAI
switch(NextPhase)
{
case PHASE_GROUND:
- Timer[EVENT_CLEAVE] = 5000 + rand()%5 * 1000;
- Timer[EVENT_CORROSION] = 10000 + rand()%10 * 1000;
- Timer[EVENT_GAS_NOVA] = 15000 + rand()%5 * 1000;
- Timer[EVENT_ENCAPSULATE] = 20000 + rand()%5 * 1000;
- Timer[EVENT_FLIGHT] = 60000;
+ me->CastStop(SPELL_FOG_BREATH);
+ me->RemoveAurasDueToSpell(SPELL_FOG_BREATH);
+ me->SetUnitMovementFlags(MOVEMENTFLAG_NONE);
+ me->SetSpeed(MOVE_RUN, 2.0);
+
+ events.ScheduleEvent(EVENT_CLEAVE, urand(5000, 10000));
+ events.ScheduleEvent(EVENT_CORROSION, urand(10000, 20000));
+ events.ScheduleEvent(EVENT_GAS_NOVA, urand(15000, 20000));
+ events.ScheduleEvent(EVENT_ENCAPSULATE, urand(20000, 25000));
+ events.ScheduleEvent(EVENT_FLIGHT, 60000);
break;
case PHASE_FLIGHT:
- Timer[EVENT_FLIGHT_SEQUENCE] = 1000;
- Timer[EVENT_SUMMON_DEAD] = 0;
- Timer[EVENT_SUMMON_FOG] = 0;
- FlightCount = 0;
- BreathCount = 0;
- break;
- default:
+ me->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
+ events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1000);
+ uiFlightCount = 0;
+ uiBreathCount = 0;
break;
}
- Phase = NextPhase;
+ phase = NextPhase;
}
void HandleFlightSequence()
{
- switch(FlightCount)
+ switch(uiFlightCount)
{
case 0:
//me->AttackStop();
- error_log("prevent fly phase");
me->GetMotionMaster()->Clear(false);
me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
- me->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
me->StopMoving();
DoScriptText(YELL_TAKEOFF, me);
- Timer[EVENT_FLIGHT_SEQUENCE] = 2000;
+ events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 2000);
break;
case 1:
- error_log("Move to Fly point");
me->GetMotionMaster()->MovePoint(0, me->GetPositionX()+1, me->GetPositionY(), me->GetPositionZ()+10);
- Timer[EVENT_FLIGHT_SEQUENCE] = 0;
break;
- case 2:{
- error_log("Summon Vapor case 2");
- Unit *pTarget;
- pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
- if (!pTarget) pTarget = Unit::GetUnit(*me, pInstance ? pInstance->GetData64(DATA_PLAYER_GUID) : 0);
- if (pTarget)
- {
- Creature* Vapor = me->SummonCreature(MOB_VAPOR, pTarget->GetPositionX()-5+rand()%10, pTarget->GetPositionY()-5+rand()%10, pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000);
- if (Vapor)
- {
- Vapor->AI()->AttackStart(pTarget);
- me->InterruptNonMeleeSpells(false);
- DoCast(Vapor, SPELL_VAPOR_CHANNEL, false); // core bug
- Vapor->CastSpell(Vapor, SPELL_VAPOR_TRIGGER, true);
- }
- }
- else
+ case 2:
+ {
+ Unit *pTarget = pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
+ if (!pTarget)
+ pTarget = Unit::GetUnit(*me, pInstance ? pInstance->GetData64(DATA_PLAYER_GUID) : 0);
+
+ if (!pTarget)
{
EnterEvadeMode();
return;
}
- Timer[EVENT_FLIGHT_SEQUENCE] = 10000;
- break;}
- case 3: {
- DespawnSummons(MOB_VAPOR_TRAIL);
- error_log("Summon Vapor case3");
- //DoCast(me, SPELL_VAPOR_SELECT); need core support
- Unit *pTarget;
- pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
- if (!pTarget) pTarget = Unit::GetUnit(*me, pInstance ? pInstance->GetData64(DATA_PLAYER_GUID) : 0);
- if (pTarget)
+
+ Creature* Vapor = me->SummonCreature(MOB_VAPOR, pTarget->GetPositionX()-5+rand()%10, pTarget->GetPositionY()-5+rand()%10, pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000);
+ if (Vapor)
{
- //pTarget->CastSpell(pTarget, SPELL_VAPOR_SUMMON, true); need core support
- Creature* Vapor = me->SummonCreature(MOB_VAPOR, pTarget->GetPositionX()-5+rand()%10, pTarget->GetPositionY()-5+rand()%10, pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000);
- if (Vapor)
- {
- Vapor->AI()->AttackStart(pTarget);
- me->InterruptNonMeleeSpells(false);
- DoCast(Vapor, SPELL_VAPOR_CHANNEL, false); // core bug
- Vapor->CastSpell(Vapor, SPELL_VAPOR_TRIGGER, true);
- }
+ Vapor->AI()->AttackStart(pTarget);
+ me->InterruptNonMeleeSpells(false);
+ DoCast(Vapor, SPELL_VAPOR_CHANNEL, false); // core bug
+ Vapor->CastSpell(Vapor, SPELL_VAPOR_TRIGGER, true);
}
- else
+
+ events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000);
+ break;
+ }
+ case 3:
+ {
+ DespawnSummons(MOB_VAPOR_TRAIL);
+ //DoCast(me, SPELL_VAPOR_SELECT); need core support
+
+ Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
+ if (!pTarget)
+ pTarget = Unit::GetUnit(*me, pInstance ? pInstance->GetData64(DATA_PLAYER_GUID) : 0);
+
+ if (!pTarget)
{
EnterEvadeMode();
return;
}
- Timer[EVENT_FLIGHT_SEQUENCE] = 10000;
- break;}
+
+ //pTarget->CastSpell(pTarget, SPELL_VAPOR_SUMMON, true); need core support
+ Creature* pVapor = me->SummonCreature(MOB_VAPOR, pTarget->GetPositionX()-5+rand()%10, pTarget->GetPositionY()-5+rand()%10, pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000);
+ if (pVapor)
+ {
+ if (pVapor->AI())
+ pVapor->AI()->AttackStart(pTarget);
+ me->InterruptNonMeleeSpells(false);
+ DoCast(pVapor, SPELL_VAPOR_CHANNEL, false); // core bug
+ pVapor->CastSpell(pVapor, SPELL_VAPOR_TRIGGER, true);
+ }
+
+ events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000);
+ break;
+ }
case 4:
DespawnSummons(MOB_VAPOR_TRAIL);
- Timer[EVENT_FLIGHT_SEQUENCE] = 1;
+ events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1);
break;
- case 5:{
- Unit *pTarget;
- pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
- if (!pTarget) pTarget = Unit::GetUnit(*me, pInstance ? pInstance->GetData64(DATA_PLAYER_GUID) : 0);
- if (pTarget)
- {
- BreathX = pTarget->GetPositionX();
- BreathY = pTarget->GetPositionY();
- float x, y, z;
- pTarget->GetContactPoint(me, x, y, z, 70);
- me->GetMotionMaster()->MovePoint(0, x, y, z+10);
- }else
+ case 5:
+ {
+ Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true);
+ if (!pTarget)
+ pTarget = Unit::GetUnit(*me, pInstance ? pInstance->GetData64(DATA_PLAYER_GUID) : 0);
+
+ if (!pTarget)
{
EnterEvadeMode();
return;
}
- Timer[EVENT_FLIGHT_SEQUENCE] = 0;
- break;}
+
+ breathX = pTarget->GetPositionX();
+ breathY = pTarget->GetPositionY();
+ float x, y, z;
+ pTarget->GetContactPoint(me, x, y, z, 70);
+ me->GetMotionMaster()->MovePoint(0, x, y, z+10);
+ break;
+ }
case 6:
- me->SetOrientation(me->GetAngle(BreathX, BreathY));
+ me->SetOrientation(me->GetAngle(breathX, breathY));
me->StopMoving();
//DoTextEmote("takes a deep breath.", NULL);
- Timer[EVENT_FLIGHT_SEQUENCE] = 10000;
+ events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 10000);
break;
case 7:
+ {
DoCast(me, SPELL_FOG_BREATH, true);
- {
- float x, y, z;
- me->GetPosition(x, y, z);
- x = 2 * BreathX - x;
- y = 2 * BreathY - y;
- me->GetMotionMaster()->MovePoint(0, x, y, z);
- }
- Timer[EVENT_SUMMON_FOG] = 1;
- Timer[EVENT_FLIGHT_SEQUENCE] = 0;
+ float x, y, z;
+ me->GetPosition(x, y, z);
+ x = 2 * breathX - x;
+ y = 2 * breathY - y;
+ me->GetMotionMaster()->MovePoint(0, x, y, z);
+ events.ScheduleEvent(EVENT_SUMMON_FOG, 1);
break;
+ }
case 8:
+ me->CastStop(SPELL_FOG_BREATH);
me->RemoveAurasDueToSpell(SPELL_FOG_BREATH);
- ++BreathCount;
- Timer[EVENT_SUMMON_FOG] = 0;
- Timer[EVENT_FLIGHT_SEQUENCE] = 1;
- if (BreathCount < 3) FlightCount = 4;
+ ++uiBreathCount;
+ events.ScheduleEvent(EVENT_FLIGHT_SEQUENCE, 1);
+ if (uiBreathCount < 3)
+ uiFlightCount = 4;
break;
case 9:
- if (Unit *pTarget = SelectUnit(SELECT_TARGET_TOPAGGRO, 0))
- {
- float x, y, z;
- pTarget->GetContactPoint(me, x, y, z);
- me->GetMotionMaster()->MovePoint(0, x, y, z);
- }
+ if (Unit *pTarget = SelectTarget(SELECT_TARGET_TOPAGGRO))
+ DoStartMovement(pTarget);
else
{
EnterEvadeMode();
return;
}
- Timer[EVENT_FLIGHT_SEQUENCE] = 0;
break;
case 10:
me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
- me->StopMoving();
me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
EnterPhase(PHASE_GROUND);
- me->AI()->AttackStart(SelectUnit(SELECT_TARGET_TOPAGGRO, 0));
- break;
- default:
+ AttackStart(SelectTarget(SELECT_TARGET_TOPAGGRO));
break;
}
- ++FlightCount;
+ ++uiFlightCount;
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
{
- if (Phase == PHASE_FLIGHT && !me->IsInEvadeMode())
+ if (phase == PHASE_FLIGHT && !me->IsInEvadeMode())
EnterEvadeMode();
return;
}
- Event = EVENT_NULL;
- for (uint32 i = 1; i <= MaxTimer[Phase]; ++i)
- {
- if (Timer[i])
- if (Timer[i] <= diff)
- {
- if (!Event)
- Event = (EventFelmyst)i;
- } else Timer[i] -= diff;
- }
+ events.Update(diff);
if (me->IsNonMeleeSpellCasted(false))
return;
- if (Phase == PHASE_GROUND)
+ if (phase == PHASE_GROUND)
{
- switch(Event)
+ switch(events.ExecuteEvent())
{
- case EVENT_BERSERK:
- DoScriptText(YELL_BERSERK, me);
- DoCast(me, SPELL_BERSERK, true);
- Timer[EVENT_BERSERK] = 10000;
- break;
- case EVENT_CLEAVE:
- DoCast(me->getVictim(), SPELL_CLEAVE, false);
- Timer[EVENT_CLEAVE] = urand(5000,10000);
- break;
- case EVENT_CORROSION:
- DoCast(me->getVictim(), SPELL_CORROSION, false);
- Timer[EVENT_CORROSION] = urand(20000,30000);
- break;
- case EVENT_GAS_NOVA:
- DoCast(me, SPELL_GAS_NOVA, false);
- Timer[EVENT_GAS_NOVA] = urand(20000,25000);
- break;
- case EVENT_ENCAPSULATE:
- if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true))
- {
- DoCast(pTarget, SPELL_ENCAPSULATE_CHANNEL, false);
- Timer[EVENT_ENCAPSULATE] = urand(25000,30000);
- }
- break;
- case EVENT_FLIGHT:
- EnterPhase(PHASE_FLIGHT);
- break;
- default:
- DoMeleeAttackIfReady();
- break;
+ case EVENT_BERSERK:
+ DoScriptText(YELL_BERSERK, me);
+ DoCast(me, SPELL_BERSERK, true);
+ events.ScheduleEvent(EVENT_BERSERK, 10000);
+ break;
+ case EVENT_CLEAVE:
+ DoCast(me->getVictim(), SPELL_CLEAVE, false);
+ events.ScheduleEvent(EVENT_CLEAVE, urand(5000,10000));
+ break;
+ case EVENT_CORROSION:
+ DoCast(me->getVictim(), SPELL_CORROSION, false);
+ events.ScheduleEvent(EVENT_CORROSION, urand(20000,30000));
+ break;
+ case EVENT_GAS_NOVA:
+ DoCast(me, SPELL_GAS_NOVA, false);
+ events.ScheduleEvent(EVENT_GAS_NOVA, urand(20000,25000));
+ break;
+ case EVENT_ENCAPSULATE:
+ if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true))
+ DoCast(pTarget, SPELL_ENCAPSULATE_CHANNEL, false);
+ events.ScheduleEvent(EVENT_ENCAPSULATE, urand(25000,30000));
+ break;
+ case EVENT_FLIGHT:
+ EnterPhase(PHASE_FLIGHT);
+ break;
+ default:
+ DoMeleeAttackIfReady();
+ break;
}
}
- if (Phase == PHASE_FLIGHT)
+ if (phase == PHASE_FLIGHT)
{
- switch(Event)
+ switch(events.ExecuteEvent())
{
- case EVENT_BERSERK:
- DoScriptText(YELL_BERSERK, me);
- DoCast(me, SPELL_BERSERK, true);
- Timer[EVENT_BERSERK] = 0;
- break;
- case EVENT_FLIGHT_SEQUENCE:
- HandleFlightSequence();
- break;
- case EVENT_SUMMON_FOG:
- {
- float x, y, z;
- me->GetPosition(x, y, z);
- me->UpdateGroundPositionZ(x, y, z);
- if (Creature *Fog = me->SummonCreature(MOB_VAPOR_TRAIL, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN, 10000))
+ case EVENT_BERSERK:
+ DoScriptText(YELL_BERSERK, me);
+ DoCast(me, SPELL_BERSERK, true);
+ break;
+ case EVENT_FLIGHT_SEQUENCE:
+ HandleFlightSequence();
+ break;
+ case EVENT_SUMMON_FOG:
{
- Fog->RemoveAurasDueToSpell(SPELL_TRAIL_TRIGGER);
- Fog->CastSpell(Fog, SPELL_FOG_TRIGGER, true);
+ float x, y, z;
+ me->GetPosition(x, y, z);
+ me->UpdateGroundPositionZ(x, y, z);
+ if (Creature *Fog = me->SummonCreature(MOB_VAPOR_TRAIL, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN, 10000))
+ {
+ Fog->RemoveAurasDueToSpell(SPELL_TRAIL_TRIGGER);
+ Fog->CastSpell(Fog, SPELL_FOG_TRIGGER, true);
+ me->CastSpell(Fog, SPELL_FOG_FORCE, true);
+ }
}
- }
- Timer[EVENT_SUMMON_FOG] = 1000;
- break;
- default:
- break;
+ events.ScheduleEvent(EVENT_SUMMON_FOG, 1000);
+ break;
}
}
}
@@ -519,23 +492,19 @@ struct boss_felmystAI : public ScriptedAI
float x, y, z;
me->GetPosition(x, y, z);
- {
- CellPair pair(Trinity::ComputeCellPair(x, y));
- Cell cell(pair);
- cell.data.Part.reserved = ALL_DISTRICT;
- cell.SetNoCreate();
-
- Trinity::AllCreaturesOfEntryInRange check(me, entry, 100);
- Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(me, templist, check);
-
- TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange>, GridTypeMapContainer> cSearcher(searcher);
+ CellPair pair(Trinity::ComputeCellPair(x, y));
+ Cell cell(pair);
+ cell.data.Part.reserved = ALL_DISTRICT;
+ cell.SetNoCreate();
- cell.Visit(pair, cSearcher, *(me->GetMap()));
- }
+ Trinity::AllCreaturesOfEntryInRange check(me, entry, 100);
+ Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(me, templist, check);
+ TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange>, GridTypeMapContainer> cSearcher(searcher);
+ cell.Visit(pair, cSearcher, *(me->GetMap()));
for (std::list<Creature*>::const_iterator i = templist.begin(); i != templist.end(); ++i)
{
- if (entry == MOB_VAPOR_TRAIL && Phase == PHASE_FLIGHT)
+ if (entry == MOB_VAPOR_TRAIL && phase == PHASE_FLIGHT)
{
(*i)->GetPosition(x, y, z);
me->SummonCreature(MOB_DEAD, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);