TrinityCore
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
boss_illidan_stormrage::boss_illidan_stormrageAI Struct Reference

Public Member Functions

 boss_illidan_stormrageAI (Creature *creature)
 
void Initialize ()
 
void Reset () override
 
void JustSummoned (Creature *summon) override
 
void SummonedCreatureDespawn (Creature *summon) override
 
void MovementInform (uint32, uint32) override
 
void EnterCombat (Unit *) override
 
void AttackStart (Unit *who) override
 
void MoveInLineOfSight (Unit *) override
 
void JustDied (Unit *) override
 
void KilledUnit (Unit *victim) override
 
void DamageTaken (Unit *done_by, uint32 &damage) override
 
void SpellHit (Unit *, const SpellInfo *spell) override
 
void DeleteFromThreatList (ObjectGuid TargetGUID)
 
void Talk (uint32 count)
 
void EnterPhase (PhaseIllidan NextPhase)
 
void CastEyeBlast ()
 
void SummonFlamesOfAzzinoth ()
 
void SummonMaiev ()
 
void HandleTalkSequence ()
 
void HandleFlightSequence ()
 
void HandleTransformSequence ()
 
void UpdateAI (uint32 diff) override
 
- Public Member Functions inherited from ScriptedAI
 ScriptedAI (Creature *creature)
 
virtual ~ScriptedAI ()
 
void AttackStartNoMove (Unit *target)
 
void SpellHitTarget (Unit *, SpellInfo const *) override
 
void OnPossess (bool)
 
void DoStartMovement (Unit *target, float distance=0.0f, float angle=0.0f)
 
void DoStartNoMovement (Unit *target)
 
void DoStopAttack ()
 
void DoCastSpell (Unit *target, SpellInfo const *spellInfo, bool triggered=false)
 
void DoPlaySoundToSet (WorldObject *source, uint32 soundId)
 
void DoResetThreat ()
 
float DoGetThreat (Unit *unit)
 
void DoModifyThreatPercent (Unit *unit, int32 pct)
 
void DoTeleportTo (float x, float y, float z, uint32 time=0)
 
void DoTeleportTo (float const pos[4])
 
void DoTeleportPlayer (Unit *unit, float x, float y, float z, float o)
 
void DoTeleportAll (float x, float y, float z, float o)
 
UnitDoSelectLowestHpFriendly (float range, uint32 minHPDiff=1)
 
std::list< Creature * > DoFindFriendlyCC (float range)
 
std::list< Creature * > DoFindFriendlyMissingBuff (float range, uint32 spellId)
 
PlayerGetPlayerAtMinimumRange (float minRange)
 
CreatureDoSpawnCreature (uint32 entry, float offsetX, float offsetY, float offsetZ, float angle, uint32 type, uint32 despawntime)
 
bool HealthBelowPct (uint32 pct) const
 
bool HealthAbovePct (uint32 pct) const
 
SpellInfo constSelectSpell (Unit *target, uint32 school, uint32 mechanic, SelectTargetType targets, float rangeMin, float rangeMax, SelectEffect effect)
 
void SetEquipmentSlots (bool loadDefault, int32 mainHand=EQUIP_NO_CHANGE, int32 offHand=EQUIP_NO_CHANGE, int32 ranged=EQUIP_NO_CHANGE)
 
void SetCombatMovement (bool allowMovement)
 
bool IsCombatMovementAllowed () const
 
bool IsHeroic () const
 
Difficulty GetDifficulty () const
 
bool Is25ManRaid () const
 
template<class T >
const T & DUNGEON_MODE (const T &normal5, const T &heroic10) const
 
template<class T >
const T & RAID_MODE (const T &normal10, const T &normal25) const
 
template<class T >
const T & RAID_MODE (const T &normal10, const T &normal25, const T &heroic10, const T &heroic25) const
 
- Public Member Functions inherited from CreatureAI
void Talk (uint8 id, WorldObject const *whisperTarget=nullptr)
 
 CreatureAI (Creature *creature)
 
virtual ~CreatureAI ()
 
void MoveInLineOfSight_Safe (Unit *who)
 == Reactions At ================================= More...
 
void TriggerAlert (Unit const *who) const
 
virtual bool CanRespawn ()
 
virtual void EnterEvadeMode (EvadeReason why=EVADE_REASON_OTHER)
 
virtual void IsSummonedBy (Unit *)
 
virtual void SummonedCreatureDies (Creature *, Unit *)
 
virtual void AttackedBy (Unit *)
 
virtual bool IsEscorted () const
 
virtual void JustRespawned ()
 
void OnCharmed (bool apply) override
 
virtual void JustReachedHome ()
 
void DoZoneInCombat (Creature *creature=NULL, float maxRangeToNearestTarget=50.0f)
 
virtual void ReceiveEmote (Player *, uint32)
 
virtual void OwnerAttackedBy (Unit *)
 
virtual void OwnerAttacked (Unit *)
 
virtual void CorpseRemoved (uint32 &)
 == Triggered Actions Requested ================== More...
 
virtual void PassengerBoarded (Unit *, int8, bool)
 == Fields ======================================= More...
 
virtual void OnSpellClick (Unit *, bool &)
 
virtual bool CanSeeAlways (WorldObject const *)
 
int32 VisualizeBoundary (uint32 duration, Unit *owner=nullptr, bool fill=false) const
 
virtual bool CheckInRoom ()
 
CreatureBoundary constGetBoundary () const
 
- Public Member Functions inherited from UnitAI
 UnitAI (Unit *unit)
 
virtual ~UnitAI ()
 
virtual bool CanAIAttack (Unit const *) const
 
virtual void InitializeAI ()
 
virtual void DoAction (int32)
 
virtual uint32 GetData (uint32) const
 
virtual void SetData (uint32, uint32)
 
virtual void SetGUID (ObjectGuid, int32=0)
 
virtual ObjectGuid GetGUID (int32=0) const
 
UnitSelectTarget (SelectAggroTarget targetType, uint32 position=0, float dist=0.0f, bool playerOnly=false, int32 aura=0)
 
template<class PREDICATE >
UnitSelectTarget (SelectAggroTarget targetType, uint32 position, PREDICATE const &predicate)
 
void SelectTargetList (std::list< Unit * > &targetList, uint32 num, SelectAggroTarget targetType, float dist=0.0f, bool playerOnly=false, int32 aura=0)
 
template<class PREDICATE >
void SelectTargetList (std::list< Unit * > &targetList, PREDICATE const &predicate, uint32 maxTargets, SelectAggroTarget targetType)
 
virtual void DamageDealt (Unit *, uint32 &, DamageEffectType)
 
virtual void HealReceived (Unit *, uint32 &)
 
virtual void HealDone (Unit *, uint32 &)
 
virtual void SpellInterrupted (uint32, uint32)
 
void AttackStartCaster (Unit *victim, float dist)
 
void DoCast (uint32 spellId)
 
void DoCast (Unit *victim, uint32 spellId, bool triggered=false)
 
void DoCastVictim (uint32 spellId, bool triggered=false)
 
void DoCastAOE (uint32 spellId, bool triggered=false)
 
void DoMeleeAttackIfReady ()
 
bool DoSpellAttackIfReady (uint32 spellId)
 
virtual void sGossipHello (Player *)
 
virtual void sGossipSelect (Player *, uint32, uint32)
 
virtual void sGossipSelectCode (Player *, uint32, uint32, char const *)
 
virtual void sQuestAccept (Player *, Quest const *)
 
virtual void sQuestSelect (Player *, Quest const *)
 
virtual void sQuestReward (Player *, Quest const *, uint32)
 
virtual bool sOnDummyEffect (Unit *, uint32, SpellEffIndex)
 
virtual void sOnGameEvent (bool, uint16)
 

Public Attributes

ObjectGuid AkamaGUID
 
uint32 Timer [EVENT_ENRAGE+1]
 
PhaseIllidan Phase
 
- Public Attributes inherited from ScriptedAI
bool IsFleeing
 

Private Attributes

InstanceScriptinstance
 
EventIllidan Event
 
uint32 TalkCount
 
uint32 TransformCount
 
uint32 FlightCount
 
uint32 HoverPoint
 
ObjectGuid MaievGUID
 
ObjectGuid FlameGUID [2]
 
ObjectGuid GlaiveGUID [2]
 
SummonList Summons
 

Additional Inherited Members

