TrinityCore
zone_exiles_reach.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 "AreaTrigger.h"
19#include "AreaTriggerAI.h"
20#include "Conversation.h"
21#include "CreatureAIImpl.h"
22#include "Map.h"
23#include "Object.h"
24#include "Player.h"
25#include "CellImpl.h"
26#include "Containers.h"
27#include "GridNotifiers.h"
28#include "GridNotifiersImpl.h"
29#include "MotionMaster.h"
30#include "ObjectAccessor.h"
31#include "ObjectMgr.h"
32#include "PassiveAI.h"
33#include "ScriptedCreature.h"
34#include "ScriptMgr.h"
35#include "ScriptSystem.h"
36#include "SpellAuras.h"
37#include "SpellInfo.h"
38#include "SpellScript.h"
39#include "TemporarySummon.h"
40#include "Transport.h"
41#include "Loot.h"
42#include "SpellHistory.h"
43#include "WorldStateMgr.h"
44#include "Unit.h"
45#include "Vehicle.h"
46#include "WorldSession.h"
47#include "CombatAI.h"
48#include "PhasingHandler.h"
49
50template<class privateAI, class publicAI>
52{
53 if (creature->IsPrivateObject())
54 return new privateAI(creature);
55 return new publicAI(creature);
56}
57
58#define RegisterPrivatePublicCreatureAIPair(scriptName, privateAI, publicAI) new FactoryCreatureScript<CreatureAI, &GetPrivatePublicPairAISelector<privateAI, publicAI>>(scriptName);
59
60static Creature* FindCreatureIgnorePhase(WorldObject const* obj, std::string_view stringId, float range = 100.0f)
61{
62 return obj->FindNearestCreatureWithOptions(range, { .StringId = stringId, .IgnorePhases = true });
63}
64
65 // ********************************************
66 // * Scripting in this section occurs on ship *
67 // ********************************************
68
70{
72};
73
74// 290901 - Attention!
76{
77 bool Validate(SpellInfo const* /*spellInfo*/) override
78 {
80 }
81
82 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
83 {
85 }
86
87 void Register() override
88 {
90 }
91};
92
94{
97};
98
100{
101public:
102 BaseQuestWarmingUp(const char* name) : QuestScript(name) { }
103
104 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus)
105 {
106 if (newStatus == QUEST_STATUS_INCOMPLETE)
107 Conversation::CreateConversation(CONVERSATION_WARMING_UP_ACCEPT, player, *player, player->GetGUID(), nullptr);
108 else if (newStatus == QUEST_STATUS_COMPLETE)
110 }
111};
112
114{
115public:
116 q56775_warming_up() : BaseQuestWarmingUp("q56775_warming_up") { }
117
118 static constexpr float CLONE_ORIENTATION = 5.124503135681152343f;
119 static constexpr float CLONE_Z_OFFSET = 0.308f;
120
121 void OnQuestStatusChange(Player* player, Quest const* quest, QuestStatus oldStatus, QuestStatus newStatus) override
122 {
123 BaseQuestWarmingUp::OnQuestStatusChange(player, quest, oldStatus, newStatus);
124
125 if (newStatus == QUEST_STATUS_REWARDED)
126 {
127 Creature* garrickLowerDeck = FindCreatureIgnorePhase(player, "q56775_garrick_lower_deck", 5.0f);
128 Creature* garrickUpperDeck = FindCreatureIgnorePhase(player, "q56775_garrick_upper_deck", 75.0f);
129 if (!garrickLowerDeck || !garrickUpperDeck)
130 return;
131
132 Position pos(garrickLowerDeck->GetPositionX(), garrickLowerDeck->GetPositionY(), garrickLowerDeck->GetPositionZ() - CLONE_Z_OFFSET, CLONE_ORIENTATION);
133 garrickUpperDeck->SummonPersonalClone(pos, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
134 }
135 }
136};
137
139{
140public:
141 q59926_warming_up() : BaseQuestWarmingUp("q59926_warming_up") { }
142
143 void OnQuestStatusChange(Player* player, Quest const* quest, QuestStatus oldStatus, QuestStatus newStatus) override
144 {
145 BaseQuestWarmingUp::OnQuestStatusChange(player, quest, oldStatus, newStatus);
146
147 if (newStatus == QUEST_STATUS_REWARDED)
148 {
149 Creature* grimaxeLowerDeck = FindCreatureIgnorePhase(player, "q59926_grimaxe_lower_deck", 5.0f);
150 Creature* grimaxeUpperDeck = FindCreatureIgnorePhase(player, "q59926_grimaxe_upper_deck", 75.0f);
151 if (!grimaxeLowerDeck || !grimaxeUpperDeck)
152 return;
153
154 grimaxeUpperDeck->SummonPersonalClone(*grimaxeLowerDeck, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
155 }
156 }
157};
158
160{
164
169
173
175};
176
177// 156280 - Captain Garrick
178// 166824 - Warlord Breka Grimaxe
180{
182
183 void InitializeAI() override
184 {
186 }
187
188 void JustAppeared() override
189 {
191 {
194 }
196 {
199 }
200
202 }
203
204 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
205 {
206 if (pathId == _pathToSparringPartner)
208 else if (pathId == _pathToUpperDeck)
210 }
211
212 void UpdateAI(uint32 diff) override
213 {
214 _events.Update(diff);
215
216 while (uint32 eventId = _events.ExecuteEvent())
217 {
218 switch (eventId)
219 {
221 Talk(SAY_SPAR);
223 break;
227 break;
230 break;
231 default:
232 break;
233 }
234 }
235 }
236private:
240};
241
243{
246
250
253
258
261
264
266
271
277};
278
279// 58209 - Stand Your Ground
280// 59927 - Stand Your Ground
282{
283public:
284 quest_stand_your_ground() : QuestScript("quest_stand_your_ground") { }
285
286 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
287 {
288 // Remove aura if player drops quest
289 if (newStatus == QUEST_STATUS_NONE)
290 {
291 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
293 }
294 }
295};
296
297// 303065 - Summon Cole - Combat Training (DNT)
298// 325108 - Summon Throg - Combat Training (DNT)
300{
301 // @TODO: drop after TARGET_UNK_142 impl
302
304 {
305 Player* caster = GetCaster()->ToPlayer();
306 if (!caster)
307 return;
308
309 Creature* partner = FindCreatureIgnorePhase(caster, caster->GetTeam() == ALLIANCE ? "q58209_cole" : "q59927_throg", 10.0f);
310 if (!partner)
311 return;
312
313 target = partner;
314 }
315
316 void Register() override
317 {
319 }
320};
321
322// 157051 - Alliance Sparring Partner
323// 166814 - Horde Sparring Partner
325{
327
328 void JustAppeared() override
329 {
331 {
335 _actorIndex = 0;
336 }
338 {
342 _actorIndex = 1;
343 }
344 me->SetImmuneToPC(true);
346 }
347
348 void EnterEvadeMode(EvadeReason /*why*/) override
349 {
350 if (!me->IsAlive())
351 return;
352
353 me->CombatStop(true);
357 }
358
359 void MovementInform(uint32 uiType, uint32 uiId) override
360 {
361 if (uiType != POINT_MOTION_TYPE)
362 return;
363
364 switch (uiId)
365 {
367 me->SetWalk(true);
369 break;
371 if (Unit* owner = me->GetDemonCreator())
372 me->SetFacingToObject(owner);
373 me->SetImmuneToPC(false);
374 me->SetUninteractible(false);
375 break;
376 default:
377 break;
378 }
379 }
380
381 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
382 {
383 if (pathId != _path)
384 return;
385
386 if (Unit* owner = me->GetDemonCreator())
387 {
389 owner->CastSpell(owner, SPELL_UPDATE_PHASE_SHIFT);
390 owner->CastSpell(owner, SPELL_COMBAT_TRAINING_COMPLETE);
391 }
392 }
393
394 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
395 {
396 if (me->GetHealth() <= damage)
397 {
398 damage = 0;
399 me->SetHealth(1);
400 DoStopAttack();
401 me->SetImmuneToPC(true);
402 me->SetUninteractible(true);
404
405 if (Player* player = me->GetDemonCreatorPlayer())
406 {
407 me->SetFacingToObject(player);
409 player->CastSpell(player, SPELL_COMBAT_TRAINING);
410 player->KilledMonsterCredit(NPC_KILL_CREDIT);
411 }
412 }
413
414 if (me->HealthBelowPctDamaged(65, damage) && !_jumped)
415 {
416 _jumped = true;
420 }
421 }
422
423 void JustEngagedWith(Unit* /*who*/) override
424 {
426 }
427
428 void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) override
429 {
430 if (target->GetHealthPct() < 95)
431 damage = 0;
432 }
433
434 void StartPrivateConversation(uint32 conversationId)
435 {
436 if (Unit* owner = me->GetDemonCreator())
437 {
438 Conversation* conversation = Conversation::CreateConversation(conversationId, owner, *owner, owner->GetGUID(), nullptr, false);
439 conversation->AddActor(_actorId, _actorIndex, me->GetGUID());
440 conversation->Start();
441 }
442 }
443
445 {
446 std::list<Creature*> sparPoints;
449
450 if (sparPoints.empty()) // should never happen
451 return nullptr;
452
453 return sparPoints.front();
454 }
455
456 void UpdateAI(uint32 diff) override
457 {
458 _events.Update(diff);
459
460 while (uint32 eventId = _events.ExecuteEvent())
461 {
462 switch (eventId)
463 {
465 {
466 if (Creature* sparPoint = GetRandomSparPoint())
467 me->GetMotionMaster()->MovePoint(POSITION_SPARPOINT_ADVERTISMENT, sparPoint->GetPosition());
468
470 break;
471 }
474 break;
477 break;
478 case EVENT_WALK_BACK:
480 me->GetMotionMaster()->MovePath(_path, false);
481 break;
482 default:
483 break;
484 }
485 }
486
487 if (!UpdateVictim())
488 return;
489 }
490private:
496};
497
499{
502
505};
506
507// 160664 - Private Cole
508// 166583 - Grunt Throg
510{
512
513 void OnQuestAccept(Player* player, Quest const* quest) override
514 {
516 {
517 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
518 player->CastSpell(player, SPELL_SUMMON_COLE);
519 }
520 else if (quest->GetQuestId() == QUEST_STAND_YOUR_GROUND_HORDE)
521 {
522 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
523 player->CastSpell(player, SPELL_SUMMON_THROG);
524 }
525 }
526};
527
529{
530 std::string_view StringId;
532};
533
534static std::vector<ActorData> const ActorDataMap[2] =
535{
536 // TEAM_ALLIANCE
537 {
538 { "q58208_garrick", { 35.5643f, -1.19837f, 12.1479f, 3.3272014f } },
539 { "q58208_richter", { -1.84858f, -8.38776f, 5.10018f, 1.5184366f } },
540 { "q58208_keela", { -15.3642f, 6.5793f, 5.5026f, 3.1415925f } },
541 { "q58208_bjorn", { 12.8406f, -8.49553f, 4.98031f, 4.8520155f } },
542 { "q58208_austin", { -4.48607f, 9.89729f, 5.07851f, 1.5184366f } },
543 { "q58208_cole", { -13.3396f, 0.702157f, 5.57996f, 0.087266445f } },
544 },
545 // TEAM_HORDE
546 {
547 { "q59928_grimaxe", { 25.5237f, 0.283005f, 26.5455f, 3.3526998f } },
548 { "q59928_throg", { -10.8399f, 11.9039f, 8.88028f, 6.2308254f } },
549 { "q59928_mithdran", { -24.4763f, -4.48273f, 9.13471f, 0.62831855f } },
550 { "q59928_lana", { -5.1971f, -15.0268f, 8.992f, 4.712389f } },
551 { "q59928_bo", { -22.1559f, 5.58041f, 9.09176f, 6.143559f } },
552 { "q59928_jinhake", { -31.9464f, 7.5772f, 10.6408f, 6.0737457f } },
553 }
554};
555
556static std::unordered_map<Races, std::string_view> const ActorPetData =
557{
558 { RACE_HUMAN, "q58208_wolf" },
559 { RACE_DWARF, "q58208_bear" },
560 { RACE_NIGHTELF, "q58208_tiger" },
561 { RACE_GNOME, "q58208_bunny" },
562 { RACE_DRAENEI, "q58208_moth" },
563 { RACE_WORGEN, "q58208_dog" },
564 { RACE_PANDAREN_ALLIANCE, "q58208_turtle" },
565 { RACE_ORC, "q59928_wolf" },
566 { RACE_UNDEAD_PLAYER, "q59928_bat" },
567 { RACE_TAUREN, "q59928_plainstrider" },
568 { RACE_TROLL, "q59928_raptor" },
569 { RACE_GOBLIN, "q59928_scorpion" },
570 { RACE_BLOODELF, "q59928_dragonhawk" },
571 { RACE_PANDAREN_HORDE, "q59928_turtle" }
572};
573
575{
578};
579
580// 58208 - Brace For Impact
581// 59928 - Brace For Impact
583{
584public:
585 quest_brace_for_impact() : QuestScript("quest_brace_for_impact") { }
586
587 void OnQuestStatusChange(Player* player, Quest const* quest, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
588 {
589 if (newStatus != QUEST_STATUS_COMPLETE)
590 return;
591
592 TeamId team = TEAM_NEUTRAL;
593 Position petSpawnPos;
594
596 {
597 team = TEAM_ALLIANCE;
598 petSpawnPos = { -1.4492f, 8.06887f, 5.10348f, 2.6005409f };
599 }
600 else if (quest->GetQuestId() == QUEST_BRACE_FOR_IMPACT_HORDE)
601 {
602 team = TEAM_HORDE;
603 petSpawnPos = { -22.8374f, -3.08287f, 9.12613f, 3.857178f };
604 }
605
606 if (team == TEAM_NEUTRAL)
607 return;
608
609 SpawnActors(player, team, petSpawnPos);
610 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
611 }
612
613 void SpawnActors(Player* player, TeamId team, Position petSpawnPos)
614 {
615 for (ActorData const& actor : ActorDataMap[team])
616 SpawnActor(player, FindCreatureIgnorePhase(player, actor.StringId, 50.0f), actor.ActorPosition);
617
618 SpawnPet(player, petSpawnPos);
619 }
620
621 void SpawnPet(Player* player, Position const& position)
622 {
623 if (player->GetClass() != CLASS_HUNTER)
624 return;
625
626 if (std::string_view const* stringId = Trinity::Containers::MapGetValuePtr(ActorPetData, Races(player->GetRace())))
627 {
628 Creature* pet = FindCreatureIgnorePhase(player, *stringId, 25.0f);
629 if (!pet)
630 return;
631
632 SpawnActor(player, pet, position);
633 }
634 }
635
636 void SpawnActor(Player* player, Creature* creature, Position const& position)
637 {
638 TransportBase const* transport = player->GetDirectTransport();
639
640 if (!transport || !creature)
641 return;
642
643 float x, y, z, o;
644 position.GetPosition(x, y, z, o);
645 transport->CalculatePassengerPosition(x, y, z, &o);
646 creature->SummonPersonalClone({ x, y, z, o }, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
647 }
648};
649
651{
656
659
661};
662
663// 156280 - Captain Garrick
664// 166827 - Warlord Breka Grimaxe
666{
668
669 void JustAppeared() override
670 {
672 {
675 _waitTime = 0s;
676 }
678 {
681 _waitTime = 1s;
682 }
683
686 }
687
688 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
689 {
690 if (pathId == _pathPreTalk)
692 else if (pathId == _pathPostTalk)
694 }
695
696 void UpdateAI(uint32 diff) override
697 {
698 _events.Update(diff);
699
700 while (uint32 eventId = _events.ExecuteEvent())
701 {
702 switch (eventId)
703 {
707 break;
710 break;
711 default:
712 break;
713 }
714 }
715 }
716private:
721};
722
724{
727
730
733
735};
736
737// 160664 - Private Cole
738// 166583 - Grunt Throg
740{
742
743 void JustAppeared() override
744 {
745 if (me->GetEntry() == NPC_PRIVATE_COLE)
747 else if (me->GetEntry() == NPC_GRUNT_THROG)
749
751 }
752
753 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
754 {
755 if (_path && pathId == _path)
757 }
758
759 void UpdateAI(uint32 diff) override
760 {
761 _events.Update(diff);
762
763 while (uint32 eventId = _events.ExecuteEvent())
764 {
765 switch (eventId)
766 {
770 break;
772 me->GetMotionMaster()->MovePath(_path, false);
773 break;
774 default:
775 break;
776 }
777 }
778 }
779private:
782};
783
785{
787 NPC_KEE_LA = 157043,
790
791 NPC_BO = 166585,
795
800
805};
806
807// 157042 - Quartermaster Richter
808// 157043 - Kee-La
809// 157044 - Bjorn Stouthands
810// 157046 - Austin Huxworth
811// 166585 - Bo
812// 166590 - Mithdran Dawntracker
813// 166794 - Lana Jordan
814// 166799 - Provisoner Jin'hake
816{
817 npc_crew_ship_private(Creature* creature) : ScriptedAI(creature), _path(0) { }
818
820 {
821 switch (me->GetEntry())
822 {
827 case NPC_BO: return PATH_BO_BRACE_FOR_IMPACT;
831 default: return 0;
832 }
833 }
834
835 void JustAppeared() override
836 {
837 _path = GetPathID();
839 {
840 me->GetMotionMaster()->MovePath(_path, false);
841 });
842 }
843
844 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
845 {
846 if (_path && pathId == _path)
848 }
849
850 void UpdateAI(uint32 diff) override
851 {
852 _scheduler.Update(diff);
853 }
854
855private:
858};
859
861{
863
866
868 PATH_PET_HORDE_SHIP = 10502020
870
871// 167337 - Mechanical Bunny
872// 167342 - Moth
873// 167343 - Dragonhawk
874// 167344 - Scorpion
875// 167345 - Wolf
876// 167346 - Wolf
877// 167347 - Tiger
878// 167348 - Turtle
879// 167349 - Plainstrider
880// 167350 - Raptor
881// 167351 - Bat
882// 167352 - Dog
883// 167375 - Bear
885{
886 npc_pet_ship_private(Creature* creature) : ScriptedAI(creature), _path(0) { }
887
888 void JustAppeared() override
889 {
890 if (!me->GetTransport())
891 return;
892
893 int32 transportMap = me->GetTransport()->GetMapIdForSpawning();
894 if (transportMap == MAP_ALLIANCE_SHIP)
896 else if (transportMap == MAP_HORDE_SHIP)
898
899 if (_path)
901 }
902
903 void WaypointPathEnded(uint32 /*nodeId*/, uint32 /*pathId*/) override
904 {
906 }
907
908 void UpdateAI(uint32 diff) override
909 {
910 _events.Update(diff);
911
912 while (uint32 eventId = _events.ExecuteEvent())
913 {
914 if (eventId == EVENT_PET_SHIP_RUN_TO_POSITION)
915 me->GetMotionMaster()->MovePath(_path, false);
916 }
917 }
918
919private:
922};
923
925{
928
932};
933
935{
936public:
937 player_exiles_reach_ship_crash() : PlayerScript("player_exiles_reach_ship_crash") { }
938
939 void OnMovieComplete(Player* player, uint32 movieId) override
940 {
941 switch (movieId)
942 {
944 player->CastSpell(player, SPELL_ALLIANCE_SHIP_CRASH, true);
945 break;
947 player->CastSpell(player, SPELL_HORDE_SHIP_CRASH, true);
948 break;
949 default:
950 break;
951 }
952 }
953};
954
956{
957public:
958 scene_alliance_and_horde_ship() : SceneScript("scene_alliance_and_horde_ship") { }
959
960 void StartConvo(Player* player)
961 {
962 // This script is used to send conversation to Captian Garrick and Warlord Grimaxe on movement after entering ship
963 player->CastSpell(player, SPELL_BEGIN_TUTORIAL, true);
964 }
965
966 void OnSceneComplete(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) override
967 {
968 StartConvo(player);
969 }
970
971 void OnSceneCancel(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) override
972 {
973 StartConvo(player);
974 }
975};
976
977// ***************************************************************
978// * Scripting in this section occurs after teleporting to beach *
979// ***************************************************************
980
982{
985
986// 305445 - Knocked Down!
988{
989 bool Validate(SpellInfo const* /*spellInfo*/) override
990 {
992 }
993
994 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
995 {
997 }
998
999 void Register() override
1000 {
1002 }
1003};
1004
1006{
1011
1012// Script scene for washed up on beach to cast spells Alliance and Horde
1014{
1015public:
1016 scene_alliance_and_horde_crash() : SceneScript("scene_alliance_and_horde_crash") { }
1017
1018 void OnSceneTriggerEvent(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/, std::string const& triggerName) override
1019 {
1020 if (triggerName == "Begin Knockdown Aura")
1021 player->CastSpell(player, SPELL_KNOCKED_DOWN, true);
1022 }
1023
1024 void OnSceneComplete(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) override
1025 {
1027 }
1028};
1029
1031{
1032 if (creature->IsPrivateObject())
1033 {
1034 if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
1035 {
1036 if ((privateObjectOwner->GetTeam() == ALLIANCE && privateObjectOwner->GetQuestStatus(QUEST_BRACE_FOR_IMPACT_ALLIANCE) == QUEST_STATUS_NONE))
1037 return new npc_ship_captain_warming_up_private(creature);
1038 else
1039 return new npc_ship_captain_brace_for_impact_private(creature);
1040 }
1041 }
1042
1043 return new NullCreatureAI(creature);
1044};
1045
1047{
1051
1052// 305464 - Crash Landed
1053// 325136 - Crash Landed
1054template<uint32 StaticCaptainNPCId>
1056{
1057 void HandleEffect(SpellEffIndex /*effIndex*/)
1058 {
1059 Player* player = GetCaster()->ToPlayer();
1060 if (!player)
1061 return;
1062
1063 if (Creature* creature = player->FindNearestCreature(StaticCaptainNPCId, 50.0f))
1064 creature->SummonPersonalClone(creature->GetPosition(), TempSummonType(TEMPSUMMON_MANUAL_DESPAWN), 0s, 0, 0, player);
1065 }
1066
1067 void Register() override
1068 {
1070 }
1071};
1072
1074{
1077
1082
1085
1090
1092
1095
1096// 156626 - Captain Garrick
1097// 166782 - Warlord Breka Grimaxe
1099{
1101
1102 void IsSummonedBy(WorldObject* summonerWO) override
1103 {
1104 Player* summoner = summonerWO->ToPlayer();
1105 if (!summoner)
1106 return;
1107
1108 me->SetFacingToObject(summoner);
1109 Talk(TALK_ARRIVED_AT_BEACH, summoner);
1110 me->DespawnOrUnsummon(5s);
1111 }
1112};
1113
1114// 156626 - Captain Garrick
1115// 166782 - Warlord Breka Grimaxe
1116// for Emergency first aid quest 54951
1118{
1120
1121 void InitializeAI() override
1122 {
1124 }
1125
1126 void IsSummonedBy(WorldObject* summonerWO) override
1127 {
1128 Player* summoner = summonerWO->ToPlayer();
1129 if (!summoner)
1130 return;
1131
1133 }
1134
1135 void MovementInform(uint32 uiType, uint32 uiId) override
1136 {
1137 if (uiType != POINT_MOTION_TYPE)
1138 return;
1139
1140 switch (uiId)
1141 {
1146 break;
1147 case POINT_BEACH_HOME:
1149 break;
1150 default:
1151 break;
1152 }
1153 }
1154
1155 void UpdateAI(uint32 diff) override
1156 {
1157 _events.Update(diff);
1158
1159 while (uint32 eventId = _events.ExecuteEvent())
1160 {
1161 switch (eventId)
1162 {
1166 break;
1171 break;
1173 me->GetMotionMaster()->MovePoint(POINT_SECOND_SURVIVOR, -414.15277f, -2605.2014f, 0.91079247f, false);
1174 break;
1176 me->GetMotionMaster()->MovePoint(POINT_BEACH_HOME, -435.15277f, -2610.9915f, 0.649292f, false);
1177 break;
1178 default:
1179 break;
1180 }
1181 }
1182 }
1183
1184public:
1186 {
1187 _firstMateGUID = coleGUID;
1188 }
1189
1191 {
1192 _quartermasterGUID = richterGUID;
1193 }
1194
1195private:
1199};
1200
1201// 156626 - Captain Garrick
1203{
1205
1206 void OnQuestAccept(Player* player, Quest const* quest) override
1207 {
1208 switch (quest->GetQuestId())
1209 {
1212 break;
1214 {
1215 Creature* cole = FindCreatureIgnorePhase(player, "private_cole_beach", 50.0f);
1216 Creature* richter = FindCreatureIgnorePhase(player, "quartermaster_richter_beach", 50.0f);
1217 if (!cole || !richter)
1218 return;
1219
1220 Creature* colePersonal = cole->SummonPersonalClone(cole->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1221 Creature* richterPersonal = richter->SummonPersonalClone(richter->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1222 Creature* mePersonal = me->SummonPersonalClone(me->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1223 if (!colePersonal || !richterPersonal || !mePersonal)
1224 return;
1225
1227 {
1228 personalAI->SetFirstMateGUID(colePersonal->GetGUID());
1229 personalAI->SetQuartermasterGUID(richterPersonal->GetGUID());
1230 }
1231 break;
1232 }
1233 default:
1234 break;
1235 }
1236 }
1237};
1238
1239// 166782 - Warlord Breka Grimaxe
1241{
1243
1244 void OnQuestAccept(Player* player, Quest const* quest) override
1245 {
1246 switch (quest->GetQuestId())
1247 {
1250 break;
1252 {
1253 Creature* throg = FindCreatureIgnorePhase(player, "grunt_throg_beach", 50.0f);
1254 Creature* jinhake = FindCreatureIgnorePhase(player, "jin_hake_beach", 50.0f);
1255 if (!throg || !jinhake)
1256 return;
1257
1258 Creature* throgPersonal = throg->SummonPersonalClone(throg->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1259 Creature* jinhakePersonal = jinhake->SummonPersonalClone(jinhake->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1260 Creature* mePersonal = me->SummonPersonalClone(me->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1261 if (!throgPersonal || !jinhakePersonal || !mePersonal)
1262 return;
1263
1265 {
1266 personalAI->SetFirstMateGUID(throgPersonal->GetGUID());
1267 personalAI->SetQuartermasterGUID(jinhakePersonal->GetGUID());
1268 }
1269 break;
1270 }
1271 default:
1272 break;
1273 }
1274 }
1275};
1276
1278{
1279 if (creature->IsPrivateObject())
1280 {
1281 if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
1282 {
1283 if (privateObjectOwner->GetQuestStatus(QUEST_MURLOC_MANIA_ALLIANCE) == QUEST_STATUS_NONE)
1284 return new npc_captain_warlord_beach_arrive_private(creature);
1285 else
1286 return new npc_captain_warlord_first_aid_private(creature);
1287 }
1288 }
1289 return new npc_captain_garrick_beach(creature);
1290};
1291
1293{
1294 if (creature->IsPrivateObject())
1295 {
1296 if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
1297 {
1298 if (privateObjectOwner->GetQuestStatus(QUEST_MURLOC_MANIA_HORDE) == QUEST_STATUS_NONE)
1299 return new npc_captain_warlord_beach_arrive_private(creature);
1300 else
1301 return new npc_captain_warlord_first_aid_private(creature);
1302 }
1303 }
1304 return new npc_warlord_grimaxe_beach(creature);
1305};
1306
1308{
1311
1316
1318 PATH_SHORT_BEACH = 10520080
1320
1321// 149917 - Private Cole
1322// 156622 - Quartermaster Richter
1323// 166784 - Grunt Throg
1324// 166800 - Provisioner Jin'hake
1325// for Emergency first aid quest
1326template<uint32 PathId, uint32 WaitTime>
1328{
1330
1331 void InitializeAI() override
1332 {
1334 }
1335
1336 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
1337 {
1338 if (spellInfo->Id != SPELL_BANDAGING)
1339 return;
1340
1341 _casterGUID = caster->GetGUID();
1344 }
1345
1346 void UpdateAI(uint32 diff) override
1347 {
1348 _events.Update(diff);
1349
1350 while (uint32 eventId = _events.ExecuteEvent())
1351 {
1352 switch (eventId)
1353 {
1354 case EVENT_SALUTE:
1356 me->SetFacingToObject(caster);
1359 break;
1360 case EVENT_LEAVE_BEACH:
1361 me->GetMotionMaster()->MovePath(PathId, false);
1362 me->DespawnOrUnsummon(Milliseconds(WaitTime));
1363 break;
1364 default:
1365 break;
1366 }
1367 }
1368 }
1369private:
1372};
1373
1375{
1376 if (creature->IsPrivateObject())
1378 return new NullCreatureAI(creature);
1379};
1380
1382{
1383 if (creature->IsPrivateObject())
1385 return new NullCreatureAI(creature);
1386};
1387
1389{
1393
1400
1401 PATH_KEE_LA_STANDING = ((1052012 * 10) + 1) << 3,
1402 PATH_BJORN_STOUTHANDS_STANDING = ((1052013 * 10) + 1) << 3,
1403 PATH_AUSTIN_HUXWORTH_STANDING = ((1052014 * 10) + 1) << 3,
1404
1405 SPELL_BANDAGING_QUEST = 297415
1407
1408// 156609 - Bjorn Stouthands
1409// 156610 - Austin Huxworth
1410// 156612 - Kee-La
1411template<uint32 ConversationId>
1413{
1415
1416 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
1417 {
1418 if (spellInfo->Id != SPELL_BANDAGING_QUEST)
1419 return;
1420
1421 if (Player* player = caster->ToPlayer())
1422 {
1423 player->KilledMonsterCredit(me->GetEntry());
1424 Conversation::CreateConversation(ConversationId, player, *player, player->GetGUID(), nullptr);
1425 player->UpdateVisibilityForPlayer(); // Needed to make survivor stand instantly
1426 }
1427 }
1428};
1429
1431{
1434
1437
1444
1447
1451
1452 PATH_BO_LEAVE_BEACH = ((1052021 * 10) + 1) << 3,
1453 PATH_MITHDRAN_LEAVE_BEACH = ((1052022 * 10) + 1) << 3,
1454 PATH_LANA_JORDAN_LEAVE_BEACH = ((1052023 * 10) + 1) << 3,
1455
1458
1459// 166786 - Bo
1461{
1462 npc_bo_beach_laying(Creature* creature) : ScriptedAI(creature) { }
1463
1464 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
1465 {
1466 if (spellInfo->Id != SPELL_BANDAGING_QUEST)
1467 return;
1468
1469 static const Position BoCloneSpawnPosition = { -448.731f, -2606.03f, 0.602435f, 6.17441f };
1470
1471 if (Player* player = caster->ToPlayer())
1472 {
1473 player->KilledMonsterCredit(me->GetEntry());
1474
1475 if (Creature* survivor = FindCreatureIgnorePhase(player, "bo_beach", 50.0f))
1476 survivor->SummonPersonalClone(BoCloneSpawnPosition, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1477 }
1478 }
1479};
1480
1481// 166791 - Mithdran Dawntracker
1483{
1485
1486 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
1487 {
1488 if (spellInfo->Id != SPELL_BANDAGING_QUEST)
1489 return;
1490
1491 static constexpr Position MithranCloneSpawnPosition = { -428.576f, -2593.93f, 0.152832f, 4.849576f };
1492
1493 if (Player* player = caster->ToPlayer())
1494 {
1495 player->KilledMonsterCredit(me->GetEntry());
1496
1497 if (Creature* survivor = FindCreatureIgnorePhase(player, "mithran_beach", 50.0f))
1498 survivor->SummonPersonalClone(MithranCloneSpawnPosition, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1499 }
1500 }
1501};
1502
1503// 166796 - Lana Jordan
1505{
1507
1508 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
1509 {
1510 if (spellInfo->Id != SPELL_BANDAGING_QUEST)
1511 return;
1512
1513 static constexpr Position LanaCloneSpawnPosition = { -420.656f, -2600.28f, 0.556646f, 4.046853f };
1514
1515 if (Player* player = caster->ToPlayer())
1516 {
1517 player->KilledMonsterCredit(me->GetEntry());
1518
1519 if (Creature* survivor = FindCreatureIgnorePhase(player, "lana_jordan_beach", 50.0f))
1520 survivor->SummonPersonalClone(LanaCloneSpawnPosition, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1521 }
1522 }
1523};
1524
1526{
1531
1534
1535// 150228 - Murloc Spearhunter
1536// 150229 - Murloc Watershaper
1538{
1540
1541 void JustDied(Unit* /*killer*/) override
1542 {
1543 for (auto const& [playerGuid, loot] : me->m_personalLoot)
1544 {
1545 if (Player* player = ObjectAccessor::GetPlayer(*me, playerGuid))
1546 {
1547 if (player->IsQuestRewarded(QUEST_MURLOC_HIDEAWAY_BOOTS_DROPPED))
1548 break;
1549
1550 for (LootItem const& lootItem : loot->items)
1551 {
1553 player->SetRewardedQuest(QUEST_MURLOC_HIDEAWAY_BOOTS_DROPPED);
1554 }
1555 }
1556 }
1557 }
1558};
1559
1560// 150228 - Murloc Spearhunter
1561// 150229 - Murloc Watershaper
1563{
1565
1566 void JustEngagedWith(Unit* who) override
1567 {
1568 me->GetMotionMaster()->MoveJump(who->GetPosition(), 16.0f, 6.2f);
1569 }
1570};
1571
1572// 166787 - Bo
1573// 166792 - Mithdran Dawntracker
1574// 166797 - Lana Jordan
1575template<uint32 PathId>
1577{
1579
1580 void InitializeAI() override
1581 {
1583 }
1584
1585 void JustAppeared() override
1586 {
1588 }
1589
1590 void WaypointPathEnded(uint32 /*nodeId*/, uint32 /*pathId*/) override
1591 {
1593 }
1594
1595 void UpdateAI(uint32 diff) override
1596 {
1597 _events.Update(diff);
1598
1599 while (uint32 eventId = _events.ExecuteEvent())
1600 {
1601 switch (eventId)
1602 {
1607 break;
1609 me->GetMotionMaster()->MovePath(PathId, false);
1610 break;
1611 default:
1612 break;
1613 }
1614 }
1615 }
1616private:
1618};
1619
1620// 151088 - Kee La
1621// 151089 - Bjorn Stouthands
1622// 154170 - Austin Huxworth
1623// 166787 - Bo
1624// 166792 - Mithdran Dawntracker
1625// 166797 - Lana Jordan
1626template<uint32 PathId, uint32 WaitTime>
1628{
1630
1631 void JustAppeared() override
1632 {
1634 }
1635
1636 void UpdateAI(uint32 diff) override
1637 {
1638 _events.Update(diff);
1639
1640 while (uint32 eventId = _events.ExecuteEvent())
1641 {
1642 switch (eventId)
1643 {
1647 break;
1649 me->GetMotionMaster()->MovePath(PathId, false);
1650 me->DespawnOrUnsummon(Milliseconds(WaitTime));
1651 break;
1652 default:
1653 break;
1654 }
1655 }
1656 }
1657private:
1659};
1660
1662{
1663 if (creature->IsPrivateObject())
1664 {
1665 if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
1666 {
1667 if ((privateObjectOwner->GetQuestStatus(QUEST_FINDING_THE_LOST_EXPEDITION_HORDE) == QUEST_STATUS_NONE))
1669 else
1671 }
1672 }
1673
1674 return new NullCreatureAI(creature);
1675};
1676
1678{
1679 if (creature->IsPrivateObject())
1680 {
1681 if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
1682 {
1683 if ((privateObjectOwner->GetQuestStatus(QUEST_FINDING_THE_LOST_EXPEDITION_HORDE) == QUEST_STATUS_NONE))
1685 else
1687 }
1688 }
1689
1690 return new NullCreatureAI(creature);
1691};
1692
1694{
1695 if (creature->IsPrivateObject())
1696 {
1697 if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
1698 {
1699 if ((privateObjectOwner->GetQuestStatus(QUEST_FINDING_THE_LOST_EXPEDITION_HORDE) == QUEST_STATUS_NONE))
1701 else
1703 }
1704 }
1705
1706 return new NullCreatureAI(creature);
1707};
1708
1710{
1711 if (creature->IsPrivateObject())
1713 return new NullCreatureAI(creature);
1714};
1715
1717{
1718 if (creature->IsPrivateObject())
1720 return new NullCreatureAI(creature);
1721};
1722
1724{
1725 if (creature->IsPrivateObject())
1727 return new NullCreatureAI(creature);
1728};
1729
1731{
1734
1736
1740
1743
1747
1749};
1750
1751static constexpr Position GarrickAbandonedCampPosition = { -249.059006f, -2492.520020f, 18.0742f };
1752static constexpr Position GrimaxeAbandonedCampPosition = { -249.20117f, -2492.6191f, 17.964903f };
1753
1754// 165359 - Captain Garrick
1755// This script is used by Captian Garrick Follower for Finding the Lost Expedition quest
1757{
1759
1760 void IsSummonedBy(WorldObject* /*summoner*/) override
1761 {
1763 }
1764
1765 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
1766 {
1767 if (spellInfo->Id != SPELL_GARRICK_PING)
1768 return;
1769
1770 if (_reachedCamp)
1771 return;
1772
1773 _reachedCamp = true;
1774
1775 if (Unit* owner = me->GetOwner())
1776 {
1777 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_LINE_ESCORT_SURVIVOR_CAMP, owner, *owner, owner->GetGUID(), nullptr, false);
1778 conversation->AddActor(ACTOR_ID_ALLIANCE_SURVIVOR, 1, me->GetGUID());
1779 conversation->Start();
1780
1783 }
1784 }
1785
1786 void MovementInform(uint32 uiType, uint32 uiId) override
1787 {
1788 if (uiType != POINT_MOTION_TYPE || uiId != POINT_CAMP_POSITION)
1789 return;
1790
1791 if (Unit* owner = me->GetOwner())
1792 {
1793 owner->CastSpell(owner, SPELL_UPDATE_PHASE_SHIFT);
1794 owner->RemoveAura(SPELL_SUMMON_ADMIRAL_GARRICK_GUARDIAN);
1795 }
1796 }
1797
1798 void UpdateAI(uint32 diff) override
1799 {
1800 _events.Update(diff);
1801
1802 while (uint32 eventId = _events.ExecuteEvent())
1803 {
1804 switch (eventId)
1805 {
1807 {
1808 Unit* owner = me->GetOwner();
1809 if (!owner)
1810 break;
1811
1812 Creature* survivor = FindCreatureIgnorePhase(owner, "spawn_check");
1813
1814 if (!survivor)
1815 {
1816 if (owner->GetAreaId() != AREA_ABANDONED_CAMP)
1818 else
1820 }
1821 else
1822 {
1823 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_LINE_ESCORT_ALLIANCE_SURVIVOR, owner, *owner, owner->GetGUID(), nullptr, false);
1824 conversation->AddActor(ACTOR_ID_ALLIANCE_SURVIVOR, 1, me->GetGUID());
1825 conversation->Start();
1826
1828 }
1829 break;
1830 }
1832 if (Unit* owner = me->GetOwner())
1833 me->GetMotionMaster()->MoveFollow(owner, 0.0f, float(M_PI / 4.0f));
1834 break;
1835 default:
1836 break;
1837 }
1838 }
1839 }
1840private:
1843};
1844
1845// 166805 - Warlord Breka Grimaxe
1846// This script is used by Warlord Grimaxe Follower for Finding the Lost Expedition quest
1848{
1850
1851 void IsSummonedBy(WorldObject* /*summoner*/) override
1852 {
1853 _reachedCamp = false;
1854
1856 }
1857
1858 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
1859 {
1860 if (spellInfo->Id != SPELL_GARRICK_PING)
1861 return;
1862
1863 if (_reachedCamp)
1864 return;
1865
1866 if (Unit* owner = me->GetOwner())
1867 {
1868 if (Conversation* conversation = Conversation::CreateConversation(CONVERSATION_LINE_ESCORT_SURVIVOR_CAMP, owner, *owner, owner->GetGUID(), nullptr, false))
1869 {
1870 conversation->AddActor(ACTOR_ID_HORDE_SURVIVOR, 3, me->GetGUID());
1871 conversation->Start();
1872 }
1875 }
1876 }
1877
1878 void MovementInform(uint32 uiType, uint32 uiId) override
1879 {
1880 if (uiType != POINT_MOTION_TYPE || uiId != POINT_CAMP_POSITION)
1881 return;
1882
1883 if (Unit* owner = me->GetOwner())
1884 {
1885 owner->CastSpell(owner, SPELL_UPDATE_PHASE_SHIFT);
1886 owner->RemoveAura(SPELL_SUMMON_WARLORD_GRIMAXE_GUARDIAN);
1887 }
1888 }
1889
1890 void UpdateAI(uint32 diff) override
1891 {
1892 _events.Update(diff);
1893
1894 while (uint32 eventId = _events.ExecuteEvent())
1895 {
1896 switch (eventId)
1897 {
1899 {
1900 Unit* owner = me->GetOwner();
1901 if (!owner)
1902 break;
1903
1904 Creature* survivor = FindCreatureIgnorePhase(owner, "spawn_check");
1905
1906 if (!survivor)
1907 {
1908 if (owner->GetAreaId() != AREA_ABANDONED_CAMP)
1910 else
1912 }
1913 else
1914 {
1915 if (Conversation* conversation = Conversation::CreateConversation(CONVERSATION_LINE_ESCORT_HORDE_SURVIVOR, owner, *owner, owner->GetGUID(), nullptr, false))
1916 {
1917 conversation->AddActor(ACTOR_ID_HORDE_SURVIVOR, 2, me->GetGUID());
1918 conversation->Start();
1919 }
1921 }
1922 break;
1923 }
1925 if (Unit* owner = me->GetOwner())
1926 me->GetMotionMaster()->MoveFollow(owner, 0.0f, float(M_PI / 4.0f));
1927 break;
1928 default:
1929 break;
1930 }
1931 }
1932 }
1933private:
1936};
1937
1938// 54952 - Finding the Lost Expedition
1939// 59931 - Finding the Lost Expedition
1941{
1942public:
1943 quest_finding_the_lost_expedition(char const* script) : QuestScript(script) { }
1944
1945 void HandleQuestStatusChange(Player* player, QuestStatus newStatus, uint32 summonSpellId, std::string_view survivor1StringId, std::string_view survivor2StringId, std::string_view survivor3StringId)
1946 {
1947 switch (newStatus)
1948 {
1950 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
1951 player->CastSpell(player, summonSpellId);
1952
1953 if (Creature* survivor1 = FindCreatureIgnorePhase(player, survivor1StringId, 25.0f))
1954 {
1955 Creature* survivor1Personal = survivor1->SummonPersonalClone(survivor1->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1956 survivor1Personal->SetScriptStringId("spawn_check");
1957 }
1958 if (Creature* survivor2 = FindCreatureIgnorePhase(player, survivor2StringId, 25.0f))
1959 survivor2->SummonPersonalClone(survivor2->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1960 if (Creature* survivor3 = FindCreatureIgnorePhase(player, survivor3StringId, 25.0f))
1961 survivor3->SummonPersonalClone(survivor3->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1962
1963 break;
1964 case QUEST_STATUS_NONE:
1965 player->RemoveAura(summonSpellId);
1966 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
1967 break;
1968 default:
1969 break;
1970 }
1971 }
1972};
1973
1974// 54952 - Finding the Lost Expedition
1976{
1977public:
1978 quest_finding_the_lost_expedition_alliance() : quest_finding_the_lost_expedition("quest_finding_the_lost_expedition_alliance") { }
1979
1980 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
1981 {
1982 HandleQuestStatusChange(player, newStatus,
1984 "kee_la_beach",
1985 "bjorn_stouthands_beach",
1986 "austin_huxworth_beach");
1987 }
1988};
1989
1990// 59931 - Finding the Lost Expedition
1992{
1993public:
1994 quest_finding_the_lost_expedition_horde() : quest_finding_the_lost_expedition("quest_finding_the_lost_expedition_horde") { }
1995
1996 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
1997 {
1998 HandleQuestStatusChange(player, newStatus,
2000 "bo_beach",
2001 "mithran_beach",
2002 "lana_jordan_beach");
2003 }
2004};
2005
2006// 305596 - Summon Admiral Garrick Guardian
2007// 325076 - Summon Warlord Grimaxe
2009{
2010 // @TODO: drop after TARGET_UNK_142 impl
2011
2013 {
2014 Player* caster = GetCaster()->ToPlayer();
2015 if (!caster)
2016 return;
2017
2018 Creature* survivor = FindCreatureIgnorePhase(caster, caster->GetTeam() == ALLIANCE ? "q54952_garrick" : "q59931_grimaxe", 5.0f);
2019 if (!survivor)
2020 return;
2021
2022 target = survivor;
2023 }
2024
2025 void Register() override
2026 {
2028 }
2029};
2030
2031// ******************************************************************
2032// * Scripting in this section occurs after reaching Abandoned Camp *
2033// ******************************************************************
2034
2036{
2039
2042
2044{
2047
2050
2051template<uint32 QuestId, uint32 ConversationId>
2053{
2055
2056 void OnQuestAccept(Player* player, Quest const* quest) override
2057 {
2058 if (quest->GetQuestId() != QuestId)
2059 return;
2060
2061 Conversation::CreateConversation(ConversationId, player, *player, player->GetGUID());
2062 }
2063};
2064
2066{
2067 ANIMATION_KIT_INJURED = 14432
2069
2070static constexpr Position InjuredNpcPositionAbandonedCamp = { -245.40973f, -2492.0886f, 18.404648f, 2.4754f };
2071
2072// 55174 - Cooking Meat
2073// 59932 - Cooking Meat
2075{
2076public:
2077 quest_cooking_meat(char const* script) : QuestScript(script) { }
2078
2079 void HandleQuestStatusChange(Player* player, QuestStatus newStatus, uint32 completeConversationId, std::string_view injuredStringId)
2080 {
2081 switch (newStatus)
2082 {
2084 {
2085 Conversation::CreateConversation(completeConversationId, player, *player, player->GetGUID());
2086 break;
2087 }
2089 {
2090 Creature* injured = FindCreatureIgnorePhase(player, injuredStringId);
2091 if (!injured)
2092 break;
2093
2096 break;
2097 }
2098 default:
2099 break;
2100 }
2101 }
2102};
2103
2104// 55174 - Cooking Meat
2106{
2107public:
2108 quest_cooking_meat_alliance() : quest_cooking_meat("quest_cooking_meat_alliance") { }
2109
2110 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
2111 {
2112 HandleQuestStatusChange(player, newStatus,
2114 "alaria_standing_abandoned_camp");
2115 }
2116};
2117
2118// 59932 - Cooking Meat
2120{
2121public:
2122 quest_cooking_meat_horde() : quest_cooking_meat("quest_cooking_meat_horde") { }
2123
2124 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
2125 {
2126 HandleQuestStatusChange(player, newStatus,
2128 "wonza_standing_abandoned_camp");
2129 }
2130};
2131
2133{
2135
2136 void OnUnitEnter(Unit* unit) override
2137 {
2138 Player* player = unit->ToPlayer();
2139 if (!player)
2140 return;
2141
2143 player->CastSpell(player, SPELL_GARRICK_PING);
2144 }
2145};
2146
2148{
2150
2151 void OnUnitEnter(Unit* unit) override
2152 {
2153 Player* player = unit->ToPlayer();
2154 if (!player)
2155 return;
2156
2157 if (player->GetTeam() == ALLIANCE)
2158 {
2160 return;
2161
2163 return;
2164
2166 }
2167 else
2168 {
2170 return;
2171
2173 return;
2174
2176 }
2177 }
2178};
2179
2181{
2185
2186// 59254 - Enhanced Combat Tactics (Alliance)
2187// 59339 - Enhanced Combat Tactics (Alliance Monk)
2188// 59933 - Enhanced Combat Tactics (Horde)
2189// 59934 - Enhanced Combat Tactics (Horde Monk)
2191{
2192public:
2193 quest_enhanced_combat_tactics() : QuestScript("quest_enhanced_combat_tactics") { }
2194
2195 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
2196 {
2197 switch (newStatus)
2198 {
2200 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
2202 break;
2203 case QUEST_STATUS_NONE:
2205 player->UpdateObjectVisibility();
2206 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
2207 break;
2208 default:
2209 break;
2210 }
2211 }
2212};
2213
2214// 320175 - Summon Garrick - Combat Training (DNT)
2215// 325181 - Summon Grimaxe - Combat Training (DNT)
2217{
2218 // @TODO: drop after TARGET_UNK_142 impl
2219
2221 {
2222 Player* caster = GetCaster()->ToPlayer();
2223 if (!caster)
2224 return;
2225
2226 Creature* partner = FindCreatureIgnorePhase(caster, caster->GetTeam() == ALLIANCE ? "garrick_camp" : "grimaxe_camp", 10.0f);
2227 if (!partner)
2228 return;
2229
2230 target = partner;
2231 }
2232
2233 void Register() override
2234 {
2236 }
2237};
2238
2240{
2243
2245
2249 // Warrior
2256 // Paladin
2265 // Rogue
2276 // Priest
2282 // Shaman
2287 // Mage
2292 // Warlock
2298 // Druid
2304
2305 // All classes
2311 // Rogue
2313 // Priest, Warlock, Druid
2315 // Shaman
2318 // Mage
2321
2324 //NPC_HORDE_SPARING_PARTNER_ENHANCED = 166916,
2326
2328
2332
2337
2344
2376
2377static constexpr Position EnhancedTrainingWalkPosition = { -250.60243f, -2485.2517f, 17.787413f };
2378static constexpr Position EnhancedTrainingRunPosition = { -231.5225f, -2480.5276f, 19.019197f };
2379
2380// 164577 - Alliance Sparring Partner
2381// 166916 - Horde Sparring Partner
2383{
2385
2386 virtual void OnReadyPointReached() { }
2387
2388 virtual void HandleClassEvent(uint32 /*eventId*/) { }
2389
2390 void JustAppeared() override
2391 {
2393 }
2394
2395 void IsSummonedBy(WorldObject* summonerWO) override
2396 {
2397 Player* player = summonerWO->GetAffectingPlayer();
2398 if (!player)
2399 return;
2400
2401 if (player->GetTeam() == ALLIANCE)
2402 {
2404
2405 if (player->GetClass() == CLASS_MONK)
2407 else
2409 }
2410 else
2411 {
2413
2414 if (player->GetClass() == CLASS_MONK)
2416 else
2418 }
2419 }
2420
2422 {
2423 Player* player = me->GetDemonCreatorPlayer();
2424 if (!player)
2425 return 0;
2426
2427 uint32 objectiveId = 0;
2428 switch (_questID)
2429 {
2432 break;
2435 break;
2436 default:
2437 break;
2438 }
2439
2440 return player->GetQuestObjectiveData(_questID, objectiveId);
2441 }
2442
2443 void EnterEvadeMode(EvadeReason /*why*/) override
2444 {
2445 if (!me->IsAlive())
2446 return;
2447
2448 me->CombatStop(true);
2451 }
2452
2453 void MovementInform(uint32 uiType, uint32 uiId) override
2454 {
2455 if (uiType != POINT_MOTION_TYPE)
2456 return;
2457
2458 switch (uiId)
2459 {
2461 me->SetWalk(false);
2463 break;
2465 {
2466 std::list<Creature*> sparpoints;
2468 Trinity::Containers::RandomResize(sparpoints, 1);
2469
2470 for (Creature* creature : sparpoints)
2472 break;
2473 }
2475 {
2476 Unit* owner = me->GetDemonCreator();
2477 if (!owner)
2478 break;
2479
2480 me->SetFacingToObject(owner);
2481 me->SetImmuneToPC(false);
2484
2486 break;
2487 }
2488 default:
2489 break;
2490 }
2491 }
2492
2493 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
2494 {
2495 damage = me->GetHealth() - 1;
2496
2497 if (me->HealthBelowPctDamaged(20, damage))
2499 }
2500
2501 void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) override
2502 {
2503 if (target->GetHealthPct() < 91)
2504 damage = 0;
2505 }
2506
2508 {
2509 if (Player* player = me->GetDemonCreatorPlayer())
2510 {
2511 Conversation* conversation = Conversation::CreateConversation(conversationId, player, *player, player->GetGUID(), nullptr, false);
2512 if (!conversation)
2513 return;
2514
2515 conversation->AddActor(ACTOR_ID_ALLIANCE_ENHANCED_TRAINING, 0, player->GetTeam() == ALLIANCE ? me->GetGUID() : ObjectGuid::Empty);
2516 conversation->AddActor(ACTOR_ID_HORDE_ENHANCED_TRAINING, 1, player->GetTeam() == HORDE ? me->GetGUID() : ObjectGuid::Empty);
2517 conversation->Start();
2518 }
2519 }
2520
2521 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
2522 {
2523 // Used to check if reached home
2524 if (pathId == PATH_COMBAT_TRAINER_HOME)
2525 {
2526 if (Unit* owner = me->GetDemonCreator())
2527 {
2528 owner->CastSpell(owner, SPELL_UPDATE_PHASE_SHIFT);
2529 owner->RemoveAura(_summonSpellAuraID);
2530 }
2531 }
2532 }
2533
2534 void UpdateAI(uint32 diff) override
2535 {
2536 _events.Update(diff);
2537
2538 while (uint32 eventId = _events.ExecuteEvent())
2539 {
2540 switch (eventId)
2541 {
2543 // Used by all classes
2544 me->SetWalk(true);
2547 break;
2549 {
2550 // Used by all classes
2551 if (Unit* owner = me->GetDemonCreator())
2552 me->SetFacingToObject(owner);
2553
2554 me->SetImmuneToPC(false);
2556 break;
2557 }
2559 // Used by all classes
2560 me->SetImmuneToPC(true);
2562 me->RemoveAllAuras();
2563 if (Unit* owner = me->GetDemonCreator())
2564 {
2565 me->SetFacingToObject(owner);
2568 }
2569 break;
2571 // Used by all classes
2572 me->GetMotionMaster()->Clear();
2574 break;
2575 default:
2576 HandleClassEvent(eventId);
2577 break;
2578 }
2579 }
2580
2581 if (!UpdateVictim())
2582 return;
2583 }
2584
2585protected:
2589};
2590
2591// 164577 - Alliance Sparring Partner
2592// 166916 - Horde Sparring Partner
2594{
2596
2597 void ResetWarrior(Player* player)
2598 {
2599 _slamCounter = 0;
2600 me->SetImmuneToPC(true);
2607 }
2608
2609 void OnReadyPointReached() override
2610 {
2614 _secondaryCheck = true;
2615 }
2616
2617 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
2618 {
2619 Player* player = caster->ToPlayer();
2620 if (!player)
2621 return;
2622
2623 if (spellInfo->Id == SPELL_CHARGE)
2624 {
2627
2629
2630 switch (GetQuestCredits())
2631 {
2632 case 1:
2634 break;
2635 case 2:
2637 break;
2638 case 3:
2640 break;
2641 default:
2642 break;
2643 }
2644 }
2645 else if (spellInfo->Id == SPELL_SLAM)
2646 {
2647 ++_slamCounter;
2648
2649 if (_slamCounter == 3 && GetQuestCredits())
2650 ResetWarrior(player);
2651
2652 if (!_secondaryCheck)
2653 return;
2654
2655 _secondaryCheck = false;
2657 }
2658 }
2659
2660private:
2663};
2664
2665// 164577 - Alliance Sparring Partner
2666// 166916 - Horde Sparring Partner
2668{
2670
2671 void OnReadyPointReached() override
2672 {
2674 _holyPowerCheck = true;
2675 _secondaryCheck = true;
2676 }
2677
2678 void HandleClassEvent(uint32 eventId) override
2679 {
2680 switch (eventId)
2681 {
2683 {
2684 if (_holyPowerCheck) // Used by paladin
2685 {
2686 if (Unit* owner = me->GetDemonCreator())
2687 {
2688 if (owner->GetPower(POWER_HOLY_POWER) >= 3)
2689 {
2690 switch (GetQuestCredits())
2691 {
2692 case 0:
2694 break;
2695 case 1:
2697 break;
2698 case 2:
2700 break;
2701 default:
2702 break;
2703 }
2704 _holyPowerCheck = false;
2705 }
2706 }
2707 }
2709 break;
2710 }
2711 default:
2712 break;
2713 }
2714 }
2715
2716 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
2717 {
2718 Player* player = caster->ToPlayer();
2719 if (!player)
2720 return;
2721
2722 if (spellInfo->Id == SPELL_SHIELD_OF_THE_RIGHTEOUS)
2723 {
2725
2726 switch (GetQuestCredits())
2727 {
2728 case 1:
2730 _secondaryCheck = true;
2731 break;
2732 case 2:
2734 _secondaryCheck = true;
2735 break;
2736 case 3:
2739 break;
2740 default:
2741 break;
2742 }
2743 }
2744 else if (spellInfo->Id == SPELL_CRUSADER_STRIKE)
2745 {
2746 if (_secondaryCheck)
2747 {
2748 switch (GetQuestCredits())
2749 {
2750 case 0:
2752 break;
2753 case 1:
2755 break;
2756 case 2:
2758 break;
2759 default:
2760 break;
2761 }
2762 _secondaryCheck = false;
2763 _holyPowerCheck = true;
2764 }
2765 }
2766 }
2767
2768private:
2771};
2772
2773// 164577 - Alliance Sparring Partner
2774// 166916 - Horde Sparring Partner
2776{
2778
2779 void OnReadyPointReached() override
2780 {
2782 _comboPointCheck = true;
2783 _secondaryCheck = true;
2784 }
2785
2786 void JustEngagedWith(Unit* /*who*/) override
2787 {
2788 if (!GetQuestCredits())
2790 }
2791
2792 void HandleClassEvent(uint32 eventId) override
2793 {
2794 switch (eventId)
2795 {
2799 break;
2801 {
2802 if (_comboPointCheck) // Used by rogue
2803 {
2804 if (Unit* owner = me->GetDemonCreator())
2805 _comboPointsCounter = owner->GetPower(POWER_COMBO_POINTS);
2806
2807 if (_comboPointsCounter >= (GetQuestCredits() + 3))
2808 {
2809 switch (GetQuestCredits())
2810 {
2811 case 0:
2813 break;
2814 case 1:
2816 break;
2817 case 2:
2819 break;
2820 default:
2821 break;
2822 }
2823 _comboPointCheck = false;
2824 }
2825 }
2827 break;
2828 }
2829 default:
2830 break;
2831 }
2832 }
2833
2834 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
2835 {
2836 Player* player = caster->ToPlayer();
2837 if (!player)
2838 return;
2839
2840 if (spellInfo->Id == SPELL_EVISCERATE)
2841 {
2842 _comboPointCheck = true;
2843 if (_comboPointsCounter >= (GetQuestCredits() + 3))
2844 {
2846
2847 switch (GetQuestCredits())
2848 {
2849 case 1:
2851 _secondaryCheck = true;
2852 break;
2853 case 2:
2855 _secondaryCheck = true;
2856 break;
2857 case 3:
2860 break;
2861 default:
2862 break;
2863 }
2864 }
2865 else
2866 {
2868 }
2869 }
2870 else if (spellInfo->Id == SPELL_SINISTER_STRIKE)
2871 {
2872 if (!GetQuestCredits())
2874
2875 if (_secondaryCheck)
2876 {
2877 switch (GetQuestCredits())
2878 {
2879 case 0:
2881 break;
2882 case 1:
2884 break;
2885 case 2:
2887 break;
2888 default:
2889 break;
2890 }
2891 _secondaryCheck = false;
2892 }
2893 }
2894 }
2895
2896private:
2900};
2901
2902// 164577 - Alliance Sparring Partner
2903// 166916 - Horde Sparring Partner
2905{
2907
2908 void OnReadyPointReached() override
2909 {
2913 _secondaryCheck = true;
2914 }
2915
2916 void HandleClassEvent(uint32 eventId) override
2917 {
2918 switch (eventId)
2919 {
2921 {
2923 if (!aura)
2924 break;
2925
2927 {
2928 int32 pandemicDuration = CalculatePct(aura->GetMaxDuration(), 30.0f);
2929 if (aura->GetDuration() <= pandemicDuration)
2930 {
2933 }
2934 }
2936 break;
2937 }
2938 default:
2939 break;
2940 }
2941 }
2942
2943 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
2944 {
2945 Player* player = caster->ToPlayer();
2946 if (!player)
2947 return;
2948
2949 if (spellInfo->Id == SPELL_SHADOW_WORD_PAIN)
2950 {
2953
2955 {
2956 if (_secondaryCheck)
2957 {
2959 me->SetImmuneToPC(false);
2962 _secondaryCheck = false;
2963 }
2964 else
2966 }
2967 else
2968 {
2971
2974 else
2976 }
2977 }
2978 else if (spellInfo->Id == SPELL_SMITE)
2979 {
2980 if (_secondaryCheck)
2982 }
2983 }
2984
2985private:
2988};
2989
2990// 164577 - Alliance Sparring Partner
2991// 166916 - Horde Sparring Partner
2993{
2995
2996 void OnReadyPointReached() override
2997 {
3001 _secondaryCheck = true;
3002 }
3003
3004 void HandleClassEvent(uint32 eventId) override
3005 {
3006 switch (eventId)
3007 {
3009 if (Unit* owner = me->GetDemonCreator())
3010 {
3011 me->CastSpell(owner, SPELL_KNOCKBACK);
3013 }
3014 break;
3017 me->SetImmuneToPC(false);
3019 _secondaryCheck = true;
3020 break;
3021 default:
3022 break;
3023 }
3024 }
3025
3026 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
3027 {
3028 Player* player = caster->ToPlayer();
3029 if (!player)
3030 return;
3031
3032 if (spellInfo->Id == SPELL_PRIMAL_STRIKE)
3033 {
3034 if (!player->IsWithinDist(me, 2.0f))
3035 return;
3036
3038
3039 if (_primalStrikeCounter < 3)
3040 {
3041 if (_primalStrikeCounter == 1)
3043 return;
3044 }
3045
3048
3050 {
3052 }
3053 else
3054 {
3056 me->SetImmuneToPC(true);
3059 }
3060 }
3061 else if (spellInfo->Id == SPELL_LIGHTNING_BOLT)
3062 {
3065 if (_secondaryCheck)
3066 {
3068 _secondaryCheck = false;
3069 }
3070 else
3071 {
3072 if (player->IsWithinDist(me, 2.0f))
3074 }
3075 }
3076 }
3077
3078private:
3081};
3082
3083// 164577 - Alliance Sparring Partner
3084// 166916 - Horde Sparring Partner
3086{
3088
3089 void OnReadyPointReached() override
3090 {
3094 _secondaryCheck = true;
3095 }
3096
3097 void HandleClassEvent(uint32 eventId) override
3098 {
3099 switch (eventId)
3100 {
3102 if (Unit* owner = me->GetDemonCreator())
3103 {
3104 me->CastSpell(owner, SPELL_KNOCKBACK);
3106 }
3107 break;
3110 me->SetImmuneToPC(false);
3112 _secondaryCheck = true;
3113 break;
3114 default:
3115 break;
3116 }
3117 }
3118
3119 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
3120 {
3121 Player* player = caster->ToPlayer();
3122 if (!player)
3123 return;
3124
3125 if (spellInfo->Id == SPELL_FIRE_BLAST)
3126 {
3127 if (player->IsWithinDist(me, 2.0f))
3128 {
3130
3132 {
3134 }
3135 else
3136 {
3138 me->SetImmuneToPC(true);
3141 }
3142 }
3143 else
3144 {
3146 }
3147 }
3148 else if (spellInfo->Id == SPELL_FROSTBOLT)
3149 {
3152 if (_secondaryCheck)
3153 {
3155 _secondaryCheck = false;
3156 }
3157 else
3158 {
3159 if (player->IsWithinDist(me, 2.0f))
3161 }
3162 }
3163 }
3164
3165private:
3167};
3168
3169// 164577 - Alliance Sparring Partner
3170// 166916 - Horde Sparring Partner
3172{
3174
3175 void OnReadyPointReached() override
3176 {
3180 _secondaryCheck = true;
3181 }
3182
3183 void HandleClassEvent(uint32 eventId) override
3184 {
3185 switch (eventId)
3186 {
3188 {
3189 Aura* aura = me->GetAura(SPELL_CORRUPTION);
3190 if (!aura)
3191 break;
3192
3194 {
3195 int32 pandemicDuration = CalculatePct(aura->GetMaxDuration(), 30.0f);
3196 if (aura->GetDuration() <= pandemicDuration)
3197 {
3200 }
3201 }
3203 break;
3204 }
3205 default:
3206 break;
3207 }
3208 }
3209
3210 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
3211 {
3212 Player* player = caster->ToPlayer();
3213 if (!player)
3214 return;
3215
3216 if (spellInfo->Id == SPELL_CORRUPTION)
3217 {
3220
3222 {
3223 if (_secondaryCheck)
3224 {
3226 me->SetImmuneToPC(false);
3229 _secondaryCheck = false;
3230 }
3231 else
3233 }
3234 else
3235 {
3238
3241 else
3243 }
3244 }
3245 else if (spellInfo->Id == SPELL_SHADOWBOLT)
3246 {
3247 if (_secondaryCheck)
3249 }
3250 }
3251
3252private:
3255};
3256
3257// 164577 - Alliance Sparring Partner
3258// 166916 - Horde Sparring Partner
3260{
3262
3263 void OnReadyPointReached() override
3264 {
3266 }
3267
3268 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
3269 {
3270 Player* player = caster->ToPlayer();
3271 if (!player)
3272 return;
3273
3274 if (spellInfo->Id == SPELL_TIGER_PALM)
3276 else if (spellInfo->Id == SPELL_BLACKOUT_KICK)
3278
3281 }
3282};
3283
3284// 164577 - Alliance Sparring Partner
3285// 166916 - Horde Sparring Partner
3287{
3289
3290 void OnReadyPointReached() override
3291 {
3296 _hitByMoonfire = false;
3297 }
3298
3299 void HandleClassEvent(uint32 eventId) override
3300 {
3301 switch (eventId)
3302 {
3304 {
3305 Aura* aura = me->GetAura(SPELL_MOONFIRE);
3306 if (!aura)
3307 break;
3308
3310 {
3311 int32 pandemicDuration = CalculatePct(aura->GetMaxDuration(), 30.0f);
3312 if (aura->GetDuration() <= pandemicDuration)
3313 {
3316 }
3317 }
3319 break;
3320 }
3321 default:
3322 break;
3323 }
3324 }
3325
3326 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
3327 {
3328 Player* player = caster->ToPlayer();
3329 if (!player)
3330 return;
3331
3332 if (spellInfo->Id == SPELL_MOONFIRE)
3333 {
3336
3338 {
3339 if (!_hitByMoonfire)
3340 {
3342 me->SetImmuneToPC(false);
3345 _hitByMoonfire = true;
3346 }
3347 else
3349 }
3350 else
3351 {
3354
3357 else
3359 }
3360 }
3361 else if (spellInfo->Id == SPELL_WRATH)
3362 {
3363 if (!_hitByMoonfire)
3365 }
3366 }
3367
3368private:
3371};
3372
3374{
3375 TempSummon* summon = creature->ToTempSummon();
3376 if (!summon)
3377 return new NullCreatureAI(creature);
3378
3379 Unit* summoner = summon->GetSummonerUnit();
3380 if (!summoner)
3381 return new NullCreatureAI(creature);
3382
3383 Player* player = summoner->ToPlayer();
3384 if (!player)
3385 return new NullCreatureAI(creature);
3386
3387 switch (player->GetClass())
3388 {
3389 case CLASS_WARRIOR:
3391 case CLASS_PALADIN:
3393 case CLASS_ROGUE:
3395 case CLASS_PRIEST:
3397 case CLASS_SHAMAN:
3399 case CLASS_MAGE:
3401 case CLASS_WARLOCK:
3403 case CLASS_MONK:
3405 case CLASS_DRUID:
3407 default:
3408 return new NullCreatureAI(creature);
3409 }
3410 if (creature->IsPrivateObject())
3412 return new NullCreatureAI(creature);
3413};
3414
3416{
3418
3419 void OnUnitEnter(Unit* unit) override
3420 {
3421 Player* player = unit->ToPlayer();
3422 if (!player)
3423 return;
3424
3425 Unit* caster = at->GetCaster();
3426 if (!caster)
3427 {
3429 return;
3430 }
3431
3432 caster->SetFacingToObject(player);
3433
3434 switch (player->GetClass())
3435 {
3436 case CLASS_WARRIOR:
3438 break;
3439 case CLASS_PRIEST:
3440 case CLASS_SHAMAN:
3441 case CLASS_MAGE:
3442 case CLASS_WARLOCK:
3443 caster->CastSpell(player, SPELL_CHARGE_KNOCKBACK);
3444 break;
3445 case CLASS_DRUID:
3446 caster->CastSpell(player, SPELL_CHARGE_KNOCKBACK_DRUID);
3447 break;
3448 default:
3449 break;
3450 }
3451 }
3452};
3453
3454// 320605 - Charge Knockback (DNT)
3456{
3458 {
3459 PreventHitDefaultEffect(effIndex);
3460 }
3461
3463 {
3464 Unit* caster = GetCaster();
3465 if (!caster)
3466 return;
3467
3468 Player* player = GetHitUnit()->ToPlayer();
3469 if (!player)
3470 return;
3471
3472 Conversation* conversation = Conversation::CreateConversation(GetSpellInfo()->GetEffect(effIndex).MiscValue, player, *player, player->GetGUID(), nullptr, false);
3473 if (!conversation)
3474 return;
3475
3476 conversation->AddActor(ACTOR_ID_ALLIANCE_ENHANCED_TRAINING, 0, player->GetTeam() == ALLIANCE ? caster->GetGUID() : ObjectGuid::Empty);
3477 conversation->AddActor(ACTOR_ID_HORDE_ENHANCED_TRAINING, 1, player->GetTeam() == ALLIANCE ? ObjectGuid::Empty : caster->GetGUID());
3478 conversation->Start();
3479 }
3480
3481 void Register() override
3482 {
3485 }
3486};
3487
3489{
3492
3494
3501
3504
3509};
3510
3511static constexpr Position GarrickQuillboarBriarpatchPosition = { -142.62154f, -2641.0364f, 48.775497f };
3512static constexpr Position GrimaxeQuillboarBriarpatchPosition = { -142.56076f, -2640.9915f, 48.755478f };
3513
3514// 165360 - Alliance Survivor
3515// This script is used by Captian Garrick Follower for Northbound quest
3517{
3519
3520 void JustAppeared() override
3521 {
3522 Player* player = me->GetAffectingPlayer();
3523 if (!player)
3524 return;
3525
3526 player->UpdateVisibilityForPlayer();
3527
3528 Creature* survivor = FindCreatureIgnorePhase(player, player->GetTeam() == ALLIANCE ? "alaria_standing_abandoned_camp" : "wonza_standing_abandoned_camp", 5.0f);
3529 if (!survivor)
3530 return;
3531
3532 if (player->GetTeam() == ALLIANCE)
3533 {
3540 }
3541 else
3542 {
3549 }
3550
3551 Conversation* conversation = Conversation::CreateConversation(_conversationId, player, *player, player->GetGUID(), nullptr, false);
3552 if (!conversation)
3553 return;
3554
3555 conversation->AddActor(0, 0, player->GetGUID());
3556 conversation->AddActor(_actorIdOne, 1, me->GetGUID());
3557 conversation->AddActor(_actorIdTwo, 2, survivor->GetGUID());
3558 conversation->Start();
3559 }
3560
3561 void IsSummonedBy(WorldObject* /*summoner*/) override
3562 {
3564 }
3565
3566 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
3567 {
3568 if (spellInfo->Id == _lingerSpellId)
3569 {
3572 }
3573 return;
3574 }
3575
3576 void MovementInform(uint32 uiType, uint32 uiId) override
3577 {
3578 if (uiType != POINT_MOTION_TYPE)
3579 return;
3580
3581 if (uiId != POINT_LEADER_RUN)
3582 return;
3583
3584 me->SetFacingTo(6.0737457275390625);
3585
3586 if (Player* player = me->GetAffectingPlayer())
3587 {
3588 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
3589 player->RemoveAura(_guardianSpellId);
3590 player->UpdateVisibilityForPlayer();
3591 }
3592 }
3593
3594 void UpdateAI(uint32 diff) override
3595 {
3596 _events.Update(diff);
3597
3598 while (uint32 eventId = _events.ExecuteEvent())
3599 {
3600 switch (eventId)
3601 {
3603 if (Player* player = me->GetAffectingPlayer())
3604 me->GetMotionMaster()->MoveFollow(player, 0.0f, float(M_PI / 4.0f));
3605 break;
3606 default:
3607 break;
3608 }
3609 }
3610 }
3611
3612private:
3620};
3621
3622// 55173 - Northbound
3623// 59935 - Northbound
3625{
3626public:
3627 quest_northbound(char const* script) : QuestScript(script) { }
3628
3629 void HandleQuestStatusChange(Player* player, QuestStatus newStatus, uint32 summonSpellId)
3630 {
3631 switch (newStatus)
3632 {
3634 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
3635 player->CastSpell(player, summonSpellId);
3636 break;
3637 case QUEST_STATUS_NONE:
3638 player->RemoveAura(summonSpellId);
3639 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
3640 player->UpdateVisibilityForPlayer();
3641 break;
3642 default:
3643 break;
3644 }
3645 }
3646};
3647
3648// 55173 - Northbound
3650{
3651public:
3652 quest_northbound_alliance() : quest_northbound("quest_northbound_alliance") { }
3653
3654 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
3655 {
3657 }
3658};
3659
3660// 59935 - Northbound
3662{
3663public:
3664 quest_northbound_horde() : quest_northbound("quest_northbound_horde") { }
3665
3666 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
3667 {
3669 }
3670};
3671
3672// 305661 - Summon Admiral Garrick Guardian Summons Alliance Entry: 165360
3673// 344383 - Summon Admiral Garrick Guardian Summons Horde Entry: 175034
3675{
3676 // @TODO: drop after TARGET_UNK_142 impl
3677
3679 {
3680 Player* caster = GetCaster()->ToPlayer();
3681 if (!caster)
3682 return;
3683
3684 Creature* survivor = FindCreatureIgnorePhase(caster, caster->GetTeam() == ALLIANCE ? "garrick_camp" : "grimaxe_camp", 5.0f);
3685 if (!survivor)
3686 return;
3687
3688 target = survivor;
3689 }
3690
3691 void Register() override
3692 {
3694 }
3695};
3696
3698{
3699 at_northbound_linger(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { }
3700
3701 void OnUnitEnter(Unit* unit) override
3702 {
3703 Player* player = unit->ToPlayer();
3704 if (!player)
3705 return;
3706
3707 if (player->GetTeam() == ALLIANCE)
3708 {
3710 return;
3711
3713 return;
3714
3716 return;
3717
3719 }
3720 else
3721 {
3723 return;
3724
3726 return;
3727
3729 return;
3730
3732 }
3733 }
3734};
3735
3736// @TODO: drop
3737// 305665 - Scene Linger (DNT)
3738// 344385 - Scene Linger (DNT)
3740{
3742 {
3743 PreventHitDefaultEffect(effIndex);
3744 }
3745
3747 {
3748 Player* player = GetHitUnit()->ToPlayer();
3749 if (!player)
3750 return;
3751
3752 Creature* scout = FindCreatureIgnorePhase(player, player->GetTeam() == ALLIANCE ? "huxworth_briarpatch" : "dawntracker_briarpatch", 100.0f);
3753 if (!scout)
3754 return;
3755
3756 Conversation* conversation = Conversation::CreateConversation(GetSpellInfo()->GetEffect(effIndex).MiscValue, player, *player, player->GetGUID(), nullptr, false);
3757 if (!conversation)
3758 return;
3759
3762 conversation->Start();
3763 }
3764
3765 void Register() override
3766 {
3769 }
3770};
3771
3772// ***********************************************************************
3773// * Scripting in this section occurs after reaching Quilboar Briarpatch *
3774// ***********************************************************************
3775
3776// Taming the Wild Quest
3778{
3782
3787
3788 SPELL_TAME_BEAST = 1515
3790
3791// 59342 - Taming the Wilds
3792// 59937 - Taming the Wilds
3794{
3795public:
3796 quest_taming_the_wilds(char const* script) : QuestScript(script) { }
3797
3798 void HandleQuestStatusChange(Player* player, QuestStatus newStatus, std::string_view creatureString, uint32 questObjective1, uint32 questObjective2)
3799 {
3800 switch (newStatus)
3801 {
3803 if (Creature* survivor = FindCreatureIgnorePhase(player, creatureString, 5.0f))
3804 survivor->SummonPersonalClone(survivor->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
3805
3806 // Hacks QUEST_OBJECTIVE_CRITERIA_TREE needs research
3807 if (player->HasSpell(SPELL_TAME_BEAST))
3809
3812 break;
3813 default:
3814 break;
3815 }
3816 }
3817};
3818
3819// 59342 - Taming The Wild
3821{
3822public:
3823 quest_taming_the_wilds_alliance() : quest_taming_the_wilds("quest_taming_the_wilds_alliance") { }
3824
3825 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
3826 {
3828 }
3829};
3830
3831// 59937 - Taming The Wild
3833{
3834public:
3835 quest_taming_the_wilds_horde() : quest_taming_the_wilds("quest_taming_the_wilds_horde") { }
3836
3837 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
3838 {
3840 }
3841};
3842
3844{
3847
3850
3856
3861
3862// 154327 - Austin Huxsworth
3864{
3866
3867 void InitializeAI() override
3868 {
3870 }
3871
3872 void JustAppeared() override
3873 {
3876 }
3877
3878 void UpdateAI(uint32 diff) override
3879 {
3880 _events.Update(diff);
3881
3882 while (uint32 eventId = _events.ExecuteEvent())
3883 {
3884 switch (eventId)
3885 {
3888 {
3889 me->SetFacingToObject(player);
3892 player->CastSpell(player, SPELL_LEARNING_TAME_BEAST);
3894 }
3895 break;
3898 {
3900 player->CastSpell(player, SPELL_TUTORIAL_HEALTH_DNT);
3901
3902 if (!player->HasSpell(SPELL_TAME_BEAST))
3903 {
3904 player->UpdateQuestObjectiveProgress(QUEST_OBJECTIVE_CRITERIA_TREE, QUEST_OBJECTIVE_TRAINED_ALLIANCE, 1);
3905 player->CastSpell(player, SPELL_LEARN_TAME_BEAST);
3906 player->CastSpell(player, SPELL_LEARN_CALL_PET);
3907 }
3908
3911 }
3912 me->DespawnOrUnsummon(4s);
3913 break;
3914 default:
3915 break;
3916 }
3917 }
3918 }
3919
3920private:
3922};
3923
3925{
3927
3930
3933};
3934
3935static constexpr Position GarrickBriarpatchDespawnPosition = { -112.92383f, -2640.541f, 52.35042f };
3936static constexpr Position HuxworthBriarpatchDespawnPosition = { -112.61979f, -2645.9775f, 52.22835f };
3937
3938// 154327 - Austin Huxsworth
3940{
3942
3943 void InitializeAI() override
3944 {
3946 }
3947
3948 void JustAppeared() override
3949 {
3952 garrick->SetStandState(UNIT_STAND_STATE_STAND);
3953
3955 }
3956
3957 void UpdateAI(uint32 diff) override
3958 {
3959 _events.Update(diff);
3960
3961 while (uint32 eventId = _events.ExecuteEvent())
3962 {
3963 switch (eventId)
3964 {
3966 {
3968 {
3969 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_BRIARPATCH_ALLIANCE, player, *player, player->GetGUID(), nullptr, false);
3970 if (!conversation)
3971 break;
3972
3975 conversation->Start();
3977 }
3978 break;
3979 }
3982 {
3983 garrick->GetMotionMaster()->MovePoint(0, GarrickBriarpatchDespawnPosition);
3984 garrick->DespawnOrUnsummon(3s);
3985 }
3987 me->DespawnOrUnsummon(3s);
3988 break;
3989 default:
3990 break;
3991 }
3992 }
3993 }
3994
3995public:
3996 void SetGarrickGUID(ObjectGuid garrickGUID)
3997 {
3998 _garrickGUID = garrickGUID;
3999 }
4000
4001private:
4004};
4005
4006// 166996 - Mithdran Dawntracker
4008{
4010
4011 void InitializeAI() override
4012 {
4014 }
4015
4016 void JustAppeared() override
4017 {
4020 }
4021
4022 void UpdateAI(uint32 diff) override
4023 {
4024 _events.Update(diff);
4025
4026 while (uint32 eventId = _events.ExecuteEvent())
4027 {
4028 switch (eventId)
4029 {
4032 {
4033 me->SetFacingToObject(player);
4035 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_HORDE_TRAINER, player, *player, player->GetGUID(), nullptr, false);
4036 if (conversation)
4037 {
4038 conversation->AddActor(CONVERSATION_HORDE_ACTOR, 0, me->GetGUID());
4039 conversation->Start();
4040 }
4041 player->CastSpell(player, SPELL_LEARNING_TAME_BEAST);
4043 }
4044 break;
4047 {
4049 player->CastSpell(player, SPELL_TUTORIAL_HEALTH_DNT);
4050
4051 if (!player->HasSpell(SPELL_TAME_BEAST))
4052 {
4053 player->UpdateQuestObjectiveProgress(QUEST_OBJECTIVE_CRITERIA_TREE, QUEST_OBJECTIVE_TRAINED_HORDE, 1);
4054 player->CastSpell(player, SPELL_LEARN_TAME_BEAST);
4055 player->CastSpell(player, SPELL_LEARN_CALL_PET);
4056 }
4057 }
4060 me->DespawnOrUnsummon(4s);
4061 break;
4062 default:
4063 break;
4064 }
4065 }
4066 }
4067
4068private:
4070};
4071
4073{
4075
4078
4081};
4082
4083static constexpr Position GrimaxeBriarpatchDespawnPosition = { -112.92383f, -2640.541f, 52.35042f };
4084static constexpr Position DawntrackerBriarpatchDespawnPosition = { -112.61979f, -2645.9775f, 52.22835f };
4085
4086// 166996 - Mithdran Dawntracker
4088{
4090
4091 void InitializeAI() override
4092 {
4094 }
4095
4096 void JustAppeared() override
4097 {
4100 grimaxe->SetStandState(UNIT_STAND_STATE_STAND);
4101
4103 }
4104
4105 void UpdateAI(uint32 diff) override
4106 {
4107 _events.Update(diff);
4108
4109 while (uint32 eventId = _events.ExecuteEvent())
4110 {
4111 switch (eventId)
4112 {
4114 {
4116 {
4117 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_BRIARPATCH_HORDE, player, *player, player->GetGUID(), nullptr, false);
4118 if (!conversation)
4119 break;
4120
4123 conversation->Start();
4125 }
4126 break;
4127 }
4130 {
4131 grimaxe->GetMotionMaster()->MovePoint(0, GrimaxeBriarpatchDespawnPosition );
4132 grimaxe->DespawnOrUnsummon(2s);
4133 }
4135 me->DespawnOrUnsummon(2s);
4136 break;
4137 default:
4138 break;
4139 }
4140 }
4141 }
4142
4143public:
4144 void SetGrimaxeGUID(ObjectGuid grimaxeGUID)
4145 {
4146 _grimaxeGUID = grimaxeGUID;
4147 }
4148
4149private:
4152};
4153
4155{
4156 if (creature->IsPrivateObject())
4157 {
4158 if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
4159 {
4160 if (privateObjectOwner->GetQuestStatus(QUEST_TAMING_THE_WILDS_ALLIANCE) == QUEST_STATUS_INCOMPLETE)
4161 return new npc_huxsworth_hunter_quest_private(creature);
4162 else
4163 return new npc_huxsworth_briarpatch_quest_private(creature);
4164 }
4165 }
4166 return new NullCreatureAI(creature);
4167};
4168
4170{
4171 if (creature->IsPrivateObject())
4172 {
4173 if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
4174 {
4175 if (privateObjectOwner->GetQuestStatus(QUEST_TAMING_THE_WILDS_HORDE) == QUEST_STATUS_INCOMPLETE)
4176 return new npc_dawntracker_hunter_quest_private(creature);
4177 else
4178 return new npc_dawntracker_briarpatch_quest_private(creature);
4179 }
4180 }
4181 return new NullCreatureAI(creature);
4182};
4183
4184// 316840 - Tutorial - Health (DNT)
4186{
4187 bool Validate(SpellInfo const* /*spellInfo*/) override
4188 {
4190 }
4191
4192 bool CheckProc(ProcEventInfo& eventInfo)
4193 {
4194 if (eventInfo.GetSpellInfo() && eventInfo.GetSpellInfo()->Id == SPELL_TAME_BEAST_EFFECT)
4195 return true;
4196 return false;
4197 }
4198
4199 void Register() override
4200 {
4202 }
4203};
4204
4205// 316841 - Tutorial - Health (DNT)
4207{
4208 void HandleScript(SpellEffIndex /*effIndex*/)
4209 {
4210 // This shouldn't happen until tame beast spell completes
4211 if (Player* player = GetCaster()->ToPlayer())
4212 {
4213 if (player->GetTeam() == ALLIANCE)
4214 player->UpdateQuestObjectiveProgress(QUEST_OBJECTIVE_CRITERIA_TREE, QUEST_OBJECTIVE_BEAST_TAMED_ALLIANCE, 1);
4215 else
4216 player->UpdateQuestObjectiveProgress(QUEST_OBJECTIVE_CRITERIA_TREE, QUEST_OBJECTIVE_BEAST_TAMED_HORDE, 1);
4217 }
4218 }
4219
4220 void Register() override
4221 {
4223 }
4224};
4225
4227{
4232
4236
4237// 55186 - Quest Down with the Quilboar "Alliance"
4238// 55184 - Forbidden Quilboar Necromancy "Alliance"
4239// 59938 - Quest Down with the Quilboar "Horde"
4240// 59939 - Forbidden Quilboar Necromancy "Horde"
4242{
4243public:
4244 quest_briarpatch(char const* script) : QuestScript(script) { }
4245
4246 void HandleQuestStatusChange(Player* player, QuestStatus newStatus, uint32 questDown, uint32 questForbidden, uint32 spellValidated)
4247 {
4248 switch (newStatus)
4249 {
4251 if (player->GetQuestStatus(questDown) != QUEST_STATUS_NONE && player->GetQuestStatus(questForbidden) != QUEST_STATUS_NONE)
4252 {
4253 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
4254 player->CastSpell(player, spellValidated);
4255 }
4256 break;
4257 case QUEST_STATUS_NONE:
4258 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
4259 break;
4260 default:
4261 break;
4262 }
4263 }
4264};
4265
4266// 55186 - Quest Down with the Quilboar "Alliance"
4267// 55184 - Forbidden Quilboar Necromancy "Alliance"
4269{
4270public:
4271 quest_briarpatch_alliance() : quest_briarpatch("quest_briarpatch_alliance") { }
4272
4273 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
4274 {
4276 }
4277};
4278
4279// 59938 - Quest Down with the Quilboar "Horde"
4280// 59939 - Forbidden Quilboar Necromancy "Horde"
4282{
4283public:
4284 quest_briarpatch_horde() : quest_briarpatch("quest_briarpatch_horde") { }
4285
4286 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
4287 {
4289 }
4290};
4291
4292// 298984 - Validated Quest Accept
4294{
4295 void HandleScript(SpellEffIndex /*effIndex*/)
4296 {
4297 if (Player* player = GetCaster()->ToPlayer())
4298 {
4299 Creature* huxsworth = FindCreatureIgnorePhase(player, "huxworth_briarpatch", 10.0f);
4300 Creature* garrick = FindCreatureIgnorePhase(player, "garrick_briarpatch", 10.0f);
4301 if (!huxsworth || !garrick)
4302 return;
4303
4304 Creature* huxsworthPersonal = huxsworth->SummonPersonalClone(huxsworth->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
4305 Creature* garrickPersonal = garrick->SummonPersonalClone(garrick->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
4306 if (!huxsworthPersonal || !garrickPersonal)
4307 return;
4308
4310 huxworthAI->SetGarrickGUID(garrickPersonal->GetGUID());
4311 }
4312 }
4313
4314 void Register() override
4315 {
4317 }
4318};
4319
4320// 325309 - Validated Quest Accept
4322{
4323 void HandleScript(SpellEffIndex /*effIndex*/)
4324 {
4325 if (Player* player = GetCaster()->ToPlayer())
4326 {
4327 Creature* dawntracker = FindCreatureIgnorePhase(player, "dawntracker_briarpatch", 10.0f);
4328 Creature* grimaxe = FindCreatureIgnorePhase(player, "grimaxe_briarpatch", 10.0f);
4329 if (!dawntracker || !grimaxe)
4330 return;
4331
4332 Creature* dawntrackerPersonal = dawntracker->SummonPersonalClone(dawntracker->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
4333 Creature* grimaxePersonal = grimaxe->SummonPersonalClone(grimaxe->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
4334 if (!dawntrackerPersonal || !grimaxePersonal)
4335 return;
4336
4338 dawntrackerAI->SetGrimaxeGUID(grimaxePersonal->GetGUID());
4339 }
4340 }
4341
4342 void Register() override
4343 {
4345 }
4346};
4347
4349{
4351
4355
4358
4362
4364
4368
4369 WORLDSTATE_HORDE = 4486
4371
4372static constexpr Position PrisonerPosition = { 16.4271f, -2511.82f, 78.8215f, 5.66398f };
4373
4374// 151091 - Geolord Grek'og
4376{
4377 npc_geolord_grekog(Creature* creature) : ScriptedAI(creature) { }
4378
4379 void JustAppeared() override
4380 {
4381 uint32 prisonerEntry = NPC_LINDIE_SPRINGSTOCK;
4382
4383 if (sWorldStateMgr->GetValue(WORLDSTATE_HORDE, me->GetMap()) == 1)
4384 prisonerEntry = NPC_CORK_FIZZLEPOP;
4385
4386 Creature* bunny = me->FindNearestCreatureWithOptions(25.0f, { .CreatureId = NPC_INVIS_BUNNY_GEOLORD, .IgnorePhases = true });
4387 if (!bunny)
4388 return;
4389
4390 if (Creature* prisoner = bunny->SummonCreature(prisonerEntry, PrisonerPosition, TEMPSUMMON_MANUAL_DESPAWN))
4391 _prisonerGUID = prisoner->GetGUID();
4392 }
4393
4394 void JustDied(Unit* /*killer*/) override
4395 {
4397 prisoner->AI()->DoAction(ACTION_FREE_PRISONER);
4398 }
4399
4400 void JustEngagedWith(Unit* who) override
4401 {
4402 if (Player* player = who->ToPlayer())
4403 {
4404 Conversation::CreateConversation(CONVERSATION_GEOLORD_AGGRO, player, *player, player->GetGUID(), nullptr, true);
4405
4408 }
4409 }
4410
4411 void UpdateAI(uint32 diff) override
4412 {
4413 if (!UpdateVictim())
4414 return;
4415
4416 _events.Update(diff);
4417
4418 while (uint32 eventId = _events.ExecuteEvent())
4419 {
4420 switch (eventId)
4421 {
4423 {
4426 break;
4427 }
4429 {
4432 break;
4433 }
4434 default:
4435 break;
4436 }
4437 }
4438 }
4439private:
4442};
4443
4445{
4447
4450
4451static constexpr Position BriarpatchPrisonerJumpToPosition = { 19.5174f, -2513.75f, 74.0545f };
4452static constexpr Position PrisonerBriarpatchDespawnPosition = { 51.005207f, -2485.644f, 78.15223f };
4453
4454// 167008 - Cork Fizzlepop
4455// 154301 - Lindie Springstock
4457{
4459
4460 void JustAppeared() override
4461 {
4462 me->SetDisableGravity(true);
4465 }
4466
4467 void DoAction(int32 param) override
4468 {
4469 if (param == ACTION_FREE_PRISONER)
4470 {
4471 me->RemoveAllAuras();
4472 me->SetDisableGravity(false);
4474 me->GetMotionMaster()->MoveJump(BriarpatchPrisonerJumpToPosition, 7.9894905f, 19.29110336303710937f);
4477 }
4478 }
4479
4480 void UpdateAI(uint32 diff) override
4481 {
4482 _events.Update(diff);
4483
4484 while (uint32 eventId = _events.ExecuteEvent())
4485 {
4486 switch (eventId)
4487 {
4490 me->DespawnOrUnsummon(5s);
4491 break;
4492 default:
4493 break;
4494 }
4495 }
4496 }
4497private:
4499};
4500
4502{
4505};
4506
4508{
4513
4516
4518{
4521
4527
4528// 150237 - Quilboar Warrior
4530{
4531 npc_quilboar_warrior(Creature* creature) : ScriptedAI(creature) { }
4532
4533 void Reset() override
4534 {
4535 _events.Reset();
4536 }
4537
4538 void JustEngagedWith(Unit* who) override
4539 {
4541
4542 if (roll_chance_f(33.33f))
4543 Talk(SAY_AGGRO, who);
4544
4546 }
4547
4548 void JustDied(Unit* killer) override
4549 {
4550 if (roll_chance_f(33.33f))
4551 Talk(SAY_DEATH, killer);
4552
4553 for (auto const& [playerGuid, loot] : me->m_personalLoot)
4554 {
4555 if (Player* player = ObjectAccessor::GetPlayer(*me, playerGuid))
4556 {
4557 if (player->IsQuestRewarded(QUEST_BRIARPATCH_CHEST_DROPPED))
4558 break;
4559
4560 for (LootItem const& lootItem : loot->items)
4561 {
4563 {
4564 player->SetRewardedQuest(QUEST_BRIARPATCH_CHEST_DROPPED);
4565 break;
4566 }
4567 }
4568 }
4569 }
4570 }
4571
4572 void UpdateAI(uint32 diff) override
4573 {
4574 if (!UpdateVictim())
4575 return;
4576
4577 _events.Update(diff);
4578
4579 while (uint32 eventId = _events.ExecuteEvent())
4580 {
4581 switch (eventId)
4582 {
4586 break;
4587 default:
4588 break;
4589 }
4590 }
4591 }
4592
4593private:
4595};
4596
4597// 150238 - Quilboar Geomancer
4599{
4600 npc_quilboar_geomancer(Creature* creature) : ScriptedAI(creature) { }
4601
4602 void Reset() override
4603 {
4604 _events.Reset();
4605 }
4606
4607 void JustEngagedWith(Unit* who) override
4608 {
4610
4611 if (roll_chance_f(33.33f))
4612 Talk(SAY_AGGRO, who);
4613
4615 }
4616
4617 void JustDied(Unit* killer) override
4618 {
4619 if (roll_chance_f(33.33f))
4620 Talk(SAY_DEATH, killer);
4621
4622 for (auto const& [playerGuid, loot] : me->m_personalLoot)
4623 {
4624 if (Player* player = ObjectAccessor::GetPlayer(*me, playerGuid))
4625 {
4626 if (player->IsQuestRewarded(QUEST_BRIARPATCH_CHEST_DROPPED))
4627 break;
4628
4629 for (LootItem const& lootItem : loot->items)
4630 {
4632 {
4633 player->SetRewardedQuest(QUEST_BRIARPATCH_CHEST_DROPPED);
4634 break;
4635 }
4636 }
4637 }
4638 }
4639 }
4640
4641 void UpdateAI(uint32 diff) override
4642 {
4643 if (!UpdateVictim())
4644 return;
4645
4646 _events.Update(diff);
4647
4648 while (uint32 eventId = _events.ExecuteEvent())
4649 {
4650 switch (eventId)
4651 {
4655 break;
4656 default:
4657 break;
4658 }
4659 }
4660 }
4661private:
4663};
4664
4666{
4669
4672
4674
4676 SPELL_EARTHSHATTER = 319292
4678
4679// 156676 - Ogre Overseer
4681{
4682 npc_ogre_overseer(Creature* creature) : ScriptedAI(creature) { }
4683
4684 void Reset() override
4685 {
4686 _events.Reset();
4687 }
4688
4689 void JustEngagedWith(Unit* who) override
4690 {
4691 Talk(SAY_AGGRO, who);
4692
4695 }
4696
4697 void JustDied(Unit* killer) override
4698 {
4699 Talk(SAY_DEATH, killer);
4700
4701 for (auto const& [playerGuid, loot] : me->m_personalLoot)
4702 {
4703 if (Player* player = ObjectAccessor::GetPlayer(*me, playerGuid))
4704 {
4705 if (player->IsQuestRewarded(QUEST_BRIARPATCH_OVERSEER_CLOAK_DROPPED))
4706 break;
4707
4708 for (LootItem const& lootItem : loot->items)
4709 {
4710 if (lootItem.itemid == ITEM_BATTERED_CLOAK)
4711 {
4712 player->SetRewardedQuest(QUEST_BRIARPATCH_OVERSEER_CLOAK_DROPPED);
4713 break;
4714 }
4715 }
4716 }
4717 }
4718 }
4719
4720 void UpdateAI(uint32 diff) override
4721 {
4722 if (!UpdateVictim())
4723 return;
4724
4725 _events.Update(diff);
4726
4727 while (uint32 eventId = _events.ExecuteEvent())
4728 {
4729 switch (eventId)
4730 {
4734 break;
4738 break;
4739 default:
4740 break;
4741 }
4742 }
4743 }
4744private:
4746};
4747
4749{
4753
4755{
4756 at_briarpatch_to_plains(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { }
4757
4758 // @TODO: remove when conversation cooldown is implemented
4759 void StartConversation(Player* player, uint32 conversationId)
4760 {
4761 std::vector<WorldObject*> objs;
4762
4763 Trinity::ObjectEntryAndPrivateOwnerIfExistsCheck check(player->GetGUID(), conversationId);
4765 Cell::VisitGridObjects(player, checker, 100.0f);
4766
4767 if (objs.empty())
4768 Conversation::CreateConversation(conversationId, player, *player, player->GetGUID(), nullptr);
4769 }
4770
4771 void OnUnitEnter(Unit* unit) override
4772 {
4773 Player* player = unit->ToPlayer();
4774 if (!player)
4775 return;
4776
4777 if (player->GetTeam() == ALLIANCE)
4778 {
4780 return;
4781
4783 }
4784 else
4785 {
4787 return;
4788
4790 }
4791 }
4792};
4793
4795{
4796 void ApplyEffect(AuraEffect const* /* aurEff */, AuraEffectHandleModes /*mode*/)
4797 {
4798 if (Creature* target = GetTarget()->ToCreature())
4799 target->SetReactState(REACT_PASSIVE);
4800 }
4801
4802 void RemoveEffect(AuraEffect const* /* aurEff */, AuraEffectHandleModes /*mode*/)
4803 {
4804 if (Creature* target = GetTarget()->ToCreature())
4805 {
4806 target->SetReactState(REACT_AGGRESSIVE);
4807 target->SetStandState(UNIT_STAND_STATE_STAND);
4808 }
4809 }
4810
4811 void Register() override
4812 {
4815 }
4816};
4817
4818// **************************************************************
4819// * Scripting in this section occurs after reaching The Plains *
4820// **************************************************************
4821
4823{
4826
4830
4838
4840
4843
4847 SPELL_GROW_THREE = 111701
4849
4850static constexpr Position MiniChopperJumpPosition = { 107.979f, -2414.13f, 95.6243f };
4851
4852// 149899 - Lindie Springstock
4853// 167019 - Cork Fizzlepop
4855{
4857
4858 void JustAppeared() override
4859 {
4861 {
4864 _timer = 1350ms;
4865 }
4866 else
4867 {
4870 _timer = 750ms;
4871 }
4872
4874 }
4875
4876 void UpdateAI(uint32 diff) override
4877 {
4878 _events.Update(diff);
4879
4880 while (uint32 eventId = _events.ExecuteEvent())
4881 {
4882 switch (eventId)
4883 {
4884 case EVENT_CONVERSATION:
4885 {
4887 {
4888 Conversation* conversation = Conversation::CreateConversation(_conversationId, player, *player, player->GetGUID(), nullptr, false);
4889 if (!conversation)
4890 break;
4891
4892 conversation->AddActor(_conversationActorId, 0, me->GetGUID());
4894 conversation->Start();
4895 }
4896
4898 copter->GetMotionMaster()->MoveJump(MiniChopperJumpPosition, 19.29f, 6.99f);
4899
4901 break;
4902 }
4904 {
4906 {
4907 me->SetFacingTo(0.488383f);
4908 me->CastSpell(copter, SPELL_RE_SIZING);
4909 copter->CastSpell(copter, SPELL_GROW_ONE);
4910 }
4912 break;
4913 }
4915 {
4917 copter->RemoveAura(SPELL_GROW_ONE);
4918
4920 break;
4921 }
4923 {
4925 copter->CastSpell(copter, SPELL_GROW_TWO);
4926
4928 break;
4929 }
4931 {
4933 copter->RemoveAura(SPELL_GROW_TWO);
4934
4936 break;
4937 }
4939 {
4941 copter->CastSpell(copter, SPELL_GROW_THREE);
4942
4944 me->SetFacingTo(4.50382f);
4945 me->DespawnOrUnsummon(27s);
4947 break;
4948 }
4950 {
4952 {
4953 copter->RemoveAura(SPELL_GROW_THREE);
4954 copter->DespawnOrUnsummon(2s);
4955 }
4956 break;
4957 }
4958 default:
4959 break;
4960 }
4961 }
4962 }
4963
4964public:
4965 void SetCopterGUID(ObjectGuid copterGUID)
4966 {
4967 _copterGUID = copterGUID;
4968 }
4969
4970private:
4976};
4977
4979{
4980 if (creature->IsPrivateObject())
4981 {
4982 if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
4983 {
4984 if (privateObjectOwner->GetQuestStatus(QUEST_THE_SCOUT_O_MATIC_5000) == QUEST_STATUS_INCOMPLETE)
4986 }
4987 }
4988 return new NullCreatureAI(creature);
4989};
4990
4992{
4993 if (creature->IsPrivateObject())
4994 {
4995 if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
4996 {
4997 if (privateObjectOwner->GetQuestStatus(QUEST_THE_CHOPPY_BOOSTER_MK5) == QUEST_STATUS_INCOMPLETE)
4999 }
5000 }
5001 return new NullCreatureAI(creature);
5002};
5003
5005{
5010
5014
5017
5021 PATH_BO_PLAINS = 16791000,
5025
5030 SCOUT_O_MATIC_DESUMMON = 305548
5032
5033// 156526 - Scout-o-Matic 5000
5035{
5036 npc_scoutomatic_5000(Creature* creature) : ScriptedAI(creature) { }
5037
5038 void IsSummonedBy(WorldObject* summoner) override
5039 {
5040 if (Player* player = summoner->ToPlayer())
5041 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
5042 }
5043
5044 void PassengerBoarded(Unit* passenger, int8 /*seatId*/, bool apply) override
5045 {
5046 if (apply && passenger->IsPlayer())
5047 {
5048 me->CastSpell(passenger, SPELL_ROPED_DNT);
5050 }
5051 }
5052
5053 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
5054 {
5056 if (!player)
5057 return;
5058
5059 if (pathId == PATH_COPTER_TO_RUINS)
5060 {
5062 }
5063 else
5064 {
5066 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
5067 }
5068 }
5069
5070 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
5071 {
5072 if (spellInfo->Id == SPELL_SCOUT_O_MATIC_PING_DNT)
5073 {
5074 if (Player* player = caster->ToPlayer())
5075 player->KilledMonsterCredit(NPC_SCOUT_O_MATIC_5000);
5076
5078 }
5079 }
5080
5081 void UpdateAI(uint32 diff) override
5082 {
5083 _events.Update(diff);
5084
5085 while (uint32 eventId = _events.ExecuteEvent())
5086 {
5087 switch (eventId)
5088 {
5090 {
5092 {
5093 me->SetSpeed(MOVE_WALK, 5.5f);
5095 Conversation::CreateConversation(CONVERSATION_RIDE_TO_OGRE_RUINS_ALLIANCE, player, *player, player->GetGUID(), nullptr);
5096 }
5097 break;
5098 }
5100 {
5102 {
5103 me->SetSpeed(MOVE_WALK, 5.0f);
5105 Conversation::CreateConversation(CONVERSATION_RIDE_FROM_OGRE_RUINS_ALLIANCE, player, *player, player->GetGUID(), nullptr);
5106 }
5107 break;
5108 }
5109 default:
5110 break;
5111 }
5112 }
5113 }
5114
5115private:
5117};
5118
5120{
5121 { 50.920593f, -2477.466f, 79.444374f, 0.8753076f },
5122 { 60.51328f, -2476.4822f, 81.034775f, 0.9128374f },
5123 { 53.08128f, -2476.5154f, 79.822624f, 0.9394135f },
5124 { 53.281864f, -2480.052f, 79.18003f, 0.78539818f },
5125 { 53.936935f, -2475.588f, 80.24179f, 0.91009599f }
5126};
5127
5128// 167905 - Choppy Booster Mk. 5
5130{
5132
5133 void IsSummonedBy(WorldObject* summoner) override
5134 {
5135 if (Player* player = summoner->ToPlayer())
5136 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
5137 }
5138
5139 void PassengerBoarded(Unit* passenger, int8 /*seatId*/, bool apply) override
5140 {
5141 if (apply && passenger->IsPlayer())
5142 {
5143 me->CastSpell(passenger, SPELL_ROPED_DNT);
5145 }
5146 }
5147
5148 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
5149 {
5151 if (!player)
5152 return;
5153
5154 if (pathId == PATH_COPTER_TO_RUINS)
5155 {
5156 player->CastSpell(player, SPELL_SCENE_OGRE_RUINS_HORDE);
5157 }
5158 else
5159 {
5161 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
5162 }
5163 }
5164
5165 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
5166 {
5167 if (spellInfo->Id == SPELL_SCOUT_O_MATIC_PING_DNT)
5168 {
5169 if (Player* player = caster->ToPlayer())
5170 player->KilledMonsterCredit(NPC_CHOPPY_BOOSTER_MK5);
5171
5173 }
5174 return;
5175 }
5176
5177 void UpdateAI(uint32 diff) override
5178 {
5179 _events.Update(diff);
5180
5181 while (uint32 eventId = _events.ExecuteEvent())
5182 {
5183 switch (eventId)
5184 {
5186 {
5188 {
5189 me->SetSpeed(MOVE_WALK, 6.0f);
5191 Conversation::CreateConversation(CONVERSATION_RIDE_TO_OGRE_RUINS_HORDE, player, *player, player->GetGUID(), nullptr);
5192 }
5193 break;
5194 }
5196 {
5198 {
5199 me->SetSpeed(MOVE_WALK, 4.5f);
5201 Conversation::CreateConversation(CONVERSATION_RIDE_FROM_OGRE_RUINS_HORDE, player, *player, player->GetGUID(), nullptr);
5203 }
5204 break;
5205 }
5208 {
5209 if (Creature* wonsa = FindCreatureIgnorePhase(player, "wonsa_darkmaul_plains"))
5210 if (Creature* wonsaClone = wonsa->SummonPersonalClone(HordeCrewPersonalSpawnLocation[0], TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player))
5211 wonsaClone->GetMotionMaster()->MovePath(PATH_WONSA_PLAINS, false);
5212
5213 if (Creature* bo = FindCreatureIgnorePhase(player, "bo_darkmaul_plains"))
5215 boClone->GetMotionMaster()->MovePath(PATH_BO_PLAINS, false);
5216
5217 if (Creature* lana = FindCreatureIgnorePhase(player, "lana_darkmaul_plains"))
5218 if (Creature* lanaClone = lana->SummonPersonalClone(HordeCrewPersonalSpawnLocation[2], TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player))
5219 lanaClone->GetMotionMaster()->MovePath(PATH_LANA_PLAINS, false);
5220
5221 if (Creature* jinhake = FindCreatureIgnorePhase(player, "jinhake_darkmaul_plains"))
5222 if (Creature* jinhakeClone = jinhake->SummonPersonalClone(HordeCrewPersonalSpawnLocation[3], TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player))
5223 jinhakeClone->GetMotionMaster()->MovePath(PATH_JINHAKE_PLAINS, false);
5224
5225 if (Creature* throg = FindCreatureIgnorePhase(player, "throg_darkmaul_plains"))
5226 if (Creature* throgClone = throg->SummonPersonalClone(HordeCrewPersonalSpawnLocation[4], TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player))
5227 throgClone->GetMotionMaster()->MovePath(PATH_THROG_PLAINS, false);
5228 }
5229 break;
5230 default:
5231 break;
5232 }
5233 }
5234 }
5235
5236private:
5238};
5239
5241{
5242 if (Player* player = ObjectAccessor::GetPlayer(*creature, creature->GetOwnerGUID()))
5243 {
5244 if (player->GetQuestStatus(QUEST_THE_CHOPPY_BOOSTER_MK5) == QUEST_STATUS_INCOMPLETE)
5245 return new npc_choppy_booster_scout(creature);
5246 }
5247 return new NullCreatureAI(creature);
5248};
5249
5250// 167909 - Won'sa
5251// 167910 - Bo
5252// 167911 - Lana Jordan
5253// 167912 - Provisoner Jin'hake
5254// 167913 - Grunt Throg
5256{
5258
5259 void WaypointPathEnded(uint32 /*nodeId*/, uint32 /*pathId*/) override
5260 {
5262 }
5263};
5264
5266{
5267 if (creature->IsPrivateObject())
5268 return new npc_horde_crew_plains_private(creature);
5269
5270 return new NullCreatureAI(creature);
5271};
5272
5273static constexpr Position CopterCloneSpawnPosition = { 100.583f, -2417.87f, 90.268f, 0.0f };
5274
5275// Quest 55193 - The Scout-o-Matic 5000 "Alliance"
5276// Quest 59940 - The Choppy Booster Mk. 5 "Horde"
5278{
5279public:
5280 quest_scout_chopper(char const* script) : QuestScript(script) { }
5281
5282 void HandleQuestStatusChange(Player* player, QuestStatus newStatus, std::string_view goblinString, std::string_view copterString)
5283 {
5284 switch (newStatus)
5285 {
5287 {
5288 Creature* goblin = FindCreatureIgnorePhase(player, goblinString, 10.0f);
5289 Creature* copter = FindCreatureIgnorePhase(player, copterString, 10.0f);
5290 if (!goblin || !copter)
5291 return;
5292
5293 Creature* goblinPersonal = goblin->SummonPersonalClone(goblin->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
5294 Creature* copterPersonal = copter->SummonPersonalClone(CopterCloneSpawnPosition, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
5295 if (!goblinPersonal || !copterPersonal)
5296 return;
5297
5298 copterPersonal->SetObjectScale(0.2f);
5299 copterPersonal->RemoveNpcFlag(UNIT_NPC_FLAG_SPELLCLICK);
5300
5302 personalAI->SetCopterGUID(copterPersonal->GetGUID());
5303
5304 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
5305 break;
5306 }
5307 case QUEST_STATUS_NONE:
5308 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
5309 break;
5310 default:
5311 break;
5312 }
5313 }
5314};
5315
5316// 55193 - The Scout-o-Matic 5000 "Alliance"
5318{
5319public:
5320 quest_scout_o_matic_5000() : quest_scout_chopper("quest_scout_o_matic_5000") { }
5321
5322 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
5323 {
5324 HandleQuestStatusChange(player, newStatus, "lindie_springstock_plains", "scout_o_matic");
5325 }
5326};
5327
5328// 59940 - The Choppy Booster Mk. 5 "Horde"
5330{
5331public:
5332 quest_choppy_booster_mk5() : quest_scout_chopper("quest_choppy_booster_mk5") { }
5333
5334 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
5335 {
5336 HandleQuestStatusChange(player, newStatus, "cork_fizzlepop_plains", "choppy_booster");
5337 }
5338};
5339
5340// Quest 56034 - Re-sizing the Situation "Alliance"
5341// Quest 59941 - Re-sizing the Situation "Horde"
5343{
5346
5349
5352
5354
5359};
5360
5361Position ResizingGuardianPosition = { 100.56077f, -2418.0713f, 90.34765f };
5362
5363// 156749 - Lindie Springstock
5365{
5367
5368 void JustAppeared() override
5369 {
5370 Unit* owner = me->GetOwner();
5371
5372 Player* player = owner->ToPlayer();
5373 if (!player)
5374 return;
5375
5376 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_RESIZING_QUEST_ACCEPT, player, *player, player->GetGUID(), nullptr, false);
5377 if (!conversation)
5378 return;
5379
5380 conversation->AddActor(0, 0, player->GetGUID());
5381 conversation->AddActor(ACTOR_LINDIE_RESIZING_QUEST, 1, me->GetGUID());
5383 conversation->Start();
5384
5386 }
5387
5388 void MovementInform(uint32 uiType, uint32 uiId) override
5389 {
5390 if (uiType != POINT_MOTION_TYPE)
5391 return;
5392
5393 if (uiId != 0)
5394 return;
5395
5396 if (Unit* owner = me->GetOwner())
5397 owner->CastSpell(owner, SPELL_LINDIE_DESUMMON_Q56034);
5398 }
5399
5400 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
5401 {
5402 if (spellInfo->Id != SPELL_PING_LINDIE_Q56034_Q59941)
5403 return;
5404
5406 }
5407
5408 void UpdateAI(uint32 diff) override
5409 {
5410 _events.Update(diff);
5411
5412 while (uint32 eventId = _events.ExecuteEvent())
5413 {
5414 switch (eventId)
5415 {
5417 {
5418 if (Unit* owner = me->GetOwner())
5419 me->GetMotionMaster()->MoveFollow(owner, 0.0f, float(M_PI / 4.0f));
5420 break;
5421 }
5423 {
5425 break;
5426 }
5427 default:
5428 break;
5429 }
5430 }
5431 }
5432
5433private:
5435};
5436
5437// 167915 - Cork Fizzlepop
5439{
5441
5442 void JustAppeared() override
5443 {
5444 Unit* owner = me->GetOwner();
5445 if (!owner)
5446 return;
5447
5448 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_RESIZING_QUEST_ACCEPT, owner, *owner, owner->GetGUID(), nullptr, false);
5449 if (!conversation)
5450 return;
5451
5452 conversation->AddActor(0, 0, owner->GetGUID());
5454 conversation->AddActor(ACTOR_CORK_RESIZING_QUEST, 2, me->GetGUID());
5455 conversation->Start();
5456
5458 }
5459
5460 void MovementInform(uint32 uiType, uint32 uiId) override
5461 {
5462 if (uiType != POINT_MOTION_TYPE)
5463 return;
5464
5465 if (uiId != 0)
5466 return;
5467
5468 if (Unit* owner = me->GetOwner())
5469 {
5470 owner->CastSpell(owner, SPELL_UPDATE_PHASE_SHIFT);
5472 }
5473 }
5474
5475 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
5476 {
5477 if (spellInfo->Id != SPELL_PING_LINDIE_Q56034_Q59941)
5478 return;
5479
5480 Unit* owner = me->GetOwner();
5481 if (!owner)
5482 return;
5483
5484 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_RESIZING_REPORT_BACK, owner, *owner, owner->GetGUID(), nullptr, false);
5485 if (!conversation)
5486 return;
5487
5488 conversation->AddActor(0, 0, owner->GetGUID());
5490 conversation->AddActor(ACTOR_CORK_RESIZING_QUEST, 2, me->GetGUID());
5491 conversation->Start();
5492
5494 }
5495
5496 void UpdateAI(uint32 diff) override
5497 {
5498 _events.Update(diff);
5499
5500 while (uint32 eventId = _events.ExecuteEvent())
5501 {
5502 switch (eventId)
5503 {
5505 {
5506 if (Unit* owner = me->GetOwner())
5507 me->GetMotionMaster()->MoveFollow(owner, 0.0f, float(M_PI / 4.0f));
5508 break;
5509 }
5511 {
5513 break;
5514 }
5515 default:
5516 break;
5517 }
5518 }
5519 }
5520
5521private:
5523};
5524
5526{
5529
5531
5532 SOUND_GROW_Q56034 = 157469
5534
5535Position GiantBoarPosition = { 116.146f, -2430.48f, 90.508415f };
5536
5537// 156736 - Wandering Boar
5539{
5541
5542 void JustAppeared() override
5543 {
5545 }
5546
5547 void MovementInform(uint32 uiType, uint32 uiId) override
5548 {
5549 if (uiType != POINT_MOTION_TYPE)
5550 return;
5551
5552 if (uiId != POINT_HOME_POSITION)
5553 return;
5554
5555 me->SetFacingTo(0.785398f);
5556
5557 if (Unit* summoner = me->GetDemonCreator())
5558 summoner->CastSpell(summoner, SPELL_UPDATE_PHASE_SHIFT);
5559
5561 }
5562
5563 void UpdateAI(uint32 diff) override
5564 {
5565 _events.Update(diff);
5566
5567 while (uint32 eventId = _events.ExecuteEvent())
5568 {
5569 switch (eventId)
5570 {
5571 case EVENT_BOAR_GROW:
5575 break;
5576 case EVENT_BOAR_MOVE:
5577 me->SetWalk(false);
5579 break;
5580 default:
5581 break;
5582 }
5583 }
5584 }
5585
5586private:
5588};
5589
5590// Spell 305749 - Summon Admiral Garrick Guardian
5591// Spell 326635 - Summon Cork (DNT)
5593{
5594 // @TODO: drop after TARGET_UNK_142 impl
5595
5597 {
5598 Unit* caster = GetCaster();
5599 if (!caster)
5600 return;
5601
5602 Player* player = caster->ToPlayer();
5603 if (!player)
5604 return;
5605
5606 Creature* survivor = FindCreatureIgnorePhase(player, player->GetTeam() == ALLIANCE ? "lindie_springstock_plains" : "cork_fizzlepop_plains", 5.0f);
5607 if (!survivor)
5608 return;
5609
5610 target = survivor;
5611 }
5612
5613 void Register() override
5614 {
5616 }
5617};
5618
5620{
5624
5627
5630
5637
5638// 305716 - Re-Sizing
5640{
5642 {
5643 if (!GetExplTargetUnit())
5645
5646 Creature* target = GetExplTargetUnit()->ToCreature();
5647 if (!target)
5649
5650 if (target->GetEntry() != NPC_WANDERING_BOAR)
5652
5653 return SPELL_CAST_OK;
5654 }
5655
5656 void Register() override
5657 {
5659 }
5660};
5661
5662// 305716 - Re-Sizing
5664{
5665 bool Validate(SpellInfo const* /*spellInfo*/) override
5666 {
5667 return ValidateSpellInfo(
5668 {
5672 });
5673 }
5674
5675 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
5676 {
5677 Player* player = Object::ToPlayer(GetCaster());
5678 Creature* creature = Object::ToCreature(GetTarget());
5679 if (!player || !creature)
5680 return;
5681
5683 {
5684 case 0:
5685 player->CastSpell(creature, SPELL_RESIZER_HIT_ONE_Q56034_Q59941, true);
5686 creature->DespawnOrUnsummon(2s);
5687 break;
5688 case 1:
5689 player->CastSpell(creature, SPELL_RESIZER_HIT_TWO_Q56034_Q59941, true);
5690 creature->DespawnOrUnsummon();
5691 break;
5692 case 2:
5693 player->CastSpell(creature, SPELL_RESIZER_HIT_THREE_Q56034, true);
5694 player->CastSpell(player, SPELL_PING_LINDIE_Q56034_Q59941, true);
5695 creature->DespawnOrUnsummon();
5696 break;
5697 default:
5698 break;
5699 }
5700 }
5701
5702 void Register() override
5703 {
5705 }
5706};
5707
5708// 305724 - Resizer Hit
5709// 305721 - Resizer Hit
5711{
5713 {
5714 PreventHitDefaultEffect(effIndex);
5715 }
5716
5718 {
5719 Player* player = Object::ToPlayer(GetCaster());
5720 if (!player)
5721 return;
5722
5724
5725 Creature* guardian = player->FindNearestCreatureWithOptions(10.0f, { .CreatureId = guardianID, .OwnerGuid = player->GetGUID() });
5726 if (!guardian)
5727 return;
5728
5729 Conversation* conversation = Conversation::CreateConversation(GetSpellInfo()->GetEffect(effIndex).MiscValue, player, *player, player->GetGUID(), nullptr, false);
5730 if (!conversation)
5731 return;
5732
5733 conversation->AddActor(0, 0, player->GetGUID());
5734 conversation->AddActor(ACTOR_LINDIE_RESIZING_QUEST, 1, player->GetTeam() == ALLIANCE ? guardian->GetGUID() : ObjectGuid::Empty);
5735 conversation->AddActor(ACTOR_CORK_RESIZING_QUEST, 2, player->GetTeam() == ALLIANCE ? ObjectGuid::Empty : guardian->GetGUID());
5736 conversation->Start();
5737 }
5738
5739 void Register() override
5740 {
5743 }
5744};
5745
5746// 305742 - Resizer Hit
5748{
5750 {
5751 PreventHitDefaultEffect(effIndex);
5752 }
5753
5755 {
5756 Player* player = Object::ToPlayer(GetCaster());
5757 if (!player)
5758 return;
5759
5761
5762 Creature* guardian = player->FindNearestCreatureWithOptions(10.0f, { .CreatureId = guardianID, .OwnerGuid = player->GetGUID() });
5763 if (!guardian)
5764 return;
5765
5766 Conversation* conversation = Conversation::CreateConversation(GetSpellInfo()->GetEffect(effIndex).MiscValue, player, *player, player->GetGUID(), nullptr, false);
5767 if (!conversation)
5768 return;
5769
5770 conversation->AddActor(0, 0, player->GetGUID());
5771 conversation->AddActor(ACTOR_LINDIE_RESIZING_QUEST, 1, player->GetTeam() == ALLIANCE ? guardian->GetGUID() : ObjectGuid::Empty);
5772 conversation->AddActor(ACTOR_CORK_RESIZING_QUEST, 2, player->GetTeam() == ALLIANCE ? ObjectGuid::Empty : guardian->GetGUID());
5773 conversation->Start();
5774 }
5775
5776 void Register() override
5777 {
5780 }
5781};
5782
5783// 325346 - Re-Sizing
5785{
5786 bool Validate(SpellInfo const* /*spellInfo*/) override
5787 {
5788 return ValidateSpellInfo(
5789 {
5793 });
5794 }
5795
5797 {
5798 if (!GetExplTargetUnit())
5800
5801 Creature* target = GetExplTargetUnit()->ToCreature();
5802 if (!target)
5804
5805 if (target->GetEntry() != NPC_WANDERING_BOAR)
5807
5808 return SPELL_CAST_OK;
5809 }
5810
5811 void HandleScript(SpellEffIndex /*effIndex*/)
5812 {
5813 Player* player = Object::ToPlayer(GetCaster());
5814 Creature* creature = Object::ToCreature(GetHitUnit());
5815 if (!player || !creature)
5816 return;
5817
5819 {
5820 case 0:
5821 case 1:
5822 player->CastSpell(creature, SPELL_RESIZING_Q59941, true);
5823 break;
5824 case 2:
5825 player->CastSpell(creature, SPELL_RE_SIZER_OVERCHARGED_Q56034, true);
5826 player->CastSpell(player, SPELL_PING_LINDIE_Q56034_Q59941, true);
5827 creature->DespawnOrUnsummon(3s);
5828 break;
5829 default:
5830 break;
5831 }
5832 }
5833
5834 void Register() override
5835 {
5838 }
5839};
5840
5841// 325345 - Re-Sizing
5843{
5844 bool Validate(SpellInfo const* /*spellInfo*/) override
5845 {
5846 return ValidateSpellInfo(
5847 {
5850 });
5851 }
5852
5853 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
5854 {
5855 Player* player = Object::ToPlayer(GetCaster());
5856 Creature* creature = Object::ToCreature(GetTarget());
5857 if (!player || !creature)
5858 return;
5859
5861 {
5862 case 0:
5863 player->CastSpell(creature, SPELL_RESIZER_HIT_ONE_Q56034_Q59941, true);
5864 creature->DespawnOrUnsummon(2s);
5865 break;
5866 case 1:
5867 player->CastSpell(creature, SPELL_RESIZER_HIT_TWO_Q56034_Q59941, true);
5868 creature->DespawnOrUnsummon();
5869 break;
5870 default:
5871 break;
5872 }
5873 }
5874
5875 void Register() override
5876 {
5878 }
5879};
5880
5881// 325368 - Re-sizer Slaughter (DNT)
5883{
5884 bool Validate(SpellInfo const* /*spellInfo*/) override
5885 {
5886 return ValidateSpellInfo(
5887 {
5889 });
5890 }
5891
5892 void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
5893 {
5895 }
5896
5897 void Register() override
5898 {
5901 }
5902};
5903
5904// 56034 - Re-sizing the Situation "Alliance"
5905// 59941 - Re-sizing the Situation "Horde"
5907{
5908public:
5909 quest_resizing_the_situation(char const* script) : QuestScript(script) { }
5910
5911 void HandleQuestStatusChange(Player* player, QuestStatus newStatus, uint32 SummonSpell)
5912 {
5913 switch (newStatus)
5914 {
5916 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
5917 player->CastSpell(player, SummonSpell);
5918 break;
5919 case QUEST_STATUS_NONE:
5920 player->RemoveAura(SummonSpell);
5921 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
5922 break;
5923 default:
5924 break;
5925 }
5926 }
5927};
5928
5929// 56034 - Re-sizing the Situation "Alliance"
5931{
5932public:
5933 quest_resizing_the_situation_alliance() : quest_resizing_the_situation("quest_resizing_the_situation_alliance") { }
5934
5935 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
5936 {
5938 }
5939};
5940
5941// 59941 - Re-sizing the Situation "Horde"
5943{
5944public:
5945 quest_resizing_the_situation_horde() : quest_resizing_the_situation("quest_resizing_the_situation_horde") { }
5946
5947 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
5948 {
5950 }
5951};
5952
5954{
5957
5967
5968static constexpr Position ReDeatherAbandonTeleportPos = { 102.3f, -2422.5f, 90.1f, 0.764454185962677001f };
5969
5970// 55879 - Ride of the Scientifically Enhanced Boar
5972{
5973public:
5974 quest_ride_of_the_scientifically_enhanced_boar() : QuestScript("quest_ride_of_the_scientifically_enhanced_boar") { }
5975
5976 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
5977 {
5978 switch (newStatus)
5979 {
5981 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
5983 break;
5985 player->CombatStop();
5986 player->CastSpell(player, SPELL_PING_GARRICK_TORGOK);
5987 break;
5989 player->CastSpell(player, SPELL_REUNION_DNT_ALLIANCE);
5994 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
5995 break;
5996 case QUEST_STATUS_NONE:
6002 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
6004 break;
6005 default:
6006 break;
6007 }
6008 }
6009};
6010
6012{
6016
6025
6026// Script scene for Ride of the Scientifically Enhanced Boar quest
6028{
6029public:
6030 scene_darkmaul_plains_skeleton_army_alliance() : SceneScript("scene_darkmaul_plains_skeleton_army_alliance") { }
6031
6032 void OnSceneTriggerEvent(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/, std::string const& triggerName) override
6033 {
6034 if (triggerName == "Trampling Time")
6035 {
6036 player->CastSpell(player, SPELL_ENHANCED_BOAR_TRAMPLE, true);
6037 if (Unit* boar = player->GetVehicleBase())
6038 boar->CastSpell(boar, SPELL_ENHANCED_BOAR_CHARGE, true);
6039 }
6040 else if (triggerName == "Big Kill Credit")
6041 {
6042 player->CastSpell(player, SPELL_ENHANCED_BOAR_KILL_CREDIT, true);
6043
6046 }
6047 else if (triggerName == "Conversation")
6048 {
6049 player->CastSpell(player, SPELL_ENHANCED_BOAR_CHARGE_CONVO, true);
6050 }
6051 else if (triggerName == "Knockback")
6052 {
6053 player->CastSpell(player, SPELL_ENHANCED_BOAR_KNOCKBACK, true);
6054 }
6055 else if (triggerName == "Hint")
6056 {
6057 player->CastSpell(player, SPELL_ENHANCED_BOAR_KNOCKBACK_HINT, true);
6058 }
6059 }
6060};
6061
6062// Spell 305779 - Summon Darkmaul Plains Questgivers (DNT)
6064{
6065 // @TODO: drop after TARGET_UNK_142 impl
6066
6068 {
6069 Player* player = Object::ToPlayer(GetCaster());
6070 if (!player)
6071 return;
6072
6073 Creature* survivor = FindCreatureIgnorePhase(player, "captain_garrick_plains", 5.0f);
6074 if (!survivor)
6075 return;
6076
6077 target = survivor;
6078 }
6079
6080 void Register() override
6081 {
6083 }
6084};
6085
6087{
6091
6092// 173426 - Riding Giant Boar
6094{
6095 bool Validate(SpellInfo const* /*spellInfo*/) override
6096 {
6097 return ValidateSpellInfo(
6098 {
6102 });
6103 }
6104
6105 void OnAuraRemoveHandler(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
6106 {
6107 Player* player = Object::ToPlayer(GetCaster());
6108 if (!player)
6109 return;
6110
6113 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
6114 }
6115
6116 void Register() override
6117 {
6119 }
6120};
6121
6123{
6126
6127// 305742 - Resizer Hit
6129{
6131 {
6132 PreventHitDefaultEffect(effIndex);
6133 }
6134
6136 {
6137 Player* player = Object::ToPlayer(GetCaster());
6138 if (!player)
6139 return;
6140
6141 Creature* garrick = player->FindNearestCreatureWithOptions(10.0f, { .CreatureId = NPC_ALLIANCE_CAPTAIN, .OwnerGuid = player->GetGUID() });
6142 if (!garrick)
6143 return;
6144
6145 Conversation* conversation = Conversation::CreateConversation(GetSpellInfo()->GetEffect(effIndex).MiscValue, player, *player, player->GetGUID(), nullptr, false);
6146 if (!conversation)
6147 return;
6148
6149 conversation->AddActor(ACTOR_ALLIANCE_CAPTAIN, 0, garrick->GetGUID());
6150 conversation->Start();
6151 }
6152
6153 void Register() override
6154 {
6157 }
6158};
6159
6161{
6163
6165
6167
6170
6176
6178
6180
6182
6186
6187Position MoveToPrisonerPosition = { 232.16145f, -2292.5347f, 80.91198f };
6188
6189// 174955 - Captain Garrick
6191{
6193
6194 void JustAppeared() override
6195 {
6196 Player* player = Object::ToPlayer(me->GetOwner());
6197 if (!player)
6198 return;
6199
6200 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_CAPTAIN_GARRICK_RIDE_BOAR_QUEST_ACCEPT, player, *player, player->GetGUID(), nullptr, false);
6201 if (!conversation)
6202 return;
6203
6204 conversation->AddActor(0, 0, player->GetGUID());
6205 conversation->AddActor(ACTOR_ALLIANCE_CAPTAIN, 1, me->GetGUID());
6206 conversation->Start();
6207
6209 me->GetMotionMaster()->MoveFollow(player, 0.0f, float(M_PI / 4.0f));
6210 }
6211
6212 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
6213 {
6214 if (me->GetHealth() <= damage)
6215 damage = me->GetHealth() - 1;
6216 }
6217
6218 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
6219 {
6220 switch (spellInfo->Id)
6221 {
6223 {
6224 Unit* owner = me->GetOwner();
6225 if (!owner)
6226 break;
6227
6230
6232 break;
6233 }
6235 {
6238 break;
6239 }
6241 {
6242 Player* player = Object::ToPlayer(me->GetOwner());
6243 if (!player)
6244 break;
6245
6246 Creature* henry = FindCreatureIgnorePhase(me, "henry_garrick_ogre_ruins_prisoner");
6247 if (!henry)
6248 break;
6249
6250 Creature* henryPersonal = henry->SummonPersonalClone(henry->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
6251 if (!henryPersonal)
6252 break;
6253
6255 _henryGUID = henryPersonal->GetGUID();
6257 break;
6258 }
6259 default:
6260 break;
6261 }
6262 }
6263
6264 void UpdateAI(uint32 diff) override
6265 {
6266 _events.Update(diff);
6267
6268 while (uint32 eventId = _events.ExecuteEvent())
6269 {
6270 switch (eventId)
6271 {
6273 {
6274 if (Unit* owner = me->GetOwner())
6275 {
6276 Creature* boar = owner->FindNearestCreatureWithOptions(10.0f, { .CreatureId = NPC_GIANT_BOAR, .OwnerGuid = owner->GetGUID() });
6277 if (!boar)
6278 return;
6279
6280 boar->SetControlled(false, UNIT_STATE_ROOT);
6282 }
6283 break;
6284 }
6286 {
6287 Player* player = Object::ToPlayer(me->GetOwner());
6288 if (!player)
6289 break;
6290
6291 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_CAPTAIN_GARRICK_RIDE_BOAR_QUEST_HENRY, player, *player, player->GetGUID(), nullptr, false);
6292 if (!conversation)
6293 break;
6294
6295 conversation->AddActor(ACTOR_ALLIANCE_CAPTAIN, 0, me->GetGUID());
6297 conversation->Start();
6298
6299 me->GetMotionMaster()->Clear();
6302 break;
6303 }
6305 {
6308 henry->DespawnOrUnsummon();
6309
6310 Player* player = Object::ToPlayer(me->GetOwner());
6311 if (!player)
6312 break;
6313 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
6314 break;
6315 }
6317 {
6318 Player* player = Object::ToPlayer(me->GetOwner());
6319 if (!player)
6320 break;
6321
6322 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_CAPTAIN_GARRICK_RIDE_BOAR_QUEST_EXIT, player, *player, player->GetGUID(), nullptr, false);
6323 if (!conversation)
6324 break;
6325
6326 conversation->AddActor(0, 0, player->GetGUID());
6327 conversation->AddActor(ACTOR_ALLIANCE_CAPTAIN, 1, me->GetGUID());
6328 conversation->Start();
6329 break;
6330 }
6331 default:
6332 break;
6333 }
6334 }
6335
6336 UpdateVictim();
6337 }
6338private:
6341};
6342
6344{
6351
6354
6357
6358// 156267 - Giant Boar
6360{
6362 {
6363 me->SetOrientation(0.844224f);
6364 }
6365
6366 void JustAppeared() override
6367 {
6368 me->SetSpeed(MOVE_RUN, 14.0f);
6369 }
6370
6371 void PassengerBoarded(Unit* passenger, int8 /*seatId*/, bool apply) override
6372 {
6373 if (apply && passenger->IsPlayer())
6374 {
6376 passenger->SetMovedUnit(me);
6377 passenger->CastSpell(passenger, SPELL_PING_GARRICK_TO_RIDE_BOAR); // Ping Garrick to ride Boar (DNT)
6378 passenger->CastSpell(passenger, SPELL_UPDATE_PHASE_SHIFT);
6379 }
6380 else if (apply && passenger->IsCreature())
6381 {
6383 }
6384 }
6385
6386 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
6387 {
6388 if (spellInfo->Id == SPELL_ENHANCED_BOAR_PING_VEHICLE)
6389 {
6393 _endOfScene = true;
6395
6396 if (Unit* owner = me->GetOwner())
6397 owner->CastSpell(owner, SPELL_UPDATE_PHASE_SHIFT);
6398 }
6399 }
6400
6401 void UpdateAI(uint32 diff) override
6402 {
6403 if (!_endOfScene)
6404 return;
6405
6406 _events.Update(diff);
6407
6408 while (uint32 eventId = _events.ExecuteEvent())
6409 {
6410 switch (eventId)
6411 {
6414 me->SetObjectScale(1.2f);
6416 break;
6419 me->SetObjectScale(0.7f);
6421 break;
6424 me->SetObjectScale(1.2f);
6426 break;
6429 me->SetObjectScale(0.1f);
6431 break;
6433 me->RemoveAllAuras();
6435 break;
6438 break;
6439 default:
6440 break;
6441 }
6442 }
6443 }
6444private:
6447};
6448
6450{
6453
6455
6457
6459 SPELL_SOUL_GRASP = 319298
6461
6462// 162817 - Torgok
6464{
6465 npc_torgok_q55879(Creature* creature) : ScriptedAI(creature) { }
6466
6467 void Reset() override
6468 {
6469 _events.Reset();
6470 }
6471
6472 void JustEngagedWith(Unit* who) override
6473 {
6474 Talk(SAY_AGGRO, who);
6475
6478 }
6479
6480 void JustDied(Unit* killer) override
6481 {
6482 Talk(SAY_DEATH, killer);
6483
6484 for (auto const& [playerGuid, loot] : me->m_personalLoot)
6485 {
6486 if (Player* player = ObjectAccessor::GetPlayer(*me, playerGuid))
6487 {
6488 for (LootItem const& lootItem : loot->items)
6489 {
6490 if (lootItem.itemid == ITEM_TORGOKS_REAGENT_POUCH)
6491 {
6492 player->SetRewardedQuest(QUEST_TORGOKS_REAGENT_POUCH_DROPPED);
6493 break;
6494 }
6495 }
6496 }
6497 }
6498 }
6499
6500 void UpdateAI(uint32 diff) override
6501 {
6502 if (!UpdateVictim())
6503 return;
6504
6505 _events.Update(diff);
6506
6507 while (uint32 eventId = _events.ExecuteEvent())
6508 {
6509 switch (eventId)
6510 {
6514 break;
6518 break;
6519 default:
6520 break;
6521 }
6522 }
6523 }
6524private:
6526};
6527
6529{
6530 PATH_PRISONER_TO_GROUND = 80000230
6532
6533// 156799 - Henry Garrick
6534// 167126 - Shuja Grimaxe
6536{
6538
6539 void InitializeAI() override
6540 {
6542 }
6543
6544 void JustAppeared() override
6545 {
6546 me->RemoveAllAuras();
6548 }
6549};
6550
6552{
6553 if (creature->IsPrivateObject())
6554 return new npc_prisoner_q55879_private(creature);
6555 else
6556 return new NullCreatureAI(creature);
6557};
6558
6560{
6563
6566
6568
6570
6572
6578
6579// 59942 - The Re-Deather
6581{
6582public:
6583 quest_the_re_deather() : QuestScript("quest_the_re_deather") { }
6584
6585 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
6586 {
6587 switch (newStatus)
6588 {
6590 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
6592 break;
6594 player->CombatStop();
6595 player->CastSpell(player, SPELL_PING_GARRICK_TORGOK);
6596 break;
6598 player->CastSpell(player, SPELL_REUNION_DNT_HORDE);
6603 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
6604 break;
6605 case QUEST_STATUS_NONE:
6606 {
6613 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
6615 break;
6616 }
6617 default:
6618 break;
6619 }
6620 }
6621};
6622
6623// 2489
6625{
6626public:
6627 scene_darkmaul_plains_skeleton_army_horde() : SceneScript("scene_darkmaul_plains_skeleton_army_horde") { }
6628
6629 void OnSceneTriggerEvent(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/, std::string const& triggerName) override
6630 {
6631 if (triggerName == "Big Kill Credit")
6632 {
6633 player->CastSpell(player, SPELL_ENHANCED_BOAR_KILL_CREDIT, true);
6634
6636 {
6637 player->CastSpell(player, SPELL_ENHANCED_BOAR_PING_VEHICLE); // Ping Vehicle
6638 player->CastSpell(player, SPELL_RE_DEATHER_TEMP_OBJECTIVE_CHECK); // Temp Objective Check
6639 Conversation::CreateConversation(CONVERSATION_RE_DEATHER_EXPLODE, player, *player, player->GetGUID(), nullptr);
6640 }
6641 }
6642 else if (triggerName == "Conversation")
6643 {
6644 player->CastSpell(player, SPELL_ENHANCED_BOAR_CHARGE_CONVO, true); // Does nothing but it's blizzlike
6645 }
6646 else if (triggerName == "Teleport")
6647 {
6649 }
6650 }
6651
6652 void OnSceneComplete(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) override
6653 {
6654 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
6655 }
6656};
6657
6659{
6663
6667
6668// 167146 - Warlord Grimaxe
6670{
6672 {
6674 }
6675
6676 void JustAppeared() override
6677 {
6678 Player* player = Object::ToPlayer(me->GetOwner());
6679 if (!player)
6680 return;
6681
6682 Creature* shuja = FindCreatureIgnorePhase(me, "shuja_grimaxe_ogre_ruins_prisoner");
6683 if (!shuja)
6684 return;
6685
6686 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_WARLORD_GRIMAXE_SPAWN_Q59942, player, *player, player->GetGUID(), nullptr, false);
6687 if (!conversation)
6688 return;
6689
6690 conversation->AddActor(ACTOR_SHUJA_GRIMAXE_PRISONER, 0, shuja->GetGUID());
6691 conversation->AddActor(ACTOR_WARLORD_GRIMAXE_Q59942, 1, me->GetGUID());
6692 conversation->Start();
6693
6694 me->GetMotionMaster()->MoveFollow(player, 0.0f, float(M_PI / 4.0f));
6695 }
6696
6697 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
6698 {
6699 if (me->GetHealth() <= damage)
6700 damage = me->GetHealth() - 1;
6701 }
6702
6703 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
6704 {
6705 switch (spellInfo->Id)
6706 {
6708 {
6709 Player* player = Object::ToPlayer(me->GetOwner());
6710 if (!player)
6711 break;
6712
6713 Creature* shuja = FindCreatureIgnorePhase(me, "shuja_grimaxe_ogre_ruins_prisoner");
6714 if (!shuja)
6715 break;
6716
6717 Creature* shujaPersonal = shuja->SummonPersonalClone(shuja->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
6718 if (!shujaPersonal)
6719 break;
6720
6722 _shujaGUID = shujaPersonal->GetGUID();
6724 break;
6725 }
6726 default:
6727 break;
6728 }
6729 }
6730
6731 void OnDespawn() override
6732 {
6734 shuja->DespawnOrUnsummon();
6735 }
6736
6737 void UpdateAI(uint32 diff) override
6738 {
6739 _events.Update(diff);
6740
6741 while (uint32 eventId = _events.ExecuteEvent())
6742 {
6743 switch (eventId)
6744 {
6746 {
6747 Player* player = Object::ToPlayer(me->GetOwner());
6748 if (!player)
6749 break;
6750
6751 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_WARLORD_GRIMAXE_QUEST_COMPLETE_Q59942, player, *player, player->GetGUID(), nullptr, false);
6752 if (!conversation)
6753 break;
6754
6755 conversation->AddActor(ACTOR_WARLORD_GRIMAXE_Q59942, 0, me->GetGUID());
6757 conversation->Start();
6758
6759 me->GetMotionMaster()->Clear();
6762 break;
6763 }
6765 {
6768 shuja->DespawnOrUnsummon();
6769
6770 Player* player = Object::ToPlayer(me->GetOwner());
6771 if (!player)
6772 break;
6773 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
6774 break;
6775 }
6776 default:
6777 break;
6778 }
6779 }
6780
6781 UpdateVictim();
6782 }
6783private:
6786};
6787
6788// ***************************************************************
6789// * Scripting in this section occurs between Ogre Ruins and Pit *
6790// ***************************************************************
6791
6793{
6797 NPC_WONSA_PIT_ONE = 167226
6799
6800static constexpr Position BjornWestwardBoundRuinsPos = { 192.181f, -2311.44f, 80.6975f, 3.368485450744628906f };
6801static constexpr Position AlariaWestwardBoundRuinsPos = { 190.953f, -2308.32f, 80.6586f, 2.984513044357299804f };
6802static constexpr Position LanaWestwardBoundRuinsPos = { 160.486f, -2307.31f, 84.053f, 2.932153224945068359f };
6803static constexpr Position WonsaWestwardBoundRuinsPos = { 160.431f, -2310.11f, 84.4598f, 3.03687286376953125f };
6804
6805// 55965 - Quest Westward Bound "Alliance"
6806// 59948 - Quest Westward Bound "Horde"
6808{
6809public:
6810 quest_westward_bound(char const* script) : QuestScript(script) { }
6811
6812 void HandleQuestStatusChange(Player* player, QuestStatus newStatus, std::string_view creatureStringOne, std::string_view creatureStringTwo, uint32 questEnderEntry, uint32 questEnderCompanionEntry, Position questGiverPos, Position companionPos)
6813 {
6814 switch (newStatus)
6815 {
6817 {
6818 Creature* questEnder = FindCreatureIgnorePhase(player, creatureStringOne, 125.0f);
6819 if (!questEnder)
6820 return;
6821
6822 Creature* questEnderCompanion = FindCreatureIgnorePhase(player, creatureStringTwo, 125.0f);
6823 if (!questEnderCompanion)
6824 return;
6825
6826 questEnder->SummonPersonalClone(questGiverPos, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
6827 questEnderCompanion->SummonPersonalClone(companionPos, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
6828
6829 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
6830 break;
6831 }
6832 case QUEST_STATUS_NONE:
6833 {
6834 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
6835
6836 if (Creature* questGiver = player->FindNearestCreatureWithOptions(100.0f, { .CreatureId = questEnderEntry, .IgnorePhases = true, .PrivateObjectOwnerGuid = player->GetGUID() }))
6837 questGiver->DespawnOrUnsummon();
6838
6839 if (Creature* companion = player->FindNearestCreatureWithOptions(100.0f, { .CreatureId = questEnderCompanionEntry, .IgnorePhases = true, .PrivateObjectOwnerGuid = player->GetGUID() }))
6840 companion->DespawnOrUnsummon();
6841
6842 break;
6843 }
6844 default:
6845 break;
6846 }
6847 }
6848};
6849
6850// 55965 - Quest Westward Bound "Alliance"
6852{
6853public:
6854 quest_westward_bound_alliance() : quest_westward_bound("quest_westward_bound_alliance") { }
6855
6856 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
6857 {
6858 HandleQuestStatusChange(player, newStatus, "bjorn_stouthands_pit_pre_quest", "alaria_pit_pre_quest", NPC_BJORN_STOUTHANDS_PIT_ONE, NPC_ALARIA_PIT_ONE, BjornWestwardBoundRuinsPos, AlariaWestwardBoundRuinsPos);
6859 }
6860};
6861
6862// 59948 - Quest Westward Bound "Horde"
6864{
6865public:
6866 quest_westward_bound_horde() : quest_westward_bound("quest_westward_bound_horde") { }
6867
6868 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
6869 {
6870 HandleQuestStatusChange(player, newStatus, "lana_joran_pit_pre_quest", "wonsa_pit_pre_quest", NPC_LANAJORDAN_PIT_ONE, NPC_WONSA_PIT_ONE, LanaWestwardBoundRuinsPos, WonsaWestwardBoundRuinsPos);
6871 }
6872};
6873
6875{
6877
6879
6883
6884// 156891 - Bjorn Stouthands
6886{
6888
6889 void InitializeAI() override
6890 {
6892 }
6893
6894 void JustAppeared() override
6895 {
6897 }
6898
6899 void WaypointPathEnded(uint32 /*nodeId*/, uint32 /*pathId*/) override
6900 {
6902 me->DespawnOrUnsummon(4s);
6903 }
6904
6905 void UpdateAI(uint32 diff) override
6906 {
6907 _events.Update(diff);
6908
6909 while (uint32 eventId = _events.ExecuteEvent())
6910 {
6911 switch (eventId)
6912 {
6916 break;
6917 default:
6918 break;
6919 }
6920 }
6921 }
6922private:
6924};
6925
6927{
6928 if (creature->IsPrivateObject())
6929 return new npc_bjorn_stouthands_q55965_private(creature);
6930 else
6931 return new NullCreatureAI(creature);
6932};
6933
6935{
6938
6940
6944
6945// 167225 - Lana Jordan
6947{
6949
6950 void InitializeAI() override
6951 {
6953 }
6954
6955 void JustAppeared() override
6956 {
6958 }
6959
6960 void WaypointPathEnded(uint32 /*nodeId*/, uint32 /*pathId*/) override
6961 {
6963 me->DespawnOrUnsummon(7s);
6964 }
6965
6966 void UpdateAI(uint32 diff) override
6967 {
6968 _events.Update(diff);
6969
6970 while (uint32 eventId = _events.ExecuteEvent())
6971 {
6972 switch (eventId)
6973 {
6977 break;
6980 break;
6981 default:
6982 break;
6983 }
6984 }
6985 }
6986private:
6988};
6989
6991{
6992 if (creature->IsPrivateObject())
6993 return new npc_lana_jordan_q59948_private(creature);
6994 else
6995 return new NullCreatureAI(creature);
6996};
6997
6999{
7001
7003 PATH_WONSA_RUN_TO_PIT = 80000580
7005
7006// 156891 - Alaria
7007// 167226 - Won'sa
7008template<uint32 PitPathId>
7010{
7012
7013 void JustAppeared() override
7014 {
7016 }
7017
7018 void WaypointPathEnded(uint32 /*nodeId*/, uint32 /*pathId*/) override
7019 {
7020 me->DespawnOrUnsummon(1s);
7021 }
7022
7023 void UpdateAI(uint32 diff) override
7024 {
7025 _events.Update(diff);
7026
7027 while (uint32 eventId = _events.ExecuteEvent())
7028 {
7029 switch (eventId)
7030 {
7032 me->GetMotionMaster()->MovePath(PitPathId, false);
7033 break;
7034 default:
7035 break;
7036 }
7037 }
7038 }
7039private:
7041};
7042
7044{
7045 if (creature->IsPrivateObject())
7047 else
7048 return new NullCreatureAI(creature);
7049};
7050
7052{
7053 if (creature->IsPrivateObject())
7055 else
7056 return new NullCreatureAI(creature);
7057};
7058
7060{
7061 // Ship
7063 new q59926_warming_up();
7064 new q56775_warming_up();
7078 // Beach
7085 new FactoryCreatureScript<CreatureAI, &HealedByLeaderAllianceAISelector>("npc_healed_by_leader_alliance_beach");
7086 new FactoryCreatureScript<CreatureAI, &HealedByLeaderHordeAISelector>("npc_healed_by_leader_horde_beach");
7090 // Note: alliance survivor do not need a script for Emergency First Aid quest
7097 new FactoryCreatureScript<CreatureAI, &MithdranBeachStandingAISelector>("npc_mithdran_dawntracker_beach_standing");
7100 new FactoryCreatureScript<CreatureAI, &BjornBeachStandingAISelector>("npc_bjorn_stouthands_beach_standing");
7101 new FactoryCreatureScript<CreatureAI, &AustinBeachStandingAISelector>("npc_austin_huxworth_beach_standing");
7107 // Abandoned Camp
7114 // Quest Enhanced Combat Tactics
7120 // Quest Northbound
7127 // Quest Taming The Wilds
7134 // Briarpatch
7140 new GenericCreatureScript<npc_briarpatch_prisoner>("npc_cork_fizzlepop_briarpatch");
7141 new GenericCreatureScript<npc_briarpatch_prisoner>("npc_lindie_springstock_briarpatch");
7147 // Plains scouting quest
7150 new FactoryCreatureScript<CreatureAI, &LindieSpringstockSelector>("npc_lindie_springstock_plains");
7151 new FactoryCreatureScript<CreatureAI, &CorkFizzlepopSelector>("npc_cork_fizzlepop_plains");
7155 // Plains Resizing the situation
7168 // Ride Boar
7178 // The Re-Deather
7182 // Westward Bound
7185 new FactoryCreatureScript<CreatureAI, &BjornRuinsSelector>("npc_bjorn_stouthands_q55965");
7186 new FactoryCreatureScript<CreatureAI, &LanaRuinsSelector>("npc_lana_jordan_q59948");
7189};
#define M_PI
Definition: Common.h:115
@ EQUIP_NO_CHANGE
Definition: CreatureAI.h:54
uint8_t uint8
Definition: Define.h:144
int8_t int8
Definition: Define.h:140
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
std::chrono::seconds Seconds
Seconds shorthand typedef.
Definition: Duration.h:32
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition: Duration.h:29
@ GRID_MAP_TYPE_MASK_CONVERSATION
Definition: GridDefines.h:88
@ POINT_MOTION_TYPE
@ FOLLOW_MOTION_TYPE
TempSummonType
Definition: ObjectDefines.h:62
@ TEMPSUMMON_MANUAL_DESPAWN
Definition: ObjectDefines.h:70
@ TEMPSUMMON_TIMED_DESPAWN
Definition: ObjectDefines.h:65
@ QUEST_OBJECTIVE_CRITERIA_TREE
Definition: QuestDef.h:346
QuestStatus
Definition: QuestDef.h:141
@ QUEST_STATUS_REWARDED
Definition: QuestDef.h:148
@ QUEST_STATUS_INCOMPLETE
Definition: QuestDef.h:145
@ QUEST_STATUS_NONE
Definition: QuestDef.h:142
@ QUEST_STATUS_COMPLETE
Definition: QuestDef.h:143
Races
Definition: RaceMask.h:26
@ RACE_TROLL
Definition: RaceMask.h:35
@ RACE_UNDEAD_PLAYER
Definition: RaceMask.h:32
@ RACE_ORC
Definition: RaceMask.h:29
@ RACE_DRAENEI
Definition: RaceMask.h:38
@ RACE_NIGHTELF
Definition: RaceMask.h:31
@ RACE_BLOODELF
Definition: RaceMask.h:37
@ RACE_DWARF
Definition: RaceMask.h:30
@ RACE_GNOME
Definition: RaceMask.h:34
@ RACE_GOBLIN
Definition: RaceMask.h:36
@ RACE_HUMAN
Definition: RaceMask.h:28
@ RACE_WORGEN
Definition: RaceMask.h:49
@ RACE_PANDAREN_ALLIANCE
Definition: RaceMask.h:52
@ RACE_PANDAREN_HORDE
Definition: RaceMask.h:53
@ RACE_TAUREN
Definition: RaceMask.h:33
float rand_norm()
Definition: Random.cpp:75
bool roll_chance_f(float chance)
Definition: Random.h:53
#define RegisterCreatureAI(ai_name)
Definition: ScriptMgr.h:1380
#define RegisterSpellAndAuraScriptPair(script_1, script_2)
Definition: ScriptMgr.h:1371
#define RegisterAreaTriggerAI(ai_name)
Definition: ScriptMgr.h:1416
#define RegisterSpellScript(spell_script)
Definition: ScriptMgr.h:1369
#define RegisterSpellScriptWithArgs(spell_script, script_name,...)
Definition: ScriptMgr.h:1368
void GetCreatureListWithEntryInGrid(Container &container, WorldObject *source, uint32 entry, float maxSearchRange)
SpellEffIndex
Definition: SharedDefines.h:29
@ EFFECT_3
Definition: SharedDefines.h:33
@ EFFECT_1
Definition: SharedDefines.h:31
@ EFFECT_0
Definition: SharedDefines.h:30
@ EFFECT_4
Definition: SharedDefines.h:34
@ EFFECT_2
Definition: SharedDefines.h:32
@ CLASS_HUNTER
@ CLASS_DRUID
@ CLASS_SHAMAN
@ CLASS_MONK
@ CLASS_PRIEST
@ CLASS_WARRIOR
@ CLASS_WARLOCK
@ CLASS_MAGE
@ CLASS_PALADIN
@ CLASS_ROGUE
@ TARGET_DEST_NEARBY_ENTRY_OR_DB
@ EMOTE_ONESHOT_CUSTOM_SPELL_01
@ EMOTE_STATE_TALK
@ EMOTE_ONESHOT_SALUTE
@ EMOTE_STATE_NONE
TeamId
@ TEAM_NEUTRAL
@ TEAM_ALLIANCE
@ TEAM_HORDE
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_CREATE_PRIVATE_CONVERSATION
@ SPELL_EFFECT_SEND_EVENT
@ ALLIANCE
@ HORDE
@ POWER_COMBO_POINTS
@ POWER_HOLY_POWER
SpellCastResult
@ SPELL_FAILED_BAD_TARGETS
@ SPELL_CAST_OK
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_CONTROL_VEHICLE
@ SPELL_AURA_DUMMY
@ SPELL_AURA_MOD_ROOT
@ SPELL_AURA_PERIODIC_DUMMY
@ SPELL_AURA_PLAY_SCENE
@ SPELL_AURA_MOD_STUN
@ TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE
Will ignore mounted/on vehicle restrictions.
Definition: SpellDefines.h:260
#define SpellObjectTargetSelectFn(F, I, N)
Definition: SpellScript.h:869
#define SpellCheckCastFn(F)
Definition: SpellScript.h:830
#define SpellEffectFn(F, I, N)
Definition: SpellScript.h:842
#define AuraEffectApplyFn(F, I, N, M)
Definition: SpellScript.h:2029
#define AuraCheckProcFn(F)
Definition: SpellScript.h:2130
#define AuraEffectRemoveFn(F, I, N, M)
Definition: SpellScript.h:2040
EvadeReason
Definition: UnitAICommon.h:30
#define CAST_AI(a, b)
Definition: UnitAI.h:28
@ MOVE_RUN
Definition: UnitDefines.h:118
@ MOVE_WALK
Definition: UnitDefines.h:117
@ REACT_PASSIVE
Definition: UnitDefines.h:506
@ REACT_AGGRESSIVE
Definition: UnitDefines.h:508
@ UNIT_STAND_STATE_SLEEP
Definition: UnitDefines.h:45
@ UNIT_STAND_STATE_STAND
Definition: UnitDefines.h:42
@ UNIT_NPC_FLAG_GOSSIP
Definition: UnitDefines.h:297
@ UNIT_NPC_FLAG_QUESTGIVER
Definition: UnitDefines.h:298
@ UNIT_NPC_FLAG_SPELLCLICK
Definition: UnitDefines.h:321
DamageEffectType
Definition: UnitDefines.h:131
@ SHEATH_STATE_UNARMED
Definition: UnitDefines.h:82
@ UNIT_FLAG_UNINTERACTIBLE
Definition: UnitDefines.h:169
@ UNIT_FLAG_PLAYER_CONTROLLED
Definition: UnitDefines.h:147
@ UNIT_STATE_ROOT
Definition: Unit.h:265
T CalculatePct(T base, U pct)
Definition: Util.h:72
#define sWorldStateMgr
Definition: WorldStateMgr.h:50
AreaTrigger *const at
Definition: AreaTriggerAI.h:33
void RemoveFromWorld() override
Definition: AreaTrigger.cpp:78
Unit * GetCaster() const
HookList< EffectApplyHandler > AfterEffectRemove
Definition: SpellScript.h:2039
HookList< EffectApplyHandler > AfterEffectApply
Definition: SpellScript.h:2028
Unit * GetCaster() const
Unit * GetTarget() const
HookList< CheckProcHandler > DoCheckProc
Definition: SpellScript.h:2129
HookList< EffectApplyHandler > OnEffectRemove
Definition: SpellScript.h:2035
int32 GetMaxDuration() const
Definition: SpellAuras.h:168
int32 GetDuration() const
Definition: SpellAuras.h:173
BaseQuestWarmingUp(const char *name)
void OnQuestStatusChange(Player *player, Quest const *, QuestStatus, QuestStatus newStatus)
void AddActor(int32 actorId, uint32 actorIdx, ObjectGuid const &actorGuid)
static Conversation * CreateConversation(uint32 conversationEntry, Unit *creator, Position const &pos, ObjectGuid privateObjectOwner, SpellInfo const *spellInfo=nullptr, bool autoStart=true)
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
bool UpdateVictim()
Definition: CreatureAI.cpp:245
Creature *const me
Definition: CreatureAI.h:61
void EngagementOver()
Definition: CreatureAI.cpp:287
void SetImmuneToPC(bool apply) override
Definition: Creature.h:170
void SetObjectScale(float scale) override
Definition: Creature.cpp:3391
std::unordered_map< ObjectGuid, std::unique_ptr< Loot > > m_personalLoot
Definition: Creature.h:278
void SetReactState(ReactStates st)
Definition: Creature.h:160
void ResetPlayerDamageReq()
Definition: Creature.h:400
void SetScriptStringId(std::string id)
Definition: Creature.cpp:3170
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
Definition: Creature.cpp:2415
CreatureAI * AI() const
Definition: Creature.h:214
uint32 ExecuteEvent()
Definition: EventMap.cpp:73
void Update(uint32 time)
Definition: EventMap.h:56
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition: EventMap.cpp:36
void CancelEvent(uint32 eventId)
Definition: EventMap.cpp:131
Milliseconds GetTimeUntilEvent(uint32 eventId) const
Definition: EventMap.cpp:175
void RescheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition: EventMap.cpp:52
void Reset()
Definition: EventMap.cpp:21
void MoveJump(Position const &pos, float speedXY, float speedZ, uint32 id=EVENT_JUMP, bool hasOrientation=false, JumpArrivalCastArgs const *arrivalCast=nullptr, Movement::SpellEffectExtraData const *spellEffectExtraData=nullptr)
void MovePath(uint32 pathId, bool repeatable, Optional< Milliseconds > duration={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< std::pair< Milliseconds, Milliseconds > > waitTimeRangeAtPathEnd={}, Optional< float > wanderDistanceAtPathEnds={}, Optional< bool > followPathBackwardsFromEndToStart={}, bool generatePath=true)
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={})
void MoveFollow(Unit *target, float dist, ChaseAngle angle, Optional< Milliseconds > duration={}, MovementSlot slot=MOTION_SLOT_ACTIVE)
void Remove(MovementGenerator *movement, MovementSlot slot=MOTION_SLOT_ACTIVE)
static ObjectGuid const Empty
Definition: ObjectGuid.h:274
static Creature * ToCreature(Object *o)
Definition: Object.h:219
bool IsPlayer() const
Definition: Object.h:212
Player * ToPlayer()
Definition: Object.h:215
uint32 GetEntry() const
Definition: Object.h:161
bool IsCreature() const
Definition: Object.h:218
Creature * ToCreature()
Definition: Object.h:221
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
static Player * ToPlayer(Object *o)
Definition: Object.h:213
static void AddPhase(WorldObject *object, uint32 phaseId, bool updateVisibility)
static void InheritPhaseShift(WorldObject *target, WorldObject const *source)
static void ResetPhaseShift(WorldObject *object)
void KilledMonsterCredit(uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
Definition: Player.cpp:16680
void UpdateQuestObjectiveProgress(QuestObjectiveType objectiveType, int32 objectId, int64 addCount, ObjectGuid victimGuid=ObjectGuid::Empty, std::vector< QuestObjective const * > *updatedObjectives=nullptr, std::function< bool(QuestObjective const *)> const *objectiveFilter=nullptr)
Definition: Player.cpp:16738
int32 GetQuestObjectiveData(uint32 questId, uint32 objectiveId) const
Definition: Player.cpp:16492
void UpdateVisibilityForPlayer()
Definition: Player.cpp:24085
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition: Player.cpp:16050
bool HasSpell(uint32 spell) const override
Definition: Player.cpp:3792
void UpdateObjectVisibility(bool forced=true) override
Definition: Player.cpp:24070
Team GetTeam() const
Definition: Player.h:2235
SpellInfo const * GetSpellInfo() const
Definition: Unit.cpp:280
uint32 GetQuestId() const
Definition: QuestDef.h:587
void ResetCharges(uint32 chargeCategoryId)
uint32 const Id
Definition: SpellInfo.h:325
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Definition: SpellScript.h:162
HookList< CheckCastHandler > OnCheckCast
Definition: SpellScript.h:829
Unit * GetCaster() const
HookList< EffectHandler > OnEffectHit
Definition: SpellScript.h:839
void PreventHitDefaultEffect(SpellEffIndex effIndex)
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
Definition: SpellScript.h:840
HookList< ObjectTargetSelectHandler > OnObjectTargetSelect
Definition: SpellScript.h:868
HookList< EffectHandler > OnEffectLaunchTarget
Definition: SpellScript.h:838
Unit * GetExplTargetUnit() const
SpellInfo const * GetSpellInfo() const
TaskScheduler & Schedule(std::chrono::duration< Rep, Period > time, task_handler_t task)
TaskScheduler & Update(success_t const &callback=nullptr)
Unit * GetSummonerUnit() const
virtual void CalculatePassengerPosition(float &x, float &y, float &z, float *o=nullptr) const =0
This method transforms supplied transport offsets into global coordinates.
virtual int32 GetMapIdForSpawning() const =0
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:159
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.cpp:180
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:161
Definition: Unit.h:627
void CastStop(uint32 except_spellid=0)
Definition: Unit.cpp:1135
float GetHealthPct() const
Definition: Unit.h:784
void CombatStop(bool includingCast=false, bool mutualPvP=true, bool(*unitFilter)(Unit const *otherUnit)=nullptr)
Definition: Unit.cpp:5827
void SetHealth(uint64 val)
Definition: Unit.cpp:9346
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3685
void SetStandState(UnitStandStateType state, uint32 animKitID=0)
Definition: Unit.cpp:10100
void SetControlled(bool apply, UnitState state)
Definition: Unit.cpp:10911
uint8 GetClass() const
Definition: Unit.h:752
Player * GetDemonCreatorPlayer() const
Definition: Unit.cpp:6012
ObjectGuid GetOwnerGUID() const override
Definition: Unit.h:1170
void SetSpeed(UnitMoveType mtype, float newValue)
Definition: Unit.cpp:8520
Unit * GetVehicleBase() const
Definition: Unit.cpp:11480
MotionMaster * GetMotionMaster()
Definition: Unit.h:1652
void SetMovedUnit(Unit *target)
Definition: Unit.cpp:9765
void SetFacingToObject(WorldObject const *object, bool force=true)
Definition: Unit.cpp:12671
bool IsAlive() const
Definition: Unit.h:1164
void RemoveNpcFlag(NPCFlags flags)
Definition: Unit.h:983
TempSummon * ToTempSummon()
Definition: Unit.h:1756
UnitAI * GetAI() const
Definition: Unit.h:660
bool SetDisableGravity(bool disable, bool updateAnimTier=true)
Definition: Unit.cpp:12725
void SetUninteractible(bool apply)
Definition: Unit.cpp:8147
void SetSheath(SheathState sheathed)
Definition: Unit.cpp:5630
void SetEmoteState(Emote emote)
Definition: Unit.h:852
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4560
uint64 GetHealth() const
Definition: Unit.h:776
TransportBase * GetDirectTransport() const
Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)
Definition: Unit.cpp:11520
bool SetWalk(bool enable)
Definition: Unit.cpp:12707
void NearTeleportTo(Position const &pos, bool casting=false)
Definition: Unit.cpp:12327
void SetFacingTo(float const ori, bool force=true)
Definition: Unit.cpp:12653
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4664
void RemoveAllAuras()
Definition: Unit.cpp:4242
SpellHistory * GetSpellHistory()
Definition: Unit.h:1457
void HandleEmoteCommand(Emote emoteId, Player *target=nullptr, Trinity::IteratorPair< int32 const * > spellVisualKitIds={}, int32 sequenceVariation=0)
Definition: Unit.cpp:1598
bool HealthBelowPctDamaged(int32 pct, uint32 damage) const
Definition: Unit.h:781
void SetUnitFlag(UnitFlags flags)
Definition: Unit.h:833
void ChangeSeat(int8 seatId, bool next=true)
Definition: Unit.cpp:12172
uint8 GetRace() const
Definition: Unit.h:749
void RemoveUnitFlag(UnitFlags flags)
Definition: Unit.h:834
void SetAIAnimKitId(uint16 animKitId)
Definition: Unit.cpp:10543
Unit * GetDemonCreator() const
Definition: Unit.cpp:6007
TempSummon * SummonPersonalClone(Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, Player *privateObjectOwner=nullptr)
Definition: Object.cpp:2048
void PlayDirectSound(uint32 soundId, Player const *target=nullptr, uint32 broadcastTextId=0) const
Definition: Object.cpp:3592
Map * GetMap() const
Definition: Object.h:624
Creature * FindNearestCreatureWithOptions(float range, FindCreatureOptions const &options) const
Definition: Object.cpp:2157
ObjectGuid GetPrivateObjectOwner() const
Definition: Object.h:785
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
Definition: Object.cpp:2025
Unit * GetOwner() const
Definition: Object.cpp:2229
TransportBase * GetTransport() const
Definition: Object.h:750
bool IsPrivateObject() const
Definition: Object.h:784
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition: Object.cpp:2148
uint32 GetAreaId() const
Definition: Object.h:546
Position GetFirstCollisionPosition(float dist, float angle)
Definition: Object.cpp:3416
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition: Object.cpp:1142
Player * GetAffectingPlayer() const
Definition: Object.cpp:2261
void OnMovieComplete(Player *player, uint32 movieId) override
static constexpr float CLONE_Z_OFFSET
static constexpr float CLONE_ORIENTATION
void OnQuestStatusChange(Player *player, Quest const *quest, QuestStatus oldStatus, QuestStatus newStatus) override
void OnQuestStatusChange(Player *player, Quest const *quest, QuestStatus oldStatus, QuestStatus newStatus) override
void SpawnActors(Player *player, TeamId team, Position petSpawnPos)
void OnQuestStatusChange(Player *player, Quest const *quest, QuestStatus, QuestStatus newStatus) override
void SpawnPet(Player *player, Position const &position)
void SpawnActor(Player *player, Creature *creature, Position const &position)
void OnQuestStatusChange(Player *player, Quest const *, QuestStatus, QuestStatus newStatus) override
void OnQuestStatusChange(Player *player, Quest const *, QuestStatus, QuestStatus newStatus) override
void HandleQuestStatusChange(Player *player, QuestStatus newStatus, uint32 questDown, uint32 questForbidden, uint32 spellValidated)
quest_briarpatch(char const *script)
void OnQuestStatusChange(Player *player, Quest const *, QuestStatus, QuestStatus newStatus) override
void OnQuestStatusChange(Player *player, Quest const *, QuestStatus, QuestStatus newStatus) override
void OnQuestStatusChange(Player *player, Quest const *, QuestStatus, QuestStatus newStatus) override
void HandleQuestStatusChange(Player *player, QuestStatus newStatus, uint32 completeConversationId, std::string_view injuredStringId)
quest_cooking_meat(char const *script)
void OnQuestStatusChange(Player *player, Quest const *, QuestStatus, QuestStatus newStatus) override
void OnQuestStatusChange(Player *player, Quest const *, QuestStatus, QuestStatus newStatus) override
void OnQuestStatusChange(Player *player, Quest const *, QuestStatus, QuestStatus newStatus) override
void HandleQuestStatusChange(Player *player, QuestStatus newStatus, uint32 summonSpellId, std::string_view survivor1StringId, std::string_view survivor2StringId, std::string_view survivor3StringId)
quest_finding_the_lost_expedition(char const *script)
void OnQuestStatusChange(Player *player, Quest const *, QuestStatus, QuestStatus newStatus) override
void OnQuestStatusChange(Player *player, Quest const *, QuestStatus, QuestStatus newStatus) override
void HandleQuestStatusChange(Player *player, QuestStatus newStatus, uint32 summonSpellId)
quest_northbound(char const *script)
void OnQuestStatusChange(Player *player, Quest const *, QuestStatus, QuestStatus newStatus) override
void OnQuestStatusChange(Player *player, Quest const *, QuestStatus, QuestStatus newStatus) override
void HandleQuestStatusChange(Player *player, QuestStatus newStatus, uint32 SummonSpell)
quest_resizing_the_situation(char const *script)
void OnQuestStatusChange(Player *player, Quest const *, QuestStatus, QuestStatus newStatus) override
quest_scout_chopper(char const *script)
void HandleQuestStatusChange(Player *player, QuestStatus newStatus, std::string_view goblinString, std::string_view copterString)
void OnQuestStatusChange(Player *player, Quest const *, QuestStatus, QuestStatus newStatus) override
void OnQuestStatusChange(Player *player, Quest const *, QuestStatus, QuestStatus newStatus) override
void OnQuestStatusChange(Player *player, Quest const *, QuestStatus, QuestStatus newStatus) override
void OnQuestStatusChange(Player *player, Quest const *, QuestStatus, QuestStatus newStatus) override
quest_taming_the_wilds(char const *script)
void HandleQuestStatusChange(Player *player, QuestStatus newStatus, std::string_view creatureString, uint32 questObjective1, uint32 questObjective2)
void OnQuestStatusChange(Player *player, Quest const *, QuestStatus, QuestStatus newStatus) override
void OnQuestStatusChange(Player *player, Quest const *, QuestStatus, QuestStatus newStatus) override
void OnQuestStatusChange(Player *player, Quest const *, QuestStatus, QuestStatus newStatus) override
quest_westward_bound(char const *script)
void HandleQuestStatusChange(Player *player, QuestStatus newStatus, std::string_view creatureStringOne, std::string_view creatureStringTwo, uint32 questEnderEntry, uint32 questEnderCompanionEntry, Position questGiverPos, Position companionPos)
void OnSceneComplete(Player *player, uint32, SceneTemplate const *) override
void OnSceneTriggerEvent(Player *player, uint32, SceneTemplate const *, std::string const &triggerName) override
void OnSceneCancel(Player *player, uint32, SceneTemplate const *) override
void OnSceneComplete(Player *player, uint32, SceneTemplate const *) override
void OnSceneTriggerEvent(Player *player, uint32, SceneTemplate const *, std::string const &triggerName) override
void OnSceneComplete(Player *player, uint32, SceneTemplate const *) override
void OnSceneTriggerEvent(Player *player, uint32, SceneTemplate const *, std::string const &triggerName) override
bool Validate(SpellInfo const *) override
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
void HandleEffect(SpellEffIndex)
void HandleLaunch(SpellEffIndex effIndex)
void HandleEffect(SpellEffIndex effIndex)
bool Validate(SpellInfo const *) override
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
void RemoveEffect(AuraEffect const *, AuraEffectHandleModes)
void ApplyEffect(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
void OnApply(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
void HandleScript(SpellEffIndex)
void HandleLaunch(SpellEffIndex effIndex)
void HandleEffect(SpellEffIndex effIndex)
void HandleLaunch(SpellEffIndex effIndex)
void HandleEffect(SpellEffIndex effIndex)
bool Validate(SpellInfo const *) override
void OnAuraRemoveHandler(AuraEffect const *, AuraEffectHandleModes)
void HandleLaunch(SpellEffIndex effIndex)
void HandleEffect(SpellEffIndex effIndex)
void SelectTarget(WorldObject *&target)
void SelectTarget(WorldObject *&target)
void SelectTarget(WorldObject *&target)
void SelectTarget(WorldObject *&target)
void SelectTarget(WorldObject *&target)
bool CheckProc(ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
void HandleScript(SpellEffIndex)
void apply(T *val)
Definition: ByteConverter.h:41
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
auto MapGetValuePtr(M &map, typename M::key_type const &key)
Definition: MapUtils.h:29
void RandomResize(C &container, std::size_t requestedSize)
Definition: Containers.h:67
std::string_view StringId
Position ActorPosition
static void VisitGridObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition: CellImpl.h:179
Definition: Loot.h:176
uint32 itemid
Definition: Loot.h:177
constexpr void SetOrientation(float orientation)
Definition: Position.h:71
constexpr float GetPositionX() const
Definition: Position.h:76
constexpr float GetPositionY() const
Definition: Position.h:77
constexpr void GetPosition(float &x, float &y) const
Definition: Position.h:81
constexpr float GetPositionZ() const
Definition: Position.h:78
void SetEquipmentSlots(bool loadDefault, int32 mainHand=EQUIP_NO_CHANGE, int32 offHand=EQUIP_NO_CHANGE, int32 ranged=EQUIP_NO_CHANGE)
areatrigger_find_the_lost_expedition_follower(AreaTrigger *areatrigger)
areatrigger_find_the_lost_expedition(AreaTrigger *areatrigger)
at_aggro_radius_check_enhanced_combat_tactics(AreaTrigger *areatrigger)
void OnUnitEnter(Unit *unit) override
at_briarpatch_to_plains(AreaTrigger *areatrigger)
void StartConversation(Player *player, uint32 conversationId)
void OnUnitEnter(Unit *unit) override
at_northbound_linger(AreaTrigger *areatrigger)
npc_alliance_survivors_beach_laying(Creature *creature)
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
npc_bjorn_stouthands_q55965_private(Creature *creature)
void WaypointPathEnded(uint32, uint32) override
npc_bo_beach_laying(Creature *creature)
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
npc_briarpatch_prisoner(Creature *creature)
void UpdateAI(uint32 diff) override
void DoAction(int32 param) override
npc_captain_abandoned_camp_exiles_reach(Creature *creature)
void OnQuestAccept(Player *player, Quest const *quest) override
npc_captain_garrick_beach(Creature *creature)
void OnQuestAccept(Player *player, Quest const *quest) override
npc_captain_garrick_q55879(Creature *creature)
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
void UpdateAI(uint32 diff) override
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
void IsSummonedBy(WorldObject *summonerWO) override
npc_captain_warlord_beach_arrive_private(Creature *creature)
void SetFirstMateGUID(ObjectGuid coleGUID)
void SetQuartermasterGUID(ObjectGuid richterGUID)
void MovementInform(uint32 uiType, uint32 uiId) override
void IsSummonedBy(WorldObject *summonerWO) override
npc_captain_warlord_first_aid_private(Creature *creature)
void UpdateAI(uint32 diff) override
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
npc_choppy_booster_scout(Creature *creature)
void WaypointPathEnded(uint32, uint32 pathId) override
void IsSummonedBy(WorldObject *summoner) override
void PassengerBoarded(Unit *passenger, int8, bool apply) override
== Fields =======================================
npc_companion_q55965_q59948_private(Creature *creature)
void WaypointPathEnded(uint32, uint32) override
npc_cork_fizzlepop_q59941(Creature *creature)
void UpdateAI(uint32 diff) override
void MovementInform(uint32 uiType, uint32 uiId) override
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
void UpdateAI(uint32 diff) override
void WaypointPathEnded(uint32, uint32 pathId) override
void JustAppeared() override
npc_crew_ship_private(Creature *creature)
void SetGrimaxeGUID(ObjectGuid grimaxeGUID)
npc_dawntracker_briarpatch_quest_private(Creature *creature)
npc_dawntracker_hunter_quest_private(Creature *creature)
npc_first_mate_brace_for_impact_private(Creature *creature)
void WaypointPathEnded(uint32, uint32 pathId) override
void OnQuestAccept(Player *player, Quest const *quest) override
npc_first_mate_stand_your_ground(Creature *creature)
npc_garrick_summoned_beach(Creature *creature)
void MovementInform(uint32 uiType, uint32 uiId) override
void UpdateAI(uint32 diff) override
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
void IsSummonedBy(WorldObject *) override
void UpdateAI(uint32 diff) override
void JustDied(Unit *) override
void JustAppeared() override
npc_geolord_grekog(Creature *creature)
void JustEngagedWith(Unit *who) override
void PassengerBoarded(Unit *passenger, int8, bool apply) override
== Fields =======================================
void UpdateAI(uint32 diff) override
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
npc_giant_boar_vehicle_q55879(Creature *creature)
void UpdateAI(uint32 diff) override
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
npc_grimaxe_summoned_beach(Creature *creature)
void MovementInform(uint32 uiType, uint32 uiId) override
void IsSummonedBy(WorldObject *) override
npc_horde_crew_plains_private(Creature *creature)
void WaypointPathEnded(uint32, uint32) override
void WaypointPathEnded(uint32, uint32) override
npc_horde_survivors_beach_q59930_private(Creature *creature)
void SetGarrickGUID(ObjectGuid garrickGUID)
npc_huxsworth_briarpatch_quest_private(Creature *creature)
npc_huxsworth_hunter_quest_private(Creature *creature)
void UpdateAI(uint32 diff) override
npc_lana_jordan_beach_laying(Creature *creature)
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
void UpdateAI(uint32 diff) override
void WaypointPathEnded(uint32, uint32) override
npc_lana_jordan_q59948_private(Creature *creature)
void IsSummonedBy(WorldObject *) override
npc_leader_northbound(Creature *creature)
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
void MovementInform(uint32 uiType, uint32 uiId) override
void UpdateAI(uint32 diff) override
void MovementInform(uint32 uiType, uint32 uiId) override
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
void UpdateAI(uint32 diff) override
npc_lindie_springstock_q56034(Creature *creature)
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
npc_mithran_dawntracker_beach_laying(Creature *creature)
npc_murloc_spearhunter_watershaper(Creature *creature)
void JustEngagedWith(Unit *who) override
void JustDied(Unit *killer) override
npc_ogre_overseer(Creature *creature)
void UpdateAI(uint32 diff) override
npc_pet_ship_private(Creature *creature)
void WaypointPathEnded(uint32, uint32) override
void UpdateAI(uint32 diff) override
void JustAppeared() override
npc_prisoner_q55879_private(Creature *creature)
void JustDied(Unit *killer) override
void UpdateAI(uint32 diff) override
void JustEngagedWith(Unit *who) override
npc_quilboar_geomancer(Creature *creature)
void UpdateAI(uint32 diff) override
npc_quilboar_warrior(Creature *creature)
void JustEngagedWith(Unit *who) override
void JustDied(Unit *killer) override
void UpdateAI(uint32 diff) override
npc_re_sized_boar_q56034(Creature *creature)
void MovementInform(uint32 uiType, uint32 uiId) override
void WaypointPathEnded(uint32, uint32 pathId) override
void IsSummonedBy(WorldObject *summoner) override
void PassengerBoarded(Unit *passenger, int8, bool apply) override
== Fields =======================================
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
void UpdateAI(uint32 diff) override
npc_scoutomatic_5000(Creature *creature)
npc_ship_captain_brace_for_impact_private(Creature *creature)
void WaypointPathEnded(uint32, uint32 pathId) override
void UpdateAI(uint32 diff) override
npc_ship_captain_warming_up_private(Creature *creature)
void WaypointPathEnded(uint32, uint32 pathId) override
void MovementInform(uint32 uiType, uint32 uiId) override
void DamageDealt(Unit *target, uint32 &damage, DamageEffectType) override
void StartConversationWithPlayer(uint32 conversationId)
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
void EnterEvadeMode(EvadeReason) override
void IsSummonedBy(WorldObject *summonerWO) override
npc_sparring_partner_combat_training(Creature *creature)
void WaypointPathEnded(uint32, uint32 pathId) override
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
void UpdateAI(uint32 diff) override
npc_sparring_partner_exiles_reach(Creature *creature)
void EnterEvadeMode(EvadeReason) override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
void MovementInform(uint32 uiType, uint32 uiId) override
void WaypointPathEnded(uint32, uint32 pathId) override
void DamageDealt(Unit *target, uint32 &damage, DamageEffectType) override
void StartPrivateConversation(uint32 conversationId)
void UpdateAI(uint32 diff) override
npc_survivors_beach_leave_private(Creature *creature)
void SpellHit(WorldObject *caster, SpellInfo const *spellInfo) override
void UpdateAI(uint32 diff) override
npc_torgok_q55879(Creature *creature)
void JustDied(Unit *killer) override
void JustEngagedWith(Unit *who) override
void OnQuestAccept(Player *player, Quest const *quest) override
npc_warlord_grimaxe_beach(Creature *creature)
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
void UpdateAI(uint32 diff) override
npc_warlord_grimaxe_q59942(Creature *creature)
static std::vector< ActorData > const ActorDataMap[2]
WarlordGrimaxeAbandonedCampData
@ QUEST_COOKING_MEAT_HORDE
@ CONVERSATION_QUEST_COOKING_MEAT_COMPLETE_HORDE
@ CONVERSATION_QUEST_COOKING_MEAT_ACCEPT_HORDE
static constexpr Position DawntrackerBriarpatchDespawnPosition
EnhancedCombatTacticsData
@ SPELL_SUMMON_CAPTAIN_GARRICK_COMBAT
@ SPELL_SUMMON_WARLORD_GRIMAXE_COMBAT
CreatureAI * BjornRuinsSelector(Creature *creature)
CreatureAI * AustinBeachStandingAISelector(Creature *creature)
CreatureAI * BjornBeachStandingAISelector(Creature *creature)
CreatureAI * BoBeachStandingAISelector(Creature *creature)
static constexpr Position CopterCloneSpawnPosition
ExilesReachAllianceSurvivorsBeachData
@ NPC_KEE_LA_LAYING
@ PATH_KEE_LA_STANDING
@ NPC_BJORN_STOUTHANDS_LAYING
@ PATH_AUSTIN_HUXWORTH_STANDING
@ SPELL_BANDAGING_QUEST
@ CONVERSATION_KEE_LA_BEACH
@ NPC_KEE_LA_STANDING
@ NPC_AUSTIN_HUXWORTH_STANDING
@ CONVERSATION_STOUTHANDS_BEACH
@ NPC_AUSTIN_HUXWORTH_LAYING
@ NPC_BJORN_STOUTHANDS_STANDING
@ PATH_BJORN_STOUTHANDS_STANDING
@ CONVERSATION_HUXWORTH_BEACH
@ SPELL_RE_DEATHER_SUMMON_GRIMAXE
@ OBJECTIVE_RE_DEATHER_CADAVERS_KILLED
@ CONVERSATION_ACCEPT_RE_DEATHER_QUEST
@ NPC_SHUJA_GRIMAXE_PRISONER
@ RE_DEATHER_CADAVERS_KILLED_MAX
@ SPELL_RE_DEATHER_TEMP_OBJECTIVE_CHECK
@ NPC_HORDE_WARRIOR
@ SPELL_REUNION_DNT_HORDE
@ CONVERSATION_RE_DEATHER_EXPLODE
@ QUEST_RE_DEATHER
@ SPELL_RE_DEATHER_ROUGH_LANDING_DNT
static constexpr Position GarrickQuillboarBriarpatchPosition
@ QUEST_NORTHBOND_ALLIANCE
@ ACTOR_ID_1_NORTHBOUND_ACCEPT_HORDE
@ ACTOR_ID_0_NORTHBOUND_ACCEPT_HORDE
@ SPELL_SUMMON_ADMIRAL_GARRICK_GUARDIAN_NORTHBOUND
@ ACTOR_ID_0_NORTHBOUND_AREATRIGGER_ALLIANCE
@ CONVERSATION_QUEST_NORTHBOUND_ACCEPT_HORDE
@ ACTOR_ID_0_NORTHBOUND_ACCEPT_ALLIANCE
@ ACTOR_ID_1_NORTHBOUND_AREATRIGGER_HORDE
@ SPELL_LINGER_NORTHBOUND_HORDE
@ ACTOR_ID_1_NORTHBOUND_ACCEPT_ALLIANCE
@ QUEST_NORTHBOND_HORDE
@ CONVERSATION_QUEST_NORTHBOUND_ACCEPT_ALLIANCE
@ SPELL_LINGER_NORTHBOUND_ALLIANCE
@ SPELL_SUMMON_WARLORD_GRIMAXE_GUARDIAN_NORTHBOUND
@ POINT_LEADER_RUN
KnockedDownExilesReachData
@ SPELL_KNOCKED_DOWN_STUN2
HuxsworthBriarpatchData
@ CONVERSATION_ACTOR_HUXSWORTH_BRIARPATCH
@ CONVERSATION_BRIARPATCH_ALLIANCE
@ EVENT_HUXSWORTH_GARRICK_CONVERSATION
@ EVENT_HUXSWORTH_GARRICK_RUN_BRIARPATCH
@ CONVERSATION_ACTOR_GARRICK_BRIARPATCH
BraceForImpactFirstMateData
@ NPC_GRUNT_THROG
@ PATH_THROG_BRACE_FOR_IMPACT
@ EVENT_FIRST_MATE_2
@ PATH_COLE_BRACE_FOR_IMPACT
@ EVENT_FIRST_MATE_1
@ NPC_PRIVATE_COLE
@ SAY_STORM
DawntrackerBriarpatch
@ CONVERSATION_BRIARPATCH_HORDE
@ CONVERSATION_ACTOR_GRIMAXE_BRIARPATCH
@ EVENT_DAWNTRACKER_GRIMAXE_RUN_BRIARPATCH
@ CONVERSATION_ACTOR_DAWNTRACKER_BRIARPATCH
@ EVENT_DAWNTRACKER_GRIMAXE_CONVERSATION
ResizingQuestData
@ EVENT_RESIZING_FOLLOW_PLAYER
@ EVENT_RESIZING_RUN_HOME
@ CONVERSATION_RESIZING_REPORT_BACK
@ ACTOR_CORK_RESIZING_QUEST
@ SPELL_PING_LINDIE_Q56034_Q59941
@ SPELL_SUMMON_CORK_FIZZLEPOP_GUARDIAN_Q59941
@ CONVERSATION_RESIZING_QUEST_ACCEPT
@ SPELL_SUMMON_LINDIE_SPRINGSTOCK_GUARDIAN_Q56034
@ SPELL_LINDIE_DESUMMON_Q56034
@ POINT_HOME_POSITION
@ ACTOR_LINDIE_RESIZING_QUEST
static constexpr Position GarrickAbandonedCampPosition
SpellCrashLandedData
@ NPC_WARLORD_BREKA_GRIMAXE_BEACH
@ NPC_CAPTAIN_GARRICK_BEACH
GrimaxeReDeather
@ CONVERSATION_WARLORD_GRIMAXE_SPAWN_Q59942
@ CONVERSATION_WARLORD_GRIMAXE_QUEST_COMPLETE_Q59942
@ ACTOR_SHUJA_GRIMAXE_PRISONER
@ ACTOR_SHUJA_GRIMAXE_FREED
@ ACTOR_WARLORD_GRIMAXE_Q59942
@ QUEST_OBJECTIVE_BEAST_TAMED_ALLIANCE
@ QUEST_OBJECTIVE_TRAINED_HORDE
@ QUEST_OBJECTIVE_BEAST_TAMED_HORDE
@ QUEST_TAMING_THE_WILDS_HORDE
@ QUEST_TAMING_THE_WILDS_ALLIANCE
@ SPELL_TAME_BEAST
@ QUEST_OBJECTIVE_TRAINED_ALLIANCE
@ QUEST_TRACKER_TAMING_THE_WILDS_COMPLETE
CreatureAI * HealedByLeaderAllianceAISelector(Creature *creature)
static constexpr Position PrisonerBriarpatchDespawnPosition
static constexpr Position GrimaxeQuillboarBriarpatchPosition
CaptainGarrickAbandonedCampData
@ QUEST_COOKING_MEAT_ALLIANCE
@ CONVERSATION_QUEST_COOKING_MEAT_COMPLETE_ALLIANCE
@ CONVERSATION_QUEST_COOKING_MEAT_ACCEPT_ALLIANCE
static constexpr Position BjornWestwardBoundRuinsPos
Position MoveToPrisonerPosition
CreatureAI * SparringPartnerEnhancedCombatTrainingSelector(Creature *creature)
@ PATH_LANA_RUN_TO_PIT
@ EVENT_LANA_RUN_TO_PIT
@ SAY_LANA_REACHED_PIT
@ SAY_LANA_RUN_TO_PIT
@ EVENT_LANA_SAY_AT_RUINS
CreatureAI * CorkFizzlepopSelector(Creature *creature)
ExilesReachOgreOverseerData
@ ITEM_BATTERED_CLOAK
@ SPELL_EARTHSHATTER
@ EVENT_OVERSEER_BACKHAND
@ ITEM_OVERSEERS_MANDATE
@ SPELL_BACKHAND
@ EVENT_OVERSEER_EARTHSHATTER
@ QUEST_BRIARPATCH_OVERSEER_CLOAK_DROPPED
static constexpr Position EnhancedTrainingWalkPosition
CreatureAI * LanaRuinsSelector(Creature *creature)
ExilesReachShipCrashBeachData
@ SPELL_KNOCKED_DOWN
@ SPELL_CRASHED_LANDED_ALLIANCE
@ SPELL_CRASHED_LANDED_HORDE
BraceForImpactPetData
@ PATH_PET_ALLIANCE_SHIP
@ PATH_PET_HORDE_SHIP
@ EVENT_PET_SHIP_RUN_TO_POSITION
@ MAP_ALLIANCE_SHIP
@ MAP_HORDE_SHIP
@ SAY_BJORN_REACHED_PIT
@ PATH_BJORN_RUN_TO_PIT
@ EVENT_BJORN_RUN_TO_PIT
@ SAY_BJORN_RUN_TO_PIT
CreatureAI * WarlordGrimaxeBeachAISelector(Creature *creature)
void AddSC_zone_exiles_reach()
LostExpeditionFollowerData
@ AREA_ABANDONED_CAMP
@ EVENT_FOLLOW_PLAYER
@ ACTOR_ID_HORDE_SURVIVOR
@ SPELL_SUMMON_ADMIRAL_GARRICK_GUARDIAN
@ POINT_CAMP_POSITION
@ CONVERSATION_LINE_ESCORT_SURVIVOR_CAMP
@ CONVERSATION_LINE_ESCORT_ALLIANCE_SURVIVOR
@ ACTOR_ID_ALLIANCE_SURVIVOR
@ SPELL_GARRICK_PING
@ CONVERSATION_LINE_ESCORT_HORDE_SURVIVOR
@ EVENT_INITIAL_SPAWN_CHECK
@ SPELL_SUMMON_WARLORD_GRIMAXE_GUARDIAN
@ SPELL_VALIDATED_QUEST_ACCEPT_BRIARPATCH_HORDE
@ QUEST_FORBIDDEN_QUILBOAR_NECROMANY_ALLIANCE
@ QUEST_DOWN_WITH_THE_QUILBOAR_ALLIANCE
@ QUEST_DOWN_WITH_THE_QUILBOAR_HORDE
@ SPELL_VALIDATED_QUEST_ACCEPT_BRIARPATCH_ALLIANCE
@ QUEST_FORBIDDEN_QUILBOAR_NECROMANY_HORDE
SpellKnockbackHint
@ ACTOR_ALLIANCE_CAPTAIN
StandYourGroundData
@ NPC_ALLIANCE_SPARING_PARTNER
@ PATH_ALLIANCE_SPARING_PARTNER
@ CONVERSATION_JUMP
@ NPC_SPAR_POINT_ADVERTISMENT
@ CONVERSATION_AGGRO
@ EVENT_MOVE_TO_A_POSITION
@ SPELL_COMBAT_TRAINING_COMPLETE
@ EQUIPMENT_SWORD
@ POSITION_SPARPOINT_ADVERTISMENT
@ NPC_KILL_CREDIT
@ SPELL_JUMP_LEFT
@ TALK_SPARING_COMPLETE
@ SPELL_JUMP_BEHIND
@ EVENT_JUMP_BEHIND
@ NPC_HORDE_SPARING_PARTNER
@ SPELL_COMBAT_TRAINING
@ ACTOR_ID_ALLIANCE
@ EVENT_PREFIGHT_CONVERSATION
@ EVENT_WALK_BACK
@ PATH_HORDE_SPARING_PARTNER
@ SPELL_UPDATE_PHASE_SHIFT
@ POSITION_SPARPOINT_READY
@ EQUIPMENT_AXE
@ ACTOR_ID_HORDE
@ CONVERSATION_PREFIGHT
static constexpr Position PrisonerPosition
CreatureAI * DawntrackerBriarpatchSelector(Creature *creature)
ExilesReachQuilboarData
@ ITEM_LINKED_MAIL_HAUBERK
@ QUEST_BRIARPATCH_CHEST_DROPPED
@ ITEM_STITCHED_CLOTH_TUNIC
@ ITEM_STITCHED_LEATHER_TUNIC
@ ITEM_DENTED_CHESTPLATE
static constexpr Position HordeCrewPersonalSpawnLocation[]
static constexpr Position MiniChopperJumpPosition
@ CONVERSATION_ACTOR_GEOLORD
@ CONVERSATION_GEOLORD_AGGRO
@ WORLDSTATE_HORDE
@ NPC_INVIS_BUNNY_GEOLORD
@ SPELL_UPHEAVAL
@ NPC_CORK_FIZZLEPOP
@ EVENT_CAST_EARTH_BOLT
@ CONVERSATION_ACTOR_CORK
@ CONVERSATION_ACTOR_LINDIE
@ NPC_LINDIE_SPRINGSTOCK
@ SPELL_NECROTIC_RITUAL_DNT
@ EVENT_CAST_UPHEAVAL
@ ACTION_FREE_PRISONER
@ SPELL_EARTH_BOLT
Position GiantBoarPosition
TamingTheWildsData
@ SPELL_LEARNING_TAME_BEAST
@ CONVERSATION_HORDE_ACTOR
@ CONVERSATION_HORDE_TRAINER
@ SPELL_LEARN_CALL_PET
@ SAY_PET_TRAINING_ALLIANCE
@ SAY_FIND_A_BEAST_ALLIANCE
@ SAY_FIND_A_BEAST_HORDE
@ SPELL_TUTORIAL_HEALTH_DNT
@ SPELL_TAME_BEAST_EFFECT
@ EVENT_ME_END_OF_CAST
@ EVENT_ME_TURN_TO_PLAYER
@ SPELL_LEARN_TAME_BEAST
static std::unordered_map< Races, std::string_view > const ActorPetData
@ EVENT_BOAR_GROW
@ EVENT_BOAR_MOVE
@ SPELL_GROW_Q56034
@ SOUND_GROW_Q56034
CreatureAI * CaptainGarrickBeachAISelector(Creature *creature)
LindieSpringStockData
@ CONVERSATION_ACTOR_COPTER
@ SPELL_GROW_ONE
@ NPC_LINDIE_SPRINGSTOCK_PLAINS
@ CONVERSATION_ACTOR_GOBLIN_HORDE
@ SPELL_RE_SIZING
@ EVENT_RESIZE_COPTER_4
@ CONVERSATION_ACTOR_GOBLIN_ALLIANCE
@ QUEST_THE_CHOPPY_BOOSTER_MK5
@ EVENT_RESIZE_COPTER_3
@ SPELL_GROW_THREE
@ CONVERSATION_RESIZE_COPTER_HORDE
@ EVENT_RESIZE_COPTER_6
@ CONVERSATION_RESIZE_COPTER_ALLIANCE
@ EVENT_RESIZE_COPTER_2
@ QUEST_THE_SCOUT_O_MATIC_5000
@ EVENT_CONVERSATION
@ EVENT_RESIZE_COPTER_1
@ EVENT_RESIZE_COPTER_5
@ SPELL_GROW_TWO
BraceForImpactCrewData
@ PATH_JIN_HAKE_BRACE_FOR_IMPACT
@ PATH_BO_BRACE_FOR_IMPACT
@ PATH_RICHTER_BRACE_FOR_IMPACT
@ PATH_KEE_LA_BRACE_FOR_IMPACT
@ NPC_MITHDRAN_DAWNTRACKER
@ PATH_LANA_BRACE_FOR_IMPACT
@ NPC_QUARTERMASTER_RICHTER
@ NPC_LANA_JORDAN
@ PATH_AUSTIN_BRACE_FOR_IMPACT
@ NPC_KEE_LA
@ NPC_PROVISONER_JIN_HAKE
@ PATH_MITHDRAN_BRACE_FOR_IMPACT
@ NPC_BJORN_STOUTHANDS
@ PATH_BJORN_BRACE_FOR_IMPACT
@ NPC_AUSTIN_HUXWORTH
SpellRidingGiantBoar
@ SPELL_RIDING_GIANT_BOAR_321670
@ SPELL_RIDING_GIANT_BOAR_305068
static constexpr Position GrimaxeBriarpatchDespawnPosition
FirstMateStandYourGroundData
@ QUEST_STAND_YOUR_GROUND_ALLIANCE
@ SPELL_SUMMON_COLE
@ SPELL_SUMMON_THROG
@ QUEST_STAND_YOUR_GROUND_HORDE
static constexpr Position WonsaWestwardBoundRuinsPos
CreatureAI * PrisonerQ55879Selector(Creature *creature)
CreatureAI * ChoppyBoosterSelector(Creature *creature)
static constexpr Position GarrickBriarpatchDespawnPosition
CreatureAI * AlariaRuinsSelector(Creature *creature)
@ QUEST_OBJECTIVE_RE_SIZING_THE_SITUATION_HORDE
@ NPC_LINDIE_SPRINGSTOCK_GUARDIAN
@ NPC_WANDERING_BOAR
@ QUEST_RE_SIZING_THE_SITUATION_HORDE
@ NPC_CORK_FIZZLEPOP_GUARDIAN
@ SPELL_RESIZER_HIT_TWO_Q56034_Q59941
@ SPELL_RESIZER_HIT_ONE_Q56034_Q59941
@ QUEST_RE_SIZING_THE_SITUATION_ALLIANCE
@ SPELL_RESIZING_Q59941
@ SPELL_RESIZER_HIT_THREE_Q56034
@ QUEST_OBJECTIVE_RE_SIZING_THE_SITUATION_ALLIANCE
@ SPELL_RE_SIZER_OVERCHARGED_Q56034
CreatureAI * CaptainGarrickAISelector(Creature *creature)
ExilesReachHordeSurvivorsBeachData
@ EVENT_SURVIVORS_HORDE_STAND_AND_TALK
@ NPC_LANA_JORDAN_STANDING
@ EVENT_SURVIVORS_SALUTE
@ PATH_LANA_JORDAN_LEAVE_BEACH
@ QUEST_FINDING_THE_LOST_EXPEDITION_HORDE
@ NPC_MITHDRAN_STANDING
@ NPC_BO_STANDING
@ TALK_HORDE_BEACH_THANK_PLAYER
@ NPC_LANA_JORDAN_LAYING
@ PATH_MITHDRAN_LEAVE_BEACH
@ PATH_LANA_JORDAN_TO_GRIMAXE
@ NPC_BO_LAYING_LAYING
@ NPC_MITHDRAN_LAYING
@ PATH_BO_LEAVE_BEACH
@ PATH_BO_TO_GRIMAXE
@ QUEST_FINDING_THE_LOST_EXPEDITION_ALLIANCE
@ EVENT_SURVIVORS_LEAVE_BEACH
@ PATH_MITHDRAN_TO_GRIMAXE
@ EVENT_SURVIVORS_HORDE_MOVE_TO_GRIMAXE
PrisonerQuest55879
@ PATH_PRISONER_TO_GROUND
static constexpr Position GrimaxeAbandonedCampPosition
@ SPELL_RITUAL_SCENE_HRUN_BEAM_DNT
@ SPELL_SUMMON_DARKMAUL_PLAINS_QUESTGIVERS_SUMMON
@ SPELL_RITUAL_SCENE_HARPY_BEAM_DNT
@ SPELL_RITUAL_SCENE_OGRE_CITADEL_DNT
@ NPC_ALLIANCE_CAPTAIN
@ SPELL_SUMMON_DARKMAUL_PLAINS_QUESTGIVERS_AURA
@ SPELL_RITUAL_SCENE_MAIN_BEAM_DNT
@ SPELL_PING_GARRICK_TORGOK
@ NPC_HENRY_GARRICK_PRISONER
@ SPELL_REUNION_DNT_ALLIANCE
CreatureAI * HuxsworthBriarpatchSelector(Creature *creature)
static constexpr Position ReDeatherAbandonTeleportPos
#define RegisterPrivatePublicCreatureAIPair(scriptName, privateAI, publicAI)
BriarpatchPrisonerData
@ SAY_GET_OUT_OF_HERE
@ EVENT_RUN_TO_PLAINS
CreatureAI * LindieSpringstockSelector(Creature *creature)
CookingMeatQuestData
@ ANIMATION_KIT_INJURED
ExilesReachCaptainsBeachData
@ EVENT_EMERGENCY_FIRST_AID_SCRIPT_MOVE_SECOND_SURVIVOR
@ QUEST_EMERGENCY_FIRST_AID_ALLIANCE
@ CONVERSATION_QUEST_MURLOC_MANIA_ALLIANCE
@ EVENT_EMERGENCY_FIRST_AID_SCRIPT_SHEATH
@ POINT_SECOND_SURVIVOR
@ QUEST_EMERGENCY_FIRST_AID_HORDE
@ EVENT_EMERGENCY_FIRST_AID_SCRIPT_BANDAGE
@ QUEST_MURLOC_MANIA_HORDE
@ POINT_BEACH_HOME
@ CONVERSATION_QUEST_MURLOC_MANIA_HORDE
@ TALK_ARRIVED_AT_BEACH
@ EVENT_EMERGENCY_FIRST_AID_SCRIPT_MOVE_HOME_BEACH
@ SPELL_BANDAGING
@ QUEST_MURLOC_MANIA_ALLIANCE
HealedByLeaderBeachData
@ EVENT_SALUTE
@ NPC_COLE_BEACH
@ PATH_LONG_BEACH
@ NPC_RICHTER_BEACH
@ PATH_SHORT_BEACH
@ EVENT_LEAVE_BEACH
@ NPC_JINHAKE_BEACH
@ NPC_THROG_BEACH
static constexpr Position BriarpatchPrisonerJumpToPosition
static constexpr Position EnhancedTrainingRunPosition
Position ResizingGuardianPosition
ExilesReachShipCrashData
@ MOVIE_HORDE_SHIP_CRASH
@ SPELL_ALLIANCE_SHIP_CRASH
@ SPELL_HORDE_SHIP_CRASH
@ MOVIE_ALLIANCE_SHIP_CRASH
@ SPELL_BEGIN_TUTORIAL
CreatureAI * HealedByLeaderHordeAISelector(Creature *creature)
@ NPC_BJORN_STOUTHANDS_PIT_ONE
@ NPC_LANAJORDAN_PIT_ONE
@ NPC_WONSA_PIT_ONE
@ NPC_ALARIA_PIT_ONE
EnhancedCombatTrainerData
@ SPELL_AGGRO_RADIUS_CHECK_DNT_SHAMAN
@ QUEST_OBJECTIVE_HORDE_BLACKOUT_KICK
@ SPELL_CHARGE_KNOCKBACK_WARRIOR
@ CONVERSATION_LIGHTNINGBOLT_RANGE_SHAMAN
@ CONVERSATION_THREE_COMBO_EVISCERATE_ROGUE
@ SPELL_PRIMAL_STRIKE
@ SPELL_AGGRO_RADIUS_CHECK_DNT_DRUID
@ CONVERSATION_PREFIGHT_WALK_ENHANCED
@ SPELL_MOONFIRE
@ SPELL_BLACKOUT_KICK
@ CONVERSATION_SHADOW_WORD_PAIN_TOO_SOON_PRIEST
@ CONVERSATION_HOLY_POWER_THREE_PALADIN
@ CONVERSATION_CHARGE_KICKBACK
@ CONVERSATION_CRUSADER_STRIKE_ONE_PALADIN
@ EVENT_COMBAT_TRAINING_RESET_MAGE
@ CONVERSATION_MOONFIRE_CAST_PRE_COMBAT_DRUID
@ SPELL_FROSTBOLT
@ CONVERSATION_CRUSADER_STRIKE_THREE_PALADIN
@ NPC_ALLIANCE_SPARRING_PARTNER_ENHANCED
@ EVENT_COMBAT_TRAINING_END
@ SPELL_KNOCKBACK
@ CONVERSATION_CORRUPTION_CAST_PRE_COMBAT_WARLOCK
@ SPELL_CHARGE_KNOCKBACK_DRUID
@ CONVERSATION_CORRUPTION_CAST_TOO_SOON_WARLOCK
@ SPELL_SINISTER_STRIKE
@ SPELL_CHARGE
@ SPELL_EVISCERATE
@ SPELL_AGGRO_RADIUS_CHECK_DNT_WARRIOR_MAGE
@ EVENT_COMBAT_CHECK_PLAYER
@ CONVERSATION_MOONFIRE_CAST_TOO_SOON_DRUID
@ CONVERSATION_SMITE_PRE_COMBAT_PRIEST
@ CONVERSATION_HOLY_POWER_TWO_PALADIN
@ CONVERSATION_HOLY_POWER_ONE_PALADIN
@ SPELL_TIGER_PALM
@ EVENT_COMBAT_TRAINING_AGGRO_CHECK_MAGE
@ CONVERSATION_USE_SPELLS_AT_RANGE
@ QUEST_ENHANCED_COMBAT_TACTICS_ALLIANCE_MONK
@ NPC_ALLIANCE_SPARRING_PARTNER_ENHANCED2
@ CONVERSATION_FROSTBOLT_CLOSE_MAGE
@ CONVERSATION_READY_COMBAT
@ QUEST_ENHANCED_COMBAT_TACTICS_HORDE_MONK
@ CONVERSATION_PRIMAL_STRIKE_QUEST_CREDIT_SHAMAN
@ SPELL_RANGED_ROOT_DNT
@ CONVERSATION_CHARGE_ONE_RES_ENHANCED
@ SPELL_DRINK_HEALING_POTION
@ EVENT_COMBAT_TRAINING_SINISTER_CHECK_ROGUE
@ SPELL_SHADOW_WORD_PAIN
@ CONVERSATION_MOONFIRE_QUEST_CREDIT_DRUID
@ CONVERSATION_CORRUPTION_QUEST_CREDIT_WARLOCK
@ CONVERSATION_READY_COMBAT_WARRIOR
@ CONVERSATION_SINISTER_STRIKE_THREE_ROGUE
@ SPELL_SLAM
@ SPELL_CRUSADER_STRIKE
@ EVENT_COMBAT_TRAINING_WALK_AND_TALK
@ CONVERSATION_FAILED_EVISCERATE_ROGUE
@ SPELL_SHADOWBOLT
@ ACTOR_ID_ALLIANCE_ENHANCED_TRAINING
@ EVENT_COMBAT_TRAINING_RESET_SHAMAN
@ SPELL_SHIELD_OF_THE_RIGHTEOUS
@ EVENT_COMBAT_RUN_BACK
@ CONVERSATION_SHIELD_SLAM_TWO_PALADIN
@ ACTOR_ID_HORDE_ENHANCED_TRAINING
@ CONVERSATION_SHADOW_WORD_PAIN_PRE_COMBAT_PRIEST
@ NPC_INVISBUNNY_CAMP
@ CONVERSATION_MOONFIRE_WEARING_OFF_DRUID
@ QUEST_OBJECTIVE_HORDE_TIGER_PALM
@ QUEST_ENHANCED_COMBAT_TACTICS_ALLIANCE
@ SPELL_LIGHTNING_BOLT
@ SPELL_SMITE
@ CONVERSATION_CRUSADER_STRIKE_TWO_PALADIN
@ SPELL_AGGRO_RADIUS_CHECK_DNT_WARLOCK
@ CONVERSATION_FIRE_BLAST_QUEST_CREDIT_MAGE
@ QUEST_OBJECTIVE_ALLIANCE_ABILITIES_PROVEN
@ CONVERSATION_FIRE_BLAST_MAGE_NO_CREDIT
@ POINT_TRAINING_POINT_ENHANCED_TRAINING
@ QUEST_ENHANCED_COMBAT_TACTICS_HORDE
@ CONVERSATION_FOUR_COMBO_EVISCERATE_ROGUE
@ CONVERSATION_SHADOW_BOLT_PRE_COMBAT_WARLOCK
@ CONVERSATION_CHARGE_FINAL_ENHANCED
@ SPELL_CORRUPTION
@ CONVERSATION_FOUR_COMBO_POINTS_ROGUE
@ CONVERSATION_SHADOW_WORD_PAIN_FADING_PRIEST
@ CONVERSATION_SHIELD_SLAM_ONE_PALADIN
@ CONVERSATION_SINISTER_STRIKE_TWO_ROGUE
@ PATH_COMBAT_TRAINER_HOME
@ SPELL_CHARGE_KNOCKBACK
@ SPELL_WRATH
@ CONVERSATION_SLAM_ENHANCED
@ CONVERSATION_CORRUPTION_IS_FADING_WARLOCK
@ CONVERSATION_PRIMAL_STRIKE_FIRST_SHAMAN
@ EVENT_COMBAT_TRAINING_FACE_PLAYER
@ QUEST_OBJECTIVE_HORDE_ABILITIES_PROVEN
@ CONVERSATION_CHARGE_ZERO_RES_ENHANCED
@ CONVERSATION_LIGHTNINGBOLT_FIRST_SHAMAN
@ CHARGE_CATEGORY_CHARGE_SPELL
@ CONVERSATION_FROSTBOLT_MAGE
@ CONVERSATION_THREE_COMBO_POINTS_ROGUE
@ CONVERSATION_SHADOW_WORD_PAIN_QUEST_CREDIT_PRIEST
@ EVENT_COMBAT_TRAINING_AGGRO_CHECK_SHAMAN
@ QUEST_OBJECTIVE_ALLIANCE_BLACKOUT_KICK
@ SPELL_AGGRO_RADIUS_CHECK_DNT_PRIEST
@ CONVERSATION_FIVE_COMBO_POINTS_ROGUE
@ EVENT_COMBAT_TRAINING_SPELL_FADING
@ SPELL_FIRE_BLAST
@ CONVERSATION_SINISTER_STRIKE_ONE_ROGUE
@ QUEST_OBJECTIVE_ALLIANCE_TIGER_PALM
@ POINT_WALK_POINT_ENHANCED_TRAINING
@ POINT_RUN_POINT_ENHANCED_TRAINING
@ CONVERSATION_WRATH_PRE_COMBAT_DRUID
@ SPELL_AGGRO_RADIUS_CHECK_DNT_WARRIOR
@ CONVERSATION_REGULAR_ATTACKS_ROGUE
WarmingUpCaptainData
@ PATH_GARRICK_TO_UPPER_DECK
@ NPC_CAPTAIN_GARRICK
@ NPC_WARLORD_BREKA_GRIMAXE3
@ NPC_WARLORD_BREKA_GRIMAXE2
@ SAY_SPAR
@ PATH_GRIMAXE_TO_THROG
@ EVENT_SHIP_CAPTAIN1_SCRIPT1
@ EVENT_SHIP_CAPTAIN1_SCRIPT2
@ EVENT_SHIP_CAPTAIN1_SCRIPT3
@ PATH_GRIMAXE_TO_UPPER_DECK
@ PATH_GARRICK_TO_COLE
CreatureAI * MithdranBeachStandingAISelector(Creature *creature)
@ PATH_JINHAKE_PLAINS
@ PATH_BO_PLAINS
@ NPC_SCOUT_O_MATIC_5000
@ PATH_COPTER_TO_RUINS
@ EVENT_RETURN_FROM_OGRE_RUINS
@ CONVERSATION_RIDE_FROM_OGRE_RUINS_HORDE
@ SCOUT_O_MATIC_DESUMMON
@ PATH_THROG_PLAINS
@ PATH_COPTER_FROM_RUINS
@ SPELL_SCENE_OGRE_RUINS_HORDE
@ EVENT_TRIGGER_CREW_MOVE
@ PATH_WONSA_PLAINS
@ CONVERSATION_RIDE_TO_OGRE_RUINS_HORDE
@ SPELL_ROPED_DNT
@ SPELL_SCOUT_O_MATIC_PING_DNT
@ SPELL_SCENE_OGRE_RUINS_ALLIANCE
@ CONVERSATION_RIDE_FROM_OGRE_RUINS_ALLIANCE
@ NPC_CHOPPY_BOOSTER_MK5
@ EVENT_START_SCOUT_OGRE_RUINS
@ CONVERSATION_RIDE_TO_OGRE_RUINS_ALLIANCE
@ PATH_LANA_PLAINS
CreatureAI * GetPrivatePublicPairAISelector(Creature *creature)
static constexpr Position LanaWestwardBoundRuinsPos
BraceForImpactData
@ QUEST_BRACE_FOR_IMPACT_ALLIANCE
@ QUEST_BRACE_FOR_IMPACT_HORDE
static Creature * FindCreatureIgnorePhase(WorldObject const *obj, std::string_view stringId, float range=100.0f)
BraceForImpactCaptainData
@ PATH_GRIMAXE_FROM_UPPER_DECK
@ SAY_GET_TO_POSITIONS
@ PATH_GARRICK_TO_LOWER_DECK
@ EVENT_SHIP_CAPTAIN2_SCRIPT1
@ PATH_GARRICK_FROM_UPPER_DECK
@ EVENT_SHIP_CAPTAIN2_SCRIPT2
@ PATH_GRIMAXE_TO_LOWER_DECK
static constexpr Position InjuredNpcPositionAbandonedCamp
WarmingUpData
@ CONVERSATION_WARMING_UP_COMPLETE
@ CONVERSATION_WARMING_UP_ACCEPT
SceneOgreRuinsRideBoar
@ SPELL_ENHANCED_BOAR_KILL_CREDIT
@ QUEST_RIDE_ENHANCED_BOAR
@ SPELL_ENHANCED_BOAR_PING_VEHICLE
@ QUEST_RIDE_BOAR_OBJECTIVE_TWO_MAX
@ QUEST_RIDE_BOAR_OBJECTIVE_TWO
@ SPELL_ENHANCED_BOAR_TRAMPLE
@ SPELL_ENHANCED_BOAR_CHARGE
@ SPELL_ENHANCED_BOAR_KNOCKBACK
@ SPELL_ENHANCED_BOAR_KNOCKBACK_HINT
@ SPELL_ENHANCED_BOAR_CHARGE_CONVO
OgreOverseerQuilboarText
CompanionRunToPit
@ EVENT_COMPANION_RUN_TO_PIT
@ PATH_WONSA_RUN_TO_PIT
@ PATH_ALARIA_RUN_TO_PIT
CreatureAI * KeeLaBeachStandingAISelector(Creature *creature)
QuilboarWarriorGeomancerData
@ SPELL_GEOMANCER_EARTH_BOLT
@ SPELL_QUILBOAR_SLEEP_DNT
@ EVENT_BRUTAL_STRIKE
@ EVENT_GEOMANCER_EARTH_BOLT
@ SPELL_BRUTAL_STRIKE
@ SPELL_NECROTIC_BURST
CreatureAI * LanaJordanBeachStandingAISelector(Creature *creature)
CaptainGarrickGiantBoar
@ ACTION_EXIT_BOAR
@ EVENT_CAPTAIN_GARRICK_RIDE_BOAR
@ CONVERSATION_CAPTAIN_GARRICK_RIDE_BOAR_QUEST_EXIT
@ CONVERSATION_CAPTAIN_GARRICK_RIDE_BOAR_QUEST_ACCEPT
@ EVENT_CAPTAIN_GARRICK_RIDE_BOAR_CHECK_OWNER
@ SPELL_PING_GARRICK_TO_RIDE_BOAR
@ EVENT_CAPTAIN_GARRICK_RIDE_BOAR_EXIT_BOAR_CONVERSATION
@ POINT_HENRY_POSITION
@ PHASE_SEE_TORGOK
@ ACTOR_HENRY_GARRICK_PRISONER
@ EVENT_CAPTAIN_GARRICK_RIDE_BOAR_TALK_TO_HENRY
@ NPC_GIANT_BOAR
@ SPELL_RIDE_VEHICLE_CAPTIAN_BOAR
@ EVENT_CAPTAIN_GARRICK_RIDE_BOAR_HENRY_DESPAWN
@ CONVERSATION_CAPTAIN_GARRICK_RIDE_BOAR_QUEST_HENRY
CreatureAI * HordeCrewPlainsSelector(Creature *creature)
@ EVENT_GIANT_BOAR_SIZE_ONE
@ SOUND_ENLARGE_BOAR
@ VEHICLE_BOAR_SEAT_ONE
@ EVENT_GIANT_BOAR_EJECT_PASSENGERS
@ EVENT_GIANT_BOAR_SIZE_TWO
@ EVENT_GIANT_BOAR_SIZE_THREE
@ SOUND_SHRINK_BOAR
@ EVENT_GIANT_BOAR_UNROOT
@ EVENT_GIANT_BOAR_SIZE_FOUR
static constexpr Position AlariaWestwardBoundRuinsPos
ExilesReachMurlocsData
@ ITEM_LINKED_MAIL_BOOTS
@ QUEST_MURLOC_HIDEAWAY_BOOTS_DROPPED
@ ITEM_DENTED_PLATE_BOOTS
@ ITEM_STITCHED_LEATHER_BOOTS
@ ITEM_STITCHED_CLOTH_SHOES
@ SPELL_SPIRIT_BOLT
@ EVENT_CAST_SPIRIT_BOLT
@ EVENT_CAST_SOUL_GRASP
@ SPELL_SOUL_GRASP
@ ITEM_TORGOKS_REAGENT_POUCH
@ QUEST_TORGOKS_REAGENT_POUCH_DROPPED
AttentionExilesReachData
@ SPELL_DEBUG_LOOK_RIGHT
static constexpr Position HuxworthBriarpatchDespawnPosition
BriarpathPlainsConversations
@ CONVERSATION_DOWN_WITH_THE_QUILLBOAR_COMPLETE_HORDE
@ CONVERSATION_DOWN_WITH_THE_QUILLBOAR_COMPLETE_ALLIANCE
CreatureAI * WansaRuinsSelector(Creature *creature)