aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/KulTiras/zone_boralus.cpp397
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);
}