- Public Types inherited from CreatureAI
enum  EvadeReason { EVADE_REASON_NO_HOSTILES, EVADE_REASON_BOUNDARY, EVADE_REASON_SEQUENCE_BREAK, EVADE_REASON_OTHER }
 
- Static Public Member Functions inherited from UnitAI
static void FillAISpellInfo ()
 
- Static Public Attributes inherited from UnitAI
static AISpellInfoTypeAISpellInfo
 
- Protected Member Functions inherited from CreatureAI
bool UpdateVictim ()
 
bool UpdateVictimWithGaze ()
 
void SetGazeOn (Unit *target)
 
CreatureDoSummon (uint32 entry, Position const &pos, uint32 despawnTime=30000, TempSummonType summonType=TEMPSUMMON_CORPSE_TIMED_DESPAWN)
 
CreatureDoSummon (uint32 entry, WorldObject *obj, float radius=5.0f, uint32 despawnTime=30000, TempSummonType summonType=TEMPSUMMON_CORPSE_TIMED_DESPAWN)
 
CreatureDoSummonFlyer (uint32 entry, WorldObject *obj, float flightZ, float radius=5.0f, uint32 despawnTime=30000, TempSummonType summonType=TEMPSUMMON_CORPSE_TIMED_DESPAWN)
 
bool CheckBoundary (Position const *who=nullptr) const
 
void SetBoundary (CreatureBoundary const *boundary)
 
bool _EnterEvadeMode (EvadeReason why=EVADE_REASON_OTHER)
 
- Protected Attributes inherited from CreatureAI
Creature *const me
 
CreatureBoundary const_boundary
 
- Protected Attributes inherited from UnitAI
Unit *const me
 

Constructor & Destructor Documentation

boss_illidan_stormrage::boss_illidan_stormrageAI::boss_illidan_stormrageAI ( Creature creature)
inline
478  : ScriptedAI(creature), Summons(me)
479  {
480  Initialize();
481  instance = creature->GetInstanceScript();
482  DoCast(me, SPELL_DUAL_WIELD, true);
483  }
ScriptedAI(Creature *creature)
Definition: ScriptedCreature.cpp:100
InstanceScript * GetInstanceScript()
Definition: Object.cpp:1540
void Initialize()
Definition: boss_illidan.cpp:485
SummonList Summons
Definition: boss_illidan.cpp:1140
Creature *const me
Definition: CreatureAI.h:71
InstanceScript * instance
Definition: boss_illidan.cpp:1131
Definition: boss_illidan.cpp:89
void DoCast(uint32 spellId)
Definition: UnitAI.cpp:101

+ Here is the call graph for this function:

Member Function Documentation

void boss_illidan_stormrage::boss_illidan_stormrageAI::AttackStart ( Unit who)
inlineoverridevirtual

Reimplemented from ScriptedAI.

547  {
548  if (!who || Phase >= PHASE_TALK_SEQUENCE)
549  return;
550 
551  if (Phase == PHASE_FLIGHT || Phase == PHASE_DEMON)
552  AttackStartNoMove(who);
553  else
555  }
void AttackStartNoMove(Unit *target)
Definition: ScriptedCreature.cpp:108
Definition: boss_illidan.cpp:165
Definition: boss_illidan.cpp:167
Definition: boss_illidan.cpp:169
void AttackStart(Unit *) override
Definition: ScriptedCreature.cpp:117
Phase
Definition: boss_kiljaeden.cpp:153

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void boss_illidan_stormrage::boss_illidan_stormrageAI::CastEyeBlast ( )
inline
720  {
721  me->InterruptNonMeleeSpells(false);
722 
724 
725  float distx, disty, dist[2];
726  for (uint8 i = 0; i < 2; ++i)
727  {
728  distx = EyeBlast[i].x - HoverPosition[HoverPoint].x;
729  disty = EyeBlast[i].y - HoverPosition[HoverPoint].y;
730  dist[i] = distx * distx + disty * disty;
731  }
732  G3D::Vector3 initial = EyeBlast[dist[0] < dist[1] ? 0 : 1];
733  for (uint8 i = 0; i < 2; ++i)
734  {
735  distx = GlaivePosition[i].x - HoverPosition[HoverPoint].x;
736  disty = GlaivePosition[i].y - HoverPosition[HoverPoint].y;
737  dist[i] = distx * distx + disty * disty;
738  }
739  G3D::Vector3 final = GlaivePosition[dist[0] < dist[1] ? 0 : 1];
740 
741  final.x = 2 * final.x - initial.x;
742  final.y = 2 * final.y - initial.y;
743 
744  Creature* Trigger = me->SummonCreature(23069, initial.x, initial.y, initial.z, 0, TEMPSUMMON_TIMED_DESPAWN, 13000);
745  if (!Trigger)
746  return;
747 
748  Trigger->SetSpeed(MOVE_WALK, 3);
749  Trigger->SetWalk(true);
750  Trigger->GetMotionMaster()->MovePoint(0, final.x, final.y, final.z);
751 
752  // Trigger->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
753  me->SetTarget(Trigger->GetGUID());
754  DoCast(Trigger, SPELL_EYE_BLAST);
755  }
float x
Definition: Vector3.h:62
G3D::Vector3 const GlaivePosition[4]
Definition: boss_illidan.cpp:309
void Talk(uint32 count)
Definition: boss_illidan.cpp:611
MotionMaster * GetMotionMaster()
Definition: Unit.h:2101
uint32 HoverPoint
Definition: boss_illidan.cpp:1136
Definition: Unit.h:599
Definition: Creature.h:467
float y
Definition: Vector3.h:62
Definition: Vector3.h:58
Creature *const me
Definition: CreatureAI.h:71
void MovePoint(uint32 id, Position const &pos, bool generatePath=true)
Definition: MotionMaster.h:172
G3D::Vector3 const HoverPosition[4]
Definition: boss_illidan.cpp:301
Definition: Object.h:56
G3D::int16 z
Definition: Vector3int16.h:46
G3D::int16 y
Definition: Vector2int16.h:38
void DoCast(uint32 spellId)
Definition: UnitAI.cpp:101
ObjectGuid const & GetGUID() const
Definition: Object.h:105
float z
Definition: Vector3.h:62
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition: Unit.cpp:2916
bool SetWalk(bool enable)
Definition: Unit.cpp:15800
Definition: boss_illidan.cpp:102
uint8_t uint8
Definition: Define.h:152
void SetSpeed(UnitMoveType mtype, float rate, bool forced=false)
Definition: Unit.cpp:10531
G3D::int16 x
Definition: Vector2int16.h:37
G3D::Vector3 const EyeBlast[2]
Definition: boss_illidan.cpp:317
void SetTarget(ObjectGuid const &guid) override
Definition: Creature.cpp:2675
TempSummon * SummonCreature(uint32 id, Position const &pos, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0) const
Definition: Object.cpp:2346
Definition: boss_illidan.cpp:49

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void boss_illidan_stormrage::boss_illidan_stormrageAI::DamageTaken ( Unit done_by,
uint32 damage 
)
inlineoverridevirtual

Reimplemented from ScriptedAI.

579  {
580  if (damage >= me->GetHealth() && done_by != me)
581  damage = 0;
582  if (done_by->GetGUID() == MaievGUID)
583  done_by->AddThreat(me, -(3*(float)damage)/4); // do not let maiev tank him
584  }
void AddThreat(Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=NULL)
Definition: Unit.cpp:10691
Creature *const me
Definition: CreatureAI.h:71
ObjectGuid const & GetGUID() const
Definition: Object.h:105
ObjectGuid MaievGUID
Definition: boss_illidan.cpp:1137
uint32 GetHealth() const
Definition: Unit.h:1426

+ Here is the call graph for this function:

void boss_illidan_stormrage::boss_illidan_stormrageAI::DeleteFromThreatList ( ObjectGuid  TargetGUID)
inline
599  {
601  for (ThreatContainer::StorageType::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr)
602  {
603  if ((*itr)->getUnitGuid() == TargetGUID)
604  {
605  (*itr)->removeReference();
606  break;
607  }
608  }
609  }
ThreatContainer::StorageType const & getThreatList() const
Definition: ThreatManager.h:263
Creature *const me
Definition: CreatureAI.h:71
std::list< HostileReference * > StorageType
Definition: ThreatManager.h:149
ThreatManager & getThreatManager()
Definition: Unit.h:1998

