TrinityCore
Loading...
Searching...
No Matches
obsidian_sanctum.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 "CellImpl.h"
20#include "GridNotifiersImpl.h"
21#include "InstanceScript.h"
22#include "MotionMaster.h"
23#include "ObjectAccessor.h"
24#include "obsidian_sanctum.h"
25#include "ScriptedCreature.h"
26#include "TemporarySummon.h"
27
29{
30 //Mini bosses common spells
31 SPELL_TWILIGHT_RESIDUE = 61885, // makes immune to shadow damage, applied when leave phase
32
33 //Miniboses (Vesperon, Shadron, Tenebron)
34 SPELL_SHADOW_BREATH = 57570, // Inflicts 6938 to 8062 Fire damage to enemies in a cone in front of the caster.
35 SPELL_SHADOW_FISSURE = 57579, // Deals 6188 to 8812 Shadow damage to any enemy within the Shadow fissure after 5 sec.
36
37 //Vesperon
38 //In portal is a disciple, when disciple killed remove Power_of_vesperon, portal open multiple times
39 NPC_ACOLYTE_OF_VESPERON = 31219, // Acolyte of Vesperon
40 SPELL_POWER_OF_VESPERON = 61251, // Vesperon's presence decreases the maximum health of all enemies by 25%.
41 SPELL_TWILIGHT_TORMENT_VESP = 57948, // (Shadow only) trigger 57935 then 57988
42 SPELL_TWILIGHT_TORMENT_VESP_ACO = 58853, // (Fire and Shadow) trigger 58835 then 57988
43
44 //Shadron
45 //In portal is a disciple, when disciple killed remove Power_of_vesperon, portal open multiple times
46 NPC_ACOLYTE_OF_SHADRON = 31218, // Acolyte of Shadron
47 SPELL_POWER_OF_SHADRON = 58105, // Shadron's presence increases Fire damage taken by all enemies by 100%.
48 SPELL_GIFT_OF_TWILIGTH_SHA = 57835, // TARGET_SCRIPT shadron
49 SPELL_GIFT_OF_TWILIGTH_SAR = 58766, // TARGET_SCRIPT sartharion
50 SPELL_VOID_BLAST = 57581, // Twilight Fissure
51
52 //Tenebron
53 //in the portal spawns 6 eggs, if not killed in time (approx. 20s) they will hatch, whelps can cast 60708
54 SPELL_POWER_OF_TENEBRON = 61248, // Tenebron's presence increases Shadow damage taken by all enemies by 100%.
55 //Tenebron, dummy spell
56 SPELL_SUMMON_TWILIGHT_WHELP = 58035, // doesn't work, will spawn NPC_TWILIGHT_WHELP
57 SPELL_SUMMON_SARTHARION_TWILIGHT_WHELP = 58826, // doesn't work, will spawn NPC_SHARTHARION_TWILIGHT_WHELP
66
67 SPELL_TWILIGHT_SHIFT_ENTER = 57620, // enter phase. Player get this when click GO
68 SPELL_TWILIGHT_SHIFT = 57874, // Twilight Shift Aura
69 SPELL_TWILIGHT_SHIFT_REMOVAL = 61187, // leave phase
70 SPELL_TWILIGHT_SHIFT_REMOVAL_ALL = 61190, // leave phase (probably version to make all leave)
71
72 //Whelps
75 SPELL_FADE_ARMOR = 60708, // Reduces the armor of an enemy by 1500 for 15s
76
77 //flame tsunami
78 SPELL_FLAME_TSUNAMI = 57494, // the visual dummy
79 SPELL_FLAME_TSUNAMI_LEAP = 60241, // SPELL_EFFECT_138 some leap effect, causing caster to move in direction
80
81 SPELL_FLAME_TSUNAMI_DMG_AURA = 57491, // periodic damage, npc has this aura
83 NPC_LAVA_BLAZE = 30643, // adds spawning from flame strike
84
85 //using these custom points for dragons start and end
87 POINT_ID_LAND = 200
88};
89
90enum Misc
91{
93};
94
95#define MAX_WAYPOINT 6
96//points around raid "isle", counter clockwise. should probably be adjusted to be more alike
98{
99 { 3214.012f, 468.932f, 98.652f, 0.0f },
100 { 3244.950f, 468.427f, 98.652f, 0.0f },
101 { 3283.520f, 496.869f, 98.652f, 0.0f },
102 { 3287.316f, 555.875f, 98.652f, 0.0f },
103 { 3250.479f, 585.827f, 98.652f, 0.0f },
104 { 3209.969f, 566.523f, 98.652f, 0.0f }
105};
106
107Position const AcolyteofShadron = { 3363.92f, 534.703f, 97.2683f, 0.0f };
108Position const AcolyteofShadron2 = { 3246.57f, 551.263f, 58.6164f, 0.0f };
109Position const AcolyteofVesperon = { 3145.68f, 520.71f, 89.7f, 0.0f };
110Position const AcolyteofVesperon2 = { 3246.57f, 551.263f, 58.6164f, 0.0f };
111
113{
114 { 3219.28f, 669.121f, 88.5549f, 0.0f },
115 { 3221.55f, 682.852f, 90.5361f, 0.0f },
116 { 3239.77f, 685.94f, 90.3168f, 0.0f },
117 { 3250.33f, 669.749f, 88.7637f, 0.0f },
118 { 3246.6f, 642.365f, 84.8752f, 0.0f },
119 { 3233.68f, 653.117f, 85.7051f, 0.0f }
120};
121
123{
124 { 3252.73f, 515.762f, 58.5501f, 0.0f },
125 { 3256.56f, 521.119f, 58.6061f, 0.0f },
126 { 3255.63f, 527.513f, 58.7568f, 0.0f },
127 { 3264.90f, 525.865f, 58.6436f, 0.0f },
128 { 3264.26f, 516.364f, 58.8011f, 0.0f },
129 { 3257.54f, 502.285f, 58.2077f, 0.0f }
130};
131
143
145{
146 // Shared Events
150
151 // Tenebron
153
154 // Shadron
156
157 // Vesperon
160
161// to control each dragons common abilities
163{
164 dummy_dragonAI(Creature* creature) : ScriptedAI(creature)
165 {
166 Initialize();
167 instance = creature->GetInstanceScript();
168 }
169
171 {
172 waypointId = 0;
173 portalRespawnTime = 30000;
174 _canMoveFree = false;
175 _canLoot = true;
176 }
177
178 void Reset() override
179 {
182
183 events.Reset();
184 Initialize();
185 }
186
187 void JustEngagedWith(Unit* /*who*/) override
188 {
191
194 }
195
196 void SetData(uint32 type, uint32 value) override
197 {
198 if (type == DATA_CAN_LOOT)
199 _canLoot = value != 0;
200 }
201
202 void MovementInform(uint32 type, uint32 pointId) override
203 {
204 if (!instance || type != POINT_MOTION_TYPE)
205 return;
206
207 // debug_log("dummy_dragonAI: %s reached point %u", me->GetName(), uiPointId);
208
209 // if healers messed up the raid and we was already initialized
211 {
213 return;
214 }
215
216 // this is end, if we reach this, don't do much
217 if (pointId == POINT_ID_LAND)
218 {
221 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0, true))
222 {
223 AddThreat(target, 1.0f);
224 me->Attack(target, true);
225 me->GetMotionMaster()->MoveChase(target);
226 }
227
228 _canMoveFree = false;
229 return;
230 }
231
232 // increase
233 waypointId = pointId + 1;
234
235 // if we have reached a point bigger or equal to count, it mean we must reset to point 0
237 {
238 if (!_canMoveFree)
239 _canMoveFree = true;
240
241 waypointId = 0;
242 }
243
245 }
246
247 // "opens" the portal and does the "opening" whisper
249 {
250 // there are 4 portal spawn locations, each are expected to be spawned with negative spawntimesecs in database
251
252 // using a grid search here seem to be more efficient than caching all four guids
253 // in instance script and calculate range to each.
254 GameObject* portal = me->FindNearestGameObject(GO_TWILIGHT_PORTAL, 50.0f, false);
255
256 switch (me->GetEntry())
257 {
258 case NPC_TENEBRON:
259 {
261 {
262 for (uint32 i = 0; i < 6; ++i)
264 }
265 else
266 {
267 for (uint32 i = 0; i < 6; ++i)
269 }
270 break;
271 }
272 case NPC_SHADRON:
273 {
276 else
278
279 break;
280 }
281 case NPC_VESPERON:
282 {
284 {
286 {
288 acolyte->InterruptNonMeleeSpells(true);
289 me->CastSpell(me, 32747, false);
290 }
291 }
292 else
293 {
295 {
297 acolyte->InterruptNonMeleeSpells(true);
298 me->CastSpell(me, 32747, false);
299 }
300 }
301
302 break;
303 }
304 }
305
308
309 // By using SetRespawnTime() we will actually "spawn" the object with our defined time.
310 // Once time is up, portal will disappear again.
311 if (portal && !portal->isSpawned())
313
314 // Unclear what are expected to happen if one drake has a portal open already
315 // Refresh respawnTime so time again are set to 30secs?
316 }
317
318 void KilledUnit(Unit* who) override
319 {
320 if (who->GetTypeId() == TYPEID_PLAYER)
321 Talk(SAY_SLAY);
322 }
323
324 void JustDied(Unit* /*killer*/) override
325 {
326 if (!_canLoot)
327 me->SetLootRecipient(nullptr);
328
329 uint32 spellId = 0;
330
331 switch (me->GetEntry())
332 {
333 case NPC_TENEBRON:
334 spellId = SPELL_POWER_OF_TENEBRON;
337 break;
338 case NPC_SHADRON:
339 spellId = SPELL_POWER_OF_SHADRON;
342 if (Creature* acolyte = me->FindNearestCreature(NPC_ACOLYTE_OF_SHADRON, 100.0f))
343 acolyte->KillSelf();
344 break;
345 case NPC_VESPERON:
346 spellId = SPELL_POWER_OF_VESPERON;
350 acolyte->KillSelf();
351 break;
352 }
353
355 me->RemoveAurasDueToSpell(spellId);
356
358
359 // not if solo mini-boss fight
361 return;
362
363 // Twilight Revenge to main boss
365 if (sartharion->IsAlive())
366 {
367 sartharion->RemoveAurasDueToSpell(spellId);
368 DoCast(sartharion, SPELL_TWILIGHT_REVENGE, true);
369 }
370 }
371
372 void UpdateAI(uint32 diff) override
373 {
374 events.Update(diff);
375
377 {
380 }
381 }
382
383 void ExecuteEvent(uint32 eventId)
384 {
385 switch (eventId)
386 {
388 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
390 events.ScheduleEvent(eventId, 15s, 20s);
391 break;
395 events.ScheduleEvent(eventId, 20s, 25s);
396 break;
397 default:
398 break;
399 }
400 }
401
402 protected:
409};
410
411/*######
412## Tenebron
413######*/
414
416{
417 npc_tenebron(Creature* creature) : dummy_dragonAI(creature) { }
418
419 void Reset() override
420 {
422 }
423
424 void JustEngagedWith(Unit* who) override
425 {
427
429 }
430
431 void UpdateAI(uint32 diff) override
432 {
433 // if no target, update dummy and return
434 if (!UpdateVictim())
435 {
437 return;
438 }
439
440 events.Update(diff);
441
442 while (uint32 eventId = events.ExecuteEvent())
443 {
444 switch (eventId)
445 {
446 case EVENT_HATCH_EGGS:
447 OpenPortal();
449 break;
450 default:
452 break;
453 }
454 }
455
457 }
458};
459
460/*######
461## Shadron
462######*/
463
465{
466 npc_shadron(Creature* creature) : dummy_dragonAI(creature) { }
467
480
481 void JustEngagedWith(Unit* who) override
482 {
484
486 }
487
488 void UpdateAI(uint32 diff) override
489 {
490 // if no target, update dummy and return
491 if (!UpdateVictim())
492 {
494 return;
495 }
496
497 events.Update(diff);
498
499 while (uint32 eventId = events.ExecuteEvent())
500 {
501 switch (eventId)
502 {
506 else
507 {
509 return;
510
511 OpenPortal();
512
514
516 }
517 break;
518 default:
520 break;
521 }
522 }
523
525 }
526};
527
528/*######
529## Vesperon
530######*/
531
533{
534 npc_vesperon(Creature* creature) : dummy_dragonAI(creature) { }
535
536 void Reset() override
537 {
539 }
540
541 void JustEngagedWith(Unit* who) override
542 {
544
546 }
547
548 void UpdateAI(uint32 diff) override
549 {
550 // if no target, update dummy and return
551 if (!UpdateVictim())
552 {
554 return;
555 }
556
557 events.Update(diff);
558
559 while (uint32 eventId = events.ExecuteEvent())
560 {
561 switch (eventId)
562 {
566 else
567 {
568 OpenPortal();
571 }
572 break;
573 default:
575 break;
576 }
577 }
578
580 }
581};
582
583/*######
584## Acolyte of Shadron
585######*/
586
588{
590 {
591 instance = creature->GetInstanceScript();
592 }
593
594 void Reset() override
595 {
596 // Despawn the NPC automatically after 28 seconds
597 me->DespawnOrUnsummon(28s);
598
599 //if not solo fight, buff main boss, else place debuff on mini-boss. both spells TARGET_SCRIPT
601 {
603 sartharion->AddAura(SPELL_GIFT_OF_TWILIGTH_SAR, sartharion);
604 }
605 else
606 {
608 shadron->AddAura(SPELL_GIFT_OF_TWILIGTH_SHA, shadron);
609 }
610
612 }
613
614 void JustDied(Unit* /*killer*/) override
615 {
618
619 Map::PlayerList const& PlayerList = me->GetMap()->GetPlayers();
620
621 if (PlayerList.isEmpty())
622 return;
623
624 for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
625 {
626 if (i->GetSource()->IsAlive() && i->GetSource()->HasAura(SPELL_TWILIGHT_SHIFT) && !i->GetSource()->GetVictim())
627 {
628 i->GetSource()->CastSpell(i->GetSource(), SPELL_TWILIGHT_SHIFT_REMOVAL_ALL, true);
629 i->GetSource()->CastSpell(i->GetSource(), SPELL_TWILIGHT_RESIDUE, true);
630 i->GetSource()->RemoveAurasDueToSpell(SPELL_TWILIGHT_SHIFT);
631 i->GetSource()->RemoveAurasDueToSpell(SPELL_TWILIGHT_SHIFT_ENTER);
632 }
633 }
634
635 // not solo fight, so main boss has debuff
637 if (debuffTarget->IsAlive() && debuffTarget->HasAura(SPELL_GIFT_OF_TWILIGTH_SAR))
638 debuffTarget->RemoveAurasDueToSpell(SPELL_GIFT_OF_TWILIGTH_SAR);
639
640 // event not in progress, then solo fight and must remove debuff mini-boss
642 if (debuffTarget->IsAlive() && debuffTarget->HasAura(SPELL_GIFT_OF_TWILIGTH_SHA))
643 debuffTarget->RemoveAurasDueToSpell(SPELL_GIFT_OF_TWILIGTH_SHA);
644 }
645
646 void UpdateAI(uint32 /*diff*/) override
647 {
648 if (!UpdateVictim())
649 return;
650
652 }
653
654private:
656};
657
658/*######
659## Acolyte of Vesperon
660######*/
661
663{
665 {
666 instance = creature->GetInstanceScript();
667 }
668
669 void Reset() override
670 {
671 // Despawn the NPC automatically after 28 seconds
672 me->DespawnOrUnsummon(28s);
673
675
677 }
678
679 void JustDied(Unit* /*killer*/) override
680 {
682
683 // remove twilight torment on Vesperon
685 {
687
688 if (vesperon->IsAlive() && vesperon->HasAura(SPELL_TWILIGHT_TORMENT_VESP))
689 vesperon->RemoveAurasDueToSpell(SPELL_TWILIGHT_TORMENT_VESP);
690 }
691
692 Map::PlayerList const& PlayerList = me->GetMap()->GetPlayers();
693
694 if (PlayerList.isEmpty())
695 return;
696
697 for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
698 {
699 if (i->GetSource()->IsAlive() && i->GetSource()->HasAura(SPELL_TWILIGHT_SHIFT) && !i->GetSource()->GetVictim())
700 {
701 i->GetSource()->CastSpell(i->GetSource(), SPELL_TWILIGHT_SHIFT_REMOVAL_ALL, true);
702 i->GetSource()->CastSpell(i->GetSource(), SPELL_TWILIGHT_RESIDUE, true);
703 i->GetSource()->RemoveAurasDueToSpell(SPELL_TWILIGHT_SHIFT);
704 i->GetSource()->RemoveAurasDueToSpell(SPELL_TWILIGHT_SHIFT_ENTER);
705 }
706 if (i->GetSource()->IsAlive() && i->GetSource()->HasAura(SPELL_TWILIGHT_TORMENT_VESP) && !i->GetSource()->GetVictim())
707 i->GetSource()->RemoveAurasDueToSpell(SPELL_TWILIGHT_TORMENT_VESP);
708 }
709
711 instance->DoRemoveAurasDueToSpellOnPlayers(57935, true, true);
712 instance->DoRemoveAurasDueToSpellOnPlayers(58835, true, true); // Components of spell Twilight Torment
713 }
714
715 void UpdateAI(uint32 /*diff*/) override
716 {
717 if (!UpdateVictim())
718 return;
719
721 }
722
723private:
725};
726
727/*######
728## Twilight Eggs
729######*/
730
735
737{
738 npc_twilight_eggs(Creature* creature) : ScriptedAI(creature)
739 {
740 SetCombatMovement(false);
741 instance = creature->GetInstanceScript();
742 }
743
744 void Reset() override
745 {
747
749 }
750
752 {
754
757 else
759 me->KillSelf();
760 }
761
762 void JustSummoned(Creature* who) override
763 {
764 DoZoneInCombat(who);
765 }
766
767 void UpdateAI(uint32 diff) override
768 {
769 events.Update(diff);
770
772 {
775
776 SpawnWhelps();
777 }
778 }
779
780private:
783};
784
785/*######
786## Flame Tsunami
787######*/
788
794
796{
797 npc_flame_tsunami(Creature* creature) : ScriptedAI(creature)
798 {
799 me->SetDisplayId(11686);
801 }
802
810
811 void UpdateAI(uint32 diff) override
812 {
813 events.Update(diff);
814
815 while (uint32 eventId = events.ExecuteEvent())
816 {
817 switch (eventId)
818 {
822 break;
824 if (Unit* lavaBlaze = GetClosestCreatureWithEntry(me, NPC_LAVA_BLAZE, 10.0f, true))
825 lavaBlaze->CastSpell(lavaBlaze, SPELL_FLAME_TSUNAMI_BUFF, true);
827 break;
828 }
829 }
830 }
831
832private:
834};
835
836/*######
837## Twilight Fissure
838######*/
839
844
846{
848 {
849 SetCombatMovement(false);
850 }
851
852 void Reset() override
853 {
855 me->AddAura(46265, me); // Wrong, can't find proper visual
856 me->AddAura(69422, me);
858 }
859
860 void UpdateAI(uint32 diff) override
861 {
862 events.Update(diff);
863
865 {
868 //DoCastVictim(57620, true);
869 //DoCastVictim(57874, true);
871 me->KillSelf();
872 }
873 }
874
875private:
877};
878
879/*######
880## Twilight Whelps
881######*/
882
887
889{
891 {
892 }
893
894 void Reset() override
895 {
899 }
900
901 void UpdateAI(uint32 diff) override
902 {
903 if (!UpdateVictim())
904 return;
905
906 // twilight torment
907 events.Update(diff);
908
910 {
913 }
914
916 }
917
918private:
920};
921
923{
924 public:
925 achievement_twilight_assist() : AchievementCriteriaScript("achievement_twilight_assist") { }
926
927 bool OnCheck(Player* /*player*/, Unit* target) override
928 {
929 return target && target->GetAI()->GetData(TWILIGHT_ACHIEVEMENTS) >= 1;
930 }
931};
932
934{
935 public:
936 achievement_twilight_duo() : AchievementCriteriaScript("achievement_twilight_duo") { }
937
938 bool OnCheck(Player* /*player*/, Unit* target) override
939 {
940 return target && target->GetAI()->GetData(TWILIGHT_ACHIEVEMENTS) >= 2;
941 }
942};
943
945{
946 public:
947 achievement_twilight_zone() : AchievementCriteriaScript("achievement_twilight_zone") { }
948
949 bool OnCheck(Player* /*player*/, Unit* target) override
950 {
951 return target && target->GetAI()->GetData(TWILIGHT_ACHIEVEMENTS) == 3;
952 }
953};
954
int32_t int32
Definition Define.h:129
uint32_t uint32
Definition Define.h:133
@ IN_PROGRESS
@ DONE
@ NOT_STARTED
@ POINT_MOTION_TYPE
@ TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN
@ TEMPSUMMON_CORPSE_TIMED_DESPAWN
@ TYPEID_PLAYER
Definition ObjectGuid.h:39
Creature * GetClosestCreatureWithEntry(WorldObject *source, uint32 entry, float maxSearchRange, bool alive=true)
@ REACT_PASSIVE
@ UNIT_FLAG_NON_ATTACKABLE
@ UNIT_FLAG_UNINTERACTIBLE
void DoZoneInCombat(Creature *creature=nullptr)
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:82
virtual void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
void SetDisplayId(uint32 modelId) override
void SetLootRecipient(Unit *unit, bool withGroup=true)
void SetReactState(ReactStates st)
Definition Creature.h:119
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
void Update(uint32 time)
Definition EventMap.h:67
EventId ExecuteEvent()
Definition EventMap.cpp:73
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:36
void Reset()
Definition EventMap.cpp:21
bool isSpawned() const
Definition GameObject.h:155
void SetRespawnTime(int32 respawn)
virtual bool SetBossState(uint32 id, EncounterState state)
void DoRemoveAurasDueToSpellOnPlayers(uint32 spell, bool includePets=false, bool includeControlled=false)
virtual ObjectGuid GetGuidData(uint32 type) const override
EncounterState GetBossState(uint32 id) const
bool isEmpty() const
Definition LinkedList.h:108
iterator end()
iterator begin()
PlayerList const & GetPlayers() const
Definition Map.h:448
void MoveChase(Unit *target, Optional< ChaseRange > dist={}, Optional< ChaseAngle > angle={})
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={})
TypeID GetTypeId() const
Definition Object.h:93
uint32 GetEntry() const
Definition Object.h:81
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:54
virtual uint32 GetData(uint32) const
Definition UnitAI.h:155
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 KillSelf(bool durabilityLoss=true)
Definition Unit.h:1023
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition Unit.cpp:3093
MotionMaster * GetMotionMaster()
Definition Unit.h:1667
bool HasUnitFlag(UnitFlags flags) const
Definition Unit.h:953
Aura * AddAura(uint32 spellId, Unit *target)
Definition Unit.cpp:11964
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:4535
UnitAI * GetAI() const
Definition Unit.h:800
bool Attack(Unit *victim, bool meleeAttack)
Definition Unit.cpp:5535
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3784
void RemoveAllAuras()
Definition Unit.cpp:4157
void SetUnitFlag(UnitFlags flags)
Definition Unit.h:954
void RemoveUnitFlag(UnitFlags flags)
Definition Unit.h:955
GameObject * FindNearestGameObject(uint32 entry, float range, bool spawnedOnly=true) const
Definition Object.cpp:2121
Map * GetMap() const
Definition Object.h:449
InstanceScript * GetInstanceScript() const
Definition Object.cpp:1087
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
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:2099
bool OnCheck(Player *, Unit *target) override
bool OnCheck(Player *, Unit *target) override
bool OnCheck(Player *, Unit *target) override
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
@ NPC_LAVA_BLAZE
@ SPELL_TWILIGHT_REVENGE
@ SPELL_POWER_OF_VESPERON
@ SPELL_POWER_OF_SHADRON
@ SPELL_SHADOW_FISSURE
@ NPC_TWILIHT_WHELP
@ POINT_ID_LAND
@ SPELL_TWILIGHT_SHIFT_REMOVAL
@ SPELL_VOID_BLAST
@ POINT_ID_INIT
@ SPELL_HATCH_EGGS_EFFECT_H
@ SPELL_FLAME_TSUNAMI_BUFF
@ NPC_SARTHARION_TWILIGHT_EGG
@ SPELL_TWILIGHT_SHIFT_ENTER
@ NPC_SARTHARION_TWILIGHT_WHELP
@ SPELL_POWER_OF_TENEBRON
@ SPELL_HATCH_EGGS_EFFECT
@ SPELL_TWILIGHT_SHIFT
@ NPC_ACOLYTE_OF_VESPERON
@ NPC_TWILIGHT_EGG
@ SPELL_TWILIGHT_TORMENT_VESP_ACO
@ SPELL_TWILIGHT_RESIDUE
@ SPELL_TWILIGHT_TORMENT_VESP
@ SPELL_HATCH_EGGS
@ SPELL_SUMMON_TWILIGHT_WHELP
@ SPELL_SUMMON_SARTHARION_TWILIGHT_WHELP
@ NPC_ACOLYTE_OF_SHADRON
@ SPELL_FLAME_TSUNAMI
@ SPELL_FLAME_TSUNAMI_LEAP
@ SPELL_SHADOW_BREATH
@ SPELL_FLAME_TSUNAMI_DMG_AURA
@ SPELL_GIFT_OF_TWILIGTH_SAR
@ SPELL_FADE_ARMOR
@ NPC_TWILIGHT_WHELP
@ SPELL_TWILIGHT_SHIFT_REMOVAL_ALL
@ SPELL_HATCH_EGGS_H
@ SPELL_GIFT_OF_TWILIGTH_SHA
@ EVENT_FADE_ARMOR
@ EVENT_ACOLYTE_SHADRON
@ EVENT_HATCH_EGGS
@ EVENT_SHADOW_BREATH
@ EVENT_ACOLYTE_VESPERON
@ EVENT_FREE_MOVEMENT
@ EVENT_SHADOW_FISSURE
@ EVENT_TSUNAMI_TIMER
@ EVENT_TSUNAMI_BUFF
TwilightFissure
@ EVENT_VOID_BLAST
@ DATA_CAN_LOOT
Position const AcolyteofShadron
@ EVENT_TWILIGHT_EGGS
Position const AcolyteofVesperon
Position const AcolyteofVesperon2
#define MAX_WAYPOINT
Position const TwilightEggsSarth[]
void AddSC_obsidian_sanctum()
@ SAY_DEATH
@ SAY_AGGRO
@ WHISPER_OPEN_PORTAL
@ SAY_SPECIAL
@ WHISPER_OPENED_PORTAL
@ SAY_BREATH
@ SAY_RESPOND
Position const dragonCommon[MAX_WAYPOINT]
Position const AcolyteofShadron2
@ GO_TWILIGHT_PORTAL
#define RegisterObsidianSanctumCreatureAI(ai_name)
@ DATA_VESPERON
@ DATA_TENEBRON
@ DATA_SARTHARION
@ DATA_PORTAL_OPEN
@ DATA_SHADRON
@ TWILIGHT_ACHIEVEMENTS
@ NPC_VESPERON
@ NPC_SHADRON
@ NPC_TENEBRON
void SetCombatMovement(bool allowMovement)
void AddThreat(Unit *victim, float amount, Unit *who=nullptr)
void SetData(uint32 type, uint32 value) override
dummy_dragonAI(Creature *creature)
void JustDied(Unit *) override
void ExecuteEvent(uint32 eventId)
void KilledUnit(Unit *who) override
void JustEngagedWith(Unit *) override
void MovementInform(uint32 type, uint32 pointId) override
InstanceScript * instance
void UpdateAI(uint32 diff) override
void Reset() override
void JustDied(Unit *) override
npc_acolyte_of_shadron(Creature *creature)
void UpdateAI(uint32) override
void UpdateAI(uint32) override
npc_acolyte_of_vesperon(Creature *creature)
void JustDied(Unit *) override
void Reset() override
npc_flame_tsunami(Creature *creature)
void UpdateAI(uint32 diff) override
void JustEngagedWith(Unit *who) override
void UpdateAI(uint32 diff) override
npc_shadron(Creature *creature)
void Reset() override
void JustEngagedWith(Unit *who) override
void UpdateAI(uint32 diff) override
npc_tenebron(Creature *creature)
void Reset() override
void Reset() override
npc_twilight_eggs(Creature *creature)
void UpdateAI(uint32 diff) override
InstanceScript * instance
void JustSummoned(Creature *who) override
void UpdateAI(uint32 diff) override
npc_twilight_fissure(Creature *creature)
void UpdateAI(uint32 diff) override
npc_twilight_whelp(Creature *creature)
void UpdateAI(uint32 diff) override
npc_vesperon(Creature *creature)
void Reset() override
void JustEngagedWith(Unit *who) override