mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-15 23:20:36 +01:00
Scripts/ExilesReach: Implemented Finding the Lost Expedition & Cooking Meat quests (#29119)
This commit is contained in:
195
sql/updates/world/master/2023_07_21_02_world.sql
Normal file
195
sql/updates/world/master/2023_07_21_02_world.sql
Normal 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
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user