TrinityCore
zone_borean_tundra.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 "Containers.h"
20#include "CreatureAIImpl.h"
21#include "DB2Stores.h"
22#include "GameObject.h"
23#include "GameObjectAI.h"
24#include "MotionMaster.h"
25#include "ObjectAccessor.h"
26#include "PhasingHandler.h"
27#include "Player.h"
28#include "QuestDef.h"
29#include "ScriptedEscortAI.h"
30#include "ScriptedFollowerAI.h"
31#include "ScriptedGossip.h"
32#include "SpellAuras.h"
33#include "SpellAuraEffects.h"
34#include "SpellInfo.h"
35#include "SpellScript.h"
36#include "TemporarySummon.h"
37#include "WorldSession.h"
38
39 /*######
40 ## Quest 11590: Abduction
41 ######*/
42
43// NPC 25316: Beryl Sorcerer
45{
48
51
58};
59
61{
62 npc_beryl_sorcerer(Creature* creature) : ScriptedAI(creature), _chainsCast(false) { }
63
64 void JustAppeared() override
65 {
67 }
68
69 void JustEngagedWith(Unit* who) override
70 {
71 if (me->IsValidAttackTarget(who))
72 AttackStart(who);
73
75 }
76
77 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
78 {
79 if (_chainsCast)
80 return;
81
82 if (spellInfo->Id == SPELL_ARCANE_CHAINS && caster->IsPlayer())
83 {
84 _playerGUID = caster->GetGUID();
85 _chainsCast = true;
87 }
88 }
89
90 void UpdateAI(uint32 diff) override
91 {
92 if (!UpdateVictim())
93 return;
94
95 _events.Update(diff);
96
97 if (uint32 eventId = _events.ExecuteEvent())
98 {
99 switch (eventId)
100 {
101 case EVENT_FROSTBOLT:
104 break;
107 {
109 player->KilledMonsterCredit(NPC_CAPTURED_BERLY_SORCERER);
110 }
112 break;
113 default:
114 break;
115 }
116 }
117 }
118private:
122};
123
124// NPC 25474: Captured Beryl Sorcerer
126{
128
129 void JustAppeared() override
130 {
132 me->SetImmuneToAll(true);
133 if (TempSummon const* tempSummon = me->ToTempSummon())
134 {
135 if (Player* summoner = Object::ToPlayer(tempSummon->GetSummoner()))
136 {
137 summoner->CastSpell(summoner, SPELL_ARCANE_CHAINS_CHANNEL_II);
138 StartFollow(summoner);
139 }
140 }
141 }
142
143 void MoveInLineOfSight(Unit* who) override
144 {
146
148 {
151 }
152 }
153};
154
155// Spell 45625: - Arcane Chains: Character Force Cast
157{
159 {
161 }
162
163 void Register() override
164 {
166 }
167};
168
169/*######
170## Quest 11865: Unfit for Death
171######*/
172
173// Gameobjects 187982,187995,187996,187997,187998,187999,188000,188001,188002,188003,188004,188005,188006,188007,188008: Caribou Trap
175{
184
186
188
190
193};
194
196{
198
199 void Reset() override
200 {
202 }
203
204 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
205 {
206 if (_placedFur)
207 return;
208
209 Player* playerCaster = caster->ToPlayer();
210 if (!playerCaster)
211 return;
212
213 if (spellInfo->Id == SPELL_PLACE_FAKE_FUR)
214 {
215 _playerGUID = caster->GetGUID();
216 _placedFur = true;
218 }
219 }
220
221 void UpdateAI(uint32 diff) override
222 {
223 if (!_placedFur)
224 return;
225
226 _events.Update(diff);
227
228 while (uint32 eventId = _events.ExecuteEvent())
229 {
230 switch (eventId)
231 {
232 case EVENT_FUR_SPAWN:
233 if (GameObject* fur = me->SummonGameObject(GO_HIGH_QUALITY_FUR, me->GetPosition(), QuaternionData(0.0f, 0.0f, 0.77162457f, 0.63607824f), 20s))
234 _goFurGUID = fur->GetGUID();
236 break;
239 {
240 trapper->SetFacingToObject(me);
241 _trapperGUID = trapper->GetGUID();
242 }
244 break;
247 trapper->GetMotionMaster()->MovePoint(0, trapper->GetFirstCollisionPosition(20.0f, 0));
249 break;
251 {
253 {
254 if (trapper->IsAIEnabled())
255 trapper->AI()->Talk(SAY_NESINGWARY_1);
256 }
258 break;
259 }
262 trapper->HandleEmoteCommand(EMOTE_ONESHOT_LOOT);
264 break;
267 fur->Delete();
269 break;
273 {
275 player->KilledMonsterCredit(trapper->GetEntry(), trapper->GetGUID());
276 trapper->CastSpell(trapper, SPELL_TRAPPED);
277 }
279 break;
282 trapper->DespawnOrUnsummon();
283 me->DespawnOrUnsummon(0s, 50s);
284 break;
285 default:
286 break;
287 }
288 }
289 }
290private:
296};
297
298/*######
299## Quest 11876: Help Those That Cannot Help Themselves
300######*/
301
302// Gameobjects 188022,188024,188025,188026,188027,188028,188029,188030,188031,188032,188033,188034,188035,188036,188037,188038,188039,188040,188041,188042,188043,188044: Mammoth Trap
304{
313
315
317
318 SPELL_SMASH_TRAP = 46201
320
322{
324
325 void Reset() override
326 {
329 }
330
331 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
332 {
333 Player* playerCaster = caster->ToPlayer();
334 if (!playerCaster)
335 return;
336
337 if (me->GetGoState() == GO_STATE_READY)
338 return;
339
340 if (spellInfo->Id == SPELL_SMASH_TRAP)
341 {
342 _playerGUID = caster->GetGUID();
343 _trapSmashed = true;
346 }
347 }
348
349 void UpdateAI(uint32 diff) override
350 {
351 if (!_trapSmashed)
352 return;
353
354 _events.Update(diff);
355
356 while (uint32 eventId = _events.ExecuteEvent())
357 {
358 switch (eventId)
359 {
361 if (Creature* mammoth = me->FindNearestCreature(NPC_TRAPPED_MAMMOTH, 1.0f, true))
362 {
363 _mammothGUID = mammoth->GetGUID();
364 _trapSmashed = false;
365 }
366 break;
370 {
371 mammoth->SetStandState(UNIT_STAND_STATE_STAND);
372 mammoth->SetFacingToObject(player);
373 }
375 break;
378 player->KilledMonsterCredit(NPC_TRAPPED_MAMMOTH);
380 break;
383 if (mammoth->IsAIEnabled())
384 mammoth->AI()->Talk(SAY_MAMMOTH);
386 break;
389 mammoth->GetMotionMaster()->MovePoint(0, mammoth->GetFirstCollisionPosition(50.0f, me->GetOrientation()));
391 break;
394 mammoth->DespawnOrUnsummon(0s, 120s);
396 break;
399 Reset();
400 else
402 break;
403 default:
404 break;
405 }
406 }
407 }
408private:
413};
414
416{
418 SPELL_SUBDUED = 46675
420
421// 46620 - Red Dragonblood
423{
424 void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
425 {
426 if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE || !GetCaster())
427 return;
428
429 Creature* owner = GetOwner()->ToCreature();
431 owner->CombatStop(true);
432 owner->GetMotionMaster()->Clear();
433 owner->GetMotionMaster()->MoveFollow(GetCaster(), 4.0f, 0.0f);
434 owner->CastSpell(owner, SPELL_SUBDUED, true);
437 owner->SetImmuneToAll(true);
438 owner->DespawnOrUnsummon(3min);
439 }
440
441 void Register()
442 {
444 }
445};
446
447/*######
448## Valiance Keep Cannoneer script to activate cannons
449######*/
450
452{
456
458{
460 {
461 Initialize();
462 }
463
465 {
466 uiTimer = urand(13000, 18000);
467 }
468
470
471 void Reset() override
472 {
473 Initialize();
474 }
475
476 void UpdateAI(uint32 diff) override
477 {
478 if (uiTimer <= diff)
479 {
482 if (!pCannon)
484 if (pCannon)
485 pCannon->Use(me);
486 uiTimer = urand(13000, 18000);
487 }
488 else uiTimer -= diff;
489
490 if (!UpdateVictim())
491 return;
492 }
493};
494
495/*######
496## npc_hidden_cultist
497######*/
498
500{
502 SPELL_RIGHTEOUS_VISION = 46078, //player aura
503
505
509
513
518
519 GOSSIP_ITEM_TOM_HEGGER_MENUID = 9217, //What do you know about the Cult of the Damned?
520 GOSSIP_ITEM_GUARD_MITCHELLS_MENUID = 9219, //How long have you worked for the Cult of the Damned?
521 GOSSIP_ITEM_SALTY_JOHN_THORPE_MENUID = 9218, //I have a reason to believe you're involved in the cultist activity
524
526{
528 {
529 Initialize();
530 uiEmoteState = creature->GetEmoteState();
531 uiNpcFlags = creature->GetNpcFlags();
532 }
533
535 {
536 uiEventTimer = 0;
537 uiEventPhase = 0;
538
540 }
541
544
547
549
550 void Reset() override
551 {
552 if (uiEmoteState)
554
555 if (uiNpcFlags)
557
558 Initialize();
559
561
563 }
564
565 void DoAction(int32 /*iParam*/) override
566 {
567 me->StopMoving();
571 me->SetFacingToObject(player);
572 uiEventTimer = 3000;
573 uiEventPhase = 1;
574 }
575
577 {
580 AttackStart(player);
581 }
582
583 void UpdateAI(uint32 uiDiff) override
584 {
585 if (uiEventTimer && uiEventTimer <= uiDiff)
586 {
587 switch (uiEventPhase)
588 {
589 case 1:
590 switch (me->GetEntry())
591 {
594 uiEventTimer = 5000;
595 uiEventPhase = 2;
596 break;
599 uiEventTimer = 5000;
600 uiEventPhase = 2;
601 break;
602 case NPC_TOM_HEGGER:
604 Talk(SAY_HIDDEN_CULTIST_3, player);
605 uiEventTimer = 5000;
606 uiEventPhase = 2;
607 break;
608 }
609 break;
610 case 2:
611 switch (me->GetEntry())
612 {
616 me->SetFacingToObject(player);
617 uiEventTimer = 3000;
618 uiEventPhase = 3;
619 break;
621 case NPC_TOM_HEGGER:
622 AttackPlayer();
623 uiEventPhase = 0;
624 break;
625 }
626 break;
627 case 3:
629 {
630 AttackPlayer();
631 uiEventPhase = 0;
632 }
633 break;
634 }
635 }else uiEventTimer -= uiDiff;
636
637 if (!UpdateVictim())
638 return;
639 }
640
641 bool OnGossipHello(Player* player) override
642 {
643 uint32 uiGossipText = 0;
644 uint32 charGossipItem = 0;
645
646 switch (me->GetEntry())
647 {
648 case NPC_TOM_HEGGER:
649 uiGossipText = GOSSIP_TEXT_TOM_HEGGER;
650 charGossipItem = GOSSIP_ITEM_TOM_HEGGER_MENUID;
651 break;
653 uiGossipText = GOSSIP_TEXT_SALTY_JOHN_THORPE;
655 break;
657 uiGossipText = GOSSIP_TEXT_GUARD_MITCHELSS;
658 charGossipItem = GOSSIP_ITEM_GUARD_MITCHELLS_MENUID;
659 break;
660 default:
661 return false;
662 }
663
664 InitGossipMenuFor(player, charGossipItem);
667
668 if (me->IsVendor())
670
671 SendGossipMenuFor(player, uiGossipText, me->GetGUID());
672
673 return true;
674 }
675
676 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
677 {
678 uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
679 ClearGossipMenuFor(player);
680
681 if (action == GOSSIP_ACTION_INFO_DEF + 1)
682 {
683 CloseGossipMenuFor(player);
684 uiPlayerGUID = player->GetGUID();
685 DoAction(1);
686 }
687
688 if (action == GOSSIP_ACTION_TRADE)
689 player->GetSession()->SendListInventory(me->GetGUID());
690
691 return true;
692 }
693};
694
695/*######
696## Quest 12019: Last Rites
697######*/
698
699// NPC 26170: Thassarian
701{
731
733
738 NPC_LERYSSA = 25251,
739
741 SPELL_STUN = 46957,
742
763
765 PATH_ARTHAS = 8104248,
766 PATH_TALBOT = 8104256,
767 PATH_ARLOS = 8104264,
768 PATH_LERYSSA = 8104272
770
772{
774
775 void JustAppeared() override
776 {
781 }
782
783 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
784 {
785 if (pathId == PATH_THASSARIAN)
786 {
787 me->SetWalk(false);
790 }
791 }
792
793 void UpdateAI(uint32 diff) override
794 {
796 return;
797
799 {
800 ArlosInPosition = false;
801 LeryssaInPosition = false;
803 }
804
806 {
807 TalbotJustDied = false;
809 }
810
811 _events.Update(diff);
812
813 if (uint32 eventId = _events.ExecuteEvent())
814 {
815 switch (eventId)
816 {
818 // Summon Arthas and Talbot
819 if (Creature* arthas = me->SummonCreature(NPC_IMAGE_LICH_KING, 3729.4614f, 3520.386f, 473.4048f, 1.361f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2min))
820 {
821 _arthasGUID = arthas->GetGUID();
822 arthas->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
823 arthas->SetReactState(REACT_PASSIVE);
824 arthas->SetWalk(true);
825 }
826 if (Creature* talbot = me->SummonCreature(NPC_COUNSELOR_TALBOT, 3748.7627f, 3614.0374f, 473.4048f, 4.5553f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2min))
827 {
828 _talbotGUID = talbot->GetGUID();
829 talbot->SetWalk(true);
830 TalbotJustDied = false;
831 }
833 break;
835 // Arthas load path
837 arthas->GetMotionMaster()->MovePath(PATH_ARTHAS, false);
839 break;
841 // Talbot load path
843 talbot->GetMotionMaster()->MovePath(PATH_TALBOT, false);
845 break;
847 // Talbot transform and knell
849 {
850 talbot->UpdateEntry(NPC_PRINCE_VALANAR);
851 talbot->SetFullHealth();
852 talbot->SetFaction(FACTION_UNDEAD_SCOURGE);
853 talbot->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
854 talbot->SetReactState(REACT_PASSIVE);
855 talbot->SetStandState(UNIT_STAND_STATE_KNEEL);
856 }
858 break;
860 // Talbot say text 1
862 if (talbot->IsAIEnabled())
863 talbot->AI()->Talk(SAY_TALBOT_1);
865 break;
867 // Summon General Arlos and Leryssa
868 if (Creature* arlos = me->SummonCreature(NPC_GENERAL_ARLOS, 3746.2825f, 3616.3699f, 473.4048f, 4.5029f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2min))
869 {
870 _arlosGUID = arlos->GetGUID();
871 arlos->SetWalk(true);
872 arlos->SetReactState(REACT_PASSIVE);
873 arlos->RemoveNpcFlag(UNIT_NPC_FLAG_QUESTGIVER);
874 arlos->GetMotionMaster()->MovePath(PATH_ARLOS, false);
875 }
876 if (Creature* leryssa = me->SummonCreature(NPC_LERYSSA, 3751.0986f, 3614.9219f, 473.4048f, 4.5029f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2min))
877 {
878 _leryssaGUID = leryssa->GetGUID();
879 leryssa->SetWalk(true);
880 leryssa->SetReactState(REACT_PASSIVE);
881 leryssa->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER);
882 leryssa->GetMotionMaster()->MovePath(PATH_LERYSSA, false);
883 }
885 break;
887 // Talbot say text 2
889 if (talbot->IsAIEnabled())
890 talbot->AI()->Talk(SAY_TALBOT_2);
891 break;
893 // Thassarian say text 1 and move to location
895 me->SetWalk(false);
896 me->GetMotionMaster()->MovePoint(0, 3722.527f, 3567.2583f, 477.44086f);
898 break;
900 // Thassarian say text 2
903 break;
905 // Arthas turn to Thassarian and Talbot stand
907 arthas->SetFacingToObject(me);
909 talbot->SetStandState(UNIT_STAND_STATE_STAND);
911 break;
913 // Arthas say text 2
915 if (arthas->IsAIEnabled())
916 arthas->AI()->Talk(SAY_LICH_2);
918 break;
920 // Thassarian say text 3
923 break;
925 // Talbot say text 3
927 if (talbot->IsAIEnabled())
928 talbot->AI()->Talk(SAY_TALBOT_3);
930 break;
932 // Arthas turn to Talbot say text 3
934 {
936 arthas->SetFacingToObject(talbot);
937 if (arthas->IsAIEnabled())
938 arthas->AI()->Talk(SAY_LICH_3);
939 }
941 break;
943 // Arthas turn to me and emote
945 {
946 arthas->SetFacingToObject(me);
947 arthas->HandleEmoteCommand(EMOTE_ONESHOT_POINT);
948 }
950 break;
952 // Arthas despawn
954 arthas->RemoveFromWorld();
956 break;
958 // Talbot say text 4 and attack
961 {
962 if (talbot->IsAIEnabled())
963 talbot->AI()->Talk(SAY_TALBOT_4);
964 talbot->SetFaction(FACTION_VALANAR_COMBAT);
965 talbot->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
966 talbot->SetReactState(REACT_AGGRESSIVE);
967 talbot->Attack(me, false);
968 _preFightComplete = true;
969 }
970 break;
972 // Arlos say text 1
975 {
976 if (arlos->IsAIEnabled())
977 arlos->AI()->Talk(SAY_ARLOS_1);
978 arlos->SetEmoteState(EMOTE_STATE_NONE);
979 arlos->SetStandState(UNIT_STAND_STATE_KNEEL);
980 arlos->RemoveAura(SPELL_STUN);
981 }
983 {
984 leryssa->SetEmoteState(EMOTE_STATE_NONE);
985 leryssa->RemoveAura(SPELL_STUN);
986 }
988 break;
990 // Leryssa set facing to me
993 if (Creature* leryssa = me->FindNearestCreature(NPC_LERYSSA, 50.0f, true))
994 {
995 _leryssaGUID = leryssa->GetGUID();
996 leryssa->SetFacingToObject(me);
997 me->SetFacingToObject(leryssa);
998 }
1000 break;
1002 // Arlos say text 2 and die. Leryssa say text 1
1003 if (Creature* arlos = me->FindNearestCreature(NPC_GENERAL_ARLOS, 50.0f, true))
1004 {
1005 _arlosGUID = arlos->GetGUID();
1006 if (arlos->IsAIEnabled())
1007 arlos->AI()->Talk(SAY_ARLOS_2);
1008 arlos->SetStandState(UNIT_STAND_STATE_DEAD);
1009 }
1011 {
1012 if (leryssa->IsAIEnabled())
1013 leryssa->AI()->Talk(SAY_LERYSSA_1);
1014 }
1016 break;
1018 // Thassarian say text 4
1022 break;
1024 // Leryssa run to Thassarian
1026 {
1027 leryssa->SetWalk(false);
1028 leryssa->MonsterMoveWithSpeed(3726.751f, 3568.1633f, 477.44086f, leryssa->GetSpeed(MOVE_RUN), true, true);
1029 }
1031 break;
1033 // Leryssa say text 2
1035 {
1036 if (leryssa->IsAIEnabled())
1037 leryssa->AI()->Talk(SAY_LERYSSA_2);
1038 leryssa->SetStandState(UNIT_STAND_STATE_SIT);
1039 }
1041 break;
1043 // Thassarian say text 5
1046 break;
1048 // Leryssa say text 3
1050 if (leryssa->IsAIEnabled())
1051 leryssa->AI()->Talk(SAY_LERYSSA_3);
1053 break;
1055 // Thassarian say text 6
1058 break;
1060 // Leryssa say text 4
1062 if (leryssa->IsAIEnabled())
1063 leryssa->AI()->Talk(SAY_LERYSSA_4);
1065 break;
1067 // Thassarian say text 7
1070 break;
1072 Cleanup();
1073 me->DespawnOrUnsummon(0s, 30s);
1074 break;
1075 default:
1076 break;
1077 }
1078 }
1079
1080 if (!UpdateVictim())
1081 return;
1082 }
1083
1084 void JustDied(Unit* /*killer*/) override
1085 {
1086 Cleanup();
1087 }
1088
1089 void Cleanup()
1090 {
1092 talbot->DespawnOrUnsummon();
1093
1095 leryssa->DespawnOrUnsummon();
1096
1098 arlos->DespawnOrUnsummon();
1099
1101 arthas->DespawnOrUnsummon();
1102 }
1103
1104 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
1105 {
1106 if (gossipListId == 0)
1107 {
1108 _playerGUID = player->GetGUID();
1109 CloseGossipMenuFor(player);
1111 _questEventStarted = true;
1113 }
1114 return false;
1115 }
1116
1117private:
1126public:
1130};
1131
1132// NPC 25250: General Arlos
1134{
1135 npc_general_arlos(Creature* creature) : ScriptedAI(creature) { }
1136
1137 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
1138 {
1139 if (pathId == PATH_ARLOS)
1140 {
1143 if (TempSummon* tempSummon = me->ToTempSummon())
1144 if (Unit* summoner = tempSummon->GetSummonerUnit())
1145 ENSURE_AI(npc_thassarian, summoner->GetAI())->ArlosInPosition = true;
1146 }
1147 }
1148};
1149
1150// NPC 25251: Leryssa
1152{
1153 npc_leryssa(Creature* creature) : ScriptedAI(creature) {}
1154
1155 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
1156 {
1157 if (pathId == PATH_LERYSSA)
1158 {
1159 me->SetFacingTo(4.537856f);
1162 if (TempSummon* tempSummon = me->ToTempSummon())
1163 if (Unit* summoner = tempSummon->GetSummonerUnit())
1164 ENSURE_AI(npc_thassarian, summoner->GetAI())->LeryssaInPosition = true;
1165 }
1166 }
1167};
1168
1169// NPC 25301: Counselor Talbot
1171{
1173
1177
1180 SPELL_VAMPIRIC_BOLT = 51016
1182
1184{
1185 npc_counselor_talbot(Creature* creature) : ScriptedAI(creature) {}
1186
1187 void JustEngagedWith(Unit* /*who*/) override
1188 {
1192 }
1193
1194 void UpdateAI(uint32 diff) override
1195 {
1196 if (!UpdateVictim())
1197 return;
1198
1199 if (me->GetAreaId() == AREA_LAST_RITES)
1200 {
1201 _events.Update(diff);
1202
1203 if (uint32 eventId = _events.ExecuteEvent())
1204 {
1205 switch (eventId)
1206 {
1207 case EVENT_DEFLECTION:
1210 break;
1211 case EVENT_SOUL_BLAST:
1214 break;
1218 break;
1219 default:
1220 break;
1221 }
1222 }
1223 }
1224 }
1225
1226 void JustDied(Unit* /*killer*/) override
1227 {
1228 if (TempSummon* tempSummon = me->ToTempSummon())
1229 if (Unit* summoner = tempSummon->GetSummonerUnit())
1230 ENSURE_AI(npc_thassarian, summoner->GetAI())->TalbotJustDied = true;
1231 }
1232
1233private:
1235};
1236
1238{
1239 SPELL_WINDSOUL_CREDT = 46378
1241
1242// 46374 - Windsoul Totem Aura
1244{
1246 {
1247 if (GetTarget()->isDead())
1248 if (Unit* caster = GetCaster())
1249 caster->CastSpell(nullptr, SPELL_WINDSOUL_CREDT);
1250 }
1251
1252 void Register() override
1253 {
1255 }
1256};
1257
1259{
1265
1266// 45997 - Bloodspore Ruination
1268{
1269 void HandleEffect(SpellEffIndex /*effIndex*/)
1270 {
1271 if (Unit* caster = GetCaster())
1272 if (Creature* laurith = caster->FindNearestCreature(NPC_BLOODMAGE_LAURITH, 100.0f))
1273 laurith->AI()->SetGUID(caster->GetGUID());
1274 }
1275
1276 void Register() override
1277 {
1279 }
1280};
1281
1283{
1284 npc_bloodmage_laurith(Creature* creature) : ScriptedAI(creature) { }
1285
1286 void Reset() override
1287 {
1288 _events.Reset();
1290 }
1291
1292 void SetGUID(ObjectGuid const& guid, int32 /*id*/) override
1293 {
1294 if (!_playerGUID.IsEmpty())
1295 return;
1296
1297 _playerGUID = guid;
1298
1300 me->SetFacingToObject(player);
1301
1303 }
1304
1305 void UpdateAI(uint32 diff) override
1306 {
1307 if (UpdateVictim())
1308 return;
1309
1310 _events.Update(diff);
1311
1312 if (uint32 eventId = _events.ExecuteEvent())
1313 {
1314 switch (eventId)
1315 {
1316 case EVENT_TALK:
1318 Talk(SAY_BLOODMAGE_LAURITH, player);
1321 break;
1323 me->SetFacingTo(me->GetHomePosition().GetOrientation());
1324 break;
1325 }
1326 }
1327 }
1328
1329private:
1332};
1333
1335{
1341
1348
1349// 45668 - Crafty's Ultra-Advanced Proto-Typical Shortening Blaster
1351{
1352 void HandleScript(SpellEffIndex /* effIndex */)
1353 {
1354 Unit* caster = GetCaster();
1355 Unit* target = GetHitUnit();
1356
1361
1362 caster->CastSpell(caster, spellId, true);
1363 target->CastSpell(target, spellId2, true);
1364 }
1365
1366 void Register() override
1367 {
1369 }
1370};
1371
1372/*######
1373## Quest 11611: Taken by the Scourge
1374######*/
1375
1377{
1384
1385std::array<uint32, 3> const CocoonSummonSpells =
1386{
1388};
1389
1390// 45516 - Nerub'ar Web Random Unit (Not On Quest, Script Effect)
1392{
1393 bool Validate(SpellInfo const* spellInfo) override
1394 {
1395 return ValidateSpellEffect({ { spellInfo->Id, EFFECT_0 } }) && ValidateSpellInfo({ uint32(spellInfo->GetEffect(EFFECT_0).CalcValue()) });
1396 }
1397
1398 void HandleScript(SpellEffIndex /*effIndex*/)
1399 {
1401 }
1402
1403 void Register() override
1404 {
1406 }
1407};
1408
1409// 45515 - Nerub'ar Web Random Unit (Not On Quest, Dummy)
1411{
1412 bool Validate(SpellInfo const* /*spellInfo*/) override
1413 {
1415 }
1416
1417 void HandleDummy(SpellEffIndex /*effIndex*/)
1418 {
1419 Unit* caster = GetCaster();
1420
1421 // Do nothing if has 3 soldiers
1422 Aura* aura = caster->GetAura(SPELL_FREED_SOLDIER_DEBUFF);
1423 if (!aura || aura->GetStackAmount() < 3)
1425 }
1426
1427 void Register() override
1428 {
1430 }
1431};
1432
1433// 45535 - Nerub'ar Web Random Unit (On Quest, Dummy)
1435{
1436 bool Validate(SpellInfo const* /*spellInfo*/) override
1437 {
1439 }
1440
1441 void HandleDummy(SpellEffIndex /*effIndex*/)
1442 {
1443 Unit* caster = GetCaster();
1444
1445 // Always summon peon if has 3 soldiers
1446 Aura* aura = caster->GetAura(SPELL_FREED_SOLDIER_DEBUFF);
1447 if ((!aura || aura->GetStackAmount() < 3) && roll_chance_i(75))
1449 else
1450 caster->CastSpell(nullptr, SPELL_FREED_WARSONG_PEON, true);
1451 }
1452
1453 void Register() override
1454 {
1456 }
1457};
1458
1459// 45522 - Dispel Freed Soldier Debuff
1461{
1462 bool Validate(SpellInfo const* spellInfo) override
1463 {
1464 return ValidateSpellEffect({ { spellInfo->Id, EFFECT_0 } }) && ValidateSpellInfo({ uint32(spellInfo->GetEffect(EFFECT_0).CalcValue()) });
1465 }
1466
1467 void HandleScript(SpellEffIndex /*effIndex*/)
1468 {
1469 if (Aura* aura = GetHitUnit()->GetAura(uint32(GetEffectValue())))
1470 aura->ModStackAmount(-1);
1471 }
1472
1473 void Register() override
1474 {
1476 }
1477};
1478
1479/*######
1480## Quest 11690: Bring 'Em Back Alive
1481######*/
1482
1484{
1486
1491 TEXT_DELIVERED_5 = 26286
1493
1494// 45877 - Deliver Kodo
1496{
1497 bool Validate(SpellInfo const* /*spell*/) override
1498 {
1500 }
1501
1502 void HandleScript(SpellEffIndex /*effIndex*/)
1503 {
1504 Unit* caster = GetCaster();
1505 caster->CastSpell(caster, SPELL_KODO_DELIVERED, true);
1506 }
1507
1508 void Register() override
1509 {
1511 }
1512};
1513
1514// 48204 - Kodo Delivered
1516{
1517 bool Validate(SpellInfo const* /*spellInfo*/) override
1518 {
1519 return sBroadcastTextStore.HasRecord(TEXT_DELIVERED_1) &&
1524 }
1525
1526 void HandleScript(SpellEffIndex /*effIndex*/)
1527 {
1528 Unit* caster = GetCaster();
1530 }
1531
1532 void Register() override
1533 {
1535 }
1536};
1537
1538/*######
1539## Quest 11648: The Art of Persuasion
1540######*/
1541
1543{
1552
1563
1567
1568// 45634 - Neural Needle
1570{
1571 bool Validate(SpellInfo const* /*spellInfo*/) override
1572 {
1574 }
1575
1577 {
1578 Player* caster = GetCaster()->ToPlayer();
1579 Creature* target = GetHitCreature();
1580 if (!caster || !target)
1581 return;
1582
1583 target->CastSpell(target, SPELL_NEURAL_NEEDLE_IMPACT);
1584
1585 if (Aura* aura = caster->GetAura(GetSpellInfo()->Id))
1586 {
1587 switch (aura->GetStackAmount())
1588 {
1589 case 1:
1590 target->AI()->Talk(WHISPER_TORTURE_1, caster);
1591 break;
1592 case 2:
1593 target->AI()->Talk(WHISPER_TORTURE_2, caster);
1594 break;
1595 case 3:
1596 target->AI()->Talk(WHISPER_TORTURE_3, caster);
1597 break;
1598 case 4:
1599 target->AI()->Talk(WHISPER_TORTURE_4, caster);
1600 break;
1601 case 5:
1602 target->AI()->Talk(WHISPER_TORTURE_5, caster);
1603 caster->KilledMonsterCredit(target->GetEntry());
1604 break;
1605 case 6:
1607 break;
1608 default:
1609 return;
1610 }
1611 }
1612 }
1613
1614 void Register() override
1615 {
1617 }
1618};
1619
1620// 48252 - Prototype Neural Needle
1622{
1623 bool Validate(SpellInfo const* /*spellInfo*/) override
1624 {
1626 }
1627
1629 {
1630 Player* caster = GetCaster()->ToPlayer();
1631 Creature* target = GetHitCreature();
1632 if (!caster || !target)
1633 return;
1634
1636
1637 uint32 text = 0;
1638 if (Aura* aura = caster->GetAura(GetSpellInfo()->Id))
1639 {
1640 switch (aura->GetStackAmount())
1641 {
1642 case 1: text = WHISPER_TORTURE_PROTO_1; break;
1643 case 2: text = WHISPER_TORTURE_PROTO_2; break;
1644 case 3: text = WHISPER_TORTURE_PROTO_3; break;
1645 case 4: text = WHISPER_TORTURE_PROTO_4; break;
1646 case 5: text = WHISPER_TORTURE_PROTO_5; break;
1647 case 6: text = WHISPER_TORTURE_PROTO_6; break;
1648 case 7: text = WHISPER_TORTURE_PROTO_7; break;
1649 case 8: text = WHISPER_TORTURE_PROTO_8; break;
1650 case 9: text = WHISPER_TORTURE_PROTO_9; break;
1651 case 10: text = WHISPER_TORTURE_PROTO_10; break;
1652 default: return;
1653 }
1654 }
1655
1656 if (text)
1657 target->AI()->Talk(text, caster);
1658 }
1659
1660 void Register() override
1661 {
1663 }
1664};
1665
1666/*######
1667## Quest 11587: Prison Break
1668######*/
1669
1671{
1675
1676// 45449 - Arcane Prisoner Rescue
1678{
1679 bool Validate(SpellInfo const* /*spellInfo*/) override
1680 {
1682 }
1683
1684 void HandleDummy(SpellEffIndex /*effIndex*/)
1685 {
1687 }
1688
1689 void Register() override
1690 {
1692 }
1693};
1694
1696{
1722}
First const & RAND(First const &first, Second const &second, Rest const &... rest)
DB2Storage< BroadcastTextEntry > sBroadcastTextStore("BroadcastText.db2", &BroadcastTextLoadInfo::Instance)
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
@ TEMPSUMMON_DEAD_DESPAWN
Definition: ObjectDefines.h:69
@ TEMPSUMMON_CORPSE_TIMED_DESPAWN
Definition: ObjectDefines.h:68
#define INTERACTION_DISTANCE
Definition: ObjectDefines.h:24
@ QUEST_STATUS_INCOMPLETE
Definition: QuestDef.h:145
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:42
bool roll_chance_i(int chance)
Definition: Random.h:59
#define RegisterCreatureAI(ai_name)
Definition: ScriptMgr.h:1380
#define RegisterGameObjectAI(ai_name)
Definition: ScriptMgr.h:1398
#define RegisterSpellScript(spell_script)
Definition: ScriptMgr.h:1369
void AddGossipItemFor(Player *player, GossipOptionNpc optionNpc, std::string text, uint32 sender, uint32 action)
void SendGossipMenuFor(Player *player, uint32 npcTextID, ObjectGuid const &guid)
void ClearGossipMenuFor(Player *player)
void InitGossipMenuFor(Player *player, uint32 menuId)
void CloseGossipMenuFor(Player *player)
#define GOSSIP_TEXT_BROWSE_GOODS
@ GOSSIP_SENDER_MAIN
@ GOSSIP_ACTION_TRADE
@ GOSSIP_ACTION_INFO_DEF
SpellEffIndex
Definition: SharedDefines.h:29
@ EFFECT_1
Definition: SharedDefines.h:31
@ EFFECT_0
Definition: SharedDefines.h:30
Emote
@ EMOTE_STATE_READY1H
@ EMOTE_ONESHOT_LOOT
@ EMOTE_ONESHOT_KNEEL
@ EMOTE_ONESHOT_POINT
@ EMOTE_STATE_NONE
@ EMOTE_ONESHOT_NONE
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_SEND_EVENT
@ FACTION_FRIENDLY
@ FACTION_UNDEAD_SCOURGE
@ FACTION_MONSTER
@ GO_STATE_READY
@ GO_STATE_ACTIVE
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ AURA_REMOVE_BY_EXPIRE
@ SPELL_AURA_DUMMY
#define SpellEffectFn(F, I, N)
Definition: SpellScript.h:842
#define SpellHitFn(F)
Definition: SpellScript.h:854
#define AuraEffectRemoveFn(F, I, N, M)
Definition: SpellScript.h:2040
#define ENSURE_AI(a, b)
Definition: UnitAI.h:29
@ MOVE_RUN
Definition: UnitDefines.h:118
@ REACT_DEFENSIVE
Definition: UnitDefines.h:507
@ REACT_PASSIVE
Definition: UnitDefines.h:506
@ REACT_AGGRESSIVE
Definition: UnitDefines.h:508
@ UNIT_STAND_STATE_DEAD
Definition: UnitDefines.h:49
@ UNIT_STAND_STATE_KNEEL
Definition: UnitDefines.h:50
@ UNIT_STAND_STATE_STAND
Definition: UnitDefines.h:42
@ UNIT_STAND_STATE_SIT
Definition: UnitDefines.h:43
NPCFlags
Non Player Character flags.
Definition: UnitDefines.h:295
@ UNIT_NPC_FLAG_GOSSIP
Definition: UnitDefines.h:297
@ UNIT_NPC_FLAG_NONE
Definition: UnitDefines.h:296
@ UNIT_NPC_FLAG_QUESTGIVER
Definition: UnitDefines.h:298
@ UNIT_FLAG_NON_ATTACKABLE
Definition: UnitDefines.h:145
@ UNIT_STATE_STUNNED
Definition: Unit.h:258
AuraApplication const * GetTargetApplication() const
HookList< EffectApplyHandler > AfterEffectRemove
Definition: SpellScript.h:2039
WorldObject * GetOwner() const
Unit * GetCaster() const
Unit * GetTarget() const
HookList< EffectApplyHandler > OnEffectRemove
Definition: SpellScript.h:2035
uint8 GetStackAmount() const
Definition: SpellAuras.h:189
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
bool UpdateVictim()
Definition: CreatureAI.cpp:245
Creature *const me
Definition: CreatureAI.h:61
void GetHomePosition(float &x, float &y, float &z, float &ori) const
Definition: Creature.h:373
void SetReactState(ReactStates st)
Definition: Creature.h:160
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
Definition: Creature.cpp:2415
void SetImmuneToAll(bool apply) override
Definition: Creature.h:167
CreatureAI * AI() const
Definition: Creature.h:214
uint32 ExecuteEvent()
Definition: EventMap.cpp:73
void Update(uint32 time)
Definition: EventMap.h:56
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition: EventMap.cpp:36
void Reset()
Definition: EventMap.cpp:21
void StartFollow(Player *player, uint32 factionForFollower=0, uint32 quest=0)
void MoveInLineOfSight(Unit *) override
void SetFollowComplete(bool withEndEvent=false)
GameObject *const me
Definition: GameObjectAI.h:50
void SetGoState(GOState state)
GOState GetGoState() const
Definition: GameObject.h:281
void DespawnOrUnsummon(Milliseconds delay=0ms, Seconds forceRespawnTime=0s)
void Use(Unit *user)
void MovePath(uint32 pathId, bool repeatable, Optional< Milliseconds > duration={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< std::pair< Milliseconds, Milliseconds > > waitTimeRangeAtPathEnd={}, Optional< float > wanderDistanceAtPathEnds={}, Optional< bool > followPathBackwardsFromEndToStart={}, bool generatePath=true)
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={})
void MoveFollow(Unit *target, float dist, ChaseAngle angle, Optional< Milliseconds > duration={}, MovementSlot slot=MOTION_SLOT_ACTIVE)
bool IsEmpty() const
Definition: ObjectGuid.h:319
void Clear()
Definition: ObjectGuid.h:286
static Creature * ToCreature(Object *o)
Definition: Object.h:219
bool IsPlayer() const
Definition: Object.h:212
Player * ToPlayer()
Definition: Object.h:215
uint32 GetEntry() const
Definition: Object.h:161
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
static Player * ToPlayer(Object *o)
Definition: Object.h:213
void KilledMonsterCredit(uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
Definition: Player.cpp:16680
WorldSession * GetSession() const
Definition: Player.h:2101
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition: Player.cpp:16050
std::unique_ptr< PlayerMenu > PlayerTalkClass
Definition: Player.h:2380
int32 CalcValue(WorldObject const *caster=nullptr, int32 const *basePoints=nullptr, Unit const *target=nullptr, float *variance=nullptr, uint32 castItemId=0, int32 itemLevel=-1) const
Definition: SpellInfo.cpp:495
uint32 const Id
Definition: SpellInfo.h:325
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition: SpellInfo.h:577
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Definition: SpellScript.h:162
static bool ValidateSpellEffect(std::initializer_list< std::pair< uint32, SpellEffIndex > > effects)
Definition: SpellScript.h:173
Creature * GetHitCreature() const
Unit * GetCaster() const
HookList< HitHandler > AfterHit
Definition: SpellScript.h:852
HookList< EffectHandler > OnEffectHit
Definition: SpellScript.h:839
Unit * GetHitUnit() const
int32 GetEffectValue() const
HookList< EffectHandler > OnEffectHitTarget
Definition: SpellScript.h:840
SpellInfo const * GetSpellInfo() const
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:159
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.cpp:180
SpellCastResult DoCast(uint32 spellId)
Definition: UnitAI.cpp:89
Definition: Unit.h:627
void CombatStop(bool includingCast=false, bool mutualPvP=true, bool(*unitFilter)(Unit const *otherUnit)=nullptr)
Definition: Unit.cpp:5827
void SetStandState(UnitStandStateType state, uint32 animKitID=0)
Definition: Unit.cpp:10100
void RestoreFaction()
Definition: Unit.cpp:11417
Emote GetEmoteState() const
Definition: Unit.h:851
NPCFlags GetNpcFlags() const
Definition: Unit.h:980
void SetFaction(uint32 faction) override
Definition: Unit.h:859
void RemoveAllAurasExceptType(AuraType type)
Definition: Unit.cpp:4377
MotionMaster * GetMotionMaster()
Definition: Unit.h:1652
void SetFacingToObject(WorldObject const *object, bool force=true)
Definition: Unit.cpp:12671
void StopMoving()
Definition: Unit.cpp:10049
void RemoveNpcFlag(NPCFlags flags)
Definition: Unit.h:983
TempSummon * ToTempSummon()
Definition: Unit.h:1756
void AddUnitState(uint32 f)
Definition: Unit.h:731
void SetEmoteState(Emote emote)
Definition: Unit.h:852
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4560
void SetNpcFlag(NPCFlags flags)
Definition: Unit.h:982
bool SetWalk(bool enable)
Definition: Unit.cpp:12707
void SetFacingTo(float const ori, bool force=true)
Definition: Unit.cpp:12653
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4664
void HandleEmoteCommand(Emote emoteId, Player *target=nullptr, Trinity::IteratorPair< int32 const * > spellVisualKitIds={}, int32 sequenceVariation=0)
Definition: Unit.cpp:1598
bool IsVendor() const
Definition: Unit.h:992
void ReplaceAllNpcFlags(NPCFlags flags)
Definition: Unit.h:984
void RemoveUnitFlag(UnitFlags flags)
Definition: Unit.h:834
GameObject * FindNearestGameObject(uint32 entry, float range, bool spawnedOnly=true) const
Definition: Object.cpp:2170
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
bool IsValidAttackTarget(WorldObject const *target, SpellInfo const *bySpell=nullptr) const
Definition: Object.cpp:2991
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:2025
GameObject * SummonGameObject(uint32 entry, Position const &pos, QuaternionData const &rot, Seconds respawnTime, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
Definition: Object.cpp:2065
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition: Object.cpp:2148
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition: Object.cpp:1147
uint32 GetAreaId() const
Definition: Object.h:546
Position GetFirstCollisionPosition(float dist, float angle)
Definition: Object.cpp:3416
void SendListInventory(ObjectGuid guid)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *spellInfo) override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *spellInfo) override
bool Validate(SpellInfo const *) override
void HandleEffectRemove(AuraEffect const *, AuraEffectHandleModes)
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
TC_GAME_API GameObject * GetGameObject(WorldObject const &u, ObjectGuid const &guid)
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
Definition: Containers.h:109
constexpr void GetPosition(float &x, float &y) const
Definition: Position.h:81
constexpr float GetOrientation() const
Definition: Position.h:79
void AttackStart(Unit *) override
== Triggered Actions Requested ==================
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
go_caribou_trap(GameObject *go)
void Reset() override
void UpdateAI(uint32 diff) override
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
go_mammoth_trap(GameObject *go)
void Reset() override
void UpdateAI(uint32 diff) override
void UpdateAI(uint32 diff) override
void JustEngagedWith(Unit *who) override
void JustAppeared() override
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
npc_beryl_sorcerer(Creature *creature)
npc_bloodmage_laurith(Creature *creature)
void UpdateAI(uint32 diff) override
void SetGUID(ObjectGuid const &guid, int32) override
npc_captured_beryl_sorcerer(Creature *creature)
void MoveInLineOfSight(Unit *who) override
npc_counselor_talbot(Creature *creature)
void JustDied(Unit *) override
void UpdateAI(uint32 diff) override
void JustEngagedWith(Unit *) override
npc_general_arlos(Creature *creature)
void WaypointPathEnded(uint32, uint32 pathId) override
void DoAction(int32) override
npc_hidden_cultist(Creature *creature)
bool OnGossipSelect(Player *player, uint32, uint32 gossipListId) override
void UpdateAI(uint32 uiDiff) override
bool OnGossipHello(Player *player) override
void WaypointPathEnded(uint32, uint32 pathId) override
npc_leryssa(Creature *creature)
bool OnGossipSelect(Player *player, uint32, uint32 gossipListId) override
npc_thassarian(Creature *creature)
void JustAppeared() override
void WaypointPathEnded(uint32, uint32 pathId) override
void UpdateAI(uint32 diff) override
void JustDied(Unit *) override
npc_valiance_keep_cannoneer(Creature *creature)
void UpdateAI(uint32 diff) override
Valiancekeepcannons
@ GO_VALIANCE_KEEP_CANNON_2
@ GO_VALIANCE_KEEP_CANNON_1
@ EVENT_THASSARIAN_SCRIPT_29
@ EVENT_THASSARIAN_SCRIPT_5
@ SAY_THASSARIAN_3
@ SAY_LERYSSA_4
@ EVENT_THASSARIAN_SCRIPT_22
@ PATH_TALBOT
@ EVENT_THASSARIAN_SCRIPT_7
@ SAY_THASSARIAN_4
@ EVENT_THASSARIAN_SCRIPT_11
@ EVENT_THASSARIAN_SCRIPT_2
@ SAY_ARLOS_2
@ EVENT_THASSARIAN_SCRIPT_18
@ NPC_PRINCE_VALANAR
@ SAY_TALBOT_4
@ EVENT_THASSARIAN_SCRIPT_16
@ EVENT_THASSARIAN_SCRIPT_17
@ PATH_LERYSSA
@ EVENT_THASSARIAN_SCRIPT_20
@ EVENT_THASSARIAN_SCRIPT_12
@ NPC_IMAGE_LICH_KING
@ EVENT_THASSARIAN_SCRIPT_8
@ SAY_LICH_3
@ PATH_THASSARIAN
@ NPC_COUNSELOR_TALBOT
@ EVENT_THASSARIAN_SCRIPT_27
@ EVENT_THASSARIAN_SCRIPT_1
@ SAY_ARLOS_1
@ NPC_GENERAL_ARLOS
@ EVENT_THASSARIAN_SCRIPT_26
@ SAY_LERYSSA_2
@ EVENT_THASSARIAN_SCRIPT_4
@ SAY_TALBOT_3
@ SPELL_TRANSFORM_VALANAR
@ EVENT_THASSARIAN_SCRIPT_25
@ SAY_LICH_2
@ FACTION_VALANAR_COMBAT
@ PATH_ARLOS
@ EVENT_THASSARIAN_SCRIPT_21
@ EVENT_THASSARIAN_SCRIPT_9
@ SAY_LICH_1
@ EVENT_THASSARIAN_SCRIPT_6
@ EVENT_THASSARIAN_SCRIPT_15
@ EVENT_THASSARIAN_SCRIPT_14
@ SAY_THASSARIAN_7
@ SAY_THASSARIAN_1
@ PATH_ARTHAS
@ SAY_LERYSSA_1
@ SAY_THASSARIAN_6
@ SAY_LERYSSA_3
@ EVENT_THASSARIAN_SCRIPT_19
@ SAY_THASSARIAN_5
@ SAY_TALBOT_2
@ EVENT_THASSARIAN_SCRIPT_23
@ EVENT_THASSARIAN_SCRIPT_13
@ SAY_THASSARIAN_2
@ NPC_LERYSSA
@ EVENT_THASSARIAN_SCRIPT_24
@ EVENT_THASSARIAN_SCRIPT_10
@ EVENT_THASSARIAN_SCRIPT_3
@ SAY_TALBOT_1
@ SPELL_STUN
@ EVENT_THASSARIAN_SCRIPT_28
@ SPELL_SHORTENING_BLASTER_POLYMORPH1
@ SPELL_SHORTENING_BLASTER_GHOST1
@ SPELL_SHORTENING_BLASTER_SHRUNK1
@ SPELL_SHORTENING_BLASTER_POLYMORPH2
@ SPELL_SHORTENING_BLASTER_GHOST2
@ SPELL_SHORTENING_BLASTER_YELLOW2
@ SPELL_SHORTENING_BLASTER_BIGGER1
@ SPELL_SHORTENING_BLASTER_SHRUNK2
@ SPELL_SHORTENING_BLASTER_BIGGER2
@ SPELL_SHORTENING_BLASTER_YELLOW1
@ EVENT_DESPAWN_ALL
@ SAY_NESINGWARY_1
@ NPC_NESINGWARY_TRAPPER
@ SPELL_PLACE_FAKE_FUR
@ EVENT_TRAPPER_TEXT
@ EVENT_FUR_DESPAWN
@ EVENT_FUR_SPAWN
@ EVENT_TRAPPER_LOOT
@ EVENT_SPAWN_TRAPPER
@ EVENT_TRAPPER_MOVE
@ GO_HIGH_QUALITY_FUR
@ SPELL_TRAPPED
@ EVENT_TRAPPER_DIE
@ SPELL_SUMMON_ARCANE_PRISONER_1
@ SPELL_SUMMON_ARCANE_PRISONER_2
@ EVENT_MAMMOTH_MOVE
@ EVENT_TRAP_RESET
@ SAY_MAMMOTH
@ EVENT_QUEST_CREDIT
@ SPELL_SMASH_TRAP
@ NPC_TRAPPED_MAMMOTH
@ EVENT_FACE_PLAYER
@ EVENT_FIND_MAMMOTH
@ EVENT_MAMMOTH_TEXT
@ EVENT_MAMMOTH_RESPAWN
@ EVENT_MAMMOTH_DESPAWN
@ SPELL_DRAKE_HATCHLING_SUBDUED
@ SPELL_SUBDUED
@ GOSSIP_ITEM_TOM_HEGGER_MENUID
@ GOSSIP_ITEM_GUARD_MITCHELLS_MENUID
@ SPELL_RIGHTEOUS_VISION
@ SPELL_SHROUD_OF_THE_DEATH_CULTIST
@ GOSSIP_ITEM_HIDDEN_CULTIST_OPTIONID
@ GOSSIP_ITEM_SALTY_JOHN_THORPE_MENUID
@ NPC_TOM_HEGGER
@ GOSSIP_TEXT_TOM_HEGGER
@ SAY_HIDDEN_CULTIST_4
@ QUEST_THE_HUNT_IS_ON
@ GOSSIP_TEXT_GUARD_MITCHELSS
@ SAY_HIDDEN_CULTIST_2
@ NPC_SALTY_JOHN_THORPE
@ SAY_HIDDEN_CULTIST_3
@ NPC_GUARD_MITCHELLS
@ GOSSIP_TEXT_SALTY_JOHN_THORPE
@ SAY_HIDDEN_CULTIST_1
@ EVENT_SOUL_BLAST
@ SPELL_VAMPIRIC_BOLT
@ SPELL_DEFLECTION
@ EVENT_VAMPIRIC_BOLT
@ AREA_LAST_RITES
@ SPELL_SOUL_BLAST
@ EVENT_DEFLECTION
std::array< uint32, 3 > const CocoonSummonSpells
@ SPELL_FROSTBOLT
@ SPELL_ARCANE_CHAINS_CHARACTER_FORCE_CAST
@ NPC_CAPTURED_BERLY_SORCERER
@ SPELL_ARCANE_CHAINS
@ SPELL_COSMETIC_ENSLAVE_CHAINS_SELF
@ SPELL_ARCANE_CHAINS_CHANNEL_II
@ EVENT_ARCANE_CHAINS
@ NPC_LIBRARIAN_DONATHAN
@ EVENT_FROSTBOLT
@ SPELL_ARCANE_CHAINS_SUMMON_CHAINED_MAGE_HUNTER
BloodsporeRuination
@ NPC_BLOODMAGE_LAURITH
@ SAY_BLOODMAGE_LAURITH
@ EVENT_RESET_ORIENTATION
void AddSC_borean_tundra()
@ SPELL_WINDSOUL_CREDT
@ SPELL_FREED_WARSONG_MAGE
@ SPELL_FREED_SOLDIER_DEBUFF
@ SPELL_FREED_WARSONG_WARRIOR
@ SPELL_FREED_WARSONG_PEON
@ SPELL_FREED_WARSONG_SHAMAN
@ TEXT_DELIVERED_5
@ TEXT_DELIVERED_4
@ TEXT_DELIVERED_3
@ TEXT_DELIVERED_2
@ TEXT_DELIVERED_1
@ SPELL_KODO_DELIVERED
TheArtOfPersuasion
@ WHISPER_TORTURE_RANDOM_2
@ WHISPER_TORTURE_5
@ WHISPER_TORTURE_RANDOM_3
@ WHISPER_TORTURE_PROTO_10
@ WHISPER_TORTURE_PROTO_9
@ WHISPER_TORTURE_PROTO_4
@ WHISPER_TORTURE_PROTO_3
@ SPELL_PROTOTYPE_NEURAL_NEEDLE_IMPACT
@ WHISPER_TORTURE_PROTO_5
@ WHISPER_TORTURE_1
@ WHISPER_TORTURE_4
@ WHISPER_TORTURE_3
@ WHISPER_TORTURE_PROTO_1
@ WHISPER_TORTURE_PROTO_7
@ WHISPER_TORTURE_2
@ WHISPER_TORTURE_PROTO_2
@ WHISPER_TORTURE_PROTO_8
@ WHISPER_TORTURE_RANDOM_1
@ WHISPER_TORTURE_PROTO_6
@ SPELL_NEURAL_NEEDLE_IMPACT