TrinityCore
Loading...
Searching...
No Matches
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 "ScriptMgr.h"
19#include "AreaTrigger.h"
20#include "AreaTriggerAI.h"
21#include "CellImpl.h"
22#include "CombatAI.h"
23#include "Containers.h"
24#include "Conversation.h"
25#include "GridNotifiers.h"
26#include "GridNotifiersImpl.h"
27#include "MapUtils.h"
28#include "MotionMaster.h"
29#include "ObjectAccessor.h"
30#include "PassiveAI.h"
31#include "PhasingHandler.h"
32#include "Player.h"
33#include "ScriptedCreature.h"
34#include "SpellAuras.h"
35#include "SpellHistory.h"
36#include "SpellInfo.h"
37#include "SpellScript.h"
38#include "TemporarySummon.h"
39#include "VehicleDefines.h"
40#include "WorldStateMgr.h"
41
42template<class privateAI, class publicAI>
44{
45 if (creature->IsPrivateObject())
46 return new privateAI(creature);
47 return new publicAI(creature);
48}
49
50#define RegisterPrivatePublicCreatureAIPair(scriptName, privateAI, publicAI) new FactoryCreatureScript<CreatureAI, &GetPrivatePublicPairAISelector<privateAI, publicAI>>(scriptName);
51
52static Creature* FindCreatureIgnorePhase(WorldObject const* obj, std::string_view stringId, float range = 100.0f)
53{
54 return obj->FindNearestCreatureWithOptions(range, { .StringId = stringId, .IgnorePhases = true });
55}
56
57 // ********************************************
58 // * Scripting in this section occurs on ship *
59 // ********************************************
60
65
66// 290901 - Attention!
84
90
92{
93public:
94 BaseQuestWarmingUp(const char* name) : QuestScript(name) { }
95
96 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus)
97 {
98 if (newStatus == QUEST_STATUS_INCOMPLETE)
100 else if (newStatus == QUEST_STATUS_COMPLETE)
102 }
103};
104
106{
107public:
108 q56775_warming_up() : BaseQuestWarmingUp("q56775_warming_up") { }
109
110 static constexpr float CLONE_ORIENTATION = 5.124503135681152343f;
111 static constexpr float CLONE_Z_OFFSET = 0.308f;
112
113 void OnQuestStatusChange(Player* player, Quest const* quest, QuestStatus oldStatus, QuestStatus newStatus) override
114 {
115 BaseQuestWarmingUp::OnQuestStatusChange(player, quest, oldStatus, newStatus);
116
117 if (newStatus == QUEST_STATUS_REWARDED)
118 {
119 Creature* garrickLowerDeck = FindCreatureIgnorePhase(player, "q56775_garrick_lower_deck", 5.0f);
120 Creature* garrickUpperDeck = FindCreatureIgnorePhase(player, "q56775_garrick_upper_deck", 75.0f);
121 if (!garrickLowerDeck || !garrickUpperDeck)
122 return;
123
124 Position pos(garrickLowerDeck->GetPositionX(), garrickLowerDeck->GetPositionY(), garrickLowerDeck->GetPositionZ() - CLONE_Z_OFFSET, CLONE_ORIENTATION);
125 garrickUpperDeck->SummonPersonalClone(pos, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
126 }
127 }
128};
129
131{
132public:
133 q59926_warming_up() : BaseQuestWarmingUp("q59926_warming_up") { }
134
135 void OnQuestStatusChange(Player* player, Quest const* quest, QuestStatus oldStatus, QuestStatus newStatus) override
136 {
137 BaseQuestWarmingUp::OnQuestStatusChange(player, quest, oldStatus, newStatus);
138
139 if (newStatus == QUEST_STATUS_REWARDED)
140 {
141 Creature* grimaxeLowerDeck = FindCreatureIgnorePhase(player, "q59926_grimaxe_lower_deck", 5.0f);
142 Creature* grimaxeUpperDeck = FindCreatureIgnorePhase(player, "q59926_grimaxe_upper_deck", 75.0f);
143 if (!grimaxeLowerDeck || !grimaxeUpperDeck)
144 return;
145
146 grimaxeUpperDeck->SummonPersonalClone(*grimaxeLowerDeck, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
147 }
148 }
149};
150
168
169// 156280 - Captain Garrick
170// 166824 - Warlord Breka Grimaxe
172{
174
175 void InitializeAI() override
176 {
178 }
179
195
196 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
197 {
198 if (pathId == _pathToSparringPartner)
200 else if (pathId == _pathToUpperDeck)
202 }
203
204 void UpdateAI(uint32 diff) override
205 {
206 _events.Update(diff);
207
208 while (uint32 eventId = _events.ExecuteEvent())
209 {
210 switch (eventId)
211 {
213 Talk(SAY_SPAR);
215 break;
219 break;
222 break;
223 default:
224 break;
225 }
226 }
227 }
228private:
232};
233
270
271// 58209 - Stand Your Ground
272// 59927 - Stand Your Ground
274{
275public:
276 quest_stand_your_ground() : QuestScript("quest_stand_your_ground") { }
277
278 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
279 {
280 // Remove aura if player drops quest
281 if (newStatus == QUEST_STATUS_NONE)
282 {
283 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
285 }
286 }
287};
288
289// 303065 - Summon Cole - Combat Training (DNT)
290// 325108 - Summon Throg - Combat Training (DNT)
292{
293 // @TODO: drop after TARGET_UNK_142 impl
294
296 {
297 Player* caster = GetCaster()->ToPlayer();
298 if (!caster)
299 return;
300
301 Creature* partner = FindCreatureIgnorePhase(caster, caster->GetTeam() == ALLIANCE ? "q58209_cole" : "q59927_throg", 10.0f);
302 if (!partner)
303 return;
304
305 target = partner;
306 }
307
312};
313
314// 157051 - Alliance Sparring Partner
315// 166814 - Horde Sparring Partner
317{
319
339
340 void EnterEvadeMode(EvadeReason /*why*/) override
341 {
342 if (!me->IsAlive())
343 return;
344
345 me->CombatStop(true);
349 }
350
351 void MovementInform(uint32 uiType, uint32 uiId) override
352 {
353 if (uiType != POINT_MOTION_TYPE)
354 return;
355
356 switch (uiId)
357 {
359 me->SetWalk(true);
361 break;
363 if (Unit* owner = me->GetDemonCreator())
364 me->SetFacingToObject(owner);
365 me->SetImmuneToPC(false);
366 me->SetUninteractible(false);
367 break;
368 default:
369 break;
370 }
371 }
372
373 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
374 {
375 if (pathId != _path)
376 return;
377
378 if (Unit* owner = me->GetDemonCreator())
379 {
381 owner->CastSpell(owner, SPELL_UPDATE_PHASE_SHIFT);
382 owner->CastSpell(owner, SPELL_COMBAT_TRAINING_COMPLETE);
383 }
384 }
385
386 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
387 {
388 if (me->GetHealth() <= damage)
389 {
390 damage = 0;
391 me->SetHealth(1);
392 DoStopAttack();
393 me->SetImmuneToPC(true);
394 me->SetUninteractible(true);
396
397 if (Player* player = me->GetDemonCreatorPlayer())
398 {
399 me->SetFacingToObject(player);
401 player->CastSpell(player, SPELL_COMBAT_TRAINING);
402 player->KilledMonsterCredit(NPC_KILL_CREDIT);
403 }
404 }
405
406 if (me->HealthBelowPctDamaged(65, damage) && !_jumped)
407 {
408 _jumped = true;
412 }
413 }
414
415 void JustEngagedWith(Unit* /*who*/) override
416 {
418 }
419
420 void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) override
421 {
422 if (target->GetHealthPct() < 95)
423 damage = 0;
424 }
425
426 void StartPrivateConversation(uint32 conversationId)
427 {
428 if (Unit* owner = me->GetDemonCreator())
429 {
430 Conversation* conversation = Conversation::CreateConversation(conversationId, owner, *owner, owner->GetGUID(), nullptr, false);
431 conversation->AddActor(_actorId, _actorIndex, me->GetGUID());
432 conversation->Start();
433 }
434 }
435
437 {
438 std::list<Creature*> sparPoints;
441
442 if (sparPoints.empty()) // should never happen
443 return nullptr;
444
445 return sparPoints.front();
446 }
447
448 void UpdateAI(uint32 diff) override
449 {
450 _events.Update(diff);
451
452 while (uint32 eventId = _events.ExecuteEvent())
453 {
454 switch (eventId)
455 {
457 {
458 if (Creature* sparPoint = GetRandomSparPoint())
459 me->GetMotionMaster()->MovePoint(POSITION_SPARPOINT_ADVERTISMENT, sparPoint->GetPosition());
460
462 break;
463 }
466 break;
469 break;
470 case EVENT_WALK_BACK:
472 me->GetMotionMaster()->MovePath(_path, false);
473 break;
474 default:
475 break;
476 }
477 }
478
479 if (!UpdateVictim())
480 return;
481 }
482private:
488};
489
498
499// 160664 - Private Cole
500// 166583 - Grunt Throg
502{
504
505 void OnQuestAccept(Player* player, Quest const* quest) override
506 {
508 {
509 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
510 player->CastSpell(player, SPELL_SUMMON_COLE);
511 }
512 else if (quest->GetQuestId() == QUEST_STAND_YOUR_GROUND_HORDE)
513 {
514 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
515 player->CastSpell(player, SPELL_SUMMON_THROG);
516 }
517 }
518};
519
521{
522 std::string_view StringId;
524};
525
526static std::vector<ActorData> const ActorDataMap[2] =
527{
528 // TEAM_ALLIANCE
529 {
530 { "q58208_garrick", { 35.5643f, -1.19837f, 12.1479f, 3.3272014f } },
531 { "q58208_richter", { -1.84858f, -8.38776f, 5.10018f, 1.5184366f } },
532 { "q58208_keela", { -15.3642f, 6.5793f, 5.5026f, 3.1415925f } },
533 { "q58208_bjorn", { 12.8406f, -8.49553f, 4.98031f, 4.8520155f } },
534 { "q58208_austin", { -4.48607f, 9.89729f, 5.07851f, 1.5184366f } },
535 { "q58208_cole", { -13.3396f, 0.702157f, 5.57996f, 0.087266445f } },
536 },
537 // TEAM_HORDE
538 {
539 { "q59928_grimaxe", { 25.5237f, 0.283005f, 26.5455f, 3.3526998f } },
540 { "q59928_throg", { -10.8399f, 11.9039f, 8.88028f, 6.2308254f } },
541 { "q59928_mithdran", { -24.4763f, -4.48273f, 9.13471f, 0.62831855f } },
542 { "q59928_lana", { -5.1971f, -15.0268f, 8.992f, 4.712389f } },
543 { "q59928_bo", { -22.1559f, 5.58041f, 9.09176f, 6.143559f } },
544 { "q59928_jinhake", { -31.9464f, 7.5772f, 10.6408f, 6.0737457f } },
545 }
546};
547
548static std::unordered_map<Races, std::string_view> const ActorPetData =
549{
550 { RACE_HUMAN, "q58208_wolf" },
551 { RACE_DWARF, "q58208_bear" },
552 { RACE_NIGHTELF, "q58208_tiger" },
553 { RACE_GNOME, "q58208_bunny" },
554 { RACE_DRAENEI, "q58208_moth" },
555 { RACE_WORGEN, "q58208_dog" },
556 { RACE_PANDAREN_ALLIANCE, "q58208_turtle" },
557 { RACE_ORC, "q59928_wolf" },
558 { RACE_UNDEAD_PLAYER, "q59928_bat" },
559 { RACE_TAUREN, "q59928_plainstrider" },
560 { RACE_TROLL, "q59928_raptor" },
561 { RACE_GOBLIN, "q59928_scorpion" },
562 { RACE_BLOODELF, "q59928_dragonhawk" },
563 { RACE_PANDAREN_HORDE, "q59928_turtle" }
564};
565
571
572// 58208 - Brace For Impact
573// 59928 - Brace For Impact
575{
576public:
577 quest_brace_for_impact() : QuestScript("quest_brace_for_impact") { }
578
579 void OnQuestStatusChange(Player* player, Quest const* quest, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
580 {
581 if (newStatus != QUEST_STATUS_COMPLETE)
582 return;
583
584 TeamId team = TEAM_NEUTRAL;
585 Position petSpawnPos;
586
588 {
589 team = TEAM_ALLIANCE;
590 petSpawnPos = { -1.4492f, 8.06887f, 5.10348f, 2.6005409f };
591 }
592 else if (quest->GetQuestId() == QUEST_BRACE_FOR_IMPACT_HORDE)
593 {
594 team = TEAM_HORDE;
595 petSpawnPos = { -22.8374f, -3.08287f, 9.12613f, 3.857178f };
596 }
597
598 if (team == TEAM_NEUTRAL)
599 return;
600
601 SpawnActors(player, team, petSpawnPos);
602 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
603 }
604
605 void SpawnActors(Player* player, TeamId team, Position petSpawnPos)
606 {
607 for (ActorData const& actor : ActorDataMap[team])
608 SpawnActor(player, FindCreatureIgnorePhase(player, actor.StringId, 50.0f), actor.ActorPosition);
609
610 SpawnPet(player, petSpawnPos);
611 }
612
613 void SpawnPet(Player* player, Position const& position)
614 {
615 if (player->GetClass() != CLASS_HUNTER)
616 return;
617
618 if (std::string_view const* stringId = Trinity::Containers::MapGetValuePtr(ActorPetData, Races(player->GetRace())))
619 {
620 Creature* pet = FindCreatureIgnorePhase(player, *stringId, 25.0f);
621 if (!pet)
622 return;
623
624 SpawnActor(player, pet, position);
625 }
626 }
627
628 void SpawnActor(Player* player, Creature* creature, Position const& position)
629 {
630 TransportBase const* transport = player->GetDirectTransport();
631
632 if (!transport || !creature)
633 return;
634
635 creature->SummonPersonalClone(transport->GetPositionWithOffset(position), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
636 }
637};
638
651
652// 156280 - Captain Garrick
653// 166827 - Warlord Breka Grimaxe
655{
657
676
677 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
678 {
679 if (pathId == _pathPreTalk)
681 else if (pathId == _pathPostTalk)
683 }
684
685 void UpdateAI(uint32 diff) override
686 {
687 _events.Update(diff);
688
689 while (uint32 eventId = _events.ExecuteEvent())
690 {
691 switch (eventId)
692 {
696 break;
699 break;
700 default:
701 break;
702 }
703 }
704 }
705private:
710};
711
725
726// 160664 - Private Cole
727// 166583 - Grunt Throg
729{
731
741
742 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
743 {
744 if (_path && pathId == _path)
746 }
747
748 void UpdateAI(uint32 diff) override
749 {
750 _events.Update(diff);
751
752 while (uint32 eventId = _events.ExecuteEvent())
753 {
754 switch (eventId)
755 {
759 break;
761 me->GetMotionMaster()->MovePath(_path, false);
762 break;
763 default:
764 break;
765 }
766 }
767 }
768private:
771};
772
795
796// 157042 - Quartermaster Richter
797// 157043 - Kee-La
798// 157044 - Bjorn Stouthands
799// 157046 - Austin Huxworth
800// 166585 - Bo
801// 166590 - Mithdran Dawntracker
802// 166794 - Lana Jordan
803// 166799 - Provisoner Jin'hake
805{
806 npc_crew_ship_private(Creature* creature) : ScriptedAI(creature), _path(0) { }
807
823
824 void JustAppeared() override
825 {
826 _path = GetPathID();
827 _scheduler.Schedule(Seconds(7), [this](TaskContext const&)
828 {
829 me->GetMotionMaster()->MovePath(_path, false);
830 });
831 }
832
833 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
834 {
835 if (_path && pathId == _path)
837 }
838
839 void UpdateAI(uint32 diff) override
840 {
841 _scheduler.Update(diff);
842 }
843
844private:
847};
848
859
860// 167337 - Mechanical Bunny
861// 167342 - Moth
862// 167343 - Dragonhawk
863// 167344 - Scorpion
864// 167345 - Wolf
865// 167346 - Wolf
866// 167347 - Tiger
867// 167348 - Turtle
868// 167349 - Plainstrider
869// 167350 - Raptor
870// 167351 - Bat
871// 167352 - Dog
872// 167375 - Bear
874{
875 npc_pet_ship_private(Creature* creature) : ScriptedAI(creature), _path(0) { }
876
877 void JustAppeared() override
878 {
879 if (!me->GetTransport())
880 return;
881
882 int32 transportMap = me->GetTransport()->GetMapIdForSpawning();
883 if (transportMap == MAP_ALLIANCE_SHIP)
885 else if (transportMap == MAP_HORDE_SHIP)
887
888 if (_path)
890 }
891
892 void WaypointPathEnded(uint32 /*nodeId*/, uint32 /*pathId*/) override
893 {
895 }
896
897 void UpdateAI(uint32 diff) override
898 {
899 _events.Update(diff);
900
901 while (uint32 eventId = _events.ExecuteEvent())
902 {
903 if (eventId == EVENT_PET_SHIP_RUN_TO_POSITION)
904 me->GetMotionMaster()->MovePath(_path, false);
905 }
906 }
907
908private:
911};
912
922
924{
925public:
926 player_exiles_reach_ship_crash() : PlayerScript("player_exiles_reach_ship_crash") { }
927
928 void OnMovieComplete(Player* player, uint32 movieId) override
929 {
930 switch (movieId)
931 {
933 player->CastSpell(player, SPELL_ALLIANCE_SHIP_CRASH, true);
934 break;
936 player->CastSpell(player, SPELL_HORDE_SHIP_CRASH, true);
937 break;
938 default:
939 break;
940 }
941 }
942};
943
945{
946public:
947 scene_alliance_and_horde_ship() : SceneScript("scene_alliance_and_horde_ship") { }
948
949 void StartConvo(Player* player)
950 {
951 // This script is used to send conversation to Captian Garrick and Warlord Grimaxe on movement after entering ship
952 player->CastSpell(player, SPELL_BEGIN_TUTORIAL, true);
953 }
954
955 void OnSceneComplete(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) override
956 {
957 StartConvo(player);
958 }
959
960 void OnSceneCancel(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) override
961 {
962 StartConvo(player);
963 }
964};
965
966// ***************************************************************
967// * Scripting in this section occurs after teleporting to beach *
968// ***************************************************************
969
974
975// 305445 - Knocked Down!
977{
978 bool Validate(SpellInfo const* /*spellInfo*/) override
979 {
981 }
982
983 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
984 {
986 }
987
992};
993
1000
1001// Script scene for washed up on beach to cast spells Alliance and Horde
1003{
1004public:
1005 scene_alliance_and_horde_crash() : SceneScript("scene_alliance_and_horde_crash") { }
1006
1007 void OnSceneTriggerEvent(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/, std::string const& triggerName) override
1008 {
1009 if (triggerName == "Begin Knockdown Aura")
1010 player->CastSpell(player, SPELL_KNOCKED_DOWN, true);
1011 }
1012
1013 void OnSceneComplete(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) override
1014 {
1016 }
1017};
1018
1020{
1021 if (creature->IsPrivateObject())
1022 {
1023 if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
1024 {
1025 if ((privateObjectOwner->GetTeam() == ALLIANCE && privateObjectOwner->GetQuestStatus(QUEST_BRACE_FOR_IMPACT_ALLIANCE) == QUEST_STATUS_NONE))
1026 return new npc_ship_captain_warming_up_private(creature);
1027 else
1028 return new npc_ship_captain_brace_for_impact_private(creature);
1029 }
1030 }
1031
1032 return new NullCreatureAI(creature);
1033}
1034
1040
1041// 305464 - Crash Landed
1042// 325136 - Crash Landed
1043template<uint32 StaticCaptainNPCId>
1045{
1046 void HandleEffect(SpellEffIndex /*effIndex*/)
1047 {
1048 Player* player = GetCaster()->ToPlayer();
1049 if (!player)
1050 return;
1051
1052 if (Creature* creature = player->FindNearestCreature(StaticCaptainNPCId, 50.0f))
1053 creature->SummonPersonalClone(creature->GetPosition(), TempSummonType(TEMPSUMMON_MANUAL_DESPAWN), 0s, 0, 0, player);
1054 }
1055
1060};
1061
1084
1085// 156626 - Captain Garrick
1086// 166782 - Warlord Breka Grimaxe
1088{
1090
1091 void IsSummonedBy(WorldObject* summonerWO) override
1092 {
1093 Player* summoner = summonerWO->ToPlayer();
1094 if (!summoner)
1095 return;
1096
1097 me->SetFacingToObject(summoner);
1098 Talk(TALK_ARRIVED_AT_BEACH, summoner);
1099 me->DespawnOrUnsummon(5s);
1100 }
1101};
1102
1103// 156626 - Captain Garrick
1104// 166782 - Warlord Breka Grimaxe
1105// for Emergency first aid quest 54951
1107{
1109
1110 void InitializeAI() override
1111 {
1113 }
1114
1115 void IsSummonedBy(WorldObject* summonerWO) override
1116 {
1117 Player* summoner = summonerWO->ToPlayer();
1118 if (!summoner)
1119 return;
1120
1122 }
1123
1124 void MovementInform(uint32 uiType, uint32 uiId) override
1125 {
1126 if (uiType != POINT_MOTION_TYPE)
1127 return;
1128
1129 switch (uiId)
1130 {
1135 break;
1136 case POINT_BEACH_HOME:
1138 break;
1139 default:
1140 break;
1141 }
1142 }
1143
1144 void UpdateAI(uint32 diff) override
1145 {
1146 _events.Update(diff);
1147
1148 while (uint32 eventId = _events.ExecuteEvent())
1149 {
1150 switch (eventId)
1151 {
1155 break;
1160 break;
1162 me->GetMotionMaster()->MovePoint(POINT_SECOND_SURVIVOR, -414.15277f, -2605.2014f, 0.91079247f, false);
1163 break;
1165 me->GetMotionMaster()->MovePoint(POINT_BEACH_HOME, -435.15277f, -2610.9915f, 0.649292f, false);
1166 break;
1167 default:
1168 break;
1169 }
1170 }
1171 }
1172
1173public:
1175 {
1176 _firstMateGUID = coleGUID;
1177 }
1178
1180 {
1181 _quartermasterGUID = richterGUID;
1182 }
1183
1184private:
1188};
1189
1190// 156626 - Captain Garrick
1192{
1194
1195 void OnQuestAccept(Player* player, Quest const* quest) override
1196 {
1197 switch (quest->GetQuestId())
1198 {
1201 break;
1203 {
1204 Creature* cole = FindCreatureIgnorePhase(player, "private_cole_beach", 50.0f);
1205 Creature* richter = FindCreatureIgnorePhase(player, "quartermaster_richter_beach", 50.0f);
1206 if (!cole || !richter)
1207 return;
1208
1209 Creature* colePersonal = cole->SummonPersonalClone(cole->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1210 Creature* richterPersonal = richter->SummonPersonalClone(richter->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1211 Creature* mePersonal = me->SummonPersonalClone(me->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1212 if (!colePersonal || !richterPersonal || !mePersonal)
1213 return;
1214
1216 {
1217 personalAI->SetFirstMateGUID(colePersonal->GetGUID());
1218 personalAI->SetQuartermasterGUID(richterPersonal->GetGUID());
1219 }
1220 break;
1221 }
1222 default:
1223 break;
1224 }
1225 }
1226};
1227
1228// 166782 - Warlord Breka Grimaxe
1230{
1232
1233 void OnQuestAccept(Player* player, Quest const* quest) override
1234 {
1235 switch (quest->GetQuestId())
1236 {
1239 break;
1241 {
1242 Creature* throg = FindCreatureIgnorePhase(player, "grunt_throg_beach", 50.0f);
1243 Creature* jinhake = FindCreatureIgnorePhase(player, "jin_hake_beach", 50.0f);
1244 if (!throg || !jinhake)
1245 return;
1246
1247 Creature* throgPersonal = throg->SummonPersonalClone(throg->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1248 Creature* jinhakePersonal = jinhake->SummonPersonalClone(jinhake->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1249 Creature* mePersonal = me->SummonPersonalClone(me->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1250 if (!throgPersonal || !jinhakePersonal || !mePersonal)
1251 return;
1252
1254 {
1255 personalAI->SetFirstMateGUID(throgPersonal->GetGUID());
1256 personalAI->SetQuartermasterGUID(jinhakePersonal->GetGUID());
1257 }
1258 break;
1259 }
1260 default:
1261 break;
1262 }
1263 }
1264};
1265
1267{
1268 if (creature->IsPrivateObject())
1269 {
1270 if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
1271 {
1272 if (privateObjectOwner->GetQuestStatus(QUEST_MURLOC_MANIA_ALLIANCE) == QUEST_STATUS_NONE)
1273 return new npc_captain_warlord_beach_arrive_private(creature);
1274 else
1275 return new npc_captain_warlord_first_aid_private(creature);
1276 }
1277 }
1278 return new npc_captain_garrick_beach(creature);
1279}
1280
1282{
1283 if (creature->IsPrivateObject())
1284 {
1285 if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
1286 {
1287 if (privateObjectOwner->GetQuestStatus(QUEST_MURLOC_MANIA_HORDE) == QUEST_STATUS_NONE)
1288 return new npc_captain_warlord_beach_arrive_private(creature);
1289 else
1290 return new npc_captain_warlord_first_aid_private(creature);
1291 }
1292 }
1293 return new npc_warlord_grimaxe_beach(creature);
1294}
1295
1309
1310// 149917 - Private Cole
1311// 156622 - Quartermaster Richter
1312// 166784 - Grunt Throg
1313// 166800 - Provisioner Jin'hake
1314// for Emergency first aid quest
1315template<uint32 PathId, uint32 WaitTime>
1317{
1319
1320 void InitializeAI() override
1321 {
1323 }
1324
1325 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
1326 {
1327 if (spellInfo->Id != SPELL_BANDAGING)
1328 return;
1329
1330 _casterGUID = caster->GetGUID();
1333 }
1334
1335 void UpdateAI(uint32 diff) override
1336 {
1337 _events.Update(diff);
1338
1339 while (uint32 eventId = _events.ExecuteEvent())
1340 {
1341 switch (eventId)
1342 {
1343 case EVENT_SALUTE:
1345 me->SetFacingToObject(caster);
1348 break;
1349 case EVENT_LEAVE_BEACH:
1350 me->GetMotionMaster()->MovePath(PathId, false);
1351 me->DespawnOrUnsummon(Milliseconds(WaitTime));
1352 break;
1353 default:
1354 break;
1355 }
1356 }
1357 }
1358private:
1361};
1362
1369
1376
1396
1397// 156609 - Bjorn Stouthands
1398// 156610 - Austin Huxworth
1399// 156612 - Kee-La
1400template<uint32 ConversationId>
1402{
1404
1405 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
1406 {
1407 if (spellInfo->Id != SPELL_BANDAGING_QUEST)
1408 return;
1409
1410 if (Player* player = caster->ToPlayer())
1411 {
1412 player->KilledMonsterCredit(me->GetEntry());
1413 Conversation::CreateConversation(ConversationId, player, *player, player->GetGUID(), nullptr);
1414 player->UpdateVisibilityForPlayer(); // Needed to make survivor stand instantly
1415 }
1416 }
1417};
1418
1447
1448// 166786 - Bo
1450{
1451 npc_bo_beach_laying(Creature* creature) : ScriptedAI(creature) { }
1452
1453 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
1454 {
1455 if (spellInfo->Id != SPELL_BANDAGING_QUEST)
1456 return;
1457
1458 static const Position BoCloneSpawnPosition = { -448.731f, -2606.03f, 0.602435f, 6.17441f };
1459
1460 if (Player* player = caster->ToPlayer())
1461 {
1462 player->KilledMonsterCredit(me->GetEntry());
1463
1464 if (Creature* survivor = FindCreatureIgnorePhase(player, "bo_beach", 50.0f))
1465 survivor->SummonPersonalClone(BoCloneSpawnPosition, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1466 }
1467 }
1468};
1469
1470// 166791 - Mithdran Dawntracker
1472{
1474
1475 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
1476 {
1477 if (spellInfo->Id != SPELL_BANDAGING_QUEST)
1478 return;
1479
1480 static constexpr Position MithranCloneSpawnPosition = { -428.576f, -2593.93f, 0.152832f, 4.849576f };
1481
1482 if (Player* player = caster->ToPlayer())
1483 {
1484 player->KilledMonsterCredit(me->GetEntry());
1485
1486 if (Creature* survivor = FindCreatureIgnorePhase(player, "mithran_beach", 50.0f))
1487 survivor->SummonPersonalClone(MithranCloneSpawnPosition, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1488 }
1489 }
1490};
1491
1492// 166796 - Lana Jordan
1494{
1496
1497 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
1498 {
1499 if (spellInfo->Id != SPELL_BANDAGING_QUEST)
1500 return;
1501
1502 static constexpr Position LanaCloneSpawnPosition = { -420.656f, -2600.28f, 0.556646f, 4.046853f };
1503
1504 if (Player* player = caster->ToPlayer())
1505 {
1506 player->KilledMonsterCredit(me->GetEntry());
1507
1508 if (Creature* survivor = FindCreatureIgnorePhase(player, "lana_jordan_beach", 50.0f))
1509 survivor->SummonPersonalClone(LanaCloneSpawnPosition, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1510 }
1511 }
1512};
1513
1514// 150228 - Murloc Spearhunter
1515// 150229 - Murloc Watershaper
1517{
1519
1520 void JustEngagedWith(Unit* who) override
1521 {
1522 me->GetMotionMaster()->MoveJump(EVENT_JUMP, who->GetPosition(), 16.0f, 0.1f);
1523 }
1524};
1525
1526// 166787 - Bo
1527// 166792 - Mithdran Dawntracker
1528// 166797 - Lana Jordan
1529template<uint32 PathId>
1531{
1533
1534 void InitializeAI() override
1535 {
1537 }
1538
1543
1544 void WaypointPathEnded(uint32 /*nodeId*/, uint32 /*pathId*/) override
1545 {
1547 }
1548
1549 void UpdateAI(uint32 diff) override
1550 {
1551 _events.Update(diff);
1552
1553 while (uint32 eventId = _events.ExecuteEvent())
1554 {
1555 switch (eventId)
1556 {
1561 break;
1563 me->GetMotionMaster()->MovePath(PathId, false);
1564 break;
1565 default:
1566 break;
1567 }
1568 }
1569 }
1570private:
1572};
1573
1574// 151088 - Kee La
1575// 151089 - Bjorn Stouthands
1576// 154170 - Austin Huxworth
1577// 166787 - Bo
1578// 166792 - Mithdran Dawntracker
1579// 166797 - Lana Jordan
1580template<uint32 PathId, uint32 WaitTime>
1582{
1584
1585 void JustAppeared() override
1586 {
1588 }
1589
1590 void UpdateAI(uint32 diff) override
1591 {
1592 _events.Update(diff);
1593
1594 while (uint32 eventId = _events.ExecuteEvent())
1595 {
1596 switch (eventId)
1597 {
1601 break;
1603 me->GetMotionMaster()->MovePath(PathId, false);
1604 me->DespawnOrUnsummon(Milliseconds(WaitTime));
1605 break;
1606 default:
1607 break;
1608 }
1609 }
1610 }
1611private:
1613};
1614
1616{
1617 if (creature->IsPrivateObject())
1618 {
1619 if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
1620 {
1621 if ((privateObjectOwner->GetQuestStatus(QUEST_FINDING_THE_LOST_EXPEDITION_HORDE) == QUEST_STATUS_NONE))
1623 else
1625 }
1626 }
1627
1628 return new NullCreatureAI(creature);
1629}
1630
1632{
1633 if (creature->IsPrivateObject())
1634 {
1635 if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
1636 {
1637 if ((privateObjectOwner->GetQuestStatus(QUEST_FINDING_THE_LOST_EXPEDITION_HORDE) == QUEST_STATUS_NONE))
1639 else
1641 }
1642 }
1643
1644 return new NullCreatureAI(creature);
1645}
1646
1648{
1649 if (creature->IsPrivateObject())
1650 {
1651 if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
1652 {
1653 if ((privateObjectOwner->GetQuestStatus(QUEST_FINDING_THE_LOST_EXPEDITION_HORDE) == QUEST_STATUS_NONE))
1655 else
1657 }
1658 }
1659
1660 return new NullCreatureAI(creature);
1661}
1662
1664{
1665 if (creature->IsPrivateObject())
1667 return new NullCreatureAI(creature);
1668}
1669
1676
1683
1704
1705static constexpr Position GarrickAbandonedCampPosition = { -249.059006f, -2492.520020f, 18.0742f };
1706static constexpr Position GrimaxeAbandonedCampPosition = { -249.20117f, -2492.6191f, 17.964903f };
1707
1708// 165359 - Captain Garrick
1709// This script is used by Captian Garrick Follower for Finding the Lost Expedition quest
1711{
1713
1714 void IsSummonedBy(WorldObject* /*summoner*/) override
1715 {
1717 }
1718
1719 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
1720 {
1721 if (spellInfo->Id != SPELL_GARRICK_PING)
1722 return;
1723
1724 if (_reachedCamp)
1725 return;
1726
1727 _reachedCamp = true;
1728
1729 if (Unit* owner = me->GetOwner())
1730 {
1731 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_LINE_ESCORT_SURVIVOR_CAMP, owner, *owner, owner->GetGUID(), nullptr, false);
1732 conversation->AddActor(ACTOR_ID_ALLIANCE_SURVIVOR, 1, me->GetGUID());
1733 conversation->Start();
1734
1737 }
1738 }
1739
1740 void MovementInform(uint32 uiType, uint32 uiId) override
1741 {
1742 if (uiType != POINT_MOTION_TYPE || uiId != POINT_CAMP_POSITION)
1743 return;
1744
1745 if (Unit* owner = me->GetOwner())
1746 {
1747 owner->CastSpell(owner, SPELL_UPDATE_PHASE_SHIFT);
1748 owner->RemoveAura(SPELL_SUMMON_ADMIRAL_GARRICK_GUARDIAN);
1749 }
1750 }
1751
1752 void UpdateAI(uint32 diff) override
1753 {
1754 _events.Update(diff);
1755
1756 while (uint32 eventId = _events.ExecuteEvent())
1757 {
1758 switch (eventId)
1759 {
1761 {
1762 Unit* owner = me->GetOwner();
1763 if (!owner)
1764 break;
1765
1766 Creature* survivor = FindCreatureIgnorePhase(owner, "spawn_check");
1767
1768 if (!survivor)
1769 {
1770 if (owner->GetAreaId() != AREA_ABANDONED_CAMP)
1772 else
1774 }
1775 else
1776 {
1777 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_LINE_ESCORT_ALLIANCE_SURVIVOR, owner, *owner, owner->GetGUID(), nullptr, false);
1778 conversation->AddActor(ACTOR_ID_ALLIANCE_SURVIVOR, 1, me->GetGUID());
1779 conversation->Start();
1780
1782 }
1783 break;
1784 }
1786 if (Unit* owner = me->GetOwner())
1787 me->GetMotionMaster()->MoveFollow(owner, 0.0f, float(M_PI / 4.0f));
1788 break;
1789 default:
1790 break;
1791 }
1792 }
1793 }
1794private:
1797};
1798
1799// 166805 - Warlord Breka Grimaxe
1800// This script is used by Warlord Grimaxe Follower for Finding the Lost Expedition quest
1802{
1804
1805 void IsSummonedBy(WorldObject* /*summoner*/) override
1806 {
1807 _reachedCamp = false;
1808
1810 }
1811
1812 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
1813 {
1814 if (spellInfo->Id != SPELL_GARRICK_PING)
1815 return;
1816
1817 if (_reachedCamp)
1818 return;
1819
1820 if (Unit* owner = me->GetOwner())
1821 {
1822 if (Conversation* conversation = Conversation::CreateConversation(CONVERSATION_LINE_ESCORT_SURVIVOR_CAMP, owner, *owner, owner->GetGUID(), nullptr, false))
1823 {
1824 conversation->AddActor(ACTOR_ID_HORDE_SURVIVOR, 3, me->GetGUID());
1825 conversation->Start();
1826 }
1829 }
1830 }
1831
1832 void MovementInform(uint32 uiType, uint32 uiId) override
1833 {
1834 if (uiType != POINT_MOTION_TYPE || uiId != POINT_CAMP_POSITION)
1835 return;
1836
1837 if (Unit* owner = me->GetOwner())
1838 {
1839 owner->CastSpell(owner, SPELL_UPDATE_PHASE_SHIFT);
1840 owner->RemoveAura(SPELL_SUMMON_WARLORD_GRIMAXE_GUARDIAN);
1841 }
1842 }
1843
1844 void UpdateAI(uint32 diff) override
1845 {
1846 _events.Update(diff);
1847
1848 while (uint32 eventId = _events.ExecuteEvent())
1849 {
1850 switch (eventId)
1851 {
1853 {
1854 Unit* owner = me->GetOwner();
1855 if (!owner)
1856 break;
1857
1858 Creature* survivor = FindCreatureIgnorePhase(owner, "spawn_check");
1859
1860 if (!survivor)
1861 {
1862 if (owner->GetAreaId() != AREA_ABANDONED_CAMP)
1864 else
1866 }
1867 else
1868 {
1869 if (Conversation* conversation = Conversation::CreateConversation(CONVERSATION_LINE_ESCORT_HORDE_SURVIVOR, owner, *owner, owner->GetGUID(), nullptr, false))
1870 {
1871 conversation->AddActor(ACTOR_ID_HORDE_SURVIVOR, 2, me->GetGUID());
1872 conversation->Start();
1873 }
1875 }
1876 break;
1877 }
1879 if (Unit* owner = me->GetOwner())
1880 me->GetMotionMaster()->MoveFollow(owner, 0.0f, float(M_PI / 4.0f));
1881 break;
1882 default:
1883 break;
1884 }
1885 }
1886 }
1887private:
1890};
1891
1892// 54952 - Finding the Lost Expedition
1893// 59931 - Finding the Lost Expedition
1895{
1896public:
1897 quest_finding_the_lost_expedition(char const* script) : QuestScript(script) { }
1898
1899 void HandleQuestStatusChange(Player* player, QuestStatus newStatus, uint32 summonSpellId, std::string_view survivor1StringId, std::string_view survivor2StringId, std::string_view survivor3StringId)
1900 {
1901 switch (newStatus)
1902 {
1904 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
1905 player->CastSpell(player, summonSpellId);
1906
1907 if (Creature* survivor1 = FindCreatureIgnorePhase(player, survivor1StringId, 25.0f))
1908 {
1909 Creature* survivor1Personal = survivor1->SummonPersonalClone(survivor1->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1910 survivor1Personal->SetScriptStringId("spawn_check");
1911 }
1912 if (Creature* survivor2 = FindCreatureIgnorePhase(player, survivor2StringId, 25.0f))
1913 survivor2->SummonPersonalClone(survivor2->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1914 if (Creature* survivor3 = FindCreatureIgnorePhase(player, survivor3StringId, 25.0f))
1915 survivor3->SummonPersonalClone(survivor3->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
1916
1917 break;
1918 case QUEST_STATUS_NONE:
1919 player->RemoveAura(summonSpellId);
1920 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
1921 break;
1922 default:
1923 break;
1924 }
1925 }
1926};
1927
1928// 54952 - Finding the Lost Expedition
1930{
1931public:
1932 quest_finding_the_lost_expedition_alliance() : quest_finding_the_lost_expedition("quest_finding_the_lost_expedition_alliance") { }
1933
1934 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
1935 {
1936 HandleQuestStatusChange(player, newStatus,
1938 "kee_la_beach",
1939 "bjorn_stouthands_beach",
1940 "austin_huxworth_beach");
1941 }
1942};
1943
1944// 59931 - Finding the Lost Expedition
1946{
1947public:
1948 quest_finding_the_lost_expedition_horde() : quest_finding_the_lost_expedition("quest_finding_the_lost_expedition_horde") { }
1949
1950 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
1951 {
1952 HandleQuestStatusChange(player, newStatus,
1954 "bo_beach",
1955 "mithran_beach",
1956 "lana_jordan_beach");
1957 }
1958};
1959
1960// 305596 - Summon Admiral Garrick Guardian
1961// 325076 - Summon Warlord Grimaxe
1963{
1964 // @TODO: drop after TARGET_UNK_142 impl
1965
1967 {
1968 Player* caster = GetCaster()->ToPlayer();
1969 if (!caster)
1970 return;
1971
1972 Creature* survivor = FindCreatureIgnorePhase(caster, caster->GetTeam() == ALLIANCE ? "q54952_garrick" : "q59931_grimaxe", 5.0f);
1973 if (!survivor)
1974 return;
1975
1976 target = survivor;
1977 }
1978
1983};
1984
1985// ******************************************************************
1986// * Scripting in this section occurs after reaching Abandoned Camp *
1987// ******************************************************************
1988
1995
2002
2007
2008static constexpr Position InjuredNpcPositionAbandonedCamp = { -245.40973f, -2492.0886f, 18.404648f, 2.4754f };
2009
2010// 55174 - Cooking Meat
2011// 59932 - Cooking Meat
2013{
2014public:
2015 quest_cooking_meat(char const* script) : QuestScript(script) { }
2016
2017 void HandleQuestStatusChange(Player* player, QuestStatus newStatus, uint32 completeConversationId, std::string_view injuredStringId)
2018 {
2019 switch (newStatus)
2020 {
2022 {
2023 Conversation::CreateConversation(completeConversationId, player, *player, player->GetGUID());
2024 break;
2025 }
2027 {
2028 Creature* injured = FindCreatureIgnorePhase(player, injuredStringId);
2029 if (!injured)
2030 break;
2031
2034 break;
2035 }
2036 default:
2037 break;
2038 }
2039 }
2040};
2041
2042// 55174 - Cooking Meat
2044{
2045public:
2046 quest_cooking_meat_alliance() : quest_cooking_meat("quest_cooking_meat_alliance") { }
2047
2048 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
2049 {
2050 HandleQuestStatusChange(player, newStatus,
2052 "alaria_standing_abandoned_camp");
2053 }
2054};
2055
2056// 59932 - Cooking Meat
2058{
2059public:
2060 quest_cooking_meat_horde() : quest_cooking_meat("quest_cooking_meat_horde") { }
2061
2062 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
2063 {
2064 HandleQuestStatusChange(player, newStatus,
2066 "wonza_standing_abandoned_camp");
2067 }
2068};
2069
2071{
2073
2074 void OnUnitEnter(Unit* unit) override
2075 {
2076 Player* player = unit->ToPlayer();
2077 if (!player)
2078 return;
2079
2081 player->CastSpell(player, SPELL_GARRICK_PING);
2082 }
2083};
2084
2086{
2088
2089 void OnUnitEnter(Unit* unit) override
2090 {
2091 Player* player = unit->ToPlayer();
2092 if (!player)
2093 return;
2094
2095 if (player->GetTeam() == ALLIANCE)
2096 {
2098 return;
2099
2101 return;
2102
2104 }
2105 else
2106 {
2108 return;
2109
2111 return;
2112
2114 }
2115 }
2116};
2117
2123
2124// 59254 - Enhanced Combat Tactics (Alliance)
2125// 59339 - Enhanced Combat Tactics (Alliance Monk)
2126// 59933 - Enhanced Combat Tactics (Horde)
2127// 59934 - Enhanced Combat Tactics (Horde Monk)
2129{
2130public:
2131 quest_enhanced_combat_tactics() : QuestScript("quest_enhanced_combat_tactics") { }
2132
2133 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
2134 {
2135 switch (newStatus)
2136 {
2138 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
2140 break;
2141 case QUEST_STATUS_NONE:
2143 player->UpdateObjectVisibility();
2144 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
2145 break;
2146 default:
2147 break;
2148 }
2149 }
2150};
2151
2152// 320175 - Summon Garrick - Combat Training (DNT)
2153// 325181 - Summon Grimaxe - Combat Training (DNT)
2155{
2156 // @TODO: drop after TARGET_UNK_142 impl
2157
2159 {
2160 Player* caster = GetCaster()->ToPlayer();
2161 if (!caster)
2162 return;
2163
2164 Creature* partner = FindCreatureIgnorePhase(caster, caster->GetTeam() == ALLIANCE ? "garrick_camp" : "grimaxe_camp", 10.0f);
2165 if (!partner)
2166 return;
2167
2168 target = partner;
2169 }
2170
2175};
2176
2178{
2181
2183
2187 // Warrior
2194 // Paladin
2203 // Rogue
2214 // Priest
2220 // Shaman
2225 // Mage
2230 // Warlock
2236 // Druid
2242
2243 // All classes
2249 // Rogue
2251 // Priest, Warlock, Druid
2253 // Shaman
2256 // Mage
2259
2262 //NPC_HORDE_SPARING_PARTNER_ENHANCED = 166916,
2264
2266
2270
2275
2282
2314
2315static constexpr Position EnhancedTrainingWalkPosition = { -250.60243f, -2485.2517f, 17.787413f };
2316static constexpr Position EnhancedTrainingRunPosition = { -231.5225f, -2480.5276f, 19.019197f };
2317
2318// 164577 - Alliance Sparring Partner
2319// 166916 - Horde Sparring Partner
2321{
2323
2324 virtual void OnReadyPointReached() { }
2325
2326 virtual void HandleClassEvent(uint32 /*eventId*/) { }
2327
2332
2333 void IsSummonedBy(WorldObject* summonerWO) override
2334 {
2335 Player* player = summonerWO->GetAffectingPlayer();
2336 if (!player)
2337 return;
2338
2339 if (player->GetTeam() == ALLIANCE)
2340 {
2342
2343 if (player->GetClass() == CLASS_MONK)
2345 else
2347 }
2348 else
2349 {
2351
2352 if (player->GetClass() == CLASS_MONK)
2354 else
2356 }
2357 }
2358
2360 {
2361 Player* player = me->GetDemonCreatorPlayer();
2362 if (!player)
2363 return 0;
2364
2365 uint32 objectiveId = 0;
2366 switch (_questID)
2367 {
2370 break;
2373 break;
2374 default:
2375 break;
2376 }
2377
2378 return player->GetQuestObjectiveData(_questID, objectiveId);
2379 }
2380
2381 void EnterEvadeMode(EvadeReason /*why*/) override
2382 {
2383 if (!me->IsAlive())
2384 return;
2385
2386 me->CombatStop(true);
2389 }
2390
2391 void MovementInform(uint32 uiType, uint32 uiId) override
2392 {
2393 if (uiType != POINT_MOTION_TYPE)
2394 return;
2395
2396 switch (uiId)
2397 {
2399 me->SetWalk(false);
2401 break;
2403 {
2404 std::list<Creature*> sparpoints;
2406 Trinity::Containers::RandomResize(sparpoints, 1);
2407
2408 for (Creature* creature : sparpoints)
2410 break;
2411 }
2413 {
2414 Unit* owner = me->GetDemonCreator();
2415 if (!owner)
2416 break;
2417
2418 me->SetFacingToObject(owner);
2419 me->SetImmuneToPC(false);
2420 me->SetUninteractible(false);
2422
2424 break;
2425 }
2426 default:
2427 break;
2428 }
2429 }
2430
2431 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
2432 {
2433 damage = me->GetHealth() - 1;
2434
2435 if (me->HealthBelowPctDamaged(20, damage))
2437 }
2438
2439 void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) override
2440 {
2441 if (target->GetHealthPct() < 91)
2442 damage = 0;
2443 }
2444
2446 {
2447 if (Player* player = me->GetDemonCreatorPlayer())
2448 {
2449 Conversation* conversation = Conversation::CreateConversation(conversationId, player, *player, player->GetGUID(), nullptr, false);
2450 if (!conversation)
2451 return;
2452
2453 conversation->AddActor(ACTOR_ID_ALLIANCE_ENHANCED_TRAINING, 0, player->GetTeam() == ALLIANCE ? me->GetGUID() : ObjectGuid::Empty);
2454 conversation->AddActor(ACTOR_ID_HORDE_ENHANCED_TRAINING, 1, player->GetTeam() == HORDE ? me->GetGUID() : ObjectGuid::Empty);
2455 conversation->Start();
2456 }
2457 }
2458
2459 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
2460 {
2461 // Used to check if reached home
2462 if (pathId == PATH_COMBAT_TRAINER_HOME)
2463 {
2464 if (Unit* owner = me->GetDemonCreator())
2465 {
2466 owner->CastSpell(owner, SPELL_UPDATE_PHASE_SHIFT);
2467 owner->RemoveAura(_summonSpellAuraID);
2468 }
2469 }
2470 }
2471
2472 void UpdateAI(uint32 diff) override
2473 {
2474 _events.Update(diff);
2475
2476 while (uint32 eventId = _events.ExecuteEvent())
2477 {
2478 switch (eventId)
2479 {
2481 // Used by all classes
2482 me->SetWalk(true);
2485 break;
2487 {
2488 // Used by all classes
2489 if (Unit* owner = me->GetDemonCreator())
2490 me->SetFacingToObject(owner);
2491
2492 me->SetImmuneToPC(false);
2493 me->SetUninteractible(false);
2494 break;
2495 }
2497 // Used by all classes
2498 me->SetImmuneToPC(true);
2499 me->SetUninteractible(true);
2500 me->RemoveAllAuras();
2501 if (Unit* owner = me->GetDemonCreator())
2502 {
2503 me->SetFacingToObject(owner);
2506 }
2507 break;
2509 // Used by all classes
2510 me->GetMotionMaster()->Clear();
2512 break;
2513 default:
2514 HandleClassEvent(eventId);
2515 break;
2516 }
2517 }
2518
2519 if (!UpdateVictim())
2520 return;
2521 }
2522
2523protected:
2527};
2528
2529// 164577 - Alliance Sparring Partner
2530// 166916 - Horde Sparring Partner
2532{
2534
2546
2554
2555 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
2556 {
2557 Player* player = caster->ToPlayer();
2558 if (!player)
2559 return;
2560
2561 if (spellInfo->Id == SPELL_CHARGE)
2562 {
2565
2567
2568 switch (GetQuestCredits())
2569 {
2570 case 1:
2572 break;
2573 case 2:
2575 break;
2576 case 3:
2578 break;
2579 default:
2580 break;
2581 }
2582 }
2583 else if (spellInfo->Id == SPELL_SLAM)
2584 {
2585 ++_slamCounter;
2586
2587 if (_slamCounter == 3 && GetQuestCredits())
2588 ResetWarrior(player);
2589
2590 if (!_secondaryCheck)
2591 return;
2592
2593 _secondaryCheck = false;
2595 }
2596 }
2597
2598private:
2601};
2602
2603// 164577 - Alliance Sparring Partner
2604// 166916 - Horde Sparring Partner
2606{
2608
2615
2616 void HandleClassEvent(uint32 eventId) override
2617 {
2618 switch (eventId)
2619 {
2621 {
2622 if (_holyPowerCheck) // Used by paladin
2623 {
2624 if (Unit* owner = me->GetDemonCreator())
2625 {
2626 if (owner->GetPower(POWER_HOLY_POWER) >= 3)
2627 {
2628 switch (GetQuestCredits())
2629 {
2630 case 0:
2632 break;
2633 case 1:
2635 break;
2636 case 2:
2638 break;
2639 default:
2640 break;
2641 }
2642 _holyPowerCheck = false;
2643 }
2644 }
2645 }
2647 break;
2648 }
2649 default:
2650 break;
2651 }
2652 }
2653
2654 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
2655 {
2656 Player* player = caster->ToPlayer();
2657 if (!player)
2658 return;
2659
2660 if (spellInfo->Id == SPELL_SHIELD_OF_THE_RIGHTEOUS)
2661 {
2663
2664 switch (GetQuestCredits())
2665 {
2666 case 1:
2668 _secondaryCheck = true;
2669 break;
2670 case 2:
2672 _secondaryCheck = true;
2673 break;
2674 case 3:
2677 break;
2678 default:
2679 break;
2680 }
2681 }
2682 else if (spellInfo->Id == SPELL_CRUSADER_STRIKE)
2683 {
2684 if (_secondaryCheck)
2685 {
2686 switch (GetQuestCredits())
2687 {
2688 case 0:
2690 break;
2691 case 1:
2693 break;
2694 case 2:
2696 break;
2697 default:
2698 break;
2699 }
2700 _secondaryCheck = false;
2701 _holyPowerCheck = true;
2702 }
2703 }
2704 }
2705
2706private:
2709};
2710
2711// 164577 - Alliance Sparring Partner
2712// 166916 - Horde Sparring Partner
2714{
2716
2723
2724 void JustEngagedWith(Unit* /*who*/) override
2725 {
2726 if (!GetQuestCredits())
2728 }
2729
2730 void HandleClassEvent(uint32 eventId) override
2731 {
2732 switch (eventId)
2733 {
2737 break;
2739 {
2740 if (_comboPointCheck) // Used by rogue
2741 {
2742 if (Unit* owner = me->GetDemonCreator())
2743 _comboPointsCounter = owner->GetPower(POWER_COMBO_POINTS);
2744
2745 if (_comboPointsCounter >= (GetQuestCredits() + 3))
2746 {
2747 switch (GetQuestCredits())
2748 {
2749 case 0:
2751 break;
2752 case 1:
2754 break;
2755 case 2:
2757 break;
2758 default:
2759 break;
2760 }
2761 _comboPointCheck = false;
2762 }
2763 }
2765 break;
2766 }
2767 default:
2768 break;
2769 }
2770 }
2771
2772 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
2773 {
2774 Player* player = caster->ToPlayer();
2775 if (!player)
2776 return;
2777
2778 if (spellInfo->Id == SPELL_EVISCERATE)
2779 {
2780 _comboPointCheck = true;
2781 if (_comboPointsCounter >= (GetQuestCredits() + 3))
2782 {
2784
2785 switch (GetQuestCredits())
2786 {
2787 case 1:
2789 _secondaryCheck = true;
2790 break;
2791 case 2:
2793 _secondaryCheck = true;
2794 break;
2795 case 3:
2798 break;
2799 default:
2800 break;
2801 }
2802 }
2803 else
2804 {
2806 }
2807 }
2808 else if (spellInfo->Id == SPELL_SINISTER_STRIKE)
2809 {
2810 if (!GetQuestCredits())
2812
2813 if (_secondaryCheck)
2814 {
2815 switch (GetQuestCredits())
2816 {
2817 case 0:
2819 break;
2820 case 1:
2822 break;
2823 case 2:
2825 break;
2826 default:
2827 break;
2828 }
2829 _secondaryCheck = false;
2830 }
2831 }
2832 }
2833
2834private:
2838};
2839
2840// 164577 - Alliance Sparring Partner
2841// 166916 - Horde Sparring Partner
2843{
2845
2853
2854 void HandleClassEvent(uint32 eventId) override
2855 {
2856 switch (eventId)
2857 {
2859 {
2861 if (!aura)
2862 break;
2863
2865 {
2866 int32 pandemicDuration = CalculatePct(aura->GetMaxDuration(), 30.0f);
2867 if (aura->GetDuration() <= pandemicDuration)
2868 {
2871 }
2872 }
2874 break;
2875 }
2876 default:
2877 break;
2878 }
2879 }
2880
2881 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
2882 {
2883 Player* player = caster->ToPlayer();
2884 if (!player)
2885 return;
2886
2887 if (spellInfo->Id == SPELL_SHADOW_WORD_PAIN)
2888 {
2891
2893 {
2894 if (_secondaryCheck)
2895 {
2897 me->SetImmuneToPC(false);
2898 me->SetUninteractible(false);
2900 _secondaryCheck = false;
2901 }
2902 else
2904 }
2905 else
2906 {
2909
2912 else
2914 }
2915 }
2916 else if (spellInfo->Id == SPELL_SMITE)
2917 {
2918 if (_secondaryCheck)
2920 }
2921 }
2922
2923private:
2926};
2927
2928// 164577 - Alliance Sparring Partner
2929// 166916 - Horde Sparring Partner
2931{
2933
2941
2942 void HandleClassEvent(uint32 eventId) override
2943 {
2944 switch (eventId)
2945 {
2947 if (Unit* owner = me->GetDemonCreator())
2948 {
2949 me->CastSpell(owner, SPELL_KNOCKBACK);
2951 }
2952 break;
2955 me->SetImmuneToPC(false);
2956 me->SetUninteractible(false);
2957 _secondaryCheck = true;
2958 break;
2959 default:
2960 break;
2961 }
2962 }
2963
2964 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
2965 {
2966 Player* player = caster->ToPlayer();
2967 if (!player)
2968 return;
2969
2970 if (spellInfo->Id == SPELL_PRIMAL_STRIKE)
2971 {
2972 if (!player->IsWithinDist(me, 2.0f))
2973 return;
2974
2976
2977 if (_primalStrikeCounter < 3)
2978 {
2979 if (_primalStrikeCounter == 1)
2981 return;
2982 }
2983
2986
2988 {
2990 }
2991 else
2992 {
2994 me->SetImmuneToPC(true);
2995 me->SetUninteractible(true);
2997 }
2998 }
2999 else if (spellInfo->Id == SPELL_LIGHTNING_BOLT)
3000 {
3003 if (_secondaryCheck)
3004 {
3006 _secondaryCheck = false;
3007 }
3008 else
3009 {
3010 if (player->IsWithinDist(me, 2.0f))
3012 }
3013 }
3014 }
3015
3016private:
3019};
3020
3021// 164577 - Alliance Sparring Partner
3022// 166916 - Horde Sparring Partner
3024{
3026
3034
3035 void HandleClassEvent(uint32 eventId) override
3036 {
3037 switch (eventId)
3038 {
3040 if (Unit* owner = me->GetDemonCreator())
3041 {
3042 me->CastSpell(owner, SPELL_KNOCKBACK);
3044 }
3045 break;
3048 me->SetImmuneToPC(false);
3049 me->SetUninteractible(false);
3050 _secondaryCheck = true;
3051 break;
3052 default:
3053 break;
3054 }
3055 }
3056
3057 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
3058 {
3059 Player* player = caster->ToPlayer();
3060 if (!player)
3061 return;
3062
3063 if (spellInfo->Id == SPELL_FIRE_BLAST)
3064 {
3065 if (player->IsWithinDist(me, 2.0f))
3066 {
3068
3070 {
3072 }
3073 else
3074 {
3076 me->SetImmuneToPC(true);
3077 me->SetUninteractible(true);
3079 }
3080 }
3081 else
3082 {
3084 }
3085 }
3086 else if (spellInfo->Id == SPELL_FROSTBOLT)
3087 {
3090 if (_secondaryCheck)
3091 {
3093 _secondaryCheck = false;
3094 }
3095 else
3096 {
3097 if (player->IsWithinDist(me, 2.0f))
3099 }
3100 }
3101 }
3102
3103private:
3105};
3106
3107// 164577 - Alliance Sparring Partner
3108// 166916 - Horde Sparring Partner
3110{
3112
3120
3121 void HandleClassEvent(uint32 eventId) override
3122 {
3123 switch (eventId)
3124 {
3126 {
3127 Aura* aura = me->GetAura(SPELL_CORRUPTION);
3128 if (!aura)
3129 break;
3130
3132 {
3133 int32 pandemicDuration = CalculatePct(aura->GetMaxDuration(), 30.0f);
3134 if (aura->GetDuration() <= pandemicDuration)
3135 {
3138 }
3139 }
3141 break;
3142 }
3143 default:
3144 break;
3145 }
3146 }
3147
3148 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
3149 {
3150 Player* player = caster->ToPlayer();
3151 if (!player)
3152 return;
3153
3154 if (spellInfo->Id == SPELL_CORRUPTION)
3155 {
3158
3160 {
3161 if (_secondaryCheck)
3162 {
3164 me->SetImmuneToPC(false);
3165 me->SetUninteractible(false);
3167 _secondaryCheck = false;
3168 }
3169 else
3171 }
3172 else
3173 {
3176
3179 else
3181 }
3182 }
3183 else if (spellInfo->Id == SPELL_SHADOWBOLT)
3184 {
3185 if (_secondaryCheck)
3187 }
3188 }
3189
3190private:
3193};
3194
3195// 164577 - Alliance Sparring Partner
3196// 166916 - Horde Sparring Partner
3221
3222// 164577 - Alliance Sparring Partner
3223// 166916 - Horde Sparring Partner
3225{
3227
3236
3237 void HandleClassEvent(uint32 eventId) override
3238 {
3239 switch (eventId)
3240 {
3242 {
3243 Aura* aura = me->GetAura(SPELL_MOONFIRE);
3244 if (!aura)
3245 break;
3246
3248 {
3249 int32 pandemicDuration = CalculatePct(aura->GetMaxDuration(), 30.0f);
3250 if (aura->GetDuration() <= pandemicDuration)
3251 {
3254 }
3255 }
3257 break;
3258 }
3259 default:
3260 break;
3261 }
3262 }
3263
3264 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
3265 {
3266 Player* player = caster->ToPlayer();
3267 if (!player)
3268 return;
3269
3270 if (spellInfo->Id == SPELL_MOONFIRE)
3271 {
3274
3276 {
3277 if (!_hitByMoonfire)
3278 {
3280 me->SetImmuneToPC(false);
3281 me->SetUninteractible(false);
3283 _hitByMoonfire = true;
3284 }
3285 else
3287 }
3288 else
3289 {
3292
3295 else
3297 }
3298 }
3299 else if (spellInfo->Id == SPELL_WRATH)
3300 {
3301 if (!_hitByMoonfire)
3303 }
3304 }
3305
3306private:
3309};
3310
3312{
3313 TempSummon* summon = creature->ToTempSummon();
3314 if (!summon)
3315 return new NullCreatureAI(creature);
3316
3317 Unit* summoner = summon->GetSummonerUnit();
3318 if (!summoner)
3319 return new NullCreatureAI(creature);
3320
3321 Player* player = summoner->ToPlayer();
3322 if (!player)
3323 return new NullCreatureAI(creature);
3324
3325 switch (player->GetClass())
3326 {
3327 case CLASS_WARRIOR:
3329 case CLASS_PALADIN:
3331 case CLASS_ROGUE:
3333 case CLASS_PRIEST:
3335 case CLASS_SHAMAN:
3337 case CLASS_MAGE:
3339 case CLASS_WARLOCK:
3341 case CLASS_MONK:
3343 case CLASS_DRUID:
3345 default:
3346 return new NullCreatureAI(creature);
3347 }
3348}
3349
3351{
3353
3354 void OnUnitEnter(Unit* unit) override
3355 {
3356 Player* player = unit->ToPlayer();
3357 if (!player)
3358 return;
3359
3360 Unit* caster = at->GetCaster();
3361 if (!caster)
3362 {
3364 return;
3365 }
3366
3367 caster->SetFacingToObject(player);
3368
3369 switch (player->GetClass())
3370 {
3371 case CLASS_WARRIOR:
3373 break;
3374 case CLASS_PRIEST:
3375 case CLASS_SHAMAN:
3376 case CLASS_MAGE:
3377 case CLASS_WARLOCK:
3378 caster->CastSpell(player, SPELL_CHARGE_KNOCKBACK);
3379 break;
3380 case CLASS_DRUID:
3381 caster->CastSpell(player, SPELL_CHARGE_KNOCKBACK_DRUID);
3382 break;
3383 default:
3384 break;
3385 }
3386 }
3387};
3388
3389// 320605 - Charge Knockback (DNT)
3391{
3393 {
3394 PreventHitDefaultEffect(effIndex);
3395 }
3396
3398 {
3399 Unit* caster = GetCaster();
3400 if (!caster)
3401 return;
3402
3403 Player* player = GetHitUnit()->ToPlayer();
3404 if (!player)
3405 return;
3406
3407 Conversation* conversation = Conversation::CreateConversation(GetSpellInfo()->GetEffect(effIndex).MiscValue, player, *player, player->GetGUID(), nullptr, false);
3408 if (!conversation)
3409 return;
3410
3411 conversation->AddActor(ACTOR_ID_ALLIANCE_ENHANCED_TRAINING, 0, player->GetTeam() == ALLIANCE ? caster->GetGUID() : ObjectGuid::Empty);
3412 conversation->AddActor(ACTOR_ID_HORDE_ENHANCED_TRAINING, 1, player->GetTeam() == ALLIANCE ? ObjectGuid::Empty : caster->GetGUID());
3413 conversation->Start();
3414 }
3415
3421};
3422
3445
3446static constexpr Position GarrickQuillboarBriarpatchPosition = { -142.62154f, -2641.0364f, 48.775497f };
3447static constexpr Position GrimaxeQuillboarBriarpatchPosition = { -142.56076f, -2640.9915f, 48.755478f };
3448
3449// 165360 - Alliance Survivor
3450// This script is used by Captian Garrick Follower for Northbound quest
3452{
3454
3455 void JustAppeared() override
3456 {
3457 Player* player = me->GetAffectingPlayer();
3458 if (!player)
3459 return;
3460
3461 player->UpdateVisibilityForPlayer();
3462
3463 Creature* survivor = FindCreatureIgnorePhase(player, player->GetTeam() == ALLIANCE ? "alaria_standing_abandoned_camp" : "wonza_standing_abandoned_camp", 5.0f);
3464 if (!survivor)
3465 return;
3466
3467 if (player->GetTeam() == ALLIANCE)
3468 {
3475 }
3476 else
3477 {
3484 }
3485
3486 Conversation* conversation = Conversation::CreateConversation(_conversationId, player, *player, player->GetGUID(), nullptr, false);
3487 if (!conversation)
3488 return;
3489
3490 conversation->AddActor(0, 0, player->GetGUID());
3491 conversation->AddActor(_actorIdOne, 1, me->GetGUID());
3492 conversation->AddActor(_actorIdTwo, 2, survivor->GetGUID());
3493 conversation->Start();
3494 }
3495
3496 void IsSummonedBy(WorldObject* /*summoner*/) override
3497 {
3499 }
3500
3501 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
3502 {
3503 if (spellInfo->Id == _lingerSpellId)
3504 {
3507 }
3508 return;
3509 }
3510
3511 void MovementInform(uint32 uiType, uint32 uiId) override
3512 {
3513 if (uiType != POINT_MOTION_TYPE)
3514 return;
3515
3516 if (uiId != POINT_LEADER_RUN)
3517 return;
3518
3519 me->SetFacingTo(6.0737457275390625);
3520
3521 if (Player* player = me->GetAffectingPlayer())
3522 {
3523 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
3524 player->RemoveAura(_guardianSpellId);
3525 player->UpdateVisibilityForPlayer();
3526 }
3527 }
3528
3529 void UpdateAI(uint32 diff) override
3530 {
3531 _events.Update(diff);
3532
3533 while (uint32 eventId = _events.ExecuteEvent())
3534 {
3535 switch (eventId)
3536 {
3538 if (Player* player = me->GetAffectingPlayer())
3539 me->GetMotionMaster()->MoveFollow(player, 0.0f, float(M_PI / 4.0f));
3540 break;
3541 default:
3542 break;
3543 }
3544 }
3545 }
3546
3547private:
3555};
3556
3557// 55173 - Northbound
3558// 59935 - Northbound
3560{
3561public:
3562 quest_northbound(char const* script) : QuestScript(script) { }
3563
3564 void HandleQuestStatusChange(Player* player, QuestStatus newStatus, uint32 summonSpellId)
3565 {
3566 switch (newStatus)
3567 {
3569 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
3570 player->CastSpell(player, summonSpellId);
3571 break;
3572 case QUEST_STATUS_NONE:
3573 player->RemoveAura(summonSpellId);
3574 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
3575 player->UpdateVisibilityForPlayer();
3576 break;
3577 default:
3578 break;
3579 }
3580 }
3581};
3582
3583// 55173 - Northbound
3585{
3586public:
3587 quest_northbound_alliance() : quest_northbound("quest_northbound_alliance") { }
3588
3589 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
3590 {
3592 }
3593};
3594
3595// 59935 - Northbound
3597{
3598public:
3599 quest_northbound_horde() : quest_northbound("quest_northbound_horde") { }
3600
3601 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
3602 {
3604 }
3605};
3606
3607// 305661 - Summon Admiral Garrick Guardian Summons Alliance Entry: 165360
3608// 344383 - Summon Admiral Garrick Guardian Summons Horde Entry: 175034
3610{
3611 // @TODO: drop after TARGET_UNK_142 impl
3612
3614 {
3615 Player* caster = GetCaster()->ToPlayer();
3616 if (!caster)
3617 return;
3618
3619 Creature* survivor = FindCreatureIgnorePhase(caster, caster->GetTeam() == ALLIANCE ? "garrick_camp" : "grimaxe_camp", 5.0f);
3620 if (!survivor)
3621 return;
3622
3623 target = survivor;
3624 }
3625
3630};
3631
3633{
3634 at_northbound_linger(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { }
3635
3636 void OnUnitEnter(Unit* unit) override
3637 {
3638 Player* player = unit->ToPlayer();
3639 if (!player)
3640 return;
3641
3642 if (player->GetTeam() == ALLIANCE)
3643 {
3645 return;
3646
3648 return;
3649
3651 return;
3652
3654 }
3655 else
3656 {
3658 return;
3659
3661 return;
3662
3664 return;
3665
3667 }
3668 }
3669};
3670
3671// @TODO: drop
3672// 305665 - Scene Linger (DNT)
3673// 344385 - Scene Linger (DNT)
3675{
3677 {
3678 PreventHitDefaultEffect(effIndex);
3679 }
3680
3682 {
3683 Player* player = GetHitUnit()->ToPlayer();
3684 if (!player)
3685 return;
3686
3687 Creature* scout = FindCreatureIgnorePhase(player, player->GetTeam() == ALLIANCE ? "huxworth_briarpatch" : "dawntracker_briarpatch", 100.0f);
3688 if (!scout)
3689 return;
3690
3691 Conversation* conversation = Conversation::CreateConversation(GetSpellInfo()->GetEffect(effIndex).MiscValue, player, *player, player->GetGUID(), nullptr, false);
3692 if (!conversation)
3693 return;
3694
3697 conversation->Start();
3698 }
3699
3705};
3706
3707// ***********************************************************************
3708// * Scripting in this section occurs after reaching Quilboar Briarpatch *
3709// ***********************************************************************
3710
3711// Taming the Wild Quest
3725
3726// 59342 - Taming the Wilds
3727// 59937 - Taming the Wilds
3729{
3730public:
3731 quest_taming_the_wilds(char const* script) : QuestScript(script) { }
3732
3733 void HandleQuestStatusChange(Player* player, QuestStatus newStatus, std::string_view creatureString, uint32 questObjective1, uint32 questObjective2)
3734 {
3735 switch (newStatus)
3736 {
3738 if (Creature* survivor = FindCreatureIgnorePhase(player, creatureString, 5.0f))
3739 survivor->SummonPersonalClone(survivor->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
3740
3741 // Hacks QUEST_OBJECTIVE_CRITERIA_TREE needs research
3742 if (player->HasSpell(SPELL_TAME_BEAST))
3744
3747 break;
3748 default:
3749 break;
3750 }
3751 }
3752};
3753
3754// 59342 - Taming The Wild
3756{
3757public:
3758 quest_taming_the_wilds_alliance() : quest_taming_the_wilds("quest_taming_the_wilds_alliance") { }
3759
3760 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
3761 {
3763 }
3764};
3765
3766// 59937 - Taming The Wild
3768{
3769public:
3770 quest_taming_the_wilds_horde() : quest_taming_the_wilds("quest_taming_the_wilds_horde") { }
3771
3772 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
3773 {
3775 }
3776};
3777
3796
3797// 154327 - Austin Huxsworth
3799{
3801
3806
3812
3813 void UpdateAI(uint32 diff) override
3814 {
3815 _events.Update(diff);
3816
3817 while (uint32 eventId = _events.ExecuteEvent())
3818 {
3819 switch (eventId)
3820 {
3823 {
3824 me->SetFacingToObject(player);
3827 player->CastSpell(player, SPELL_LEARNING_TAME_BEAST);
3829 }
3830 break;
3833 {
3835 player->CastSpell(player, SPELL_TUTORIAL_HEALTH_DNT);
3836
3837 if (!player->HasSpell(SPELL_TAME_BEAST))
3838 {
3839 player->UpdateQuestObjectiveProgress(QUEST_OBJECTIVE_CRITERIA_TREE, QUEST_OBJECTIVE_TRAINED_ALLIANCE, 1);
3840 player->CastSpell(player, SPELL_LEARN_TAME_BEAST);
3841 player->CastSpell(player, SPELL_LEARN_CALL_PET);
3842 }
3843
3846 }
3847 me->DespawnOrUnsummon(4s);
3848 break;
3849 default:
3850 break;
3851 }
3852 }
3853 }
3854
3855private:
3857};
3858
3869
3870static constexpr Position GarrickBriarpatchDespawnPosition = { -112.92383f, -2640.541f, 52.35042f };
3871static constexpr Position HuxworthBriarpatchDespawnPosition = { -112.61979f, -2645.9775f, 52.22835f };
3872
3873// 154327 - Austin Huxsworth
3875{
3877
3882
3883 void JustAppeared() override
3884 {
3887 garrick->SetStandState(UNIT_STAND_STATE_STAND);
3888
3890 }
3891
3892 void UpdateAI(uint32 diff) override
3893 {
3894 _events.Update(diff);
3895
3896 while (uint32 eventId = _events.ExecuteEvent())
3897 {
3898 switch (eventId)
3899 {
3901 {
3903 {
3904 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_BRIARPATCH_ALLIANCE, player, *player, player->GetGUID(), nullptr, false);
3905 if (!conversation)
3906 break;
3907
3910 conversation->Start();
3912 }
3913 break;
3914 }
3917 {
3918 garrick->GetMotionMaster()->MovePoint(0, GarrickBriarpatchDespawnPosition);
3919 garrick->DespawnOrUnsummon(3s);
3920 }
3922 me->DespawnOrUnsummon(3s);
3923 break;
3924 default:
3925 break;
3926 }
3927 }
3928 }
3929
3930public:
3931 void SetGarrickGUID(ObjectGuid garrickGUID)
3932 {
3933 _garrickGUID = garrickGUID;
3934 }
3935
3936private:
3939};
3940
3941// 166996 - Mithdran Dawntracker
3943{
3945
3950
3956
3957 void UpdateAI(uint32 diff) override
3958 {
3959 _events.Update(diff);
3960
3961 while (uint32 eventId = _events.ExecuteEvent())
3962 {
3963 switch (eventId)
3964 {
3967 {
3968 me->SetFacingToObject(player);
3970 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_HORDE_TRAINER, player, *player, player->GetGUID(), nullptr, false);
3971 if (conversation)
3972 {
3973 conversation->AddActor(CONVERSATION_HORDE_ACTOR, 0, me->GetGUID());
3974 conversation->Start();
3975 }
3976 player->CastSpell(player, SPELL_LEARNING_TAME_BEAST);
3978 }
3979 break;
3982 {
3984 player->CastSpell(player, SPELL_TUTORIAL_HEALTH_DNT);
3985
3986 if (!player->HasSpell(SPELL_TAME_BEAST))
3987 {
3988 player->UpdateQuestObjectiveProgress(QUEST_OBJECTIVE_CRITERIA_TREE, QUEST_OBJECTIVE_TRAINED_HORDE, 1);
3989 player->CastSpell(player, SPELL_LEARN_TAME_BEAST);
3990 player->CastSpell(player, SPELL_LEARN_CALL_PET);
3991 }
3992 }
3995 me->DespawnOrUnsummon(4s);
3996 break;
3997 default:
3998 break;
3999 }
4000 }
4001 }
4002
4003private:
4005};
4006
4017
4018static constexpr Position GrimaxeBriarpatchDespawnPosition = { -112.92383f, -2640.541f, 52.35042f };
4019static constexpr Position DawntrackerBriarpatchDespawnPosition = { -112.61979f, -2645.9775f, 52.22835f };
4020
4021// 166996 - Mithdran Dawntracker
4023{
4025
4030
4039
4040 void UpdateAI(uint32 diff) override
4041 {
4042 _events.Update(diff);
4043
4044 while (uint32 eventId = _events.ExecuteEvent())
4045 {
4046 switch (eventId)
4047 {
4049 {
4051 {
4052 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_BRIARPATCH_HORDE, player, *player, player->GetGUID(), nullptr, false);
4053 if (!conversation)
4054 break;
4055
4058 conversation->Start();
4060 }
4061 break;
4062 }
4065 {
4066 grimaxe->GetMotionMaster()->MovePoint(0, GrimaxeBriarpatchDespawnPosition );
4067 grimaxe->DespawnOrUnsummon(2s);
4068 }
4070 me->DespawnOrUnsummon(2s);
4071 break;
4072 default:
4073 break;
4074 }
4075 }
4076 }
4077
4078public:
4079 void SetGrimaxeGUID(ObjectGuid grimaxeGUID)
4080 {
4081 _grimaxeGUID = grimaxeGUID;
4082 }
4083
4084private:
4087};
4088
4090{
4091 if (creature->IsPrivateObject())
4092 {
4093 if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
4094 {
4095 if (privateObjectOwner->GetQuestStatus(QUEST_TAMING_THE_WILDS_ALLIANCE) == QUEST_STATUS_INCOMPLETE)
4096 return new npc_huxsworth_hunter_quest_private(creature);
4097 else
4098 return new npc_huxsworth_briarpatch_quest_private(creature);
4099 }
4100 }
4101 return new NullCreatureAI(creature);
4102}
4103
4105{
4106 if (creature->IsPrivateObject())
4107 {
4108 if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
4109 {
4110 if (privateObjectOwner->GetQuestStatus(QUEST_TAMING_THE_WILDS_HORDE) == QUEST_STATUS_INCOMPLETE)
4111 return new npc_dawntracker_hunter_quest_private(creature);
4112 else
4113 return new npc_dawntracker_briarpatch_quest_private(creature);
4114 }
4115 }
4116 return new NullCreatureAI(creature);
4117}
4118
4119// 316840 - Tutorial - Health (DNT)
4121{
4122 bool Validate(SpellInfo const* /*spellInfo*/) override
4123 {
4125 }
4126
4127 bool CheckProc(ProcEventInfo& eventInfo)
4128 {
4129 if (eventInfo.GetSpellInfo() && eventInfo.GetSpellInfo()->Id == SPELL_TAME_BEAST_EFFECT)
4130 return true;
4131 return false;
4132 }
4133
4138};
4139
4140// 316841 - Tutorial - Health (DNT)
4142{
4143 void HandleScript(SpellEffIndex /*effIndex*/)
4144 {
4145 // This shouldn't happen until tame beast spell completes
4146 if (Player* player = GetCaster()->ToPlayer())
4147 {
4148 if (player->GetTeam() == ALLIANCE)
4149 player->UpdateQuestObjectiveProgress(QUEST_OBJECTIVE_CRITERIA_TREE, QUEST_OBJECTIVE_BEAST_TAMED_ALLIANCE, 1);
4150 else
4151 player->UpdateQuestObjectiveProgress(QUEST_OBJECTIVE_CRITERIA_TREE, QUEST_OBJECTIVE_BEAST_TAMED_HORDE, 1);
4152 }
4153 }
4154
4159};
4160
4171
4172// 55186 - Quest Down with the Quilboar "Alliance"
4173// 55184 - Forbidden Quilboar Necromancy "Alliance"
4174// 59938 - Quest Down with the Quilboar "Horde"
4175// 59939 - Forbidden Quilboar Necromancy "Horde"
4177{
4178public:
4179 quest_briarpatch(char const* script) : QuestScript(script) { }
4180
4181 void HandleQuestStatusChange(Player* player, QuestStatus newStatus, uint32 questDown, uint32 questForbidden, uint32 spellValidated)
4182 {
4183 switch (newStatus)
4184 {
4186 if (player->GetQuestStatus(questDown) != QUEST_STATUS_NONE && player->GetQuestStatus(questForbidden) != QUEST_STATUS_NONE)
4187 {
4188 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
4189 player->CastSpell(player, spellValidated);
4190 }
4191 break;
4192 case QUEST_STATUS_NONE:
4193 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
4194 break;
4195 default:
4196 break;
4197 }
4198 }
4199};
4200
4201// 55186 - Quest Down with the Quilboar "Alliance"
4202// 55184 - Forbidden Quilboar Necromancy "Alliance"
4204{
4205public:
4206 quest_briarpatch_alliance() : quest_briarpatch("quest_briarpatch_alliance") { }
4207
4212};
4213
4214// 59938 - Quest Down with the Quilboar "Horde"
4215// 59939 - Forbidden Quilboar Necromancy "Horde"
4217{
4218public:
4219 quest_briarpatch_horde() : quest_briarpatch("quest_briarpatch_horde") { }
4220
4225};
4226
4227// 298984 - Validated Quest Accept
4229{
4230 void HandleScript(SpellEffIndex /*effIndex*/)
4231 {
4232 if (Player* player = GetCaster()->ToPlayer())
4233 {
4234 Creature* huxsworth = FindCreatureIgnorePhase(player, "huxworth_briarpatch", 10.0f);
4235 Creature* garrick = FindCreatureIgnorePhase(player, "garrick_briarpatch", 10.0f);
4236 if (!huxsworth || !garrick)
4237 return;
4238
4239 Creature* huxsworthPersonal = huxsworth->SummonPersonalClone(huxsworth->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
4240 Creature* garrickPersonal = garrick->SummonPersonalClone(garrick->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
4241 if (!huxsworthPersonal || !garrickPersonal)
4242 return;
4243
4245 huxworthAI->SetGarrickGUID(garrickPersonal->GetGUID());
4246 }
4247 }
4248
4253};
4254
4255// 325309 - Validated Quest Accept
4257{
4258 void HandleScript(SpellEffIndex /*effIndex*/)
4259 {
4260 if (Player* player = GetCaster()->ToPlayer())
4261 {
4262 Creature* dawntracker = FindCreatureIgnorePhase(player, "dawntracker_briarpatch", 10.0f);
4263 Creature* grimaxe = FindCreatureIgnorePhase(player, "grimaxe_briarpatch", 10.0f);
4264 if (!dawntracker || !grimaxe)
4265 return;
4266
4267 Creature* dawntrackerPersonal = dawntracker->SummonPersonalClone(dawntracker->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
4268 Creature* grimaxePersonal = grimaxe->SummonPersonalClone(grimaxe->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
4269 if (!dawntrackerPersonal || !grimaxePersonal)
4270 return;
4271
4273 dawntrackerAI->SetGrimaxeGUID(grimaxePersonal->GetGUID());
4274 }
4275 }
4276
4281};
4282
4304
4305static constexpr Position PrisonerPosition = { 16.4271f, -2511.82f, 78.8215f, 5.66398f };
4306
4307// 151091 - Geolord Grek'og
4309{
4310 npc_geolord_grekog(Creature* creature) : ScriptedAI(creature) { }
4311
4312 void JustAppeared() override
4313 {
4314 uint32 prisonerEntry = NPC_LINDIE_SPRINGSTOCK;
4315
4317 prisonerEntry = NPC_CORK_FIZZLEPOP;
4318
4319 Creature* bunny = me->FindNearestCreatureWithOptions(25.0f, { .CreatureId = NPC_INVIS_BUNNY_GEOLORD, .IgnorePhases = true });
4320 if (!bunny)
4321 return;
4322
4323 if (Creature* prisoner = bunny->SummonCreature(prisonerEntry, PrisonerPosition, TEMPSUMMON_MANUAL_DESPAWN))
4324 _prisonerGUID = prisoner->GetGUID();
4325 }
4326
4327 void JustDied(Unit* /*killer*/) override
4328 {
4330 prisoner->AI()->DoAction(ACTION_FREE_PRISONER);
4331 }
4332
4333 void JustEngagedWith(Unit* who) override
4334 {
4335 if (Player* player = who->ToPlayer())
4336 {
4337 Conversation::CreateConversation(CONVERSATION_GEOLORD_AGGRO, player, *player, player->GetGUID(), nullptr, true);
4338
4341 }
4342 }
4343
4344 void UpdateAI(uint32 diff) override
4345 {
4346 if (!UpdateVictim())
4347 return;
4348
4349 _events.Update(diff);
4350
4351 while (uint32 eventId = _events.ExecuteEvent())
4352 {
4353 switch (eventId)
4354 {
4356 {
4359 break;
4360 }
4362 {
4365 break;
4366 }
4367 default:
4368 break;
4369 }
4370 }
4371 }
4372private:
4375};
4376
4383
4384static constexpr Position BriarpatchPrisonerJumpToPosition = { 19.5174f, -2513.75f, 74.0545f };
4385static constexpr Position PrisonerBriarpatchDespawnPosition = { 51.005207f, -2485.644f, 78.15223f };
4386
4387// 167008 - Cork Fizzlepop
4388// 154301 - Lindie Springstock
4390{
4392
4393 void JustAppeared() override
4394 {
4395 me->SetDisableGravity(true);
4398 }
4399
4400 void DoAction(int32 param) override
4401 {
4402 if (param == ACTION_FREE_PRISONER)
4403 {
4404 me->RemoveAllAuras();
4405 me->SetDisableGravity(false);
4410 }
4411 }
4412
4413 void UpdateAI(uint32 diff) override
4414 {
4415 _events.Update(diff);
4416
4417 while (uint32 eventId = _events.ExecuteEvent())
4418 {
4419 switch (eventId)
4420 {
4423 me->DespawnOrUnsummon(5s);
4424 break;
4425 default:
4426 break;
4427 }
4428 }
4429 }
4430private:
4432};
4433
4439
4450
4451// 150237 - Quilboar Warrior
4453{
4454 npc_quilboar_warrior(Creature* creature) : ScriptedAI(creature) { }
4455
4456 void Reset() override
4457 {
4458 _events.Reset();
4459 }
4460
4461 void JustEngagedWith(Unit* who) override
4462 {
4464
4465 if (roll_chance(33.33f))
4466 Talk(SAY_AGGRO, who);
4467
4469 }
4470
4471 void JustDied(Unit* killer) override
4472 {
4473 if (roll_chance(33.33f))
4474 Talk(SAY_DEATH, killer);
4475 }
4476
4477 void UpdateAI(uint32 diff) override
4478 {
4479 if (!UpdateVictim())
4480 return;
4481
4482 _events.Update(diff);
4483
4484 while (uint32 eventId = _events.ExecuteEvent())
4485 {
4486 switch (eventId)
4487 {
4491 break;
4492 default:
4493 break;
4494 }
4495 }
4496 }
4497
4498private:
4500};
4501
4502// 150238 - Quilboar Geomancer
4504{
4505 npc_quilboar_geomancer(Creature* creature) : ScriptedAI(creature) { }
4506
4507 void Reset() override
4508 {
4509 _events.Reset();
4510 }
4511
4512 void JustEngagedWith(Unit* who) override
4513 {
4515
4516 if (roll_chance(33.33f))
4517 Talk(SAY_AGGRO, who);
4518
4520 }
4521
4522 void JustDied(Unit* killer) override
4523 {
4524 if (roll_chance(33.33f))
4525 Talk(SAY_DEATH, killer);
4526 }
4527
4528 void UpdateAI(uint32 diff) override
4529 {
4530 if (!UpdateVictim())
4531 return;
4532
4533 _events.Update(diff);
4534
4535 while (uint32 eventId = _events.ExecuteEvent())
4536 {
4537 switch (eventId)
4538 {
4542 break;
4543 default:
4544 break;
4545 }
4546 }
4547 }
4548private:
4550};
4551
4560
4561// 156676 - Ogre Overseer
4563{
4564 npc_ogre_overseer(Creature* creature) : ScriptedAI(creature) { }
4565
4566 void Reset() override
4567 {
4568 _events.Reset();
4569 }
4570
4571 void JustEngagedWith(Unit* who) override
4572 {
4573 Talk(SAY_AGGRO, who);
4574
4577 }
4578
4579 void JustDied(Unit* killer) override
4580 {
4581 Talk(SAY_DEATH, killer);
4582 }
4583
4584 void UpdateAI(uint32 diff) override
4585 {
4586 if (!UpdateVictim())
4587 return;
4588
4589 _events.Update(diff);
4590
4591 while (uint32 eventId = _events.ExecuteEvent())
4592 {
4593 switch (eventId)
4594 {
4598 break;
4602 break;
4603 default:
4604 break;
4605 }
4606 }
4607 }
4608private:
4610};
4611
4617
4619{
4620 at_briarpatch_to_plains(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { }
4621
4622 // @TODO: remove when conversation cooldown is implemented
4623 void StartConversation(Player* player, uint32 conversationId)
4624 {
4625 std::vector<WorldObject*> objs;
4626
4627 Trinity::ObjectEntryAndPrivateOwnerIfExistsCheck check(player->GetGUID(), conversationId);
4629 Cell::VisitGridObjects(player, searcher, 100.0f);
4630
4631 if (objs.empty())
4632 Conversation::CreateConversation(conversationId, player, *player, player->GetGUID(), nullptr);
4633 }
4634
4635 void OnUnitEnter(Unit* unit) override
4636 {
4637 Player* player = unit->ToPlayer();
4638 if (!player)
4639 return;
4640
4641 if (player->GetTeam() == ALLIANCE)
4642 {
4644 return;
4645
4647 }
4648 else
4649 {
4651 return;
4652
4654 }
4655 }
4656};
4657
4659{
4660 void ApplyEffect(AuraEffect const* /* aurEff */, AuraEffectHandleModes /*mode*/)
4661 {
4662 if (Creature* target = GetTarget()->ToCreature())
4663 target->SetReactState(REACT_PASSIVE);
4664 }
4665
4666 void RemoveEffect(AuraEffect const* /* aurEff */, AuraEffectHandleModes /*mode*/)
4667 {
4668 if (Creature* target = GetTarget()->ToCreature())
4669 {
4670 target->SetReactState(REACT_AGGRESSIVE);
4671 target->SetStandState(UNIT_STAND_STATE_STAND);
4672 }
4673 }
4674
4680};
4681
4682// **************************************************************
4683// * Scripting in this section occurs after reaching The Plains *
4684// **************************************************************
4685
4713
4714static constexpr Position MiniChopperJumpPosition = { 107.979f, -2414.13f, 95.6243f };
4715
4716// 149899 - Lindie Springstock
4717// 167019 - Cork Fizzlepop
4719{
4721
4739
4740 void UpdateAI(uint32 diff) override
4741 {
4742 _events.Update(diff);
4743
4744 while (uint32 eventId = _events.ExecuteEvent())
4745 {
4746 switch (eventId)
4747 {
4748 case EVENT_CONVERSATION:
4749 {
4751 {
4752 Conversation* conversation = Conversation::CreateConversation(_conversationId, player, *player, player->GetGUID(), nullptr, false);
4753 if (!conversation)
4754 break;
4755
4756 conversation->AddActor(_conversationActorId, 0, me->GetGUID());
4758 conversation->Start();
4759 }
4760
4762 copter->GetMotionMaster()->MoveJump(EVENT_JUMP, MiniChopperJumpPosition, 7.0f, 6.99f);
4763
4765 break;
4766 }
4768 {
4770 {
4771 me->SetFacingTo(0.488383f);
4772 me->CastSpell(copter, SPELL_RE_SIZING);
4773 copter->CastSpell(copter, SPELL_GROW_ONE);
4774 }
4776 break;
4777 }
4779 {
4781 copter->RemoveAura(SPELL_GROW_ONE);
4782
4784 break;
4785 }
4787 {
4789 copter->CastSpell(copter, SPELL_GROW_TWO);
4790
4792 break;
4793 }
4795 {
4797 copter->RemoveAura(SPELL_GROW_TWO);
4798
4800 break;
4801 }
4803 {
4805 copter->CastSpell(copter, SPELL_GROW_THREE);
4806
4808 me->SetFacingTo(4.50382f);
4809 me->DespawnOrUnsummon(27s);
4811 break;
4812 }
4814 {
4816 {
4817 copter->RemoveAura(SPELL_GROW_THREE);
4818 copter->DespawnOrUnsummon(2s);
4819 }
4820 break;
4821 }
4822 default:
4823 break;
4824 }
4825 }
4826 }
4827
4828public:
4829 void SetCopterGUID(ObjectGuid copterGUID)
4830 {
4831 _copterGUID = copterGUID;
4832 }
4833
4834private:
4840};
4841
4843{
4844 if (creature->IsPrivateObject())
4845 {
4846 if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
4847 {
4848 if (privateObjectOwner->GetQuestStatus(QUEST_THE_SCOUT_O_MATIC_5000) == QUEST_STATUS_INCOMPLETE)
4850 }
4851 }
4852 return new NullCreatureAI(creature);
4853}
4854
4856{
4857 if (creature->IsPrivateObject())
4858 {
4859 if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
4860 {
4861 if (privateObjectOwner->GetQuestStatus(QUEST_THE_CHOPPY_BOOSTER_MK5) == QUEST_STATUS_INCOMPLETE)
4863 }
4864 }
4865 return new NullCreatureAI(creature);
4866}
4867
4896
4897// 156526 - Scout-o-Matic 5000
4899{
4900 npc_scoutomatic_5000(Creature* creature) : ScriptedAI(creature) { }
4901
4902 void IsSummonedBy(WorldObject* summoner) override
4903 {
4904 if (Player* player = summoner->ToPlayer())
4905 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
4906 }
4907
4908 void PassengerBoarded(Unit* passenger, int8 /*seatId*/, bool apply) override
4909 {
4910 if (apply && passenger->IsPlayer())
4911 {
4912 me->CastSpell(passenger, SPELL_ROPED_DNT);
4914 }
4915 }
4916
4917 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
4918 {
4920 if (!player)
4921 return;
4922
4923 if (pathId == PATH_COPTER_TO_RUINS)
4924 {
4926 }
4927 else
4928 {
4930 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
4931 }
4932 }
4933
4934 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
4935 {
4936 if (spellInfo->Id == SPELL_SCOUT_O_MATIC_PING_DNT)
4937 {
4938 if (Player* player = caster->ToPlayer())
4939 player->KilledMonsterCredit(NPC_SCOUT_O_MATIC_5000);
4940
4942 }
4943 }
4944
4945 void UpdateAI(uint32 diff) override
4946 {
4947 _events.Update(diff);
4948
4949 while (uint32 eventId = _events.ExecuteEvent())
4950 {
4951 switch (eventId)
4952 {
4954 {
4956 {
4957 me->SetSpeed(MOVE_WALK, 5.5f);
4959 Conversation::CreateConversation(CONVERSATION_RIDE_TO_OGRE_RUINS_ALLIANCE, player, *player, player->GetGUID(), nullptr);
4960 }
4961 break;
4962 }
4964 {
4966 {
4967 me->SetSpeed(MOVE_WALK, 5.0f);
4969 Conversation::CreateConversation(CONVERSATION_RIDE_FROM_OGRE_RUINS_ALLIANCE, player, *player, player->GetGUID(), nullptr);
4970 }
4971 break;
4972 }
4973 default:
4974 break;
4975 }
4976 }
4977 }
4978
4979private:
4981};
4982
4984{
4985 { 50.920593f, -2477.466f, 79.444374f, 0.8753076f },
4986 { 60.51328f, -2476.4822f, 81.034775f, 0.9128374f },
4987 { 53.08128f, -2476.5154f, 79.822624f, 0.9394135f },
4988 { 53.281864f, -2480.052f, 79.18003f, 0.78539818f },
4989 { 53.936935f, -2475.588f, 80.24179f, 0.91009599f }
4990};
4991
4992// 167905 - Choppy Booster Mk. 5
4994{
4996
4997 void IsSummonedBy(WorldObject* summoner) override
4998 {
4999 if (Player* player = summoner->ToPlayer())
5000 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
5001 }
5002
5003 void PassengerBoarded(Unit* passenger, int8 /*seatId*/, bool apply) override
5004 {
5005 if (apply && passenger->IsPlayer())
5006 {
5007 me->CastSpell(passenger, SPELL_ROPED_DNT);
5009 }
5010 }
5011
5012 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
5013 {
5015 if (!player)
5016 return;
5017
5018 if (pathId == PATH_COPTER_TO_RUINS)
5019 {
5020 player->CastSpell(player, SPELL_SCENE_OGRE_RUINS_HORDE);
5021 }
5022 else
5023 {
5025 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
5026 }
5027 }
5028
5029 void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
5030 {
5031 if (spellInfo->Id == SPELL_SCOUT_O_MATIC_PING_DNT)
5032 {
5033 if (Player* player = caster->ToPlayer())
5034 player->KilledMonsterCredit(NPC_CHOPPY_BOOSTER_MK5);
5035
5037 }
5038 return;
5039 }
5040
5041 void UpdateAI(uint32 diff) override
5042 {
5043 _events.Update(diff);
5044
5045 while (uint32 eventId = _events.ExecuteEvent())
5046 {
5047 switch (eventId)
5048 {
5050 {
5052 {
5053 me->SetSpeed(MOVE_WALK, 6.0f);
5055 Conversation::CreateConversation(CONVERSATION_RIDE_TO_OGRE_RUINS_HORDE, player, *player, player->GetGUID(), nullptr);
5056 }
5057 break;
5058 }
5060 {
5062 {
5063 me->SetSpeed(MOVE_WALK, 4.5f);
5065 Conversation::CreateConversation(CONVERSATION_RIDE_FROM_OGRE_RUINS_HORDE, player, *player, player->GetGUID(), nullptr);
5067 }
5068 break;
5069 }
5072 {
5073 if (Creature* wonsa = FindCreatureIgnorePhase(player, "wonsa_darkmaul_plains"))
5074 if (Creature* wonsaClone = wonsa->SummonPersonalClone(HordeCrewPersonalSpawnLocation[0], TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player))
5075 wonsaClone->GetMotionMaster()->MovePath(PATH_WONSA_PLAINS, false);
5076
5077 if (Creature* bo = FindCreatureIgnorePhase(player, "bo_darkmaul_plains"))
5079 boClone->GetMotionMaster()->MovePath(PATH_BO_PLAINS, false);
5080
5081 if (Creature* lana = FindCreatureIgnorePhase(player, "lana_darkmaul_plains"))
5082 if (Creature* lanaClone = lana->SummonPersonalClone(HordeCrewPersonalSpawnLocation[2], TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player))
5083 lanaClone->GetMotionMaster()->MovePath(PATH_LANA_PLAINS, false);
5084
5085 if (Creature* jinhake = FindCreatureIgnorePhase(player, "jinhake_darkmaul_plains"))
5086 if (Creature* jinhakeClone = jinhake->SummonPersonalClone(HordeCrewPersonalSpawnLocation[3], TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player))
5087 jinhakeClone->GetMotionMaster()->MovePath(PATH_JINHAKE_PLAINS, false);
5088
5089 if (Creature* throg = FindCreatureIgnorePhase(player, "throg_darkmaul_plains"))
5090 if (Creature* throgClone = throg->SummonPersonalClone(HordeCrewPersonalSpawnLocation[4], TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player))
5091 throgClone->GetMotionMaster()->MovePath(PATH_THROG_PLAINS, false);
5092 }
5093 break;
5094 default:
5095 break;
5096 }
5097 }
5098 }
5099
5100private:
5102};
5103
5105{
5106 if (Player* player = ObjectAccessor::GetPlayer(*creature, creature->GetOwnerGUID()))
5107 {
5108 if (player->GetQuestStatus(QUEST_THE_CHOPPY_BOOSTER_MK5) == QUEST_STATUS_INCOMPLETE)
5109 return new npc_choppy_booster_scout(creature);
5110 }
5111 return new NullCreatureAI(creature);
5112}
5113
5114// 167909 - Won'sa
5115// 167910 - Bo
5116// 167911 - Lana Jordan
5117// 167912 - Provisoner Jin'hake
5118// 167913 - Grunt Throg
5120{
5122
5123 void WaypointPathEnded(uint32 /*nodeId*/, uint32 /*pathId*/) override
5124 {
5126 }
5127};
5128
5130{
5131 if (creature->IsPrivateObject())
5132 return new npc_horde_crew_plains_private(creature);
5133
5134 return new NullCreatureAI(creature);
5135}
5136
5137static constexpr Position CopterCloneSpawnPosition = { 100.583f, -2417.87f, 90.268f, 0.0f };
5138
5139// Quest 55193 - The Scout-o-Matic 5000 "Alliance"
5140// Quest 59940 - The Choppy Booster Mk. 5 "Horde"
5142{
5143public:
5144 quest_scout_chopper(char const* script) : QuestScript(script) { }
5145
5146 void HandleQuestStatusChange(Player* player, QuestStatus newStatus, std::string_view goblinString, std::string_view copterString)
5147 {
5148 switch (newStatus)
5149 {
5151 {
5152 Creature* goblin = FindCreatureIgnorePhase(player, goblinString, 10.0f);
5153 Creature* copter = FindCreatureIgnorePhase(player, copterString, 10.0f);
5154 if (!goblin || !copter)
5155 return;
5156
5157 Creature* goblinPersonal = goblin->SummonPersonalClone(goblin->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
5158 Creature* copterPersonal = copter->SummonPersonalClone(CopterCloneSpawnPosition, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
5159 if (!goblinPersonal || !copterPersonal)
5160 return;
5161
5162 copterPersonal->SetObjectScale(0.2f);
5163 copterPersonal->RemoveNpcFlag(UNIT_NPC_FLAG_SPELLCLICK);
5164
5166 personalAI->SetCopterGUID(copterPersonal->GetGUID());
5167
5168 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
5169 break;
5170 }
5171 case QUEST_STATUS_NONE:
5172 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
5173 break;
5174 default:
5175 break;
5176 }
5177 }
5178};
5179
5180// 55193 - The Scout-o-Matic 5000 "Alliance"
5182{
5183public:
5184 quest_scout_o_matic_5000() : quest_scout_chopper("quest_scout_o_matic_5000") { }
5185
5186 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
5187 {
5188 HandleQuestStatusChange(player, newStatus, "lindie_springstock_plains", "scout_o_matic");
5189 }
5190};
5191
5192// 59940 - The Choppy Booster Mk. 5 "Horde"
5194{
5195public:
5196 quest_choppy_booster_mk5() : quest_scout_chopper("quest_choppy_booster_mk5") { }
5197
5198 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
5199 {
5200 HandleQuestStatusChange(player, newStatus, "cork_fizzlepop_plains", "choppy_booster");
5201 }
5202};
5203
5204// Quest 56034 - Re-sizing the Situation "Alliance"
5205// Quest 59941 - Re-sizing the Situation "Horde"
5224
5225Position ResizingGuardianPosition = { 100.56077f, -2418.0713f, 90.34765f };
5226
5227// 156749 - Lindie Springstock
5229{
5231
5232 void JustAppeared() override
5233 {
5234 Unit* owner = me->GetOwner();
5235
5236 Player* player = owner->ToPlayer();
5237 if (!player)
5238 return;
5239
5240 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_RESIZING_QUEST_ACCEPT, player, *player, player->GetGUID(), nullptr, false);
5241 if (!conversation)
5242 return;
5243
5244 conversation->AddActor(0, 0, player->GetGUID());
5245 conversation->AddActor(ACTOR_LINDIE_RESIZING_QUEST, 1, me->GetGUID());
5247 conversation->Start();
5248
5250 }
5251
5252 void MovementInform(uint32 uiType, uint32 uiId) override
5253 {
5254 if (uiType != POINT_MOTION_TYPE)
5255 return;
5256
5257 if (uiId != 0)
5258 return;
5259
5260 if (Unit* owner = me->GetOwner())
5261 owner->CastSpell(owner, SPELL_LINDIE_DESUMMON_Q56034);
5262 }
5263
5264 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
5265 {
5266 if (spellInfo->Id != SPELL_PING_LINDIE_Q56034_Q59941)
5267 return;
5268
5270 }
5271
5272 void UpdateAI(uint32 diff) override
5273 {
5274 _events.Update(diff);
5275
5276 while (uint32 eventId = _events.ExecuteEvent())
5277 {
5278 switch (eventId)
5279 {
5281 {
5282 if (Unit* owner = me->GetOwner())
5283 me->GetMotionMaster()->MoveFollow(owner, 0.0f, float(M_PI / 4.0f));
5284 break;
5285 }
5287 {
5289 break;
5290 }
5291 default:
5292 break;
5293 }
5294 }
5295 }
5296
5297private:
5299};
5300
5301// 167915 - Cork Fizzlepop
5303{
5305
5306 void JustAppeared() override
5307 {
5308 Unit* owner = me->GetOwner();
5309 if (!owner)
5310 return;
5311
5312 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_RESIZING_QUEST_ACCEPT, owner, *owner, owner->GetGUID(), nullptr, false);
5313 if (!conversation)
5314 return;
5315
5316 conversation->AddActor(0, 0, owner->GetGUID());
5318 conversation->AddActor(ACTOR_CORK_RESIZING_QUEST, 2, me->GetGUID());
5319 conversation->Start();
5320
5322 }
5323
5324 void MovementInform(uint32 uiType, uint32 uiId) override
5325 {
5326 if (uiType != POINT_MOTION_TYPE)
5327 return;
5328
5329 if (uiId != 0)
5330 return;
5331
5332 if (Unit* owner = me->GetOwner())
5333 {
5334 owner->CastSpell(owner, SPELL_UPDATE_PHASE_SHIFT);
5336 }
5337 }
5338
5339 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
5340 {
5341 if (spellInfo->Id != SPELL_PING_LINDIE_Q56034_Q59941)
5342 return;
5343
5344 Unit* owner = me->GetOwner();
5345 if (!owner)
5346 return;
5347
5348 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_RESIZING_REPORT_BACK, owner, *owner, owner->GetGUID(), nullptr, false);
5349 if (!conversation)
5350 return;
5351
5352 conversation->AddActor(0, 0, owner->GetGUID());
5354 conversation->AddActor(ACTOR_CORK_RESIZING_QUEST, 2, me->GetGUID());
5355 conversation->Start();
5356
5358 }
5359
5360 void UpdateAI(uint32 diff) override
5361 {
5362 _events.Update(diff);
5363
5364 while (uint32 eventId = _events.ExecuteEvent())
5365 {
5366 switch (eventId)
5367 {
5369 {
5370 if (Unit* owner = me->GetOwner())
5371 me->GetMotionMaster()->MoveFollow(owner, 0.0f, float(M_PI / 4.0f));
5372 break;
5373 }
5375 {
5377 break;
5378 }
5379 default:
5380 break;
5381 }
5382 }
5383 }
5384
5385private:
5387};
5388
5398
5399Position GiantBoarPosition = { 116.146f, -2430.48f, 90.508415f };
5400
5401// 156736 - Wandering Boar
5403{
5405
5406 void JustAppeared() override
5407 {
5409 }
5410
5411 void MovementInform(uint32 uiType, uint32 uiId) override
5412 {
5413 if (uiType != POINT_MOTION_TYPE)
5414 return;
5415
5416 if (uiId != POINT_HOME_POSITION)
5417 return;
5418
5419 me->SetFacingTo(0.785398f);
5420
5421 if (Unit* summoner = me->GetDemonCreator())
5422 summoner->CastSpell(summoner, SPELL_UPDATE_PHASE_SHIFT);
5423
5425 }
5426
5427 void UpdateAI(uint32 diff) override
5428 {
5429 _events.Update(diff);
5430
5431 while (uint32 eventId = _events.ExecuteEvent())
5432 {
5433 switch (eventId)
5434 {
5435 case EVENT_BOAR_GROW:
5439 break;
5440 case EVENT_BOAR_MOVE:
5441 me->SetWalk(false);
5443 break;
5444 default:
5445 break;
5446 }
5447 }
5448 }
5449
5450private:
5452};
5453
5454// Spell 305749 - Summon Admiral Garrick Guardian
5455// Spell 326635 - Summon Cork (DNT)
5457{
5458 // @TODO: drop after TARGET_UNK_142 impl
5459
5461 {
5462 Unit* caster = GetCaster();
5463 if (!caster)
5464 return;
5465
5466 Player* player = caster->ToPlayer();
5467 if (!player)
5468 return;
5469
5470 Creature* survivor = FindCreatureIgnorePhase(player, player->GetTeam() == ALLIANCE ? "lindie_springstock_plains" : "cork_fizzlepop_plains", 5.0f);
5471 if (!survivor)
5472 return;
5473
5474 target = survivor;
5475 }
5476
5481};
5482
5501
5502// 305716 - Re-Sizing
5504{
5506 {
5507 if (!GetExplTargetUnit())
5509
5510 Creature* target = GetExplTargetUnit()->ToCreature();
5511 if (!target)
5513
5514 if (target->GetEntry() != NPC_WANDERING_BOAR)
5516
5517 return SPELL_CAST_OK;
5518 }
5519
5524};
5525
5526// 305716 - Re-Sizing
5528{
5529 bool Validate(SpellInfo const* /*spellInfo*/) override
5530 {
5531 return ValidateSpellInfo(
5532 {
5536 });
5537 }
5538
5539 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
5540 {
5541 Player* player = Object::ToPlayer(GetCaster());
5542 Creature* creature = Object::ToCreature(GetTarget());
5543 if (!player || !creature)
5544 return;
5545
5547 {
5548 case 0:
5549 player->CastSpell(creature, SPELL_RESIZER_HIT_ONE_Q56034_Q59941, true);
5550 creature->DespawnOrUnsummon(2s);
5551 break;
5552 case 1:
5553 player->CastSpell(creature, SPELL_RESIZER_HIT_TWO_Q56034_Q59941, true);
5554 creature->DespawnOrUnsummon();
5555 break;
5556 case 2:
5557 player->CastSpell(creature, SPELL_RESIZER_HIT_THREE_Q56034, true);
5558 player->CastSpell(player, SPELL_PING_LINDIE_Q56034_Q59941, true);
5559 creature->DespawnOrUnsummon();
5560 break;
5561 default:
5562 break;
5563 }
5564 }
5565
5570};
5571
5572// 305724 - Resizer Hit
5573// 305721 - Resizer Hit
5575{
5577 {
5578 PreventHitDefaultEffect(effIndex);
5579 }
5580
5582 {
5583 Player* player = Object::ToPlayer(GetCaster());
5584 if (!player)
5585 return;
5586
5588
5589 Creature* guardian = player->FindNearestCreatureWithOptions(10.0f, { .CreatureId = guardianID, .OwnerGuid = player->GetGUID() });
5590 if (!guardian)
5591 return;
5592
5593 Conversation* conversation = Conversation::CreateConversation(GetSpellInfo()->GetEffect(effIndex).MiscValue, player, *player, player->GetGUID(), nullptr, false);
5594 if (!conversation)
5595 return;
5596
5597 conversation->AddActor(0, 0, player->GetGUID());
5598 conversation->AddActor(ACTOR_LINDIE_RESIZING_QUEST, 1, player->GetTeam() == ALLIANCE ? guardian->GetGUID() : ObjectGuid::Empty);
5599 conversation->AddActor(ACTOR_CORK_RESIZING_QUEST, 2, player->GetTeam() == ALLIANCE ? ObjectGuid::Empty : guardian->GetGUID());
5600 conversation->Start();
5601 }
5602
5608};
5609
5610// 305742 - Resizer Hit
5612{
5614 {
5615 PreventHitDefaultEffect(effIndex);
5616 }
5617
5619 {
5620 Player* player = Object::ToPlayer(GetCaster());
5621 if (!player)
5622 return;
5623
5625
5626 Creature* guardian = player->FindNearestCreatureWithOptions(10.0f, { .CreatureId = guardianID, .OwnerGuid = player->GetGUID() });
5627 if (!guardian)
5628 return;
5629
5630 Conversation* conversation = Conversation::CreateConversation(GetSpellInfo()->GetEffect(effIndex).MiscValue, player, *player, player->GetGUID(), nullptr, false);
5631 if (!conversation)
5632 return;
5633
5634 conversation->AddActor(0, 0, player->GetGUID());
5635 conversation->AddActor(ACTOR_LINDIE_RESIZING_QUEST, 1, player->GetTeam() == ALLIANCE ? guardian->GetGUID() : ObjectGuid::Empty);
5636 conversation->AddActor(ACTOR_CORK_RESIZING_QUEST, 2, player->GetTeam() == ALLIANCE ? ObjectGuid::Empty : guardian->GetGUID());
5637 conversation->Start();
5638 }
5639
5645};
5646
5647// 325346 - Re-Sizing
5649{
5650 bool Validate(SpellInfo const* /*spellInfo*/) override
5651 {
5652 return ValidateSpellInfo(
5653 {
5657 });
5658 }
5659
5661 {
5662 if (!GetExplTargetUnit())
5664
5665 Creature* target = GetExplTargetUnit()->ToCreature();
5666 if (!target)
5668
5669 if (target->GetEntry() != NPC_WANDERING_BOAR)
5671
5672 return SPELL_CAST_OK;
5673 }
5674
5675 void HandleScript(SpellEffIndex /*effIndex*/)
5676 {
5677 Player* player = Object::ToPlayer(GetCaster());
5678 Creature* creature = Object::ToCreature(GetHitUnit());
5679 if (!player || !creature)
5680 return;
5681
5683 {
5684 case 0:
5685 case 1:
5686 player->CastSpell(creature, SPELL_RESIZING_Q59941, true);
5687 break;
5688 case 2:
5689 player->CastSpell(creature, SPELL_RE_SIZER_OVERCHARGED_Q56034, true);
5690 player->CastSpell(player, SPELL_PING_LINDIE_Q56034_Q59941, true);
5691 creature->DespawnOrUnsummon(3s);
5692 break;
5693 default:
5694 break;
5695 }
5696 }
5697
5703};
5704
5705// 325345 - Re-Sizing
5707{
5708 bool Validate(SpellInfo const* /*spellInfo*/) override
5709 {
5710 return ValidateSpellInfo(
5711 {
5714 });
5715 }
5716
5717 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
5718 {
5719 Player* player = Object::ToPlayer(GetCaster());
5720 Creature* creature = Object::ToCreature(GetTarget());
5721 if (!player || !creature)
5722 return;
5723
5725 {
5726 case 0:
5727 player->CastSpell(creature, SPELL_RESIZER_HIT_ONE_Q56034_Q59941, true);
5728 creature->DespawnOrUnsummon(2s);
5729 break;
5730 case 1:
5731 player->CastSpell(creature, SPELL_RESIZER_HIT_TWO_Q56034_Q59941, true);
5732 creature->DespawnOrUnsummon();
5733 break;
5734 default:
5735 break;
5736 }
5737 }
5738
5743};
5744
5745// 325368 - Re-sizer Slaughter (DNT)
5767
5768// 56034 - Re-sizing the Situation "Alliance"
5769// 59941 - Re-sizing the Situation "Horde"
5771{
5772public:
5773 quest_resizing_the_situation(char const* script) : QuestScript(script) { }
5774
5775 void HandleQuestStatusChange(Player* player, QuestStatus newStatus, uint32 SummonSpell)
5776 {
5777 switch (newStatus)
5778 {
5780 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
5781 player->CastSpell(player, SummonSpell);
5782 break;
5783 case QUEST_STATUS_NONE:
5784 player->RemoveAura(SummonSpell);
5785 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
5786 break;
5787 default:
5788 break;
5789 }
5790 }
5791};
5792
5793// 56034 - Re-sizing the Situation "Alliance"
5795{
5796public:
5797 quest_resizing_the_situation_alliance() : quest_resizing_the_situation("quest_resizing_the_situation_alliance") { }
5798
5799 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
5800 {
5802 }
5803};
5804
5805// 59941 - Re-sizing the Situation "Horde"
5807{
5808public:
5809 quest_resizing_the_situation_horde() : quest_resizing_the_situation("quest_resizing_the_situation_horde") { }
5810
5811 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
5812 {
5814 }
5815};
5816
5831
5832static constexpr Position ReDeatherAbandonTeleportPos = { 102.3f, -2422.5f, 90.1f, 0.764454185962677001f };
5833
5834// 55879 - Ride of the Scientifically Enhanced Boar
5836{
5837public:
5838 quest_ride_of_the_scientifically_enhanced_boar() : QuestScript("quest_ride_of_the_scientifically_enhanced_boar") { }
5839
5840 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
5841 {
5842 switch (newStatus)
5843 {
5845 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
5847 break;
5849 player->CombatStop();
5850 player->CastSpell(player, SPELL_PING_GARRICK_TORGOK);
5851 break;
5853 player->CastSpell(player, SPELL_REUNION_DNT_ALLIANCE);
5858 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
5859 break;
5860 case QUEST_STATUS_NONE:
5866 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
5868 break;
5869 default:
5870 break;
5871 }
5872 }
5873};
5874
5889
5890// Script scene for Ride of the Scientifically Enhanced Boar quest
5892{
5893public:
5894 scene_darkmaul_plains_skeleton_army_alliance() : SceneScript("scene_darkmaul_plains_skeleton_army_alliance") { }
5895
5896 void OnSceneTriggerEvent(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/, std::string const& triggerName) override
5897 {
5898 if (triggerName == "Trampling Time")
5899 {
5900 player->CastSpell(player, SPELL_ENHANCED_BOAR_TRAMPLE, true);
5901 if (Unit* boar = player->GetVehicleBase())
5902 boar->CastSpell(boar, SPELL_ENHANCED_BOAR_CHARGE, true);
5903 }
5904 else if (triggerName == "Big Kill Credit")
5905 {
5906 player->CastSpell(player, SPELL_ENHANCED_BOAR_KILL_CREDIT, true);
5907
5910 }
5911 else if (triggerName == "Conversation")
5912 {
5913 player->CastSpell(player, SPELL_ENHANCED_BOAR_CHARGE_CONVO, true);
5914 }
5915 else if (triggerName == "Knockback")
5916 {
5917 player->CastSpell(player, SPELL_ENHANCED_BOAR_KNOCKBACK, true);
5918 }
5919 else if (triggerName == "Hint")
5920 {
5921 player->CastSpell(player, SPELL_ENHANCED_BOAR_KNOCKBACK_HINT, true);
5922 }
5923 }
5924};
5925
5926// Spell 305779 - Summon Darkmaul Plains Questgivers (DNT)
5928{
5929 // @TODO: drop after TARGET_UNK_142 impl
5930
5932 {
5933 Player* player = Object::ToPlayer(GetCaster());
5934 if (!player)
5935 return;
5936
5937 Creature* survivor = FindCreatureIgnorePhase(player, "captain_garrick_plains", 5.0f);
5938 if (!survivor)
5939 return;
5940
5941 target = survivor;
5942 }
5943
5948};
5949
5955
5956// 173426 - Riding Giant Boar
5958{
5959 bool Validate(SpellInfo const* /*spellInfo*/) override
5960 {
5961 return ValidateSpellInfo(
5962 {
5966 });
5967 }
5968
5969 void OnAuraRemoveHandler(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
5970 {
5971 Player* player = Object::ToPlayer(GetCaster());
5972 if (!player)
5973 return;
5974
5977 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
5978 }
5979
5984};
5985
5990
5991// 305742 - Resizer Hit
5993{
5995 {
5996 PreventHitDefaultEffect(effIndex);
5997 }
5998
6000 {
6001 Player* player = Object::ToPlayer(GetCaster());
6002 if (!player)
6003 return;
6004
6005 Creature* garrick = player->FindNearestCreatureWithOptions(10.0f, { .CreatureId = NPC_ALLIANCE_CAPTAIN, .OwnerGuid = player->GetGUID() });
6006 if (!garrick)
6007 return;
6008
6009 Conversation* conversation = Conversation::CreateConversation(GetSpellInfo()->GetEffect(effIndex).MiscValue, player, *player, player->GetGUID(), nullptr, false);
6010 if (!conversation)
6011 return;
6012
6013 conversation->AddActor(ACTOR_ALLIANCE_CAPTAIN, 0, garrick->GetGUID());
6014 conversation->Start();
6015 }
6016
6022};
6023
6050
6051Position MoveToPrisonerPosition = { 232.16145f, -2292.5347f, 80.91198f };
6052
6053// 174955 - Captain Garrick
6055{
6057
6058 void JustAppeared() override
6059 {
6060 Player* player = Object::ToPlayer(me->GetOwner());
6061 if (!player)
6062 return;
6063
6064 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_CAPTAIN_GARRICK_RIDE_BOAR_QUEST_ACCEPT, player, *player, player->GetGUID(), nullptr, false);
6065 if (!conversation)
6066 return;
6067
6068 conversation->AddActor(0, 0, player->GetGUID());
6069 conversation->AddActor(ACTOR_ALLIANCE_CAPTAIN, 1, me->GetGUID());
6070 conversation->Start();
6071
6073 me->GetMotionMaster()->MoveFollow(player, 0.0f, float(M_PI / 4.0f));
6074 }
6075
6076 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
6077 {
6078 if (me->GetHealth() <= damage)
6079 damage = me->GetHealth() - 1;
6080 }
6081
6082 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
6083 {
6084 switch (spellInfo->Id)
6085 {
6087 {
6088 Unit* owner = me->GetOwner();
6089 if (!owner)
6090 break;
6091
6094
6096 break;
6097 }
6099 {
6102 break;
6103 }
6105 {
6106 Player* player = Object::ToPlayer(me->GetOwner());
6107 if (!player)
6108 break;
6109
6110 Creature* henry = FindCreatureIgnorePhase(me, "henry_garrick_ogre_ruins_prisoner");
6111 if (!henry)
6112 break;
6113
6114 Creature* henryPersonal = henry->SummonPersonalClone(henry->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
6115 if (!henryPersonal)
6116 break;
6117
6119 _henryGUID = henryPersonal->GetGUID();
6121 break;
6122 }
6123 default:
6124 break;
6125 }
6126 }
6127
6128 void UpdateAI(uint32 diff) override
6129 {
6130 _events.Update(diff);
6131
6132 while (uint32 eventId = _events.ExecuteEvent())
6133 {
6134 switch (eventId)
6135 {
6137 {
6138 if (Unit* owner = me->GetOwner())
6139 {
6140 Creature* boar = owner->FindNearestCreatureWithOptions(10.0f, { .CreatureId = NPC_GIANT_BOAR, .OwnerGuid = owner->GetGUID() });
6141 if (!boar)
6142 return;
6143
6144 boar->SetControlled(false, UNIT_STATE_ROOT);
6146 }
6147 break;
6148 }
6150 {
6151 Player* player = Object::ToPlayer(me->GetOwner());
6152 if (!player)
6153 break;
6154
6155 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_CAPTAIN_GARRICK_RIDE_BOAR_QUEST_HENRY, player, *player, player->GetGUID(), nullptr, false);
6156 if (!conversation)
6157 break;
6158
6159 conversation->AddActor(ACTOR_ALLIANCE_CAPTAIN, 0, me->GetGUID());
6161 conversation->Start();
6162
6163 me->GetMotionMaster()->Clear();
6166 break;
6167 }
6169 {
6172 henry->DespawnOrUnsummon();
6173
6174 Player* player = Object::ToPlayer(me->GetOwner());
6175 if (!player)
6176 break;
6177 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
6178 break;
6179 }
6181 {
6182 Player* player = Object::ToPlayer(me->GetOwner());
6183 if (!player)
6184 break;
6185
6186 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_CAPTAIN_GARRICK_RIDE_BOAR_QUEST_EXIT, player, *player, player->GetGUID(), nullptr, false);
6187 if (!conversation)
6188 break;
6189
6190 conversation->AddActor(0, 0, player->GetGUID());
6191 conversation->AddActor(ACTOR_ALLIANCE_CAPTAIN, 1, me->GetGUID());
6192 conversation->Start();
6193 break;
6194 }
6195 default:
6196 break;
6197 }
6198 }
6199
6200 UpdateVictim();
6201 }
6202private:
6205};
6206
6221
6222// 156267 - Giant Boar
6224{
6226 {
6227 me->SetOrientation(0.844224f);
6228 }
6229
6230 void JustAppeared() override
6231 {
6232 me->SetSpeed(MOVE_RUN, 14.0f);
6233 }
6234
6235 void PassengerBoarded(Unit* passenger, int8 /*seatId*/, bool apply) override
6236 {
6237 if (apply && passenger->IsPlayer())
6238 {
6240 passenger->SetMovedUnit(me);
6241 passenger->CastSpell(passenger, SPELL_PING_GARRICK_TO_RIDE_BOAR); // Ping Garrick to ride Boar (DNT)
6242 passenger->CastSpell(passenger, SPELL_UPDATE_PHASE_SHIFT);
6243 }
6244 else if (apply && passenger->IsCreature())
6245 {
6247 }
6248 }
6249
6250 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
6251 {
6252 if (spellInfo->Id == SPELL_ENHANCED_BOAR_PING_VEHICLE)
6253 {
6257 _endOfScene = true;
6259
6260 if (Unit* owner = me->GetOwner())
6261 owner->CastSpell(owner, SPELL_UPDATE_PHASE_SHIFT);
6262 }
6263 }
6264
6265 void UpdateAI(uint32 diff) override
6266 {
6267 if (!_endOfScene)
6268 return;
6269
6270 _events.Update(diff);
6271
6272 while (uint32 eventId = _events.ExecuteEvent())
6273 {
6274 switch (eventId)
6275 {
6278 me->SetObjectScale(1.2f);
6280 break;
6283 me->SetObjectScale(0.7f);
6285 break;
6288 me->SetObjectScale(1.2f);
6290 break;
6293 me->SetObjectScale(0.1f);
6295 break;
6297 me->RemoveAllAuras();
6299 break;
6302 break;
6303 default:
6304 break;
6305 }
6306 }
6307 }
6308private:
6311};
6312
6321
6322// 162817 - Torgok
6324{
6325 npc_torgok_q55879(Creature* creature) : ScriptedAI(creature) { }
6326
6327 void Reset() override
6328 {
6329 _events.Reset();
6330 }
6331
6332 void JustEngagedWith(Unit* who) override
6333 {
6334 Talk(SAY_AGGRO, who);
6335
6338 }
6339
6340 void JustDied(Unit* killer) override
6341 {
6342 Talk(SAY_DEATH, killer);
6343 }
6344
6345 void UpdateAI(uint32 diff) override
6346 {
6347 if (!UpdateVictim())
6348 return;
6349
6350 _events.Update(diff);
6351
6352 while (uint32 eventId = _events.ExecuteEvent())
6353 {
6354 switch (eventId)
6355 {
6359 break;
6363 break;
6364 default:
6365 break;
6366 }
6367 }
6368 }
6369private:
6371};
6372
6377
6378// 156799 - Henry Garrick
6379// 167126 - Shuja Grimaxe
6381{
6383
6384 void InitializeAI() override
6385 {
6387 }
6388
6389 void JustAppeared() override
6390 {
6391 me->RemoveAllAuras();
6393 }
6394};
6395
6397{
6398 if (creature->IsPrivateObject())
6399 return new npc_prisoner_q55879_private(creature);
6400 else
6401 return new NullCreatureAI(creature);
6402}
6403
6423
6424// 59942 - The Re-Deather
6426{
6427public:
6428 quest_the_re_deather() : QuestScript("quest_the_re_deather") { }
6429
6430 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
6431 {
6432 switch (newStatus)
6433 {
6435 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
6437 break;
6439 player->CombatStop();
6440 player->CastSpell(player, SPELL_PING_GARRICK_TORGOK);
6441 break;
6443 player->CastSpell(player, SPELL_REUNION_DNT_HORDE);
6448 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
6449 break;
6450 case QUEST_STATUS_NONE:
6451 {
6458 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
6460 break;
6461 }
6462 default:
6463 break;
6464 }
6465 }
6466};
6467
6468// 2489
6470{
6471public:
6472 scene_darkmaul_plains_skeleton_army_horde() : SceneScript("scene_darkmaul_plains_skeleton_army_horde") { }
6473
6474 void OnSceneTriggerEvent(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/, std::string const& triggerName) override
6475 {
6476 if (triggerName == "Big Kill Credit")
6477 {
6478 player->CastSpell(player, SPELL_ENHANCED_BOAR_KILL_CREDIT, true);
6479
6481 {
6482 player->CastSpell(player, SPELL_ENHANCED_BOAR_PING_VEHICLE); // Ping Vehicle
6483 player->CastSpell(player, SPELL_RE_DEATHER_TEMP_OBJECTIVE_CHECK); // Temp Objective Check
6484 Conversation::CreateConversation(CONVERSATION_RE_DEATHER_EXPLODE, player, *player, player->GetGUID(), nullptr);
6485 }
6486 }
6487 else if (triggerName == "Conversation")
6488 {
6489 player->CastSpell(player, SPELL_ENHANCED_BOAR_CHARGE_CONVO, true); // Does nothing but it's blizzlike
6490 }
6491 else if (triggerName == "Teleport")
6492 {
6494 }
6495 }
6496
6497 void OnSceneComplete(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) override
6498 {
6499 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
6500 }
6501};
6502
6512
6513// 167146 - Warlord Grimaxe
6515{
6520
6521 void JustAppeared() override
6522 {
6523 Player* player = Object::ToPlayer(me->GetOwner());
6524 if (!player)
6525 return;
6526
6527 Creature* shuja = FindCreatureIgnorePhase(me, "shuja_grimaxe_ogre_ruins_prisoner");
6528 if (!shuja)
6529 return;
6530
6531 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_WARLORD_GRIMAXE_SPAWN_Q59942, player, *player, player->GetGUID(), nullptr, false);
6532 if (!conversation)
6533 return;
6534
6535 conversation->AddActor(ACTOR_SHUJA_GRIMAXE_PRISONER, 0, shuja->GetGUID());
6536 conversation->AddActor(ACTOR_WARLORD_GRIMAXE_Q59942, 1, me->GetGUID());
6537 conversation->Start();
6538
6539 me->GetMotionMaster()->MoveFollow(player, 0.0f, float(M_PI / 4.0f));
6540 }
6541
6542 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
6543 {
6544 if (me->GetHealth() <= damage)
6545 damage = me->GetHealth() - 1;
6546 }
6547
6548 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
6549 {
6550 switch (spellInfo->Id)
6551 {
6553 {
6554 Player* player = Object::ToPlayer(me->GetOwner());
6555 if (!player)
6556 break;
6557
6558 Creature* shuja = FindCreatureIgnorePhase(me, "shuja_grimaxe_ogre_ruins_prisoner");
6559 if (!shuja)
6560 break;
6561
6562 Creature* shujaPersonal = shuja->SummonPersonalClone(shuja->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
6563 if (!shujaPersonal)
6564 break;
6565
6567 _shujaGUID = shujaPersonal->GetGUID();
6569 break;
6570 }
6571 default:
6572 break;
6573 }
6574 }
6575
6576 void OnDespawn() override
6577 {
6579 shuja->DespawnOrUnsummon();
6580 }
6581
6582 void UpdateAI(uint32 diff) override
6583 {
6584 _events.Update(diff);
6585
6586 while (uint32 eventId = _events.ExecuteEvent())
6587 {
6588 switch (eventId)
6589 {
6591 {
6592 Player* player = Object::ToPlayer(me->GetOwner());
6593 if (!player)
6594 break;
6595
6596 Conversation* conversation = Conversation::CreateConversation(CONVERSATION_WARLORD_GRIMAXE_QUEST_COMPLETE_Q59942, player, *player, player->GetGUID(), nullptr, false);
6597 if (!conversation)
6598 break;
6599
6600 conversation->AddActor(ACTOR_WARLORD_GRIMAXE_Q59942, 0, me->GetGUID());
6602 conversation->Start();
6603
6604 me->GetMotionMaster()->Clear();
6607 break;
6608 }
6610 {
6613 shuja->DespawnOrUnsummon();
6614
6615 Player* player = Object::ToPlayer(me->GetOwner());
6616 if (!player)
6617 break;
6618 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
6619 break;
6620 }
6621 default:
6622 break;
6623 }
6624 }
6625
6626 UpdateVictim();
6627 }
6628private:
6631};
6632
6633// ***************************************************************
6634// * Scripting in this section occurs between Ogre Ruins and Pit *
6635// ***************************************************************
6636
6644
6645static constexpr Position BjornWestwardBoundRuinsPos = { 192.181f, -2311.44f, 80.6975f, 3.368485450744628906f };
6646static constexpr Position AlariaWestwardBoundRuinsPos = { 190.953f, -2308.32f, 80.6586f, 2.984513044357299804f };
6647static constexpr Position LanaWestwardBoundRuinsPos = { 160.486f, -2307.31f, 84.053f, 2.932153224945068359f };
6648static constexpr Position WonsaWestwardBoundRuinsPos = { 160.431f, -2310.11f, 84.4598f, 3.03687286376953125f };
6649
6650// 55965 - Quest Westward Bound "Alliance"
6651// 59948 - Quest Westward Bound "Horde"
6653{
6654public:
6655 quest_westward_bound(char const* script) : QuestScript(script) { }
6656
6657 void HandleQuestStatusChange(Player* player, QuestStatus newStatus, std::string_view creatureStringOne, std::string_view creatureStringTwo, uint32 questEnderEntry, uint32 questEnderCompanionEntry, Position questGiverPos, Position companionPos)
6658 {
6659 switch (newStatus)
6660 {
6662 {
6663 Creature* questEnder = FindCreatureIgnorePhase(player, creatureStringOne, 125.0f);
6664 if (!questEnder)
6665 return;
6666
6667 Creature* questEnderCompanion = FindCreatureIgnorePhase(player, creatureStringTwo, 125.0f);
6668 if (!questEnderCompanion)
6669 return;
6670
6671 questEnder->SummonPersonalClone(questGiverPos, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
6672 questEnderCompanion->SummonPersonalClone(companionPos, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
6673
6674 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
6675 break;
6676 }
6677 case QUEST_STATUS_NONE:
6678 {
6679 player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
6680
6681 if (Creature* questGiver = player->FindNearestCreatureWithOptions(100.0f, { .CreatureId = questEnderEntry, .IgnorePhases = true, .PrivateObjectOwnerGuid = player->GetGUID() }))
6682 questGiver->DespawnOrUnsummon();
6683
6684 if (Creature* companion = player->FindNearestCreatureWithOptions(100.0f, { .CreatureId = questEnderCompanionEntry, .IgnorePhases = true, .PrivateObjectOwnerGuid = player->GetGUID() }))
6685 companion->DespawnOrUnsummon();
6686
6687 break;
6688 }
6689 default:
6690 break;
6691 }
6692 }
6693};
6694
6695// 55965 - Quest Westward Bound "Alliance"
6697{
6698public:
6699 quest_westward_bound_alliance() : quest_westward_bound("quest_westward_bound_alliance") { }
6700
6701 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
6702 {
6703 HandleQuestStatusChange(player, newStatus, "bjorn_stouthands_pit_pre_quest", "alaria_pit_pre_quest", NPC_BJORN_STOUTHANDS_PIT_ONE, NPC_ALARIA_PIT_ONE, BjornWestwardBoundRuinsPos, AlariaWestwardBoundRuinsPos);
6704 }
6705};
6706
6707// 59948 - Quest Westward Bound "Horde"
6709{
6710public:
6711 quest_westward_bound_horde() : quest_westward_bound("quest_westward_bound_horde") { }
6712
6713 void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
6714 {
6715 HandleQuestStatusChange(player, newStatus, "lana_joran_pit_pre_quest", "wonsa_pit_pre_quest", NPC_LANAJORDAN_PIT_ONE, NPC_WONSA_PIT_ONE, LanaWestwardBoundRuinsPos, WonsaWestwardBoundRuinsPos);
6716 }
6717};
6718
6728
6729// 156891 - Bjorn Stouthands
6731{
6733
6734 void InitializeAI() override
6735 {
6737 }
6738
6739 void JustAppeared() override
6740 {
6742 }
6743
6744 void WaypointPathEnded(uint32 /*nodeId*/, uint32 /*pathId*/) override
6745 {
6747 me->DespawnOrUnsummon(4s);
6748 }
6749
6750 void UpdateAI(uint32 diff) override
6751 {
6752 _events.Update(diff);
6753
6754 while (uint32 eventId = _events.ExecuteEvent())
6755 {
6756 switch (eventId)
6757 {
6761 break;
6762 default:
6763 break;
6764 }
6765 }
6766 }
6767private:
6769};
6770
6772{
6773 if (creature->IsPrivateObject())
6774 return new npc_bjorn_stouthands_q55965_private(creature);
6775 else
6776 return new NullCreatureAI(creature);
6777}
6778
6789
6790// 167225 - Lana Jordan
6792{
6794
6795 void InitializeAI() override
6796 {
6798 }
6799
6800 void JustAppeared() override
6801 {
6803 }
6804
6805 void WaypointPathEnded(uint32 /*nodeId*/, uint32 /*pathId*/) override
6806 {
6808 me->DespawnOrUnsummon(7s);
6809 }
6810
6811 void UpdateAI(uint32 diff) override
6812 {
6813 _events.Update(diff);
6814
6815 while (uint32 eventId = _events.ExecuteEvent())
6816 {
6817 switch (eventId)
6818 {
6822 break;
6825 break;
6826 default:
6827 break;
6828 }
6829 }
6830 }
6831private:
6833};
6834
6836{
6837 if (creature->IsPrivateObject())
6838 return new npc_lana_jordan_q59948_private(creature);
6839 else
6840 return new NullCreatureAI(creature);
6841}
6842
6850
6851// 156891 - Alaria
6852// 167226 - Won'sa
6853template<uint32 PitPathId>
6855{
6857
6858 void JustAppeared() override
6859 {
6861 }
6862
6863 void WaypointPathEnded(uint32 /*nodeId*/, uint32 /*pathId*/) override
6864 {
6865 me->DespawnOrUnsummon(1s);
6866 }
6867
6868 void UpdateAI(uint32 diff) override
6869 {
6870 _events.Update(diff);
6871
6872 while (uint32 eventId = _events.ExecuteEvent())
6873 {
6874 switch (eventId)
6875 {
6877 me->GetMotionMaster()->MovePath(PitPathId, false);
6878 break;
6879 default:
6880 break;
6881 }
6882 }
6883 }
6884private:
6886};
6887
6889{
6890 if (creature->IsPrivateObject())
6892 else
6893 return new NullCreatureAI(creature);
6894}
6895
6897{
6898 if (creature->IsPrivateObject())
6900 else
6901 return new NullCreatureAI(creature);
6902}
6903
6905{
6906 // Ship
6908 new q59926_warming_up();
6909 new q56775_warming_up();
6923 // Beach
6930 new FactoryCreatureScript<CreatureAI, &HealedByLeaderAllianceAISelector>("npc_healed_by_leader_alliance_beach");
6931 new FactoryCreatureScript<CreatureAI, &HealedByLeaderHordeAISelector>("npc_healed_by_leader_horde_beach");
6935 // Note: alliance survivor do not need a script for Emergency First Aid quest
6941 new FactoryCreatureScript<CreatureAI, &MithdranBeachStandingAISelector>("npc_mithdran_dawntracker_beach_standing");
6944 new FactoryCreatureScript<CreatureAI, &BjornBeachStandingAISelector>("npc_bjorn_stouthands_beach_standing");
6945 new FactoryCreatureScript<CreatureAI, &AustinBeachStandingAISelector>("npc_austin_huxworth_beach_standing");
6951 // Abandoned Camp
6956 // Quest Enhanced Combat Tactics
6962 // Quest Northbound
6969 // Quest Taming The Wilds
6976 // Briarpatch
6982 new GenericCreatureScript<npc_briarpatch_prisoner>("npc_cork_fizzlepop_briarpatch");
6983 new GenericCreatureScript<npc_briarpatch_prisoner>("npc_lindie_springstock_briarpatch");
6989 // Plains scouting quest
6992 new FactoryCreatureScript<CreatureAI, &LindieSpringstockSelector>("npc_lindie_springstock_plains");
6993 new FactoryCreatureScript<CreatureAI, &CorkFizzlepopSelector>("npc_cork_fizzlepop_plains");
6997 // Plains Resizing the situation
7010 // Ride Boar
7020 // The Re-Deather
7024 // Westward Bound
7027 new FactoryCreatureScript<CreatureAI, &BjornRuinsSelector>("npc_bjorn_stouthands_q55965");
7028 new FactoryCreatureScript<CreatureAI, &LanaRuinsSelector>("npc_lana_jordan_q59948");
7031}
#define M_PI
Definition Common.h:118
@ EQUIP_NO_CHANGE
Definition CreatureAI.h:56
uint8_t uint8
Definition Define.h:156
int8_t int8
Definition Define.h:152
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:24
std::chrono::seconds Seconds
Seconds shorthand typedef.
Definition Duration.h:28
@ POINT_MOTION_TYPE
@ FOLLOW_MOTION_TYPE
TempSummonType
@ TEMPSUMMON_MANUAL_DESPAWN
@ TEMPSUMMON_TIMED_DESPAWN
@ QUEST_OBJECTIVE_CRITERIA_TREE
Definition QuestDef.h:372
QuestStatus
Definition QuestDef.h:146
@ QUEST_STATUS_REWARDED
Definition QuestDef.h:153
@ QUEST_STATUS_INCOMPLETE
Definition QuestDef.h:150
@ QUEST_STATUS_NONE
Definition QuestDef.h:147
@ QUEST_STATUS_COMPLETE
Definition QuestDef.h:148
Races
Definition RaceMask.h:27
@ RACE_TROLL
Definition RaceMask.h:36
@ RACE_UNDEAD_PLAYER
Definition RaceMask.h:33
@ RACE_ORC
Definition RaceMask.h:30
@ RACE_DRAENEI
Definition RaceMask.h:39
@ RACE_NIGHTELF
Definition RaceMask.h:32
@ RACE_BLOODELF
Definition RaceMask.h:38
@ RACE_DWARF
Definition RaceMask.h:31
@ RACE_GNOME
Definition RaceMask.h:35
@ RACE_GOBLIN
Definition RaceMask.h:37
@ RACE_HUMAN
Definition RaceMask.h:29
@ RACE_WORGEN
Definition RaceMask.h:50
@ RACE_PANDAREN_ALLIANCE
Definition RaceMask.h:53
@ RACE_PANDAREN_HORDE
Definition RaceMask.h:54
@ RACE_TAUREN
Definition RaceMask.h:34
float rand_norm()
Definition Random.cpp:75
bool roll_chance(T chance)
Definition Random.h:55
#define RegisterCreatureAI(ai_name)
Definition ScriptMgr.h:1392
#define RegisterSpellAndAuraScriptPair(script_1, script_2)
Definition ScriptMgr.h:1381
#define RegisterAreaTriggerAI(ai_name)
Definition ScriptMgr.h:1428
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1383
#define RegisterSpellScriptWithArgs(spell_script, script_name,...)
Definition ScriptMgr.h:1382
void GetCreatureListWithEntryInGrid(Container &container, WorldObject *source, uint32 entry, float maxSearchRange)
SpellEffIndex
@ EFFECT_3
@ EFFECT_1
@ EFFECT_0
@ EFFECT_4
@ EFFECT_2
@ 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
@ EVENT_JUMP
@ 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
@ WS_TEAM_IN_INSTANCE_HORDE
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.
#define SpellObjectTargetSelectFn(F, I, N)
#define SpellCheckCastFn(F)
#define SpellEffectFn(F, I, N)
#define AuraEffectApplyFn(F, I, N, M)
#define AuraCheckProcFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
EvadeReason
#define CAST_AI(a, b)
Definition UnitAI.h:29
@ MOVE_RUN
@ MOVE_WALK
@ REACT_PASSIVE
@ REACT_AGGRESSIVE
@ UNIT_STAND_STATE_SLEEP
Definition UnitDefines.h:45
@ UNIT_STAND_STATE_STAND
Definition UnitDefines.h:42
@ UNIT_NPC_FLAG_GOSSIP
@ UNIT_NPC_FLAG_QUESTGIVER
@ UNIT_NPC_FLAG_SPELLCLICK
DamageEffectType
@ SHEATH_STATE_UNARMED
Definition UnitDefines.h:82
@ UNIT_FLAG_PLAYER_CONTROLLED
@ UNIT_STATE_ROOT
Definition Unit.h:271
T CalculatePct(T base, U pct)
Definition Util.h:72
AreaTrigger *const at
void RemoveFromWorld() override
Unit * GetCaster() const
HookList< EffectApplyHandler > AfterEffectRemove
HookList< EffectApplyHandler > AfterEffectApply
Unit * GetCaster() const
Unit * GetTarget() const
HookList< CheckProcHandler > DoCheckProc
HookList< EffectApplyHandler > OnEffectRemove
int32 GetMaxDuration() const
Definition SpellAuras.h:217
int32 GetDuration() const
Definition SpellAuras.h:222
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
bool IsCreature() const
Definition BaseEntity.h:172
bool IsPlayer() const
Definition BaseEntity.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)
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:63
void EngagementOver()
void SetImmuneToPC(bool apply) override
Definition Creature.h:184
void SetObjectScale(float scale) override
void SetReactState(ReactStates st)
Definition Creature.h:174
void ResetPlayerDamageReq()
Definition Creature.h:415
void SetScriptStringId(std::string id)
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
CreatureAI * AI() const
Definition Creature.h:228
uint32 ExecuteEvent()
Definition EventMap.cpp:77
void Update(uint32 time)
Definition EventMap.h:61
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition EventMap.cpp:40
void CancelEvent(uint32 eventId)
Definition EventMap.cpp:135
Milliseconds GetTimeUntilEvent(uint32 eventId) const
Definition EventMap.cpp:179
void RescheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition EventMap.cpp:56
void Reset()
Definition EventMap.cpp:25
void MoveFollow(Unit *target, float dist, Optional< ChaseAngle > angle={}, Optional< Milliseconds > duration={}, bool ignoreTargetWalk=false, MovementSlot slot=MOTION_SLOT_ACTIVE, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
void MoveJump(uint32 id, Position const &pos, std::variant< std::monostate, float, Milliseconds > speedOrTime={}, Optional< float > minHeight={}, Optional< float > maxHeight={}, MovementFacingTarget const &facing={}, bool orientationFixed=false, bool unlimitedSpeed=false, Optional< float > speedMultiplier={}, JumpArrivalCastArgs const *arrivalCast=nullptr, Movement::SpellEffectExtraData const *spellEffectExtraData=nullptr, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={}, Optional< MovementFadeObject > fadeObject={}, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
void MovePath(uint32 pathId, bool repeatable, Optional< Milliseconds > duration={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< std::pair< Milliseconds, Milliseconds > > waitTimeRangeAtPathEnd={}, Optional< float > wanderDistanceAtPathEnds={}, Optional< bool > followPathBackwardsFromEndToStart={}, Optional< bool > exactSplinePath={}, bool generatePath=true, Optional< MovementFadeObject > fadeObject={}, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
void Remove(MovementGenerator *movement, MovementSlot slot=MOTION_SLOT_ACTIVE)
static ObjectGuid const Empty
Definition ObjectGuid.h:314
Player * ToPlayer()
Definition Object.h:126
uint32 GetEntry() const
Definition Object.h:89
Creature * ToCreature()
Definition Object.h:121
static void AddPhase(WorldObject *object, uint32 phaseId, bool updateVisibility)
static void InheritPhaseShift(WorldObject *target, WorldObject const *source)
static PhaseShift const & GetAlwaysVisiblePhaseShift()
static void ResetPhaseShift(WorldObject *object)
void KilledMonsterCredit(uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
Definition Player.cpp:16679
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:16737
int32 GetQuestObjectiveData(uint32 questId, uint32 objectiveId) const
Definition Player.cpp:16440
void UpdateVisibilityForPlayer()
Definition Player.cpp:24837
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition Player.cpp:15962
bool HasSpell(uint32 spell) const override
Definition Player.cpp:3735
void UpdateObjectVisibility(bool forced=true) override
Definition Player.cpp:24822
Team GetTeam() const
Definition Player.h:2423
SpellInfo const * GetSpellInfo() const
Definition Unit.cpp:281
uint32 GetQuestId() const
Definition QuestDef.h:637
void ResetCharges(uint32 chargeCategoryId)
uint32 const Id
Definition SpellInfo.h:328
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
HookList< CheckCastHandler > OnCheckCast
Unit * GetCaster() const
HookList< EffectHandler > OnEffectHit
void PreventHitDefaultEffect(SpellEffIndex effIndex)
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
HookList< ObjectTargetSelectHandler > OnObjectTargetSelect
HookList< EffectHandler > OnEffectLaunchTarget
Unit * GetExplTargetUnit() const
SpellInfo const * GetSpellInfo() const
TaskScheduler & Schedule(duration_t time, task_handler_t task)
TaskScheduler & Update()
Update the scheduler to the current time.
Unit * GetSummonerUnit() const
virtual Position GetPositionWithOffset(Position const &offset) 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:160
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:180
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:162
Definition Unit.h:635
void CastStop(uint32 except_spellid=0)
Definition Unit.cpp:1186
float GetHealthPct() const
Definition Unit.h:796
void CombatStop(bool includingCast=false, bool mutualPvP=true, bool(*unitFilter)(Unit const *otherUnit)=nullptr)
Definition Unit.cpp:6012
void SetHealth(uint64 val)
Definition Unit.cpp:9973
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3828
void SetStandState(UnitStandStateType state, uint32 animKitID=0)
Definition Unit.cpp:10731
void SetControlled(bool apply, UnitState state)
Definition Unit.cpp:11545
uint8 GetClass() const
Definition Unit.h:764
Player * GetDemonCreatorPlayer() const
Definition Unit.cpp:6197
ObjectGuid GetOwnerGUID() const override
Definition Unit.h:1191
void SetSpeed(UnitMoveType mtype, float newValue)
Definition Unit.cpp:8937
Unit * GetVehicleBase() const
Definition Unit.cpp:12111
MotionMaster * GetMotionMaster()
Definition Unit.h:1723
void SetMovedUnit(Unit *target)
Definition Unit.cpp:10396
void SetFacingToObject(WorldObject const *object, bool force=true)
Definition Unit.cpp:13307
bool IsAlive() const
Definition Unit.h:1185
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:998
TempSummon * ToTempSummon()
Definition Unit.h:1828
UnitAI * GetAI() const
Definition Unit.h:668
bool SetDisableGravity(bool disable, bool updateAnimTier=true)
Definition Unit.cpp:13361
void SetUninteractible(bool apply)
Definition Unit.cpp:8564
void SetSheath(SheathState sheathed)
Definition Unit.cpp:5813
void SetEmoteState(Emote emote)
Definition Unit.h:865
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4700
uint64 GetHealth() const
Definition Unit.h:788
TransportBase * GetDirectTransport() const
Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)
Definition Unit.cpp:12151
bool SetWalk(bool enable)
Definition Unit.cpp:13343
bool HealthBelowPctDamaged(float pct, uint32 damage) const
Definition Unit.h:793
void SetFacingTo(float const ori, bool force=true)
Definition Unit.cpp:13289
void NearTeleportTo(TeleportLocation const &target, bool casting=false)
Definition Unit.cpp:12958
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4804
void RemoveAllAuras()
Definition Unit.cpp:4382
SpellHistory * GetSpellHistory()
Definition Unit.h:1498
void HandleEmoteCommand(Emote emoteId, Player *target=nullptr, Trinity::IteratorPair< int32 const * > spellVisualKitIds={}, int32 sequenceVariation=0)
Definition Unit.cpp:1657
void SetUnitFlag(UnitFlags flags)
Definition Unit.h:846
void ChangeSeat(int8 seatId, bool next=true)
Definition Unit.cpp:12803
uint8 GetRace() const
Definition Unit.h:761
void SetAIAnimKitId(uint16 animKitId)
Definition Unit.cpp:11174
Unit * GetDemonCreator() const
Definition Unit.cpp:6192
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:1421
void PlayDirectSound(uint32 soundId, Player const *target=nullptr, uint32 broadcastTextId=0) const
Definition Object.cpp:2938
Map * GetMap() const
Definition Object.h:411
Creature * FindNearestCreatureWithOptions(float range, FindCreatureOptions const &options) const
Definition Object.cpp:1526
ObjectGuid GetPrivateObjectOwner() const
Definition Object.h:569
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2217
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
Definition Object.cpp:1398
Unit * GetOwner() const
Definition Object.cpp:1598
TransportBase * GetTransport() const
Definition Object.h:537
bool IsPrivateObject() const
Definition Object.h:568
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:1517
uint32 GetAreaId() const
Definition Object.h:333
Position GetFirstCollisionPosition(float dist, float angle)
Definition Object.cpp:2762
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:496
Player * GetAffectingPlayer() const
Definition Object.cpp:1630
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 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)
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
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:37
void RandomResize(C &container, std::size_t requestedSize)
Definition Containers.h:67
TC_GAME_API int32 GetValue(int32 worldStateId, Map const *map)
std::string_view StringId
Position ActorPosition
static void VisitGridObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition CellImpl.h:179
constexpr void SetOrientation(float orientation)
Definition Position.h:82
constexpr float GetPositionX() const
Definition Position.h:87
constexpr float GetPositionY() const
Definition Position.h:88
constexpr void GetPosition(float &x, float &y) const
Definition Position.h:92
constexpr float GetPositionZ() const
Definition Position.h:89
void SetEquipmentSlots(bool loadDefault, int32 mainHand=EQUIP_NO_CHANGE, int32 offHand=EQUIP_NO_CHANGE, int32 ranged=EQUIP_NO_CHANGE)
ScriptedAI(Creature *creature, uint32 scriptId=0) noexcept
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_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
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
npc_crew_ship_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
void SetGarrickGUID(ObjectGuid garrickGUID)
npc_huxsworth_hunter_quest_private(Creature *creature)
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)
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
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)
void WaypointPathEnded(uint32, uint32 pathId) 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
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
DawntrackerBriarpatch
@ CONVERSATION_BRIARPATCH_HORDE
@ CONVERSATION_ACTOR_GRIMAXE_BRIARPATCH
@ EVENT_DAWNTRACKER_GRIMAXE_RUN_BRIARPATCH
@ CONVERSATION_ACTOR_DAWNTRACKER_BRIARPATCH
@ EVENT_DAWNTRACKER_GRIMAXE_CONVERSATION
@ 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
@ 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
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
@ SPELL_EARTHSHATTER
@ EVENT_OVERSEER_BACKHAND
@ SPELL_BACKHAND
@ EVENT_OVERSEER_EARTHSHATTER
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
@ 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)
static constexpr Position HordeCrewPersonalSpawnLocation[]
static constexpr Position MiniChopperJumpPosition
@ CONVERSATION_ACTOR_GEOLORD
@ CONVERSATION_GEOLORD_AGGRO
@ 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
@ 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_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
@ 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
@ 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_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_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
@ 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
@ 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
@ 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
@ 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
@ 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
@ SPELL_SPIRIT_BOLT
@ EVENT_CAST_SPIRIT_BOLT
@ EVENT_CAST_SOUL_GRASP
@ SPELL_SOUL_GRASP
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)