+ Here is the call graph for this function:

void boss_illidan_stormrage::boss_illidan_stormrageAI::EnterCombat ( Unit )
inlineoverridevirtual

Reimplemented from ScriptedAI.

541  {
542  me->setActive(true);
543  DoZoneInCombat();
544  }
void setActive(bool isActiveObject)
Definition: Object.cpp:1473
void DoZoneInCombat(Creature *creature=NULL, float maxRangeToNearestTarget=50.0f)
Definition: CreatureAI.cpp:47
Creature *const me
Definition: CreatureAI.h:71

+ Here is the call graph for this function:

void boss_illidan_stormrage::boss_illidan_stormrageAI::EnterPhase ( PhaseIllidan  NextPhase)
inline
635  {
636  DoZoneInCombat();
637 
638  switch (NextPhase)
639  {
640  case PHASE_NORMAL:
641  case PHASE_NORMAL_2:
642  case PHASE_NORMAL_MAIEV:
644  Timer[EVENT_TAUNT] = 32000;
645  Timer[EVENT_SHEAR] = urand(10, 25) * 1000;
646  Timer[EVENT_FLAME_CRASH] = 20000;
647  Timer[EVENT_PARASITIC_SHADOWFIEND] = 25000;
648  Timer[EVENT_PARASITE_CHECK] = 0;
649  Timer[EVENT_DRAW_SOUL] = 30000;
650  if (NextPhase == PHASE_NORMAL)
651  break;
652  Timer[EVENT_AGONIZING_FLAMES] = 35000;
653  Timer[EVENT_TRANSFORM_NORMAL] = 60000;
654  if (NextPhase == PHASE_NORMAL_2)
655  break;
656  Timer[EVENT_ENRAGE] = urand(30, 40) * 1000;
657  break;
658  case PHASE_FLIGHT:
659  Timer[EVENT_FIREBALL] = 1000;
660  if (!(rand32() % 4))
661  Timer[EVENT_DARK_BARRAGE] = 10000;
662  Timer[EVENT_EYE_BLAST] = urand(10, 25) * 1000;
663  Timer[EVENT_MOVE_POINT] = urand(20, 40) * 1000;
664  break;
665  case PHASE_DEMON:
666  Timer[EVENT_SHADOW_BLAST] = 1000;
667  Timer[EVENT_FLAME_BURST] = 10000;
668  Timer[EVENT_SHADOWDEMON] = 30000;
669  Timer[EVENT_TRANSFORM_DEMON] = 60000;
671  break;
672  case PHASE_TALK_SEQUENCE:
673  Timer[EVENT_TALK_SEQUENCE] = 100;
674  me->RemoveAllAuras();
675  me->InterruptNonMeleeSpells(false);
677  me->GetMotionMaster()->Clear(false);
678  me->AttackStop();
679  break;
681  if (Phase == PHASE_NORMAL) // lift off
682  {
683  FlightCount = 1;
684  Timer[EVENT_FLIGHT_SEQUENCE] = 1;
685  me->RemoveAllAuras();
686  me->InterruptNonMeleeSpells(false);
688  me->GetMotionMaster()->Clear(false);
689  me->AttackStop();
690  }
691  else // land
692  Timer[EVENT_FLIGHT_SEQUENCE] = 2000;
693  break;
695  if (Phase == PHASE_DEMON)
696  Timer[EVENT_TRANSFORM_SEQUENCE] = 500;
697  else
698  {
699  TransformCount = 0;
700  Timer[EVENT_TRANSFORM_SEQUENCE] = 500;
702  }
703  me->GetMotionMaster()->Clear();
704  me->AttackStop();
705  break;
706  default:
707  break;
708  }
709  if (!MaievGUID.IsEmpty())
710  {
712  if (maiev->IsAlive())
713  maiev->AI()->DoAction(NextPhase);
714  }
715  Phase = NextPhase;
716  Event = EVENT_NULL;
717  }
bool AttackStop()
Definition: Unit.cpp:7337
Definition: boss_illidan.cpp:213
Definition: boss_illidan.cpp:209
void RemoveAllAuras()
Definition: Unit.cpp:3920
void AttackStart(Unit *who) override
Definition: boss_illidan.cpp:546
Definition: Unit.h:674
Definition: boss_illidan.cpp:198
void Clear(bool reset=true)
Definition: MotionMaster.h:138
Definition: boss_illidan.cpp:195
void Talk(uint32 count)
Definition: boss_illidan.cpp:611
void DoZoneInCombat(Creature *creature=NULL, float maxRangeToNearestTarget=50.0f)
Definition: CreatureAI.cpp:47
MotionMaster * GetMotionMaster()
Definition: Unit.h:2101
Definition: boss_illidan.cpp:166
Definition: boss_illidan.cpp:191
uint32 FlightCount
Definition: boss_illidan.cpp:1135
Definition: boss_illidan.cpp:196
Definition: boss_illidan.cpp:194
Definition: boss_illidan.cpp:206
Definition: Creature.h:467
Definition: boss_illidan.cpp:197
void SetFlag(uint16 index, uint32 newFlag)
Definition: Object.cpp:1199
Definition: boss_illidan.cpp:165
Definition: boss_illidan.cpp:164
Creature *const me
Definition: CreatureAI.h:71
Definition: boss_illidan.cpp:192
Definition: boss_illidan.cpp:199
Unit * GetVictim() const
Definition: Unit.h:1379
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:45
EventIllidan Event
Definition: boss_illidan.cpp:1132
Definition: boss_illidan.cpp:207
Definition: boss_illidan.cpp:167
Definition: boss_illidan.cpp:188
Definition: boss_illidan.cpp:171
Definition: boss_illidan.cpp:212
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
Definition: ObjectAccessor.cpp:174
Definition: boss_illidan.cpp:169
Definition: boss_illidan.cpp:208
Definition: UpdateFields.h:109
Definition: boss_illidan.cpp:202
Definition: boss_illidan.cpp:211
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition: Unit.cpp:2916
Definition: boss_illidan.cpp:204
uint32 rand32()
Definition: Random.cpp:64
ObjectGuid MaievGUID
Definition: boss_illidan.cpp:1137
Definition: boss_illidan.cpp:193
Definition: boss_illidan.cpp:170
Definition: boss_illidan.cpp:168
uint32 TransformCount
Definition: boss_illidan.cpp:1134
Definition: boss_illidan.cpp:50
Phase
Definition: boss_kiljaeden.cpp:153
Definition: Unit.h:698
Definition: boss_illidan.cpp:203
bool IsEmpty() const
Definition: ObjectGuid.h:242
uint32 Timer[EVENT_ENRAGE+1]
Definition: boss_illidan.cpp:1128
Definition: boss_illidan.cpp:201

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void boss_illidan_stormrage::boss_illidan_stormrageAI::HandleFlightSequence ( )
inline
791  {
792  switch (FlightCount)
793  {
794  case 1: // lift off
796  me->SetDisableGravity(true);
797  me->StopMoving();
800  break;
801  case 2: // move to center
802  me->GetMotionMaster()->MovePoint(0, CENTER_X + 5, CENTER_Y, CENTER_Z); // +5, for SPELL_THROW_GLAIVE bug
804  break;
805  case 3: // throw one glaive
806  {
807  uint8 i=1;
809  if (Glaive)
810  {
811  GlaiveGUID[i] = Glaive->GetGUID();
813  Glaive->SetDisplayId(MODEL_INVISIBLE);
814  Glaive->setFaction(me->getFaction());
815  DoCast(Glaive, SPELL_THROW_GLAIVE2);
816  }
817  }
819  break;
820  case 4: // throw another
822  {
823  uint8 i=0;
825  if (Glaive)
826  {
827  GlaiveGUID[i] = Glaive->GetGUID();
829  Glaive->SetDisplayId(MODEL_INVISIBLE);
830  Glaive->setFaction(me->getFaction());
831  DoCast(Glaive, SPELL_THROW_GLAIVE, true);
832  }
833  }
835  break;
836  case 5: // summon flames
839  break;
840  case 6: // fly to hover point
843  break;
844  case 7: // return to center
847  break;
848  case 8: // glaive return
849  for (uint8 i = 0; i < 2; ++i)
850  {
851  if (!GlaiveGUID[i].IsEmpty())
852  {
853  Unit* Glaive = ObjectAccessor::GetUnit(*me, GlaiveGUID[i]);
854  if (Glaive)
855  {
856  Glaive->CastSpell(me, SPELL_GLAIVE_RETURNS, false); // Make it look like the Glaive flies back up to us
857  Glaive->SetDisplayId(MODEL_INVISIBLE); // disappear but not die for now
858  }
859  }
860  }
862  break;
863  case 9: // land
864  me->SetDisableGravity(false);
865  me->StopMoving();
867  for (uint8 i = 0; i < 2; ++i)
868  {
869  if (!GlaiveGUID[i].IsEmpty())
870  {
872  glaive->DespawnOrUnsummon();
873 
874  GlaiveGUID[i].Clear();
875  }
876  }
878  break;
879  case 10: // attack
880  DoResetThreat();
884  break;
885  default:
886  break;
887  }
888  ++FlightCount;
889  }
#define CENTER_Y
Definition: boss_illidan.cpp:36
void EnterPhase(PhaseIllidan NextPhase)
Definition: boss_illidan.cpp:634
Definition: UpdateFields.h:146
Definition: Unit.h:674
void SetEquipmentSlots(bool loadDefault, int32 mainHand=EQUIP_NO_CHANGE, int32 offHand=EQUIP_NO_CHANGE, int32 ranged=EQUIP_NO_CHANGE)
Definition: ScriptedCreature.cpp:364
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
Definition: ObjectAccessor.cpp:163
uint32 getFaction() const
Definition: Unit.h:1466
G3D::Vector3 const GlaivePosition[4]
Definition: boss_illidan.cpp:309
void Talk(uint32 count)
Definition: boss_illidan.cpp:611
MotionMaster * GetMotionMaster()
Definition: Unit.h:2101
uint32 HoverPoint
Definition: boss_illidan.cpp:1136
Definition: boss_illidan.cpp:166
void SummonFlamesOfAzzinoth()
Definition: boss_illidan.cpp:757
uint32 FlightCount
Definition: boss_illidan.cpp:1135
Definition: boss_illidan.cpp:146
Definition: boss_illidan.cpp:72
Definition: Object.h:58
Definition: Creature.h:467
bool SetDisableGravity(bool disable, bool packetOnly=false)
Definition: Unit.cpp:15818
void SetFlag(uint16 index, uint32 newFlag)
Definition: Object.cpp:1199
ObjectGuid GlaiveGUID[2]
Definition: boss_illidan.cpp:1139
Definition: CreatureAI.h:63
void setFaction(uint32 faction)
Definition: Unit.h:1467
Creature *const me
Definition: CreatureAI.h:71
void MovePoint(uint32 id, Position const &pos, bool generatePath=true)
Definition: MotionMaster.h:172
#define CENTER_X
Definition: boss_illidan.cpp:35
virtual void SetDisplayId(uint32 modelId)
Definition: Unit.cpp:12799
G3D::Vector3 const HoverPosition[4]
Definition: boss_illidan.cpp:301
void SetByteValue(uint16 index, uint8 offset, uint8 value)
Definition: Object.cpp:1080
G3D::int16 z
Definition: Vector3int16.h:46
Definition: SharedDefines.h:2482
#define CENTER_Z
Definition: boss_illidan.cpp:37
G3D::int16 y
Definition: Vector2int16.h:38
void DoCast(uint32 spellId)
Definition: UnitAI.cpp:101
Definition: boss_illidan.cpp:212
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
Definition: ObjectAccessor.cpp:174
Definition: boss_illidan.cpp:71
void Clear()
Definition: ObjectGuid.h:215
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition: Object.cpp:1214
void DoResetThreat()
Definition: ScriptedCreature.cpp:248
Definition: boss_illidan.cpp:135
ObjectGuid const & GetGUID() const
Definition: Object.h:105
void SetDisplayId(uint32 modelId) override
Definition: Creature.cpp:2664
Definition: SharedDefines.h:2478
Definition: UpdateFields.h:109
Definition: boss_illidan.cpp:47
uint8_t uint8
Definition: Define.h:152
void HandleEmoteCommand(uint32 anim_id)
Definition: Unit.cpp:1444
Definition: boss_illidan.cpp:73
G3D::int16 x
Definition: Vector2int16.h:37
Definition: Unit.h:299
Definition: Unit.h:1305
void StopMoving()
-------—End of Pet responses methods-------—
Definition: Unit.cpp:12743
void CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition: Unit.cpp:869
Definition: Unit.h:698
uint32 Timer[EVENT_ENRAGE+1]
Definition: boss_illidan.cpp:1128
TempSummon * SummonCreature(uint32 id, Position const &pos, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0) const
Definition: Object.cpp:2346
Definition: CreatureAI.h:64

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void boss_illidan_stormrage::boss_illidan_stormrageAI::HandleTalkSequence ( )
1882 {
1883  switch (TalkCount)
1884  {
1885  case 0:
1887  break;
1888  case 8:
1889  // Equip our warglaives!
1892  me->SetWalk(false);
1893  break;
1894  case 9:
1896  {
1898  me->AddThreat(akama, 100.0f);
1901  }
1902  break;
1903  case 10:
1904  SummonMaiev();
1905  break;
1906  case 11:
1908  {
1909  maiev->SetVisible(true); // Maiev is now visible
1910  maiev->CastSpell(maiev, SPELL_TELEPORT_VISUAL, true); // onoz she looks like she teleported!
1911  maiev->SetInFront(me); // Have her face us
1912  me->SetInFront(maiev); // Face her, so it's not rude =P
1913  maiev->GetMotionMaster()->MoveIdle();
1914  me->GetMotionMaster()->MoveIdle();
1915  }
1916  break;
1917  case 14:
1919  {
1922  maiev->AddThreat(me, 10000000.0f); // Have Maiev add a lot of threat on us so that players don't pull her off if they damage her via AOE
1923  maiev->AI()->AttackStart(me); // Force Maiev to attack us.
1925  }
1926  break;
1927  case 15:
1928  DoCast(me, SPELL_DEATH); // Animate his kneeling + stun him
1929  Summons.DespawnAll();
1930  break;
1931  case 17:
1933  {
1934  if (!me->IsWithinDistInMap(akama, 15))
1935  {
1936  float x, y, z;
1937  me->GetPosition(x, y, z);
1938  x += 10; y += 10;
1939  akama->GetMotionMaster()->Clear(false);
1940  // Akama->GetMotionMaster()->MoveIdle();
1941  akama->SetPosition(x, y, z, 0.0f);
1942  akama->MonsterMoveWithSpeed(x, y, z, 0); // Illidan must not die until Akama arrives.
1943  akama->GetMotionMaster()->MoveChase(me);
1944  }
1945  }
1946  break;
1947  case 19: // Make Maiev leave
1949  {
1950  maiev->CastSpell(maiev, SPELL_TELEPORT_VISUAL, true);
1951  maiev->setDeathState(JUST_DIED);
1953  }
1954  break;
1955  case 21: // Kill ourself.
1957  break;
1958  default:
1959  break;
1960  }
1961  if (Phase == PHASE_TALK_SEQUENCE)
1962  Talk(TalkCount); // This function does most of the talking
1963  ++TalkCount;
1964 }
Definition: Unit.h:214
void AddThreat(Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=NULL)
Definition: Unit.cpp:10691
void EnterPhase(PhaseIllidan NextPhase)
Definition: boss_illidan.cpp:634
Definition: UpdateFields.h:146
void MoveIdle()
Definition: MotionMaster.cpp:185
Definition: Unit.h:674
void SetEquipmentSlots(bool loadDefault, int32 mainHand=EQUIP_NO_CHANGE, int32 offHand=EQUIP_NO_CHANGE, int32 ranged=EQUIP_NO_CHANGE)
Definition: ScriptedCreature.cpp:364
void SummonMaiev()
Definition: boss_illidan.cpp:777
Definition: boss_illidan.cpp:120
Definition: Unit.h:542
void Talk(uint32 count)
Definition: boss_illidan.cpp:611
Definition: boss_illidan.cpp:132
Definition: boss_illidan.cpp:1383
MotionMaster * GetMotionMaster()
Definition: Unit.h:2101
arena_t NULL
Definition: jemalloc_internal.h:624
Definition: boss_illidan.cpp:87
void SetUInt32Value(uint16 index, uint32 value)
Definition: Object.cpp:996
Definition: Creature.h:467
Definition: boss_illidan.cpp:181
Definition: boss_illidan.cpp:131
Definition: boss_illidan.cpp:164
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true) const
Definition: Object.cpp:1663
Definition: CreatureAI.h:63
Creature *const me
Definition: CreatureAI.h:71
#define ENSURE_AI(a, b)
Definition: ScriptedCreature.h:29
Definition: SharedDefines.h:288
void SetByteValue(uint16 index, uint8 offset, uint8 value)
Definition: Object.cpp:1080
G3D::int16 z
Definition: Vector3int16.h:46
void GetPosition(float &x, float &y) const
Definition: Position.h:109
G3D::int16 y
Definition: Vector2int16.h:38
void DoCast(uint32 spellId)
Definition: UnitAI.cpp:101
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
Definition: ObjectAccessor.cpp:174
Definition: boss_illidan.cpp:169
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition: Object.cpp:1214
Definition: UpdateFields.h:109
ObjectGuid AkamaGUID
Definition: boss_illidan.cpp:1127
bool SetWalk(bool enable)
Definition: Unit.cpp:15800
Definition: UpdateFields.h:124
ObjectGuid MaievGUID
Definition: boss_illidan.cpp:1137
Definition: Unit.h:662
Definition: boss_illidan.cpp:168
G3D::int16 x
Definition: Vector2int16.h:37
uint32 TalkCount
Definition: boss_illidan.cpp:1133
uint32 GetHealth() const
Definition: Unit.h:1426
void SetInFront(WorldObject const *target)
Definition: Unit.cpp:15771
Definition: Unit.h:299
Phase
Definition: boss_kiljaeden.cpp:153
Definition: Unit.h:698
uint32 DealDamage(Unit *victim, uint32 damage, CleanDamage const *cleanDamage=NULL, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=NULL, bool durabilityLoss=true)
Definition: Unit.cpp:613
Definition: boss_urom.cpp:72

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void boss_illidan_stormrage::boss_illidan_stormrageAI::HandleTransformSequence ( )
inline
892  {
895 
898 
899  if (DemonTransformation[TransformCount].displayid)
900  me->SetDisplayId(DemonTransformation[TransformCount].displayid); // It's morphin time!
901 
903  {
904  // Requip warglaives if needed
907  }
908  else
909  {
910  // Unequip warglaives if needed
912  }
913 
914  switch (TransformCount)
915  {
916  case 2:
917  DoResetThreat();
918  break;
919  case 4:
921  break;
922  case 7:
923  DoResetThreat();
924  break;
925  case 9:
926  if (!MaievGUID.IsEmpty())
927  EnterPhase(PHASE_NORMAL_MAIEV); // Depending on whether we summoned Maiev, we switch to either phase 5 or 3
928  else
930  break;
931  default:
932  break;
933  }
936  ++TransformCount;
937  }
Definition: boss_illidan.cpp:213
void EnterPhase(PhaseIllidan NextPhase)
Definition: boss_illidan.cpp:634
Definition: UpdateFields.h:146
void SetEquipmentSlots(bool loadDefault, int32 mainHand=EQUIP_NO_CHANGE, int32 offHand=EQUIP_NO_CHANGE, int32 ranged=EQUIP_NO_CHANGE)
Definition: ScriptedCreature.cpp:364
Definition: boss_illidan.cpp:132
Definition: boss_illidan.cpp:166
static const Animation DemonTransformation[10]
Definition: boss_illidan.cpp:352
Definition: boss_illidan.cpp:131
Definition: CreatureAI.h:63
Creature *const me
Definition: CreatureAI.h:71
void SetByteValue(uint16 index, uint8 offset, uint8 value)
Definition: Object.cpp:1080
Definition: boss_illidan.cpp:167
void DoCast(uint32 spellId)
Definition: UnitAI.cpp:101
Definition: boss_illidan.cpp:171
uint32 timer
Definition: boss_illidan.cpp:348
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3586
void DoResetThreat()
Definition: ScriptedCreature.cpp:248
void SetDisplayId(uint32 modelId) override
Definition: Creature.cpp:2664
ObjectGuid MaievGUID
Definition: boss_illidan.cpp:1137
Definition: boss_illidan.cpp:168
uint32 TransformCount
Definition: boss_illidan.cpp:1134
Definition: Unit.h:299
Phase
Definition: boss_kiljaeden.cpp:153
bool IsEmpty() const
Definition: ObjectGuid.h:242
uint32 Timer[EVENT_ENRAGE+1]
Definition: boss_illidan.cpp:1128
Definition: CreatureAI.h:64

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void boss_illidan_stormrage::boss_illidan_stormrageAI::Initialize ( void  )
inline
486  {
487  MaievGUID.Clear();
488  for (uint8 i = 0; i < 2; ++i)
489  {
490  FlameGUID[i].Clear();
491  GlaiveGUID[i].Clear();
492  }
493 
495  Event = EVENT_NULL;
496  Timer[EVENT_BERSERK] = 1500000;
497 
498  HoverPoint = 0;
499  TalkCount = 0;
500  FlightCount = 0;
501  TransformCount = 0;
502  }
Definition: boss_illidan.cpp:163
uint32 HoverPoint
Definition: boss_illidan.cpp:1136
uint32 FlightCount
Definition: boss_illidan.cpp:1135
ObjectGuid GlaiveGUID[2]
Definition: boss_illidan.cpp:1139
ObjectGuid FlameGUID[2]
Definition: boss_illidan.cpp:1138
Definition: boss_illidan.cpp:189
EventIllidan Event
Definition: boss_illidan.cpp:1132
Definition: boss_illidan.cpp:188
void Clear()
Definition: ObjectGuid.h:215
uint8_t uint8
Definition: Define.h:152
ObjectGuid MaievGUID
Definition: boss_illidan.cpp:1137
uint32 TalkCount
Definition: boss_illidan.cpp:1133
uint32 TransformCount
Definition: boss_illidan.cpp:1134
Phase
Definition: boss_kiljaeden.cpp:153
uint32 Timer[EVENT_ENRAGE+1]
Definition: boss_illidan.cpp:1128

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void boss_illidan_stormrage::boss_illidan_stormrageAI::JustDied ( Unit )
inlineoverridevirtual

