Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
zone_borean_tundra.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6/* ScriptData
7SDName: Borean_Tundra
8SD%Complete: 100
9SDComment: Quest support: 11708. Taxi vendors.
10SDCategory: Borean Tundra
11EndScriptData */
12
13/* ContentData
14npc_iruk
15npc_corastrasza
16npc_jenny
17npc_sinkhole_kill_credit
18npc_khunok_the_behemoth
19npc_nerubar_victim
20npc_keristrasza
21npc_nesingwary_trapper
22npc_lurgglbr
23npc_nexus_drake_hatchling
24EndContentData */
25
26#include "ScriptMgr.h"
27#include "ScriptedCreature.h"
28#include "ScriptedGossip.h"
29#include "ScriptedEscortAI.h"
30#include "ScriptedFollowerAI.h"
31#include "Player.h"
32#include "SpellInfo.h"
33#include "WorldSession.h"
34
35/*######
36## npc_sinkhole_kill_credit
37######*/
38
46
48{
49public:
50 npc_sinkhole_kill_credit() : CreatureScript("npc_sinkhole_kill_credit") { }
51
53 {
55
59
61 {
62 phaseTimer = 500;
63 phase = 0;
64 casterGuid = 0;
65 }
66
67 void SpellHit(Unit* caster, const SpellInfo* spell) OVERRIDE
68 {
69 if (phase || spell->Id != SPELL_SET_CART)
70 return;
71
72 Player* player = caster->ToPlayer();
73 if (player && player->GetQuestStatus(11897) == QUEST_STATUS_INCOMPLETE)
74 {
75 phase = 1;
76 casterGuid = caster->GetGUID();
77 }
78 }
79
80 void EnterCombat(Unit* /*who*/) OVERRIDE { }
81
83 {
84 if (!phase)
85 return;
86
87 if (phaseTimer <= diff)
88 {
89 switch (phase)
90 {
91 case 1:
94 if (GameObject* cart = me->FindNearestGameObject(188160, 3))
95 cart->SetUInt32Value(GAMEOBJECT_FIELD_FACTION_TEMPLATE, 14);
96 phaseTimer = 3000;
97 phase = 2;
98 break;
99 case 2:
100 if (GameObject* cart = me->FindNearestGameObject(188160, 3))
101 cart->UseDoorOrButton();
103 phaseTimer = 3000;
104 phase = 3;
105 break;
106 case 3:
108 phaseTimer = 2000;
109 phase = 5; // @fixme: phase 4 is missing...
110 break;
111 case 5:
113 if (Unit* worm = me->FindNearestCreature(26250, 3))
114 {
116 worm->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE);
117 }
118 phaseTimer = 1000;
119 phase = 6;
120 break;
121 case 6:
123 if (Unit* worm = me->FindNearestCreature(26250, 3))
124 {
125 me->Kill(worm);
127 }
128 phaseTimer = 2000;
129 phase = 7;
130 break;
131 case 7:
134 caster->KilledMonster(me->GetCreatureTemplate(), me->GetGUID());
135 phaseTimer = 5000;
136 phase = 8;
137 break;
138 case 8:
140 break;
141 }
142 } else phaseTimer -= diff;
143 }
144 };
145
147 {
148 return new npc_sinkhole_kill_creditAI(creature);
149 }
150};
151
152/*######
153## npc_khunok_the_behemoth
154######*/
155
157{
158public:
159 npc_khunok_the_behemoth() : CreatureScript("npc_khunok_the_behemoth") { }
160
162 {
164
166
167 {
169
170 if (who->GetTypeId() != TypeID::TYPEID_UNIT)
171 return;
172
173 if (who->GetEntry() == 25861 && me->IsWithinDistInMap(who, 10.0f))
174 {
175 if (Unit* owner = who->GetOwner())
176 {
177 if (owner->GetTypeId() == TypeID::TYPEID_PLAYER)
178 {
179 owner->CastSpell(owner, 46231, true);
180 who->ToCreature()->DespawnOrUnsummon();
181 }
182 }
183 }
184 }
185 };
186
188 {
189 return new npc_khunok_the_behemothAI(creature);
190 }
191};
192
193/*######
194## npc_keristrasza
195######*/
196
201
202#define GOSSIP_HELLO_KERI "I am prepared to face Saragosa!"
203
205{
206public:
207 npc_keristrasza() : CreatureScript("npc_keristrasza") { }
208
209 bool OnGossipHello(Player* player, Creature* creature) OVERRIDE
210 {
211 if (creature->IsQuestGiver())
212 player->PrepareQuestMenu(creature->GetGUID());
213
214 if (player->GetQuestStatus(11957) == QUEST_STATUS_INCOMPLETE)
216
217 player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
218
219 return true;
220 }
221
222 bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) OVERRIDE
223 {
224 player->PlayerTalkClass->ClearMenus();
225 if (action == GOSSIP_ACTION_INFO_DEF + 1)
226 {
227 player->CLOSE_GOSSIP_MENU();
228 player->CastSpell(player, SPELL_TELEPORT_TO_SARAGOSA, true);
229 }
230
231 return true;
232 }
233};
234
235/*######
236## npc_corastrasza
237######*/
238
239#define GOSSIP_ITEM_C_1 "I... I think so..."
240
249
251{
252public:
253 npc_corastrasza() : CreatureScript("npc_corastrasza") { }
254
255 bool OnGossipHello(Player* player, Creature* creature) OVERRIDE
256 {
257 if (creature->IsQuestGiver())
258 player->PrepareQuestMenu(creature->GetGUID());
259
260 if (player->GetQuestStatus(QUEST_ACES_HIGH) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_ACES_HIGH_DAILY) == QUEST_STATUS_INCOMPLETE) //It's the same dragon for both quests.
262
263 player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
264 return true;
265 }
266
267 bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) OVERRIDE
268 {
269 player->PlayerTalkClass->ClearMenus();
270 if (action == GOSSIP_ACTION_INFO_DEF+1)
271 {
272 player->CLOSE_GOSSIP_MENU();
273
274 player->CastSpell(player, SPELL_SUMMON_WYRMREST_SKYTALON, true);
275 player->CastSpell(player, SPELL_WYRMREST_SKYTALON_RIDE_PERIODIC, true);
276 }
277 return true;
278 }
279};
280
281/*######
282## npc_iruk
283######*/
284
285#define GOSSIP_ITEM_I "<Search corpse for Issliruk's Totem.>"
286
293
295{
296public:
297 npc_iruk() : CreatureScript("npc_iruk") { }
298
299 bool OnGossipHello(Player* player, Creature* creature) OVERRIDE
300 {
301 if (player->GetQuestStatus(QUEST_SPIRITS_WATCH_OVER_US) == QUEST_STATUS_INCOMPLETE)
303
304 player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXT_I, creature->GetGUID());
305 return true;
306 }
307
308 bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) OVERRIDE
309 {
310 player->PlayerTalkClass->ClearMenus();
311 switch (action)
312 {
314 player->CastSpell(player, SPELL_CREATURE_TOTEM_OF_ISSLIRUK, true);
315 player->CLOSE_GOSSIP_MENU();
316 break;
317 }
318 return true;
319 }
320};
321
322/*######
323## npc_nerubar_victim
324######*/
325
326#define WARSONG_PEON 25270
327
329{
330 45526, 45527, 45514
331};
332
334{
335public:
336 npc_nerubar_victim() : CreatureScript("npc_nerubar_victim") { }
337
339 {
340 npc_nerubar_victimAI(Creature* creature) : ScriptedAI(creature) { }
341
342 void Reset() OVERRIDE { }
343 void EnterCombat(Unit* /*who*/) OVERRIDE { }
344 void MoveInLineOfSight(Unit* /*who*/) OVERRIDE { }
345
346
347 void JustDied(Unit* killer) OVERRIDE
348 {
349 Player* player = killer->ToPlayer();
350 if (!player)
351 return;
352
353 if (player->GetQuestStatus(11611) == QUEST_STATUS_INCOMPLETE)
354 {
355 uint8 uiRand = std::rand() % 99;
356 if (uiRand < 25)
357 {
358 player->CastSpell(me, 45532, true);
360 }
361 else if (uiRand < 75)
362 player->CastSpell(me, nerubarVictims[std::rand() % 2], true);
363 }
364 }
365 };
366
368 {
369 return new npc_nerubar_victimAI(creature);
370 }
371};
372
373/*######
374## npc_jenny
375######*/
376
388
390{
391public:
392 npc_jenny() : CreatureScript("npc_jenny") { }
393
394 struct npc_jennyAI : public ScriptedAI
395 {
396 npc_jennyAI(Creature* creature) : ScriptedAI(creature) { }
397
399
401 {
402 if (!setCrateNumber)
403 setCrateNumber = true;
404
405 me->SetReactState(REACT_PASSIVE);
406
407 switch (me->GetOwner()->ToPlayer()->GetTeamId())
408 {
409 case TEAM_ALLIANCE:
411 break;
412 default:
413 case TEAM_HORDE:
415 break;
416 }
417 }
418
419 void DamageTaken(Unit* /*pDone_by*/, uint32& /*uiDamage*/) OVERRIDE
420 {
421 DoCast(me, SPELL_DROP_CRATE, true);
422 }
423
424 void UpdateAI(uint32 /*diff*/) OVERRIDE
425 {
426 if (setCrateNumber)
427 {
428 me->AddAura(SPELL_CRATES_CARRIED, me);
429 setCrateNumber = false;
430 }
431
432 if (!setCrateNumber && !me->HasAura(SPELL_CRATES_CARRIED))
433 me->DisappearAndDie();
434
435 if (!UpdateVictim())
436 return;
437 }
438 };
439
441 {
442 return new npc_jennyAI(creature);
443 }
444};
445
446/*######
447## npc_fezzix_geartwist
448######*/
449
451{
452public:
453 npc_fezzix_geartwist() : CreatureScript("npc_fezzix_geartwist") { }
454
456 {
457 npc_fezzix_geartwistAI(Creature* creature) : ScriptedAI(creature) { }
458
460
461 {
463
464 if (who->GetEntry() != NPC_JENNY || !who->HasAura(SPELL_CRATES_CARRIED))
465 return;
466
467 Unit* owner = who->GetOwner();
468 if (!owner || !me->IsWithinDistInMap(who, 10.0f))
469 return;
470
471 if (Player* player = owner->ToPlayer())
472 {
473 owner->CastSpell(owner, SPELL_GIVE_JENNY_CREDIT, true); // Maybe is not working.
474 player->CompleteQuest(QUEST_LOADER_UP);
475 who->ToCreature()->DisappearAndDie();
476 }
477 }
478 };
479
481 {
482 return new npc_fezzix_geartwistAI(creature);
483 }
484};
485
486/*######
487## npc_nesingwary_trapper
488######*/
489
512
513#define CaribouTrapsNum 15
520
522{
523public:
524 npc_nesingwary_trapper() : CreatureScript("npc_nesingwary_trapper") { }
525
527 {
528 npc_nesingwary_trapperAI(Creature* creature) : ScriptedAI(creature) { creature->SetVisible(false); }
529
533
535 {
536 me->SetVisible(false);
537 phaseTimer = 2500;
538 phase = 1;
539 go_caribouGUID = 0;
540 }
541
542 void EnterCombat(Unit* /*who*/) OVERRIDE { }
543 void MoveInLineOfSight(Unit* /*who*/) OVERRIDE { }
544
545
546 void JustDied(Unit* /*killer*/) OVERRIDE
547 {
548 if (GameObject* go_caribou = me->GetMap()->GetGameObject(go_caribouGUID))
549 go_caribou->SetLootState(LootState::GO_JUST_DEACTIVATED);
550
551 if (TempSummon* summon = me->ToTempSummon())
552 if (summon->IsSummon())
553 if (Unit* temp = summon->GetSummoner())
554 if (Player* player = temp->ToPlayer())
555 player->KilledMonsterCredit(me->GetEntry(), 0);
556
557 if (GameObject* go_caribou = me->GetMap()->GetGameObject(go_caribouGUID))
558 go_caribou->SetGoState(GOState::GO_STATE_READY);
559 }
560
562 {
563 if (phaseTimer <= diff)
564 {
565 switch (phase)
566 {
567 case 1:
568 me->SetVisible(true);
569 phaseTimer = 2000;
570 phase = 2;
571 break;
572 case 2:
573 if (GameObject* go_fur = me->FindNearestGameObject(GO_HIGH_QUALITY_FUR, 11.0f))
574 me->GetMotionMaster()->MovePoint(0, go_fur->GetPositionX(), go_fur->GetPositionY(), go_fur->GetPositionZ());
575 phaseTimer = 1500;
576 phase = 3;
577 break;
578 case 3:
579 //Talk(SAY_NESINGWARY_1);
580 phaseTimer = 2000;
581 phase = 4;
582 break;
583 case 4:
584 me->HandleEmoteCommand(EMOTE_ONESHOT_LOOT);
585 phaseTimer = 1000;
586 phase = 5;
587 break;
588 case 5:
589 me->HandleEmoteCommand(EMOTE_ONESHOT_NONE);
590 phaseTimer = 500;
591 phase = 6;
592 break;
593 case 6:
594 if (GameObject* go_fur = me->FindNearestGameObject(GO_HIGH_QUALITY_FUR, 11.0f))
595 go_fur->Delete();
596 phaseTimer = 500;
597 phase = 7;
598 break;
599 case 7:
600 {
601 GameObject* go_caribou = NULL;
602 for (uint8 i = 0; i < CaribouTrapsNum; ++i)
603 {
604 go_caribou = me->FindNearestGameObject(CaribouTraps[i], 5.0f);
605 if (go_caribou)
606 {
608 go_caribouGUID = go_caribou->GetGUID();
609 break;
610 }
611 }
612 phase = 8;
613 phaseTimer = 1000;
614 }
615 break;
616 case 8:
617 DoCast(me, SPELL_TRAPPED, true);
618 phase = 0;
619 break;
620 }
621 } else phaseTimer -= diff;
622 }
623 };
624
626 {
627 return new npc_nesingwary_trapperAI(creature);
628 }
629};
630
631/*######
632## npc_lurgglbr
633######*/
634
649
651{
652public:
653 npc_lurgglbr() : CreatureScript("npc_lurgglbr") { }
654
656 {
657 npc_lurgglbrAI(Creature* creature) : npc_escortAI(creature){ }
658
661
663 {
665 {
666 IntroTimer = 0;
667 IntroPhase = 0;
668 }
669 }
670
672 {
673 switch (waypointId)
674 {
675 case 0:
676 IntroPhase = 1;
677 IntroTimer = 2000;
678 break;
679 case 41:
680 IntroPhase = 4;
681 IntroTimer = 2000;
682 break;
683 }
684 }
685
687 {
688 if (IntroPhase)
689 {
690 if (IntroTimer <= diff)
691 {
692 switch (IntroPhase)
693 {
694 case 1:
696 IntroPhase = 2;
697 IntroTimer = 7500;
698 break;
699 case 2:
701 IntroPhase = 3;
702 IntroTimer = 7500;
703 break;
704 case 3:
705 me->SetReactState(REACT_AGGRESSIVE);
706 IntroPhase = 0;
707 IntroTimer = 0;
708 break;
709 case 4:
711 IntroPhase = 5;
712 IntroTimer = 8000;
713 break;
714 case 5:
716 IntroPhase = 6;
717 IntroTimer = 2500;
718 break;
719
720 case 6:
721 if (Player* player = GetPlayerForEscort())
722 player->AreaExploredOrEventHappens(QUEST_ESCAPE_WINTERFIN_CAVERNS);
723 IntroPhase = 7;
724 IntroTimer = 2500;
725 break;
726
727 case 7:
728 me->DespawnOrUnsummon();
729 IntroPhase = 0;
730 IntroTimer = 0;
731 break;
732 }
733 } else IntroTimer -= diff;
734 }
736
737 if (!UpdateVictim())
738 return;
739 }
740 };
741
743 {
744 return new npc_lurgglbrAI(creature);
745 }
746
747 bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) OVERRIDE
748 {
749 if (quest->GetQuestId() == QUEST_ESCAPE_WINTERFIN_CAVERNS)
750 {
751 if (GameObject* go = creature->FindNearestGameObject(GO_CAGE, 5.0f))
752 {
753 go->SetRespawnTime(0);
754 go->SetGoType(GAMEOBJECT_TYPE_BUTTON);
755 go->UseDoorOrButton(20);
756 }
757
758 if (npc_escortAI* pEscortAI = CAST_AI(npc_lurgglbr::npc_lurgglbrAI, creature->AI()))
759 pEscortAI->Start(true, false, player->GetGUID());
760
761 switch (player->GetTeam())
762 {
763 case ALLIANCE:
764 creature->setFaction(FACTION_ESCORTEE_A);
765 break;
766 default:
767 case HORDE:
768 creature->setFaction(FACTION_ESCORTEE_H);
769 break;
770 }
771
772 return true;
773 }
774 return false;
775 }
776};
777
778/*######
779## npc_nexus_drake_hatchling
780######*/
781
794
796{
797public:
798 npc_nexus_drake_hatchling() : CreatureScript("npc_nexus_drake_hatchling") { }
799
800 struct npc_nexus_drake_hatchlingAI : public FollowerAI //The spell who makes the npc follow the player is missing, also we can use FollowerAI!
801 {
803 {
804 HarpoonerGUID = 0;
805 WithRedDragonBlood = false;
806 }
807
809 {
810 WithRedDragonBlood = false;
811 }
812
814 {
815 if (me->IsValidAttackTarget(who))
816 AttackStart(who);
817 }
818
819 void SpellHit(Unit* caster, const SpellInfo* spell) OVERRIDE
820 {
821 if (spell->Id == SPELL_DRAKE_HARPOON && caster->GetTypeId() == TypeID::TYPEID_PLAYER)
822 {
823 HarpoonerGUID = caster->GetGUID();
825 }
826 WithRedDragonBlood = true;
827 }
828
830
831 {
833
834 if (!HarpoonerGUID)
835 return;
836
837 if (me->HasAura(SPELL_SUBDUED) && who->GetEntry() == NPC_RAELORASZ)
838 {
839 if (me->IsWithinDistInMap(who, INTERACTION_DISTANCE))
840 {
842 {
843 pHarpooner->KilledMonsterCredit(26175, 0);
844 pHarpooner->RemoveAura(SPELL_DRAKE_HATCHLING_SUBDUED);
846 HarpoonerGUID = 0;
847 me->DisappearAndDie();
848 }
849 }
850 }
851 }
852
853 void UpdateAI(uint32 /*diff*/) OVERRIDE
854 {
856 {
858 {
860 StartFollow(pHarpooner, 35, NULL);
861
862 DoCast(me, SPELL_SUBDUED, true);
863 pHarpooner->CastSpell(pHarpooner, SPELL_DRAKE_HATCHLING_SUBDUED, true);
864
865 me->AttackStop();
866 WithRedDragonBlood = false;
867 }
868 }
869
870 if ((me->getFaction() == 35) && (!me->HasAura(SPELL_SUBDUED)))
871 {
872 HarpoonerGUID = 0;
873 me->DisappearAndDie();
874 }
875
876 if (!UpdateVictim())
877 return;
878
880 }
881
884 };
885
887 {
888 return new npc_nexus_drake_hatchlingAI(creature);
889 }
890};
891
892/*######
893## npc_thassarian
894######*/
895
935
936#define GOSSIP_ITEM_T "Let's do this, Thassarian. It's now or never."
937
939{
940public:
941 npc_thassarian() : CreatureScript("npc_thassarian") { }
942
944 {
945 npc_thassarianAI(Creature* creature) : npc_escortAI(creature) { }
946
951
956
959
961 {
962 me->RestoreFaction();
963 me->RemoveStandFlags(UNIT_STAND_STATE_SIT);
964
965 arthasGUID = 0;
966 talbotGUID = 0;
967 leryssaGUID = 0;
968 arlosGUID = 0;
969
970 arthasInPosition = false;
971 arlosInPosition = false;
972 leryssaInPosition = false;
973 talbotInPosition = false;
974
975 phase = 0;
976 phaseTimer = 0;
977 }
978
980 {
981 Player* player = GetPlayerForEscort();
982 if (!player)
983 return;
984
985 switch (waypointId)
986 {
987 case 3:
988 SetEscortPaused(true);
989 if (Creature* arthas = me->SummonCreature(NPC_IMAGE_LICH_KING, 3730.313f, 3518.689f, 473.324f, 1.562f, TempSummonType::TEMPSUMMON_CORPSE_TIMED_DESPAWN, 120000))
990 {
991 arthasGUID = arthas->GetGUID();
993 arthas->SetReactState(REACT_PASSIVE);
994 arthas->SetWalk(true);
995 arthas->GetMotionMaster()->MovePoint(0, 3737.374756f, 3564.841309f, 477.433014f);
996 }
997 if (Creature* talbot = me->SummonCreature(NPC_COUNSELOR_TALBOT, 3747.23f, 3614.936f, 473.321f, 4.462012f, TempSummonType::TEMPSUMMON_CORPSE_TIMED_DESPAWN, 120000))
998 {
999 talbotGUID = talbot->GetGUID();
1000 talbot->SetWalk(true);
1001 talbot->GetMotionMaster()->MovePoint(0, 3738.000977f, 3568.882080f, 477.433014f);
1002 }
1003 me->SetWalk(false);
1004 break;
1005 case 4:
1006 SetEscortPaused(true);
1007 phase = 7;
1008 break;
1009 }
1010 }
1011
1013 {
1014 npc_escortAI::UpdateAI(uiDiff);
1015
1017 {
1018 phase = 1;
1019 arthasInPosition = false;
1020 talbotInPosition = false;
1021 }
1022
1024 {
1025 arlosInPosition = false;
1026 leryssaInPosition = false;
1028 SetEscortPaused(false);
1029 }
1030
1031 if (phaseTimer <= uiDiff)
1032 {
1033 Creature* talbot = me->GetCreature(*me, talbotGUID);
1034 Creature* arthas = me->GetCreature(*me, arthasGUID);
1035 switch (phase)
1036 {
1037 case 1:
1038 if (talbot)
1040 phaseTimer = 3000;
1041 ++phase;
1042 break;
1043
1044 case 2:
1045 if (talbot)
1046 {
1048 talbot->setFaction(14);
1051 }
1052 phaseTimer = 5000;
1053 ++phase;
1054 break;
1055
1056 case 3:
1057 if (talbot)
1058 talbot->AI()->Talk(SAY_TALBOT_1);
1059 phaseTimer = 5000;
1060 ++phase;
1061 break;
1062
1063 case 4:
1064 if (arthas)
1065 arthas->AI()->Talk(SAY_LICH_1);
1066 phaseTimer = 5000;
1067 ++phase;
1068 break;
1069
1070 case 5:
1071 if (talbot)
1072 talbot->AI()->Talk(SAY_TALBOT_2);
1073 phaseTimer = 5000;
1074 ++phase;
1075 break;
1076
1077 case 6:
1078 if (Creature* arlos = me->SummonCreature(NPC_GENERAL_ARLOS, 3745.527100f, 3615.655029f, 473.321533f, 4.447805f, TempSummonType::TEMPSUMMON_CORPSE_TIMED_DESPAWN, 120000))
1079 {
1080 arlosGUID = arlos->GetGUID();
1081 arlos->SetWalk(true);
1082 arlos->GetMotionMaster()->MovePoint(0, 3735.570068f, 3572.419922f, 477.441010f);
1083 }
1084 if (Creature* leryssa = me->SummonCreature(NPC_LERYSSA, 3749.654541f, 3614.959717f, 473.323486f, 4.524959f, TempSummonType::TEMPSUMMON_CORPSE_TIMED_DESPAWN, 120000))
1085 {
1086 leryssaGUID = leryssa->GetGUID();
1087 leryssa->SetWalk(false);
1088 leryssa->SetReactState(REACT_PASSIVE);
1089 leryssa->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
1090 leryssa->GetMotionMaster()->MovePoint(0, 3741.969971f, 3571.439941f, 477.441010f);
1091 }
1092 phaseTimer = 2000;
1093 phase = 0;
1094 break;
1095
1096 case 7:
1098 phaseTimer = 5000;
1099 ++phase;
1100 break;
1101
1102 case 8:
1103 if (arthas && talbot)
1104 {
1105 arthas->SetInFront(me); //The client doesen't update with the new orientation :l
1107 arthas->AI()->Talk(SAY_LICH_2);
1108 }
1109 phaseTimer = 5000;
1110 phase = 9;
1111 break;
1112
1113 case 9:
1115 phaseTimer = 5000;
1116 phase = 10;
1117 break;
1118
1119 case 10:
1120 if (talbot)
1121 talbot->AI()->Talk(SAY_TALBOT_3);
1122 phaseTimer = 5000;
1123 phase = 11;
1124 break;
1125
1126 case 11:
1127 if (arthas)
1128 arthas->AI()->Talk(SAY_LICH_3);
1129 phaseTimer = 5000;
1130 phase = 12;
1131 break;
1132
1133 case 12:
1134 if (talbot)
1135 talbot->AI()->Talk(SAY_TALBOT_4);
1136 phaseTimer = 2000;
1137 phase = 13;
1138 break;
1139
1140 case 13:
1141 if (arthas)
1142 arthas->RemoveFromWorld();
1143 ++phase;
1144 break;
1145
1146 case 14:
1148 if (talbot)
1149 {
1152 talbot->CastSpell(me, SPELL_SHADOW_BOLT, false);
1153 }
1154 phaseTimer = 1500;
1155 ++phase;
1156 break;
1157
1158 case 15:
1159 me->SetReactState(REACT_AGGRESSIVE);
1160 AttackStart(talbot);
1161 phase = 0;
1162 break;
1163
1164 case 16:
1166 phaseTimer = 20000;
1167 ++phase;
1168 break;
1169
1170 case 17:
1171 if (Creature* leryssa = me->GetCreature(*me, leryssaGUID))
1172 leryssa->RemoveFromWorld();
1173 if (Creature* arlos= me->GetCreature(*me, arlosGUID))
1174 arlos->RemoveFromWorld();
1175 if (talbot)
1176 talbot->RemoveFromWorld();
1177 me->RemoveStandFlags(UNIT_STAND_STATE_SIT);
1178 SetEscortPaused(false);
1179 phaseTimer = 0;
1180 phase = 0;
1181 }
1182 } else phaseTimer -= uiDiff;
1183
1184 if (!UpdateVictim())
1185 return;
1186
1188 }
1189
1190 void JustDied(Unit* /*killer*/) OVERRIDE
1191 {
1192 if (Creature* talbot = me->GetCreature(*me, talbotGUID))
1193 talbot->RemoveFromWorld();
1194
1195 if (Creature* leryssa = me->GetCreature(*me, leryssaGUID))
1196 leryssa->RemoveFromWorld();
1197
1198 if (Creature* arlos = me->GetCreature(*me, arlosGUID))
1199 arlos->RemoveFromWorld();
1200
1201 if (Creature* arthas = me->GetCreature(*me, arthasGUID))
1202 arthas->RemoveFromWorld();
1203 }
1204 };
1205
1206 bool OnGossipHello(Player* player, Creature* creature) OVERRIDE
1207 {
1208 if (creature->IsQuestGiver())
1209 player->PrepareQuestMenu(creature->GetGUID());
1210
1211 if (player->GetQuestStatus(QUEST_LAST_RITES) == QUEST_STATUS_INCOMPLETE && creature->GetAreaId() == 4128)
1213
1214 player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
1215
1216 return true;
1217 }
1218
1219 bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE
1220 {
1221 player->PlayerTalkClass->ClearMenus();
1222 switch (action)
1223 {
1225 CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
1226 CAST_AI(npc_escortAI, (creature->AI()))->SetMaxPlayerDistance(200.0f);
1227 break;
1228 }
1229 return true;
1230 }
1231
1233 {
1234 return new npc_thassarianAI(creature);
1235 }
1236};
1237
1238/*######
1239## npc_image_lich_king
1240######*/
1241
1243{
1244public:
1245 npc_image_lich_king() : CreatureScript("npc_image_lich_king") { }
1246
1248 {
1249 npc_image_lich_kingAI(Creature* creature) : ScriptedAI(creature) { }
1250
1252 {
1253 me->RestoreFaction();
1254 }
1255
1256 void MovementInform(uint32 uiType, uint32 /*uiId*/) OVERRIDE
1257 {
1258 if (uiType != POINT_MOTION_TYPE)
1259 return;
1260
1261 if (me->IsSummon())
1262 if (Unit* summoner = me->ToTempSummon()->GetSummoner())
1263 CAST_AI(npc_thassarian::npc_thassarianAI, summoner->ToCreature()->AI())->arthasInPosition = true;
1264 }
1265 };
1266
1268 {
1269 return new npc_image_lich_kingAI(creature);
1270 }
1271};
1272
1273/*######
1274## npc_general_arlos
1275######*/
1276
1278{
1279public:
1280 npc_general_arlos() : CreatureScript("npc_general_arlos") { }
1281
1283 {
1284 npc_general_arlosAI(Creature* creature) : ScriptedAI(creature) { }
1285
1286 void MovementInform(uint32 uiType, uint32 /*uiId*/) OVERRIDE
1287 {
1288 if (uiType != POINT_MOTION_TYPE)
1289 return;
1290
1291 me->AddUnitState(UNIT_STATE_STUNNED);
1292 me->CastSpell(me, SPELL_STUN, true);
1293 if (me->IsSummon())
1294 if (Unit* summoner = me->ToTempSummon()->GetSummoner())
1295 CAST_AI(npc_thassarian::npc_thassarianAI, summoner->ToCreature()->AI())->arlosInPosition = true;
1296 }
1297 };
1298
1300 {
1301 return new npc_general_arlosAI(creature);
1302 }
1303};
1304
1305/*######
1306## npc_counselor_talbot
1307######*/
1308
1314
1316{
1317public:
1318 npc_counselor_talbot() : CreatureScript("npc_counselor_talbot") { }
1319
1321 {
1323 {
1324 creature->RestoreFaction();
1325 }
1326
1329
1331
1335
1337 {
1338 leryssaGUID = 0;
1339 arlosGUID = 0;
1340 bCheck = false;
1341 shadowBoltTimer = std::rand() % 12000 + 5000;
1342 deflectionTimer = std::rand() % 25000 + 20000;
1343 soulBlastTimer = std::rand() % 18000 + 12000;
1344 }
1345 void MovementInform(uint32 uiType, uint32 /*uiId*/) OVERRIDE
1346 {
1347 if (uiType != POINT_MOTION_TYPE)
1348 return;
1349
1350 if (me->IsSummon())
1351 if (Unit* summoner = me->ToTempSummon()->GetSummoner())
1352 CAST_AI(npc_thassarian::npc_thassarianAI, summoner->ToCreature()->AI())->talbotInPosition = true;
1353 }
1354
1356 {
1357 if (bCheck)
1358 {
1359 if (Creature* leryssa = me->FindNearestCreature(NPC_LERYSSA, 50.0f, true))
1360 leryssaGUID = leryssa->GetGUID();
1361 if (Creature* arlos = me->FindNearestCreature(NPC_GENERAL_ARLOS, 50.0f, true))
1362 arlosGUID = arlos->GetGUID();
1363 bCheck = false;
1364 }
1365
1366 if (!UpdateVictim())
1367 return;
1368
1369 if (me->GetAreaId() == 4125)
1370 {
1371 if (shadowBoltTimer <= uiDiff)
1372 {
1374 shadowBoltTimer = std::rand() % 12000 + 5000;
1375 } else shadowBoltTimer -= uiDiff;
1376
1377 if (deflectionTimer <= uiDiff)
1378 {
1380 deflectionTimer = std::rand() % 25000 + 20000;
1381 } else deflectionTimer -= uiDiff;
1382
1383 if (soulBlastTimer <= uiDiff)
1384 {
1386 soulBlastTimer = std::rand() % 18000 + 12000;
1387 } else soulBlastTimer -= uiDiff;
1388 }
1389
1391 }
1392
1393 void JustDied(Unit* killer) OVERRIDE
1394 {
1395 if (!leryssaGUID || !arlosGUID)
1396 return;
1397
1400 if (!leryssa || !arlos)
1401 return;
1402
1403 arlos->AI()->Talk(SAY_ARLOS_1);
1404 arlos->AI()->Talk(SAY_ARLOS_2);
1405 leryssa->AI()->Talk(SAY_LERYSSA_1);
1406 arlos->Kill(arlos, false);
1407 leryssa->RemoveAura(SPELL_STUN);
1409 leryssa->SetWalk(false);
1410 leryssa->GetMotionMaster()->MovePoint(0, 3722.114502f, 3564.201660f, 477.441437f);
1411
1412 if (Player* player = killer->ToPlayer())
1413 player->RewardPlayerAndGroupAtEvent(NPC_PRINCE_VALANAR, 0);
1414 }
1415 };
1416
1418 {
1419 return new npc_counselor_talbotAI(creature);
1420 }
1421};
1422
1423/*######
1424## npc_leryssa
1425######*/
1426
1428{
1429public:
1430 npc_leryssa() : CreatureScript("npc_leryssa") { }
1431
1433 {
1434 npc_leryssaAI(Creature* creature) : ScriptedAI(creature)
1435 {
1436 bDone = false;
1437 phase = 0;
1438 phaseTimer = 0;
1439
1441 }
1442
1443 bool bDone;
1444
1447
1449 {
1450 if (type != POINT_MOTION_TYPE)
1451 return;
1452
1453 if (!bDone)
1454 {
1455 if (Creature* talbot = me->FindNearestCreature(NPC_PRINCE_VALANAR, 50.0f, true))
1456 CAST_AI(npc_counselor_talbot::npc_counselor_talbotAI, talbot->GetAI())->bCheck = true;
1457
1458 me->AddUnitState(UNIT_STATE_STUNNED);
1459 me->CastSpell(me, SPELL_STUN, true);
1460
1461 if (me->IsSummon())
1462 if (Unit* summoner = me->ToTempSummon()->GetSummoner())
1463 CAST_AI(npc_thassarian::npc_thassarianAI, summoner->GetAI())->leryssaInPosition = true;
1464 bDone = true;
1465 }
1466 else
1467 {
1468 me->SetStandState(UNIT_STAND_STATE_SIT);
1469 if (me->IsSummon())
1470 if (Unit* summoner = me->ToTempSummon()->GetSummoner())
1471 summoner->SetStandState(UNIT_STAND_STATE_SIT);
1472 phaseTimer = 1500;
1473 phase = 1;
1474 }
1475 }
1476
1478 {
1479 ScriptedAI::UpdateAI(uiDiff);
1480
1481 if (phaseTimer <= uiDiff)
1482 {
1483 switch (phase)
1484 {
1485 case 1:
1486 if (me->IsSummon())
1487 if (Unit* summoner = me->ToTempSummon()->GetSummoner())
1488 if (Creature* thassarian = summoner->ToCreature())
1489 thassarian->AI()->Talk(SAY_THASSARIAN_4);
1490 phaseTimer = 5000;
1491 ++phase;
1492 break;
1493 case 2:
1495 phaseTimer = 5000;
1496 ++phase;
1497 break;
1498 case 3:
1499 if (me->IsSummon())
1500 if (Unit* summoner = me->ToTempSummon()->GetSummoner())
1501 if (Creature* thassarian = summoner->ToCreature())
1502 thassarian->AI()->Talk(SAY_THASSARIAN_5);
1503 phaseTimer = 5000;
1504 ++phase;
1505 break;
1506 case 4:
1508 phaseTimer = 5000;
1509 ++phase;
1510 break;
1511 case 5:
1512 if (me->IsSummon())
1513 if (Unit* summoner = me->ToTempSummon()->GetSummoner())
1514 if (Creature* thassarian = summoner->ToCreature())
1515 thassarian->AI()->Talk(SAY_THASSARIAN_6);
1516 phaseTimer = 5000;
1517 ++phase;
1518 break;
1519
1520 case 6:
1522 phaseTimer = 5000;
1523 ++phase;
1524 break;
1525 case 7:
1526 if (me->IsSummon())
1527 if (Unit* summoner = me->ToTempSummon()->GetSummoner())
1528 if (Creature* thassarian = summoner->ToCreature())
1529 {
1530 thassarian->AI()->Talk(SAY_THASSARIAN_7);
1531 CAST_AI(npc_thassarian::npc_thassarianAI, thassarian->GetAI())->phase = 16;
1532 }
1533 phaseTimer = 5000;
1534 phase = 0;
1535 break;
1536 }
1537 } else phaseTimer -= uiDiff;
1538
1539 if (!UpdateVictim())
1540 return;
1541
1543 }
1544 };
1545
1547 {
1548 return new npc_leryssaAI(creature);
1549 }
1550};
1551
1552/*######
1553## npc_beryl_sorcerer
1554######*/
1555
1565
1567{
1568public:
1569 npc_beryl_sorcerer() : CreatureScript("npc_beryl_sorcerer") { }
1570
1572 {
1573 npc_beryl_sorcererAI(Creature* creature) : FollowerAI(creature) { }
1574
1576
1578 {
1579 me->SetReactState(REACT_AGGRESSIVE);
1580 bEnslaved = false;
1581 }
1582
1584 {
1585 if (me->IsValidAttackTarget(who))
1586 AttackStart(who);
1587 }
1588
1589 void SpellHit(Unit* pCaster, const SpellInfo* pSpell) OVERRIDE
1590 {
1591 if (pSpell->Id == SPELL_ARCANE_CHAINS && pCaster->GetTypeId() == TypeID::TYPEID_PLAYER && !HealthAbovePct(50) && !bEnslaved)
1592 {
1593 EnterEvadeMode(); //We make sure that the npc is not attacking the player!
1594 me->SetReactState(REACT_PASSIVE);
1595 StartFollow(pCaster->ToPlayer(), 0, NULL);
1598
1599 if (Player* player = pCaster->ToPlayer())
1600 player->KilledMonsterCredit(NPC_CAPTURED_BERLY_SORCERER, 0);
1601
1602 bEnslaved = true;
1603 }
1604 }
1605
1607
1608 {
1610
1611 if (who->GetEntry() == NPC_LIBRARIAN_DONATHAN && me->IsWithinDistInMap(who, INTERACTION_DISTANCE))
1612 {
1614 me->DisappearAndDie();
1615 }
1616 }
1617
1618 void UpdateAI(uint32 /*uiDiff*/) OVERRIDE
1619 {
1620 if (!UpdateVictim())
1621 return;
1622
1624 }
1625 };
1626
1628 {
1629 return new npc_beryl_sorcererAI(creature);
1630 }
1631};
1632
1633/*######
1634## npc_imprisoned_beryl_sorcerer
1635######*/
1650
1652{
1653public:
1654 npc_imprisoned_beryl_sorcerer() : CreatureScript("npc_imprisoned_beryl_sorcerer") { }
1655
1657 {
1659
1661
1663 {
1664 if (me->GetReactState() != REACT_PASSIVE)
1665 me->SetReactState(REACT_PASSIVE);
1666
1667 rebuff = 0;
1668 }
1669
1671 {
1672 UpdateVictim();
1673
1674 if (rebuff <= diff)
1675 {
1677 {
1679 }
1680 rebuff = 180000;
1681 }
1682 else
1683 rebuff -= diff;
1684
1686 }
1687
1689 {
1690 }
1691
1692 void SpellHit(Unit* unit, const SpellInfo* spell) OVERRIDE
1693 {
1694 if (spell->Id == SPELL_NEURAL_NEEDLE && unit->GetTypeId() == TypeID::TYPEID_PLAYER)
1695 {
1696 if (Player* player = unit->ToPlayer())
1697 {
1698 GotStinged(player->GetGUID());
1699 }
1700 }
1701 }
1702
1703 void GotStinged(uint64 casterGUID)
1704 {
1705 if (Player* caster = ObjectAccessor::GetPlayer(*me, casterGUID))
1706 {
1707 uint32 step = caster->GetAuraCount(SPELL_NEURAL_NEEDLE) + 1;
1708 switch (step)
1709 {
1710 case 1:
1712 break;
1713 case 2:
1715 break;
1716 case 3:
1718 break;
1719 case 4:
1721 break;
1722 case 5:
1724 break;
1725 case 6:
1727 break;
1728 case 7:
1730 caster->KilledMonsterCredit(NPC_IMPRISONED_BERYL_SORCERER, 0);
1731 break;
1732 }
1733 }
1734 }
1735 };
1736
1738 {
1739 return new npc_imprisoned_beryl_sorcererAI(creature);
1740 }
1741};
1742
1743/*######
1744## npc_mootoo_the_younger
1745######*/
1757
1759{
1760public:
1761 npc_mootoo_the_younger() : CreatureScript("npc_mootoo_the_younger") { }
1762
1763 bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) OVERRIDE
1764 {
1765 if (quest->GetQuestId() == QUEST_ESCAPING_THE_MIST)
1766 {
1767 switch (player->GetTeam())
1768 {
1769 case ALLIANCE:
1770 creature->setFaction(FACTION_ESCORTEE_A);
1771 break;
1772 case HORDE:
1773 creature->setFaction(FACTION_ESCORTEE_H);
1774 break;
1775 }
1776 creature->SetStandState(UNIT_STAND_STATE_STAND);
1777 creature->AI()->Talk(SAY_1);
1778 CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
1779 }
1780 return true;
1781 }
1782
1784 {
1786
1788 {
1789 SetDespawnAtFar(false);
1790 }
1791
1792 void JustDied(Unit* /*killer*/) OVERRIDE
1793 {
1794 if (Player* player=GetPlayerForEscort())
1795 player->FailQuest(QUEST_ESCAPING_THE_MIST);
1796 }
1797
1799 {
1800 Player* player = GetPlayerForEscort();
1801 if (!player)
1802 return;
1803
1804 switch (waypointId)
1805 {
1806 case 10:
1807 me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
1808 Talk(SAY_2);
1809 break;
1810 case 12:
1811 Talk(SAY_3);
1812 me->HandleEmoteCommand(EMOTE_ONESHOT_LOOT);
1813 break;
1814 case 16:
1815 Talk(SAY_4);
1816 me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
1817 break;
1818 case 20:
1819 me->SetPhaseMask(1, true);
1820 Talk(SAY_5);
1821 me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
1823 SetRun(true);
1824 break;
1825 }
1826 }
1827 };
1828
1830 {
1831 return new npc_mootoo_the_youngerAI(creature);
1832 }
1833};
1834
1835/*######
1836## npc_bonker_togglevolt
1837######*/
1838
1847
1849{
1850public:
1851 npc_bonker_togglevolt() : CreatureScript("npc_bonker_togglevolt") { }
1852
1853 bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) OVERRIDE
1854 {
1855 if (quest->GetQuestId() == QUEST_GET_ME_OUTA_HERE)
1856 {
1857 creature->SetStandState(UNIT_STAND_STATE_STAND);
1858 creature->AI()->Talk(SAY_BONKER_2, player);
1859 CAST_AI(npc_escortAI, (creature->AI()))->Start(true, true, player->GetGUID());
1860 }
1861 return true;
1862 }
1863
1865 {
1867 {
1868 Bonker_agro = 0;
1869 }
1870
1872 {
1873 Bonker_agro=0;
1874 SetDespawnAtFar(false);
1875 }
1876
1877 void JustDied(Unit* /*killer*/) OVERRIDE
1878 {
1879 if (Player* player = GetPlayerForEscort())
1880 player->FailQuest(QUEST_GET_ME_OUTA_HERE);
1881 }
1882
1883 void UpdateEscortAI(const uint32 /*diff*/) OVERRIDE
1884 {
1885 if (GetAttack() && UpdateVictim())
1886 {
1887 if (Bonker_agro == 0)
1888 {
1890 Bonker_agro++;
1891 }
1893 }
1894 else Bonker_agro=0;
1895 }
1896
1898 {
1899 Player* player = GetPlayerForEscort();
1900 if (!player)
1901 return;
1902
1903 switch (waypointId)
1904 {
1905 case 29:
1907 break;
1908 }
1909 }
1910
1911 private:
1913 };
1914
1916 {
1917 return new npc_bonker_togglevoltAI(creature);
1918 }
1919};
1920
1921/*######
1922## Help Those That Cannot Help Themselves, Quest 11876
1923######*/
1924
1951
1952#define MammothTrapsNum 22
1961
1963{
1964public:
1965 npc_trapped_mammoth_calf() : CreatureScript("npc_trapped_mammoth_calf") { }
1966
1968 {
1970
1973
1975 {
1976 uiTimer = 1500;
1977 bStarted = false;
1978
1979 GameObject* pTrap = NULL;
1980 for (uint8 i = 0; i < MammothTrapsNum; ++i)
1981 {
1982 pTrap = me->FindNearestGameObject(MammothTraps[i], 11.0f);
1983 if (pTrap)
1984 {
1986 return;
1987 }
1988 }
1989 }
1990
1992 {
1993 if (bStarted)
1994 {
1995 if (uiTimer <= diff)
1996 {
1997 Position pos;
1998 me->GetRandomNearPosition(pos, 10.0f);
1999 me->GetMotionMaster()->MovePoint(0, pos);
2000 bStarted = false;
2001 }
2002 else uiTimer -= diff;
2003 }
2004 }
2005
2007 {
2008 if (param == 1)
2009 bStarted = true;
2010 }
2011
2012 void MovementInform(uint32 uiType, uint32 /*uiId*/) OVERRIDE
2013 {
2014 if (uiType != POINT_MOTION_TYPE)
2015 return;
2016
2017 me->DisappearAndDie();
2018
2019 GameObject* pTrap = NULL;
2020 for (uint8 i = 0; i < MammothTrapsNum; ++i)
2021 {
2022 pTrap = me->FindNearestGameObject(MammothTraps[i], 11.0f);
2023 if (pTrap)
2024 {
2026 return;
2027 }
2028 }
2029 }
2030 };
2031
2033 {
2034 return new npc_trapped_mammoth_calfAI(creature);
2035 }
2036};
2037
2038/*######
2039## Quest 11653: Hah... You're Not So Big Now!
2040######*/
2041
2050
2052{
2053public:
2054 npc_magmoth_crusher() : CreatureScript("npc_magmoth_crusher") { }
2055
2057 {
2058 npc_magmoth_crusherAI(Creature* creature) : ScriptedAI(creature) { }
2059
2060 void JustDied(Unit* killer) OVERRIDE
2061 {
2062 Player* player = killer->ToPlayer();
2063 if (!player)
2064 return;
2065
2067 (me->HasAura(SPELL_AURA_NOTSOBIG_1) || me->HasAura(SPELL_AURA_NOTSOBIG_2) ||
2068 me->HasAura(SPELL_AURA_NOTSOBIG_3) || me->HasAura(SPELL_AURA_NOTSOBIG_4)))
2069 {
2070 Quest const* qInfo = sObjectMgr->GetQuestTemplate(QUEST_YOU_RE_NOT_SO_BIG_NOW);
2071 if (qInfo)
2073 }
2074 }
2075 };
2076
2078 {
2079 return new npc_magmoth_crusherAI(creature);
2080 }
2081};
2082
2083/*######
2084## Quest 11608: Bury Those Cockroaches!
2085######*/
2086
2088{
2089 // Quest
2091
2092 // Spells
2094};
2095
2097{
2098public:
2099 npc_seaforium_depth_charge() : CreatureScript("npc_seaforium_depth_charge") { }
2100
2102 {
2104
2106
2108 {
2109 uiExplosionTimer = std::rand() % 10000 + 5000;
2110 }
2111
2113 {
2114 if (uiExplosionTimer < diff)
2115 {
2117 for (uint8 i = 0; i < 4; ++i)
2118 {
2119 if (Creature* cCredit = me->FindNearestCreature(25402 + i, 10.0f))//25402-25405 credit markers
2120 {
2121 if (Unit* uOwner = me->GetOwner())
2122 {
2123 Player* owner = uOwner->ToPlayer();
2125 owner->KilledMonsterCredit(cCredit->GetEntry(), cCredit->GetGUID());
2126 }
2127 }
2128 }
2129 me->Kill(me);
2130 return;
2131 } else uiExplosionTimer -= diff;
2132 }
2133 };
2134
2136 {
2137 return new npc_seaforium_depth_chargeAI(creature);
2138 }
2139};
2140
2141/*######
2142## Help Those That Cannot Help Themselves, Quest 11876
2143######*/
2144
2150
2152{
2153public:
2154 npc_valiance_keep_cannoneer() : CreatureScript("npc_valiance_keep_cannoneer") { }
2155
2157 {
2159 {
2160 uiTimer = 0;
2161 }
2162
2164 {
2165 uiTimer = std::rand() % 18000 + 13000;
2166 }
2167
2169 {
2170 if (uiTimer <= diff)
2171 {
2172 me->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL);
2173 GameObject* pCannon = me->FindNearestGameObject(GO_VALIANCE_KEEP_CANNON_1, 10);
2174 if (!pCannon)
2175 pCannon = me->FindNearestGameObject(GO_VALIANCE_KEEP_CANNON_2, 10);
2176 if (pCannon)
2177 pCannon->Use(me);
2178 uiTimer = std::rand() % 18000 + 13000;
2179 }
2180 else uiTimer -= diff;
2181
2182 if (!UpdateVictim())
2183 return;
2184 }
2185 private:
2187 };
2188
2190 {
2191 return new npc_valiance_keep_cannoneerAI(creature);
2192 }
2193};
2194
2195/*******************************************************
2196 * npc_warmage_coldarra
2197 *******************************************************/
2198
2203
2211
2213{
2214public:
2215 npc_warmage_coldarra() : CreatureScript("npc_warmage_coldarra") { }
2216
2218 {
2219 npc_warmage_coldarraAI(Creature* creature) : ScriptedAI(creature) { }
2220
2221 uint32 m_uiTimer; //Timer until recast
2222
2224 {
2225 m_uiTimer = 0;
2226 }
2227
2228 void EnterCombat(Unit* /*who*/) OVERRIDE { }
2229
2230 void AttackStart(Unit* /*who*/) OVERRIDE { }
2231
2233 {
2234 if (m_uiTimer <= uiDiff)
2235 {
2236 std::list<Creature*> orbList;
2238
2239 switch (me->GetEntry())
2240 {
2242 {
2243 if (!orbList.empty())
2244 {
2245 for (std::list<Creature*>::const_iterator itr = orbList.begin(); itr != orbList.end(); ++itr)
2246 {
2247 if (Creature* pOrb = *itr)
2248 if (pOrb->GetPositionY() > 6680)
2250 }
2251 }
2252 m_uiTimer = std::rand() % 120000 + 90000;
2253 }
2254 break;
2256 {
2257 if (!orbList.empty())
2258 {
2259 for (std::list<Creature*>::const_iterator itr = orbList.begin(); itr != orbList.end(); ++itr)
2260 {
2261 if (Creature* pOrb = *itr)
2262 if ((pOrb->GetPositionY() < 6680) && (pOrb->GetPositionY() > 6630))
2264 }
2265 }
2266 m_uiTimer = std::rand() % 120000 + 90000;
2267 }
2268 break;
2270 {
2271 if (!orbList.empty())
2272 {
2273 for (std::list<Creature*>::const_iterator itr = orbList.begin(); itr != orbList.end(); ++itr)
2274 {
2275 if (Creature* pOrb = *itr)
2276 if (pOrb->GetPositionY() < 6630)
2278 }
2279 }
2280 m_uiTimer = std::rand() % 120000 + 90000;
2281 }
2282 break;
2283 }
2284 }
2285 else m_uiTimer -= uiDiff;
2286
2287 ScriptedAI::UpdateAI(uiDiff);
2288
2289 if (!UpdateVictim())
2290 return;
2291 }
2292 };
2293
2295 {
2296 return new npc_warmage_coldarraAI(creature);
2297 }
2298};
2299
2300/*######
2301## npc_hidden_cultist
2302######*/
2303
2324
2325const char* GOSSIP_ITEM_TOM_HEGGER = "What do you know about the Cult of the Damned?";
2326const char* GOSSIP_ITEM_GUARD_MITCHELLS = "How long have you worked for the Cult of the Damned?";
2327const char* GOSSIP_ITEM_SALTY_JOHN_THORPE = "I have a reason to believe you're involved in the cultist activity";
2328
2330{
2331public:
2332 npc_hidden_cultist() : CreatureScript("npc_hidden_cultist") { }
2333
2335 {
2341
2344
2347
2349
2351 {
2352 if (uiEmoteState)
2353 me->SetUInt32Value(UNIT_FIELD_NPC_EMOTESTATE, uiEmoteState);
2354
2355 if (uiNpcFlags)
2356 me->SetUInt32Value(UNIT_FIELD_NPC_FLAGS, uiNpcFlags);
2357
2358 uiEventTimer = 0;
2359 uiEventPhase = 0;
2360
2361 uiPlayerGUID = 0;
2362
2364
2365 me->RestoreFaction();
2366 }
2367
2368 void DoAction(int32 /*iParam*/) OVERRIDE
2369 {
2370 me->StopMoving();
2371 me->SetUInt32Value(UNIT_FIELD_NPC_FLAGS, 0);
2373 me->SetFacingToObject(player);
2374 uiEventTimer = 3000;
2375 uiEventPhase = 1;
2376 }
2377
2378 void SetGUID(uint64 uiGuid, int32 /*iId*/) OVERRIDE
2379 {
2380 uiPlayerGUID = uiGuid;
2381 }
2382
2384 {
2385 me->setFaction(14);
2387 me->AI()->AttackStart(player);
2388 }
2389
2391 {
2392 if (uiEventTimer && uiEventTimer <= uiDiff)
2393 {
2394 switch (uiEventPhase)
2395 {
2396 case 1:
2397 switch (me->GetEntry())
2398 {
2400 me->SetUInt32Value(UNIT_FIELD_NPC_EMOTESTATE, 0);
2402 uiEventTimer = 5000;
2403 uiEventPhase = 2;
2404 break;
2407 uiEventTimer = 5000;
2408 uiEventPhase = 2;
2409 break;
2410 case NPC_TOM_HEGGER:
2412 uiEventTimer = 5000;
2413 uiEventPhase = 2;
2414 break;
2415 }
2416 break;
2417 case 2:
2418 switch (me->GetEntry())
2419 {
2423 me->SetFacingToObject(player);
2424 uiEventTimer = 3000;
2425 uiEventPhase = 3;
2426 break;
2428 case NPC_TOM_HEGGER:
2429 AttackPlayer();
2430 uiEventPhase = 0;
2431 break;
2432 }
2433 break;
2434 case 3:
2435 if (me->GetEntry() == NPC_SALTY_JOHN_THORPE)
2436 {
2437 AttackPlayer();
2438 uiEventPhase = 0;
2439 }
2440 break;
2441 }
2442 }else uiEventTimer -= uiDiff;
2443
2444 if (!UpdateVictim())
2445 return;
2446
2448 }
2449 };
2450
2452 {
2453 return new npc_hidden_cultistAI(creature);
2454 }
2455
2456 bool OnGossipHello(Player* player, Creature* creature) OVERRIDE
2457 {
2458 uint32 uiGossipText = 0;
2459 const char* charGossipItem;
2460
2461 switch (creature->GetEntry())
2462 {
2463 case NPC_TOM_HEGGER:
2464 uiGossipText = GOSSIP_TEXT_TOM_HEGGER;
2465 charGossipItem = GOSSIP_ITEM_TOM_HEGGER;
2466 break;
2468 uiGossipText = GOSSIP_TEXT_SALTY_JOHN_THORPE;
2469 charGossipItem = GOSSIP_ITEM_SALTY_JOHN_THORPE;
2470 break;
2472 uiGossipText = GOSSIP_TEXT_GUARD_MITCHELSS;
2473 charGossipItem = GOSSIP_ITEM_GUARD_MITCHELLS;
2474 break;
2475 default:
2476 charGossipItem = "";
2477 return false;
2478 }
2479
2480 if (player->HasAura(SPELL_RIGHTEOUS_VISION) && player->GetQuestStatus(QUEST_THE_HUNT_IS_ON) == QUEST_STATUS_INCOMPLETE)
2481 player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, charGossipItem, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
2482
2483 if (creature->IsVendor())
2485
2486 player->SEND_GOSSIP_MENU(uiGossipText, creature->GetGUID());
2487
2488 return true;
2489 }
2490
2491 bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE
2492 {
2493 player->PlayerTalkClass->ClearMenus();
2494
2495 if (action == GOSSIP_ACTION_INFO_DEF+1)
2496 {
2497 player->CLOSE_GOSSIP_MENU();
2498 creature->AI()->SetGUID(player->GetGUID());
2499 creature->AI()->DoAction(1);
2500 }
2501
2502 if (action == GOSSIP_ACTION_TRADE)
2503 player->GetSession()->SendListInventory(creature->GetGUID());
2504
2505 return true;
2506 }
2507};
2508
2510{
2513 new npc_keristrasza();
2514 new npc_corastrasza();
2515 new npc_iruk();
2516 new npc_nerubar_victim();
2517 new npc_jenny();
2520 new npc_lurgglbr();
2522 new npc_thassarian();
2523 new npc_image_lich_king();
2525 new npc_leryssa();
2526 new npc_general_arlos();
2527 new npc_beryl_sorcerer();
2532 new npc_magmoth_crusher();
2536 new npc_hidden_cultist();
2537}
std::int32_t int32
Definition Define.h:73
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
std::uint64_t uint64
Definition Define.h:76
@ GO_JUST_DEACTIVATED
Definition GameObject.h:619
@ GO_STATE_ACTIVE
Definition GameObject.h:576
@ GO_STATE_READY
Definition GameObject.h:577
@ GOSSIP_ICON_CHAT
Definition GossipDef.h:46
@ GOSSIP_ICON_VENDOR
Definition GossipDef.h:47
@ POINT_MOTION_TYPE
@ TYPEID_PLAYER
Definition Object.h:55
@ TYPEID_UNIT
Definition Object.h:54
@ TEMPSUMMON_CORPSE_TIMED_DESPAWN
Definition Object.h:73
#define INTERACTION_DISTANCE
Definition Object.h:21
#define sObjectMgr
Definition ObjectMgr.h:1617
@ QUEST_STATUS_INCOMPLETE
Definition QuestDef.h:89
@ FACTION_ESCORT_A_NEUTRAL_ACTIVE
@ FACTION_ESCORT_H_NEUTRAL_ACTIVE
void GetCreatureListWithEntryInGrid(std::list< Creature * > &list, WorldObject *source, uint32 entry, float maxSearchRange)
#define CAST_AI(a, b)
@ STATE_ESCORT_ESCORTING
#define GOSSIP_TEXT_BROWSE_GOODS
@ GOSSIP_SENDER_MAIN
@ GOSSIP_ACTION_TRADE
@ GOSSIP_ACTION_INFO_DEF
@ GAMEOBJECT_TYPE_BUTTON
@ EMOTE_ONESHOT_LOOT
@ EMOTE_ONESHOT_KNEEL
@ EMOTE_ONESHOT_EXCLAMATION
@ EMOTE_ONESHOT_EMERGE
@ EMOTE_ONESHOT_NONE
@ UNIT_DYNFLAG_LOOTABLE
@ TEAM_NEUTRAL
@ TEAM_ALLIANCE
@ TEAM_HORDE
@ ALLIANCE
@ HORDE
@ UNIT_NPC_FLAG_QUESTGIVER
Definition Unit.h:688
@ UNIT_STAND_STATE_KNEEL
Definition Unit.h:170
@ UNIT_STAND_STATE_STAND
Definition Unit.h:162
@ UNIT_STAND_STATE_SIT
Definition Unit.h:163
@ UNIT_STATE_STUNNED
Definition Unit.h:515
@ REACT_PASSIVE
Definition Unit.h:1156
@ REACT_AGGRESSIVE
Definition Unit.h:1158
@ UNIT_FLAG_NON_ATTACKABLE
Definition Unit.h:626
@ UNIT_FLAG_NOT_SELECTABLE
Definition Unit.h:650
@ UNIT_FIELD_NPC_FLAGS
@ UNIT_FIELD_FLAGS
@ UNIT_FIELD_NPC_EMOTESTATE
@ OBJECT_FIELD_DYNAMIC_FLAGS
@ GAMEOBJECT_FIELD_FACTION_TEMPLATE
@ SPELL_SHADOW_BOLT
@ SPELL_STUN
@ SPELL_SUMMON_CART
Definition chapter1.cpp:847
virtual void MoveInLineOfSight(Unit *)
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
virtual void EnterEvadeMode()
bool UpdateEntry(uint32 entry, uint32 team=ALLIANCE, const CreatureData *data=NULL)
Definition Creature.cpp:356
void SetReactState(ReactStates st)
Definition Creature.h:460
CreatureAI * AI() const
Definition Creature.h:483
void RemoveFromWorld() OVERRIDE
Definition Creature.cpp:193
CreatureScript(const char *name)
void MoveInLineOfSight(Unit *) OVERRIDE
void EnterEvadeMode() OVERRIDE
void AttackStart(Unit *) OVERRIDE
void SetFollowComplete(bool bWithEndEvent=false)
FollowerAI(Creature *creature)
void StartFollow(Player *player, uint32 factionForFollower=0, const Quest *quest=NULL)
void SetGoState(GOState state)
void SetLootState(LootState s, Unit *unit=NULL)
void Use(Unit *user)
void MovePoint(uint32 id, Position const &pos, bool generatePath=true)
static Player * GetPlayer(WorldObject const &, uint64 guid)
uint64 GetGUID() const
Definition Object.h:119
uint32 GetUInt32Value(uint16 index) const
Definition Object.cpp:325
Player * ToPlayer()
Definition Object.h:204
void SetFlag(uint16 index, uint32 newFlag)
Definition Object.cpp:1261
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition Object.cpp:1280
Creature * ToCreature()
Definition Object.h:207
void KilledMonsterCredit(uint32 entry, uint64 guid=0)
void GroupEventHappens(uint32 questId, WorldObject const *pEventObject)
QuestStatus GetQuestStatus(uint32 quest_id) const
QuestObjective const * GetQuestObjectiveXIndex(uint8 index) const
Definition QuestDef.cpp:302
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:28
void DoCast(uint32 spellId)
Definition UnitAI.cpp:110
void DoCastVictim(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:168
Definition Unit.h:1367
void ClearUnitState(uint32 f)
Definition Unit.h:1489
void SetVisible(bool x)
Definition Unit.cpp:4163
void setFaction(uint32 faction)
Definition Unit.h:1699
void Kill(Unit *victim, bool durabilityLoss=true)
Definition Unit.cpp:6342
Unit * GetOwner() const
Definition Unit.cpp:2339
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
void RestoreFaction()
Definition Unit.cpp:7135
void CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, uint64 originalCaster=0)
MotionMaster * GetMotionMaster()
Definition Unit.h:2605
static Creature * GetCreature(WorldObject &object, uint64 guid)
Definition Unit.cpp:4905
void RemoveStandFlags(uint8 flags)
Definition Unit.h:1737
bool SetWalk(bool enable)
Definition Unit.cpp:9137
void SetInFront(WorldObject const *target)
Definition Unit.cpp:9108
void SetStandState(uint8 state)
Definition Unit.cpp:5902
GameObject * FindNearestGameObject(uint32 entry, float range) const
Definition Object.cpp:2810
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
bool OnQuestAccept(Player *player, Creature *creature, Quest const *quest) OVERRIDE
bool OnGossipHello(Player *player, Creature *creature) OVERRIDE
bool OnGossipSelect(Player *player, Creature *, uint32, uint32 action) OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
bool OnGossipHello(Player *player, Creature *creature) OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
bool OnGossipSelect(Player *player, Creature *creature, uint32, uint32 action) OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
bool OnGossipSelect(Player *player, Creature *, uint32, uint32 action) OVERRIDE
bool OnGossipHello(Player *player, Creature *creature) OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
bool OnGossipHello(Player *player, Creature *creature) OVERRIDE
bool OnGossipSelect(Player *player, Creature *, uint32, uint32 action) OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
bool OnQuestAccept(Player *player, Creature *creature, Quest const *quest) OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
bool OnQuestAccept(Player *player, Creature *creature, Quest const *quest) OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
bool OnGossipHello(Player *player, Creature *creature) OVERRIDE
bool OnGossipSelect(Player *player, Creature *creature, uint32, uint32 action) OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
@ NPC_PRINCE_VALANAR
#define SAY_1
#define SAY_2
uint32 ObjectId
Definition QuestDef.h:242
Creature * me
bool HealthAbovePct(uint32 pct) const
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
ScriptedAI(Creature *creature)
void SpellHit(Unit *pCaster, const SpellInfo *pSpell) OVERRIDE
void UpdateAI(uint32) OVERRIDE
== Triggered Actions Requested ==================
void MovementInform(uint32 uiType, uint32) OVERRIDE
void UpdateAI(uint32 uiDiff) OVERRIDE
== Triggered Actions Requested ==================
bool GetAttack() const
void SetDespawnAtFar(bool despawn)
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
Player * GetPlayerForEscort()
void SetRun(bool on=true)
bool HasEscortState(uint32 escortState) const
npc_escortAI(Creature *creature)
void SetEscortPaused(bool on)
void AttackStart(Unit *who) OVERRIDE
void MovementInform(uint32 uiType, uint32) OVERRIDE
void UpdateAI(uint32 uiDiff) OVERRIDE
== Triggered Actions Requested ==================
void SetGUID(uint64 uiGuid, int32) OVERRIDE
void MovementInform(uint32 uiType, uint32) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void SpellHit(Unit *unit, const SpellInfo *spell) OVERRIDE
void UpdateAI(uint32) OVERRIDE
== Triggered Actions Requested ==================
npc_jennyAI(Creature *creature)
void DamageTaken(Unit *, uint32 &) OVERRIDE
void UpdateAI(uint32 uiDiff) OVERRIDE
== Triggered Actions Requested ==================
void MovementInform(uint32 type, uint32) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void WaypointReached(uint32 waypointId) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void SpellHit(Unit *caster, const SpellInfo *spell) OVERRIDE
void UpdateAI(uint32) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void SpellHit(Unit *caster, const SpellInfo *spell) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 uiDiff) OVERRIDE
== Triggered Actions Requested ==================
void WaypointReached(uint32 waypointId) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 uiDiff) OVERRIDE
== Triggered Actions Requested ==================
@ SPELL_SEAFORIUM_DEPTH_CHARGE_EXPLOSION
@ QUEST_BURY_THOSE_COCKROACHES
@ GO_VALIANCE_KEEP_CANNON_2
@ GO_VALIANCE_KEEP_CANNON_1
@ NPC_FEZZIX_GEARTWIST
@ SPELL_GIVE_JENNY_CREDIT
@ QUEST_LOADER_UP
@ SPELL_DROP_CRATE
@ SPELL_CRATES_CARRIED
@ SAY_THASSARIAN_3
@ SAY_LERYSSA_4
@ SAY_THASSARIAN_4
@ NPC_PRINCE_VALANAR
@ NPC_IMAGE_LICH_KING
@ NPC_COUNSELOR_TALBOT
@ NPC_GENERAL_ARLOS
@ SAY_LERYSSA_2
@ SPELL_SHADOW_BOLT
@ SPELL_TRANSFORM_VALANAR
@ SAY_THASSARIAN_7
@ SAY_THASSARIAN_1
@ SAY_LERYSSA_1
@ SAY_THASSARIAN_6
@ SAY_LERYSSA_3
@ SAY_THASSARIAN_5
@ SAY_THASSARIAN_2
@ QUEST_LAST_RITES
#define CaribouTrapsNum
@ SPELL_WYRMREST_SKYTALON_RIDE_PERIODIC
@ SPELL_SUMMON_WYRMREST_SKYTALON
@ QUEST_ACES_HIGH_DAILY
@ QUEST_ACES_HIGH
@ SPELL_TELEPORT_TO_SARAGOSA
const char * GOSSIP_ITEM_TOM_HEGGER
NexusDrakeHatchling
@ SPELL_DRAKE_HARPOON
@ QUEST_DRAKE_HUNT
@ QUEST_DRAKE_HUNT_D
@ SPELL_DRAKE_HATCHLING_SUBDUED
@ SPELL_SUBDUED
@ SPELL_RED_DRAGONBLOOD
@ NPC_RAELORASZ
@ FACTION_ESCORTEE_A
@ FACTION_ESCORTEE_H
@ QUEST_ESCAPE_WINTERFIN_CAVERNS
@ QUEST_SPIRITS_WATCH_OVER_US
@ GOSSIP_TEXT_I
@ SPELL_CREATURE_TOTEM_OF_ISSLIRUK
const uint32 nerubarVictims[3]
@ SPELL_TRANSITUS_SHIELD_BEAM
const char * GOSSIP_ITEM_SALTY_JOHN_THORPE
#define GOSSIP_ITEM_T
@ QUEST_GET_ME_OUTA_HERE
@ NPC_BONKER_TOGGLEVOLT
const uint32 CaribouTraps[CaribouTrapsNum]
@ NPC_TRANSITUS_SHIELD_DUMMY
@ NPC_WARMAGE_HOLLISTER
@ NPC_WARMAGE_CALANDRA
@ NPC_WARMAGE_WATKINS
ImprisionedBerylSorcerer
@ SAY_IMPRISIONED_BERYL_6
@ SAY_IMPRISIONED_BERYL_7
@ SAY_IMPRISIONED_BERYL_1
@ NPC_IMPRISONED_BERYL_SORCERER
@ SAY_IMPRISIONED_BERYL_3
@ SPELL_NEURAL_NEEDLE
@ SAY_IMPRISIONED_BERYL_5
@ SAY_IMPRISIONED_BERYL_4
@ SAY_IMPRISIONED_BERYL_2
@ GO_MAMMOTH_TRAP_12
@ GO_MAMMOTH_TRAP_17
@ GO_MAMMOTH_TRAP_7
@ GO_MAMMOTH_TRAP_13
@ GO_MAMMOTH_TRAP_2
@ GO_MAMMOTH_TRAP_4
@ GO_MAMMOTH_TRAP_6
@ GO_MAMMOTH_TRAP_21
@ GO_MAMMOTH_TRAP_1
@ GO_MAMMOTH_TRAP_20
@ GO_MAMMOTH_TRAP_19
@ GO_MAMMOTH_TRAP_3
@ GO_MAMMOTH_TRAP_14
@ GO_MAMMOTH_TRAP_5
@ GO_MAMMOTH_TRAP_16
@ GO_MAMMOTH_TRAP_15
@ GO_MAMMOTH_TRAP_18
@ GO_MAMMOTH_TRAP_10
@ QUEST_CANNOT_HELP_THEMSELVES
@ GO_MAMMOTH_TRAP_11
@ GO_MAMMOTH_TRAP_9
@ GO_MAMMOTH_TRAP_8
@ GO_MAMMOTH_TRAP_22
#define GOSSIP_ITEM_I
const char * GOSSIP_ITEM_GUARD_MITCHELLS
#define GOSSIP_HELLO_KERI
@ SPELL_RIGHTEOUS_VISION
@ SPELL_SHROUD_OF_THE_DEATH_CULTIST
@ 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
@ SPELL_DEFLECTION
@ SPELL_SOUL_BLAST
@ QUEST_ESCAPING_THE_MIST
@ NPC_MOOTOO_THE_YOUNGER
@ NPC_CAPTURED_BERLY_SORCERER
@ SPELL_ARCANE_CHAINS
@ SPELL_COSMETIC_ENSLAVE_CHAINS_SELF
@ NPC_LIBRARIAN_DONATHAN
@ SPELL_COSMETIC_CHAINS
@ GO_CARIBOU_TRAP_6
@ GO_CARIBOU_TRAP_12
@ GO_CARIBOU_TRAP_4
@ GO_CARIBOU_TRAP_5
@ GO_CARIBOU_TRAP_2
@ GO_CARIBOU_TRAP_11
@ GO_CARIBOU_TRAP_10
@ GO_CARIBOU_TRAP_13
@ GO_CARIBOU_TRAP_15
@ GO_HIGH_QUALITY_FUR
@ GO_CARIBOU_TRAP_9
@ SPELL_TRAPPED
@ GO_CARIBOU_TRAP_8
@ GO_CARIBOU_TRAP_3
@ GO_CARIBOU_TRAP_14
@ GO_CARIBOU_TRAP_1
@ GO_CARIBOU_TRAP_7
@ SPELL_SUMMON_WORM
@ SPELL_SUMMON_CART
@ SPELL_SET_CART
@ SPELL_EXPLODE_CART
void AddSC_borean_tundra()
#define GOSSIP_ITEM_C_1
#define MammothTrapsNum
@ SPELL_AURA_NOTSOBIG_2
@ QUEST_YOU_RE_NOT_SO_BIG_NOW
@ SPELL_AURA_NOTSOBIG_3
@ SPELL_AURA_NOTSOBIG_4
@ SPELL_AURA_NOTSOBIG_1
const uint32 MammothTraps[MammothTrapsNum]
#define WARSONG_PEON
@ GO_CAGE
@ FACTION_ESCORTEE_A
@ FACTION_ESCORTEE_H