TrinityCore
Loading...
Searching...
No Matches
boss_anubarak_trial.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// Known bugs:
19// Anubarak - underground phase partially not worked
20// - tele after impale hit a permafrost doesn't work (the entire tele spell should be better)
21// Scarab - Kill credit isn't crediting?
22
23#include "ScriptMgr.h"
24#include "InstanceScript.h"
25#include "MotionMaster.h"
26#include "ObjectAccessor.h"
27#include "ScriptedCreature.h"
28#include "SpellAuraEffects.h"
29#include "SpellMgr.h"
30#include "SpellScript.h"
31#include "TemporarySummon.h"
33
48
50{
52 NPC_BURROW = 34862,
53 NPC_BURROWER = 34607,
54 NPC_SCARAB = 34605,
55 NPC_SPIKE = 34660
56};
57
109
110#define SPELL_PERMAFROST_HELPER RAID_MODE<uint32>(66193, 67855, 67856, 67857)
111
117
119{
120 {779.8038f, 150.6580f, 158.1426f, 0},
121 {736.0243f, 113.4201f, 158.0226f, 0},
122 {712.5712f, 160.9948f, 158.4368f, 0},
123 {701.4271f, 126.4740f, 158.0205f, 0},
124 {747.9202f, 155.0920f, 158.0613f, 0},
125 {769.6285f, 121.1024f, 158.0504f, 0},
126};
127
132
140
155
157{
158 // Anub'arak
162
164{
166 {
167 Initialize();
168 }
169
171 {
172 _intro = true;
173 _reachedPhase3 = false;
174 }
175
176 void Reset() override
177 {
178 _Reset();
185 if (IsHeroic())
187
188 if (!IsHeroic())
190
191 Initialize();
193 // clean up spawned Frost Spheres
194 std::list<Creature*> FrostSphereList;
195 me->GetCreatureListWithEntryInGrid(FrostSphereList, NPC_FROST_SPHERE, 150.0f);
196 if (!FrostSphereList.empty())
197 for (std::list<Creature*>::iterator itr = FrostSphereList.begin(); itr != FrostSphereList.end(); ++itr)
198 (*itr)->DespawnOrUnsummon();
199
200 _burrowGUID.clear();
201 }
202
203 void KilledUnit(Unit* who) override
204 {
205 if (who->GetTypeId() == TYPEID_PLAYER)
207 }
208
209 void MoveInLineOfSight(Unit* /*who*/) override
210 {
211 if (!_intro)
212 {
214 _intro = false;
215 }
216 }
217
218 void JustReachedHome() override
219 {
221 //Summon Scarab Swarms neutral at random places
222 for (int i = 0; i < 10; i++)
223 if (Creature* scarab = me->SummonCreature(NPC_SCARAB, AnubarakLoc[1].GetPositionX()+urand(0, 50)-25, AnubarakLoc[1].GetPositionY()+urand(0, 50)-25, AnubarakLoc[1].GetPositionZ()))
224 {
225 scarab->SetFaction(FACTION_PREY);
226 scarab->GetMotionMaster()->MoveRandom(10);
227 }
228 }
229
230 void JustDied(Unit* /*killer*/) override
231 {
232 _JustDied();
234
235 // despawn frostspheres and Burrowers on death
236 std::list<Creature*> AddList;
239 if (!AddList.empty())
240 for (std::list<Creature*>::iterator itr = AddList.begin(); itr != AddList.end(); ++itr)
241 (*itr)->DespawnOrUnsummon();
242 }
243
244 void JustSummoned(Creature* summoned) override
245 {
246 switch (summoned->GetEntry())
247 {
248 case NPC_BURROW:
249 _burrowGUID.push_back(summoned->GetGUID());
250 summoned->SetReactState(REACT_PASSIVE);
251 summoned->CastSpell(summoned, SPELL_CHURNING_GROUND, false);
252 summoned->SetDisplayId(summoned->GetCreatureTemplate()->Modelid2);
253 break;
254 case NPC_SPIKE:
255 summoned->SetDisplayId(summoned->GetCreatureTemplate()->Modelid1);
256 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
257 {
258 summoned->EngageWithTarget(target);
259 Talk(EMOTE_SPIKE, target);
260 }
261 break;
262 default:
263 break;
264 }
265 summons.Summon(summoned);
266 }
267
268 void JustEngagedWith(Unit* who) override
269 {
273
274 // Despawn Scarab Swarms neutral
277
278 // Spawn Burrow
279 for (int i = 0; i < 4; i++)
281
282 // Spawn 6 Frost Spheres at start
283 for (int i = 0; i < 6; i++)
284 if (Unit* summoned = me->SummonCreature(NPC_FROST_SPHERE, SphereSpawn[i]))
285 _sphereGUID[i] = summoned->GetGUID();
286 }
287
288 void UpdateAI(uint32 diff) override
289 {
290 if (!UpdateVictim())
291 return;
292
293 events.Update(diff);
294
296 return;
297
298 while (uint32 eventId = events.ExecuteEvent())
299 {
300 switch (eventId)
301 {
305 return;
307 {
310 me->CastSpell(nullptr, SPELL_PENETRATING_COLD, args);
312 return;
313 }
315 if (IsHeroic() || !_reachedPhase3)
316 {
319 me->CastSpell(nullptr, SPELL_SUMMON_BURROWER, args);
320 }
322 return;
324 {
328 break;
329 }
330 case EVENT_SUBMERGE:
332 {
341 }
342 break;
345 break;
347 {
348 /* WORKAROUND
349 * - The correct implementation is more likely the comment below but it needs spell knowledge
350 */
351 GuidList::iterator i = _burrowGUID.begin();
352 uint32 at = urand(0, _burrowGUID.size()-1);
353 for (uint32 k = 0; k < at; k++)
354 ++i;
355 if (Creature* pBurrow = ObjectAccessor::GetCreature(*me, *i))
356 pBurrow->CastSpell(pBurrow, 66340, false);
357
359
360 /*It seems that this spell have something more that needs to be taken into account
361 //Need more sniff info
362 DoCast(SPELL_SUMMON_BEATLES);
363 // Just to make sure it won't happen again in this phase
364 m_uiSummonScarabTimer = 90*IN_MILLISECONDS;*/
365 break;
366 }
367 case EVENT_EMERGE:
379 if (IsHeroic())
381 return;
383 {
384 uint8 startAt = urand(0, 5);
385 uint8 i = startAt;
386 do
387 {
388 if (Unit* pSphere = ObjectAccessor::GetCreature(*me, _sphereGUID[i]))
389 {
390 if (!pSphere->HasAura(SPELL_FROST_SPHERE))
391 {
393 _sphereGUID[i] = summon->GetGUID();
394 break;
395 }
396 }
397 i = (i + 1) % 6;
398 }
399 while
400 (i != startAt);
402 break;
403 }
404 case EVENT_BERSERK:
406 break;
407 default:
408 break;
409 }
410
412 return;
413 }
414
416 {
417 _reachedPhase3 = true;
421 }
422
425 }
426
427 private:
430 bool _intro;
432};
433
435{
436 npc_swarm_scarab(Creature* creature) : ScriptedAI(creature)
437 {
438 Initialize();
439 _instance = creature->GetInstanceScript();
440 }
441
446
447 void Reset() override
448 {
449 me->SetCorpseDelay(0);
450 Initialize();
453 if (me->IsInCombat())
455 anubarak->AI()->JustSummoned(me);
456 }
457
458 void DoAction(int32 actionId) override
459 {
460 switch (actionId)
461 {
465 break;
466 default:
467 break;
468 }
469 }
470
471 void JustDied(Unit* killer) override
472 {
473 if (killer)
474 DoCast(killer, SPELL_TRAITOR_KING);
475 }
476
477 void UpdateAI(uint32 diff) override
478 {
481
482 if (!UpdateVictim())
483 return;
484
485 /* Bosskillers don't recognize */
486 if (_determinationTimer <= diff)
487 {
490 }
491 else
492 _determinationTimer -= diff;
493
495 }
496
497 private:
500};
501
503{
505 {
506 Initialize();
507 _instance = creature->GetInstanceScript();
508 }
509
511 {
513 }
514
515 void Reset() override
516 {
517 me->SetCorpseDelay(10);
518 Initialize();
523 if (me->IsInCombat())
525 anubarak->AI()->JustSummoned(me);
526 }
527
528 void DoAction(int32 actionId) override
529 {
530 switch (actionId)
531 {
536 break;
537 default:
538 break;
539 }
540 }
541
542 void UpdateAI(uint32 diff) override
543 {
546
548 return;
549
551 return;
552
553 if ((_submergeTimer <= diff) && HealthBelowPct(80))
554 {
556 {
561 }
562 else
563 {
565 {
569 }
570 }
572 }
573 else
574 _submergeTimer -= diff;
575
577 }
578
579 private:
583};
584
586{
587 npc_frost_sphere(Creature* creature) : ScriptedAI(creature) { }
588
596
597 void DamageTaken(Unit* /*who*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
598 {
599 if (me->GetHealth() <= damage)
600 {
601 damage = 0;
602 float floorZ = me->GetPositionZ();
604 if (fabs(me->GetPositionZ() - floorZ) < 0.1f)
605 {
606 // we are close to the ground
612 me->SetObjectScale(2.0f);
613 }
614 else
615 {
616 // we are in air
619 //At hit the ground
622 }
623 }
624 }
625
626 void MovementInform(uint32 type, uint32 pointId) override
627 {
628 if (type != EFFECT_MOTION_TYPE)
629 return;
630
631 switch (pointId)
632 {
638 me->SetObjectScale(2.0f);
639 break;
640 default:
641 break;
642 }
643 }
644};
645
647{
649 {
650 Initialize();
651 }
652
654 {
657 }
658
659 void Reset() override
660 {
661 Initialize();
662 // make sure the spike has everyone on threat list
664 }
665
666 bool CanAIAttack(Unit const* victim) const override
667 {
668 return victim->GetTypeId() == TYPEID_PLAYER;
669 }
670
671 void JustEngagedWith(Unit* who) override
672 {
673 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
674 {
675 StartChase(target);
676 Talk(EMOTE_SPIKE, who);
677 }
678 }
679
680 void DamageTaken(Unit* /*who*/, uint32& uiDamage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
681 {
682 uiDamage = 0;
683 }
684
685 void UpdateAI(uint32 diff) override
686 {
687 if (!UpdateVictim())
688 {
690 return;
691 }
692
694 {
695 if (_phaseSwitchTimer <= diff)
696 {
697 switch (_phase)
698 {
703 if (Unit* target2 = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
704 {
705 StartChase(target2);
706 Talk(EMOTE_SPIKE, target2);
707 }
709 return;
714 return;
719 return;
720 default:
721 return;
722 }
723 }
724 else
725 _phaseSwitchTimer -= diff;
726 }
727 }
728
729 void MoveInLineOfSight(Unit* pWho) override
730 {
731 if (!pWho)
732 return;
733
734 if (pWho->GetEntry() != NPC_FROST_SPHERE)
735 return;
736
738 return;
739
740 if (me->IsWithinDist(pWho, 7.0f))
741 {
742 switch (_phase)
743 {
746 break;
749 break;
752 break;
753 default:
754 break;
755 }
756
758
759 pWho->ToCreature()->DespawnOrUnsummon(3s);
760
761 // After the spikes hit the icy surface they can't move for about ~5 seconds
764 SetCombatMovement(false);
767 }
768 }
769
770 void StartChase(Unit* who)
771 {
772 DoCast(who, SPELL_MARK);
773 me->SetSpeedRate(MOVE_RUN, 0.5f);
774 // make sure the Spine will really follow the one he should
777 AddThreat(who, 1000000.0f);
778 AttackStart(who);
779 }
780
781 private:
784};
785
786// 65920 - Pursuing Spikes
787// 65922 - Pursuing Spikes
788// 65923 - Pursuing Spikes
790{
792
793 bool Validate(SpellInfo const* /*spellInfo*/) override
794 {
796 }
797
798 bool Load() override
799 {
801 }
802
803 void PeriodicTick(AuraEffect const* /*aurEff*/)
804 {
805 Unit* permafrostCaster = nullptr;
806 if (Aura* permafrostAura = GetTarget()->GetAura(sSpellMgr->GetSpellIdForDifficulty(SPELL_PERMAFROST, GetTarget())))
807 permafrostCaster = permafrostAura->GetCaster();
808
809 if (permafrostCaster)
810 {
812
813 if (Creature* permafrostCasterCreature = permafrostCaster->ToCreature())
814 permafrostCasterCreature->DespawnOrUnsummon(3s);
815
818 if (Creature* targetCreature = GetTarget()->ToCreature())
819 targetCreature->DisappearAndDie();
820 }
821 }
822
827};
828
829// 65919 - Impale
831{
833
835 {
836 Unit* target = GetHitUnit();
837 uint32 permafrost = sSpellMgr->GetSpellIdForDifficulty(SPELL_PERMAFROST, target);
838
839 // make sure Impale doesnt do damage if we are standing on permafrost
840 if (target && target->HasAura(permafrost))
842 }
843
848};
849
850// 66118, 67630, 68646, 68647 - Leeching Swarm
852{
854
855 bool Validate(SpellInfo const* /*spell*/) override
856 {
858 }
859
861 {
862 Unit* caster = GetCaster();
863 if (Unit* target = GetTarget())
864 {
865 int32 lifeLeeched = target->CountPctFromCurHealth(aurEff->GetAmount());
866 if (lifeLeeched < 250)
867 lifeLeeched = 250;
869 args.AddSpellMod(SPELLVALUE_BASE_POINT0, lifeLeeched);
870 // Damage
871 caster->CastSpell(target, SPELL_LEECHING_SWARM_DMG, args);
872 // Heal
873 caster->CastSpell(caster, SPELL_LEECHING_SWARM_HEAL, args);
874 }
875 }
876
881};
882
@ IN_MILLISECONDS
Definition Common.h:35
TC_GAME_API bool InstanceHasScript(WorldObject const *obj, char const *scriptName)
uint8_t uint8
Definition Define.h:135
int32_t int32
Definition Define.h:129
uint32_t uint32
Definition Define.h:133
@ IN_PROGRESS
@ FAIL
@ EFFECT_MOTION_TYPE
std::list< ObjectGuid > GuidList
Definition ObjectGuid.h:261
@ TYPEID_PLAYER
Definition ObjectGuid.h:39
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:42
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1128
SpellEffIndex
@ EFFECT_0
@ SPELL_EFFECT_SCHOOL_DAMAGE
@ EMOTE_ONESHOT_FLYDEATH
@ FACTION_PREY
@ SPELL_AURA_PERIODIC_DUMMY
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
@ SPELLVALUE_MAX_TARGETS
@ SPELLVALUE_BASE_POINT0
#define sSpellMgr
Definition SpellMgr.h:738
#define SpellEffectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
@ REACT_PASSIVE
@ MOVE_RUN
@ UNIT_FLAG_NON_ATTACKABLE
@ UNIT_FLAG_UNINTERACTIBLE
@ UNIT_STATE_CASTING
Definition Unit.h:235
DamageEffectType
Definition Unit.h:352
@ DATA_ANUBARAK
Definition azjol_nerub.h:33
#define SPELL_PERMAFROST_HELPER
@ EMOTE_BURROWER
@ EMOTE_SUBMERGE
@ EMOTE_LEECHING_SWARM
@ SAY_KILL_PLAYER
@ SAY_LEECHING_SWARM
void AddSC_boss_anubarak_trial()
@ ACTION_SCARAB_SUBMERGE
@ ACTION_SHADOW_STRIKE
@ PHASE_SUBMERGED
@ SPELL_CLEAR_ALL_DEBUFFS
@ SPELL_FREEZE_SLASH
@ SPELL_SUBMERGE_ANUBARAK
@ SPELL_LEECHING_SWARM
@ SPELL_EMERGE_ANUBARAK
@ SPELL_FROST_SPHERE
@ SPELL_EXPOSE_WEAKNESS
@ SPELL_SUMMON_BURROWER
@ SPELL_SPIKE_CALL
@ SPELL_SUMMON_BEATLES
@ SPELL_DETERMINATION
@ SPELL_CHURNING_GROUND
@ SPELL_SPIKE_TRAIL
@ SPELL_EMERGE_EFFECT
@ SPELL_SPIKE_SPEED2
@ SPELL_SHADOW_STRIKE
@ SPELL_SPIKE_TELE
@ SPELL_SUBMERGE_EFFECT
@ SPELL_PERSISTENT_DIRT
@ SPELL_AWAKENED
@ SPELL_SPIDER_FRENZY
@ SPELL_SPIKE_FAIL
@ SUMMON_FROSTSPHERE
@ SPELL_LEECHING_SWARM_HEAL
@ SPELL_LEECHING_SWARM_DMG
@ SPELL_PENETRATING_COLD
@ SPELL_PERMAFROST_VISUAL
@ SPELL_SUMMON_SPIKE
@ SPELL_PERMAFROST
@ SPELL_BERSERK
@ SPELL_SPIKE_SPEED3
@ SPELL_SPIKE_SPEED1
@ SPELL_PERMAFROST_MODEL
@ SUMMON_SCARAB
@ SPELL_ACID_MANDIBLE
@ POINT_FALL_GROUND
const Position SphereSpawn[6]
@ NPC_FROST_SPHERE
@ PHASE_IMPALE_NORMAL
@ PHASE_NO_MOVEMENT
@ PHASE_IMPALE_MIDDLE
@ PHASE_IMPALE_FAST
@ EVENT_FREEZE_SLASH
@ EVENT_PURSUING_SPIKE
@ EVENT_SUMMON_NERUBIAN
@ EVENT_SUMMON_SCARAB
@ EVENT_PENETRATING_COLD
@ EVENT_SUMMON_FROST_SPHERE
@ EVENT_NERUBIAN_SHADOW_STRIKE
Yells
int32 GetAmount() const
void PreventDefaultAction()
HookList< EffectPeriodicHandler > OnEffectPeriodic
Unit * GetCaster() const
Aura * GetAura() const
Unit * GetTarget() const
Unit * GetUnitOwner() const
InstanceScript *const instance
void JustEngagedWith(Unit *who) override
SummonList summons
EventMap events
void DoZoneInCombat(Creature *creature=nullptr)
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:82
void SetDisplayId(uint32 modelId) override
void SetObjectScale(float scale) override
void SetReactState(ReactStates st)
Definition Creature.h:119
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
CreatureTemplate const * GetCreatureTemplate() const
Definition Creature.h:186
void SetCorpseDelay(uint32 delay, bool ignoreCorpseDecayRatio=false)
Definition Creature.h:89
void DisappearAndDie()
Definition Creature.h:73
void Update(uint32 time)
Definition EventMap.h:67
EventId ExecuteEvent()
Definition EventMap.cpp:73
bool IsInPhase(PhaseIndex phase) const
Definition EventMap.h:236
void SetPhase(PhaseIndex phase)
Definition EventMap.cpp:28
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:36
virtual bool SetBossState(uint32 id, EncounterState state)
Creature * GetCreature(uint32 type)
EncounterState GetBossState(uint32 id) const
void MoveFall(uint32 id=0)
void MoveRandom(float wanderDistance=0.0f)
static Creature * ToCreature(Object *o)
Definition Object.h:186
TypeID GetTypeId() const
Definition Object.h:93
uint32 GetEntry() const
Definition Object.h:81
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
void PreventHitDamage()
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
void DespawnEntry(uint32 entry)
void Summon(Creature const *summon)
void DoAction(int32 info, Predicate &&predicate, uint16 max=0)
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:54
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:166
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition UnitAI.cpp:96
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:243
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:106
Definition Unit.h:769
ThreatManager & GetThreatManager()
Definition Unit.h:1155
MotionMaster * GetMotionMaster()
Definition Unit.h:1667
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:4535
uint32 GetHealth() const
Definition Unit.h:913
void EngageWithTarget(Unit *who)
Definition Unit.cpp:8292
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3784
void SetSpeedRate(UnitMoveType mtype, float rate)
Definition Unit.cpp:8678
bool HasUnitState(const uint32 f) const
Definition Unit.h:876
void HandleEmoteCommand(Emote emoteId)
Definition Unit.cpp:1568
void RemoveAllAuras()
Definition Unit.cpp:4157
void SetUnitFlag(UnitFlags flags)
Definition Unit.h:954
bool IsInCombat() const
Definition Unit.h:1144
void RemoveUnitFlag(UnitFlags flags)
Definition Unit.h:955
InstanceScript * GetInstanceScript() const
Definition Object.cpp:1087
void GetCreatureListWithEntryInGrid(Container &creatureContainer, uint32 entry, float maxSearchRange=250.0f) const
Definition Object.cpp:3153
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2832
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
Definition Object.cpp:1992
void UpdateGroundPositionZ(float x, float y, float &z) const
Definition Object.cpp:1405
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true) const
Definition Object.cpp:1187
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
void HandleEffectPeriodic(AuraEffect const *aurEff)
PrepareAuraScript(spell_anubarak_leeching_swarm)
bool Validate(SpellInfo const *) override
void HandleDamageCalc(SpellEffIndex)
void Register() override
PrepareSpellScript(spell_impale)
void PeriodicTick(AuraEffect const *)
bool Validate(SpellInfo const *) override
PrepareAuraScript(spell_pursuing_spikes)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
CastSpellExtraArgs & AddSpellMod(SpellValueMod mod, int32 val)
float GetPositionZ() const
Definition Position.h:81
float GetPositionX() const
Definition Position.h:79
float GetPositionY() const
Definition Position.h:80
bool IsHeroic() const
void AttackStart(Unit *) override
void SetCombatMovement(bool allowMovement)
T const & RAID_MODE(T const &normal10, T const &normal25) const
bool HealthBelowPct(uint32 pct) const
void AddThreat(Unit *victim, float amount, Unit *who=nullptr)
void KilledUnit(Unit *who) override
void JustSummoned(Creature *summoned) override
void JustReachedHome() override
void JustDied(Unit *) override
void UpdateAI(uint32 diff) override
void MoveInLineOfSight(Unit *) override
void JustEngagedWith(Unit *who) override
boss_anubarak_trial(Creature *creature)
npc_anubarak_spike(Creature *creature)
void JustEngagedWith(Unit *who) override
PursuingSpikesPhases _phase
void DamageTaken(Unit *, uint32 &uiDamage, DamageEffectType, SpellInfo const *) override
void UpdateAI(uint32 diff) override
void MoveInLineOfSight(Unit *pWho) override
bool CanAIAttack(Unit const *victim) const override
void MovementInform(uint32 type, uint32 pointId) override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
npc_frost_sphere(Creature *creature)
void UpdateAI(uint32 diff) override
void DoAction(int32 actionId) override
npc_nerubian_burrower(Creature *creature)
void UpdateAI(uint32 diff) override
npc_swarm_scarab(Creature *creature)
void DoAction(int32 actionId) override
InstanceScript * _instance
void JustDied(Unit *killer) override
Position const AnubarakLoc[]
@ SPELL_TRAITOR_KING
#define RegisterTrialOfTheCrusaderCreatureAI(ai_name)
#define ToCrScriptName