diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/scripts/KulTiras/zone_boralus.cpp | 397 |
1 files changed, 397 insertions, 0 deletions
diff --git a/src/server/scripts/KulTiras/zone_boralus.cpp b/src/server/scripts/KulTiras/zone_boralus.cpp index 5b5f8a44b19..3f2147ec23e 100644 --- a/src/server/scripts/KulTiras/zone_boralus.cpp +++ b/src/server/scripts/KulTiras/zone_boralus.cpp @@ -26,6 +26,8 @@ #include "Player.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "ScriptedGossip.h" +#include "SpellInfo.h" #include "SpellScript.h" #include "TemporarySummon.h" @@ -56,6 +58,40 @@ enum GetYourBearingsData SPELL_HUB_TOUR_CONVO_FLIGHT_MASTER = 247753 }; +enum TheOldKnightData +{ + QUEST_THE_OLD_KNIGHT = 46729, + + NPC_CYRUS_CRESTFALL = 122370, + NPC_GENN_GREYMANE = 120788, + NPC_GREYGUARD = 120599, + + GOSSIP_MENU_CYRUS_SHAKING_HANDS = 22543, + GOSSIP_OPTION_CYRUS_SHAKING_HANDS = 0, + + CONVO_ACCEPT_OLD_KNIGHT_QUEST = 9556, + CONVO_CYRUS_MEETS_GENN_IN_OFFICE = 8062, + CONVO_CYRUS_SHAKING_HAND = 7653, + + CONVO_ACTOR_CYRUS_CRESTFAL = 59635, + + OBJECTIVE_ENTER_HARBORMASTERS_OFFICE = 335127, + + KILLCREDIT_SPEAK_WITH_CYRUS_OLD_KNIGHT = 137009, + KILLCREDIT_HEAR_CYRUS_TALE_OLD_KNIGHT = 137877, + + PATH_KULTIRAN_GUARD_ENTER_OFFICE = 12463000, + PATH_KULTIRAN_GUARD_AFTER_SCENE_OFFICE = 12463001, + PATH_CYRUS_CRESTFAL_AFTER_SCENE_OFFICE = 12237000, + PATH_GENN_GREYMANE_AFTER_SCENE_OFFICE = 12078800, + PATH_GREYGUARD_TWO_AFTER_SCENE_OFFICE = 12059900, + PATH_GREYGUARD_ONE_AFTER_SCENE_OFFICE = 12059901, + + SPELL_ENTER_HARBOR_MASTERS_OFFICE = 268759, + SPELL_FIND_CYRUS_OBJECTIVE_COMPLETE = 269054, + SPELL_CLIENT_SCENE_CYRUS_AND_GENN = 271234 +}; + // 124630 - Taelia struct npc_taelia_get_your_bearings : public ScriptedAI { @@ -68,6 +104,20 @@ struct npc_taelia_get_your_bearings : public ScriptedAI me->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); } + void OnQuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_THE_OLD_KNIGHT) + Conversation::CreateConversation(CONVO_ACCEPT_OLD_KNIGHT_QUEST, player, *player, player->GetGUID(), nullptr, false); + } + + void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override + { + if (spellInfo->Id != SPELL_FIND_CYRUS_OBJECTIVE_COMPLETE) + return; + + me->GetMotionMaster()->MovePath(PATH_KULTIRAN_GUARD_AFTER_SCENE_OFFICE, false); + } + void MovementInform(uint32 type, uint32 pointId) override { if (type != POINT_MOTION_TYPE) @@ -79,6 +129,12 @@ struct npc_taelia_get_your_bearings : public ScriptedAI me->SetFacingToObject(summoner); } } + + void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override + { + if (pathId == PATH_KULTIRAN_GUARD_AFTER_SCENE_OFFICE) + me->DespawnOrUnsummon(); + } }; // 5360 - Conversation @@ -255,10 +311,337 @@ public: } }; +// 9556 - Conversation The Old Knight (accept Quest) +class conversation_boralus_accept_old_knight : public ConversationScript +{ +public: + conversation_boralus_accept_old_knight() : ConversationScript("conversation_boralus_accept_old_knight") { } + + void OnConversationCreate(Conversation* conversation, Unit* creator) override + { + Creature* kultiranGuard = creator->FindNearestCreatureWithOptions(20.0f, { .CreatureId = NPC_SUMMONED_KULTIRAN_GUARD, .IgnorePhases = true, .OwnerGuid = creator->GetGUID() }); + if (!kultiranGuard) + return; + + conversation->AddActor(CONVO_ACTOR_KULTIRAN_GUARD, 0, kultiranGuard->GetGUID()); + conversation->Start(); + } +}; + +// XX - Boralus The Old Knight (Enter the Harbormasters Office) +struct at_boralus_old_knight_enter_harbormasters_office : AreaTriggerAI +{ + at_boralus_old_knight_enter_harbormasters_office(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { } + + void OnUnitEnter(Unit* unit) override + { + Player* player = unit->ToPlayer(); + if (!player || player->GetQuestStatus(QUEST_THE_OLD_KNIGHT) != QUEST_STATUS_INCOMPLETE || player->GetQuestObjectiveData(QUEST_THE_OLD_KNIGHT, OBJECTIVE_ENTER_HARBORMASTERS_OFFICE)) + return; + + player->CastSpell(nullptr, SPELL_ENTER_HARBOR_MASTERS_OFFICE, false); + } +}; + +// 7605 - Conversation The Old Knight (Enter the Harbormasters Office) +class conversation_boralus_enter_harbormaster_office : public ConversationScript +{ +public: + conversation_boralus_enter_harbormaster_office() : ConversationScript("conversation_boralus_enter_harbormaster_office") { } + + void OnConversationCreate(Conversation* conversation, Unit* creator) override + { + Creature* kultiranGuard = creator->FindNearestCreatureWithOptions(20.0f, { .CreatureId = NPC_SUMMONED_KULTIRAN_GUARD, .IgnorePhases = true, .OwnerGuid = creator->GetGUID() }); + if (!kultiranGuard) + return; + + kultiranGuard->GetMotionMaster()->Clear(); + kultiranGuard->GetMotionMaster()->MovePath(PATH_KULTIRAN_GUARD_ENTER_OFFICE, false); + + conversation->AddActor(CONVO_ACTOR_KULTIRAN_GUARD, 0, kultiranGuard->GetGUID()); + conversation->Start(); + } +}; + +// XX - Boralus The Old Knight (Genn Greymane arrives Boralus) +struct at_boralus_old_knight_genn_arrives_boralus : AreaTriggerAI +{ + at_boralus_old_knight_genn_arrives_boralus(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { } + + void OnUnitEnter(Unit* unit) override + { + Player* player = unit->ToPlayer(); + if (!player || player->GetQuestStatus(QUEST_THE_OLD_KNIGHT) != QUEST_STATUS_INCOMPLETE || player->GetQuestObjectiveData(QUEST_THE_OLD_KNIGHT, OBJECTIVE_ENTER_HARBORMASTERS_OFFICE)) + return; + + player->CastSpell(nullptr, SPELL_CLIENT_SCENE_CYRUS_AND_GENN, false); + } +}; + +// 1960 - Client Scene: Cyrus and Genn +class scene_boralus_client_scene_cyrus_and_genn : public SceneScript +{ +public: + scene_boralus_client_scene_cyrus_and_genn() : SceneScript("scene_boralus_client_scene_cyrus_and_genn") { } + + void OnSceneComplete(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) override + { + player->CastSpell(player, SPELL_FIND_CYRUS_OBJECTIVE_COMPLETE, true); + } + + void OnSceneCancel(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) override + { + player->CastSpell(player, SPELL_FIND_CYRUS_OBJECTIVE_COMPLETE, true); + } +}; + +Position const TaeliaTeleportOfficePos = { 1054.29f, -469.776f, 11.7166f, 3.065999f }; + +// 269054 - Find Cyrus Objective Complete +class spell_boralus_find_cyrus_objective_complete : public SpellScript +{ + void HandleHitTarget(SpellEffIndex /*effIndex*/) + { + if (Player* player = GetHitUnit()->ToPlayer()) + { + player->KilledMonsterCredit(NPC_CYRUS_CRESTFALL); + Conversation::CreateConversation(CONVO_CYRUS_MEETS_GENN_IN_OFFICE, player, *player, player->GetGUID(), nullptr, false); + } + else + { + if (GetHitUnit()->GetEntry() != NPC_SUMMONED_KULTIRAN_GUARD) + return; + + GetHitUnit()->NearTeleportTo(TaeliaTeleportOfficePos); + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_boralus_find_cyrus_objective_complete::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +Position const CyrusOfficePos = { 1056.310f, -470.567f, 11.656f, 5.80610f }; +Position const GennOfficePos = { 1052.689f, -470.200f, 11.692f, 0.24838f }; +Position const GreyguardOneOfficePos = { 1044.979f, -468.523f, 8.386f, 6.03047f }; +Position const GreyguardTwoOfficePos = { 1042.359f, -467.738f, 8.386f, 6.04665f }; + +// 8062 - Conversation +class conversation_boralus_cyrus_meets_genn : public ConversationScript +{ +public: + conversation_boralus_cyrus_meets_genn() : ConversationScript("conversation_boralus_cyrus_meets_genn") { } + + enum OldKnightsConversationData + { + CONVO_LINE_CYRUS_AND_GENN_DESPAWN = 18298, + + EVENT_OLD_KNIGHTS_CLONE_DESPAWN = 1 + }; + + void OnConversationCreate(Conversation* conversation, Unit* creator) override + { + Creature* cyrusObject = GetClosestCreatureWithOptions(creator, 30.0f, { .CreatureId = NPC_CYRUS_CRESTFALL, .IgnorePhases = true }); + Creature* gennObject = GetClosestCreatureWithOptions(creator, 30.0f, { .CreatureId = NPC_GENN_GREYMANE, .IgnorePhases = true }); + Creature* greyguardOneObject = GetClosestCreatureWithOptions(creator, 30.0f, { .CreatureId = NPC_GREYGUARD, .StringId = "GreyguardOne", .IgnorePhases = true }); + Creature* greyguardTwoObject = GetClosestCreatureWithOptions(creator, 30.0f, { .CreatureId = NPC_GREYGUARD, .StringId = "GreyguardTwo", .IgnorePhases = true }); + if (!cyrusObject || !gennObject || !greyguardOneObject || !greyguardTwoObject) + return; + + TempSummon* cyrusClone = cyrusObject->SummonPersonalClone(CyrusOfficePos, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer()); + TempSummon* gennClone = gennObject->SummonPersonalClone(GennOfficePos, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer()); + TempSummon* greyguardOneClone = greyguardOneObject->SummonPersonalClone(GreyguardOneOfficePos, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer()); + TempSummon* greyguardTwoClone = greyguardTwoObject->SummonPersonalClone(GreyguardTwoOfficePos, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer()); + if (!cyrusClone || !gennClone || !greyguardOneClone || !greyguardTwoClone) + return; + + _gennCloneGUID = gennClone->GetGUID(); + + cyrusClone->RemoveNpcFlag(NPCFlags(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER)); + gennClone->RemoveNpcFlag(NPCFlags(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER)); + + cyrusClone->GetMotionMaster()->MovePath(PATH_CYRUS_CRESTFAL_AFTER_SCENE_OFFICE, false); + gennClone->GetMotionMaster()->MovePath(PATH_GENN_GREYMANE_AFTER_SCENE_OFFICE, false); + greyguardOneClone->GetMotionMaster()->MovePath(PATH_GREYGUARD_ONE_AFTER_SCENE_OFFICE, false); + greyguardTwoClone->GetMotionMaster()->MovePath(PATH_GREYGUARD_TWO_AFTER_SCENE_OFFICE, false); + + conversation->AddActor(CONVO_ACTOR_CYRUS_CRESTFAL, 0, cyrusClone->GetGUID()); + conversation->Start(); + } + + void OnConversationStart(Conversation* conversation) override + { + LocaleConstant privateOwnerLocale = conversation->GetPrivateObjectOwnerLocale(); + + _events.ScheduleEvent(EVENT_OLD_KNIGHTS_CLONE_DESPAWN, conversation->GetLineEndTime(privateOwnerLocale, CONVO_LINE_CYRUS_AND_GENN_DESPAWN)); + } + + void OnConversationUpdate(Conversation* conversation, uint32 diff) override + { + _events.Update(diff); + + switch (_events.ExecuteEvent()) + { + case EVENT_OLD_KNIGHTS_CLONE_DESPAWN: + { + Creature* cyrusClone = conversation->GetActorCreature(0); + if (!cyrusClone) + break; + + Unit* privateObjectOwner = ObjectAccessor::GetUnit(*conversation, conversation->GetPrivateObjectOwner()); + if (!privateObjectOwner) + return; + + if (Creature* gennClone = ObjectAccessor::GetCreature(*conversation, _gennCloneGUID)) + gennClone->DespawnOrUnsummon(); + + cyrusClone->DespawnOrUnsummon(); + PhasingHandler::OnConditionChange(privateObjectOwner); + break; + } + default: + break; + } + } + +private: + ObjectGuid _gennCloneGUID; + EventMap _events; +}; + +// 122370 - Cyrus Crestfall +struct npc_cyrus_crestfall_old_knight : public ScriptedAI +{ + npc_cyrus_crestfall_old_knight(Creature* creature) : ScriptedAI(creature) { } + + bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + { + // Quest 46729 - The Old Knight + if (menuId == GOSSIP_MENU_CYRUS_SHAKING_HANDS && gossipListId == GOSSIP_OPTION_CYRUS_SHAKING_HANDS) + { + CloseGossipMenuFor(player); + player->KilledMonsterCredit(KILLCREDIT_SPEAK_WITH_CYRUS_OLD_KNIGHT); + Conversation::CreateConversation(CONVO_CYRUS_SHAKING_HAND, player, *player, player->GetGUID(), nullptr, false); + } + return true; + } +}; + +Position const CyrusMoveToOfficeFirePos = { 1075.257f, -487.25696f, 9.812291f }; +Position const CyrusStaticOfficePos = { 1071.428f, -486.312f, 9.783f, 3.4995f }; + +// 7653 - Conversation +class conversation_cyrus_crestfall_shaking_hands : public ConversationScript +{ +public: + conversation_cyrus_crestfall_shaking_hands() : ConversationScript("conversation_cyrus_crestfall_shaking_hands") { } + + enum ShakingHandsConversationData + { + CONVO_LINE_CYRUS_START_WALK_TO_FIRE = 17416, + CONVO_LINE_CYRUS_CHANGE_FACING_GENN = 17419, + CONVO_LINE_CYRUS_MOVE_BACK_TO_GENN = 17421, + CONVO_LINE_CYRUS_DESPAWN_CLONE_OFFICE = 17423, + + EVENT_CYRUS_START_WALK_TO_FIRE = 1, + EVENT_CYRUS_CHANGE_FACING_GENN = 2, + EVENT_CYRUS_MOVE_BACK_TO_GENN = 3, + EVENT_CYRUS_DESPAWN_CLONE_OFFICE = 4, + + POINT_CYRUS_MOVE_TO_OFFICE_FIRE = 1, + POINT_CYRUS_MOVE_BACK_TO_GENN = 2 + }; + + void OnConversationCreate(Conversation* conversation, Unit* creator) override + { + Creature* cyrusObject = GetClosestCreatureWithOptions(creator, 10.0f, { .CreatureId = NPC_CYRUS_CRESTFALL, .IgnorePhases = true }); + if (!cyrusObject) + return; + + TempSummon* cyrusClone = cyrusObject->SummonPersonalClone(cyrusObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer()); + if (!cyrusClone) + return; + + cyrusClone->RemoveNpcFlag(NPCFlags(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER)); + + conversation->AddActor(CONVO_ACTOR_CYRUS_CRESTFAL, 1, cyrusClone->GetGUID()); + conversation->Start(); + } + + void OnConversationStart(Conversation* conversation) override + { + LocaleConstant privateOwnerLocale = conversation->GetPrivateObjectOwnerLocale(); + + _events.ScheduleEvent(EVENT_CYRUS_START_WALK_TO_FIRE, conversation->GetLineEndTime(privateOwnerLocale, CONVO_LINE_CYRUS_START_WALK_TO_FIRE)); + _events.ScheduleEvent(EVENT_CYRUS_CHANGE_FACING_GENN, conversation->GetLineEndTime(privateOwnerLocale, CONVO_LINE_CYRUS_CHANGE_FACING_GENN)); + _events.ScheduleEvent(EVENT_CYRUS_MOVE_BACK_TO_GENN, conversation->GetLineEndTime(privateOwnerLocale, CONVO_LINE_CYRUS_MOVE_BACK_TO_GENN)); + _events.ScheduleEvent(EVENT_CYRUS_DESPAWN_CLONE_OFFICE, conversation->GetLineEndTime(privateOwnerLocale, CONVO_LINE_CYRUS_DESPAWN_CLONE_OFFICE)); + } + + void OnConversationUpdate(Conversation* conversation, uint32 diff) override + { + _events.Update(diff); + + switch (_events.ExecuteEvent()) + { + case EVENT_CYRUS_START_WALK_TO_FIRE: + { + Creature* cyrusClone = conversation->GetActorCreature(1); + if (!cyrusClone) + break; + + cyrusClone->SetWalk(true); + cyrusClone->GetMotionMaster()->MovePoint(POINT_CYRUS_MOVE_TO_OFFICE_FIRE, CyrusMoveToOfficeFirePos); + break; + } + case EVENT_CYRUS_CHANGE_FACING_GENN: + { + Creature* cyrusClone = conversation->GetActorCreature(1); + if (!cyrusClone) + break; + + cyrusClone->SetFacingTo(3.49956f); + break; + } + case EVENT_CYRUS_MOVE_BACK_TO_GENN: + { + Creature* cyrusClone = conversation->GetActorCreature(1); + if (!cyrusClone) + break; + + Player* privateObjectOwner = ObjectAccessor::GetPlayer(*conversation, conversation->GetPrivateObjectOwner()); + if (!privateObjectOwner) + return; + + cyrusClone->SetWalk(true); + cyrusClone->GetMotionMaster()->MovePoint(POINT_CYRUS_MOVE_BACK_TO_GENN, CyrusStaticOfficePos); + privateObjectOwner->KilledMonsterCredit(KILLCREDIT_HEAR_CYRUS_TALE_OLD_KNIGHT); + break; + } + case EVENT_CYRUS_DESPAWN_CLONE_OFFICE: + { + Creature* cyrusClone = conversation->GetActorCreature(1); + if (!cyrusClone) + break; + + cyrusClone->DespawnOrUnsummon(); + break; + } + default: + break; + } + } + +private: + EventMap _events; +}; + void AddSC_zone_boralus() { // Creature RegisterCreatureAI(npc_taelia_get_your_bearings); + RegisterCreatureAI(npc_cyrus_crestfall_old_knight); // Conversation new conversation_boralus_hub_tour_00(); @@ -266,10 +649,24 @@ void AddSC_zone_boralus() new conversation_boralus_hub_tour_counting_house(); new conversation_boralus_hub_tour_harbor_inn(); new conversation_boralus_hub_tour_flight_master(); + new conversation_boralus_accept_old_knight(); + new conversation_boralus_enter_harbormaster_office(); + new conversation_boralus_cyrus_meets_genn(); + new conversation_cyrus_crestfall_shaking_hands(); + + // Scene + new scene_boralus_client_scene_cyrus_and_genn(); // AreaTrigger + RegisterAreaTriggerAI(at_boralus_old_knight_enter_harbormasters_office); + RegisterAreaTriggerAI(at_boralus_old_knight_genn_arrives_boralus); + + // AreaTrigger Template new GenericAreaTriggerEntityScript<at_boralus_get_your_bearings<QUEST_GET_YOUR_BEARINGS, OBJECTIVE_FERRY_DOCK_VISITED, SPELL_HUB_TOUR_CONVO_FERRY>>("at_boralus_get_your_bearings_ferry"); new GenericAreaTriggerEntityScript<at_boralus_get_your_bearings<QUEST_GET_YOUR_BEARINGS, OBJECTIVE_COUNTING_HOUSE_VISITED, SPELL_HUB_TOUR_CONVO_BANK>>("at_boralus_get_your_bearings_counting_house"); new GenericAreaTriggerEntityScript<at_boralus_get_your_bearings<QUEST_GET_YOUR_BEARINGS, OBJECTIVE_SNUG_HARBOR_INN_VISITED, SPELL_HUB_TOUR_CONVO_INN>>("at_boralus_get_your_bearings_inn"); new GenericAreaTriggerEntityScript<at_boralus_get_your_bearings<QUEST_GET_YOUR_BEARINGS, OBJECTIVE_FLIGHT_MASTER_VISITED, SPELL_HUB_TOUR_CONVO_FLIGHT_MASTER>>("at_boralus_get_your_bearings_flight_master"); + + // Spells + RegisterSpellScript(spell_boralus_find_cyrus_objective_complete); } |
