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 "Player.h"
27#include "ScriptedFollowerAI.h"
28#include "ScriptedGossip.h"
29#include "SpellAuras.h"
30#include "SpellAuraEffects.h"
31#include "SpellInfo.h"
32#include "SpellScript.h"
33#include "TemporarySummon.h"
34
35/*######
36## Quest 11865: Unfit for Death
37######*/
38
39// Gameobjects 187982,187995,187996,187997,187998,187999,188000,188001,188002,188003,188004,188005,188006,188007,188008: Caribou Trap
60
62{
64
65 void Reset() override
66 {
68 }
69
70 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
71 {
72 if (_placedFur)
73 return;
74
75 Player* playerCaster = caster->ToPlayer();
76 if (!playerCaster)
77 return;
78
79 if (spellInfo->Id == SPELL_PLACE_FAKE_FUR)
80 {
81 _playerGUID = caster->GetGUID();
82 _placedFur = true;
84 }
85 }
86
87 void UpdateAI(uint32 diff) override
88 {
89 if (!_placedFur)
90 return;
91
92 _events.Update(diff);
93
94 while (uint32 eventId = _events.ExecuteEvent())
95 {
96 switch (eventId)
97 {
98 case EVENT_FUR_SPAWN:
99 if (GameObject* fur = me->SummonGameObject(GO_HIGH_QUALITY_FUR, me->GetPosition(), QuaternionData(0.0f, 0.0f, 0.77162457f, 0.63607824f), 20s))
100 _goFurGUID = fur->GetGUID();
102 break;
105 {
106 trapper->SetFacingToObject(me);
107 _trapperGUID = trapper->GetGUID();
108 }
110 break;
113 trapper->GetMotionMaster()->MovePoint(0, trapper->GetFirstCollisionPosition(20.0f, 0));
115 break;
117 {
119 {
120 if (trapper->IsAIEnabled())
121 trapper->AI()->Talk(SAY_NESINGWARY_1);
122 }
124 break;
125 }
128 trapper->HandleEmoteCommand(EMOTE_ONESHOT_LOOT);
130 break;
133 fur->Delete();
135 break;
139 {
141 player->KilledMonsterCredit(trapper->GetEntry(), trapper->GetGUID());
142 trapper->CastSpell(trapper, SPELL_TRAPPED);
143 }
145 break;
148 trapper->DespawnOrUnsummon();
149 me->DespawnOrUnsummon(0s, 50s);
150 break;
151 default:
152 break;
153 }
154 }
155 }
156private:
162};
163
164/*######
165## Quest 11876: Help Those That Cannot Help Themselves
166######*/
167
168// 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
186
188{
190
191 void Reset() override
192 {
195 }
196
197 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
198 {
199 Player* playerCaster = caster->ToPlayer();
200 if (!playerCaster)
201 return;
202
203 if (me->GetGoState() == GO_STATE_READY)
204 return;
205
206 if (spellInfo->Id == SPELL_SMASH_TRAP)
207 {
208 _playerGUID = caster->GetGUID();
209 _trapSmashed = true;
212 }
213 }
214
215 void UpdateAI(uint32 diff) override
216 {
217 if (!_trapSmashed)
218 return;
219
220 _events.Update(diff);
221
222 while (uint32 eventId = _events.ExecuteEvent())
223 {
224 switch (eventId)
225 {
227 if (Creature* mammoth = me->FindNearestCreature(NPC_TRAPPED_MAMMOTH, 1.0f, true))
228 {
229 _mammothGUID = mammoth->GetGUID();
230 _trapSmashed = false;
231 }
232 break;
236 {
237 mammoth->SetStandState(UNIT_STAND_STATE_STAND);
238 mammoth->SetFacingToObject(player);
239 }
241 break;
244 player->KilledMonsterCredit(NPC_TRAPPED_MAMMOTH);
246 break;
249 if (mammoth->IsAIEnabled())
250 mammoth->AI()->Talk(SAY_MAMMOTH);
252 break;
255 mammoth->GetMotionMaster()->MovePoint(0, mammoth->GetFirstCollisionPosition(50.0f, me->GetOrientation()));
257 break;
260 mammoth->DespawnOrUnsummon(0s, 120s);
262 break;
265 Reset();
266 else
268 break;
269 default:
270 break;
271 }
272 }
273 }
274private:
279};
280
281/*######
282## Valiance Keep Cannoneer script to activate cannons
283######*/
284
290
292{
294 {
295 Initialize();
296 }
297
299 {
300 uiTimer = urand(13000, 18000);
301 }
302
304
305 void Reset() override
306 {
307 Initialize();
308 }
309
310 void UpdateAI(uint32 diff) override
311 {
312 if (uiTimer <= diff)
313 {
316 if (!pCannon)
318 if (pCannon)
319 pCannon->Use(me);
320 uiTimer = urand(13000, 18000);
321 }
322 else uiTimer -= diff;
323
324 if (!UpdateVictim())
325 return;
326 }
327};
328
329/*######
330## Quest 12019: Last Rites
331######*/
332
333// NPC 26170: Thassarian
335{
365
367
372 NPC_LERYSSA = 25251,
373
375 SPELL_STUN = 46957,
376
397
399 PATH_ARTHAS = 8104248,
400 PATH_TALBOT = 8104256,
401 PATH_ARLOS = 8104264,
402 PATH_LERYSSA = 8104272
404
406{
408
416
417 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
418 {
419 if (pathId == PATH_THASSARIAN)
420 {
421 me->SetWalk(false);
424 }
425 }
426
427 void UpdateAI(uint32 diff) override
428 {
430 return;
431
433 {
434 ArlosInPosition = false;
435 LeryssaInPosition = false;
437 }
438
440 {
441 TalbotJustDied = false;
443 }
444
445 _events.Update(diff);
446
447 if (uint32 eventId = _events.ExecuteEvent())
448 {
449 switch (eventId)
450 {
452 // Summon Arthas and Talbot
453 if (Creature* arthas = me->SummonCreature(NPC_IMAGE_LICH_KING, 3729.4614f, 3520.386f, 473.4048f, 1.361f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2min))
454 {
455 _arthasGUID = arthas->GetGUID();
456 arthas->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
457 arthas->SetReactState(REACT_PASSIVE);
458 arthas->SetWalk(true);
459 }
460 if (Creature* talbot = me->SummonCreature(NPC_COUNSELOR_TALBOT, 3748.7627f, 3614.0374f, 473.4048f, 4.5553f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2min))
461 {
462 _talbotGUID = talbot->GetGUID();
463 talbot->SetWalk(true);
464 TalbotJustDied = false;
465 }
467 break;
469 // Arthas load path
471 arthas->GetMotionMaster()->MovePath(PATH_ARTHAS, false);
473 break;
475 // Talbot load path
477 talbot->GetMotionMaster()->MovePath(PATH_TALBOT, false);
479 break;
481 // Talbot transform and knell
483 {
484 talbot->UpdateEntry(NPC_PRINCE_VALANAR);
485 talbot->SetFullHealth();
486 talbot->SetFaction(FACTION_UNDEAD_SCOURGE);
487 talbot->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
488 talbot->SetReactState(REACT_PASSIVE);
489 talbot->SetStandState(UNIT_STAND_STATE_KNEEL);
490 }
492 break;
494 // Talbot say text 1
496 if (talbot->IsAIEnabled())
497 talbot->AI()->Talk(SAY_TALBOT_1);
499 break;
501 // Summon General Arlos and Leryssa
502 if (Creature* arlos = me->SummonCreature(NPC_GENERAL_ARLOS, 3746.2825f, 3616.3699f, 473.4048f, 4.5029f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2min))
503 {
504 _arlosGUID = arlos->GetGUID();
505 arlos->SetWalk(true);
506 arlos->SetReactState(REACT_PASSIVE);
507 arlos->RemoveNpcFlag(UNIT_NPC_FLAG_QUESTGIVER);
508 arlos->GetMotionMaster()->MovePath(PATH_ARLOS, false);
509 }
510 if (Creature* leryssa = me->SummonCreature(NPC_LERYSSA, 3751.0986f, 3614.9219f, 473.4048f, 4.5029f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2min))
511 {
512 _leryssaGUID = leryssa->GetGUID();
513 leryssa->SetWalk(true);
514 leryssa->SetReactState(REACT_PASSIVE);
515 leryssa->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER);
516 leryssa->GetMotionMaster()->MovePath(PATH_LERYSSA, false);
517 }
519 break;
521 // Talbot say text 2
523 if (talbot->IsAIEnabled())
524 talbot->AI()->Talk(SAY_TALBOT_2);
525 break;
527 // Thassarian say text 1 and move to location
529 me->SetWalk(false);
530 me->GetMotionMaster()->MovePoint(0, 3722.527f, 3567.2583f, 477.44086f);
532 break;
534 // Thassarian say text 2
537 break;
539 // Arthas turn to Thassarian and Talbot stand
541 arthas->SetFacingToObject(me);
543 talbot->SetStandState(UNIT_STAND_STATE_STAND);
545 break;
547 // Arthas say text 2
549 if (arthas->IsAIEnabled())
550 arthas->AI()->Talk(SAY_LICH_2);
552 break;
554 // Thassarian say text 3
557 break;
559 // Talbot say text 3
561 if (talbot->IsAIEnabled())
562 talbot->AI()->Talk(SAY_TALBOT_3);
564 break;
566 // Arthas turn to Talbot say text 3
568 {
570 arthas->SetFacingToObject(talbot);
571 if (arthas->IsAIEnabled())
572 arthas->AI()->Talk(SAY_LICH_3);
573 }
575 break;
577 // Arthas turn to me and emote
579 {
580 arthas->SetFacingToObject(me);
581 arthas->HandleEmoteCommand(EMOTE_ONESHOT_POINT);
582 }
584 break;
586 // Arthas despawn
588 arthas->RemoveFromWorld();
590 break;
592 // Talbot say text 4 and attack
595 {
596 if (talbot->IsAIEnabled())
597 talbot->AI()->Talk(SAY_TALBOT_4);
598 talbot->SetFaction(FACTION_VALANAR_COMBAT);
599 talbot->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
600 talbot->SetReactState(REACT_AGGRESSIVE);
601 talbot->Attack(me, false);
602 _preFightComplete = true;
603 }
604 break;
606 // Arlos say text 1
609 {
610 if (arlos->IsAIEnabled())
611 arlos->AI()->Talk(SAY_ARLOS_1);
612 arlos->SetEmoteState(EMOTE_STATE_NONE);
613 arlos->SetStandState(UNIT_STAND_STATE_KNEEL);
614 arlos->RemoveAura(SPELL_STUN);
615 }
617 {
618 leryssa->SetEmoteState(EMOTE_STATE_NONE);
619 leryssa->RemoveAura(SPELL_STUN);
620 }
622 break;
624 // Leryssa set facing to me
627 if (Creature* leryssa = me->FindNearestCreature(NPC_LERYSSA, 50.0f, true))
628 {
629 _leryssaGUID = leryssa->GetGUID();
630 leryssa->SetFacingToObject(me);
631 me->SetFacingToObject(leryssa);
632 }
634 break;
636 // Arlos say text 2 and die. Leryssa say text 1
637 if (Creature* arlos = me->FindNearestCreature(NPC_GENERAL_ARLOS, 50.0f, true))
638 {
639 _arlosGUID = arlos->GetGUID();
640 if (arlos->IsAIEnabled())
641 arlos->AI()->Talk(SAY_ARLOS_2);
642 arlos->SetStandState(UNIT_STAND_STATE_DEAD);
643 }
645 {
646 if (leryssa->IsAIEnabled())
647 leryssa->AI()->Talk(SAY_LERYSSA_1);
648 }
650 break;
652 // Thassarian say text 4
656 break;
658 // Leryssa run to Thassarian
660 {
661 leryssa->SetWalk(false);
662 leryssa->MonsterMoveWithSpeed(3726.751f, 3568.1633f, 477.44086f, leryssa->GetSpeed(MOVE_RUN), true, true);
663 }
665 break;
667 // Leryssa say text 2
669 {
670 if (leryssa->IsAIEnabled())
671 leryssa->AI()->Talk(SAY_LERYSSA_2);
672 leryssa->SetStandState(UNIT_STAND_STATE_SIT);
673 }
675 break;
677 // Thassarian say text 5
680 break;
682 // Leryssa say text 3
684 if (leryssa->IsAIEnabled())
685 leryssa->AI()->Talk(SAY_LERYSSA_3);
687 break;
689 // Thassarian say text 6
692 break;
694 // Leryssa say text 4
696 if (leryssa->IsAIEnabled())
697 leryssa->AI()->Talk(SAY_LERYSSA_4);
699 break;
701 // Thassarian say text 7
704 break;
706 Cleanup();
707 me->DespawnOrUnsummon(0s, 30s);
708 break;
709 default:
710 break;
711 }
712 }
713
714 if (!UpdateVictim())
715 return;
716 }
717
718 void JustDied(Unit* /*killer*/) override
719 {
720 Cleanup();
721 }
722
723 void Cleanup()
724 {
726 talbot->DespawnOrUnsummon();
727
729 leryssa->DespawnOrUnsummon();
730
732 arlos->DespawnOrUnsummon();
733
735 arthas->DespawnOrUnsummon();
736 }
737
738 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
739 {
740 if (gossipListId == 0)
741 {
742 _playerGUID = player->GetGUID();
743 CloseGossipMenuFor(player);
745 _questEventStarted = true;
747 }
748 return false;
749 }
750
751private:
760public:
764};
765
766// NPC 25250: General Arlos
768{
769 npc_general_arlos(Creature* creature) : ScriptedAI(creature) { }
770
771 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
772 {
773 if (pathId == PATH_ARLOS)
774 {
777 if (TempSummon* tempSummon = me->ToTempSummon())
778 if (Unit* summoner = tempSummon->GetSummonerUnit())
779 ENSURE_AI(npc_thassarian, summoner->GetAI())->ArlosInPosition = true;
780 }
781 }
782};
783
784// NPC 25251: Leryssa
785struct npc_leryssa : public ScriptedAI
786{
787 npc_leryssa(Creature* creature) : ScriptedAI(creature) {}
788
789 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
790 {
791 if (pathId == PATH_LERYSSA)
792 {
793 me->SetFacingTo(4.537856f);
796 if (TempSummon* tempSummon = me->ToTempSummon())
797 if (Unit* summoner = tempSummon->GetSummonerUnit())
798 ENSURE_AI(npc_thassarian, summoner->GetAI())->LeryssaInPosition = true;
799 }
800 }
801};
802
803// NPC 25301: Counselor Talbot
816
818{
819 npc_counselor_talbot(Creature* creature) : ScriptedAI(creature) {}
820
827
828 void UpdateAI(uint32 diff) override
829 {
830 if (!UpdateVictim())
831 return;
832
833 if (me->GetAreaId() == AREA_LAST_RITES)
834 {
835 _events.Update(diff);
836
837 if (uint32 eventId = _events.ExecuteEvent())
838 {
839 switch (eventId)
840 {
841 case EVENT_DEFLECTION:
844 break;
845 case EVENT_SOUL_BLAST:
848 break;
852 break;
853 default:
854 break;
855 }
856 }
857 }
858 }
859
860 void JustDied(Unit* /*killer*/) override
861 {
862 if (TempSummon* tempSummon = me->ToTempSummon())
863 if (Unit* summoner = tempSummon->GetSummonerUnit())
864 ENSURE_AI(npc_thassarian, summoner->GetAI())->TalbotJustDied = true;
865 }
866
867private:
869};
870
880
881// 45997 - Bloodspore Ruination
883{
884 void HandleEffect(SpellEffIndex /*effIndex*/)
885 {
886 if (Unit* caster = GetCaster())
887 if (Creature* laurith = caster->FindNearestCreature(NPC_BLOODMAGE_LAURITH, 100.0f))
888 laurith->AI()->SetGUID(caster->GetGUID(), DATA_FACING_PLAYER_GUID);
889 }
890
895};
896
898{
899 npc_bloodmage_laurith(Creature* creature) : ScriptedAI(creature) { }
900
901 void Reset() override
902 {
903 _events.Reset();
905 }
906
907 void SetGUID(ObjectGuid const& guid, int32 id) override
908 {
909 if (id != DATA_FACING_PLAYER_GUID)
910 return;
911
912 if (!_playerGUID.IsEmpty())
913 return;
914
915 _playerGUID = guid;
916
918 me->SetFacingToObject(player);
919
921 }
922
923 void UpdateAI(uint32 diff) override
924 {
925 if (UpdateVictim())
926 return;
927
928 _events.Update(diff);
929
930 if (uint32 eventId = _events.ExecuteEvent())
931 {
932 switch (eventId)
933 {
934 case EVENT_TALK:
939 break;
941 me->SetFacingTo(me->GetHomePosition().GetOrientation());
942 break;
943 }
944 }
945 }
946
947private:
950};
951
952/*######
953## Quest 11653: Hah... You're Not So Big Now!
954######*/
955
973
976
977// 45668 - Crafty's Ultra-Advanced Proto-Typical Shortening Blaster
999
1000// 45691 - Hah... : Magnataur On Death 1
1002{
1007
1008 void HandleScript(SpellEffIndex /*effIndex*/)
1009 {
1010 Creature* caster = GetCaster()->ToCreature();
1011 if (!caster)
1012 return;
1013
1014 GuidUnorderedSet const& tappers = caster->GetTapList();
1015 if (tappers.empty())
1016 return;
1017
1018 if (std::ranges::none_of(BlasterTargetSpells, [caster](uint32 spell) { return caster->HasAura(spell); }))
1019 return;
1020
1021 for (ObjectGuid const& tapper : tappers)
1022 if (Player* player = ObjectAccessor::GetPlayer(*caster, tapper))
1023 player->CastSpell(player, SPELL_MAGNATAUR_KILL_CREDIT);
1024
1025 caster->CastSpell(caster, SPELL_MAGNATAUR_ON_DEATH_2);
1026 }
1027
1032};
1033
1034// 45685 - Hah... : Magnataur On Death 2
1036{
1037 bool Validate(SpellInfo const* /*spellInfo*/) override
1038 {
1040 }
1041
1042 void HandleDummy(SpellEffIndex /*effIndex*/)
1043 {
1044 for (uint32 spell : BlasterTargetSpells)
1046 }
1047
1052};
1053
1054/*######
1055## Quest 11611: Taken by the Scourge
1056######*/
1057
1066
1071
1072// 45516 - Nerub'ar Web Random Unit (Not On Quest, Script Effect)
1090
1091// 45515 - Nerub'ar Web Random Unit (Not On Quest, Dummy)
1093{
1094 bool Validate(SpellInfo const* /*spellInfo*/) override
1095 {
1097 }
1098
1099 void HandleDummy(SpellEffIndex /*effIndex*/)
1100 {
1101 Unit* caster = GetCaster();
1102
1103 // Do nothing if has 3 soldiers
1104 Aura* aura = caster->GetAura(SPELL_FREED_SOLDIER_DEBUFF);
1105 if (!aura || aura->GetStackAmount() < 3)
1107 }
1108
1113};
1114
1115// 45535 - Nerub'ar Web Random Unit (On Quest, Dummy)
1117{
1122
1123 void HandleDummy(SpellEffIndex /*effIndex*/)
1124 {
1125 Unit* caster = GetCaster();
1126
1127 // Always summon peon if has 3 soldiers
1128 Aura* aura = caster->GetAura(SPELL_FREED_SOLDIER_DEBUFF);
1129 if ((!aura || aura->GetStackAmount() < 3) && roll_chance(75))
1131 else
1132 caster->CastSpell(nullptr, SPELL_FREED_WARSONG_PEON, true);
1133 }
1134
1139};
1140
1141// 45522 - Dispel Freed Soldier Debuff
1143{
1144 bool Validate(SpellInfo const* spellInfo) override
1145 {
1146 return ValidateSpellEffect({ { spellInfo->Id, EFFECT_0 } }) && ValidateSpellInfo({ uint32(spellInfo->GetEffect(EFFECT_0).CalcValueAsInt()) });
1147 }
1148
1149 void HandleScript(SpellEffIndex /*effIndex*/)
1150 {
1151 if (Aura* aura = GetHitUnit()->GetAura(uint32(GetEffectValueAsInt())))
1152 aura->ModStackAmount(-1);
1153 }
1154
1159};
1160
1161/*######
1162## Quest 11690: Bring 'Em Back Alive
1163######*/
1164
1175
1176// 45877 - Deliver Kodo
1178{
1179 bool Validate(SpellInfo const* /*spell*/) override
1180 {
1182 }
1183
1184 void HandleScript(SpellEffIndex /*effIndex*/)
1185 {
1186 Unit* caster = GetCaster();
1187 caster->CastSpell(caster, SPELL_KODO_DELIVERED, true);
1188 }
1189
1194};
1195
1196// 48204 - Kodo Delivered
1198{
1199 bool Validate(SpellInfo const* /*spellInfo*/) override
1200 {
1201 return sBroadcastTextStore.HasRecord(TEXT_DELIVERED_1) &&
1206 }
1207
1208 void HandleScript(SpellEffIndex /*effIndex*/)
1209 {
1210 Unit* caster = GetCaster();
1212 }
1213
1218};
1219
1220/*######
1221## Quest 11648: The Art of Persuasion
1222######*/
1223
1249
1250// 45634 - Neural Needle
1252{
1253 bool Validate(SpellInfo const* /*spellInfo*/) override
1254 {
1256 }
1257
1259 {
1260 Player* caster = GetCaster()->ToPlayer();
1261 Creature* target = GetHitCreature();
1262 if (!caster || !target)
1263 return;
1264
1265 target->CastSpell(target, SPELL_NEURAL_NEEDLE_IMPACT);
1266
1267 if (Aura* aura = caster->GetAura(GetSpellInfo()->Id))
1268 {
1269 switch (aura->GetStackAmount())
1270 {
1271 case 1:
1272 target->AI()->Talk(WHISPER_TORTURE_1, caster);
1273 break;
1274 case 2:
1275 target->AI()->Talk(WHISPER_TORTURE_2, caster);
1276 break;
1277 case 3:
1278 target->AI()->Talk(WHISPER_TORTURE_3, caster);
1279 break;
1280 case 4:
1281 target->AI()->Talk(WHISPER_TORTURE_4, caster);
1282 break;
1283 case 5:
1284 target->AI()->Talk(WHISPER_TORTURE_5, caster);
1285 caster->KilledMonsterCredit(target->GetEntry());
1286 break;
1287 case 6:
1289 break;
1290 default:
1291 return;
1292 }
1293 }
1294 }
1295
1300};
1301
1302// 48252 - Prototype Neural Needle
1304{
1305 bool Validate(SpellInfo const* /*spellInfo*/) override
1306 {
1308 }
1309
1311 {
1312 Player* caster = GetCaster()->ToPlayer();
1313 Creature* target = GetHitCreature();
1314 if (!caster || !target)
1315 return;
1316
1318
1319 uint32 text = 0;
1320 if (Aura* aura = caster->GetAura(GetSpellInfo()->Id))
1321 {
1322 switch (aura->GetStackAmount())
1323 {
1324 case 1: text = WHISPER_TORTURE_PROTO_1; break;
1325 case 2: text = WHISPER_TORTURE_PROTO_2; break;
1326 case 3: text = WHISPER_TORTURE_PROTO_3; break;
1327 case 4: text = WHISPER_TORTURE_PROTO_4; break;
1328 case 5: text = WHISPER_TORTURE_PROTO_5; break;
1329 case 6: text = WHISPER_TORTURE_PROTO_6; break;
1330 case 7: text = WHISPER_TORTURE_PROTO_7; break;
1331 case 8: text = WHISPER_TORTURE_PROTO_8; break;
1332 case 9: text = WHISPER_TORTURE_PROTO_9; break;
1333 case 10: text = WHISPER_TORTURE_PROTO_10; break;
1334 default: return;
1335 }
1336 }
1337
1338 if (text)
1339 target->AI()->Talk(text, caster);
1340 }
1341
1346};
1347
1348/*######
1349## Quest 11587: Prison Break
1350######*/
1351
1357
1358// 45449 - Arcane Prisoner Rescue
1376
1377/*######
1378## Quest 11896: Weakness to Lightning
1379######*/
1380
1386
1387// 46444 - Weakness to Lightning: Cast on Master Script Effect
1405
1406// 46446 - Weakness to Lightning: Cancel Power of the Storm Aura
1424
1425// 46550 - Weakness to Lightning: On Quest Complete
1443
1444/*######
1445## Quest 11711: Coward Delivery... Under 30 Minutes or it's Free
1446######*/
1447
1448// 45958 - Signal Alliance
1450{
1451 bool Validate(SpellInfo const* spellInfo) override
1452 {
1453 return ValidateSpellInfo(
1454 {
1455 uint32(spellInfo->GetEffect(EFFECT_0).CalcValueAsInt()),
1457 });
1458 }
1459
1460 void HandleDummy(SpellEffIndex /*effIndex*/)
1461 {
1462 Unit* caster = GetCaster();
1463 if (caster->HasAura(uint32(GetEffectInfo(EFFECT_0).CalcValueAsInt())))
1464 caster->CastSpell(caster, uint32(GetEffectValueAsInt()));
1465 }
1466
1471};
1472
1473/*######
1474## Quest 11730: Master and Servant
1475######*/
1476
1491
1492// 46023 - The Ultrasonic Screwdriver
1494{
1495 bool Load() override
1496 {
1497 return GetCaster()->GetTypeId() == TYPEID_PLAYER && GetCastItem();
1498 }
1499
1512
1513 void HandleDummy(SpellEffIndex /*effIndex*/)
1514 {
1515 Item* castItem = GetCastItem();
1516 Unit* caster = GetCaster();
1517 if (Creature* target = GetHitCreature())
1518 {
1519 uint32 spellId = 0;
1520 switch (target->GetEntry())
1521 {
1523 case NPC_SENTRYBOT_57K: spellId = SPELL_SUMMON_SENTRYBOT_57K; break;
1527 default:
1528 return;
1529 }
1530 caster->CastSpell(caster, spellId, castItem);
1531 caster->CastSpell(caster, SPELL_ROBOT_KILL_CREDIT, true);
1532 target->DespawnOrUnsummon();
1533 }
1534 }
1535
1540};
1541
1542/*######
1543## Quest 11652: The Plains of Nasam
1544######*/
1545
1557
1563
1564// 45750 - Land Mine Barrier
1566{
1567 bool Validate(SpellInfo const* /*spellInfo*/) override
1568 {
1570 }
1571
1572 void HandleScript(SpellEffIndex /*effIndex*/)
1573 {
1574 Unit* caster = GetCaster();
1575 for (uint32 spells : DropLandMineSpells)
1576 caster->CastSpell(caster, spells);
1577 }
1578
1583};
1584
1585/*######
1586## Quest 11681: Rescuing Evanor
1587######*/
1588
1593
1594// 45992 - Taxi - Amber Ledge to Beryl Point Platform
1612
1613/*######
1614## Quest 11969: Springing the Trap
1615######*/
1616
1621
1622// 46813 - Taxi - Coldarra Ledge to Transitus Shield
1640
1641/*######
1642## Quest 11712: Re-Cursive
1643######*/
1644
1649
1650// 45980 - Re-Cursive Transmatter Injection
1668
1669/*######
1670## Quest 11919, 11940: Drake Hunt
1671######*/
1672
1681
1682// 46607 - Drake Harpoon
1684{
1685 bool Validate(SpellInfo const* /*spellInfo*/) override
1686 {
1688 }
1689
1690 void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1691 {
1692 if (Unit* caster = GetCaster())
1693 caster->CastSpell(GetTarget(), SPELL_RED_DRAGONBLOOD, true);
1694 }
1695
1700};
1701
1702// 46620 - Red Dragonblood
1704{
1705 bool Validate(SpellInfo const* /*spellInfo*/) override
1706 {
1708 }
1709
1710 void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1711 {
1712 if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
1713 return;
1714
1715 if (Unit* caster = GetCaster())
1716 caster->CastSpell(GetTarget(), SPELL_CAPTURE_TRIGGER, true);
1717 }
1718
1723};
1724
1725// 46691 - Drake Hatchling Subdued
1727{
1728 bool Validate(SpellInfo const* /*spellInfo*/) override
1729 {
1731 }
1732
1733 void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1734 {
1735 switch (GetTargetApplication()->GetRemoveMode())
1736 {
1738 if (Unit* caster = GetCaster())
1739 GetTarget()->CastSpell(caster, SPELL_DRAKE_TURN_IN, true);
1740 break;
1743 if (Creature* creature = Object::ToCreature(GetCaster()))
1744 creature->DespawnOrUnsummon();
1745 break;
1746 default:
1747 break;
1748 }
1749 }
1750
1755};
1756
1757// 46693 - Strip Auras
1776
1777/*######
1778## Quest 11590: Abduction
1779######*/
1780
1781// 45625 - Arcane Chains: Character Force Cast
1799
1800// 45651 - Abduction: Quest Completion
1802{
1803 void HandleScript(SpellEffIndex /*effIndex*/)
1804 {
1805 if (Creature* creature = GetHitUnit()->ToCreature())
1806 creature->DespawnOrUnsummon();
1807 }
1808
1813};
1814
1816{
1853}
First const & RAND(First const &first, Second const &second, Rest const &... rest)
DB2Storage< BroadcastTextEntry > sBroadcastTextStore("BroadcastText.db2", &BroadcastTextLoadInfo::Instance)
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
@ TEMPSUMMON_DEAD_DESPAWN
@ TEMPSUMMON_CORPSE_TIMED_DESPAWN
std::unordered_set< ObjectGuid > GuidUnorderedSet
Definition ObjectGuid.h:435
@ TYPEID_PLAYER
Definition ObjectGuid.h:44
bool roll_chance(float chance, PseudoRandomDistributionState &state)
Definition Random.cpp:131
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:43
#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 CloseGossipMenuFor(Player *player)
SpellEffIndex
@ EFFECT_1
@ EFFECT_0
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_SEND_EVENT
@ EMOTE_STATE_READY1H
@ EMOTE_ONESHOT_LOOT
@ EMOTE_ONESHOT_KNEEL
@ EMOTE_ONESHOT_POINT
@ EMOTE_STATE_NONE
@ FACTION_UNDEAD_SCOURGE
@ GO_STATE_READY
@ GO_STATE_ACTIVE
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ AURA_REMOVE_BY_DEFAULT
@ AURA_REMOVE_BY_DEATH
@ AURA_REMOVE_BY_EXPIRE
@ SPELL_AURA_DUMMY
@ SPELL_AURA_MECHANIC_IMMUNITY
#define SpellEffectFn(F, I, N)
#define AuraEffectApplyFn(F, I, N, M)
#define SpellHitFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
#define ENSURE_AI(a, b)
Definition UnitAI.h:30
@ MOVE_RUN
@ 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
@ UNIT_NPC_FLAG_GOSSIP
@ UNIT_NPC_FLAG_QUESTGIVER
@ UNIT_FLAG_NON_ATTACKABLE
@ UNIT_STATE_STUNNED
Definition Unit.h:278
AuraApplication const * GetTargetApplication() const
HookList< EffectApplyHandler > AfterEffectRemove
HookList< EffectApplyHandler > AfterEffectApply
Unit * GetCaster() const
Unit * GetTarget() const
uint8 GetStackAmount() const
Definition SpellAuras.h:238
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
TypeID GetTypeId() const
Definition BaseEntity.h:166
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:396
GuidUnorderedSet const & GetTapList() const
Definition Creature.h:312
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
CreatureAI * AI() const
Definition Creature.h:235
void Update(uint32 time)
Definition EventMap.h:77
EventId ExecuteEvent()
Definition EventMap.cpp:77
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:40
void Reset()
Definition EventMap.cpp:25
GameObject *const me
void SetGoState(GOState state)
GOState GetGoState() const
Definition GameObject.h:290
void DespawnOrUnsummon(Milliseconds delay=0ms, Seconds forceRespawnTime=0s)
void Use(Unit *user, bool ignoreCastInProgress=false)
Definition Item.h:185
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:16646
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:590
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
SpellEffectInfo const & GetEffectInfo() const
HookList< EffectHandler > OnEffectHitTarget
Item * GetCastItem() const
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:172
Definition Unit.h:647
void SetStandState(UnitStandStateType state, uint32 animKitID=0)
Definition Unit.cpp:10804
void RestoreFaction()
Definition Unit.cpp:12143
MotionMaster * GetMotionMaster()
Definition Unit.h:1750
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:1013
TempSummon * ToTempSummon()
Definition Unit.h:1844
void AddUnitState(uint32 f)
Definition Unit.h:754
void SetFacingToObject(WorldObject const *object, bool force=true, uint32 movementId=EVENT_FACE)
Definition Unit.cpp:13394
void SetEmoteState(Emote emote)
Definition Unit.h:880
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4718
void SetNpcFlag(NPCFlags flags)
Definition Unit.h:1012
bool SetWalk(bool enable)
Definition Unit.cpp:13422
void SetFacingTo(float ori, bool force=true, uint32 movementId=EVENT_FACE)
Definition Unit.cpp:13385
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4822
void HandleEmoteCommand(Emote emoteId, Player *target=nullptr, Trinity::IteratorPair< int32 const * > spellVisualKitIds={}, int32 sequenceVariation=0)
Definition Unit.cpp:1662
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3992
void RemoveUnitFlag(UnitFlags flags)
Definition Unit.h:862
GameObject * FindNearestGameObject(uint32 entry, float range, bool spawnedOnly=true) const
Definition Object.cpp:1544
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2222
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
Definition Object.cpp:1403
GameObject * SummonGameObject(uint32 entry, Position const &pos, QuaternionData const &rot, Seconds respawnTime, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
Definition Object.cpp:1446
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:1522
uint32 GetAreaId() const
Definition Object.h:333
Position GetFirstCollisionPosition(float dist, float angle)
Definition Object.cpp:2767
bool Validate(SpellInfo const *spellInfo) override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *spellInfo) override
bool Validate(SpellInfo const *) override
void AfterApply(AuraEffect const *, AuraEffectHandleModes)
void AfterRemove(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void AfterRemove(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *spellInfo) override
bool Validate(SpellInfo const *) override
void AfterRemove(AuraEffect const *, AuraEffectHandleModes)
void AfterRemove(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 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 SetGUID(ObjectGuid const &guid, int32 id) override
npc_bloodmage_laurith(Creature *creature)
void UpdateAI(uint32 diff) 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 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
@ 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_DRAKE_TURN_IN
@ SPELL_CAPTURE_TRIGGER
@ SPELL_DRAKE_HATCHLING_SUBDUED
@ SPELL_ROPE_BEAM
@ SPELL_RED_DRAGONBLOOD
@ 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
@ EVENT_SOUL_BLAST
@ SPELL_VAMPIRIC_BOLT
@ SPELL_DEFLECTION
@ EVENT_VAMPIRIC_BOLT
@ AREA_LAST_RITES
@ SPELL_SOUL_BLAST
@ EVENT_DEFLECTION
@ SPELL_SUMMON_FIZZCRANK_SURVIVOR
HahYoureNotSoBigNow
@ SPELL_POLYMORPH_1
@ SPELL_SHRUNK_2
@ SPELL_GHOST_2
@ SPELL_MAGNATAUR_KILL_CREDIT
@ SPELL_SHRUNK_1
@ SPELL_POLYMORPH_2
@ SPELL_MAGNATAUR_ON_DEATH_2
@ SPELL_YELLOW_1
@ SPELL_YELLOW_2
@ SPELL_GHOST_1
@ SPELL_BIGGER_1
@ SPELL_BIGGER_2
static constexpr std::array< uint32, 5 > BlasterTargetSpells
std::array< uint32, 3 > const CocoonSummonSpells
@ SPELL_SUMMON_SENTRYBOT_57K
@ SPELL_SUMMON_SCAVENGEBOT_004A8
@ NPC_DEFENDOTANK_66D
@ SPELL_SUMMON_55D_COLLECTATRON
@ SPELL_SUMMON_SCAVENGEBOT_005B6
@ NPC_SCAVENGEBOT_004A8
@ NPC_SCAVENGEBOT_005B6
@ NPC_SENTRYBOT_57K
@ SPELL_SUMMON_DEFENDOTANK_66D
@ SPELL_ROBOT_KILL_CREDIT
@ NPC_55D_COLLECTATRON
@ SPELL_COLDARRA_TO_TRANSITUS
BloodsporeRuination
@ DATA_FACING_PLAYER_GUID
@ NPC_BLOODMAGE_LAURITH
@ SAY_BLOODMAGE_LAURITH
@ EVENT_RESET_ORIENTATION
void AddSC_borean_tundra()
@ SPELL_POWER_OF_THE_STORM_ITEM
@ SPELL_POWER_OF_THE_STORM
@ SPELL_DROP_WARSONG_LAND_MINE_1
@ SPELL_DROP_WARSONG_LAND_MINE_4
@ SPELL_DROP_WARSONG_LAND_MINE_8
@ SPELL_DROP_WARSONG_LAND_MINE_3
@ SPELL_DROP_WARSONG_LAND_MINE_2
@ SPELL_DROP_WARSONG_LAND_MINE_7
@ SPELL_DROP_WARSONG_LAND_MINE_5
@ SPELL_DROP_WARSONG_LAND_MINE_6
@ SPELL_AMBER_LEDGE_TO_BERYL_POINT
static constexpr std::array< uint32, 8 > DropLandMineSpells
@ SPELL_FREED_WARSONG_MAGE
@ SPELL_FREED_SOLDIER_DEBUFF
@ SPELL_FREED_WARSONG_WARRIOR
@ SPELL_FREED_WARSONG_PEON
@ SPELL_FREED_WARSONG_SHAMAN
static constexpr std::array< uint32, 5 > BlasterCasterSpells
@ 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