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 --- .../scripts/EasternKingdoms/zone_elwynn_forest.cpp | 167 ++++++++++++++++++++- 1 file changed, 163 insertions(+), 4 deletions(-) (limited to 'src') 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