Reimplemented from ScriptedAI.

561  {
563 
565 
566  for (uint8 i = DATA_GO_ILLIDAN_DOOR_R; i < DATA_GO_ILLIDAN_DOOR_L + 1; ++i)
568  }
Definition: black_temple.h:50
Definition: inflate.h:49
Definition: black_temple.h:51
Creature *const me
Definition: CreatureAI.h:71
InstanceScript * instance
Definition: boss_illidan.cpp:1131
virtual ObjectGuid GetGuidData(uint32 type) const override
Definition: InstanceScript.cpp:93
void HandleGameObject(ObjectGuid guid, bool open, GameObject *go=nullptr)
Definition: InstanceScript.cpp:397
virtual bool SetBossState(uint32 id, EncounterState state)
Definition: InstanceScript.cpp:273
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition: Object.cpp:1214
Definition: UpdateFields.h:109
uint8_t uint8
Definition: Define.h:152
Definition: Unit.h:698
Definition: black_temple.h:37

+ Here is the call graph for this function:

void boss_illidan_stormrage::boss_illidan_stormrageAI::JustSummoned ( Creature summon)
overridevirtual

Reimplemented from ScriptedAI.

1835 {
1836  Summons.Summon(summon);
1837  switch (summon->GetEntry())
1838  {
1839  case PARASITIC_SHADOWFIEND:
1840  {
1841  if (Phase == PHASE_TALK_SEQUENCE)
1842  {
1843  summon->SetVisible(false);
1844  summon->setDeathState(JUST_DIED);
1845  return;
1846  }
1847  Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0, 999, true);
1848  if (!target || target->HasAura(SPELL_PARASITIC_SHADOWFIEND)
1850  target = SelectTarget(SELECT_TARGET_RANDOM, 0, 999, true);
1851  if (target)
1852  summon->AI()->AttackStart(target);
1853  }
1854  break;
1855  case SHADOW_DEMON:
1856  if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 999, true)) // only on players.
1857  {
1858  summon->AddThreat(target, 5000000.0f);
1859  summon->AI()->AttackStart(target);
1860  }
1861  break;
1862  case MAIEV_SHADOWSONG:
1863  {
1864  summon->SetVisible(false); // Leave her invisible until she has to talk
1866  MaievGUID = summon->GetGUID();
1867  ENSURE_AI(boss_maiev_shadowsong::boss_maievAI, summon->AI())->GetIllidanGUID(me->GetGUID());
1868  summon->AI()->DoAction(PHASE_TALK_SEQUENCE);
1869  }
1870  break;
1871  case FLAME_OF_AZZINOTH:
1872  {
1873  summon->AI()->AttackStart(summon->SelectNearestTarget(999));
1874  }
1875  break;
1876  default:
1877  break;
1878  }
1879 }
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4240
void AddThreat(Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=NULL)
Definition: Unit.cpp:10691
Definition: UnitAI.h:36
Definition: Unit.h:674
Definition: boss_illidan.cpp:66
Definition: Unit.h:542
Unit * SelectNearestTarget(float dist=0, bool playerOnly=false) const
Definition: Creature.cpp:1944
Definition: boss_illidan.cpp:148
void SetFlag(uint16 index, uint32 newFlag)
Definition: Object.cpp:1199
Creature *const me
Definition: CreatureAI.h:71
#define ENSURE_AI(a, b)
Definition: ScriptedCreature.h:29
void setDeathState(DeathState s) override
Definition: Creature.cpp:1624
Definition: UnitAI.h:35
CreatureAI * AI() const
Definition: Creature.h:525
Unit * SelectTarget(SelectAggroTarget targetType, uint32 position=0, float dist=0.0f, bool playerOnly=false, int32 aura=0)
Definition: UnitAI.cpp:91
void SetVisible(bool x)
Definition: Unit.cpp:10368
Definition: boss_illidan.cpp:149
virtual void DoAction(int32)
Definition: UnitAI.h:138
Definition: boss_illidan.cpp:169
ObjectGuid const & GetGUID() const
Definition: Object.h:105
Definition: UpdateFields.h:109
Definition: boss_illidan.cpp:1157
ObjectGuid MaievGUID
Definition: boss_illidan.cpp:1137
Definition: boss_illidan.cpp:156
uint32 GetEntry() const
Definition: Object.h:107
Definition: Unit.h:1305
Phase
Definition: boss_kiljaeden.cpp:153
virtual void AttackStart(Unit *)
Definition: UnitAI.cpp:29
Definition: boss_urom.cpp:72
Definition: boss_illidan.cpp:147
Definition: boss_illidan.cpp:65

