TrinityCore
boss_sapphiron.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "ScriptMgr.h"
19#include "GameObject.h"
20#include "GameObjectAI.h"
21#include "InstanceScript.h"
22#include "MotionMaster.h"
23#include "naxxramas.h"
24#include "ObjectAccessor.h"
25#include "Player.h"
26#include "ScriptedCreature.h"
27#include "SpellInfo.h"
28#include "SpellScript.h"
29#include "TemporarySummon.h"
30
32{
36 EMOTE_ENRAGE = 3
37};
38
40{
42 SPELL_CLEAVE = 19983,
47 SPELL_FROST_BREATH_ANTICHEAT = 29318, // damage effect ignoring LoS on the entrance platform to prevent cheese
48 SPELL_FROST_BREATH = 28524, // damage effect below sapphiron
49 SPELL_FROST_MISSILE = 30101, // visual only
51 SPELL_DIES = 29357,
57};
58
60{
64};
65
67{
82};
83
84enum Misc
85{
86 NPC_BLIZZARD = 16474,
87 GO_ICEBLOCK = 181247,
88
89 // The Hundred Club
94};
95
96typedef std::map<ObjectGuid, ObjectGuid> IceBlockMap;
97
99{
100public:
101 BlizzardTargetSelector(std::vector<Unit*> const& blizzards) : _blizzards(blizzards) { }
102
103 bool operator()(Unit* unit) const
104 {
105 if (unit->GetTypeId() != TYPEID_PLAYER)
106 return false;
107
108 // Check if unit is target of some blizzard
109 for (Unit* blizzard : _blizzards)
110 if (blizzard->GetAI()->GetGUID(DATA_BLIZZARD_TARGET) == unit->GetGUID())
111 return false;
112
113 return true;
114 }
115
116private:
117 std::vector<Unit*> const& _blizzards;
118};
119
120struct boss_sapphiron : public BossAI
121{
123 BossAI(creature, BOSS_SAPPHIRON)
124 {
125 Initialize();
126 }
127
129 {
130 _delayedDrain = false;
131 _canTheHundredClub = true;
132 }
133
134 void InitializeAI() override
135 {
137 return;
138
139 _canTheHundredClub = true;
140
142 {
143 me->SetVisible(false);
146 }
147
149 }
150
151 void Reset() override
152 {
154 {
157 if (me->IsHovering())
158 {
160 me->SetHover(false);
161 }
162 }
163
164 _Reset();
165 Initialize();
166 }
167
168 void DamageTaken(Unit* /*who*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
169 {
170 if (damage < me->GetHealth() || !events.IsInPhase(PHASE_FLIGHT))
171 return;
172 damage = me->GetHealth()-1; // don't die during air phase
173 }
174
175 void JustEngagedWith(Unit* who) override
176 {
178
180
184 EnterPhaseGround(true);
185 }
186
187 void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
188 {
189 Unit* unitTarget = target->ToUnit();
190 if (!unitTarget)
191 return;
192
193 switch(spellInfo->Id)
194 {
197 _canTheHundredClub = false;
198 break;
199 }
200 }
201
202 void JustDied(Unit* /*killer*/) override
203 {
204 _JustDied();
205 me->CastSpell(me, SPELL_DIES, true);
206 }
207
208 void MovementInform(uint32 /*type*/, uint32 id) override
209 {
210 if (id == 1)
212 }
213
214 void DoAction(int32 param) override
215 {
216 if (param == ACTION_BIRTH)
217 {
220 }
221 }
222
223 void EnterPhaseGround(bool initial)
224 {
225 me->SetCanMelee(true);
230 if (initial)
231 {
234 }
235 else
237 }
238
239 inline void CastDrain()
240 {
243 }
244
245 uint32 GetData(uint32 data) const override
246 {
247 if (data == DATA_THE_HUNDRED_CLUB)
248 return _canTheHundredClub;
249
250 return 0;
251 }
252
253 ObjectGuid GetGUID(int32 data) const override
254 {
255 if (data == DATA_BLIZZARD_TARGET)
256 {
257 // Filtering blizzards from summon list
258 std::vector<Unit*> blizzards;
259 for (ObjectGuid summonGuid : summons)
260 if (summonGuid.GetEntry() == NPC_BLIZZARD)
261 if (Unit* temp = ObjectAccessor::GetUnit(*me, summonGuid))
262 blizzards.push_back(temp);
263
264 if (Unit* newTarget = me->AI()->SelectTarget(SelectTargetMethod::Random, 1, BlizzardTargetSelector(blizzards)))
265 return newTarget->GetGUID();
266 }
267
268 return ObjectGuid::Empty;
269 }
270
271 void UpdateAI(uint32 diff) override
272 {
273 events.Update(diff);
274
276 return;
277
279 {
280 while (uint32 eventId = events.ExecuteEvent())
281 {
282 switch (eventId)
283 {
286 events.Repeat(Seconds(30));
287 return;
288 case EVENT_GROUND:
289 EnterPhaseGround(false);
290 return;
291 case EVENT_BERSERK:
294 return;
295 case EVENT_CLEAVE:
298 return;
299 case EVENT_TAIL:
302 return;
303 case EVENT_DRAIN:
304 CastDrain();
305 return;
306 case EVENT_BLIZZARD:
309 break;
310 case EVENT_FLIGHT:
311 if (HealthAbovePct(10))
312 {
313 _delayedDrain = false;
316 me->AttackStop();
317 me->SetCanMelee(false);
318 float x, y, z, o;
319 me->GetHomePosition(x, y, z, o);
320 me->GetMotionMaster()->MovePoint(1, x, y, z);
321 return;
322 }
323 break;
324 }
325 }
326 }
327 else
328 {
329 if (uint32 eventId = events.ExecuteEvent())
330 {
331 switch (eventId)
332 {
335 events.Repeat(Seconds(30));
336 return;
337 case EVENT_LIFTOFF:
338 {
342 me->SetHover(true);
344
345 _iceboltTargets.clear();
346 std::list<Unit*> targets;
347 SelectTargetList(targets, RAID_MODE(2, 3), SelectTargetMethod::Random, 0, 200.0f, true);
348 for (Unit* target : targets)
349 _iceboltTargets.push_back(target->GetGUID());
350 return;
351 }
352 case EVENT_ICEBOLT:
353 {
354 if (_iceboltTargets.empty())
355 {
357 return;
358 }
359 ObjectGuid target = _iceboltTargets.back();
360 if (Player* pTarget = ObjectAccessor::GetPlayer(*me, target))
361 if (pTarget->IsAlive())
362 DoCast(pTarget, SPELL_ICEBOLT);
363 _iceboltTargets.pop_back();
364
365 if (_iceboltTargets.empty())
367 else
369 return;
370 }
371 case EVENT_BREATH:
372 {
376 return;
377 }
378 case EVENT_EXPLOSION:
383 return;
384 case EVENT_LAND:
386 if (_delayedDrain)
387 CastDrain();
390 me->SetHover(false);
393 return;
394 case EVENT_BIRTH:
395 me->SetVisible(true);
398 return;
399 case EVENT_DRAIN:
400 _delayedDrain = true;
401 break;
402 }
403 }
404 }
405 }
406
407private:
411};
412
414{
415 npc_sapphiron_blizzard(Creature* creature) : ScriptedAI(creature) { }
416
417 void Reset() override
418 {
420 _scheduler.Schedule(Seconds(3), [this](TaskContext chill)
421 {
422 DoCastSelf(me->m_spells[0], true);
423 chill.Repeat();
424 });
425 }
426
427 ObjectGuid GetGUID(int32 data) const override
428 {
430 }
431
432 void SetGUID(ObjectGuid const& guid, int32 id) override
433 {
434 if (id == DATA_BLIZZARD_TARGET)
435 _targetGuid = guid;
436 }
437
438 void UpdateAI(uint32 diff) override
439 {
440 _scheduler.Update(diff);
441 }
442
443private:
446};
447
449{
451
452 void InitializeAI() override
453 {
455 }
456
457 void JustAppeared() override
458 {
461 }
462};
463
465{
466 go_sapphiron_birth(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
467
468 void OnLootStateChanged(uint32 state, Unit* who) override
469 {
470 if (state == GO_ACTIVATED)
471 {
472 if (who)
473 {
475 sapphiron->AI()->DoAction(ACTION_BIRTH);
477 }
478 }
479 else if (state == GO_JUST_DEACTIVATED)
480 { // prevent ourselves from going back to _READY and resetting the client anim
481 me->SetRespawnTime(0);
482 me->Delete();
483 }
484 }
485
487};
488
489// 24780 - Dream Fog
491{
492 void HandlePeriodic(AuraEffect const* /*eff*/)
493 {
495 if (Creature* owner = me ? me->GetSummonerCreatureBase() : nullptr)
496 {
498 if (Unit* newTarget = ObjectAccessor::GetUnit(*owner, owner->AI()->GetGUID(DATA_BLIZZARD_TARGET)))
499 {
500 me->GetAI()->SetGUID(newTarget->GetGUID(), DATA_BLIZZARD_TARGET);
501 me->GetMotionMaster()->MoveFollow(newTarget, 0.1f, 0.0f);
502 }
503 else
504 {
505 me->StopMoving();
506 me->GetMotionMaster()->Clear();
507 }
508 }
509 }
510
511 void Register() override
512 {
514 }
515};
516
517// 28522 - Icebolt
519{
520 void HandleApply(AuraEffect const* /*eff*/, AuraEffectHandleModes /*mode*/)
521 {
523 }
524
525 void HandleRemove(AuraEffect const* /*eff*/, AuraEffectHandleModes /*mode*/)
526 {
527 if (!_block.IsEmpty())
529 oBlock->Delete();
531 }
532
533 void HandlePeriodic(AuraEffect const* /*eff*/)
534 {
535 if (!_block.IsEmpty())
536 return;
537 if (GetTarget()->isMoving())
538 return;
539 float x, y, z;
540 GetTarget()->GetPosition(x, y, z);
541 if (GameObject* block = GetTarget()->SummonGameObject(GO_ICEBLOCK, x, y, z, 0.f, QuaternionData(), 25s))
542 _block = block->GetGUID();
543 }
544
545 void Register() override
546 {
550 }
551
553};
554
555// 28560 - Summon Blizzard
557{
558 bool Validate(SpellInfo const* /*spell*/) override
559 {
561 }
562
563 void HandleDummy(SpellEffIndex /*effIndex*/)
564 {
565 if (Unit* target = GetHitUnit())
566 if (Creature* blizzard = GetCaster()->SummonCreature(NPC_BLIZZARD, *target, TEMPSUMMON_TIMED_DESPAWN, randtime(25s, 30s)))
567 {
568 blizzard->CastSpell(nullptr, blizzard->m_spells[0], TRIGGERED_NONE);
569 if (Creature* creatureCaster = GetCaster()->ToCreature())
570 {
571 blizzard->AI()->SetGUID(ObjectGuid::Empty, DATA_BLIZZARD_TARGET);
572 if (Unit* newTarget = ObjectAccessor::GetUnit(*creatureCaster, creatureCaster->AI()->GetGUID(DATA_BLIZZARD_TARGET)))
573 {
574 blizzard->AI()->SetGUID(newTarget->GetGUID(), DATA_BLIZZARD_TARGET);
575 blizzard->GetMotionMaster()->MoveFollow(newTarget, 0.1f, 0.0f);
576 return;
577 }
578 }
579 blizzard->GetMotionMaster()->MoveFollow(target, 0.1f, 0.0f);
580 }
581 }
582
583 void Register() override
584 {
586 }
587};
588
589// 29330 - Sapphiron's Wing Buffet Despawn
591{
592 void PeriodicTick(AuraEffect const* /*aurEff*/)
593 {
594 Unit* target = GetTarget();
595 if (Creature* creature = target->ToCreature())
596 creature->DespawnOrUnsummon();
597 }
598
599 void Register() override
600 {
602 }
603};
604
605// 29336 - Despawn Buffet
607{
609 {
610 if (Creature* target = GetHitCreature())
611 target->DespawnOrUnsummon();
612 }
613
614 void Register() override
615 {
617 }
618};
619
621{
622 public:
623 achievement_the_hundred_club() : AchievementCriteriaScript("achievement_the_hundred_club") { }
624
625 bool OnCheck(Player* /*source*/, Unit* target) override
626 {
627 return target && target->GetAI()->GetData(DATA_THE_HUNDRED_CLUB);
628 }
629};
630
632{
643}
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
std::chrono::seconds Seconds
Seconds shorthand typedef.
Definition: Duration.h:32
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition: Duration.h:29
std::chrono::minutes Minutes
Minutes shorthand typedef.
Definition: Duration.h:35
@ GO_ACTIVATED
Definition: GameObject.h:158
@ GO_JUST_DEACTIVATED
Definition: GameObject.h:159
@ DONE
@ TEMPSUMMON_TIMED_DESPAWN
Definition: ObjectDefines.h:65
@ TYPEID_PLAYER
Definition: ObjectGuid.h:41
std::vector< ObjectGuid > GuidVector
Definition: ObjectGuid.h:395
Spells
Definition: PlayerAI.cpp:32
Milliseconds randtime(Milliseconds min, Milliseconds max)
Definition: Random.cpp:62
#define RegisterSpellScript(spell_script)
Definition: ScriptMgr.h:1369
SpellEffIndex
Definition: SharedDefines.h:29
@ EFFECT_0
Definition: SharedDefines.h:30
@ EFFECT_2
Definition: SharedDefines.h:32
@ EMOTE_ONESHOT_LAND
@ EMOTE_ONESHOT_LIFTOFF
@ SPELL_SCHOOL_MASK_FROST
@ SPELL_EFFECT_SCRIPT_EFFECT
@ IMMUNITY_DAMAGE
@ SPELL_SCHOOL_FROST
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
@ SPELL_AURA_MOD_STUN
@ TRIGGERED_NONE
Not triggered.
Definition: SpellDefines.h:246
#define SpellEffectFn(F, I, N)
Definition: SpellScript.h:842
#define AuraEffectPeriodicFn(F, I, N)
Definition: SpellScript.h:2046
#define AuraEffectApplyFn(F, I, N, M)
Definition: SpellScript.h:2029
#define AuraEffectRemoveFn(F, I, N, M)
Definition: SpellScript.h:2040
@ REACT_PASSIVE
Definition: UnitDefines.h:506
@ REACT_AGGRESSIVE
Definition: UnitDefines.h:508
DamageEffectType
Definition: UnitDefines.h:131
@ UNIT_FLAG_NON_ATTACKABLE
Definition: UnitDefines.h:145
@ DATA_BLIZZARD_TARGET
@ DATA_THE_HUNDRED_CLUB
@ NPC_BLIZZARD
@ MAX_FROST_RESISTANCE
@ ACTION_BIRTH
@ GO_ICEBLOCK
@ EMOTE_AIR_PHASE
@ EMOTE_BREATH
@ EMOTE_ENRAGE
@ EMOTE_GROUND_PHASE
std::map< ObjectGuid, ObjectGuid > IceBlockMap
@ SPELL_ICEBOLT
@ SPELL_CLEAVE
@ SPELL_FROST_BREATH
@ SPELL_FROST_BREATH_ANTICHEAT
@ SPELL_WING_BUFFET_PERIODIC
@ SPELL_LIFE_DRAIN
@ SPELL_FROST_AURA
@ SPELL_DESPAWN_BUFFET
@ SPELL_DIES
@ SPELL_WING_BUFFET_DESPAWN_PERIODIC
@ SPELL_SUMMON_BLIZZARD
@ SPELL_SUMMON_WING_BUFFET
@ SPELL_FROST_MISSILE
@ SPELL_BERSERK
@ SPELL_TAIL_SWEEP
@ SPELL_CHECK_RESISTS
@ PHASE_BIRTH
@ PHASE_FLIGHT
@ PHASE_GROUND
void AddSC_boss_sapphiron()
@ EVENT_TAIL
@ EVENT_EXPLOSION
@ EVENT_GROUND
@ EVENT_BIRTH
@ EVENT_FLIGHT
@ EVENT_BERSERK
@ EVENT_BREATH
@ EVENT_CHECK_RESISTS
@ EVENT_LIFTOFF
@ EVENT_BLIZZARD
@ EVENT_DRAIN
@ EVENT_CLEAVE
@ EVENT_LAND
@ EVENT_ICEBOLT
Yells
HookList< EffectApplyHandler > AfterEffectRemove
Definition: SpellScript.h:2039
HookList< EffectPeriodicHandler > OnEffectPeriodic
Definition: SpellScript.h:2045
HookList< EffectApplyHandler > AfterEffectApply
Definition: SpellScript.h:2028
Unit * GetTarget() const
bool operator()(Unit *unit) const
BlizzardTargetSelector(std::vector< Unit * > const &blizzards)
std::vector< Unit * > const & _blizzards
InstanceScript *const instance
void JustEngagedWith(Unit *who) override
SummonList summons
EventMap events
void _JustDied()
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
bool UpdateVictim()
Definition: CreatureAI.cpp:245
Creature *const me
Definition: CreatureAI.h:61
void SetCanMelee(bool canMelee, bool fleeFromMelee=false)
Definition: Creature.cpp:2822
uint32 m_spells[MAX_CREATURE_SPELLS]
Definition: Creature.h:302
void GetHomePosition(float &x, float &y, float &z, float &ori) const
Definition: Creature.h:373
void SetReactState(ReactStates st)
Definition: Creature.h:160
CreatureAI * AI() const
Definition: Creature.h:214
uint32 ExecuteEvent()
Definition: EventMap.cpp:73
void Update(uint32 time)
Definition: EventMap.h:56
void Repeat(Milliseconds time)
Definition: EventMap.cpp:63
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition: EventMap.cpp:36
bool IsInPhase(uint8 phase) const
Definition: EventMap.h:217
void SetPhase(uint8 phase)
Definition: EventMap.cpp:28
GameObject *const me
Definition: GameObjectAI.h:50
void Delete()
void SetRespawnTime(int32 respawn)
void DoRemoveAurasDueToSpellOnPlayers(uint32 spell, bool includePets=false, bool includeControlled=false)
virtual ObjectGuid GetGuidData(uint32 type) const override
EncounterState GetBossState(uint32 id) const
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={})
void MoveFollow(Unit *target, float dist, ChaseAngle angle, Optional< Milliseconds > duration={}, MovementSlot slot=MOTION_SLOT_ACTIVE)
static ObjectGuid const Empty
Definition: ObjectGuid.h:274
bool IsEmpty() const
Definition: ObjectGuid.h:319
static Creature * ToCreature(Object *o)
Definition: Object.h:219
static Unit * ToUnit(Object *o)
Definition: Object.h:225
TypeID GetTypeId() const
Definition: Object.h:173
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
uint32 const Id
Definition: SpellInfo.h:325
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Definition: SpellScript.h:162
Creature * GetHitCreature() const
Unit * GetCaster() const
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
Definition: SpellScript.h:840
TaskContext & Repeat(std::chrono::duration< Rep, Period > duration)
TaskScheduler & Schedule(std::chrono::duration< Rep, Period > time, task_handler_t task)
TaskScheduler & Update(success_t const &callback=nullptr)
Creature * GetSummonerCreatureBase() const
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:159
virtual void InitializeAI()
Definition: UnitAI.cpp:43
virtual uint32 GetData(uint32) const
Definition: UnitAI.h:73
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.cpp:180
void SelectTargetList(std::list< Unit * > &targetList, uint32 num, SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition: UnitAI.cpp:84
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition: UnitAI.cpp:79
virtual void SetGUID(ObjectGuid const &, int32=0)
Definition: UnitAI.h:75
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:161
SpellCastResult DoCast(uint32 spellId)
Definition: UnitAI.cpp:89
Definition: Unit.h:627
void ApplySpellImmune(uint32 spellId, SpellImmunity op, uint32 type, bool apply)
Definition: Unit.cpp:7845
void SetVisible(bool x)
Definition: Unit.cpp:8351
MotionMaster * GetMotionMaster()
Definition: Unit.h:1652
bool SetHover(bool enable, bool updateAnimTier=true)
Definition: Unit.cpp:12938
void StopMoving()
Definition: Unit.cpp:10049
TempSummon * ToTempSummon()
Definition: Unit.h:1756
UnitAI * GetAI() const
Definition: Unit.h:660
bool IsHovering() const
Definition: Unit.h:1137
uint64 GetHealth() const
Definition: Unit.h:776
void HandleEmoteCommand(Emote emoteId, Player *target=nullptr, Trinity::IteratorPair< int32 const * > spellVisualKitIds={}, int32 sequenceVariation=0)
Definition: Unit.cpp:1598
void SetUnitFlag(UnitFlags flags)
Definition: Unit.h:833
int32 GetResistance(SpellSchools school) const
Definition: Unit.h:769
bool AttackStop()
Definition: Unit.cpp:5781
void RemoveUnitFlag(UnitFlags flags)
Definition: Unit.h:834
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
virtual uint32 GetData(uint32) const
Definition: ZoneScript.h:91
virtual void SetData(uint32, uint32)
Definition: ZoneScript.h:92
bool OnCheck(Player *, Unit *target) override
void HandlePeriodic(AuraEffect const *)
void HandleScriptEffect(SpellEffIndex)
void HandleRemove(AuraEffect const *, AuraEffectHandleModes)
void HandlePeriodic(AuraEffect const *)
void HandleApply(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
TC_GAME_API GameObject * GetGameObject(WorldObject const &u, ObjectGuid const &guid)
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
@ BOSS_SAPPHIRON
Definition: naxxramas.h:43
#define RegisterNaxxramasGameObjectAI(ai_name)
Definition: naxxramas.h:222
@ DATA_HAD_SAPPHIRON_BIRTH
Definition: naxxramas.h:50
@ DATA_SAPPHIRON
Definition: naxxramas.h:76
#define RegisterNaxxramasCreatureAI(ai_name)
Definition: naxxramas.h:221
constexpr void GetPosition(float &x, float &y) const
Definition: Position.h:81
bool HealthAbovePct(uint32 pct) const
T const & RAID_MODE(T const &normal10, T const &normal25) const
void JustEngagedWith(Unit *who) override
void JustDied(Unit *) override
ObjectGuid GetGUID(int32 data) const override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
boss_sapphiron(Creature *creature)
void EnterPhaseGround(bool initial)
void MovementInform(uint32, uint32 id) override
void InitializeAI() override
uint32 GetData(uint32 data) const override
void UpdateAI(uint32 diff) override
void Reset() override
GuidVector _iceboltTargets
void DoAction(int32 param) override
void SpellHitTarget(WorldObject *target, SpellInfo const *spellInfo) override
InstanceScript * instance
go_sapphiron_birth(GameObject *go)
void OnLootStateChanged(uint32 state, Unit *who) override
void SetGUID(ObjectGuid const &guid, int32 id) override
ObjectGuid GetGUID(int32 data) const override
npc_sapphiron_blizzard(Creature *creature)
void UpdateAI(uint32 diff) override
npc_sapphiron_wing_buffet(Creature *creature)