diff options
author | Naddley <64811442+Naddley@users.noreply.github.com> | 2024-03-25 23:19:05 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-25 23:19:05 +0100 |
commit | ee0858d859e9bf9dbac4afbef807850444023e61 (patch) | |
tree | 83117cce8329e9ec4e8dc9707bc2b59a08d0b49c /src/server/scripts/EasternKingdoms | |
parent | 28c9474337d0d30bc1d131b12b635c31a98bc97a (diff) |
Scripts/Stormwind: Implement RP Event for quest "Ancient Curses" (#29780)
Diffstat (limited to 'src/server/scripts/EasternKingdoms')
-rw-r--r-- | src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp index 7cb4ed0d3d7..116a688ec51 100644 --- a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp +++ b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp @@ -325,14 +325,186 @@ class spell_kultiras_skip_intro : public SpellScript } }; +enum AncientCursesData +{ + QUEST_ANCIENT_CURSES = 75891, + + NPC_ARKONARIN_STARSHADE = 207353, + NPC_LYSANDER_STARSHADE = 202700, + + DISPLAY_ID_STARSHADE_MOUNT = 63626, + + CONVERSATION_ANCIENT_CURSES = 22025, + + POINT_LYSANDER_STEP_TO_DOOR = 1, + + PATH_ARKONARIN_WALK_TO_MOUNT_UP = 20735300, + PATH_ARKONARIN_FLY_TO_FELWOOD = 20735301, + PATH_LYSANDER_WALK_TO_MOUNT_UP = 20270001, + PATH_LYSANDER_FLY_TO_FELWOOD = 20270002 +}; + +Position const LysanderWalkToTheDoor = { -8051.493f, 820.21704f, 68.30904f }; + +// 207353 - Arko'narin Starshade +struct npc_arkonarin_starshade_ancient_curses : public ScriptedAI +{ + npc_arkonarin_starshade_ancient_curses(Creature* creature) : ScriptedAI(creature) { } + + void OnQuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_ANCIENT_CURSES) + { + PhasingHandler::OnConditionChange(player); + Conversation::CreateConversation(CONVERSATION_ANCIENT_CURSES, player, *player, player->GetGUID(), nullptr, false); + } + } + + void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override + { + if (pathId == PATH_ARKONARIN_WALK_TO_MOUNT_UP) + { + me->SetDisableGravity(true, true); + me->SetMountDisplayId(DISPLAY_ID_STARSHADE_MOUNT); + _scheduler.Schedule(2s + 500ms, [this](TaskContext /*context*/) + { + me->GetMotionMaster()->MovePath(PATH_ARKONARIN_FLY_TO_FELWOOD, false); + me->DespawnOrUnsummon(5s); + }); + } + } + + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + } + +private: + TaskScheduler _scheduler; +}; + +// 202700 - Lysander Starshade +struct npc_lysande_starshade_ancient_curses : public ScriptedAI +{ + npc_lysande_starshade_ancient_curses(Creature* creature) : ScriptedAI(creature) { } + + void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override + { + if (pathId == PATH_LYSANDER_WALK_TO_MOUNT_UP) + { + me->SetDisableGravity(true, true); + me->SetMountDisplayId(DISPLAY_ID_STARSHADE_MOUNT); + _scheduler.Schedule(2s + 500ms, [this](TaskContext /*context*/) + { + me->GetMotionMaster()->MovePath(PATH_LYSANDER_FLY_TO_FELWOOD, false); + me->DespawnOrUnsummon(5s); + }); + } + } + + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + } + +private: + TaskScheduler _scheduler; +}; + +// 22025 - Conversation +class conversation_quest_ancient_curses_accept : public ConversationScript +{ +public: + conversation_quest_ancient_curses_accept() : ConversationScript("conversation_quest_ancient_curses_accept") { } + + enum AncientCursesConversationEvents + { + EVENT_ARKONARIN_START_PATH = 1, + EVENT_LYSANDER_START_PATH = 2 + }; + + enum AncientCursesConversationData + { + CONVO_LINE_ARKONARIN_START_PATH = 58685, + CONVO_LINE_LYSANDER_START_PATH = 60113, + }; + + void OnConversationCreate(Conversation* conversation, Unit* creator) override + { + Creature* arkonarinObject = GetClosestCreatureWithOptions(creator, 20.0f, { .CreatureId = NPC_ARKONARIN_STARSHADE, .IgnorePhases = true }); + Creature* lysanderObject = GetClosestCreatureWithOptions(creator, 20.0f, { .CreatureId = NPC_LYSANDER_STARSHADE, .IgnorePhases = true }); + if (!arkonarinObject || !lysanderObject) + return; + + TempSummon* arkonarinClone = arkonarinObject->SummonPersonalClone(arkonarinObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer()); + TempSummon* lysanderClone = lysanderObject->SummonPersonalClone(lysanderObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer()); + if (!arkonarinClone || !lysanderClone) + return; + + arkonarinClone->RemoveNpcFlag(NPCFlags(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER)); + lysanderClone->RemoveNpcFlag(NPCFlags(UNIT_NPC_FLAG_GOSSIP)); + lysanderClone->SetWalk(true); + lysanderClone->GetMotionMaster()->MovePoint(POINT_LYSANDER_STEP_TO_DOOR, LysanderWalkToTheDoor); + + conversation->AddActor(CONVERSATION_ANCIENT_CURSES, 1, arkonarinClone->GetGUID()); + conversation->AddActor(CONVERSATION_ANCIENT_CURSES, 2, lysanderClone->GetGUID()); + conversation->Start(); + } + + void OnConversationStart(Conversation* conversation) override + { + LocaleConstant privateOwnerLocale = conversation->GetPrivateObjectOwnerLocale(); + + if (Milliseconds const* lysanderPathStartTime = conversation->GetLineStartTime(privateOwnerLocale, CONVO_LINE_ARKONARIN_START_PATH)) + _events.ScheduleEvent(EVENT_ARKONARIN_START_PATH, *lysanderPathStartTime + 2s); + + if (Milliseconds const* lysanderPathStartTime = conversation->GetLineStartTime(privateOwnerLocale, CONVO_LINE_LYSANDER_START_PATH)) + _events.ScheduleEvent(EVENT_LYSANDER_START_PATH, *lysanderPathStartTime); + } + + void OnConversationUpdate(Conversation* conversation, uint32 diff) override + { + _events.Update(diff); + + switch (_events.ExecuteEvent()) + { + case EVENT_ARKONARIN_START_PATH: + { + Creature* arkonarinClone = conversation->GetActorCreature(1); + if (!arkonarinClone) + break; + + arkonarinClone->GetMotionMaster()->MovePath(PATH_ARKONARIN_WALK_TO_MOUNT_UP, false); + break; + } + case EVENT_LYSANDER_START_PATH: + { + Creature* lysanderClone = conversation->GetActorCreature(2); + if (!lysanderClone) + break; + + lysanderClone->GetMotionMaster()->MovePath(PATH_LYSANDER_WALK_TO_MOUNT_UP, false); + break; + } + default: + break; + } + } +private: + EventMap _events; +}; + void AddSC_stormwind_city() { // Creature RegisterCreatureAI(npc_jaina_proudmoore_tides_of_war); RegisterCreatureAI(npc_anduin_wrynn_nation_of_kultiras); + RegisterCreatureAI(npc_arkonarin_starshade_ancient_curses); + RegisterCreatureAI(npc_lysande_starshade_ancient_curses); // Conversation new conversation_start_council_tides_of_war(); + new conversation_quest_ancient_curses_accept(); // PlayerScript new player_conv_after_movie_tides_of_war(); |