TrinityCore
Loading...
Searching...
No Matches
boss_heartsbane_triad.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 "AreaTrigger.h"
19#include "AreaTriggerAI.h"
20#include "Creature.h"
21#include "GridNotifiers.h"
22#include "InstanceScript.h"
23#include "Map.h"
24#include "ObjectAccessor.h"
25#include "ScriptMgr.h"
26#include "ScriptedCreature.h"
27#include "SpellAuraEffects.h"
28#include "SpellScript.h"
29#include "waycrest_manor.h"
30
67
69{
70 // Shared
77
78 // Sister Solena
80
81 // Sister Malady
83
84 // Sister Briar
86};
87
111
117
122
129
130namespace
131{
132void HeartsbaneTriadEncounterStart(InstanceScript* instance)
133{
135 return;
136
138
139 for (uint32 data : HeartsbaneTriadData)
140 {
141 if (Creature* sister = instance->GetCreature(data))
142 {
143 instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, sister, 1);
144 sister->AI()->DoZoneInCombat();
145 }
146 }
147}
148
149void HeartsbaneTriadEncounterFail(InstanceScript* instance, EvadeReason why, Creature* invoker)
150{
151 if (instance->GetBossState(DATA_HEARTSBANE_TRIAD) == FAIL)
152 return;
153
155
156 for (uint32 data : HeartsbaneTriadData)
157 {
158 if (Creature* triad = instance->GetCreature(data))
159 {
160 if (triad == invoker)
161 continue;
162
163 triad->AI()->EnterEvadeMode(why);
164 }
165 }
166}
167
168void HeartsbaneTriadEncounterDone(InstanceScript* instance)
169{
170 if (instance->GetBossState(DATA_HEARTSBANE_TRIAD) == DONE)
171 return;
172
173 for (uint32 data : HeartsbaneTriadData)
174 {
175 if (Creature* sister = instance->GetCreature(data))
176 {
177 if (sister->IsAlive())
178 return;
179 }
180 }
181
182 for (uint32 data : HeartsbaneTriadData)
183 {
184 if (Creature* sister = instance->GetCreature(data))
186 }
187
189}
190}
191
193{
198
199 virtual void ScheduleEvents()
200 {
202 }
203
204 virtual void HandleDropIris(bool /*skipShieldPhase*/, bool /*skipIrisDrop*/)
205 {
206 _claimedIris = false;
207 }
208
209 virtual void HandleClaimIris()
210 {
211 _claimedIris = true;
212
214
215 me->AttackStop();
217
218 if (Creature* focusingIris = me->FindNearestCreature(NPC_FOCUSING_IRIS, 200.0f))
219 me->CastSpell(focusingIris, SPELL_CLAIM_THE_IRIS);
220
221 me->SetUnkillable(false);
222 }
223
224 void Reset() override
225 {
226 events.Reset();
227 _healthTriggered = false;
228 _claimedIris = false;
229 }
230
231 void EnterEvadeMode(EvadeReason why) override
232 {
233 HeartsbaneTriadEncounterFail(instance, why, me);
234
237
241 }
242
243 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
244 {
245 if (me->HealthBelowPctDamaged(50, damage) && !_healthTriggered)
246 {
247 _healthTriggered = true;
248 me->AttackStop();
250
251 me->SetUnkillable(true);
252
254 }
255 }
256
257 void JustAppeared() override
258 {
261
262 me->SetUnkillable(true);
263 }
264
265 void JustEngagedWith(Unit* /*who*/) override
266 {
267 HeartsbaneTriadEncounterStart(instance);
269 }
270
271 void ExecuteEvent(uint32 eventId) override
272 {
273 switch (eventId)
274 {
276 {
277 if (me->GetPower(POWER_ENERGY) >= 100)
278 {
282 }
283 events.Repeat(1000ms);
284 break;
285 }
286 case EVENT_CLAIM_IRIS:
287 {
289 break;
290 }
291 default:
292 break;
293 }
294 }
295
296 void DoAction(int32 actionId) override
297 {
298 switch (actionId)
299 {
301 events.Reset();
303 break;
304 default:
305 break;
306 }
307 }
308
309 void JustDied(Unit* /*killer*/) override
310 {
311 _JustDied();
312
314
315 HeartsbaneTriadEncounterDone(instance);
316 }
317
318 void KilledUnit(Unit* victim) override
319 {
320 if (!victim->IsPlayer())
321 return;
322
323 Talk(SAY_SLAY);
324 }
325
326 void UpdateAI(uint32 diff) override
327 {
328 if (!UpdateVictim())
329 return;
330
331 events.Update(diff);
332
334 return;
335
336 while (uint32 eventId = events.ExecuteEvent())
337 {
338 ExecuteEvent(eventId);
340 return;
341 }
342 }
343
344private:
346
347protected:
348 bool _claimedIris; // to prevent dropping multiple iris if a sister dies during claim process
349};
350
351// 131825 - Sister Briar
353{
355
362
369
370 void HandleDropIris(bool skipShieldPhase, bool skipIrisDrop) override
371 {
372 HeartsbaneTriadSharedAI::HandleDropIris(skipIrisDrop, skipIrisDrop);
373
375
378
379 if (skipShieldPhase)
380 return;
381
382 if (!skipIrisDrop)
385
387 solena->AI()->DoAction(ACTION_CLAIM_THE_IRIS);
388
390 }
391
403
410
411 void ExecuteEvent(uint32 eventId) override
412 {
413 switch (eventId)
414 {
416 {
418 DoCast(target, SPELL_BRAMBLE_BOLT);
419 events.Repeat(2400ms);
420 break;
421 }
423 {
426 events.Repeat(7300ms);
427 break;
428 }
430 {
434 events.Repeat(14600ms);
435 break;
436 }
438 {
440 break;
441 }
442 default:
444 break;
445 }
446 }
447};
448
449// 131823 - Sister Malady
451{
453
460
461 void JustDied(Unit* killer) override
462 {
464
466 }
467
468 void HandleDropIris(bool skipShieldPhase, bool skipIrisDrop) override
469 {
471 if (!skipIrisDrop)
473
475 briar->AI()->DoAction(ACTION_CLAIM_THE_IRIS);
476
479
480 if (skipShieldPhase)
481 return;
482
485 }
486
499
500 void ExecuteEvent(uint32 eventId) override
501 {
502 switch (eventId)
503 {
505 {
507 DoCast(target, SPELL_RUINOUS_BOLT);
508 events.Repeat(2400ms);
509 break;
510 }
512 {
515 events.Repeat(7300ms);
516 break;
517 }
519 {
522 events.Repeat(12100ms);
523 break;
524 }
525 case EVENT_CLAIM_IRIS:
526 {
528 break;
529 }
531 {
533 break;
534 }
535 default:
537 break;
538 }
539 }
540};
541
542// 131824 - Sister Solena
544{
546
554
564
565 void JustDied(Unit* killer) override
566 {
568
570 }
571
572 void HandleDropIris(bool skipShieldPhase, bool skipIrisDrop) override
573 {
575 if (!skipIrisDrop)
577
579 malady->AI()->DoAction(ACTION_CLAIM_THE_IRIS);
580
583
584 if (skipShieldPhase)
585 return;
586
589 }
590
603
604 void DoAction(int32 actionId) override
605 {
606 switch (actionId)
607 {
609 {
610 _claimedIris = true;
611
612 if (Creature* focusingIris = me->FindNearestCreature(NPC_FOCUSING_IRIS, 100.0f))
613 DoCast(focusingIris, SPELL_CLAIM_THE_IRIS);
614
615 if (IsHeroic() || IsMythic())
617 break;
618 }
619 default:
621 break;
622 }
623 }
624
630
631 void ExecuteEvent(uint32 eventId) override
632 {
633 switch (eventId)
634 {
636 {
639 events.Repeat(4900ms);
640 break;
641 }
642 case EVENT_SOUL_BOLT:
643 {
645 DoCast(target, SPELL_SOUL_BOLT);
646 events.Repeat(2400ms);
647 break;
648 }
650 {
651 if (me->GetMap()->GetPlayersCountExceptGMs() > 1) // This event doesn't happen if you go solo because it resets boss
652 {
656 events.Repeat(23100ms, 24200ms);
657 }
658 break;
659 }
661 {
663 break;
664 }
665 default:
667 break;
668 }
669 }
670};
671
672// 260741 - Jagged Nettles
674{
675 void HandlePeriodic(AuraEffect const* aurEff)
676 {
677 if (aurEff->GetTickNumber() > 1)
678 {
679 if (GetTarget()->GetHealthPct() >= GetEffectInfo(EFFECT_2).CalcValue(GetCaster()))
680 Remove();
681 }
682 }
683
688};
689
690// 260852 - Claim the Iris
692{
693 bool Validate(SpellInfo const* /*spellInfo*/) override
694 {
696 }
697
699 {
700 Creature* casterCreature = GetCaster()->ToCreature();
701 if (!casterCreature)
702 return;
703
704 if (Creature* hitCreature = GetHitCreature())
705 hitCreature->DespawnOrUnsummon();
706
707 casterCreature->CastSpell(casterCreature, SPELL_FOCUSING_IRIS, TRIGGERED_IGNORE_CAST_IN_PROGRESS);
708 casterCreature->SetSessile(false);
709 casterCreature->SetFloating(false);
710 }
711
716};
717
718// 260854 - Drop the Iris
736
737// 260923 - Soul Manipulation
739{
740 void HandlePeriodic(AuraEffect const* /*aurEff*/)
741 {
742 if (GetTarget()->GetHealthPct() > 50.0f)
743 return;
744
745 Remove();
746
747 if (Unit* caster = GetCaster())
748 caster->InterruptSpell(CURRENT_CHANNELED_SPELL);
749 }
750
755};
756
757// 260907 Soul Manipulation (Selector)
777
778// 260703 - Unstable Runic Mark
799
800// 260773 - Dire Ritual
813
814// 17789 - Aura of Apathy
816{
818
819 void OnUnitEnter(Unit* unit) override
820 {
821 if (!unit->IsPlayer())
822 return;
823
824 unit->CastSpell(unit, SPELL_AURA_OF_APATHY_DEBUFF, true);
825 }
826
827 void OnUnitExit(Unit* unit, AreaTriggerExitReason /*reason*/) override
828 {
830 }
831};
832
833// 17791 - Aura of Dread
835{
837
838 void OnUnitEnter(Unit* unit) override
839 {
840 if (!unit->IsPlayer())
841 return;
842
843 unit->CastSpell(unit, SPELL_AURA_OF_DREAD_MOVE_CHECK, true);
844 }
845
851};
852
853// 268088 - Aura of Dread
855{
856 bool Validate(SpellInfo const* /*spellInfo*/) override
857 {
859 }
860
861 void HandlePeriodic(AuraEffect const* /*aurEff*/)
862 {
863 Unit* caster = GetCaster();
864 if (!caster)
865 return;
866
867 for (MapReference const& players : caster->GetMap()->GetPlayers())
868 {
869 if (Player* player = players.GetSource())
870 {
871 if (!player->HasAura(SPELL_AURA_OF_DREAD_MOVE_CHECK))
872 continue;
873
874 player->CastSpell(player, SPELL_AURA_OF_DREAD_DAMAGE, true);
875 }
876 }
877 }
878
883};
884
885// 268085 - Aura of Dread
887{
888 bool Validate(SpellInfo const* /*spellInfo*/) override
889 {
891 }
892
893 void HandlePeriodic(AuraEffect const* /*aurEff*/)
894 {
895 Unit* caster = GetCaster();
896 if (!caster)
897 return;
898
899 if (caster->isMoving())
900 {
901 if (Aura* stack = caster->GetAura(SPELL_AURA_OF_DREAD_DAMAGE, caster->GetGUID()))
902 {
903 if (stack->GetStackAmount() > 1)
905 }
906 }
907 }
908
913};
914
915// 17807 - Aura of Thorns
917{
919
920 void OnUnitEnter(Unit* unit) override
921 {
922 if (!unit->IsPlayer())
923 return;
924
926 }
927
928 void OnUnitExit(Unit* unit, AreaTriggerExitReason /*reason*/) override
929 {
931 }
932};
933
934// 268122 - Aura of Thorns
936{
937 bool Validate(SpellInfo const* /*spellInfo*/) override
938 {
940 }
941
943 {
945 }
946
951};
952
AreaTriggerExitReason
Definition AreaTrigger.h:69
First const & RAND(First const &first, Second const &second, Rest const &... rest)
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
@ IN_PROGRESS
@ FAIL
@ DONE
@ ENCOUNTER_FRAME_DISENGAGE
@ ENCOUNTER_FRAME_ENGAGE
#define RegisterAreaTriggerAI(ai_name)
Definition ScriptMgr.h:1428
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1383
SpellEffIndex
@ EFFECT_1
@ EFFECT_0
@ EFFECT_2
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SUMMON
@ POWER_ENERGY
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ AURA_REMOVE_BY_EXPIRE
@ AURA_REMOVE_BY_ENEMY_SPELL
@ SPELL_AURA_PERIODIC_DAMAGE
@ SPELL_AURA_PERIODIC_DUMMY
@ TRIGGERED_IGNORE_CAST_IN_PROGRESS
Will not check if a current cast is in progress.
#define SpellEffectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define SpellCastFn(F)
#define AuraCheckProcFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
EvadeReason
DamageEffectType
@ CURRENT_CHANNELED_SPELL
Definition Unit.h:599
@ UNIT_STATE_CASTING
Definition Unit.h:276
@ EVENT_BRAMBLE_BOLT
@ EVENT_UNSTABLE_RUNIC_MARK
@ EVENT_AURA_OF_THORNS
@ EVENT_RUINOUS_BOLT_ENHANCED
@ EVENT_AURA_OF_DREAD
@ EVENT_SOUL_MANIPULATION
@ EVENT_SOUL_BOLT_ENHANCED
@ EVENT_BRAMBLE_BOLT_ENHANCED
@ EVENT_AURA_OF_APATHY
@ EVENT_RUINOUS_BOLT
@ EVENT_JAGGED_NETTLES
HeartsbaneTriadSummonGroups
@ SUMMON_GROUP_TRIAD_FOCUSING_IRIS
void AddSC_boss_heartsbane_triad()
@ SPELL_IRONBARK_SHIELD
@ SPELL_BRAMBLE_BOLT
@ SPELL_RUINOUS_BOLT_ENHANCED
@ SPELL_SOUL_MANIPULATION_VISUAL
@ SPELL_SOUL_MANIPULATION_DAMAGE_REDUCTION
@ SPELL_AURA_OF_DREAD_MOVE_CHECK
@ SPELL_FOCUSING_IRIS
@ SPELL_AURA_OF_THORNS
@ SPELL_AURA_OF_DREAD_DAMAGE
@ SPELL_AURA_OF_THORNS_CHECK_PROC
@ SPELL_AURA_OF_DREAD
@ SPELL_BRAMBLE_BOLT_ENHANCED
@ SPELL_CLAIM_THE_IRIS
@ SPELL_AURA_OF_APATHY
@ SPELL_SOUL_MANIPULATION_SELECTOR
@ SPELL_UNSTABLE_RUNIC_MARK
@ SPELL_SOUL_BOLT_ENHANCED
@ SPELL_JAGGED_NETTLES
@ SPELL_DROP_THE_IRIS
@ SPELL_AURA_OF_APATHY_DEBUFF
@ SPELL_RUINOUS_BOLT
@ SPELL_UNSTABLE_RUNIC_MARK_DAMAGE
@ SPELL_SOUL_MANIPULATION_CHARM
@ SPELL_DIRE_RITUAL
@ SAY_SOUL_MANIPULATION
@ SAY_JAGGED_NETTLES
@ SAY_CLAIM_THE_IRIS
@ SAY_UNSTABLE_RUNIC_MARK
@ SAY_DIRE_RITUAL_ALERT
uint32 const HeartsbaneTriadData[3]
@ ACTION_CLAIM_THE_IRIS
@ ACTION_CLAIM_THE_IRIS_INTRO
uint32 GetTickNumber() const
AuraApplication const * GetTargetApplication() const
HookList< EffectApplyHandler > AfterEffectRemove
HookList< EffectPeriodicHandler > OnEffectPeriodic
Unit * GetCaster() const
SpellEffectInfo const & GetEffectInfo(SpellEffIndex effIndex) const
Unit * GetTarget() const
HookList< CheckProcHandler > DoCheckProc
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
bool IsPlayer() const
Definition BaseEntity.h:173
InstanceScript *const instance
void _DespawnAtEvade(Seconds delayToRespawn=30s, Creature *who=nullptr)
SummonList summons
EventMap events
bool _EnterEvadeMode(EvadeReason why=EvadeReason::Other)
bool UpdateVictim()
void SetBoundary(CreatureBoundary const *boundary, bool negativeBoundaries=false)
Creature *const me
Definition CreatureAI.h:63
void SetUnkillable(bool unkillable)
Definition Creature.h:189
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
void SetFloating(bool floating)
Definition Creature.h:143
void SetSessile(bool sessile)
Definition Creature.h:147
uint32 ExecuteEvent()
Definition EventMap.cpp:77
void Update(uint32 time)
Definition EventMap.h:61
void Repeat(Milliseconds time)
Definition EventMap.cpp:67
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition EventMap.cpp:40
void CancelEvent(uint32 eventId)
Definition EventMap.cpp:135
void RescheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition EventMap.cpp:56
void Reset()
Definition EventMap.cpp:25
virtual bool SetBossState(uint32 id, EncounterState state)
void DoRemoveAurasDueToSpellOnPlayers(uint32 spell, bool includePets=false, bool includeControlled=false)
Creature * GetCreature(uint32 type)
CreatureBoundary const * GetBossBoundary(uint32 id) const
EncounterState GetBossState(uint32 id) const
void SendEncounterUnit(EncounterFrameType type, Unit const *unit, Optional< int32 > param1={}, Optional< int32 > param2={})
uint32 GetPlayersCountExceptGMs() const
Definition Map.cpp:2679
PlayerList const & GetPlayers() const
Definition Map.h:403
Creature * ToCreature()
Definition Object.h:121
Unit * GetActor() const
Definition Unit.h:499
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
HookList< CastHandler > AfterCast
Creature * GetHitCreature() const
Unit * GetCaster() const
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
HookList< EffectHandler > OnEffectLaunch
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:160
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition UnitAI.cpp:79
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:89
Definition Unit.h:635
void SetPower(Powers power, int32 val, bool withPowerUpdate=true)
Definition Unit.cpp:10046
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition Unit.cpp:3231
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4700
bool isMoving() const
Definition Unit.h:1804
bool HealthBelowPctDamaged(float pct, uint32 damage) const
Definition Unit.h:793
void RemoveAuraFromStack(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT, uint16 num=1)
Definition Unit.cpp:3990
int32 GetPower(Powers power) const
Definition Unit.cpp:10028
bool HasUnitState(const uint32 f) const
Definition Unit.h:743
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4804
bool AttackStop()
Definition Unit.cpp:5965
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3974
void SetPowerType(Powers power, bool sendUpdate=true, bool onInit=false)
Definition Unit.cpp:5697
Map * GetMap() const
Definition Object.h:411
InstanceScript * GetInstanceScript() const
Definition Object.cpp:396
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2217
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:1517
void SummonCreatureGroup(uint8 group, std::list< TempSummon * > *list=nullptr)
Definition Object.cpp:1507
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
bool HandleCheckProc(ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandlePeriodic(AuraEffect const *aurEff)
void HandleDamage(AuraEffect const *, AuraEffectHandleModes)
void JustEngagedWith(Unit *) override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
void ExecuteEvent(uint32 eventId) override
void EnterEvadeMode(EvadeReason why) override
void UpdateAI(uint32 diff) override
void DoAction(int32 actionId) override
HeartsbaneTriadSharedAI(Creature *creature, uint32 bossId)
void KilledUnit(Unit *victim) override
virtual void HandleDropIris(bool, bool)
bool IsHeroic() const
bool IsMythic() const
void OnUnitExit(Unit *unit, AreaTriggerExitReason) override
at_heartsbane_triad_aura_of_apathy(AreaTrigger *areatrigger)
at_heartsbane_triad_aura_of_dread(AreaTrigger *areatrigger)
void OnUnitExit(Unit *unit, AreaTriggerExitReason) override
void OnUnitExit(Unit *unit, AreaTriggerExitReason) override
at_heartsbane_triad_aura_of_thorns(AreaTrigger *areatrigger)
boss_sister_briar(Creature *creature)
void HandleClaimIris() override
void HandleDropIris(bool skipShieldPhase, bool skipIrisDrop) override
void ExecuteEvent(uint32 eventId) override
void JustDied(Unit *killer) override
void EnterEvadeMode(EvadeReason why) override
void JustDied(Unit *killer) override
void HandleDropIris(bool skipShieldPhase, bool skipIrisDrop) override
void ExecuteEvent(uint32 eventId) override
boss_sister_malady(Creature *creature)
boss_sister_solena(Creature *creature)
void DoAction(int32 actionId) override
void HandleDropIris(bool skipShieldPhase, bool skipIrisDrop) override
void ExecuteEvent(uint32 eventId) override
void JustDied(Unit *killer) override
void JustEngagedWith(Unit *who) override
#define RegisterWaycrestManorCreatureAI(ai_name)
@ DATA_SISTER_SOLENA
@ DATA_HEARTSBANE_TRIAD
@ DATA_SISTER_BRIAR
@ DATA_SISTER_MALADY
@ NPC_FOCUSING_IRIS