aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2023_07_21_02_world.sql195
-rw-r--r--src/server/scripts/ExilesReach/zone_exiles_reach.cpp666
2 files changed, 819 insertions, 42 deletions
diff --git a/sql/updates/world/master/2023_07_21_02_world.sql b/sql/updates/world/master/2023_07_21_02_world.sql
new file mode 100644
index 00000000000..9958097d872
--- /dev/null
+++ b/sql/updates/world/master/2023_07_21_02_world.sql
@@ -0,0 +1,195 @@
+-- Finding the lost expedition Quest Alliance and Horde
+
+-- Areatrigger
+
+SET @ID := 24;
+SET @SPAWNID := 25;
+
+-- Create new serverside areatrigger for entering Exile's Reach Abandoned Camp for follower spawn
+DELETE FROM `areatrigger` WHERE `SpawnId`=@SPAWNID;
+INSERT INTO `areatrigger` (`SpawnId`,`AreaTriggerId`,`IsServerSide`,`MapId`,`PosX`,`PosY`,`PosZ`,`Orientation`,`PhaseUseFlags`,`PhaseId`,`PhaseGroup`,`Shape`,`ShapeData0`,`ShapeData1`,`ShapeData2`,`ShapeData3`,`ShapeData4`,`ShapeData5`,`ShapeData6`,`ShapeData7`,`ScriptName`,`Comment`) VALUES
+(@SPAWNID,@ID,1,2175,-299,-2500,20,0,0,0,0,1,2,50,30,2,50,30,0,0,'areatrigger_find_the_lost_expedition_follower','Exiles Reach - Lost Camp Missing follower check');
+-- Add new serverside areatrigger for Exile's Reach Abandoned Camp to template
+DELETE FROM `areatrigger_template` WHERE `Id`=@ID;
+INSERT INTO `areatrigger_template` (`Id`,`IsServerSide`,`Type`,`Flags`,`Data0`,`Data1`,`Data2`,`Data3`,`Data4`,`Data5`,`Data6`,`Data7`,`VerifiedBuild`) VALUES
+(@ID,1,1,0,2,50,30,2,50,30,0,0,0);
+
+-- Misc
+
+DELETE FROM `creature_equip_template` WHERE `CreatureID` IN (165359,166805);
+INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`AppearanceModID1`,`ItemVisual1`,`ItemID2`,`AppearanceModID2`,`ItemVisual2`,`ItemID3`,`AppearanceModID3`,`ItemVisual3`,`VerifiedBuild`) VALUES
+(165359,1,163887,0,0,163891,0,0,0,0,0,50000),
+(166805,1,165616,0,0,0,0,0,0,0,0,50000);
+
+DELETE FROM `creature_summoned_data` WHERE `CreatureID` IN (165359);
+INSERT INTO `creature_summoned_data` (`CreatureID`,`CreatureIDVisibleToSummoner`,`GroundMountDisplayID`,`FlyingMountDisplayID`) VALUES
+(165359,153168,NULL,NULL);
+
+UPDATE `creature` SET `StringId`="alaria_camp" WHERE `guid`=1051209;
+UPDATE `creature` SET `StringId`="wonza_camp" WHERE `guid`=1051211;
+
+-- Scripting
+
+UPDATE `creature_template` SET `ScriptName`="npc_kee_la_beach_standing" WHERE `entry` IN (151088);
+UPDATE `creature_template` SET `ScriptName`="npc_bjorn_stouthands_beach_standing" WHERE `entry` IN (151089);
+UPDATE `creature_template` SET `ScriptName`="npc_austin_huxworth_beach_standing" WHERE `entry` IN (154170);
+UPDATE `creature_template` SET `ScriptName`="npc_garrick_summoned_beach" WHERE `entry` IN (165359);
+UPDATE `creature_template` SET `ScriptName`="npc_grimaxe_summoned_beach" WHERE `entry` IN (166805);
+UPDATE `areatrigger` SET `ScriptName`='areatrigger_find_the_lost_expedition' WHERE `SpawnId`=23;
+
+DELETE FROM `spell_script_names` WHERE `spell_id` IN (305596,325076);
+INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
+(305596,'spell_summon_survivor_beach'),
+(325076,'spell_summon_survivor_beach');
+
+-- Questing
+
+DELETE FROM `creature_queststarter` WHERE `id`=156626 AND `quest` IN (54952);
+DELETE FROM `creature_queststarter` WHERE `id`=166782 AND `quest` IN (59931);
+INSERT INTO `creature_queststarter` (`id`, `quest`, `VerifiedBuild`) VALUES
+(156626, 54952, 45745), -- Alliance
+(166782, 59931, 46455); -- Horde
+
+DELETE FROM `creature_questender` WHERE `id`=156607 AND `quest` IN (54952);
+DELETE FROM `creature_questender` WHERE `id`=166854 AND `quest` IN (59931);
+INSERT INTO `creature_questender` (`id`, `quest`, `VerifiedBuild`) VALUES
+(156607, 54952, 45745), -- Alliance
+(166854, 59931, 46455); -- Horde
+
+DELETE FROM `quest_request_items` WHERE `ID`=59932;
+INSERT INTO `quest_request_items` (`ID`, `EmoteOnComplete`, `EmoteOnIncomplete`, `EmoteOnCompleteDelay`, `EmoteOnIncompleteDelay`, `CompletionText`, `VerifiedBuild`) VALUES
+(59932, 0, 0, 0, 0, 'Please... I be needin\'... food...', 50401); -- Cooking Meat
+
+-- Pathing
+
+-- Pathing for Kee-La 151088 "Finding the Lost Expedition"
+SET @PATH := ((1052012 * 10) + 1) << 3;
+DELETE FROM `waypoint_data` WHERE `id` IN (@PATH);
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-425.92883,-2603.427,0.48476708,NULL,0,1,0,100,0),
+(@PATH,2,-415.217,-2603.8403,0.7445327,NULL,0,1,0,100,0),
+(@PATH,3,-404.86633,-2599.4375,1.6478806,NULL,0,1,0,100,0),
+(@PATH,4,-395.08508,-2594.441,3.153698,NULL,0,1,0,100,0);
+
+-- Pathing for Bjorn Stouthands 151089 "Finding the Lost Expedition"
+SET @PATH := ((1052013 * 10) + 1) << 3;
+DELETE FROM `waypoint_data` WHERE `id` IN (@PATH);
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-398.3889,-2596.2883,2.3895378,NULL,0,1,0,100,0),
+(@PATH,2,-391.7795,-2592.915,3.9566765,NULL,0,1,0,100,0);
+
+-- Pathing for Austin Huxworth 154170 "Finding the Lost Expedition"
+SET @PATH := ((1052014 * 10) + 1) << 3;
+DELETE FROM `waypoint_data` WHERE `id` IN (@PATH);
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-409.20898,-2599.4922,1.2894821,NULL,0,1,0,100,0),
+(@PATH,2,-397.875,-2595.2622,2.6358757,NULL,0,1,0,100,0);
+
+-- Pathing for Bo quest "Finding the Lost Expedition"
+SET @PATH := ((1052021 * 10) + 1) << 3;
+DELETE FROM `waypoint_data` WHERE `id` IN (@PATH);
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-415.217,-2603.8403,0.7445327,NULL,0,1,0,100,0),
+(@PATH,2,-404.86633,-2599.4375,1.6478806,NULL,0,1,0,100,0),
+(@PATH,3,-395.08508,-2594.441,3.153698,NULL,0,1,0,100,0);
+
+-- Pathing for Mithdran Dawntracker "Finding the Lost Expedition"
+SET @PATH := ((1052022 * 10) + 1) << 3;
+DELETE FROM `waypoint_data` WHERE `id` IN (@PATH);
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-422.13196,-2598.1216,0.28313446,NULL,0,1,0,100,0),
+(@PATH,2,-409.20898,-2599.4922,1.2894821,NULL,0,1,0,100,0),
+(@PATH,3,-397.875,-2595.2622,2.6358757,NULL,0,1,0,100,0);
+
+-- Pathing for Lana Jordan "Finding the Lost Expedition"
+SET @PATH := ((1052023 * 10) + 1) << 3;
+DELETE FROM `waypoint_data` WHERE `id` IN (@PATH);
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-407.13715,-2599.2344,1.3998337,NULL,0,1,0,100,0),
+(@PATH,2,-398.3889,-2596.2883,2.3895378,NULL,0,1,0,100,0),
+(@PATH,3,-391.7795,-2592.915,3.9566765,NULL,0,1,0,100,0);
+
+-- Cooking Meat Quest Alliance and Horde
+
+-- Creature scripts
+
+UPDATE `creature_template` SET `AIName`='', `ScriptName`="npc_captain_garrick_abandoned_camp" WHERE `entry` IN (156651);
+UPDATE `creature_template` SET `AIName`='', `ScriptName`="npc_warlord_grimaxe_abandoned_camp" WHERE `entry` IN (166906);
+
+UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE `entry` IN(175030, 175031);
+DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryOrGuid` IN(175030, 175031);
+INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
+(175030, 0, 0, 0, 11, 0, 100, 0, 0, 0, 0, 0, 128, 14432, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Won''sa - On respawn - Plays Anim with ID 14432 - Self'),
+(175031, 0, 0, 0, 11, 0, 100, 0, 0, 0, 0, 0, 128, 14432, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Alaria - On respawn - Plays Anim with ID 14432 - Self');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 22 AND `SourceEntry` IN(175030, 175031) AND `SourceId` = 0;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `Comment`) VALUES
+(22, 1, 175030, 0, 0, 57, 1, 0, 0, 0, 0, 'Object is personal object'),
+(22, 1, 175031, 0, 0, 57, 1, 0, 0, 0, 0, 'Object is personal object');
+
+-- Creature String Ids
+
+UPDATE `creature` SET `StringId`="garrick_camp" WHERE `guid`=1051210;
+UPDATE `creature` SET `StringId`="grimaxe_camp" WHERE `guid`=1051212;
+UPDATE `creature` SET `StringId`="alaria_standing_abandoned_camp" WHERE `guid`=1051266;
+UPDATE `creature` SET `StringId`="wonza_standing_abandoned_camp" WHERE `guid`=1051269;
+
+-- Questing
+
+DELETE FROM `creature_queststarter` WHERE `id`=156651 AND `quest` IN (55174);
+DELETE FROM `creature_queststarter` WHERE `id`=166906 AND `quest` IN (59932);
+INSERT INTO `creature_queststarter` (`id`, `quest`, `VerifiedBuild`) VALUES
+(156651, 55174, 50000), -- Alliance
+(166906, 59932, 50000); -- Horde
+
+DELETE FROM `creature_questender` WHERE `id`=156607 AND `quest` IN (55174);
+DELETE FROM `creature_questender` WHERE `id`=166854 AND `quest` IN (59932);
+INSERT INTO `creature_questender` (`id`, `quest`, `VerifiedBuild`) VALUES
+(156607, 55174, 50000), -- Alliance
+(166854, 59932, 50000); -- Horde
+
+DELETE FROM `quest_template_addon` WHERE `ID` IN (54952,59931);
+INSERT INTO `quest_template_addon` (`ID`,`NextQuestID`,`ScriptName`) VALUES
+(54952,55174,'quest_finding_the_lost_expedition_alliance'), -- Alliance
+(59931,59932,'quest_finding_the_lost_expedition_horde'); -- Horde
+
+DELETE FROM `quest_template_addon` WHERE `ID` IN (55174,59932);
+INSERT INTO `quest_template_addon` (`ID`,`ScriptName`) VALUES
+(55174,'quest_cooking_meat_alliance'), -- Alliance
+(59932,'quest_cooking_meat_horde'); -- Horde
+
+-- Conversations
+
+DELETE FROM `conversation_actors` WHERE `ConversationId` IN (11696,12863,14439,14611);
+INSERT INTO `conversation_actors` (`ConversationId`,`ConversationActorId`,`ConversationActorGuid`,`Idx`,`CreatureId`,`CreatureDisplayInfoId`,`NoActorObject`,`ActivePlayerObject`,`VerifiedBuild`) VALUES
+(11696,71297,1051209,0,0,0,0,0,50000), -- Alliance
+(11696,71309,1051210,1,0,0,0,0,50000), -- Alliance
+(12863,71297,1051209,0,0,0,0,0,50000), -- Alliance
+(12863,71309,1051210,1,0,0,0,0,50000), -- Alliance
+(14439,76284,1051211,0,0,0,0,0,50000), -- Horde
+(14439,75956,1051212,1,0,0,0,0,50000), -- Horde
+(14611,76284,1051211,0,0,0,0,0,50000), -- Horde
+(14611,75956,1051212,1,0,0,0,0,50000); -- Horde
+
+UPDATE `conversation_actors` SET `ConversationActorGuid`=1051209 WHERE `ConversationId`=12058 AND `ConversationActorId`=71297; -- CONVERSATION_LINE_ESCORT_SURVIVOR_CAMP Alaria
+UPDATE `conversation_actors` SET `ConversationActorGuid`=1051209 WHERE `ConversationId`=12058 AND `ConversationActorId`=76284; -- CONVERSATION_LINE_ESCORT_SURVIVOR_CAMP Wonza
+
+DELETE FROM `conversation_line_template` WHERE `Id` IN (28241,28242,29333,31623,34646,36157,36158,36159,36595,36596);
+INSERT INTO `conversation_line_template` (`Id`,`UiCameraID`,`ActorIdx`,`Flags`,`VerifiedBuild`) VALUES
+(28241,0,0,0,50000), -- Alliance
+(28242,0,1,0,50000), -- Alliance
+(29333,0,1,0,50000), -- Alliance
+(31623,0,0,0,50000), -- Alliance
+(34646,0,1,0,50000), -- Alliance
+(36157,0,0,0,50000), -- Horde
+(36158,0,1,0,50000), -- Horde
+(36159,0,1,0,50000), -- Horde
+(36595,0,0,0,50000), -- Horde
+(36596,0,1,0,50000); -- Horde
+
+DELETE FROM `conversation_template` WHERE `Id` IN (11696,12863,14439,14611);
+INSERT INTO `conversation_template` (`Id`,`FirstLineId`,`TextureKitId`,`ScriptName`,`VerifiedBuild`) VALUES
+(11696,28241,0,'',50000), -- Alliance
+(12863,31623,0,'',50000), -- Alliance
+(14439,36157,0,'',50000), -- Horde
+(14611,36595,0,'',50000); -- Horde
diff --git a/src/server/scripts/ExilesReach/zone_exiles_reach.cpp b/src/server/scripts/ExilesReach/zone_exiles_reach.cpp
index 069cce7341e..ddca35f8082 100644
--- a/src/server/scripts/ExilesReach/zone_exiles_reach.cpp
+++ b/src/server/scripts/ExilesReach/zone_exiles_reach.cpp
@@ -15,6 +15,7 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include "AreaTriggerAI.h"
#include "Conversation.h"
#include "CreatureAIImpl.h"
#include "Map.h"
@@ -1402,6 +1403,10 @@ enum ExilesReachAllianceSurvivorsBeachData
NPC_BJORN_STOUTHANDS_STANDING = 151089,
NPC_AUSTIN_HUXWORTH_STANDING = 154170,
+ PATH_KEE_LA_STANDING = ((1052012 * 10) + 1) << 3,
+ PATH_BJORN_STOUTHANDS_STANDING = ((1052013 * 10) + 1) << 3,
+ PATH_AUSTIN_HUXWORTH_STANDING = ((1052014 * 10) + 1) << 3,
+
SPELL_BANDAGING_QUEST = 297415
};
@@ -1421,7 +1426,6 @@ struct npc_alliance_survivors_beach_laying : public ScriptedAI
if (Player* player = caster->ToPlayer())
{
player->KilledMonsterCredit(me->GetEntry());
- player->UpdateObjectVisibility();
Conversation::CreateConversation(ConversationId, player, *player, player->GetGUID(), nullptr);
}
@@ -1430,21 +1434,31 @@ struct npc_alliance_survivors_beach_laying : public ScriptedAI
enum ExilesReachHordeSurvivorsBeachData
{
- EVENT_SURVIVORS_HORDE_STAND_AND_TALK = 1,
+ EVENT_SURVIVORS_HORDE_STAND_AND_TALK = 1,
EVENT_SURVIVORS_HORDE_MOVE_TO_GRIMAXE,
- NPC_BO_LAYING_LAYING = 166786,
- NPC_MITHDRAN_LAYING = 166791,
- NPC_LANA_JORDAN_LAYING = 166796,
- NPC_BO_STANDING = 166787,
- NPC_MITHDRAN_STANDING = 166792,
- NPC_LANA_JORDAN_STANDING = 166797,
+ EVENT_SURVIVORS_SALUTE = 1,
+ EVENT_SURVIVORS_LEAVE_BEACH,
+
+ NPC_BO_LAYING_LAYING = 166786,
+ NPC_MITHDRAN_LAYING = 166791,
+ NPC_LANA_JORDAN_LAYING = 166796,
+ NPC_BO_STANDING = 166787,
+ NPC_MITHDRAN_STANDING = 166792,
+ NPC_LANA_JORDAN_STANDING = 166797,
+
+ QUEST_FINDING_THE_LOST_EXPEDITION_HORDE = 59931,
+ QUEST_FINDING_THE_LOST_EXPEDITION_ALLIANCE = 54952,
- PATH_BO_TO_GRIMAXE = 10520210,
- PATH_MITHDRAN_TO_GRIMAXE = 10520220,
- PATH_LANA_JORDAN_TO_GRIMAXE = 10520230,
+ PATH_BO_TO_GRIMAXE = 10520210,
+ PATH_MITHDRAN_TO_GRIMAXE = 10520220,
+ PATH_LANA_JORDAN_TO_GRIMAXE = 10520230,
- TALK_HORDE_BEACH_THANK_PLAYER = 0
+ PATH_BO_LEAVE_BEACH = ((1052021 * 10) + 1) << 3,
+ PATH_MITHDRAN_LEAVE_BEACH = ((1052022 * 10) + 1) << 3,
+ PATH_LANA_JORDAN_LEAVE_BEACH = ((1052023 * 10) + 1) << 3,
+
+ TALK_HORDE_BEACH_THANK_PLAYER = 0
};
// 166786 - Bo
@@ -1513,6 +1527,56 @@ struct npc_lana_jordan_beach_laying : public ScriptedAI
}
};
+enum ExilesReachMurlocsData
+{
+ ITEM_STITCHED_CLOTH_SHOES = 174791,
+ ITEM_STITCHED_LEATHER_BOOTS = 174792,
+ ITEM_LINKED_MAIL_BOOTS = 174793,
+ ITEM_DENTED_PLATE_BOOTS = 174794,
+
+ QUEST_MURLOC_HIDEAWAY_BOOTS_DROPPED = 58883
+};
+
+// 150228 - Murloc Spearhunter
+// 150229 - Murloc Watershaper
+struct npc_murloc_spearhunter_watershaper : public ScriptedAI
+{
+ npc_murloc_spearhunter_watershaper(Creature* creature) : ScriptedAI(creature) { }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ for (auto const& [playerGuid, loot] : me->m_personalLoot)
+ {
+ for (LootItem const& lootItem : loot->items)
+ {
+ if (lootItem.itemid == ITEM_STITCHED_CLOTH_SHOES || lootItem.itemid == ITEM_STITCHED_LEATHER_BOOTS || lootItem.itemid == ITEM_LINKED_MAIL_BOOTS || lootItem.itemid == ITEM_DENTED_PLATE_BOOTS)
+ if (Player* player = ObjectAccessor::GetPlayer(*me, playerGuid))
+ player->SetRewardedQuest(QUEST_MURLOC_HIDEAWAY_BOOTS_DROPPED);
+ }
+ }
+ }
+
+ void UpdateAI(uint32 /*diff*/) override
+ {
+ if (!UpdateVictim())
+ return;
+
+ DoMeleeAttackIfReady();
+ }
+};
+
+// 150228 - Murloc Spearhunter
+// 150229 - Murloc Watershaper
+struct npc_murloc_spearhunter_watershaper_higher_ground : public npc_murloc_spearhunter_watershaper
+{
+ npc_murloc_spearhunter_watershaper_higher_ground(Creature* creature) : npc_murloc_spearhunter_watershaper(creature) { }
+
+ void JustEngagedWith(Unit* who) override
+ {
+ me->GetMotionMaster()->MoveJump(who->GetPosition(), 16.0f, 6.2f);
+ }
+};
+
// 166787 - Bo
// 166792 - Mithdran Dawntracker
// 166797 - Lana Jordan
@@ -1561,10 +1625,59 @@ private:
EventMap _events;
};
+// 151088 - Kee La
+// 151089 - Bjorn Stouthands
+// 154170 - Austin Huxworth
+// 166787 - Bo
+// 166792 - Mithdran Dawntracker
+// 166797 - Lana Jordan
+template<uint32 PathId, uint32 WaitTime>
+struct npc_survivors_beach_leave_private : public ScriptedAI
+{
+ npc_survivors_beach_leave_private(Creature* creature) : ScriptedAI(creature) { }
+
+ void JustAppeared() override
+ {
+ _events.ScheduleEvent(EVENT_SURVIVORS_SALUTE, 6s);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_SURVIVORS_SALUTE:
+ me->HandleEmoteCommand(EMOTE_ONESHOT_SALUTE);
+ _events.ScheduleEvent(EVENT_SURVIVORS_LEAVE_BEACH, 2s);
+ break;
+ case EVENT_SURVIVORS_LEAVE_BEACH:
+ me->GetMotionMaster()->MovePath(PathId, false);
+ me->DespawnOrUnsummon(Milliseconds(WaitTime));
+ break;
+ default:
+ break;
+ }
+ }
+ }
+private:
+ EventMap _events;
+};
+
CreatureAI* BoBeachStandingAISelector(Creature* creature)
{
if (creature->IsPrivateObject())
- return new npc_horde_survivors_beach_q59930_private<PATH_BO_TO_GRIMAXE>(creature);
+ {
+ if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
+ {
+ if ((privateObjectOwner->GetQuestStatus(QUEST_FINDING_THE_LOST_EXPEDITION_HORDE) == QUEST_STATUS_NONE))
+ return new npc_horde_survivors_beach_q59930_private<PATH_BO_TO_GRIMAXE>(creature);
+ else
+ return new npc_survivors_beach_leave_private<PATH_BO_LEAVE_BEACH, 5 * IN_MILLISECONDS>(creature);
+ }
+ }
return new NullCreatureAI(creature);
};
@@ -1572,7 +1685,15 @@ CreatureAI* BoBeachStandingAISelector(Creature* creature)
CreatureAI* MithdranBeachStandingAISelector(Creature* creature)
{
if (creature->IsPrivateObject())
- return new npc_horde_survivors_beach_q59930_private<PATH_MITHDRAN_TO_GRIMAXE>(creature);
+ {
+ if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
+ {
+ if ((privateObjectOwner->GetQuestStatus(QUEST_FINDING_THE_LOST_EXPEDITION_HORDE) == QUEST_STATUS_NONE))
+ return new npc_horde_survivors_beach_q59930_private<PATH_MITHDRAN_TO_GRIMAXE>(creature);
+ else
+ return new npc_survivors_beach_leave_private<PATH_MITHDRAN_LEAVE_BEACH, 4 * IN_MILLISECONDS>(creature);
+ }
+ }
return new NullCreatureAI(creature);
};
@@ -1580,58 +1701,503 @@ CreatureAI* MithdranBeachStandingAISelector(Creature* creature)
CreatureAI* LanaJordanBeachStandingAISelector(Creature* creature)
{
if (creature->IsPrivateObject())
- return new npc_horde_survivors_beach_q59930_private<PATH_LANA_JORDAN_TO_GRIMAXE>(creature);
+ {
+ if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
+ {
+ if ((privateObjectOwner->GetQuestStatus(QUEST_FINDING_THE_LOST_EXPEDITION_HORDE) == QUEST_STATUS_NONE))
+ return new npc_horde_survivors_beach_q59930_private<PATH_LANA_JORDAN_TO_GRIMAXE>(creature);
+ else
+ return new npc_survivors_beach_leave_private<PATH_LANA_JORDAN_LEAVE_BEACH, 5 * IN_MILLISECONDS>(creature);
+ }
+ }
return new NullCreatureAI(creature);
};
-enum ExilesReachMurlocsData
+CreatureAI* KeeLaBeachStandingAISelector(Creature* creature)
{
- ITEM_STITCHED_CLOTH_SHOES = 174791,
- ITEM_STITCHED_LEATHER_BOOTS = 174792,
- ITEM_LINKED_MAIL_BOOTS = 174793,
- ITEM_DENTED_PLATE_BOOTS = 174794,
+ if (creature->IsPrivateObject())
+ return new npc_survivors_beach_leave_private<PATH_KEE_LA_STANDING, 7 * IN_MILLISECONDS>(creature);
+ return new NullCreatureAI(creature);
+};
- QUEST_MURLOC_HIDEAWAY_BOOTS_DROPPED = 58883
+CreatureAI* BjornBeachStandingAISelector(Creature* creature)
+{
+ if (creature->IsPrivateObject())
+ return new npc_survivors_beach_leave_private<PATH_BJORN_STOUTHANDS_STANDING, 4 * IN_MILLISECONDS>(creature);
+ return new NullCreatureAI(creature);
};
-// 150228 - Murloc Spearhunter
-// 150229 - Murloc Watershaper
-struct npc_murloc_spearhunter_watershaper : public ScriptedAI
+CreatureAI* AustinBeachStandingAISelector(Creature* creature)
{
- npc_murloc_spearhunter_watershaper(Creature* creature) : ScriptedAI(creature) { }
+ if (creature->IsPrivateObject())
+ return new npc_survivors_beach_leave_private<PATH_AUSTIN_HUXWORTH_STANDING, 5 * IN_MILLISECONDS>(creature);
+ return new NullCreatureAI(creature);
+};
- void JustDied(Unit* /*killer*/) override
+enum LostExpeditionFollowerData
+{
+ ACTOR_ID_EMPTY = 0,
+ ACTOR_ID_ALLIANCE_SURVIVOR = 69830,
+ ACTOR_ID_HORDE_SURVIVOR = 76283,
+
+ ACTOR_INDEX_SURVIVOR_ZERO = 0,
+ ACTOR_INDEX_SURVIVOR_ONE,
+ ACTOR_INDEX_SURVIVOR_TWO,
+ ACTOR_INDEX_SURVIVOR_THREE,
+
+ AREA_ABANDONED_CAMP = 10452,
+
+ CONVERSATION_LINE_ESCORT_ALLIANCE_SURVIVOR = 12044,
+ CONVERSATION_LINE_ESCORT_HORDE_SURVIVOR = 14437,
+ CONVERSATION_LINE_ESCORT_SURVIVOR_CAMP = 12058,
+
+ EVENT_INITIAL_SPAWN_CHECK = 1,
+ EVENT_FOLLOW_PLAYER,
+
+ SPELL_GARRICK_PING = 313664,
+ SPELL_SUMMON_ADMIRAL_GARRICK_GUARDIAN = 297295,
+ SPELL_SUMMON_WARLORD_GRIMAXE_GUARDIAN = 325075,
+
+ POINT_CAMP_POSITION = 0,
+};
+
+Position const GarrickAbandonedCampPosition = { -249.059006f, -2492.520020f, 18.0742f };
+Position const GrimaxeAbandonedCampPosition = { -249.20117f, -2492.6191f, 17.964903f };
+
+// 165359 - Captain Garrick
+// This script is used by Captian Garrick Follower for Finding the Lost Expedition quest
+struct npc_garrick_summoned_beach : public ScriptedAI
+{
+ npc_garrick_summoned_beach(Creature* creature) : ScriptedAI(creature), _reachedCamp(false) {}
+
+ void IsSummonedBy(WorldObject* summoner) override
{
- for (auto const& [playerGuid, loot] : me->m_personalLoot)
+ Player* player = summoner->ToPlayer();
+ if (!player)
+ return;
+
+ _playerGUID = player->GetGUID();
+
+ _events.ScheduleEvent(EVENT_INITIAL_SPAWN_CHECK, 1s);
+ }
+
+ void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
+ {
+ if (spellInfo->Id != SPELL_GARRICK_PING)
+ return;
+
+ if (_reachedCamp)
+ return;
+
+ _reachedCamp = true;
+
+ if (Player* player = caster->ToPlayer())
{
- for (LootItem const& lootItem : loot->items)
+ Conversation* conversation = Conversation::CreateConversation(CONVERSATION_LINE_ESCORT_SURVIVOR_CAMP, player, *player, _playerGUID, nullptr, false);
+ conversation->AddActor(ACTOR_ID_ALLIANCE_SURVIVOR, ACTOR_INDEX_SURVIVOR_ONE, me->GetGUID());
+ conversation->Start();
+
+ me->GetMotionMaster()->Remove(FOLLOW_MOTION_TYPE);
+ me->GetMotionMaster()->MovePoint(POINT_CAMP_POSITION, GarrickAbandonedCampPosition, false);
+ }
+ }
+
+ void MovementInform(uint32 uiType, uint32 uiId) override
+ {
+ if (uiType != POINT_MOTION_TYPE || uiId != POINT_CAMP_POSITION)
+ return;
+
+ if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
+ {
+ player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
+ player->RemoveAura(SPELL_SUMMON_ADMIRAL_GARRICK_GUARDIAN);
+ }
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
{
- if (lootItem.itemid == ITEM_STITCHED_CLOTH_SHOES || lootItem.itemid == ITEM_STITCHED_LEATHER_BOOTS || lootItem.itemid == ITEM_LINKED_MAIL_BOOTS || lootItem.itemid == ITEM_DENTED_PLATE_BOOTS)
- if (Player* player = ObjectAccessor::GetPlayer(*me, playerGuid))
- player->SetRewardedQuest(QUEST_MURLOC_HIDEAWAY_BOOTS_DROPPED);
+ case EVENT_INITIAL_SPAWN_CHECK:
+ {
+ Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID);
+ if (!player)
+ break;
+
+ Creature* survivor = FindCreatureIgnorePhase(player, "spawn_check");
+
+ if (!survivor)
+ {
+ if (player->GetAreaId() != AREA_ABANDONED_CAMP)
+ player->RemoveAura(SPELL_SUMMON_ADMIRAL_GARRICK_GUARDIAN);
+ else
+ _events.ScheduleEvent(EVENT_FOLLOW_PLAYER, 0s);
+ }
+ else
+ {
+ Conversation* conversation = Conversation::CreateConversation(CONVERSATION_LINE_ESCORT_ALLIANCE_SURVIVOR, player, *player, _playerGUID, nullptr, false);
+ conversation->AddActor(ACTOR_ID_ALLIANCE_SURVIVOR, ACTOR_INDEX_SURVIVOR_ONE, me->GetGUID());
+ conversation->Start();
+
+ _events.ScheduleEvent(EVENT_FOLLOW_PLAYER, 2s);
+ }
+ break;
+ }
+ case EVENT_FOLLOW_PLAYER:
+ if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
+ me->GetMotionMaster()->MoveFollow(player, 0.0f, 0.0f);
+ break;
+ default:
+ break;
}
}
}
+private:
+ EventMap _events;
+ ObjectGuid _playerGUID;
+ bool _reachedCamp;
+};
- void UpdateAI(uint32 /*diff*/) override
+// 166805 - Warlord Breka Grimaxe
+// This script is used by Warlord Grimaxe Follower for Finding the Lost Expedition quest
+struct npc_grimaxe_summoned_beach : public ScriptedAI
+{
+ npc_grimaxe_summoned_beach(Creature* creature) : ScriptedAI(creature), _reachedCamp(false) {}
+
+ void IsSummonedBy(WorldObject* summoner) override
{
- if (!UpdateVictim())
+ Player* player = summoner->ToPlayer();
+ if (!player)
return;
- DoMeleeAttackIfReady();
+ _playerGUID = player->GetGUID();
+ _reachedCamp = false;
+
+ _events.ScheduleEvent(EVENT_INITIAL_SPAWN_CHECK, 1s);
}
+
+ void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
+ {
+ if (spellInfo->Id != SPELL_GARRICK_PING)
+ return;
+
+ if (_reachedCamp)
+ return;
+
+ if (Player* player = caster->ToPlayer())
+ {
+ Conversation* conversation = Conversation::CreateConversation(CONVERSATION_LINE_ESCORT_SURVIVOR_CAMP, player, *player, _playerGUID, nullptr, false);
+ conversation->AddActor(ACTOR_ID_HORDE_SURVIVOR, ACTOR_INDEX_SURVIVOR_THREE, me->GetGUID());
+ conversation->Start();
+
+ me->GetMotionMaster()->Remove(FOLLOW_MOTION_TYPE);
+ me->GetMotionMaster()->MovePoint(POINT_CAMP_POSITION, GrimaxeAbandonedCampPosition, false);
+ }
+ }
+
+ void MovementInform(uint32 uiType, uint32 uiId) override
+ {
+ if (uiType != POINT_MOTION_TYPE || uiId != POINT_CAMP_POSITION)
+ return;
+
+ if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
+ {
+ player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
+ player->RemoveAura(SPELL_SUMMON_WARLORD_GRIMAXE_GUARDIAN);
+ }
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_INITIAL_SPAWN_CHECK:
+ {
+ Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID);
+ if (!player)
+ break;
+
+ Creature* survivor = FindCreatureIgnorePhase(player, "spawn_check");
+
+ if (!survivor)
+ {
+ if (player->GetAreaId() != AREA_ABANDONED_CAMP)
+ player->RemoveAura(SPELL_SUMMON_WARLORD_GRIMAXE_GUARDIAN);
+ else
+ _events.ScheduleEvent(EVENT_FOLLOW_PLAYER, 0s);
+ }
+ else
+ {
+ Conversation* conversation = Conversation::CreateConversation(CONVERSATION_LINE_ESCORT_HORDE_SURVIVOR, player, *player, _playerGUID, nullptr, false);
+ conversation->AddActor(ACTOR_ID_HORDE_SURVIVOR, ACTOR_INDEX_SURVIVOR_TWO, me->GetGUID());
+ conversation->Start();
+
+ _events.ScheduleEvent(EVENT_FOLLOW_PLAYER, 2s);
+ }
+ break;
+ }
+ case EVENT_FOLLOW_PLAYER:
+ if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
+ me->GetMotionMaster()->MoveFollow(player, 0.0f, 0.0f);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+private:
+ EventMap _events;
+ ObjectGuid _playerGUID;
+ bool _reachedCamp;
};
-// 150228 - Murloc Spearhunter
-// 150229 - Murloc Watershaper
-struct npc_murloc_spearhunter_watershaper_higher_ground : public npc_murloc_spearhunter_watershaper
+// 54952 - Finding the Lost Expedition
+// 59931 - Finding the Lost Expedition
+class quest_finding_the_lost_expedition : public QuestScript
{
- npc_murloc_spearhunter_watershaper_higher_ground(Creature* creature) : npc_murloc_spearhunter_watershaper(creature) { }
+public:
+ quest_finding_the_lost_expedition(char const* script) : QuestScript(script) { }
- void JustEngagedWith(Unit* who) override
+ void HandleQuestStatusChange(Player* player, QuestStatus newStatus, uint32 summonSpellId, std::string_view survivor1StringId, std::string_view survivor2StringId, std::string_view survivor3StringId)
{
- me->GetMotionMaster()->MoveJump(who->GetPosition(), 16.0f, 6.2f);
+ switch (newStatus)
+ {
+ case QUEST_STATUS_INCOMPLETE:
+ player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
+ player->CastSpell(player, summonSpellId);
+
+ if (Creature* survivor1 = player->FindNearestCreatureWithOptions(25.0f, FindCreatureOptions().SetStringId(survivor1StringId).SetIgnorePhases(true)))
+ {
+ Creature* survivor1Personal = survivor1->SummonPersonalClone(survivor1->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
+ survivor1Personal->SetScriptStringId("spawn_check");
+ }
+ if (Creature* survivor2 = player->FindNearestCreatureWithOptions(25.0f, FindCreatureOptions().SetStringId(survivor2StringId).SetIgnorePhases(true)))
+ survivor2->SummonPersonalClone(survivor2->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
+ if (Creature* survivor3 = player->FindNearestCreatureWithOptions(25.0f, FindCreatureOptions().SetStringId(survivor3StringId).SetIgnorePhases(true)))
+ survivor3->SummonPersonalClone(survivor3->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
+
+ break;
+ case QUEST_STATUS_NONE:
+ player->RemoveAura(summonSpellId);
+ player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
+ break;
+ default:
+ break;
+ }
+ }
+};
+
+// 54952 - Finding the Lost Expedition
+class quest_finding_the_lost_expedition_alliance : public quest_finding_the_lost_expedition
+{
+public:
+ quest_finding_the_lost_expedition_alliance() : quest_finding_the_lost_expedition("quest_finding_the_lost_expedition_alliance") { }
+
+ void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
+ {
+ HandleQuestStatusChange(player, newStatus,
+ SPELL_SUMMON_ADMIRAL_GARRICK_GUARDIAN,
+ "kee_la_beach",
+ "bjorn_stouthands_beach",
+ "austin_huxworth_beach");
+ }
+};
+
+// 59931 - Finding the Lost Expedition
+class quest_finding_the_lost_expedition_horde : public quest_finding_the_lost_expedition
+{
+public:
+ quest_finding_the_lost_expedition_horde() : quest_finding_the_lost_expedition("quest_finding_the_lost_expedition_horde") { }
+
+ void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
+ {
+ HandleQuestStatusChange(player, newStatus,
+ SPELL_SUMMON_WARLORD_GRIMAXE_GUARDIAN,
+ "bo_beach",
+ "mithran_beach",
+ "lana_jordan_beach");
+ }
+};
+
+// 305596 - Summon Admiral Garrick Guardian
+// 325076 - Summon Warlord Grimaxe
+class spell_summon_survivor_beach : public SpellScript
+{
+ PrepareSpellScript(spell_summon_survivor_beach);
+
+ void SelectTarget(WorldObject*& target)
+ {
+ Player* caster = GetCaster()->ToPlayer();
+ if (!caster)
+ return;
+
+ Creature* survivor = caster->FindNearestCreatureWithOptions(5.0f, FindCreatureOptions().SetIgnorePhases(true).SetStringId(caster->GetTeam() == ALLIANCE ? "q54952_garrick" : "q59931_grimaxe"));
+ if (!survivor)
+ return;
+
+ target = survivor;
+ }
+
+ void Register() override
+ {
+ OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_summon_survivor_beach::SelectTarget, EFFECT_0, TARGET_DEST_NEARBY_ENTRY_OR_DB);
+ }
+};
+
+// ******************************************************************
+// * Scripting in this section occurs after reaching Abandoned Camp *
+// ******************************************************************
+
+enum CaptainGarrickAbandonedCampData
+{
+ CONVERSATION_QUEST_COOKING_MEAT_ACCEPT_ALLIANCE = 11696,
+ CONVERSATION_QUEST_COOKING_MEAT_COMPLETE_ALLIANCE = 12863,
+
+ QUEST_COOKING_MEAT_ALLIANCE = 55174
+};
+
+enum WarlordGrimaxeAbandonedCampData
+{
+ CONVERSATION_QUEST_COOKING_MEAT_ACCEPT_HORDE = 14439,
+ CONVERSATION_QUEST_COOKING_MEAT_COMPLETE_HORDE = 14611,
+
+ QUEST_COOKING_MEAT_HORDE = 59932
+};
+
+template<uint32 QuestId, uint32 ConversationId>
+struct npc_captain_abandoned_camp_exiles_reach : public ScriptedAI
+{
+ npc_captain_abandoned_camp_exiles_reach(Creature* creature) : ScriptedAI(creature) { }
+
+ void OnQuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() != QuestId)
+ return;
+
+ Conversation::CreateConversation(ConversationId, player, *player, player->GetGUID());
+ }
+};
+
+enum CookingMeatQuestData
+{
+ ANIMATION_KIT_INJURED = 14432
+};
+
+Position const InjuredNpcPositionAbandonedCamp = { -245.40973f, -2492.0886f, 18.404648f, 2.4754f };
+
+// 55174 - Cooking Meat
+// 59932 - Cooking Meat
+class quest_cooking_meat : public QuestScript
+{
+public:
+ quest_cooking_meat(char const* script) : QuestScript(script) { }
+
+ void HandleQuestStatusChange(Player* player, QuestStatus newStatus, uint32 completeConversationId, std::string_view injuredStringId)
+ {
+ switch (newStatus)
+ {
+ case QUEST_STATUS_COMPLETE:
+ {
+ Conversation::CreateConversation(completeConversationId, player, *player, player->GetGUID());
+ break;
+ }
+ case QUEST_STATUS_REWARDED:
+ {
+ Creature* injured = FindCreatureIgnorePhase(player, injuredStringId);
+ if (!injured)
+ break;
+
+ injured->SummonPersonalClone(InjuredNpcPositionAbandonedCamp, TEMPSUMMON_TIMED_DESPAWN, 2s, 0, 0, player);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+};
+
+// 55174 - Cooking Meat
+class quest_cooking_meat_alliance : public quest_cooking_meat
+{
+public:
+ quest_cooking_meat_alliance() : quest_cooking_meat("quest_cooking_meat_alliance") { }
+
+ void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
+ {
+ HandleQuestStatusChange(player, newStatus,
+ CONVERSATION_QUEST_COOKING_MEAT_COMPLETE_ALLIANCE,
+ "alaria_standing_abandoned_camp");
+ }
+};
+
+// 59932 - Cooking Meat
+class quest_cooking_meat_horde : public quest_cooking_meat
+{
+public:
+ quest_cooking_meat_horde() : quest_cooking_meat("quest_cooking_meat_horde") { }
+
+ void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
+ {
+ HandleQuestStatusChange(player, newStatus,
+ CONVERSATION_QUEST_COOKING_MEAT_COMPLETE_HORDE,
+ "wonza_standing_abandoned_camp");
+ }
+};
+
+struct areatrigger_find_the_lost_expedition : AreaTriggerAI
+{
+ areatrigger_find_the_lost_expedition(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { }
+
+ void OnUnitEnter(Unit* unit) override
+ {
+ Player* player = unit->ToPlayer();
+ if (!player)
+ return;
+
+ if (player->GetQuestStatus(QUEST_FINDING_THE_LOST_EXPEDITION_ALLIANCE) == QUEST_STATUS_COMPLETE || player->GetQuestStatus(QUEST_FINDING_THE_LOST_EXPEDITION_HORDE) == QUEST_STATUS_INCOMPLETE)
+ player->CastSpell(player, SPELL_GARRICK_PING);
+ }
+};
+
+struct areatrigger_find_the_lost_expedition_follower : AreaTriggerAI
+{
+ areatrigger_find_the_lost_expedition_follower(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { }
+
+ void OnUnitEnter(Unit* unit) override
+ {
+ Player* player = unit->ToPlayer();
+ if (!player)
+ return;
+
+ if (player->GetTeam() == ALLIANCE)
+ {
+ if (player->GetQuestStatus(QUEST_FINDING_THE_LOST_EXPEDITION_ALLIANCE) != QUEST_STATUS_INCOMPLETE)
+ return;
+
+ if (player->HasAura(SPELL_SUMMON_ADMIRAL_GARRICK_GUARDIAN))
+ return;
+
+ player->CastSpell(player, SPELL_SUMMON_ADMIRAL_GARRICK_GUARDIAN);
+ }
+ else
+ {
+ if (player->GetQuestStatus(QUEST_FINDING_THE_LOST_EXPEDITION_HORDE) != QUEST_STATUS_INCOMPLETE)
+ return;
+
+ if (player->HasAura(SPELL_SUMMON_WARLORD_GRIMAXE_GUARDIAN))
+ return;
+
+ player->CastSpell(player, SPELL_SUMMON_WARLORD_GRIMAXE_GUARDIAN);
+ }
}
};
@@ -1671,9 +2237,25 @@ void AddSC_zone_exiles_reach()
RegisterCreatureAI(npc_bo_beach_laying);
RegisterCreatureAI(npc_mithran_dawntracker_beach_laying);
RegisterCreatureAI(npc_lana_jordan_beach_laying);
+ RegisterCreatureAI(npc_murloc_spearhunter_watershaper);
+ RegisterCreatureAI(npc_murloc_spearhunter_watershaper_higher_ground);
new FactoryCreatureScript<CreatureAI, &BoBeachStandingAISelector>("npc_bo_beach_standing");
new FactoryCreatureScript<CreatureAI, &MithdranBeachStandingAISelector>("npc_mithdran_dawntracker_beach_standing");
new FactoryCreatureScript<CreatureAI, &LanaJordanBeachStandingAISelector>("npc_lana_jordan_beach_standing");
- RegisterCreatureAI(npc_murloc_spearhunter_watershaper);
- RegisterCreatureAI(npc_murloc_spearhunter_watershaper_higher_ground);
+ new FactoryCreatureScript<CreatureAI, &KeeLaBeachStandingAISelector>("npc_kee_la_beach_standing");
+ new FactoryCreatureScript<CreatureAI, &BjornBeachStandingAISelector>("npc_bjorn_stouthands_beach_standing");
+ new FactoryCreatureScript<CreatureAI, &AustinBeachStandingAISelector>("npc_austin_huxworth_beach_standing");
+ RegisterCreatureAI(npc_garrick_summoned_beach);
+ RegisterCreatureAI(npc_grimaxe_summoned_beach);
+ new quest_finding_the_lost_expedition_alliance();
+ new quest_finding_the_lost_expedition_horde();
+ RegisterSpellScript(spell_summon_survivor_beach);
+
+ // Abandoned Camp
+ new GenericCreatureScript<npc_captain_abandoned_camp_exiles_reach<QUEST_COOKING_MEAT_ALLIANCE, CONVERSATION_QUEST_COOKING_MEAT_ACCEPT_ALLIANCE>>("npc_captain_garrick_abandoned_camp");
+ new GenericCreatureScript<npc_captain_abandoned_camp_exiles_reach<QUEST_COOKING_MEAT_HORDE, CONVERSATION_QUEST_COOKING_MEAT_ACCEPT_HORDE>>("npc_warlord_grimaxe_abandoned_camp");
+ new quest_cooking_meat_alliance();
+ new quest_cooking_meat_horde();
+ RegisterAreaTriggerAI(areatrigger_find_the_lost_expedition);
+ RegisterAreaTriggerAI(areatrigger_find_the_lost_expedition_follower);
}