mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-20 17:27:36 +01:00
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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user