+ Here is the call graph for this function:

void boss_illidan_stormrage::boss_illidan_stormrageAI::KilledUnit ( Unit victim)
inlineoverridevirtual

Reimplemented from ScriptedAI.

571  {
572  if (victim->GetTypeId() != TYPEID_PLAYER)
573  return;
574 
576  }
void Talk(uint32 count)
Definition: boss_illidan.cpp:611
Definition: boss_illidan.cpp:46
TypeID GetTypeId() const
Definition: Object.h:113
Definition: ObjectGuid.h:33

+ Here is the call graph for this function:

void boss_illidan_stormrage::boss_illidan_stormrageAI::MoveInLineOfSight ( Unit )
inlineoverridevirtual

Reimplemented from CreatureAI.

557 { }
void boss_illidan_stormrage::boss_illidan_stormrageAI::MovementInform ( uint32  ,
uint32   
)
inlineoverridevirtual

Reimplemented from CreatureAI.

526  {
527  if (FlightCount == 7) // change hover point
528  {
529  if (me->GetVictim())
530  {
531  me->SetInFront(me->GetVictim());
532  me->StopMoving();
533  }
535  }
536  else // handle flight sequence
538  }
void EnterPhase(PhaseIllidan NextPhase)
Definition: boss_illidan.cpp:634
uint32 FlightCount
Definition: boss_illidan.cpp:1135
Definition: boss_illidan.cpp:165
Creature *const me
Definition: CreatureAI.h:71
Unit * GetVictim() const
Definition: Unit.h:1379
Definition: boss_illidan.cpp:212
void SetInFront(WorldObject const *target)
Definition: Unit.cpp:15771
void StopMoving()
-------—End of Pet responses methods-------—
Definition: Unit.cpp:12743
uint32 Timer[EVENT_ENRAGE+1]
Definition: boss_illidan.cpp:1128

