aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2024_01_27_01_world.sql259
-rw-r--r--src/server/scripts/KulTiras/zone_boralus.cpp397
2 files changed, 656 insertions, 0 deletions
diff --git a/sql/updates/world/master/2024_01_27_01_world.sql b/sql/updates/world/master/2024_01_27_01_world.sql
new file mode 100644
index 00000000000..a149476a9cd
--- /dev/null
+++ b/sql/updates/world/master/2024_01_27_01_world.sql
@@ -0,0 +1,259 @@
+SET @CGUID := 8000035;
+SET @ATID := 62;
+SEt @ATCP := 50;
+SET @ATIDSPAWN := 62;
+
+-- Creature
+DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+4;
+INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnDifficulties`, `PhaseId`, `PhaseGroup`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `unit_flags2`, `unit_flags3`, `VerifiedBuild`) VALUES
+(@CGUID+0, 120788, 1643, 8717, 9802, '0', 10845, 0, 0, 0, 1068.16845703125, -487.204864501953125, 9.783460617065429687, 0.248383447527885437, 120, 0, 0, 4737000, 90350, 0, NULL, NULL, NULL, NULL, 52808), -- Genn Greymane (Area: Harbormaster's Office - Difficulty: 0) CreateObject1
+(@CGUID+1, 120599, 1643, 8717, 9802, '0', 10845, 0, 0, 1, 1064.234375, -489.888885498046875, 9.783459663391113281, 1.296923279762268066, 120, 0, 0, 176210, 0, 0, NULL, NULL, NULL, NULL, 52808), -- Greyguard (Area: Harbormaster's Office - Difficulty: 0) CreateObject1
+(@CGUID+2, 120599, 1643, 8717, 9802, '0', 10845, 0, 0, 1, 1058.7447509765625, -488.9444580078125, 9.78342437744140625, 1.206693172454833984, 120, 0, 0, 176210, 0, 0, NULL, NULL, NULL, NULL, 52808), -- Greyguard (Area: Harbormaster's Office - Difficulty: 0) CreateObject1
+(@CGUID+3, 121235, 1643, 8717, 9802, '0', 10827, 0, 0, 1, 1070.404541015625, -489.321197509765625, 9.783461570739746093, 1.501441717147827148, 120, 0, 0, 17621, 0, 0, NULL, NULL, NULL, NULL, 52808), -- Taelia (Area: Harbormaster's Office - Difficulty: 0) CreateObject1
+(@CGUID+4, 122370, 1643, 8717, 9802, '0', 9001, 0, 0, 0, 1071.4288330078125, -486.3125, 9.7834625244140625, 3.499564647674560546, 120, 0, 0, 17621, 0, 0, NULL, NULL, NULL, NULL, 52808); -- Cyrus Crestfall (Area: Harbormaster's Office - Difficulty: 0) CreateObject1
+
+-- Template
+UPDATE `creature` SET `StringId` = "GreyguardOne" WHERE `guid` = @CGUID+1;
+UPDATE `creature` SET `StringId` = "GreyguardTwo" WHERE `guid` = @CGUID+2;
+
+UPDATE `creature_template` SET `ScriptName` = 'npc_cyrus_crestfall_old_knight' WHERE `entry` = 122370;
+UPDATE `creature_template` SET `npcflag`=3 WHERE `entry`=120788; -- Genn Greymane
+
+-- AreaTrigger
+DELETE FROM `areatrigger_template` WHERE (`Id` = @ATID+0 AND `IsCustom` = 1) OR (`Id` = @ATID+1 AND `IsCustom` = 1);
+INSERT INTO `areatrigger_template` (`Id`, `IsCustom`, `Flags`, `VerifiedBuild`) VALUES
+(@ATID+0, 1, 1, 0),
+(@ATID+1, 1, 1, 0);
+
+DELETE FROM `areatrigger_create_properties` WHERE (`Id`= @ATCP+0 AND `IsCustom`=1) OR (`Id`= @ATCP+1 AND `IsCustom`=1);
+INSERT INTO `areatrigger_create_properties` (`Id`, `IsCustom`, `AreaTriggerId`, `IsAreatriggerCustom`, `Flags`, `MoveCurveId`, `ScaleCurveId`, `MorphCurveId`, `FacingCurveId`, `AnimId`, `AnimKitId`, `DecalPropertiesId`, `TimeToTarget`, `TimeToTargetScale`, `Shape`, `ShapeData0`, `ShapeData1`, `ShapeData2`, `ShapeData3`, `ShapeData4`, `ShapeData5`, `ShapeData6`, `ShapeData7`, `ScriptName`, `VerifiedBuild`) VALUES
+(@ATCP+0, 1, @ATID+0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 12, 8, 6, 12, 8, 6, 0, 0, '', 0),
+(@ATCP+1, 1, @ATID+1, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 7, 4, 7, 7, 4, 7, 0, 0, '', 0);
+
+DELETE FROM `areatrigger` WHERE `SpawnId` BETWEEN @ATIDSPAWN+0 AND @ATIDSPAWN+3;
+INSERT INTO `areatrigger` (`SpawnId`, `AreaTriggerCreatePropertiesId`, `IsCustom`, `MapId`, `SpawnDifficulties`, `PosX`, `PosY`, `PosZ`, `Orientation`, `PhaseUseFlags`, `PhaseId`, `PhaseGroup`, `SpellForVisuals`, `ScriptName`, `Comment`, `VerifiedBuild`) VALUES
+(@ATIDSPAWN+0, @ATCP+0, 1, 1643, '0', 1083.3828, -485.8729, 20.3390, 1.313066, 0, 0, 0, NULL, 'at_boralus_old_knight_enter_harbormasters_office', 'Boralus - Enter Harbormasters Office', 0),
+(@ATIDSPAWN+1, @ATCP+1, 1, 1643, '0', 1063.0791, -472.2944, 11.6384, 6.063283, 0, 0, 0, NULL, 'at_boralus_old_knight_genn_arrives_boralus', 'Boralus - Genn Greymane arrives Boralus', 0);
+
+-- SpellScript Names
+DELETE FROM `spell_script_names` WHERE `spell_id` = 269054;
+INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
+(269054, 'spell_boralus_find_cyrus_objective_complete');
+
+-- Scene
+DELETE FROM `scene_template` WHERE `SceneId`=1960;
+INSERT INTO `scene_template` (`SceneId`, `Flags`, `ScriptPackageID`, `Encrypted`) VALUES
+(1960, 17, 2107, 0);
+
+UPDATE `scene_template` SET `ScriptName` = 'scene_boralus_client_scene_cyrus_and_genn' WHERE `SceneId` = 1960;
+
+-- Gossip
+DELETE FROM `creature_template_gossip` WHERE (`CreatureID`=122370 AND `MenuID`=22543) OR (`CreatureID`=120788 AND `MenuID`=23317);
+INSERT INTO `creature_template_gossip` (`CreatureID`, `MenuID`, `VerifiedBuild`) VALUES
+(122370, 22543, 52808), -- Cyrus Crestfall
+(120788, 23317, 53040); -- Genn Greymane
+
+UPDATE `creature_template_gossip` SET `VerifiedBuild`=52808 WHERE (`CreatureID`=121235 AND `MenuID`=21307);
+
+DELETE FROM `gossip_menu` WHERE (`MenuID`=21307 AND `TextID`=133576);
+INSERT INTO `gossip_menu` (`MenuID`, `TextID`, `VerifiedBuild`) VALUES
+(21307, 133576, 52808); -- 121235 (Taelia)
+
+UPDATE `gossip_menu_option` SET `GossipOptionID`=48242, `VerifiedBuild`=53040 WHERE (`MenuID`=22543 AND `OptionID`=0);
+
+-- Quest stuff
+DELETE FROM `creature_questender` WHERE (`id`=121235 AND `quest`=46729);
+INSERT INTO `creature_questender` (`id`, `quest`, `VerifiedBuild`) VALUES
+(121235, 46729, 52808); -- The Old Knight ended by Taelia
+
+-- Conversation
+DELETE FROM `conversation_template` WHERE `Id` IN (7653, 8062, 7605);
+INSERT INTO `conversation_template` (`Id`, `FirstLineID`, `TextureKitId`, `VerifiedBuild`) VALUES
+(7653, 17449, 0, 52808),
+(8062, 18297, 0, 52808),
+(7605, 17297, 0, 52808);
+
+UPDATE `conversation_template` SET `ScriptName` = 'conversation_boralus_accept_old_knight' WHERE `Id` = 9556;
+UPDATE `conversation_template` SET `ScriptName` = 'conversation_boralus_enter_harbormaster_office' WHERE `Id` = 7605;
+UPDATE `conversation_template` SET `ScriptName` = 'conversation_boralus_cyrus_meets_genn' WHERE `Id` = 8062;
+UPDATE `conversation_template` SET `ScriptName` = 'conversation_cyrus_crestfall_shaking_hands' WHERE `Id` = 7653;
+
+DELETE FROM `conversation_actors` WHERE (`Idx`=1 AND `ConversationId` IN (8062,7653)) OR (`Idx`=0 AND `ConversationId` IN (8062,7605,7653));
+INSERT INTO `conversation_actors` (`ConversationId`, `ConversationActorId`, `ConversationActorGuid`, `Idx`, `CreatureId`, `CreatureDisplayInfoId`, `NoActorObject`, `ActivePlayerObject`, `VerifiedBuild`) VALUES
+(8062, 0,(@CGUID+3), 1, 0, 0, 0, 0, 52808), -- Full: 0x20309CCD607664C00000EA00001E0614 Creature/0 R3111/S234 Map: 1643 (Kul Tiras) Entry: 121235 (Taelia) Low: 1967636
+(8062, 59635, 0, 0, 0, 0, 0, 0, 52808), -- Full: 0x20309CCD607780800000EA00001E0614 Creature/0 R3111/S234 Map: 1643 (Kul Tiras) Entry: 122370 (Cyrus Crestfall) Low: 1967636
+(7605, 59582, 0, 0, 0, 0, 0, 0, 52808), -- Full: 0x20309CCD6079B5800000EA000021CFE2 Creature/0 R3111/S234 Map: 1643 (Kul Tiras) Entry: 124630 (Kul Tiran Guard) Low: 2215906
+(7653, 64106, (@CGUID+0), 0, 0, 0, 0, 0, 52808), -- Full: 0x0
+(7653, 59635, 0, 1, 0, 0, 0, 0, 52808); -- Full: 0x20309CCD607780800000EA00001E0614 Creature/0 R3111/S234 Map: 1643 (Kul Tiras) Entry: 122370 (Cyrus Crestfall) Low: 1967636
+
+DELETE FROM `conversation_line_template` WHERE `Id` IN (18299, 18298, 18297, 17447, 17297, 17446, 17423, 17422, 17421, 17420, 18294, 17419, 17417, 17416, 18293, 17414, 17413, 17449);
+INSERT INTO `conversation_line_template` (`Id`, `UiCameraID`, `ActorIdx`, `Flags`, `ChatType`, `VerifiedBuild`) VALUES
+(18299, 0, 1, 0, 0, 52808),
+(18298, 0, 0, 0, 0, 52808),
+(18297, 0, 0, 0, 0, 52808),
+(17447, 0, 0, 0, 0, 52808),
+(17297, 0, 0, 0, 0, 52808),
+(17446, 0, 0, 0, 0, 52808),
+(17423, 0, 0, 0, 0, 52808),
+(17422, 0, 1, 0, 0, 52808),
+(17421, 0, 1, 0, 0, 52808),
+(17420, 0, 1, 0, 0, 52808),
+(18294, 0, 1, 0, 0, 52808),
+(17419, 0, 1, 0, 0, 52808),
+(17417, 0, 1, 0, 0, 52808),
+(17416, 0, 1, 0, 0, 52808),
+(18293, 0, 1, 0, 0, 52808),
+(17414, 0, 1, 0, 0, 52808),
+(17413, 0, 0, 0, 0, 52808),
+(17449, 0, 0, 0, 0, 52808);
+
+-- Phasing
+DELETE FROM `phase_name` WHERE `ID` IN (10845, 10827, 9001);
+INSERT INTO `phase_name` (`ID`, `Name`) VALUES
+(10845, 'Cosmetic - See Genn Greymane and Greyguards in Harbormasters Office'),
+(10827, 'Cosmetic - See Taelia in Harbormasters Office'),
+(9001, 'Cosmetic - See Cyrus Crestfall in Harbormasters Office');
+
+DELETE FROM `phase_area` WHERE `AreaId` = 9802 AND `PhaseId` IN (10845, 10827, 9001);
+INSERT INTO `phase_area` (`AreaId`, `PhaseId`, `Comment`) VALUES
+(9802, 10845, 'See Genn Greymane and Greyguards in Harbormasters Office'),
+(9802, 10827, 'See Taelia in Harbormasters Office'),
+(9802, 9001, 'See Cyrus Crestfall in Harbormasters Office');
+
+DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId`=26 AND `SourceGroup` IN (10845, 10827, 9001) AND `SourceEntry` = 0);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `Comment`) VALUES
+(26, 10845, 0, 0, 0, 47, 0, 46729, 8, 0, 0, 'Apply Phase 10845 if Quest 46729 is in progress'),
+(26, 10845, 0, 0, 0, 48, 0, 335127, 0, 1, 0, 'Apply Phase 10845 if Questobjective 335127 (Enter the Harbormasters Office) is rewarded'),
+(26, 10845, 0, 0, 1, 47, 0, 46729, 2|64, 0, 0, 'Apply Phase 10845 if Quest 46729 is complete | rewarded'),
+(26, 10827, 0, 0, 0, 47, 0, 46729, 8, 0, 0, 'Apply Phase 10827 if Quest 46729 is in progress'),
+(26, 10827, 0, 0, 0, 48, 0, 335127, 0, 1, 0, 'Apply Phase 10827 if Questobjective 335127 (Enter the Harbormasters Office) is rewarded'),
+(26, 10827, 0, 0, 1, 47, 0, 46729, 2|64, 0, 0, 'Apply Phase 10827 if Quest 46729 is complete | rewarded'),
+(26, 9001, 0, 0, 0, 47, 0, 46729, 8, 0, 0, 'Apply Phase 9001 if Quest 46729 is in progress'),
+(26, 9001, 0, 0, 0, 48, 0, 335127, 0, 1, 0, 'Apply Phase 9001 if Questobjective 335127 (Enter the Harbormasters Office) is rewarded'),
+(26, 9001, 0, 0, 1, 47, 0, 46729, 2|64, 0, 0, 'Apply Phase 9001 if Quest 46729 is complete | rewarded');
+
+DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId`=15 AND `SourceGroup` = 22543 AND `SourceEntry` = 0);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `Comment`) VALUES
+(15, 22543, 0, 0, 0, 47, 0, 46729, 8, 0, 0, 'Show gossip menu option if player has Quest 46729 in Progress'),
+(15, 22543, 0, 0, 0, 48, 0, 335216, 0, 1, 1, 'Show gossip menu option if player has not quest objective done: Speak with Cyrus Crestfall');
+
+-- Difficulty & Model
+UPDATE `creature_template_difficulty` SET `VerifiedBuild`=52808 WHERE (`DifficultyID`=0 AND `Entry` IN (145730,121235,137314,120788,120599,122370,137316,145728,142189,137317,124238,151173,140944,142181,142089,141116,141114,141117,142163,131992,141115,135658,143272,141033,143040,135521,137298,137281,139148,139144,124805,126781,139088,146902,147206,131989,123604,145729,135681,143856,140472,143842,143116,143110,143111,143104,143107,143101,143109,143114,142138,143112,135618,143108,142160,135612,138744,137282,143844,137300,143100,137279,144635,137294,140473,138704,143846,137293,143106,153932,135614,135677,143103,143870,137295,148922,143105,135675,135678,143839,152000,142612,143718,136059,143260,143259,124695,142176,138280,135064,143248,126634,139375,141274,143242,126642,126519,144147,123633,136061,136063,143251,144148,140313,138726,124859,132625,123675,160101,137268,142086,142174,124289,143262,125005,143261,139522,142169,142132,143263,150208,142063,142056,142167,154464,135230,142188,142371,142457,124725,177193,143244,121239,143246,142191,123635,143295,124720,135153,149045,142187,143243,142073,142180,144383,142068,143709,142543,124295,142117,142136,143098,142066,150493,138724,123244,132036,132642,128531,143502,138725,142752,136041,144310,143022,140350,142137,143254,137265,132638,123642,137266,142139,135520,142346,123639,143250,130377,135808,142459,135509,142077,135446,123169,133282,133325,62821,197611,131994,62822,136052,126682,124180,142166,142094,126434,124181,124727,136633,142095,121541,124630));
+UPDATE `creature_template_difficulty` SET `ContentTuningID`=328, `VerifiedBuild`=52808 WHERE (`Entry`=131983 AND `DifficultyID`=0); -- Raider's Training Dummy
+UPDATE `creature_template_difficulty` SET `ContentTuningID`=371, `VerifiedBuild`=52808 WHERE (`Entry`=115785 AND `DifficultyID`=0); -- Direbeak Hatchling
+UPDATE `creature_template_difficulty` SET `ContentTuningID`=371, `VerifiedBuild`=52808 WHERE (`Entry`=213407 AND `DifficultyID`=0); -- Lil' Wrathion
+
+DELETE FROM `creature_model_info` WHERE `DisplayID`=115559;
+INSERT INTO `creature_model_info` (`DisplayID`, `BoundingRadius`, `CombatReach`, `DisplayID_Other_Gender`, `VerifiedBuild`) VALUES
+(115559, 0.337544381618499755, 0.625, 0, 52808);
+
+UPDATE `creature_model_info` SET `VerifiedBuild`=52808 WHERE `DisplayID` IN (80177, 88828, 84174, 75877, 75910, 76907, 88825, 83982, 87638, 84173, 82950, 91067, 83985, 86950, 86028, 87602, 77041, 77055, 84812, 86638, 60256, 76549, 1141, 32790, 32789, 83521, 82995, 86168, 65, 78193, 55345, 81302, 89604, 229, 87422, 5565, 88051, 26353, 53108, 77523, 87833, 87824, 87825, 87820, 87814, 87818, 32646, 87823, 87831, 41325, 87826, 32681, 88065, 77687, 85758, 87495, 83093, 88050, 81313, 87817, 85228, 86764, 83533, 58202, 78869, 83531, 55344, 87822, 62093, 85767, 72253, 53107, 87819, 83532, 90161, 87821, 86472, 85771, 86471, 41667, 38801, 79014, 87690, 21936, 84554, 87797, 87793, 76552, 88493, 85797, 80857, 84069, 87792, 79015, 25073, 87183, 87791, 342, 36499, 88317, 87549, 84555, 84557, 88262, 86027, 87788, 88318, 86025, 85964, 46710, 82148, 77532, 88609, 79969, 93865, 82026, 70070, 78631, 88608, 87601, 27681, 77936, 81194, 87794, 86443, 87648, 86763, 87581, 87790, 90661, 87376, 81363, 87564, 82543, 87647, 81166, 87781, 82814, 82538, 80754, 87634, 87628, 87050, 83812, 88605, 85967, 87780, 76222, 87769, 39631, 77466, 88502, 33519, 84110, 76422, 88271, 80893, 87786, 80753, 87599, 82540, 88606, 80751, 80752, 77691, 38804, 13069, 77940, 24052, 78472, 88264, 80767, 87583, 88610, 87815, 87375, 90788, 88612, 85962, 82693, 32778, 82545, 79970, 52723, 85963, 87713, 84544, 81372, 88611, 88528, 74793, 77054, 86640, 88615, 87584, 87796, 82025, 82539, 84262, 88607, 84263, 82024, 76046, 77039, 87630, 77496, 88614, 87795, 81168, 84415, 87649, 84284, 87600, 88690, 78483, 81321, 81807, 88613, 42720, 11686, 28047, 42722, 84551, 61205, 77851, 88265, 87611, 33719, 76515, 83664, 88604, 87612, 27823);
+UPDATE `creature_model_info` SET `BoundingRadius`=0.305999994277954101, `CombatReach`=1.5, `VerifiedBuild`=52808 WHERE `DisplayID`=86639;
+UPDATE `creature_model_info` SET `BoundingRadius`=4.419252872467041015, `CombatReach`=3.20000004768371582, `VerifiedBuild`=52808 WHERE `DisplayID`=15275;
+UPDATE `creature_model_info` SET `BoundingRadius`=0.60000002384185791, `CombatReach`=2, `VerifiedBuild`=52808 WHERE `DisplayID`=42178;
+UPDATE `creature_model_info` SET `BoundingRadius`=0.280177772045135498, `CombatReach`=1, `VerifiedBuild`=52808 WHERE `DisplayID`=87565;
+UPDATE `creature_model_info` SET `BoundingRadius`=0.5, `VerifiedBuild`=52808 WHERE `DisplayID`=79382;
+UPDATE `creature_model_info` SET `BoundingRadius`=0.208000004291534423, `CombatReach`=1.5, `VerifiedBuild`=52808 WHERE `DisplayID`=81291;
+
+-- Greyguard smart ai
+SET @ENTRY := 120599;
+UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE `entry` = @ENTRY;
+DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryOrGuid` = @ENTRY;
+INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
+(@ENTRY, 0, 0, 0, '', 58, 0, 100, 0, (0xFFFFFFFF), 12059900, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'On any waypoint of path 12059900 ended - Self: Despawn instantly'),
+(@ENTRY, 0, 1, 0, '', 58, 0, 100, 0, (0xFFFFFFFF), 12059901, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'On any waypoint of path 12059901 ended - Self: Despawn instantly');
+
+-- Path Taelia
+SET @ENTRY := 124630;
+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, 1, 0, 'Taelia - The Old Knight Quest');
+
+DELETE FROM `waypoint_path_node` WHERE `PathId`= @PATH;
+INSERT INTO `waypoint_path_node` (`PathId`, `NodeId`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `Delay`) VALUES
+(@PATH, 0, 1079.5695, -476.7725, 20.7355, NULL, 2000),
+(@PATH, 1, 1069.0481, -473.7091, 16.4489, NULL, 0),
+(@PATH, 2, 1047.5667, -470.1653, 8.95465, NULL, 0);
+
+SET @ENTRY := 124630;
+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, 'Taelia - After Client Scene: Cyrus and Genn');
+
+DELETE FROM `waypoint_path_node` WHERE `PathId`= @PATH;
+INSERT INTO `waypoint_path_node` (`PathId`, `NodeId`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `Delay`) VALUES
+(@PATH, 0, 1058.854, -471.6476, 11.65849, NULL, 0),
+(@PATH, 1, 1059.061, -478.934, 10.2413, NULL, 0),
+(@PATH, 2, 1069.51, -487.0607, 9.691328, NULL, 0),
+(@PATH, 3, 1070.431, -489.1788, 9.717813, 1.50144, 0);
+
+-- Path Cyrus
+SET @ENTRY := 122370;
+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, 'Cyrus - After Client Scene: Cyrus and Genn');
+
+DELETE FROM `waypoint_path_node` WHERE `PathId`= @PATH;
+INSERT INTO `waypoint_path_node` (`PathId`, `NodeId`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `Delay`) VALUES
+(@PATH, 0, 1059.382, -479.4549, 10.17741, NULL, 0),
+(@PATH, 1, 1065.797, -484.2326, 9.897485, NULL, 0),
+(@PATH, 2, 1071.325, -486.184, 9.744476, 3.49956, 0);
+
+-- Path Genn Greymane
+SET @ENTRY := 120788;
+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, 'Genn - After Client Scene: Cyrus and Genn');
+
+DELETE FROM `waypoint_path_node` WHERE `PathId`= @PATH;
+INSERT INTO `waypoint_path_node` (`PathId`, `NodeId`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `Delay`) VALUES
+(@PATH, 0, 1058.998, -472.7778, 11.65849, NULL, 0),
+(@PATH, 1, 1058.879, -478.0556, 10.12054, NULL, 0),
+(@PATH, 2, 1059.028, -481.0955, 9.979296, NULL, 0),
+(@PATH, 3, 1059.656, -484.1667, 9.949183, NULL, 0),
+(@PATH, 4, 1065.174, -486.9184, 9.874442, NULL, 0),
+(@PATH, 5, 1068.137, -487.2014, 9.691328, 0.24838, 0);
+
+-- Path Greyguard
+SET @ENTRY := 120599;
+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, 'Greyguard - After Client Scene: Cyrus and Genn');
+
+DELETE FROM `waypoint_path_node` WHERE `PathId`= @PATH;
+INSERT INTO `waypoint_path_node` (`PathId`, `NodeId`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `Delay`) VALUES
+(@PATH, 0, 1050.243, -469.1406, 10.48856, NULL, 0),
+(@PATH, 1, 1052.11, -469.5472, 11.86161, NULL, 0),
+(@PATH, 2, 1055.064, -470.1649, 11.74733, NULL, 0),
+(@PATH, 3, 1058.658, -472.8438, 11.65849, NULL, 0),
+(@PATH, 4, 1058.786, -475.0191, 11.65849, NULL, 0),
+(@PATH, 5, 1058.193, -478.4648, 10.32366, NULL, 0),
+(@PATH, 6, 1058.155, -482.3889, 9.946414, NULL, 0),
+(@PATH, 7, 1058.78, -488.8403, 10.06123, NULL, 0);
+
+SET @ENTRY := 120599;
+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, 'Greyguard - After Client Scene: Cyrus and Genn');
+
+DELETE FROM `waypoint_path_node` WHERE `PathId`= @PATH;
+INSERT INTO `waypoint_path_node` (`PathId`, `NodeId`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `Delay`) VALUES
+(@PATH, 0, 1052.17, -470.2413, 11.86161, NULL, 0),
+(@PATH, 1, 1055.045, -470.7951, 11.74097, NULL, 0),
+(@PATH, 2, 1058.658, -472.8438, 11.65849, NULL, 0),
+(@PATH, 3, 1059.632, -474.9479, 11.65849, NULL, 0),
+(@PATH, 4, 1059.16, -478.5278, 10.21113, NULL, 0),
+(@PATH, 5, 1060.052, -483.7674, 9.961575, NULL, 0),
+(@PATH, 6, 1064.194, -489.7517, 9.86161, NULL, 0);
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);
}