TrinityCore
Loading...
Searching...
No Matches
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
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
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
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
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
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
445};
446
447/*######
448## Valiance Keep Cannoneer script to activate cannons
449######*/
450
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
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
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
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
1256};
1257
1267
1268// 45997 - Bloodspore Ruination
1270{
1271 void HandleEffect(SpellEffIndex /*effIndex*/)
1272 {
1273 if (Unit* caster = GetCaster())
1274 if (Creature* laurith = caster->FindNearestCreature(NPC_BLOODMAGE_LAURITH, 100.0f))
1275 laurith->AI()->SetGUID(caster->GetGUID(), DATA_FACING_PLAYER_GUID);
1276 }
1277
1282};
1283
1285{
1286 npc_bloodmage_laurith(Creature* creature) : ScriptedAI(creature) { }
1287
1288 void Reset() override
1289 {
1290 _events.Reset();
1292 }
1293
1294 void SetGUID(ObjectGuid const& guid, int32 id) override
1295 {
1296 if (id != DATA_FACING_PLAYER_GUID)
1297 return;
1298
1299 if (!_playerGUID.IsEmpty())
1300 return;
1301
1302 _playerGUID = guid;
1303
1305 me->SetFacingToObject(player);
1306
1308 }
1309
1310 void UpdateAI(uint32 diff) override
1311 {
1312 if (UpdateVictim())
1313 return;
1314
1315 _events.Update(diff);
1316
1317 if (uint32 eventId = _events.ExecuteEvent())
1318 {
1319 switch (eventId)
1320 {
1321 case EVENT_TALK:
1323 Talk(SAY_BLOODMAGE_LAURITH, player);
1326 break;
1328 me->SetFacingTo(me->GetHomePosition().GetOrientation());
1329 break;
1330 }
1331 }
1332 }
1333
1334private:
1337};
1338
1353
1354// 45668 - Crafty's Ultra-Advanced Proto-Typical Shortening Blaster
1376
1377/*######
1378## Quest 11611: Taken by the Scourge
1379######*/
1380
1389
1394
1395// 45516 - Nerub'ar Web Random Unit (Not On Quest, Script Effect)
1413
1414// 45515 - Nerub'ar Web Random Unit (Not On Quest, Dummy)
1416{
1417 bool Validate(SpellInfo const* /*spellInfo*/) override
1418 {
1420 }
1421
1422 void HandleDummy(SpellEffIndex /*effIndex*/)
1423 {
1424 Unit* caster = GetCaster();
1425
1426 // Do nothing if has 3 soldiers
1427 Aura* aura = caster->GetAura(SPELL_FREED_SOLDIER_DEBUFF);
1428 if (!aura || aura->GetStackAmount() < 3)
1430 }
1431
1436};
1437
1438// 45535 - Nerub'ar Web Random Unit (On Quest, Dummy)
1440{
1445
1446 void HandleDummy(SpellEffIndex /*effIndex*/)
1447 {
1448 Unit* caster = GetCaster();
1449
1450 // Always summon peon if has 3 soldiers
1451 Aura* aura = caster->GetAura(SPELL_FREED_SOLDIER_DEBUFF);
1452 if ((!aura || aura->GetStackAmount() < 3) && roll_chance(75))
1454 else
1455 caster->CastSpell(nullptr, SPELL_FREED_WARSONG_PEON, true);
1456 }
1457
1462};
1463
1464// 45522 - Dispel Freed Soldier Debuff
1466{
1467 bool Validate(SpellInfo const* spellInfo) override
1468 {
1469 return ValidateSpellEffect({ { spellInfo->Id, EFFECT_0 } }) && ValidateSpellInfo({ uint32(spellInfo->GetEffect(EFFECT_0).CalcValueAsInt()) });
1470 }
1471
1472 void HandleScript(SpellEffIndex /*effIndex*/)
1473 {
1474 if (Aura* aura = GetHitUnit()->GetAura(uint32(GetEffectValueAsInt())))
1475 aura->ModStackAmount(-1);
1476 }
1477
1482};
1483
1484/*######
1485## Quest 11690: Bring 'Em Back Alive
1486######*/
1487
1498
1499// 45877 - Deliver Kodo
1501{
1502 bool Validate(SpellInfo const* /*spell*/) override
1503 {
1505 }
1506
1507 void HandleScript(SpellEffIndex /*effIndex*/)
1508 {
1509 Unit* caster = GetCaster();
1510 caster->CastSpell(caster, SPELL_KODO_DELIVERED, true);
1511 }
1512
1517};
1518
1519// 48204 - Kodo Delivered
1521{
1522 bool Validate(SpellInfo const* /*spellInfo*/) override
1523 {
1524 return sBroadcastTextStore.HasRecord(TEXT_DELIVERED_1) &&
1529 }
1530
1531 void HandleScript(SpellEffIndex /*effIndex*/)
1532 {
1533 Unit* caster = GetCaster();
1535 }
1536
1541};
1542
1543/*######
1544## Quest 11648: The Art of Persuasion
1545######*/
1546
1572
1573// 45634 - Neural Needle
1575{
1576 bool Validate(SpellInfo const* /*spellInfo*/) override
1577 {
1579 }
1580
1582 {
1583 Player* caster = GetCaster()->ToPlayer();
1584 Creature* target = GetHitCreature();
1585 if (!caster || !target)
1586 return;
1587
1588 target->CastSpell(target, SPELL_NEURAL_NEEDLE_IMPACT);
1589
1590 if (Aura* aura = caster->GetAura(GetSpellInfo()->Id))
1591 {
1592 switch (aura->GetStackAmount())
1593 {
1594 case 1:
1595 target->AI()->Talk(WHISPER_TORTURE_1, caster);
1596 break;
1597 case 2:
1598 target->AI()->Talk(WHISPER_TORTURE_2, caster);
1599 break;
1600 case 3:
1601 target->AI()->Talk(WHISPER_TORTURE_3, caster);
1602 break;
1603 case 4:
1604 target->AI()->Talk(WHISPER_TORTURE_4, caster);
1605 break;
1606 case 5:
1607 target->AI()->Talk(WHISPER_TORTURE_5, caster);
1608 caster->KilledMonsterCredit(target->GetEntry());
1609 break;
1610 case 6:
1612 break;
1613 default:
1614 return;
1615 }
1616 }
1617 }
1618
1623};
1624
1625// 48252 - Prototype Neural Needle
1627{
1628 bool Validate(SpellInfo const* /*spellInfo*/) override
1629 {
1631 }
1632
1634 {
1635 Player* caster = GetCaster()->ToPlayer();
1636 Creature* target = GetHitCreature();
1637 if (!caster || !target)
1638 return;
1639
1641
1642 uint32 text = 0;
1643 if (Aura* aura = caster->GetAura(GetSpellInfo()->Id))
1644 {
1645 switch (aura->GetStackAmount())
1646 {
1647 case 1: text = WHISPER_TORTURE_PROTO_1; break;
1648 case 2: text = WHISPER_TORTURE_PROTO_2; break;
1649 case 3: text = WHISPER_TORTURE_PROTO_3; break;
1650 case 4: text = WHISPER_TORTURE_PROTO_4; break;
1651 case 5: text = WHISPER_TORTURE_PROTO_5; break;
1652 case 6: text = WHISPER_TORTURE_PROTO_6; break;
1653 case 7: text = WHISPER_TORTURE_PROTO_7; break;
1654 case 8: text = WHISPER_TORTURE_PROTO_8; break;
1655 case 9: text = WHISPER_TORTURE_PROTO_9; break;
1656 case 10: text = WHISPER_TORTURE_PROTO_10; break;
1657 default: return;
1658 }
1659 }
1660
1661 if (text)
1662 target->AI()->Talk(text, caster);
1663 }
1664
1669};
1670
1671/*######
1672## Quest 11587: Prison Break
1673######*/
1674
1680
1681// 45449 - Arcane Prisoner Rescue
1699
1701{
1727}
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:156
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
@ TEMPSUMMON_DEAD_DESPAWN
@ TEMPSUMMON_CORPSE_TIMED_DESPAWN
#define INTERACTION_DISTANCE
@ QUEST_STATUS_INCOMPLETE
Definition QuestDef.h:150
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:42
bool roll_chance(T chance)
Definition Random.h:55
#define RegisterCreatureAI(ai_name)
Definition ScriptMgr.h:1392
#define RegisterGameObjectAI(ai_name)
Definition ScriptMgr.h:1410
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1383
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
@ EFFECT_1
@ EFFECT_0
@ 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)
#define SpellHitFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
#define ENSURE_AI(a, b)
Definition UnitAI.h:30
@ MOVE_RUN
@ REACT_DEFENSIVE
@ REACT_PASSIVE
@ REACT_AGGRESSIVE
@ 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.
@ UNIT_NPC_FLAG_GOSSIP
@ UNIT_NPC_FLAG_NONE
@ UNIT_NPC_FLAG_QUESTGIVER
@ UNIT_FLAG_NON_ATTACKABLE
@ UNIT_STATE_STUNNED
Definition Unit.h:264
AuraApplication const * GetTargetApplication() const
HookList< EffectApplyHandler > AfterEffectRemove
WorldObject * GetOwner() const
Unit * GetCaster() const
Unit * GetTarget() const
HookList< EffectApplyHandler > OnEffectRemove
uint8 GetStackAmount() const
Definition SpellAuras.h:238
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
bool IsPlayer() const
Definition BaseEntity.h:173
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:63
void GetHomePosition(float &x, float &y, float &z, float &ori) const
Definition Creature.h:388
void SetReactState(ReactStates st)
Definition Creature.h:174
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
void SetImmuneToAll(bool apply) override
Definition Creature.h:181
CreatureAI * AI() const
Definition Creature.h:228
uint32 ExecuteEvent()
Definition EventMap.cpp:77
void Update(uint32 time)
Definition EventMap.h:61
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition EventMap.cpp:40
void Reset()
Definition EventMap.cpp:25
void StartFollow(Player *player, uint32 factionForFollower=0, uint32 quest=0)
void MoveInLineOfSight(Unit *) override
void SetFollowComplete(bool withEndEvent=false)
GameObject *const me
void SetGoState(GOState state)
GOState GetGoState() const
Definition GameObject.h:284
void DespawnOrUnsummon(Milliseconds delay=0ms, Seconds forceRespawnTime=0s)
void Use(Unit *user, bool ignoreCastInProgress=false)
void MoveFollow(Unit *target, float dist, Optional< ChaseAngle > angle={}, Optional< Milliseconds > duration={}, bool ignoreTargetWalk=false, MovementSlot slot=MOTION_SLOT_ACTIVE, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
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 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={}, Optional< bool > exactSplinePath={}, bool generatePath=true, Optional< MovementFadeObject > fadeObject={}, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
bool IsEmpty() const
Definition ObjectGuid.h:362
void Clear()
Definition ObjectGuid.h:329
Player * ToPlayer()
Definition Object.h:126
uint32 GetEntry() const
Definition Object.h:89
Creature * ToCreature()
Definition Object.h:121
void KilledMonsterCredit(uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
Definition Player.cpp:16679
WorldSession * GetSession() const
Definition Player.h:2272
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition Player.cpp:15962
std::unique_ptr< PlayerMenu > PlayerTalkClass
Definition Player.h:2570
int32 CalcValueAsInt(WorldObject const *caster=nullptr, SpellEffectValue const *basePoints=nullptr, Unit const *target=nullptr, float *variance=nullptr, uint32 castItemId=0, int32 itemLevel=-1) const
uint32 const Id
Definition SpellInfo.h:328
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition SpellInfo.h:588
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
static bool ValidateSpellEffect(std::initializer_list< std::pair< uint32, SpellEffIndex > > effects)
Creature * GetHitCreature() const
Unit * GetCaster() const
HookList< HitHandler > AfterHit
int32 GetEffectValueAsInt() const
HookList< EffectHandler > OnEffectHit
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
SpellInfo const * GetSpellInfo() const
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:160
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:180
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:89
Definition Unit.h:635
void CombatStop(bool includingCast=false, bool mutualPvP=true, bool(*unitFilter)(Unit const *otherUnit)=nullptr)
Definition Unit.cpp:6012
void SetStandState(UnitStandStateType state, uint32 animKitID=0)
Definition Unit.cpp:10731
void RestoreFaction()
Definition Unit.cpp:12048
Emote GetEmoteState() const
Definition Unit.h:864
NPCFlags GetNpcFlags() const
Definition Unit.h:995
void SetFaction(uint32 faction) override
Definition Unit.h:872
void RemoveAllAurasExceptType(AuraType type)
Definition Unit.cpp:4517
MotionMaster * GetMotionMaster()
Definition Unit.h:1723
void SetFacingToObject(WorldObject const *object, bool force=true)
Definition Unit.cpp:13307
void StopMoving()
Definition Unit.cpp:10680
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:998
TempSummon * ToTempSummon()
Definition Unit.h:1828
void AddUnitState(uint32 f)
Definition Unit.h:742
void SetEmoteState(Emote emote)
Definition Unit.h:865
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4700
void SetNpcFlag(NPCFlags flags)
Definition Unit.h:997
bool SetWalk(bool enable)
Definition Unit.cpp:13343
void SetFacingTo(float const ori, bool force=true)
Definition Unit.cpp:13289
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4804
void HandleEmoteCommand(Emote emoteId, Player *target=nullptr, Trinity::IteratorPair< int32 const * > spellVisualKitIds={}, int32 sequenceVariation=0)
Definition Unit.cpp:1657
bool IsVendor() const
Definition Unit.h:1007
void ReplaceAllNpcFlags(NPCFlags flags)
Definition Unit.h:999
void RemoveUnitFlag(UnitFlags flags)
Definition Unit.h:847
GameObject * FindNearestGameObject(uint32 entry, float range, bool spawnedOnly=true) const
Definition Object.cpp:1539
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2217
bool IsValidAttackTarget(WorldObject const *target, SpellInfo const *bySpell=nullptr) const
Definition Object.cpp:2324
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:1398
GameObject * SummonGameObject(uint32 entry, Position const &pos, QuaternionData const &rot, Seconds respawnTime, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
Definition Object.cpp:1441
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:1517
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:501
uint32 GetAreaId() const
Definition Object.h:333
Position GetFirstCollisionPosition(float dist, float angle)
Definition Object.cpp:2762
void SendListInventory(ObjectGuid guid)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *spellInfo) override
bool Validate(SpellInfo const *) 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) -> std::add_const_t< decltype(*std::ranges::begin(container))> &
Definition Containers.h:110
constexpr void GetPosition(float &x, float &y) const
Definition Position.h:92
constexpr float GetOrientation() const
Definition Position.h:90
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)
void SetGUID(ObjectGuid const &guid, int32 id) override
npc_bloodmage_laurith(Creature *creature)
void UpdateAI(uint32 diff) 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
@ EVENT_THASSARIAN_SCRIPT_7
@ SAY_THASSARIAN_4
@ EVENT_THASSARIAN_SCRIPT_11
@ EVENT_THASSARIAN_SCRIPT_2
@ EVENT_THASSARIAN_SCRIPT_18
@ NPC_PRINCE_VALANAR
@ EVENT_THASSARIAN_SCRIPT_16
@ EVENT_THASSARIAN_SCRIPT_17
@ EVENT_THASSARIAN_SCRIPT_20
@ EVENT_THASSARIAN_SCRIPT_12
@ NPC_IMAGE_LICH_KING
@ EVENT_THASSARIAN_SCRIPT_8
@ PATH_THASSARIAN
@ NPC_COUNSELOR_TALBOT
@ EVENT_THASSARIAN_SCRIPT_27
@ EVENT_THASSARIAN_SCRIPT_1
@ NPC_GENERAL_ARLOS
@ EVENT_THASSARIAN_SCRIPT_26
@ SAY_LERYSSA_2
@ EVENT_THASSARIAN_SCRIPT_4
@ SPELL_TRANSFORM_VALANAR
@ EVENT_THASSARIAN_SCRIPT_25
@ FACTION_VALANAR_COMBAT
@ EVENT_THASSARIAN_SCRIPT_21
@ EVENT_THASSARIAN_SCRIPT_9
@ EVENT_THASSARIAN_SCRIPT_6
@ EVENT_THASSARIAN_SCRIPT_15
@ EVENT_THASSARIAN_SCRIPT_14
@ SAY_THASSARIAN_7
@ SAY_THASSARIAN_1
@ SAY_LERYSSA_1
@ SAY_THASSARIAN_6
@ SAY_LERYSSA_3
@ EVENT_THASSARIAN_SCRIPT_19
@ SAY_THASSARIAN_5
@ EVENT_THASSARIAN_SCRIPT_23
@ EVENT_THASSARIAN_SCRIPT_13
@ SAY_THASSARIAN_2
@ EVENT_THASSARIAN_SCRIPT_24
@ EVENT_THASSARIAN_SCRIPT_10
@ EVENT_THASSARIAN_SCRIPT_3
@ 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
@ 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
@ DATA_FACING_PLAYER_GUID
@ 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
@ 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