+ Here is the call graph for this function:

void boss_illidan_stormrage::boss_illidan_stormrageAI::Reset ( )
overridevirtual

Reimplemented from ScriptedAI.

1811 {
1813 
1815  {
1816  if (!akama->IsAlive())
1817  akama->Respawn();
1818  else
1819  akama->AI()->EnterEvadeMode();
1820  }
1821 
1822  Initialize();
1823 
1829  me->SetDisableGravity(false);
1830  me->setActive(false);
1831  Summons.DespawnAll();
1832 }
Definition: Unit.h:674
void SetEquipmentSlots(bool loadDefault, int32 mainHand=EQUIP_NO_CHANGE, int32 offHand=EQUIP_NO_CHANGE, int32 ranged=EQUIP_NO_CHANGE)
Definition: ScriptedCreature.cpp:364
void setActive(bool isActiveObject)
Definition: Object.cpp:1473
Definition: boss_illidan.cpp:136
Definition: Creature.h:467
bool SetDisableGravity(bool disable, bool packetOnly=false)
Definition: Unit.cpp:15818
void SetFlag(uint16 index, uint32 newFlag)
Definition: Object.cpp:1199
Definition: Unit.h:681
void Initialize()
Definition: boss_illidan.cpp:485
Definition: CreatureAI.h:63
Creature *const me
Definition: CreatureAI.h:71
InstanceScript * instance
Definition: boss_illidan.cpp:1131
Definition: InstanceScript.h:58
virtual bool SetBossState(uint32 id, EncounterState state)
Definition: InstanceScript.cpp:273
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
Definition: ObjectAccessor.cpp:174
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition: Object.cpp:1214
void SetDisplayId(uint32 modelId) override
Definition: Creature.cpp:2664
Definition: UpdateFields.h:109
ObjectGuid AkamaGUID
Definition: boss_illidan.cpp:1127
Definition: Unit.h:698
Definition: boss_urom.cpp:72
Definition: black_temple.h:37
Definition: CreatureAI.h:64

+ Here is the call graph for this function:

void boss_illidan_stormrage::boss_illidan_stormrageAI::SpellHit ( Unit ,
const SpellInfo spell 
)
inlineoverridevirtual

Reimplemented from ScriptedAI.

587  {
588  if (spell->Id == SPELL_GLAIVE_RETURNS) // Re-equip our warblades!
589  {
590  if (!me->GetVirtualItemId(0))
592  else
595  }
596  }
uint32 Id
Definition: SpellInfo.h:329
Definition: UpdateFields.h:146
void SetEquipmentSlots(bool loadDefault, int32 mainHand=EQUIP_NO_CHANGE, int32 offHand=EQUIP_NO_CHANGE, int32 ranged=EQUIP_NO_CHANGE)
Definition: ScriptedCreature.cpp:364
Definition: boss_illidan.cpp:132
Definition: boss_illidan.cpp:131
Definition: CreatureAI.h:63
Creature *const me
Definition: CreatureAI.h:71
uint32 GetVirtualItemId(uint32 slot) const
Definition: Unit.cpp:16419
void SetByteValue(uint16 index, uint8 offset, uint8 value)
Definition: Object.cpp:1080
Definition: boss_illidan.cpp:73
Definition: Unit.h:299
Definition: CreatureAI.h:64

+ Here is the call graph for this function:

void boss_illidan_stormrage::boss_illidan_stormrageAI::SummonedCreatureDespawn ( Creature summon)
inlineoverridevirtual

Reimplemented from ScriptedAI.

509  {
510  if (summon->GetCreatureTemplate()->Entry == FLAME_OF_AZZINOTH)
511  {
512  for (uint8 i = 0; i < 2; ++i)
513  if (summon->GetGUID() == FlameGUID[i])
514  FlameGUID[i].Clear();
515 
516  if (!FlameGUID[0] && !FlameGUID[1] && Phase != PHASE_ILLIDAN_NULL)
517  {
520  }
521  }
522  Summons.Despawn(summon);
523  }
void EnterPhase(PhaseIllidan NextPhase)
Definition: boss_illidan.cpp:634
Definition: boss_illidan.cpp:163
Creature *const me
Definition: CreatureAI.h:71
CreatureTemplate const * GetCreatureTemplate() const
Definition: Creature.h:558
ObjectGuid FlameGUID[2]
Definition: boss_illidan.cpp:1138
uint32 Entry
Definition: Creature.h:81
ObjectGuid const & GetGUID() const
Definition: Object.h:105
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition: Unit.cpp:2916
uint8_t uint8
Definition: Define.h:152
Definition: boss_illidan.cpp:170
Phase
Definition: boss_kiljaeden.cpp:153
Definition: boss_urom.cpp:72
Definition: boss_illidan.cpp:147

