From ac48da6275821f8f94acb6fb259728e6bf6fd79c Mon Sep 17 00:00:00 2001 From: Naddley <64811442+Naddley@users.noreply.github.com> Date: Fri, 21 Jul 2023 17:51:56 +0200 Subject: Scripts/ElwynnForest: Implement conversation for "The New Clessington Estate" (#29135) * human heritage questline --- sql/updates/world/master/2023_07_21_01_world.sql | 54 +++++++ .../scripts/EasternKingdoms/zone_elwynn_forest.cpp | 167 ++++++++++++++++++++- 2 files changed, 217 insertions(+), 4 deletions(-) create mode 100644 sql/updates/world/master/2023_07_21_01_world.sql diff --git a/sql/updates/world/master/2023_07_21_01_world.sql b/sql/updates/world/master/2023_07_21_01_world.sql new file mode 100644 index 00000000000..0ed8e939b11 --- /dev/null +++ b/sql/updates/world/master/2023_07_21_01_world.sql @@ -0,0 +1,54 @@ +-- Conversation +DELETE FROM `conversation_template` WHERE `Id`=20387; +INSERT INTO `conversation_template` (`Id`, `FirstLineID`, `TextureKitId`, `VerifiedBuild`) VALUES +(20387, 52596, 0, 50000); + +DELETE FROM `conversation_actors` WHERE (`ConversationId`=20387 AND `Idx` IN (1,2,0)); +INSERT INTO `conversation_actors` (`ConversationId`, `ConversationActorId`, `Idx`, `CreatureId`, `CreatureDisplayInfoId`, `NoActorObject`, `ActivePlayerObject`, `VerifiedBuild`) VALUES +(20387, 89180, 1, 0, 0, 0, 0, 50000), -- Full: 0x202FD40000C238C0000097000026109E Creature/0 R3061/S151 Map: 0 (Eastern Kingdoms) Entry: 198883 (Vanessa VanCleef) Low: 2494622 +(20387, 89175, 2, 0, 0, 0, 0, 50000), -- Full: 0x202FD40000C23C00000097000024C74A Creature/0 R3061/S151 Map: 0 (Eastern Kingdoms) Entry: 198896 (Master Mathias Shaw) Low: 2410314 +(20387, 0, 0, 0, 0, 0, 1, 50000); -- Full: 0x0800040000000000FFFFFFFFFFFFFFFF Player/0 R1/S16777215 Map: 0 (Eastern Kingdoms) Low: 1099511627775 + +DELETE FROM `conversation_line_template` WHERE `Id` IN (52595, 52594, 52593, 52596); +INSERT INTO `conversation_line_template` (`Id`, `UiCameraID`, `ActorIdx`, `Flags`, `ChatType`, `VerifiedBuild`) VALUES +(52595, 0, 1, 0, 0, 50000), +(52594, 0, 2, 0, 0, 50000), +(52593, 0, 1, 0, 0, 50000), +(52596, 0, 0, 0, 0, 50000); + +UPDATE `conversation_template` SET `ScriptName` = 'conversation_the_new_classington_estate' WHERE `ID` = 20387; + +UPDATE `creature_template_addon` SET `auras` = '' WHERE `entry` = 198883; + +-- Quest stuff +DELETE FROM `quest_details` WHERE `ID`=72426; +INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES +(72426, 1, 1, 0, 0, 0, 0, 0, 0, 50000); -- The New Clessington Estate + +DELETE FROM `creature_queststarter` WHERE (`id`=198896 AND `quest`=72426); +INSERT INTO `creature_queststarter` (`id`, `quest`, `VerifiedBuild`) VALUES +(198896, 72426, 50000); -- The New Clessington Estate offered Master Mathias Shaw + +DELETE FROM `creature_questender` WHERE (`id`=198896 AND `quest`=72424); +INSERT INTO `creature_questender` (`id`, `quest`, `VerifiedBuild`) VALUES +(198896, 72424, 50000); -- Looking for Something Specific ended Master Mathias Shaw + +DELETE FROM `quest_template_addon` WHERE `ID` = 72426; +INSERT INTO `quest_template_addon` (`ID`, `prevQuestID`) VALUES +(72426, 72424); + +-- Update Condition +DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 26 AND `SourceGroup` = 19934 AND `SourceEntry` = 0); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `Comment`) VALUES +(26, 19934, 0, 0, 0, 47, 0, 72405, 2 | 64, 0, 0, 'Apply Phase 19933 if Quest 75265 is complete | rewarded'), +(26, 19934, 0, 0, 0, 47, 0, 72426, 2 | 8 | 64, 0, 1, 'Apply Phase 19933 if Quest 72426 is not in progress | complete | rewarded'); + +-- Waypoints for 198883 (Vanessa VanCleef) +SET @ENTRY := 198883; +SET @PATH := ((@ENTRY) * 10) << 3; +DELETE FROM `waypoint_data` WHERE `id`= @PATH; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`) VALUES +(@PATH, 0, -9464.7, -8.180555, 50.05011, NULL, 0), +(@PATH, 1, -9462.712, -11.04861, 50.21397, NULL, 0), +(@PATH, 2, -9460.957, -10.8125, 50.16755, NULL, 0), +(@PATH, 3, -9460.654, -9.055555, 50.22908, NULL, 0); diff --git a/src/server/scripts/EasternKingdoms/zone_elwynn_forest.cpp b/src/server/scripts/EasternKingdoms/zone_elwynn_forest.cpp index d20f3bdb54d..66435eb86dc 100644 --- a/src/server/scripts/EasternKingdoms/zone_elwynn_forest.cpp +++ b/src/server/scripts/EasternKingdoms/zone_elwynn_forest.cpp @@ -23,6 +23,7 @@ #include "CreatureGroups.h" #include "MotionMaster.h" #include "ObjectAccessor.h" +#include "PhasingHandler.h" #include "Player.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" @@ -335,6 +336,32 @@ enum RottenOldMemoriesData CONVO_ROTTEN_OLD_MEMORIES = 20345 }; +enum TheNewClassingtonEstateData +{ + QUEST_THE_NEW_CLASSINGTON_ESTATE = 72426, + + CONVO_THE_NEW_CLASSINGTON_ESTATE = 20387, + + CONVO_LINE_VANESSA_START_WALK = 52595, + CONVO_LINE_HANDLE_CLONE_FACING = 52593, + + CONVO_ACTOR_IDX_VANESSA_CLASSINGTON_ESTATE = 1, + CONVO_ACTOR_IDX_MATHIAS_CLASSINGTON_ESTATE = 2, + + PATH_VANESSA_GOLDSHIRE_BASEMENT = 15910640, + + SPELL_VANESSA_COSMETIC_VANISH = 210194, + SPELL_VANESSA_STEALTH_DESPAWN = 186810 +}; + +enum ClassingtonEstateEvents +{ + EVENT_VANESSA_START_WALK = 1, + EVENT_VANESSA_STEALTH_DESPAWN, + EVENT_MATHIAS_SET_FACING, + EVENT_VANESSA_SET_FACING +}; + Position const VanessaClonePosition = { -9462.44f, -11.7101f, 50.161f, 2.99500f }; Position const VanessaStaticPosition = { -9468.16f, -3.6128f, 49.876f, 4.47226f }; @@ -343,6 +370,15 @@ struct npc_master_mathias_shaw_human_heritage_lions_pride_inn_basement : public { npc_master_mathias_shaw_human_heritage_lions_pride_inn_basement(Creature* creature) : ScriptedAI(creature) { } + void OnQuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_THE_NEW_CLASSINGTON_ESTATE) + { + PhasingHandler::OnConditionChange(player); + Conversation::CreateConversation(CONVO_THE_NEW_CLASSINGTON_ESTATE, player, *player, player->GetGUID(), nullptr, false); + } + } + bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { // Quest 72408 - A Window to the Past @@ -369,16 +405,25 @@ struct npc_vanessa_vancleef_human_heritage_lions_pride_inn_basement : public Scr { npc_vanessa_vancleef_human_heritage_lions_pride_inn_basement(Creature* creature) : ScriptedAI(creature) { } - void MovementInform(uint32 /*type*/, uint32 pointId) override + void OnQuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_ROTTEN_OLD_MEMORIES) + Conversation::CreateConversation(CONVO_ROTTEN_OLD_MEMORIES, player, *player, player->GetGUID(), nullptr); + } + + void MovementInform(uint32 type, uint32 pointId) override { + if (type != POINT_MOTION_TYPE) + return; + if (pointId == POINT_VANESSA_FINISH) _events.ScheduleEvent(EVENT_VANESSA_CLONE_LEAN, 1s); } - void OnQuestAccept(Player* player, Quest const* quest) override + void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override { - if (quest->GetQuestId() == QUEST_ROTTEN_OLD_MEMORIES) - Conversation::CreateConversation(CONVO_ROTTEN_OLD_MEMORIES, player, *player, player->GetGUID(), nullptr); + if (pathId == PATH_VANESSA_GOLDSHIRE_BASEMENT) + _events.ScheduleEvent(EVENT_VANESSA_STEALTH_DESPAWN, 0s); } void UpdateAI(uint32 diff) override @@ -395,6 +440,11 @@ struct npc_vanessa_vancleef_human_heritage_lions_pride_inn_basement : public Scr me->SetFacingTo(4.47226f); me->HandleEmoteCommand(EMOTE_STATE_WALEAN02); break; + case EVENT_VANESSA_STEALTH_DESPAWN: + me->CastSpell(nullptr, SPELL_VANESSA_COSMETIC_VANISH, true); + me->CastSpell(nullptr, SPELL_VANESSA_STEALTH_DESPAWN, true); + me->DespawnOrUnsummon(1s); + break; default: break; } @@ -531,6 +581,114 @@ private: EventMap _events; }; +// 20387 - Conversation +class conversation_the_new_classington_estate : public ConversationScript +{ +public: + conversation_the_new_classington_estate() : ConversationScript("conversation_the_new_classington_estate") { } + + void OnConversationCreate(Conversation* conversation, Unit* creator) override + { + Creature* mathiasObject = GetClosestCreatureWithOptions(creator, 15.0f, FindCreatureOptions().SetIgnorePhases(true).SetCreatureId(NPC_MATHIAS_SHAW)); + Creature* vanessaObject = GetClosestCreatureWithOptions(creator, 15.0f, FindCreatureOptions().SetIgnorePhases(true).SetCreatureId(NPC_VANESSA_VANCLEEF)); + if (!mathiasObject || !vanessaObject) + return; + + TempSummon* mathiasClone = mathiasObject->SummonPersonalClone(mathiasObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer()); + TempSummon* vanessaClone = vanessaObject->SummonPersonalClone(VanessaStaticPosition, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer()); + if (!mathiasClone || !vanessaClone) + return; + + mathiasClone->RemoveNpcFlag(NPCFlags(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER)); + vanessaClone->RemoveNpcFlag(NPCFlags(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER)); + vanessaClone->SetVirtualItem(1, vanessaClone->GetVirtualItemId(0)); // add 2nd dagger to hands + + conversation->AddActor(CONVO_THE_NEW_CLASSINGTON_ESTATE, CONVO_ACTOR_IDX_MATHIAS_CLASSINGTON_ESTATE, mathiasClone->GetGUID()); + conversation->AddActor(CONVO_THE_NEW_CLASSINGTON_ESTATE, CONVO_ACTOR_IDX_VANESSA_CLASSINGTON_ESTATE, vanessaClone->GetGUID()); + conversation->Start(); + } + + void OnConversationStart(Conversation* conversation) override + { + LocaleConstant privateOwnerLocale = conversation->GetPrivateObjectOwnerLocale(); + + _events.ScheduleEvent(EVENT_VANESSA_START_WALK, conversation->GetLineEndTime(privateOwnerLocale, CONVO_LINE_VANESSA_START_WALK)); + + if (Milliseconds const* facingLineStartTime = conversation->GetLineStartTime(privateOwnerLocale, CONVO_LINE_HANDLE_CLONE_FACING)) + _events.ScheduleEvent(EVENT_MATHIAS_SET_FACING, *facingLineStartTime); + + _events.ScheduleEvent(EVENT_VANESSA_SET_FACING, conversation->GetLineEndTime(privateOwnerLocale, CONVO_LINE_HANDLE_CLONE_FACING)); + + _events.ScheduleEvent(EVENT_MATHIAS_CLONE_DESPAWN, conversation->GetLastLineEndTime(privateOwnerLocale)); + } + + void OnConversationUpdate(Conversation* conversation, uint32 diff) override + { + _events.Update(diff); + + switch (_events.ExecuteEvent()) + { + case EVENT_VANESSA_START_WALK: + { + Creature* vanessaClone = conversation->GetActorCreature(CONVO_ACTOR_IDX_VANESSA_CLASSINGTON_ESTATE); + if (!vanessaClone) + break; + + Creature* mathiasClone = conversation->GetActorCreature(CONVO_ACTOR_IDX_MATHIAS_CLASSINGTON_ESTATE); + if (!mathiasClone) + break; + + mathiasClone->SetFacingTo(mathiasClone->GetHomePosition().GetOrientation()); + // @ToDo: use emote data of broadcast text + vanessaClone->SetEmoteState(EMOTE_STATE_NONE); + vanessaClone->GetMotionMaster()->MovePath(PATH_VANESSA_GOLDSHIRE_BASEMENT, false); + break; + } + case EVENT_MATHIAS_SET_FACING: + { + Creature* vanessaClone = conversation->GetActorCreature(CONVO_ACTOR_IDX_VANESSA_CLASSINGTON_ESTATE); + if (!vanessaClone) + break; + + Creature* mathiasClone = conversation->GetActorCreature(CONVO_ACTOR_IDX_MATHIAS_CLASSINGTON_ESTATE); + if (!mathiasClone) + break; + + vanessaClone->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH); + mathiasClone->SetFacingToObject(vanessaClone); + break; + } + case EVENT_VANESSA_SET_FACING: + { + Creature* vanessaClone = conversation->GetActorCreature(CONVO_ACTOR_IDX_VANESSA_CLASSINGTON_ESTATE); + if (!vanessaClone) + break; + + Creature* mathiasClone = conversation->GetActorCreature(CONVO_ACTOR_IDX_MATHIAS_CLASSINGTON_ESTATE); + if (!mathiasClone) + break; + + vanessaClone->SetFacingToObject(mathiasClone); + break; + } + case EVENT_MATHIAS_CLONE_DESPAWN: + { + Creature* mathiasClone = conversation->GetActorCreature(CONVO_ACTOR_IDX_MATHIAS_CLASSINGTON_ESTATE); + if (!mathiasClone) + break; + + mathiasClone->DespawnOrUnsummon(); + break; + } + default: + break; + } + } + +private: + EventMap _events; +}; + // 228928 - Stealth class spell_stealth_vanessa_human_heritage : public AuraScript { @@ -565,6 +723,7 @@ void AddSC_elwynn_forest() // Conversation new conversation_an_unlikely_informant(); + new conversation_the_new_classington_estate(); // AreaTrigger RegisterAreaTriggerAI(at_human_heritage_lions_pride_inn_basement_enter); -- cgit v1.2.3