TrinityCore
Loading...
Searching...
No Matches
boss_lady_deathwhisper.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 "icecrown_citadel.h"
19#include "Containers.h"
20#include "Group.h"
21#include "InstanceScript.h"
22#include "MotionMaster.h"
23#include "ObjectAccessor.h"
24#include "Player.h"
25#include "QuestPools.h"
26#include "ScriptedCreature.h"
27#include "ScriptMgr.h"
28#include "SpellAuraEffects.h"
29#include "SpellInfo.h"
30#include "SpellScript.h"
31#include "TemporarySummon.h"
32
58
60{
61 // Lady Deathwhisper
76
77 // Achievement
78 SPELL_FULL_HOUSE = 72827, // does not exist in dbc but still can be used for criteria check
79
80 // Both Adds
85
86 // Fanatics
97
98 // Adherents
110
111 // Vengeful Shade
117
118 // Darnavan
125};
126
137
145
152
163
168
173
174#define NPC_DARNAVAN RAID_MODE<uint32>(NPC_DARNAVAN_10, NPC_DARNAVAN_25, NPC_DARNAVAN_10, NPC_DARNAVAN_25)
175#define NPC_DARNAVAN_CREDIT RAID_MODE<uint32>(NPC_DARNAVAN_CREDIT_10, NPC_DARNAVAN_CREDIT_25, NPC_DARNAVAN_CREDIT_10, NPC_DARNAVAN_CREDIT_25)
176#define QUEST_DEPROGRAMMING RAID_MODE<uint32>(QUEST_DEPROGRAMMING_10, QUEST_DEPROGRAMMING_25, QUEST_DEPROGRAMMING_10, QUEST_DEPROGRAMMING_25)
177
179
181{
182 {-578.7066f, 2154.167f, 51.01529f, 1.692969f}, // 1 Left Door 1 (Cult Fanatic)
183 {-598.9028f, 2155.005f, 51.01530f, 1.692969f}, // 2 Left Door 2 (Cult Adherent)
184 {-619.2864f, 2154.460f, 51.01530f, 1.692969f}, // 3 Left Door 3 (Cult Fanatic)
185 {-578.6996f, 2269.856f, 51.01529f, 4.590216f}, // 4 Right Door 1 (Cult Adherent)
186 {-598.9688f, 2269.264f, 51.01529f, 4.590216f}, // 5 Right Door 2 (Cult Fanatic)
187 {-619.4323f, 2268.523f, 51.01530f, 4.590216f}, // 6 Right Door 3 (Cult Adherent)
188 {-524.2480f, 2211.920f, 62.90960f, 3.141592f}, // 7 Upper (Random Cultist)
189};
190
192{
193 public:
194 DaranavanMoveEvent(Creature& darnavan) : _darnavan(darnavan) { }
195
196 bool Execute(uint64 /*time*/, uint32 /*diff*/) override
197 {
199 return true;
200 }
201
202 private:
204};
205
206// 36855 - Lady Deathwhisper
208{
211 {
212 Initialize();
213 }
214
216 {
217 _waveCounter = 0;
219 _cultistQueue.clear();
223 {
225 });
226 }
227
238
239 void DoAction(int32 action) override
240 {
241 if (action != ACTION_START_INTRO)
242 return;
243
246 scheduler.Schedule(10s, GROUP_INTRO, [this](TaskContext& context)
247 {
248 switch (context.GetRepeatCounter())
249 {
250 case 0:
251 Talk(SAY_INTRO_2);
252 context.Repeat(21s);
253 break;
254 case 1:
255 Talk(SAY_INTRO_3);
256 context.Repeat(11s);
257 break;
258 case 2:
259 Talk(SAY_INTRO_4);
260 context.Repeat(9s);
261 break;
262 case 3:
263 Talk(SAY_INTRO_5);
264 context.Repeat(21s);
265 break;
266 case 4:
267 Talk(SAY_INTRO_6);
268 context.Repeat(10s);
269 break;
270 case 5:
271 Talk(SAY_INTRO_7);
272 break;
273 default:
274 break;
275 }
276 });
277 }
278
279 void AttackStart(Unit* victim) override
280 {
282 return;
283
284 if (victim && me->Attack(victim, true) && _phase != PHASE_ONE)
285 me->GetMotionMaster()->MoveChase(victim);
286 }
287
288 void JustEngagedWith(Unit* who) override
289 {
291 {
294 return;
295 }
296
298 me->setActive(true);
301 // phase-independent events
303 .Schedule(10min, [this](TaskContext const& /*context*/)
304 {
307 })
308 .Schedule(17s, [this](TaskContext& death_and_decay)
309 {
312 death_and_decay.Repeat(22s, 30s);
313 });
315 scheduler.Schedule(27s, [this](TaskContext& dominate_mind)
316 {
318 std::list<Unit*> targets;
320 for (Unit* target : targets)
322 dominate_mind.Repeat(40s, 45s);
323 });
324 // phase one only
326 .Schedule(5s, GROUP_ONE, [this](TaskContext& wave)
327 {
328 SummonWaveP1();
329 wave.Repeat(IsHeroic() ? 45s : 60s);
330 })
331 .Schedule(2s, GROUP_ONE, [this](TaskContext& shadow_bolt)
332 {
334 DoCast(target, SPELL_SHADOW_BOLT);
335 shadow_bolt.Repeat(2450ms, 3600ms);
336 })
337 .Schedule(15s, GROUP_ONE, [this](TaskContext& context)
338 {
340 context.Repeat(25s);
341 });
342
344 me->SetCanMelee(false);
349 }
350
351 void JustDied(Unit* killer) override
352 {
354
355 std::set<uint32> livingAddEntries;
356 // Full House achievement
357 for (SummonList::iterator itr = summons.begin(); itr != summons.end(); ++itr)
358 if (Unit* unit = ObjectAccessor::GetUnit(*me, *itr))
359 if (unit->IsAlive() && unit->GetEntry() != NPC_VENGEFUL_SHADE)
360 livingAddEntries.insert(unit->GetEntry());
361
362 if (livingAddEntries.size() >= 5)
364
366 {
367 if (darnavan->IsAlive())
368 {
369 darnavan->SetFaction(FACTION_FRIENDLY);
370 darnavan->CombatStop(true);
371 darnavan->GetMotionMaster()->MoveIdle();
372 darnavan->SetReactState(REACT_PASSIVE);
373 darnavan->m_Events.AddEvent(new DaranavanMoveEvent(*darnavan), darnavan->m_Events.CalculateTime(10s));
374 darnavan->AI()->Talk(SAY_DARNAVAN_RESCUED);
375
376 if (!killer)
377 return;
378
379 if (Player* owner = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
380 {
381 if (Group* group = owner->GetGroup())
382 {
383 for (GroupReference const& itr : group->GetMembers())
384 if (itr.GetSource()->IsInMap(owner))
385 itr.GetSource()->KilledMonsterCredit(NPC_DARNAVAN_CREDIT);
386 }
387 else
388 owner->KilledMonsterCredit(NPC_DARNAVAN_CREDIT);
389 }
390 }
391 }
392
393 _JustDied();
394 }
395
396 void EnterEvadeMode(EvadeReason /*why*/) override
397 {
401 darnavan->DespawnOrUnsummon();
402
404 }
405
406 void KilledUnit(Unit* victim) override
407 {
408 if (victim->GetTypeId() == TYPEID_PLAYER)
409 Talk(SAY_KILL);
410 }
411
412 void DamageTaken(Unit* /*damageDealer*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
413 {
414 // phase transition
415 if (_phase == PHASE_ONE && damage > uint32(me->GetPower(POWER_MANA)))
416 {
422 damage -= me->GetPower(POWER_MANA);
425 me->SetCanMelee(true);
427
429 .Schedule(12s, GROUP_TWO, [this](TaskContext& frostbolt)
430 {
432 frostbolt.Repeat();
433 })
434 .Schedule(20s, GROUP_TWO, [this](TaskContext& frostboldVolley)
435 {
437 frostboldVolley.Repeat();
438 })
439 .Schedule(6s, 9s, GROUP_TWO, [this](TaskContext& touch)
440 {
441 if (me->GetVictim())
443 touch.Repeat();
444 })
445 .Schedule(12s, GROUP_TWO, [this](TaskContext& summonShade)
446 {
449 me->CastSpell(nullptr, SPELL_SUMMON_SPIRITS, args);
450 summonShade.Repeat();
451 });
452
453 // on heroic mode Lady Deathwhisper is immune to taunt effects in phase 2 and continues summoning adds
454 if (IsHeroic())
455 {
458 scheduler.Schedule(0s, GROUP_TWO, [this](TaskContext& context)
459 {
460 SummonWaveP2();
461 context.Repeat(45s);
462 });
463 }
464 }
465 }
466
467 void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
468 {
469 if (spellInfo->Id == SPELL_SUMMON_SPIRITS)
470 _nextVengefulShadeTargetGUID.push_back(target->GetGUID());
471 }
472
473 void JustSummoned(Creature* summon) override
474 {
475 switch (summon->GetEntry())
476 {
477 case NPC_DARNAVAN_10:
478 case NPC_DARNAVAN_25:
479 _darnavanGUID = summon->GetGUID();
481 return;
484 break;
487 break;
489 case NPC_CULT_FANATIC:
490 _cultistQueue.push_back(summon->GetGUID());
492 break;
493 default:
494 break;
495 }
496 summons.Summon(summon);
497 }
498
499 void UpdateAI(uint32 diff) override
500 {
501 if (!UpdateVictim() && _phase != PHASE_INTRO)
502 return;
503
504 scheduler.Update(diff);
505 }
506
507 // summoning function for first phase
509 {
510 uint8 addIndex = _waveCounter & 1;
511 uint8 addIndexOther = uint8(addIndex ^ 1);
512
513 // Summon first add, replace it with Darnavan if weekly quest is active
514 if (_waveCounter || !sQuestPoolMgr->IsQuestActive(QUEST_DEPROGRAMMING))
515 Summon(SummonEntries[addIndex], SummonPositions[addIndex * 3]);
516 else
517 Summon(NPC_DARNAVAN, SummonPositions[addIndex * 3]);
518
519 Summon(SummonEntries[addIndexOther], SummonPositions[addIndex * 3 + 1]);
520 Summon(SummonEntries[addIndex], SummonPositions[addIndex * 3 + 2]);
521 if (Is25ManRaid())
522 {
523 Summon(SummonEntries[addIndexOther], SummonPositions[addIndexOther * 3]);
524 Summon(SummonEntries[addIndex], SummonPositions[addIndexOther * 3 + 1]);
525 Summon(SummonEntries[addIndexOther], SummonPositions[addIndexOther * 3 + 2]);
527 }
528
529 ++_waveCounter;
530 }
531
532 // summoning function for second phase
534 {
535 if (Is25ManRaid())
536 {
537 uint8 addIndex = _waveCounter & 1;
538 Summon(SummonEntries[addIndex], SummonPositions[addIndex * 3]);
539 Summon(SummonEntries[addIndex ^ 1], SummonPositions[addIndex * 3 + 1]);
540 Summon(SummonEntries[addIndex], SummonPositions[addIndex * 3+ 2]);
541 }
542 else
544
545 ++_waveCounter;
546 }
547
548 // helper for summoning wave mobs
549 void Summon(uint32 entry, Position const& pos)
550 {
551 if (TempSummon* summon = me->SummonCreature(entry, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10s))
552 summon->CastSpell(summon, SPELL_TELEPORT_VISUAL);
553 }
554
555 void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override
556 {
557 if (summon->GetEntry() == NPC_CULT_ADHERENT || summon->GetEntry() == NPC_CULT_FANATIC)
558 _cultistQueue.remove(summon->GetGUID());
559 }
560
562 {
563 if (_cultistQueue.empty())
564 return;
565
569 if (!cultist)
570 return;
571
572 if (RAND(0,1))
574 else
575 {
578 }
579 }
580
581private:
589};
590
591/* 37890 - Cult Fanatic
592 38009 - Reanimated Fanatic
593 38135 - Deformed Fanatic */
595{
596 npc_cult_fanatic(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
597
598 void Reset() override
599 {
602 .SetValidator([this]
603 {
605 })
606 .Schedule(17s, [this](TaskContext& vampiric_might)
607 {
609 vampiric_might.Repeat(25s);
610 })
611 .Schedule(12s, [this](TaskContext& shadow_cleave)
612 {
614 shadow_cleave.Repeat(14s);
615 })
616 .Schedule(10s, [this](TaskContext& necrotic_strike)
617 {
619 necrotic_strike.Repeat(17s);
620 });
621 }
622
623 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
624 {
625 switch (spellInfo->Id)
626 {
630 break;
634 break;
638 me->AttackStop();
640 break;
646 .Schedule(2s, [this](TaskContext const& /*context*/)
647 {
652 me->SetUninteractible(true);
653 })
654 .Schedule(6s, [this](TaskContext const& /*context*/)
655 {
657 me->SetUninteractible(false);
660
662 ladyDeathwhisper->AI()->Talk(SAY_ANIMATE_DEAD);
663 });
664 break;
665 default:
666 break;
667 }
668 }
669
670 void UpdateAI(uint32 diff) override
671 {
673 return;
674
675 _scheduler.Update(diff);
676 }
677
678protected:
681};
682
683/* 37949 - Cult Adherent
684 38010 - Reanimated Adherent
685 38136 - Empowered Adherent */
687{
688 npc_cult_adherent(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
689
690 void Reset() override
691 {
694 .SetValidator([this]
695 {
697 })
698 .Schedule(5s, [this](TaskContext& deathchill)
699 {
702 else
704 deathchill.Repeat(2500ms);
705 })
706 .Schedule(15s, [this](TaskContext& shroud_of_the_occult)
707 {
709 shroud_of_the_occult.Repeat(10s);
710 })
711 .Schedule(15s, [this](TaskContext& curse_of_torpor)
712 {
715 curse_of_torpor.Repeat(18s);
716 });
717 }
718
719 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
720 {
721 switch (spellInfo->Id)
722 {
725 break;
729 me->AttackStop();
731 break;
737 .Schedule(2s, [this](TaskContext const& /*context*/)
738 {
743 me->SetUninteractible(true);
744 })
745 .Schedule(6s, [this](TaskContext const& /*context*/)
746 {
748 me->SetUninteractible(false);
752
754 ladyDeathwhisper->AI()->Talk(SAY_ANIMATE_DEAD);
755 });
756 break;
757 default:
758 break;
759 }
760 }
761
762 void UpdateAI(uint32 diff) override
763 {
765 return;
766
767 _scheduler.Update(diff);
768 }
769
770protected:
773};
774
775// 38222 - Vengeful Shade
777{
778 npc_vengeful_shade(Creature* creature) : ScriptedAI(creature) { }
779
780 void Reset() override
781 {
784
786 .Schedule(2s, [this](TaskContext const& /*context*/)
787 {
790 })
791 .Schedule(7s, [this](TaskContext const& /*context*/)
792 {
793 me->KillSelf();
794 });
795 }
796
797 void SetGUID(ObjectGuid const& guid, int32 id) override
798 {
800 return;
801
802 _targetGUID = guid;
803 }
804
805 void SpellHitTarget(WorldObject* /*target*/, SpellInfo const* spellInfo) override
806 {
807 switch (spellInfo->Id)
808 {
813 me->KillSelf();
814 break;
815 default:
816 break;
817 }
818 }
819
820 void UpdateAI(uint32 diff) override
821 {
822 _scheduler.Update(diff);
823 }
824
825private:
828};
829
830// 38472, 38485 - Darnavan
832{
833 npc_darnavan(Creature* creature) : ScriptedAI(creature)
834 {
835 Initialize();
836 }
837
839 {
840 _canCharge = true;
841 _canShatter = true;
842 }
843
853
854 void JustDied(Unit* killer) override
855 {
856 _events.Reset();
857
858 if (!killer)
859 return;
860
861 if (Player* owner = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
862 {
863 if (Group* group = owner->GetGroup())
864 {
865 for (GroupReference const& itr : group->GetMembers())
866 if (itr.GetSource()->IsInMap(owner))
867 itr.GetSource()->FailQuest(QUEST_DEPROGRAMMING);
868 }
869 else
870 owner->FailQuest(QUEST_DEPROGRAMMING);
871 }
872 }
873
874 void MovementInform(uint32 type, uint32 id) override
875 {
876 if (type != POINT_MOTION_TYPE || id != POINT_DESPAWN)
877 return;
878
880 }
881
882 void JustEngagedWith(Unit* /*victim*/) override
883 {
885 }
886
887 void UpdateAI(uint32 diff) override
888 {
889 if (!UpdateVictim())
890 return;
891
892 _events.Update(diff);
893
895 return;
896
898 {
900 _canShatter = false;
902 return;
903 }
904
906 {
908 _canCharge = false;
910 return;
911 }
912
913 while (uint32 eventId = _events.ExecuteEvent())
914 {
915 switch (eventId)
916 {
920 break;
922 _canCharge = true;
923 break;
927 break;
931 break;
933 _canShatter = true;
934 break;
938 break;
939 }
940 }
941 }
942
943private:
947};
948
949// 70842 - Mana Barrier
951{
952 void HandlePeriodicTick(AuraEffect const* /*aurEff*/)
953 {
955 if (Unit* caster = GetCaster())
956 {
957 int32 missingHealth = int32(caster->GetMaxHealth() - caster->GetHealth());
958 caster->ModifyHealth(missingHealth);
959 caster->ModifyPower(POWER_MANA, -missingHealth);
960 }
961 }
962
967};
968
969// 71289 - Dominate Mind
971{
972 bool Validate(SpellInfo const* /*spell*/) override
973 {
975 }
976
977 void HandleApply(AuraEffect const* /*eff*/, AuraEffectHandleModes /*mode*/)
978 {
979 Unit* target = GetTarget();
980 target->CastSpell(target, SPELL_DOMINATE_MIND_SCALE, true);
981 }
982
987};
988
989// 72478 - Summon Spirits
991{
992 bool Validate(SpellInfo const* /*spell*/) override
993 {
995 }
996
998 {
1000 }
1001
1006};
1007
1008// 70674 - Vampiric Might
1010{
1011 bool Validate(SpellInfo const* /*spell*/) override
1012 {
1014 }
1015
1016 void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
1017 {
1019 DamageInfo* damageInfo = eventInfo.GetDamageInfo();
1020 if (!damageInfo || !damageInfo->GetDamage())
1021 return;
1022
1023 Unit* target = GetTarget();
1024 uint32 damage = damageInfo->GetDamage();
1025 ApplyPct(damage, aurEff->GetAmount());
1026 CastSpellExtraArgs args(aurEff);
1027 args.AddSpellBP0(damage);
1028 target->CastSpell(target, SPELL_VAMPIRIC_MIGHT_PROC, args);
1029 }
1030
1035};
1036
1037// 69483 - Dark Reckoning
1039{
1040 bool Validate(SpellInfo const* spell) override
1041 {
1042 return ValidateSpellEffect({ { spell->Id, EFFECT_0 } })
1043 && ValidateSpellInfo({ spell->GetEffect(EFFECT_0).TriggerSpell });
1044 }
1045
1046 void OnPeriodic(AuraEffect const* aurEff)
1047 {
1049 if (Unit* caster = GetCaster())
1050 {
1051 uint32 spellId = aurEff->GetSpellEffectInfo().TriggerSpell;
1052 caster->CastSpell(GetTarget(), spellId, aurEff);
1053 }
1054 }
1055
1060};
1061
1063{
1064 public:
1065 at_lady_deathwhisper_entrance() : OnlyOnceAreaTriggerScript("at_lady_deathwhisper_entrance") { }
1066
1067 bool TryHandleOnce(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
1068 {
1069 if (InstanceScript* instance = player->GetInstanceScript())
1070 if (instance->GetBossState(DATA_LADY_DEATHWHISPER) != DONE)
1071 if (Creature* ladyDeathwhisper = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_LADY_DEATHWHISPER)))
1072 ladyDeathwhisper->AI()->DoAction(ACTION_START_INTRO);
1073
1074 return true;
1075 }
1076};
1077
First const & RAND(First const &first, Second const &second, Rest const &... rest)
@ DIFFICULTY_10_N
Definition DBCEnums.h:939
uint8_t uint8
Definition Define.h:156
int32_t int32
Definition Define.h:150
uint64_t uint64
Definition Define.h:153
uint32_t uint32
Definition Define.h:154
@ IN_PROGRESS
@ DONE
@ POINT_MOTION_TYPE
@ TEMPSUMMON_CORPSE_TIMED_DESPAWN
std::list< ObjectGuid > GuidList
Definition ObjectGuid.h:433
@ TYPEID_PLAYER
Definition ObjectGuid.h:44
@ SPELL_BERSERK
Definition PlayerAI.cpp:371
#define sQuestPoolMgr
Definition QuestPools.h:68
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:43
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1383
SpellEffIndex
@ EFFECT_1
@ EFFECT_0
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_ATTACK_ME
@ SPELL_SCHOOL_MASK_NORMAL
@ IMMUNITY_STATE
@ IMMUNITY_EFFECT
@ POWER_MANA
@ FACTION_FRIENDLY
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_DUMMY
@ SPELL_AURA_MOD_TAUNT
@ SPELL_AURA_AOE_CHARM
@ SPELL_AURA_PERIODIC_DUMMY
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
@ SPELLVALUE_MAX_TARGETS
#define AuraEffectProcFn(F, I, N)
#define SpellEffectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define AuraEffectApplyFn(F, I, N, M)
EvadeReason
@ REACT_PASSIVE
@ REACT_AGGRESSIVE
DamageEffectType
@ UNIT_FLAG_NON_ATTACKABLE
@ UNIT_STATE_CASTING
Definition Unit.h:290
T ApplyPct(T &base, U pct)
Definition Util.h:91
@ ACTION_COMPLETE_QUEST
@ NPC_DARNAVAN_CREDIT_25
@ NPC_DARNAVAN_CREDIT_10
#define NPC_DARNAVAN_CREDIT
@ SPELL_DARK_MARTYRDOM_ADHERENT_25H
@ SPELL_DARK_MARTYRDOM_ADHERENT
@ SPELL_CLEAR_ALL_DEBUFFS
@ SPELL_DARK_TRANSFORMATION_T
@ SPELL_CURSE_OF_TORPOR
@ SPELL_SUMMON_SPIRITS
@ SPELL_DARK_EMPOWERMENT
@ SPELL_DEATHCHILL_BLAST
@ SPELL_VENGEFUL_BLAST_10H
@ SPELL_DOMINATE_MIND
@ SPELL_FANATIC_S_DETERMINATION
@ SPELL_DARK_TRANSFORMATION
@ SPELL_SHATTERING_THROW
@ SPELL_VENGEFUL_BLAST_PASSIVE
@ SPELL_DARK_EMPOWERMENT_T
@ SPELL_DARK_MARTYRDOM_ADHERENT_10H
@ SPELL_TOUCH_OF_INSIGNIFICANCE
@ SPELL_DARK_MARTYRDOM_FANATIC
@ SPELL_VENGEFUL_BLAST_25N
@ SPELL_SHROUD_OF_THE_OCCULT
@ SPELL_DEATH_AND_DECAY
@ SPELL_TELEPORT_VISUAL
@ SPELL_DARK_MARTYRDOM_T
@ SPELL_DARK_MARTYRDOM_FANATIC_10H
@ SPELL_DEATHCHILL_BOLT
@ SPELL_ADHERENT_S_DETERMINATION
@ SPELL_NECROTIC_STRIKE
@ SPELL_FROSTBOLT_VOLLEY
@ SPELL_VENGEFUL_BLAST_25H
@ SPELL_DARK_MARTYRDOM_FANATIC_25H
@ SPELL_DOMINATE_MIND_SCALE
@ SPELL_DARK_MARTYRDOM_ADHERENT_25N
@ SPELL_VAMPIRIC_MIGHT_PROC
@ SPELL_VAMPIRIC_MIGHT
@ SPELL_SHADOW_CLEAVE
@ SPELL_INTIMIDATING_SHOUT
@ SPELL_PERMANENT_FEIGN_DEATH
@ SPELL_SHADOW_CHANNELING
@ SPELL_DARK_MARTYRDOM_FANATIC_25N
@ DATA_VENGEFUL_SHADE_TARGET_GUID
void AddSC_boss_lady_deathwhisper()
#define NPC_DARNAVAN
uint32 const SummonEntries[2]
@ SAY_DARNAVAN_RESCUED
@ SAY_DARK_TRANSFORMATION
@ SAY_DARK_EMPOWERMENT
@ EVENT_DARNAVAN_INTIMIDATING_SHOUT
@ EVENT_DARNAVAN_SHATTERING_THROW
@ EVENT_DARNAVAN_MORTAL_STRIKE
@ EVENT_DARNAVAN_SUNDER_ARMOR
@ EVENT_DARNAVAN_CHARGE
@ EVENT_DARNAVAN_BLADESTORM
Position const SummonPositions[7]
#define QUEST_DEPROGRAMMING
SpellEffectInfo const & GetSpellEffectInfo() const
SpellEffectValue GetAmount() const
void PreventDefaultAction()
HookList< EffectPeriodicHandler > OnEffectPeriodic
HookList< EffectApplyHandler > AfterEffectApply
Unit * GetCaster() const
Unit * GetTarget() const
HookList< EffectProcHandler > OnEffectProc
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
TypeID GetTypeId() const
Definition BaseEntity.h:166
InstanceScript *const instance
void _DespawnAtEvade(Seconds delayToRespawn=30s, Creature *who=nullptr)
TaskScheduler scheduler
SummonList summons
void DoZoneInCombat()
Definition CreatureAI.h:169
bool UpdateVictim()
void AttackStart(Unit *victim) override
== Triggered Actions Requested ==================
Creature *const me
Definition CreatureAI.h:63
void SetCanMelee(bool canMelee, bool fleeFromMelee=false)
void SetReactState(ReactStates st)
Definition Creature.h:180
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
bool UpdateEntry(uint32 entry, CreatureData const *data=nullptr, bool updateLevel=true)
Definition Creature.cpp:591
CreatureAI * AI() const
Definition Creature.h:235
uint32 GetDamage() const
Definition Unit.h:466
bool Execute(uint64, uint32) override
DaranavanMoveEvent(Creature &darnavan)
void Update(uint32 time)
Definition EventMap.h:77
EventId ExecuteEvent()
Definition EventMap.cpp:77
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:40
void Reset()
Definition EventMap.cpp:25
Definition Group.h:209
virtual bool SetBossState(uint32 id, EncounterState state)
void DoCastSpellOnPlayers(uint32 spell, bool includePets=false, bool includeControlled=false)
virtual ObjectGuid GetGuidData(uint32 type) const override
void DoUpdateCriteria(CriteriaType type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
virtual bool CheckRequiredBosses(uint32, Player const *=nullptr) const
void MoveChase(Unit *target, Optional< ChaseRange > dist={}, Optional< ChaseAngle > angle={})
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={}, Optional< MovementFadeObject > fadeObject={}, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
void Clear()
Definition ObjectGuid.h:329
Player * ToPlayer()
Definition Object.h:126
uint32 GetEntry() const
Definition Object.h:89
DamageInfo * GetDamageInfo() const
Definition Unit.h:524
uint32 TriggerSpell
Definition SpellInfo.h:234
uint32 const Id
Definition SpellInfo.h:328
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition SpellInfo.h:590
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
static bool ValidateSpellEffect(std::initializer_list< std::pair< uint32, SpellEffIndex > > effects)
Unit * GetCaster() const
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
iterator begin()
void Summon(Creature const *summon)
iterator end()
StorageType::iterator iterator
TaskScheduler::repeated_t GetRepeatCounter() const
Returns the repeat counter which increases every time the task is repeated.
TaskContext & Repeat(TaskScheduler::duration_t duration)
TaskScheduler & CancelGroup(group_t group)
TaskScheduler & CancelAll()
TaskScheduler & Schedule(duration_t time, task_handler_t task)
TaskScheduler & SetValidator(P &&predicate)
Sets a validator which is asked if tasks are allowed to be executed.
TaskScheduler & Update()
Update the scheduler to the current time.
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:160
virtual void SetGUID(ObjectGuid const &guid, int32 id)
Definition UnitAI.h:76
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:172
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:76
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition UnitAI.cpp:71
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:162
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:81
Definition Unit.h:647
void ApplySpellImmune(uint32 spellId, SpellImmunity op, uint32 type, bool apply)
Definition Unit.cpp:8261
bool IsWithinMeleeRange(Unit const *obj) const
Definition Unit.h:722
void SetPower(Powers power, int32 val, bool withPowerUpdate=true)
Definition Unit.cpp:10114
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition Unit.cpp:3253
MotionMaster * GetMotionMaster()
Definition Unit.h:1750
bool HasUnitFlag(UnitFlags flags) const
Definition Unit.h:860
Aura * AddAura(uint32 spellId, Unit *target)
Definition Unit.cpp:12344
int32 GetMaxPower(Powers power) const
Definition Unit.cpp:10105
void SetUninteractible(bool apply)
Definition Unit.cpp:8583
Unit * EnsureVictim() const
Definition Unit.h:740
bool Attack(Unit *victim, bool meleeAttack)
Definition Unit.cpp:5872
Unit * GetVictim() const
Definition Unit.h:738
int32 GetPower(Powers power) const
Definition Unit.cpp:10096
bool IsImmunedToDamage(SpellSchoolMask meleeSchoolMask) const
Definition Unit.cpp:7874
bool HasUnitState(const uint32 f) const
Definition Unit.h:755
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4822
void KillSelf(bool durabilityLoss=true, bool skipSettingDeathState=false)
Definition Unit.h:951
bool AttackStop()
Definition Unit.cpp:5984
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3992
InstanceScript * GetInstanceScript() const
Definition Object.cpp:394
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2222
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:1403
void setActive(bool isActiveObject)
Definition Object.cpp:274
Player * GetCharmerOrOwnerPlayerOrPlayerItself() const
Definition Object.cpp:1626
bool TryHandleOnce(Player *player, AreaTriggerEntry const *) override
bool Validate(SpellInfo const *spell) override
void OnPeriodic(AuraEffect const *aurEff)
bool Validate(SpellInfo const *) override
void HandleApply(AuraEffect const *, AuraEffectHandleModes)
void HandlePeriodicTick(AuraEffect const *)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect *aurEff, ProcEventInfo &eventInfo)
@ LIGHT_S_HAMMER_TELEPORT
#define RegisterIcecrownCitadelCreatureAI(ai_name)
@ DATA_LADY_DEATHWHISPER
@ NPC_CULT_ADHERENT
@ NPC_EMPOWERED_ADHERENT
@ NPC_DEFORMED_FANATIC
@ NPC_REANIMATED_ADHERENT
@ NPC_CULT_FANATIC
@ NPC_REANIMATED_FANATIC
@ NPC_VENGEFUL_SHADE
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
auto SelectRandomContainerElement(C const &container) -> std::add_const_t< decltype(*std::ranges::begin(container))> &
Definition Containers.h:110
CastSpellExtraArgs & AddSpellBP0(SpellEffectValue val)
CastSpellExtraArgs & AddSpellMod(SpellValueMod mod, int32 val)
bool IsHeroic() const
void DoStartNoMovement(Unit *target)
void AttackStart(Unit *) override
== Triggered Actions Requested ==================
T const & RAID_MODE(T const &normal10, T const &normal25) const
Difficulty GetDifficulty() const
bool Is25ManRaid() const
void ResetThreatList(Unit *who=nullptr)
void DoStartMovement(Unit *target, float distance=0.0f, float angle=0.0f)
void JustDied(Unit *killer) override
void KilledUnit(Unit *victim) override
void JustSummoned(Creature *summon) override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
void SummonedCreatureDies(Creature *summon, Unit *) override
void UpdateAI(uint32 diff) override
void JustEngagedWith(Unit *who) override
void Summon(uint32 entry, Position const &pos)
void DoAction(int32 action) override
boss_lady_deathwhisper(Creature *creature)
void AttackStart(Unit *victim) override
void SpellHitTarget(WorldObject *target, SpellInfo const *spellInfo) override
void EnterEvadeMode(EvadeReason) override
npc_cult_adherent(Creature *creature)
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
void UpdateAI(uint32 diff) override
npc_cult_fanatic(Creature *creature)
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
void UpdateAI(uint32 diff) override
void JustEngagedWith(Unit *) override
void JustDied(Unit *killer) override
npc_darnavan(Creature *creature)
void UpdateAI(uint32 diff) override
void MovementInform(uint32 type, uint32 id) override
npc_vengeful_shade(Creature *creature)
void SetGUID(ObjectGuid const &guid, int32 id) override
void SpellHitTarget(WorldObject *, SpellInfo const *spellInfo) override
void UpdateAI(uint32 diff) override