+ Here is the call graph for this function:

void boss_illidan_stormrage::boss_illidan_stormrageAI::SummonFlamesOfAzzinoth ( )
inline
758  {
760 
761  for (uint8 i = 0; i < 2; ++i)
762  {
764  {
766  {
767  flame->setFaction(me->getFaction()); // Just in case the database has it as a different faction
768  flame->SetMeleeDamageSchool(SPELL_SCHOOL_FIRE);
769  FlameGUID[i] = flame->GetGUID(); // Record GUID in order to check if they're dead later on to move to the next phase
770  ENSURE_AI(npc_flame_of_azzinoth::flame_of_azzinothAI, flame->AI())->SetGlaiveGUID(GlaiveGUID[i]);
771  glaive->CastSpell(flame, SPELL_AZZINOTH_CHANNEL, false); // Glaives do some random Beam type channel on it.
772  }
773  }
774  }
775  }
float x
Definition: Vector3.h:62
uint32 getFaction() const
Definition: Unit.h:1466
G3D::Vector3 const GlaivePosition[4]
Definition: boss_illidan.cpp:309
void Talk(uint32 count)
Definition: boss_illidan.cpp:611
Definition: Creature.h:467
float y
Definition: Vector3.h:62
ObjectGuid GlaiveGUID[2]
Definition: boss_illidan.cpp:1139
Creature *const me
Definition: CreatureAI.h:71
#define ENSURE_AI(a, b)
Definition: ScriptedCreature.h:29
ObjectGuid FlameGUID[2]
Definition: boss_illidan.cpp:1138
Definition: SharedDefines.h:276
Definition: boss_illidan.cpp:100
Definition: boss_illidan.cpp:371
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
Definition: ObjectAccessor.cpp:174
float z
Definition: Vector3.h:62
Definition: boss_illidan.cpp:48
Definition: Object.h:59
uint8_t uint8
Definition: Define.h:152
Definition: boss_illidan.cpp:147
TempSummon * SummonCreature(uint32 id, Position const &pos, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0) const
Definition: Object.cpp:2346

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void boss_illidan_stormrage::boss_illidan_stormrageAI::SummonMaiev ( )
inline
778  {
779  DoCast(me, SPELL_SHADOW_PRISON, true);
780  DoCast(me, SPELL_SUMMON_MAIEV, true);
781  if (!MaievGUID) // If Maiev cannot be summoned, reset the encounter and post some errors to the console.
782  {
783  EnterEvadeMode();
784  TC_LOG_ERROR("scripts", "SD2 ERROR: Unable to summon Maiev Shadowsong (entry: 23197). Check your database to see if you have the proper SQL for Maiev Shadowsong (entry: 23197)");
785  }
786  }
Definition: boss_illidan.cpp:86
virtual void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
Definition: CreatureAI.cpp:168
Creature *const me
Definition: CreatureAI.h:71
void DoCast(uint32 spellId)
Definition: UnitAI.cpp:101
ObjectGuid MaievGUID
Definition: boss_illidan.cpp:1137
#define TC_LOG_ERROR(filterType__,...)
Definition: Log.h:207
Definition: boss_illidan.cpp:90

+ Here is the call graph for this function:

void boss_illidan_stormrage::boss_illidan_stormrageAI::Talk ( uint32  count)
inline
612  {
613  Timer[EVENT_TALK_SEQUENCE] = Conversation[count].timer;
614 
615  Creature* creature = NULL;
616  if (Conversation[count].creature == ILLIDAN_STORMRAGE)
617  creature = me;
618  else if (Conversation[count].creature == AKAMA)
619  creature = (ObjectAccessor::GetCreature((*me), AkamaGUID));
620  else if (Conversation[count].creature == MAIEV_SHADOWSONG)
621  creature = (ObjectAccessor::GetCreature((*me), MaievGUID));
622 
623  if (creature)
624  {
625  if (Conversation[count].emote)
626  creature->HandleEmoteCommand(Conversation[count].emote); // Make the Creature do some animation!
627  if (Conversation[count].text.size())
628  creature->Yell(Conversation[count].text.c_str(), LANG_UNIVERSAL); // Have the Creature yell out some text
629  if (Conversation[count].sound)
630  DoPlaySoundToSet(creature, Conversation[count].sound); // Play some sound on the creature
631  }
632  }
Definition: SharedDefines.h:961
Definition: boss_illidan.cpp:148
arena_t NULL
Definition: jemalloc_internal.h:624
Definition: Creature.h:467
void DoPlaySoundToSet(WorldObject *source, uint32 soundId)
Definition: ScriptedCreature.cpp:163
Creature *const me
Definition: CreatureAI.h:71
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
Definition: ObjectAccessor.cpp:174
Definition: boss_illidan.cpp:144
virtual void Yell(std::string const &text, Language language, WorldObject const *target=nullptr)
Definition: Unit.cpp:16398
Definition: boss_illidan.cpp:145
Definition: boss_illidan.cpp:211
ObjectGuid AkamaGUID
Definition: boss_illidan.cpp:1127
ObjectGuid MaievGUID
Definition: boss_illidan.cpp:1137
void HandleEmoteCommand(uint32 anim_id)
Definition: Unit.cpp:1444
uint32 Timer[EVENT_ENRAGE+1]
Definition: boss_illidan.cpp:1128

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI ( uint32  diff)
inlineoverridevirtual

Reimplemented from ScriptedAI.

