Scripts/ExilesReach: Implemented Finding the Lost Expedition & Cooking Meat quests (#29119)

This commit is contained in:
Malcrom
2023-07-21 12:56:06 -03:00
committed by GitHub
parent f28b4eed3d
commit 5069f0e3a7
2 changed files with 822 additions and 45 deletions

View File

@@ -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

View File

@@ -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,
PATH_BO_TO_GRIMAXE = 10520210,
PATH_MITHDRAN_TO_GRIMAXE = 10520220,
PATH_LANA_JORDAN_TO_GRIMAXE = 10520230,
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,
TALK_HORDE_BEACH_THANK_PLAYER = 0
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_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,
QUEST_MURLOC_HIDEAWAY_BOOTS_DROPPED = 58883
if (creature->IsPrivateObject())
return new npc_survivors_beach_leave_private<PATH_KEE_LA_STANDING, 7 * IN_MILLISECONDS>(creature);
return new NullCreatureAI(creature);
};
// 150228 - Murloc Spearhunter
// 150229 - Murloc Watershaper
struct npc_murloc_spearhunter_watershaper : public ScriptedAI
CreatureAI* BjornBeachStandingAISelector(Creature* creature)
{
npc_murloc_spearhunter_watershaper(Creature* creature) : ScriptedAI(creature) { }
if (creature->IsPrivateObject())
return new npc_survivors_beach_leave_private<PATH_BJORN_STOUTHANDS_STANDING, 4 * IN_MILLISECONDS>(creature);
return new NullCreatureAI(creature);
};
void JustDied(Unit* /*killer*/) override
CreatureAI* AustinBeachStandingAISelector(Creature* creature)
{
if (creature->IsPrivateObject())
return new npc_survivors_beach_leave_private<PATH_AUSTIN_HUXWORTH_STANDING, 5 * IN_MILLISECONDS>(creature);
return new NullCreatureAI(creature);
};
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)
{
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);
}
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 UpdateAI(uint32 /*diff*/) override
void MovementInform(uint32 uiType, uint32 uiId) override
{
if (!UpdateVictim())
if (uiType != POINT_MOTION_TYPE || uiId != POINT_CAMP_POSITION)
return;
DoMeleeAttackIfReady();
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)
{
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;
};
// 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
{
Player* player = summoner->ToPlayer();
if (!player)
return;
_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;
};
// 54952 - Finding the Lost Expedition
// 59931 - Finding the Lost Expedition
class quest_finding_the_lost_expedition : public QuestScript
{
public:
quest_finding_the_lost_expedition(char const* script) : QuestScript(script) { }
void HandleQuestStatusChange(Player* player, QuestStatus newStatus, uint32 summonSpellId, std::string_view survivor1StringId, std::string_view survivor2StringId, std::string_view survivor3StringId)
{
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;
}
}
};
// 150228 - Murloc Spearhunter
// 150229 - Murloc Watershaper
struct npc_murloc_spearhunter_watershaper_higher_ground : public npc_murloc_spearhunter_watershaper
// 54952 - Finding the Lost Expedition
class quest_finding_the_lost_expedition_alliance : public quest_finding_the_lost_expedition
{
npc_murloc_spearhunter_watershaper_higher_ground(Creature* creature) : npc_murloc_spearhunter_watershaper(creature) { }
public:
quest_finding_the_lost_expedition_alliance() : quest_finding_the_lost_expedition("quest_finding_the_lost_expedition_alliance") { }
void JustEngagedWith(Unit* who) override
void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
{
me->GetMotionMaster()->MoveJump(who->GetPosition(), 16.0f, 6.2f);
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);
}