aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2024_03_25_03_world.sql100
-rw-r--r--src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp172
2 files changed, 272 insertions, 0 deletions
diff --git a/sql/updates/world/master/2024_03_25_03_world.sql b/sql/updates/world/master/2024_03_25_03_world.sql
new file mode 100644
index 00000000000..c6bc2eacc99
--- /dev/null
+++ b/sql/updates/world/master/2024_03_25_03_world.sql
@@ -0,0 +1,100 @@
+-- Creature
+UPDATE `creature` SET `equipment_id` = 1 WHERE `guid` = 9004157;
+
+DELETE FROM `creature_template_addon` WHERE `entry` = 207353;
+INSERT INTO `creature_template_addon` (`entry`, `PathId`, `mount`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvpFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES
+(207353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '416876'); -- Arko'narin Starshade
+
+DELETE FROM `creature_addon` WHERE `guid` = 9004158;
+INSERT INTO `creature_addon` (`guid`, `PathId`, `mount`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvpFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES
+(9004158, 0, 0, 0, 0, 0, 0, 0, 743, 0, 0, 0, 0, '416876');
+
+-- Template
+UPDATE `creature_template` SET `ScriptName` = 'npc_arkonarin_starshade_ancient_curses' WHERE `entry` = 207353;
+UPDATE `creature_template` SET `ScriptName` = 'npc_lysande_starshade_ancient_curses' WHERE `entry` = 202700;
+
+-- Conditions
+DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId`=26 AND `SourceGroup` = 21386 AND `SourceEntry` = 0);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `Comment`) VALUES
+(26, 21386, 0, 0, 0, 47, 0, 75890, 2|8|64, 0, 0, 'Apply Phase 12881 if Quest 75890 is in Progress | complete | rewarded'),
+(26, 21386, 0, 0, 0, 47, 0, 75891, 2|8|64, 0, 1, 'Apply Phase 12881 if Quest 75891 is not in Progress | complete | rewarded');
+
+-- Conversation
+DELETE FROM `conversation_template` WHERE `Id`=22025;
+INSERT INTO `conversation_template` (`Id`, `FirstLineID`, `TextureKitId`, `VerifiedBuild`) VALUES
+(22025, 58792, 0, 53441);
+
+UPDATE `conversation_template` SET `ScriptName` = 'conversation_quest_ancient_curses_accept' WHERE `Id` = 22025;
+
+DELETE FROM `conversation_actors` WHERE (`ConversationId`=22025 AND `Idx` IN (1,0,2));
+INSERT INTO `conversation_actors` (`ConversationId`, `ConversationActorId`, `Idx`, `CreatureId`, `CreatureDisplayInfoId`, `NoActorObject`, `ActivePlayerObject`, `VerifiedBuild`) VALUES
+(22025, 92501, 1, 0, 0, 0, 0, 53441), -- Full: 0x203CD80000CA7E400046850000635334 Creature/0 R3894/S18053 Map: 0 (Eastern Kingdoms) Entry: 207353 (Arko'narin Starshade) Low: 6509364
+(22025, 0, 0, 0, 0, 0, 1, 53441), -- Full: 0x0800040000000000FFFFFFFFFFFFFFFF Player/0 R1/S16777215 Map: 0 (Eastern Kingdoms) Low: 1099511627775
+(22025, 92502, 2, 0, 0, 0, 0, 53441); -- Full: 0x203CD80000C5F3000046850000635334 Creature/0 R3894/S18053 Map: 0 (Eastern Kingdoms) Entry: 202700 (Lysander Starshade) Low: 6509364
+
+DELETE FROM `conversation_line_template` WHERE `Id` IN (58695, 59782, 58689, 60113, 58686, 58685, 58681, 58684, 58792);
+INSERT INTO `conversation_line_template` (`Id`, `UiCameraID`, `ActorIdx`, `Flags`, `ChatType`, `VerifiedBuild`) VALUES
+(58695, 0, 1, 0, 0, 53441),
+(59782, 0, 0, 0, 0, 53441),
+(58689, 0, 1, 0, 0, 53441),
+(60113, 0, 2, 0, 0, 53441),
+(58686, 0, 1, 0, 0, 53441),
+(58685, 0, 1, 0, 0, 53441),
+(58681, 0, 2, 0, 0, 53441),
+(58684, 0, 1, 0, 0, 53441),
+(58792, 0, 0, 0, 0, 53441);
+
+-- Path for Arko'narin Starshade
+SET @ENTRY := 207353;
+SET @PATHOFFSET := 0;
+SET @PATH := @ENTRY * 100 + @PATHOFFSET;
+DELETE FROM `waypoint_path` WHERE `PathId`= @PATH;
+INSERT INTO `waypoint_path` (`PathId`, `MoveType`, `Flags`, `Comment`) VALUES
+(@PATH, 0, 0, 'Arkonarin Starshade - Ancient Curses - Walk to Mount up');
+
+DELETE FROM `waypoint_path_node` WHERE `PathId`= @PATH;
+INSERT INTO `waypoint_path_node` (`PathId`, `NodeId`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `Delay`) VALUES
+(@PATH, 0, -8055.644, 811.8108, 67.04881, NULL, 0),
+(@PATH, 1, -8059.302, 813.7813, 67.03999, NULL, 0),
+(@PATH, 2, -8061.103, 816.2917, 67.12263, NULL, 0),
+(@PATH, 3, -8063.181, 819.7986, 66.95995, NULL, 0),
+(@PATH, 4, -8064.859, 822.7864, 67.23528, NULL, 0),
+(@PATH, 5, -8067.783, 827.4531, 68.42369, NULL, 0);
+
+SET @ENTRY := 207353;
+SET @PATHOFFSET := 1;
+SET @PATH := @ENTRY * 100 + @PATHOFFSET;
+DELETE FROM `waypoint_path` WHERE `PathId`= @PATH;
+INSERT INTO `waypoint_path` (`PathId`, `MoveType`, `Flags`, `Comment`) VALUES
+(@PATH, 1, 0, 'Arkonarin Starshade - Ancient Curses - Fly with Mount');
+
+DELETE FROM `waypoint_path_node` WHERE `PathId`= @PATH;
+INSERT INTO `waypoint_path_node` (`PathId`, `NodeId`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `Delay`) VALUES
+(@PATH, 0, -8062.76, 837.1875, 90.90665, NULL, 0);
+
+-- Path for Lysander Starshade
+SET @ENTRY := 202700;
+SET @PATHOFFSET := 1;
+SET @PATH := @ENTRY * 100 + @PATHOFFSET;
+DELETE FROM `waypoint_path` WHERE `PathId`= @PATH;
+INSERT INTO `waypoint_path` (`PathId`, `MoveType`, `Flags`, `Comment`) VALUES
+(@PATH, 0, 0, 'Lysander Starshade - Ancient Curses - Walk to Mount up');
+
+DELETE FROM `waypoint_path_node` WHERE `PathId`= @PATH;
+INSERT INTO `waypoint_path_node` (`PathId`, `NodeId`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `Delay`) VALUES
+(@PATH, 0, -8057.543, 816.6129, 67.32983, NULL, 0),
+(@PATH, 1, -8059.802, 818.9965, 67.22331, NULL, 0),
+(@PATH, 2, -8060.806, 821.8246, 67.04409, NULL, 0),
+(@PATH, 3, -8061.877, 824.8906, 67.3605, NULL, 0),
+(@PATH, 4, -8063.377, 828.0174, 68.87323, NULL, 0);
+
+SET @ENTRY := 202700;
+SET @PATHOFFSET := 2;
+SET @PATH := @ENTRY * 100 + @PATHOFFSET;
+DELETE FROM `waypoint_path` WHERE `PathId`= @PATH;
+INSERT INTO `waypoint_path` (`PathId`, `MoveType`, `Flags`, `Comment`) VALUES
+(@PATH, 1, 0, 'Lysander Starshade - Fly with Mount');
+
+DELETE FROM `waypoint_path_node` WHERE `PathId`= @PATH;
+INSERT INTO `waypoint_path_node` (`PathId`, `NodeId`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `Delay`) VALUES
+(@PATH, 0, -8093.516, 861.3646, 86.87444, NULL, 0);
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();