940  {
941  if ((!UpdateVictim()) && Phase < PHASE_TALK_SEQUENCE)
942  return;
943 
944  Event = EVENT_NULL;
945  for (int32 i = 1; i <= MaxTimer[Phase]; ++i)
946  {
947  if (Timer[i]) // Event is enabled
948  {
949  if (Timer[i] <= diff)
950  {
951  if (!Event) // No event with higher priority
952  Event = (EventIllidan)i;
953  }
954  else Timer[i] -= diff;
955  }
956  }
957 
958  switch (Phase)
959  {
960  case PHASE_NORMAL:
961  if (HealthBelowPct(65))
963  break;
964 
965  case PHASE_NORMAL_2:
966  if (HealthBelowPct(30))
968  break;
969 
970  case PHASE_NORMAL_MAIEV:
971  if (HealthBelowPct(1))
973  break;
974 
975  case PHASE_TALK_SEQUENCE:
976  if (Event == EVENT_TALK_SEQUENCE)
978  break;
979 
983  break;
984 
988  break;
989  default:
990  break;
991  }
992 
993  if (me->IsNonMeleeSpellCast(false))
994  return;
995 
997  {
998  switch (Event)
999  {
1000  // PHASE_NORMAL
1001  case EVENT_BERSERK:
1003  DoCast(me, SPELL_BERSERK, true);
1004  Timer[EVENT_BERSERK] = 5000; // The buff actually lasts forever.
1005  break;
1006 
1007  case EVENT_TAUNT:
1009  Timer[EVENT_TAUNT] = urand(25000, 35000);
1010  break;
1011 
1012  case EVENT_SHEAR:
1013  // no longer exists in 3.0f.2
1014  // DoCastVictim(SPELL_SHEAR);
1015  Timer[EVENT_SHEAR] = 25000 + (rand32() % 16 * 1000);
1016  break;
1017 
1018  case EVENT_FLAME_CRASH:
1020  Timer[EVENT_FLAME_CRASH] = urand(30000, 40000);
1021  break;
1022 
1024  {
1025  if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 200, true))
1026  DoCast(target, SPELL_PARASITIC_SHADOWFIEND, true);
1027  Timer[EVENT_PARASITIC_SHADOWFIEND] = urand(35000, 45000);
1028  }
1029  break;
1030 
1031  case EVENT_PARASITE_CHECK:
1033  break;
1034 
1035  case EVENT_DRAW_SOUL:
1037  Timer[EVENT_DRAW_SOUL] = urand(50000, 60000);
1038  break;
1039 
1040  // PHASE_NORMAL_2
1044  break;
1045 
1048  break;
1049 
1050  // PHASE_NORMAL_MAIEV
1051  case EVENT_ENRAGE:
1053  Timer[EVENT_ENRAGE] = 0;
1054  break;
1055 
1056  default:
1057  break;
1058  }
1060  }
1061 
1062  if (Phase == PHASE_FLIGHT)
1063  {
1064  switch (Event)
1065  {
1066  case EVENT_FIREBALL:
1068  Timer[EVENT_FIREBALL] = 3000;
1069  break;
1070 
1071  case EVENT_DARK_BARRAGE:
1074  break;
1075 
1076  case EVENT_EYE_BLAST:
1077  CastEyeBlast();
1078  Timer[EVENT_EYE_BLAST] = 0;
1079  break;
1080 
1081  case EVENT_MOVE_POINT:
1083  Timer[EVENT_FLIGHT_SEQUENCE] = 0; // do not start Event when changing hover point
1084  HoverPoint += (rand32() % 3 + 1);
1085  if (HoverPoint > 3)
1086  HoverPoint -= 4;
1088  break;
1089 
1090  default:
1091  break;
1092  }
1093  }
1094 
1095  if (Phase == PHASE_DEMON)
1096  {
1097  switch (Event)
1098  {
1099  case EVENT_SHADOW_BLAST:
1100  me->GetMotionMaster()->Clear(false);
1101  if (me->GetVictim() && (!me->IsWithinDistInMap(me->GetVictim(), 50) || !me->IsWithinLOSInMap(me->GetVictim())))
1102  me->GetMotionMaster()->MoveChase(me->GetVictim(), 30);
1103  else
1104  me->GetMotionMaster()->MoveIdle();
1106  Timer[EVENT_SHADOW_BLAST] = 4000;
1107  break;
1108  case EVENT_SHADOWDEMON:
1110  Timer[EVENT_SHADOWDEMON] = 0;
1111  Timer[EVENT_FLAME_BURST] += 10000;
1112  break;
1113  case EVENT_FLAME_BURST:
1115  Timer[EVENT_FLAME_BURST] = 15000;
1116  break;
1117  case EVENT_TRANSFORM_DEMON:
1119  break;
1120  default:
1121  break;
1122  }
1123  }
1124  }
Definition: boss_illidan.cpp:213
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4240
Definition: boss_illidan.cpp:209
void EnterPhase(PhaseIllidan NextPhase)
Definition: boss_illidan.cpp:634
void MoveIdle()
Definition: MotionMaster.cpp:185
bool UpdateVictim()
Definition: CreatureAI.cpp:233
Definition: boss_illidan.cpp:198
void Clear(bool reset=true)
Definition: MotionMaster.h:138
Definition: boss_illidan.cpp:69
Definition: boss_illidan.cpp:195
void HandleTalkSequence()
Definition: boss_illidan.cpp:1881
bool HealthBelowPct(uint32 pct) const
Definition: ScriptedCreature.h:247
bool IsWithinLOSInMap(WorldObject const *obj) const
Definition: Object.cpp:1584
void MoveChase(Unit *target, float dist=0.0f, float angle=0.0f)
Definition: MotionMaster.cpp:241
void Talk(uint32 count)
Definition: boss_illidan.cpp:611
Definition: boss_illidan.cpp:82
MotionMaster * GetMotionMaster()
Definition: Unit.h:2101
uint32 HoverPoint
Definition: boss_illidan.cpp:1136
Definition: boss_illidan.cpp:166
Definition: boss_illidan.cpp:191
Definition: boss_illidan.cpp:196
Definition: boss_illidan.cpp:194
Definition: boss_illidan.cpp:93
Definition: boss_illidan.cpp:206
Definition: boss_illidan.cpp:197
bool IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
Definition: Unit.cpp:2886
PhaseIllidan Phase
Definition: boss_illidan.cpp:1129
Definition: boss_illidan.cpp:51
Definition: boss_illidan.cpp:74
Definition: boss_illidan.cpp:165
Definition: boss_illidan.cpp:164
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true) const
Definition: Object.cpp:1663
Definition: boss_illidan.cpp:117
Creature *const me
Definition: CreatureAI.h:71
void MovePoint(uint32 id, Position const &pos, bool generatePath=true)
Definition: MotionMaster.h:172
Definition: boss_illidan.cpp:81
void HandleTransformSequence()
Definition: boss_illidan.cpp:891
Definition: boss_illidan.cpp:192
Definition: boss_illidan.cpp:199
void CastEyeBlast()
Definition: boss_illidan.cpp:719
Definition: boss_illidan.cpp:68
Definition: UnitAI.h:35
Definition: boss_illidan.cpp:64
G3D::Vector3 const HoverPosition[4]
Definition: boss_illidan.cpp:301
Unit * GetVictim() const
Definition: Unit.h:1379
G3D::int16 z
Definition: Vector3int16.h:46
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:45
Definition: boss_illidan.cpp:189
Unit * SelectTarget(SelectAggroTarget targetType, uint32 position=0, float dist=0.0f, bool playerOnly=false, int32 aura=0)
Definition: UnitAI.cpp:91
int32_t int32
Definition: Define.h:146
Definition: boss_illidan.cpp:63
EventIllidan Event
Definition: boss_illidan.cpp:1132
Definition: boss_illidan.cpp:207
G3D::int16 y
Definition: Vector2int16.h:38
Definition: boss_illidan.cpp:167
void DoCast(uint32 spellId)
Definition: UnitAI.cpp:101
Definition: boss_illidan.cpp:188
Definition: boss_illidan.cpp:171
Definition: boss_illidan.cpp:212
static const EventIllidan MaxTimer[9]
Definition: boss_illidan.cpp:226
EventIllidan
Definition: boss_illidan.cpp:186
Definition: boss_illidan.cpp:169
Definition: boss_illidan.cpp:208
Definition: boss_illidan.cpp:75
Definition: boss_illidan.cpp:88
Definition: boss_illidan.cpp:202
Definition: boss_illidan.cpp:211
Definition: boss_illidan.cpp:204
uint32 rand32()
Definition: Random.cpp:64
void DoMeleeAttackIfReady()
Definition: UnitAI.cpp:49
Definition: boss_illidan.cpp:52
Definition: boss_illidan.cpp:193
Definition: boss_illidan.cpp:170
void DoCastVictim(uint32 spellId, bool triggered=false)
Definition: UnitAI.cpp:159
void HandleFlightSequence()
Definition: boss_illidan.cpp:790
Definition: boss_illidan.cpp:168
G3D::int16 x
Definition: Vector2int16.h:37
Definition: Unit.h:1305
Phase
Definition: boss_kiljaeden.cpp:153
Definition: boss_illidan.cpp:203
uint32 Timer[EVENT_ENRAGE+1]
Definition: boss_illidan.cpp:1128
Definition: boss_illidan.cpp:201
Definition: boss_illidan.cpp:65

+ Here is the call graph for this function:

Member Data Documentation

ObjectGuid boss_illidan_stormrage::boss_illidan_stormrageAI::AkamaGUID
EventIllidan boss_illidan_stormrage::boss_illidan_stormrageAI::Event
private
ObjectGuid boss_illidan_stormrage::boss_illidan_stormrageAI::FlameGUID[2]
private
uint32 boss_illidan_stormrage::boss_illidan_stormrageAI::FlightCount
private
ObjectGuid boss_illidan_stormrage::boss_illidan_stormrageAI::GlaiveGUID[2]
private
uint32 boss_illidan_stormrage::boss_illidan_stormrageAI::HoverPoint
private
InstanceScript* boss_illidan_stormrage::boss_illidan_stormrageAI::instance
private
ObjectGuid boss_illidan_stormrage::boss_illidan_stormrageAI::MaievGUID
private
PhaseIllidan boss_illidan_stormrage::boss_illidan_stormrageAI::Phase
SummonList boss_illidan_stormrage::boss_illidan_stormrageAI::Summons
private
uint32 boss_illidan_stormrage::boss_illidan_stormrageAI::TalkCount
private
uint32 boss_illidan_stormrage::boss_illidan_stormrageAI::Timer[EVENT_ENRAGE+1]
uint32 boss_illidan_stormrage::boss_illidan_stormrageAI::TransformCount
private

The documentation for this struct was generated from the following file: