Fix Script Sunwell/Felmyst. Thanks Ille000.

Fixes issue #318.

+ Fixes code layout.
+ Uses standard EventMap instead of homemade Timer.

--HG--
branch : trunk
This commit is contained in:
Trazom62
2010-05-04 19:29:14 +02:00
parent 4833d28be7
commit efcceb750e

View File

@@ -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_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_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_NONE,
EVENT_BERSERK,
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
};
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: {
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);
}
events.ScheduleEvent(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)
{
//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);
}
}
else
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();
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);
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);