TrinityCore
Loading...
Searching...
No Matches
boss_kalecgos.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 "Player.h"
24#include "ScriptedCreature.h"
25#include "SpellAuraEffects.h"
26#include "SpellScript.h"
27#include "sunwell_plateau.h"
28#include "TemporarySummon.h"
29#include "WorldSession.h"
30
51
88
107
113
122
128
129Position const KalecgosSummonPos = { 1709.094f, 927.5035f, -74.28364f, 2.932153f };
130Position const FlyPos[2] =
131{
132 { 1704.18f, 927.999f, 57.888f },
133 { 1614.355f, 846.9694f, 119.0971f }
134};
135
145
146struct boss_kalecgos : public BossAI
147{
148 boss_kalecgos(Creature* creature) : BossAI(creature, DATA_KALECGOS), _isEnraged(false), _isBanished(false) { }
149
162
179
181 {
182 std::vector<GameObject*> portals;
184 for (GameObject* portal : portals)
185 portal->Delete();
186 }
187
188 void DoAction(int32 action) override
189 {
190 switch (action)
191 {
194 break;
195 case ACTION_ENRAGE:
196 _isEnraged = true;
199 break;
200 default:
201 break;
202 }
203 }
204
205 void DamageTaken(Unit* who, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
206 {
207 if (damage >= me->GetHealth() && (!who || who->GetGUID() != me->GetGUID()))
208 damage = 0;
209 }
210
211 void JustEngagedWith(Unit* who) override
212 {
216
218 if (Creature* sathrovar = instance->GetCreature(DATA_SATHROVARR))
219 {
220 sathrovar->SetInCombatWith(kalecgosHuman);
221 kalecgosHuman->SetInCombatWith(sathrovar);
222 }
223 }
224
225 void KilledUnit(Unit* who) override
226 {
227 if (who->GetTypeId() == TYPEID_PLAYER && roll_chance_i(50))
229 }
230
231 void MovementInform(uint32 type, uint32 id) override
232 {
233 if (type != POINT_MOTION_TYPE)
234 return;
235
236 switch (id)
237 {
238 case POINT_OUTRO_1:
241 break;
242 case POINT_OUTRO_2:
243 me->SetVisible(false);
245 me->KillSelf();
246 break;
247 default:
248 break;
249 }
250 }
251
252 void UpdateAI(uint32 diff) override
253 {
255 return;
256
257 events.Update(diff);
258
260 return;
261
262 while (uint32 eventId = events.ExecuteEvent())
263 {
264 switch (eventId)
265 {
267 if (roll_chance_i(20))
271 break;
274 events.Repeat(Seconds(15));
275 break;
276 case EVENT_TAIL_LASH:
278 events.Repeat(Seconds(15));
279 break;
280 case EVENT_WILD_MAGIC:
281 DoCastAOE(WildMagicSpells[urand(0, 5)], true);
282 events.Repeat(Seconds(20));
283 break;
286 events.Repeat(Seconds(20), Seconds(25));
287 break;
289 if (!_isEnraged && HealthBelowPct(10))
291
292 if (HealthBelowPct(1))
293 {
294 if (Creature* sathrovarr = instance->GetCreature(DATA_SATHROVARR))
295 {
296 if (sathrovarr->HasAura(SPELL_BANISH))
297 {
298 sathrovarr->CastSpell(sathrovarr, SPELL_TAP_CHECK, true);
299 break;
300 }
301 }
302 if (_isBanished)
303 break;
304
305 _isBanished = true;
307 events.Reset();
308 }
310 break;
312 events.Reset();
314 me->SetRegenerateHealth(false);
318 me->AttackStop();
323 break;
324 case EVENT_OUTRO_1:
325 me->SetDisableGravity(true);
328 break;
329 case EVENT_OUTRO_2:
331 break;
332 case EVENT_OUTRO_3:
335 break;
336 default:
337 break;
338 }
339
341 return;
342 }
343
345 }
346
347private:
350};
351
353{
354 boss_kalecgos_human(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
355
356 void Reset() override
357 {
358 _events.Reset();
360
362 _sathGUID = sath->GetGUID();
363
366 }
367
368 void JustDied(Unit* /*killer*/) override
369 {
371 }
372
373 void DamageTaken(Unit* who, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
374 {
375 if (!who || who->GetGUID() != _sathGUID)
376 damage = 0;
377
379 {
382 }
384 {
387 }
389 {
392 }
393 }
394
395 void UpdateAI(uint32 diff) override
396 {
397 if (!UpdateVictim())
398 return;
399
400 _events.Update(diff);
401
403 return;
404
405 while (uint32 eventId = _events.ExecuteEvent())
406 {
407 switch (eventId)
408 {
409 case EVENT_REVITALIZE:
412 break;
416 break;
417 default:
418 break;
419 }
420
422 return;
423 }
424
426 }
427
428private:
432};
433
435{
436public:
437 CurseAgonySelector(Unit* source) : NonTankTargetSelector(source, true) { }
438
439 bool operator()(WorldObject* target) const
440 {
441 if (Unit* unitTarget = target->ToUnit())
442 return !NonTankTargetSelector::operator()(unitTarget)
443 && !unitTarget->HasAura(SPELL_AGONY_CURSE)
444 && !unitTarget->HasAura(SPELL_AGONY_CURSE_ALLY)
445 && unitTarget->HasAura(SPELL_SPECTRAL_REALM_AURA);
446 return false;
447 }
448};
449
450struct boss_sathrovarr : public BossAI
451{
452 boss_sathrovarr(Creature* creature) : BossAI(creature, DATA_KALECGOS), _isEnraged(false), _isBanished(false) { }
453
454 void Reset() override
455 {
456 _isEnraged = false;
457 _isBanished = false;
458 _Reset();
463 }
464
465 void JustEngagedWith(Unit* who) override
466 {
469 }
470
471 void EnterEvadeMode(EvadeReason why) override
472 {
474 kalecgos->AI()->EnterEvadeMode(why);
475 }
476
477 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
478 {
479 Unit* unitCaster = caster->ToUnit();
480 if (!unitCaster)
481 return;
482
483 if (spellInfo->Id == SPELL_TAP_CHECK_DAMAGE)
484 {
486 Unit::Kill(unitCaster, me);
487 }
488 }
489
490 void DamageTaken(Unit* who, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
491 {
492 if (damage >= me->GetHealth() && (!who || who->GetGUID() != me->GetGUID()))
493 damage = 0;
494 }
495
496 void KilledUnit(Unit* target) override
497 {
498 if (target->GetTypeId() == TYPEID_PLAYER)
500 else if (Creature* kalecgosHuman = instance->GetCreature(DATA_KALECGOS_HUMAN))
501 {
502 if (kalecgosHuman->GetGUID() == target->GetGUID())
504 }
505 }
506
507 void JustDied(Unit* /*killer*/) override
508 {
509 _JustDied();
513 kalecgos->AI()->DoAction(ACTION_START_OUTRO);
514 }
515
516 void ExecuteEvent(uint32 eventId) override
517 {
518 switch (eventId)
519 {
520 case EVENT_SHADOWBOLT:
521 if (roll_chance_i(20))
524 events.Repeat(Seconds(7), Seconds(10));
525 break;
527 {
531 DoCast(target, SPELL_AGONY_CURSE, args);
532 else
534 events.Repeat(Seconds(20));
535 break;
536 }
538 if (roll_chance_i(20))
541 events.Repeat(Seconds(13));
542 break;
544 {
545 if (HealthBelowPct(10) && !_isEnraged)
546 {
547 _isEnraged = true;
549 kalecgos->AI()->DoAction(ACTION_ENRAGE);
550 }
551
552 if (HealthBelowPct(1))
553 {
555 {
556 if (kalecgos->HasAura(SPELL_BANISH))
557 {
559 break;
560 }
561 }
562 if (_isBanished)
563 break;
564
565 _isBanished = true;
567 }
569 break;
570 }
571 default:
572 break;
573 }
574 }
575
576private:
579};
580
582{
583 public:
584 go_kalecgos_spectral_rift() : GameObjectScript("go_kalecgos_spectral_rift") { }
585
587 {
589
590 bool OnGossipHello(Player* player) override
591 {
593 player->CastSpell(player, SPELL_SPECTRAL_REALM_TRIGGER, true);
594 return true;
595 }
596 };
597
598 GameObjectAI* GetAI(GameObject* go) const override
599 {
600 return GetSunwellPlateauAI<go_kalecgos_spectral_riftAI>(go);
601 }
602};
603
604// 46732 - Tap Check
606{
608
609 bool Validate(SpellInfo const* spellInfo) override
610 {
611 return ValidateSpellInfo({ uint32(spellInfo->GetEffect(EFFECT_0).CalcValue()) });
612 }
613
614 void HandleDummy(SpellEffIndex /*effIndex*/)
615 {
616 GetHitUnit()->CastSpell(GetCaster(), GetEffectInfo().CalcValue(), true);
617 }
618
623};
624
626{
627 public:
629
630 bool operator()(WorldObject* target) const
631 {
632 if (Unit* unitTarget = target->ToUnit())
633 return !NonTankTargetSelector::operator()(unitTarget)
634 && !unitTarget->HasAura(SPELL_SPECTRAL_EXHAUSTION)
635 && !unitTarget->HasAura(SPELL_SPECTRAL_REALM_AURA);
636 return false;
637 }
638};
639
640// 44869 - Spectral Blast
642{
644
645 bool Validate(SpellInfo const* /*spell*/) override
646 {
647 return ValidateSpellInfo(
648 {
652 });
653 }
654
655 void FilterTargets(std::list<WorldObject*>& targets)
656 {
657 targets.remove_if(SpectralBlastSelector(GetCaster()));
658 }
659
660 void HandleDummy(SpellEffIndex /*effIndex*/)
661 {
662 Unit* caster = GetCaster();
663 Unit* target = GetHitUnit();
664
665 target->CastSpell(target, SPELL_SPECTRAL_BLAST_EFFECT, true);
666 caster->CastSpell(target, SPELL_SPECTRAL_BLAST_VISUAL, true);
667 caster->CastSpell(target, SPELL_SPECTRAL_REALM_TRIGGER, true);
668 }
669
675};
676
677// 44811 - Spectral Realm
707
708// 46021 - Spectral Realm
736
737// 45032, 45034 - Curse of Boundless Agony
739{
741
742 bool Validate(SpellInfo const* /*spellInfo*/) override
743 {
744 return ValidateSpellInfo(
745 {
750 });
751 }
752
753 void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
754 {
755 if (InstanceScript* instance = GetTarget()->GetInstanceScript())
756 if (instance->GetBossState(DATA_KALECGOS) == IN_PROGRESS)
757 return;
758
760 }
761
762 void OnPeriodic(AuraEffect const* aurEff)
763 {
764 if (aurEff->GetTickNumber() <= 5)
766 else if (aurEff->GetTickNumber() <= 10)
768 else
770 }
771
773 {
774 if (aurEff->GetTickNumber() > 1 && aurEff->GetTickNumber() % 5 == 1)
775 aurEff->SetAmount(aurEff->GetAmount() * 2);
776 }
777
778 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
779 {
780 if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_CANCEL)
781 return;
782
786 }
787
795};
796
int32_t int32
Definition Define.h:129
uint32_t uint32
Definition Define.h:133
std::chrono::seconds Seconds
Seconds shorthand typedef.
Definition Duration.h:27
@ IN_PROGRESS
@ ENCOUNTER_FRAME_DISENGAGE
@ ENCOUNTER_FRAME_ENGAGE
@ POINT_MOTION_TYPE
@ TEMPSUMMON_CORPSE_TIMED_DESPAWN
@ TYPEID_PLAYER
Definition ObjectGuid.h:39
Spells
Definition PlayerAI.cpp:32
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:42
bool roll_chance_i(int chance)
Definition Random.h:59
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1128
SpellEffIndex
@ EFFECT_0
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ TARGET_UNIT_SRC_AREA_ENEMY
@ EMOTE_ONESHOT_LIFTOFF
@ FACTION_FRIENDLY
@ AURA_REMOVE_BY_CANCEL
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_PERIODIC_DAMAGE
@ SPELL_AURA_MOD_INVISIBILITY_DETECT
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
@ SPELLVALUE_MAX_TARGETS
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define AuraEffectUpdatePeriodicFn(F, I, N)
#define AuraEffectApplyFn(F, I, N, M)
#define AuraEffectRemoveFn(F, I, N, M)
@ REACT_PASSIVE
@ UNIT_STATE_CASTING
Definition Unit.h:235
DamageEffectType
Definition Unit.h:352
Position const KalecgosSummonPos
void AddSC_boss_kalecgos()
@ SAY_GOOD_DEATH
@ SAY_SATH_AGGRO
@ SAY_ARCANE_BUFFET
@ SAY_GOOD_NEAR_DEATH_0
@ SAY_OUTRO_1
@ SAY_SATH_SLAY
@ SAY_SATH_DEATH
@ SAY_GOOD_NEAR_DEATH_2
@ SAY_OUTRO_2
@ EMOTE_ENRAGE
@ SAY_GOOD_NEAR_DEATH_1
@ SAY_SATH_SPELL1
@ SAY_EVIL_AGGRO
@ SAY_EVIL_SLAY
@ SAY_SATH_SPELL2
uint32 const WildMagicSpells[6]
KalecgosEvents
@ EVENT_REVITALIZE
@ EVENT_SHADOWBOLT
@ EVENT_OUTRO_2
@ EVENT_OUTRO_3
@ EVENT_WILD_MAGIC
@ EVENT_FROST_BREATH
@ EVENT_ARCANE_BUFFET
@ EVENT_AGONY_CURSE
@ EVENT_OUTRO_START
@ EVENT_TAIL_LASH
@ EVENT_SPECTRAL_BLAST
@ EVENT_HEROIC_STRIKE
@ EVENT_OUTRO_1
@ EVENT_CORRUPTION_STRIKE
@ EVENT_CHECK_TIMER
@ SPELL_WILD_MAGIC_6
@ SPELL_SPECTRAL_EXHAUSTION
@ SPELL_FROST_BREATH
@ SPELL_SPECTRAL_REALM_TRIGGER
@ SPELL_SPECTRAL_REALM_2
@ SPELL_ARCANE_BUFFET
@ SPELL_ENRAGE
@ SPELL_WILD_MAGIC_5
@ SPELL_WILD_MAGIC_3
@ SPELL_AGONY_CURSE
@ SPELL_REVITALIZE
@ SPELL_TELEPORT_BACK
@ SPELL_AGONY_CURSE_VISUAL_2
@ SPELL_SPECTRAL_BLAST_VISUAL
@ SPELL_CORRUPTION_STRIKE
@ SPELL_SHADOW_BOLT
@ SPELL_TAIL_LASH
@ SPELL_TAP_CHECK
@ SPELL_AGONY_CURSE_ALLY
@ SPELL_HEROIC_STRIKE
@ SPELL_BANISH
@ SPELL_SPECTRAL_REALM_REACTION
@ SPELL_TAP_CHECK_DAMAGE
@ SPELL_DEMONIC_VISUAL
@ SPELL_SPECTRAL_REALM_AURA
@ SPELL_AGONY_CURSE_VISUAL_1
@ SPELL_WILD_MAGIC_4
@ SPELL_AGONY_CURSE_VISUAL_3
@ SPELL_SPECTRAL_REALM_TELEPORT
@ SPELL_SPECTRAL_BLAST_EFFECT
@ SPELL_WILD_MAGIC_1
@ SPELL_WILD_MAGIC_2
@ SPELL_SPECTRAL_BLAST
Position const FlyPos[2]
KalecgosPoints
@ POINT_OUTRO_1
@ POINT_OUTRO_2
KalecSayPhases
@ PHASE_SAY_ONE
@ PHASE_OUTRO
@ PHASE_SAY_FOUR
@ PHASE_SAY_TWO
@ PHASE_SAY_THREE
SWPActions
@ ACTION_START_OUTRO
@ ACTION_ENRAGE
Yells
uint32 GetTickNumber() const
void SetAmount(int32 amount)
int32 GetAmount() const
AuraApplication const * GetTargetApplication() const
HookList< EffectApplyHandler > AfterEffectRemove
HookList< EffectPeriodicHandler > OnEffectPeriodic
HookList< EffectApplyHandler > AfterEffectApply
HookList< EffectUpdatePeriodicHandler > OnEffectUpdatePeriodic
Unit * GetTarget() const
void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
InstanceScript *const instance
void JustEngagedWith(Unit *who) override
void _DespawnAtEvade(Seconds delayToRespawn=30s, Creature *who=nullptr)
SummonList summons
EventMap events
@ EVADE_REASON_OTHER
Definition CreatureAI.h:98
bool _EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:82
void SetReactState(ReactStates st)
Definition Creature.h:119
void SetRegenerateHealth(bool value)
Definition Creature.h:285
CurseAgonySelector(Unit *source)
bool operator()(WorldObject *target) const
void Update(uint32 time)
Definition EventMap.h:67
void Repeat(Milliseconds time)
Definition EventMap.cpp:63
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
void Reset()
Definition EventMap.cpp:21
void DoRemoveAurasDueToSpellOnPlayers(uint32 spell, bool includePets=false, bool includeControlled=false)
Creature * GetCreature(uint32 type)
void SendEncounterUnit(EncounterFrameType type, Unit const *unit=nullptr, uint8 param1=0, uint8 param2=0)
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={})
static Unit * ToUnit(Object *o)
Definition Object.h:192
TypeID GetTypeId() const
Definition Object.h:93
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
SpectralBlastSelector(Unit *source)
bool operator()(WorldObject *target) const
int32 CalcValue(WorldObject const *caster=nullptr, int32 const *basePoints=nullptr) const
uint32 Id
Definition SpellInfo.h:289
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition SpellInfo.h:483
Unit * GetCaster() const
Unit * GetHitUnit() const
SpellEffectInfo const & GetEffectInfo() const
HookList< EffectHandler > OnEffectHitTarget
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:54
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:241
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
void SetVisible(bool x)
Definition Unit.cpp:8513
void KillSelf(bool durabilityLoss=true)
Definition Unit.h:1023
void SetFaction(uint32 faction) override
Definition Unit.h:974
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition Unit.cpp:3093
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
bool SetDisableGravity(bool disable, bool updateAnimTier=true)
Definition Unit.cpp:13286
uint32 GetHealth() const
Definition Unit.h:913
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3784
bool HasUnitState(const uint32 f) const
Definition Unit.h:876
void HandleEmoteCommand(Emote emoteId)
Definition Unit.cpp:1568
void RemoveAllAttackers()
Definition Unit.cpp:5736
void RemoveAllAuras()
Definition Unit.cpp:4157
static void Kill(Unit *attacker, Unit *victim, bool durabilityLoss=true)
Definition Unit.cpp:10930
bool AttackStop()
Definition Unit.cpp:5645
void GetGameObjectListWithEntryInGrid(Container &gameObjectContainer, uint32 entry, float maxSearchRange=250.0f) const
Definition Object.cpp:3133
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
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
GameObjectAI * GetAI(GameObject *go) const override
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
void HandleEffectPeriodicUpdate(AuraEffect *aurEff)
PrepareAuraScript(spell_kalecgos_curse_of_boundless_agony)
void OnApply(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
void OnPeriodic(AuraEffect const *aurEff)
void FilterTargets(std::list< WorldObject * > &targets)
void HandleDummy(SpellEffIndex)
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_kalecgos_spectral_blast)
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
PrepareAuraScript(spell_kalecgos_spectral_realm_aura)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_kalecgos_spectral_realm_trigger)
bool Validate(SpellInfo const *spellInfo) override
void HandleDummy(SpellEffIndex)
PrepareSpellScript(spell_kalecgos_tap_check)
@ DATA_KALECGOS
CastSpellExtraArgs & AddSpellMod(SpellValueMod mod, int32 val)
bool operator()(Unit const *target) const
Definition UnitAI.cpp:439
bool HealthBelowPct(uint32 pct) const
InstanceScript * _instance
void DamageTaken(Unit *who, uint32 &damage, DamageEffectType, SpellInfo const *) override
void UpdateAI(uint32 diff) override
void JustDied(Unit *) override
void Reset() override
boss_kalecgos_human(Creature *creature)
void UpdateAI(uint32 diff) override
void KilledUnit(Unit *who) override
void DoAction(int32 action) override
boss_kalecgos(Creature *creature)
void JustEngagedWith(Unit *who) override
void EnterEvadeMode(EvadeReason) override
void Reset() override
void DamageTaken(Unit *who, uint32 &damage, DamageEffectType, SpellInfo const *) override
void MovementInform(uint32 type, uint32 id) override
void DamageTaken(Unit *who, uint32 &damage, DamageEffectType, SpellInfo const *) override
void Reset() override
void KilledUnit(Unit *target) override
void ExecuteEvent(uint32 eventId) override
void EnterEvadeMode(EvadeReason why) override
boss_sathrovarr(Creature *creature)
void JustEngagedWith(Unit *who) override
void JustDied(Unit *) override
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
#define RegisterSunwellPlateauCreatureAI(ai_name)
@ GO_SPECTRAL_RIFT
@ DATA_SATHROVARR
@ DATA_KALECGOS_HUMAN
@ DATA_KALECGOS_DRAGON
@ NPC_KALECGOS_HUMAN