diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/scripts/eastern_kingdoms/sunwell_plateau/boss_felmyst.cpp | 501 |
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); |