aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMalcrom <malcromdev@gmail.com>2023-12-23 14:17:58 -0400
committerGitHub <noreply@github.com>2023-12-23 19:17:58 +0100
commita83673c4192c9dd2a67ab45f0d65cf451fcfcb6f (patch)
tree86cbda1eb9c516e7713efa9ea28799255007cb47
parenta24e3a9511d8b60baf51a4e81aa3e4731746ffe4 (diff)
Scripts/ExilesReach: Implemented Enhanced Combat Tactics and Northbound (#29487)
-rw-r--r--sql/updates/world/master/2023_12_23_00_world.sql671
-rw-r--r--src/server/scripts/ExilesReach/zone_exiles_reach.cpp1650
2 files changed, 2311 insertions, 10 deletions
diff --git a/sql/updates/world/master/2023_12_23_00_world.sql b/sql/updates/world/master/2023_12_23_00_world.sql
new file mode 100644
index 00000000000..3ee742a1a19
--- /dev/null
+++ b/sql/updates/world/master/2023_12_23_00_world.sql
@@ -0,0 +1,671 @@
+-- Filled in by Trinity team for new areatrigger
+SET @ID := 54;
+SET @SPAWNID := 54;
+
+-- Enhanced Combat Tactics and Northbound quest
+DELETE FROM `creature_queststarter` WHERE `id`=156651 AND `quest` IN (59254,59339);
+DELETE FROM `creature_queststarter` WHERE `id`=175031 AND `quest` = 55173;
+DELETE FROM `creature_queststarter` WHERE `id`=166906 AND `quest` IN (59933,59934);
+DELETE FROM `creature_queststarter` WHERE `id`=175030 AND `quest` = 59935;
+INSERT INTO `creature_queststarter` (`id`, `quest`, `VerifiedBuild`) VALUES
+(156651, 59254, 45745), -- Enhanced Combat Tactics Alliance accept from Captain Garrick
+(156651, 59339, 45745), -- Enhanced Combat Tactics Alliance Monk accept from Captain Garrick
+(175031, 55173, 45745), -- Northbound Alliance accept from Alaria
+(166906, 59933, 45745), -- Enhanced Combat Tactics Horde accept from Warlord Breka Grimaxe
+(166906, 59934, 45745), -- Enhanced Combat Tactics Horde Monk accept from Warlord Breka Grimaxe
+(175030, 59935, 45745); -- Northbound Horde accept from Won'sa
+
+DELETE FROM `creature_questender` WHERE `id`=156651 AND `quest` IN (59254,59339);
+DELETE FROM `creature_questender` WHERE `id`=154327 AND `quest`=55173;
+DELETE FROM `creature_questender` WHERE `id`=166906 AND `quest` IN (59933,59934);
+DELETE FROM `creature_questender` WHERE `id`=166996 AND `quest`=59935;
+INSERT INTO `creature_questender` (`id`, `quest`, `VerifiedBuild`) VALUES
+(156651, 59254, 45745), -- Enhanced Combat Tactics Alliance turn in to Captain Garrick
+(156651, 59339, 45745), -- Enhanced Combat Tactics Alliance Monk turn in to Captain Garrick
+(154327, 55173, 45745), -- Northbound Alliance turn in to Austin Huxworth
+(166906, 59933, 45745), -- Enhanced Combat Tactics Horde turn in to Warlord Breka Grimaxe
+(166906, 59934, 45745), -- Enhanced Combat Tactics Horde Monk turn in to Warlord Breka Grimaxe
+(166996, 59935, 45745); -- Northbound Horde turn in to Mithdran Dawntracker
+
+DELETE FROM `quest_template_addon` WHERE `ID` IN (59254,59339,59933,59934);
+INSERT INTO `quest_template_addon` (`ID`,`AllowableClasses`,`PrevQuestID`,`NextQuestID`,`ScriptName`) VALUES
+(59254,1499,55174,0,'quest_enhanced_combat_tactics'), -- Alliance
+(59339,512,55174,0,'quest_enhanced_combat_tactics'), -- Alliance Monk
+(59933,1499,59932,0,'quest_enhanced_combat_tactics'), -- Horde
+(59934,512,59932,0,'quest_enhanced_combat_tactics'); -- Horde Monk
+
+-- Condition for source Quest available condition type Quest rewarded
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=19 AND `SourceGroup`=0 AND `SourceEntry` IN (55173,59935) AND `SourceId`=0;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(19, 0, 55173, 0, 0, 8, 0, 59254, 0, 0, 0, 0, 0, '', 'Quest Northbound available if quest Enhanced Combat Tactics has been rewarded Alliance.'),
+(19, 0, 55173, 0, 1, 8, 0, 59339, 0, 0, 0, 0, 0, '', 'Quest Northbound available if quest Enhanced Combat Tactics has been rewarded Alliance.'),
+(19, 0, 55173, 0, 2, 15, 0, 4, 0, 0, 0, 0, 0, '', 'Quest Northbound available if player is a Hunter Alliance.'),
+(19, 0, 59935, 0, 0, 8, 0, 59933, 0, 0, 0, 0, 0, '', 'Quest Northbound available if quest Enhanced Combat Tactics has been rewarded Horde.'),
+(19, 0, 59935, 0, 1, 8, 0, 59934, 0, 0, 0, 0, 0, '', 'Quest Northbound available if quest Enhanced Combat Tactics has been rewarded Horde.'),
+(19, 0, 59935, 0, 2, 15, 0, 4, 0, 0, 0, 0, 0, '', 'Quest Northbound available if player is a Hunter Horde.');
+
+-- Alaria is missing questgiver flag
+UPDATE `creature_template` SET `npcflag`=2 WHERE entry=175031;
+
+-- Enhanced Combat Tactics Quest
+
+UPDATE `creature_template` SET `ScriptName`="npc_sparring_partner_combat_training" WHERE `entry` IN (164577,166916);
+
+DELETE FROM `spell_script_names` WHERE `spell_id` IN (320175,325181);
+INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
+(320175,'spell_summon_combat_trainer'),
+(325181,'spell_summon_combat_trainer');
+
+DELETE FROM `spell_script_names` WHERE `spell_id` IN (320605,320767, 320583);
+INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
+(320605,'spell_knockback_charge_enhanced_training'),
+(320767,'spell_knockback_charge_enhanced_training'),
+(320583,'spell_knockback_charge_enhanced_training');
+
+DELETE FROM `areatrigger_template` WHERE `Id` IN (19470,19479,19461,19457,19482);
+INSERT INTO `areatrigger_template` (`Id`,`IsServerSide`,`Type`,`Flags`,`Data0`,`Data1`,`Data2`,`Data3`,`Data4`,`Data5`,`Data6`,`Data7`,`VerifiedBuild`) VALUES
+(19470,0,4,0,10,10,4,4,0,0,0,0,0),
+(19479,0,4,0,10,10,4,4,0,0,0,0,0),
+(19461,0,4,0,10,10,4,4,0,0,0,0,0),
+(19457,0,4,0,10,10,4,4,0,0,0,0,0),
+(19482,0,4,0,10,10,4,4,0,0,0,0,0);
+
+DELETE FROM `areatrigger_create_properties` WHERE `Id` IN (19470,19479,19461,19457,19482);
+INSERT INTO `areatrigger_create_properties` (`Id`,`AreaTriggerId`,`MoveCurveId`,`ScaleCurveId`,`MorphCurveId`,`FacingCurveId`,`AnimId`,`AnimKitId`,`DecalPropertiesId`,`TimeToTarget`,`TimeToTargetScale`,`Shape`,`ShapeData0`,`ShapeData1`,`ShapeData2`,`ShapeData3`,`ShapeData4`,`ShapeData5`,`ShapeData6`,`ShapeData7`,`ScriptName`,`VerifiedBuild`) VALUES
+(19470,19479,0,0,0,0,-1,0,0,0,0,4,10,10,4,4,0,0,0,0,'at_aggro_radius_check_enhanced_combat_tactics',0),
+(19479,19479,0,0,0,0,-1,0,0,0,0,4,10,10,4,4,0,0,0,0,'at_aggro_radius_check_enhanced_combat_tactics',0),
+(19461,19461,0,0,0,0,-1,0,0,0,0,4,10,10,4,4,0,0,0,0,'at_aggro_radius_check_enhanced_combat_tactics',0),
+(19457,19457,0,0,0,0,-1,0,0,0,0,4,10,10,4,4,0,0,0,0,'at_aggro_radius_check_enhanced_combat_tactics',0),
+(19482,19482,0,0,0,0,-1,0,0,0,0,4,10,10,4,4,0,0,0,0,'at_aggro_radius_check_enhanced_combat_tactics',0);
+
+DELETE FROM `creature_summoned_data` WHERE `CreatureID` IN (164577,166916);
+INSERT INTO `creature_summoned_data` (`CreatureID`,`CreatureIDVisibleToSummoner`,`GroundMountDisplayID`,`FlyingMountDisplayID`) VALUES
+(164577,164605,NULL,NULL),
+(166916,166918,NULL,NULL);
+
+UPDATE `creature_template` SET `RequiredExpansion` = 9, `unit_flags`=33554496 WHERE `entry` IN (164577,166916);
+UPDATE `creature_template_difficulty` SET `LevelScalingDeltaMin`=1, `LevelScalingDeltaMax`=5, `HealthScalingExpansion`=9 WHERE `Entry` IN (164577,166916);
+
+-- Phase conditions
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=26 AND `SourceGroup` IN (13758,15298) AND `SourceEntry`=10452;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(26,13758,10452,0,0,47,0,59254,8,0,1,0,0,'','Allow Phase 13758 if Quest 59254 (Enhanced Combat Tactics) is not inprogress'),
+(26,13758,10452,0,0,47,0,59339,8,0,1,0,0,'','Allow Phase 13758 if Quest 59339 (Enhanced Combat Tactics) is not inprogress'),
+(26,15298,10452,0,0,47,0,59933,8,0,1,0,0,'','Allow Phase 15298 if Quest 59933 (Enhanced Combat Tactics) is not inprogress'),
+(26,15298,10452,0,0,47,0,59934,8,0,1,0,0,'','Allow Phase 15298 if Quest 59934 (Enhanced Combat Tactics) is not inprogress');
+
+-- Enhanced combat partner run back
+SET @PATH := 10512100;
+DELETE FROM `waypoint_data` WHERE `id` IN (@PATH);
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`wpguid`) VALUES
+(@PATH,1,-228.04771,-2480.6504,19.245068,NULL,0,1,0),
+(@PATH,2,-240.67244,-2477.7002,18.045225,NULL,0,1,0),
+(@PATH,3,-252.58533,-2487.7651,17.4671,NULL,0,1,0),
+(@PATH,4,-249.05904,-2492.5227,17.971006,NULL,0,1,0);
+
+-- Conversation for Sparring Partner
+DELETE FROM `conversation_actors` WHERE `ConversationId` IN (13611,13630,13631,13632,13633,13634,13635,13710,13892,13893,13895,14440,14441,14444,14447,14448,14449,14452,14453,14454,14455,14456,14457,14458,14459);
+DELETE FROM `conversation_actors` WHERE `ConversationId` IN (14460,14461,14462,14463,14465,14466,14467,14468,14471,14472,14473,14474,14475,14476,14477,14486,14487,14488,14489,14490,14491,14492,14493,14494,14495);
+INSERT INTO `conversation_actors` (`ConversationId`,`ConversationActorId`,`ConversationActorGuid`,`Idx`,`CreatureId`,`CreatureDisplayInfoId`,`NoActorObject`,`ActivePlayerObject`,`VerifiedBuild`) VALUES
+(13611,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(13611,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(13630,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(13630,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(13631,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(13631,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(13632,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(13632,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(13633,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(13633,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(13634,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(13634,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(13635,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(13635,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(13710,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(13710,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(13892,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(13892,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(13893,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(13893,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(13895,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(13895,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14440,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14440,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14441,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14441,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14444,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14444,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14447,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14447,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14448,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14448,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14449,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14449,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14452,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14452,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14453,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14453,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14454,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14454,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14455,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14455,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14456,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14456,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14457,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14457,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14458,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14458,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14459,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14459,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14460,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14460,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14461,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14461,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14462,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14462,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14463,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14463,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14465,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14465,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14466,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14466,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14467,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14467,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14468,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14468,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14471,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14471,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14472,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14472,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14473,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14473,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14474,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14474,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14475,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14475,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14476,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14476,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14477,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14477,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14486,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14486,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14487,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14487,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14488,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14488,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14489,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14489,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14490,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14490,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14491,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14491,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14492,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14492,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14493,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14493,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14494,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14494,76285,0,1,0,0,0,0,45745), -- Horde Sparring Partner
+(14495,74771,0,0,0,0,0,0,45745), -- Alliance Sparring Partner
+(14495,76285,0,1,0,0,0,0,45745); -- Horde Sparring Partner
+
+DELETE FROM `conversation_line_template` WHERE `Id` IN (34011,34012,34013,34014,34015,34016,34017,34018,34019,34020,34021,34022,34024,34025,36204,34173,36160,34690,34691,34692,34693,34697,34698,36206,36207,36163,36164,36170,36171,36175,36176,36177,36178,36179,36180,33931,33932,33933,36181,36182,36183,36161,36162);
+DELETE FROM `conversation_line_template` WHERE `Id` IN (36188,36189,36190,36191,36192,36193,36194,36195,36196,36197,36198,36199,36200,36201,36202,36203,36208,36209,36210,36211,36212,36213,36214,36215,36218,36219,36222,36223,36224,36225,36226,36227,36228,36229,36231,36232,36233,36234,36235,36236,36237,36238,36242,36243,36244,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36255,36256,36257,36258);
+DELETE FROM `conversation_line_template` WHERE `Id` IN (36259,36260,36261,36262,36275,36276,36277,36278,36279,36280,36281,36282,36283,36284,36285,36286,36287,36288,36289,36290,36291,36292,36293,36294);
+INSERT INTO `conversation_line_template` (`Id`,`UiCameraID`,`ActorIdx`,`Flags`,`VerifiedBuild`) VALUES
+(33931,0,0,0,45745), -- Alliance
+(33932,0,0,0,45745), -- Alliance
+(33933,0,0,0,45745), -- Alliance
+(34011,0,0,0,45745), -- Alliance
+(34012,0,0,0,45745), -- Alliance
+(34013,0,0,0,45745), -- Alliance
+(34014,0,0,0,45745), -- Alliance
+(34015,0,0,0,45745), -- Alliance
+(34016,0,0,0,45745), -- Alliance
+(34017,0,0,0,45745), -- Alliance
+(34018,0,0,0,45745), -- Alliance
+(34019,0,0,0,45745), -- Alliance
+(34020,0,0,0,45745), -- Alliance
+(34021,0,0,0,45745), -- Alliance
+(34022,0,0,0,45745), -- Alliance
+(34024,0,0,0,45745), -- Alliance
+(34025,0,0,0,45745), -- Alliance
+(34173,0,0,0,45745), -- Alliance
+(34690,0,0,0,45745), -- Alliance
+(34691,0,0,0,45745), -- Alliance
+(34692,0,0,0,45745), -- Alliance
+(34693,0,0,0,45745), -- Alliance
+(34697,0,0,0,45745), -- Alliance
+(34698,0,0,0,45745), -- Alliance
+(36160,0,1,0,45745), -- Horde
+(36161,0,0,0,45745), -- Alliance
+(36162,0,1,0,45745), -- Horde
+(36163,0,0,0,45745), -- Alliance
+(36164,0,1,0,45745), -- Horde
+(36170,0,0,0,45745), -- Alliance
+(36171,0,1,0,45745), -- Horde
+(36175,0,0,0,45745), -- Alliance
+(36176,0,1,0,45745), -- Horde
+(36177,0,0,0,45745), -- Alliance
+(36178,0,1,0,45745), -- Horde
+(36179,0,0,0,45745), -- Alliance
+(36180,0,1,0,45745), -- Horde
+(36181,0,1,0,45745), -- Horde
+(36182,0,1,0,45745), -- Horde
+(36183,0,1,0,45745), -- Horde
+(36188,0,0,0,45745), -- Alliance
+(36189,0,1,0,45745), -- Horde
+(36190,0,0,0,45745), -- Alliance
+(36191,0,1,0,45745), -- Horde
+(36192,0,0,0,45745), -- Alliance
+(36193,0,1,0,45745), -- Horde
+(36194,0,0,0,45745), -- Alliance
+(36195,0,1,0,45745), -- Horde
+(36196,0,0,0,45745), -- Alliance
+(36197,0,1,0,45745), -- Horde
+(36198,0,0,0,45745), -- Alliance
+(36199,0,1,0,45745), -- Horde
+(36200,0,0,0,45745), -- Alliance
+(36201,0,1,0,45745), -- Horde
+(36202,0,0,0,45745), -- Alliance
+(36203,0,1,0,45745), -- Horde
+(36204,0,1,0,45745), -- Horde
+(36206,0,1,0,45745), -- Horde
+(36207,0,1,0,45745), -- Horde
+(36208,0,0,0,45745), -- Alliance
+(36209,0,1,0,45745), -- Horde
+(36210,0,0,0,45745), -- Alliance
+(36211,0,1,0,45745), -- Horde
+(36212,0,0,0,45745), -- Alliance
+(36213,0,1,0,45745), -- Horde
+(36214,0,0,0,45745), -- Alliance
+(36215,0,1,0,45745), -- Horde
+(36218,0,1,0,45745), -- Horde
+(36219,0,1,0,45745), -- Horde
+(36222,0,0,0,45745), -- Alliance
+(36223,0,1,0,45745), -- Horde
+(36224,0,0,0,45745), -- Alliance
+(36225,0,1,0,45745), -- Horde
+(36226,0,0,0,45745), -- Alliance
+(36227,0,1,0,45745), -- Horde
+(36228,0,0,0,45745), -- Alliance
+(36229,0,1,0,45745), -- Horde
+(36231,0,1,0,45745), -- Horde
+(36232,0,1,0,45745), -- Horde
+(36233,0,0,0,45745), -- Alliance
+(36234,0,1,0,45745), -- Horde
+(36235,0,0,0,45745), -- Alliance
+(36236,0,1,0,45745), -- Horde
+(36237,0,0,0,45745), -- Alliance
+(36238,0,1,0,45745), -- Horde
+(36242,0,0,0,45745), -- Alliance
+(36243,0,1,0,45745), -- Horde
+(36244,0,1,0,45745), -- Horde
+(36245,0,1,0,45745), -- Horde
+(36246,0,1,0,45745), -- Horde
+(36247,0,1,0,45745), -- Horde
+(36248,0,1,0,45745), -- Horde
+(36249,0,1,0,45745), -- Horde
+(36250,0,1,0,45745), -- Horde
+(36251,0,1,0,45745), -- Horde
+(36252,0,0,0,45745), -- Alliance
+(36253,0,1,0,45745), -- Horde
+(36254,0,1,0,45745), -- Horde
+(36255,0,1,0,45745), -- Horde
+(36256,0,1,0,45745), -- Horde
+(36257,0,1,0,45745), -- Horde
+(36258,0,1,0,45745), -- Horde
+(36259,0,0,0,45745), -- Alliance
+(36260,0,1,0,45745), -- Horde
+(36261,0,0,0,45745), -- Alliance
+(36262,0,1,0,45745), -- Horde
+(36275,0,0,0,45745), -- Alliance
+(36276,0,1,0,45745), -- Horde
+(36277,0,0,0,45745), -- Alliance
+(36278,0,1,0,45745), -- Horde
+(36279,0,0,0,45745), -- Alliance
+(36280,0,1,0,45745), -- Horde
+(36281,0,0,0,45745), -- Alliance
+(36282,0,1,0,45745), -- Horde
+(36283,0,0,0,45745), -- Alliance
+(36284,0,1,0,45745), -- Horde
+(36285,0,0,0,45745), -- Alliance
+(36286,0,1,0,45745), -- Horde
+(36287,0,0,0,45745), -- Alliance
+(36288,0,1,0,45745), -- Horde
+(36289,0,0,0,45745), -- Alliance
+(36290,0,1,0,45745), -- Horde
+(36291,0,0,0,45745), -- Alliance
+(36292,0,1,0,45745), -- Horde
+(36293,0,0,0,45745), -- Alliance
+(36294,0,1,0,45745); -- Horde
+
+DELETE FROM `conversation_template` WHERE `Id` IN (13630,13631,13632,13633,13634,13635,13710,13892,13893,13895,14441,14444,14447,14448,14449,13611,14440);
+DELETE FROM `conversation_template` WHERE `Id` IN (14452,14453,14454,14455,14456,14457,14458,14459,14460,14461,14462,14463,14465,14466,14467,14468,14471,14472,14473,14474,14475,14476,14477);
+DELETE FROM `conversation_template` WHERE `Id` IN (14486,14487,14488,14489,14490,14491,14492,14493,14494,14495);
+INSERT INTO `conversation_template` (`Id`,`FirstLineId`,`TextureKitId`,`ScriptName`,`VerifiedBuild`) VALUES
+(13630,34011,0,'',45745),
+(13631,34012,0,'',45745),
+(13632,34015,0,'',45745),
+(13633,34018,0,'',45745),
+(13634,34020,0,'',45745),
+(13635,34024,0,'',45745),
+(13710,34173,0,'',45745),
+(13892,34690,0,'',45745),
+(13893,34692,0,'',45745),
+(13895,34697,0,'',45745),
+(14441,36163,0,'',45745),
+(14444,36170,0,'',45745),
+(14447,36175,0,'',45745),
+(14448,36177,0,'',45745),
+(14449,36179,0,'',45745),
+(13611,33931,0,'',45745),
+(14440,36161,0,'',45745),
+(14452,36188,0,'',45745),
+(14453,36190,0,'',45745),
+(14454,36192,0,'',45745),
+(14455,36194,0,'',45745),
+(14456,36196,0,'',45745),
+(14457,36198,0,'',45745),
+(14458,36200,0,'',45745),
+(14459,36202,0,'',45745),
+(14460,36208,0,'',45745),
+(14461,36210,0,'',45745),
+(14462,36212,0,'',45745),
+(14463,36214,0,'',45745),
+(14465,36222,0,'',45745),
+(14466,36224,0,'',45745),
+(14467,36226,0,'',45745),
+(14468,36228,0,'',45745),
+(14471,36233,0,'',45745),
+(14472,36235,0,'',45745),
+(14473,36237,0,'',45745),
+(14474,36242,0,'',45745),
+(14475,36252,0,'',45745),
+(14476,36259,0,'',45745),
+(14477,36261,0,'',45745),
+(14486,36275,0,'',45745),
+(14487,36277,0,'',45745),
+(14488,36279,0,'',45745),
+(14489,36281,0,'',45745),
+(14490,36283,0,'',45745),
+(14491,36285,0,'',45745),
+(14492,36287,0,'',45745),
+(14493,36289,0,'',45745),
+(14494,36291,0,'',45745),
+(14495,36293,0,'',45745);
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=29 AND `SourceEntry` IN (34011,36204,34173,36160,36163,36164,36170,36171,36175,36176,36177,36178,36179,36180,33931,33932,33933,36181,36182,36183,36161,36162);
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=29 AND `SourceEntry` IN (36188,36189,36190,36191,36192,36193,36194,36195,36196,36197,36198,36199,36200,36201,36202,36203,36208,36209,36210,36211,36212,36213,36214,36215);
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=29 AND `SourceEntry` IN (36275,36276,36277,36278,36279,36280,36281,36282,36283,36284,36285,36286,36287,36288,36289,36290,36291,36292,36293,36294,34690,34691,36206,36207,34012,34013,34014,36249,36250,36251,34015,34016,34017,36246,36247,36248,34018,34019,36244,36245,36252,36253);
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=29 AND `SourceEntry` IN (34020,34021,34022,36256,36257,36258,34024,34025,36254,36255,36259,36260,36261,36262,34697,34698,36218,36219,36224,36225,36226,36227,36228,36229,34692,34693,36231,36232,36235,36236,36237,36238,36242,36243,36222,36223,36233,36234);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(29,0,34011,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 34011 if team is Alliance'),
+(29,0,36204,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36204 if team is Horde'),
+(29,0,34173,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 34173 if team is Alliance'),
+(29,0,36160,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36160 if team is Horde'),
+(29,0,36163,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36163 if team is Alliance'),
+(29,0,36164,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36164 if team is Horde'),
+(29,0,36170,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36170 if team is Alliance'),
+(29,0,36171,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36171 if team is Horde'),
+(29,0,36175,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36175 if team is Alliance'),
+(29,0,36176,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36176 if team is Horde'),
+(29,0,36177,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36177 if team is Alliance'),
+(29,0,36178,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36178 if team is Horde'),
+(29,0,36179,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36179 if team is Alliance'),
+(29,0,36180,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36180 if team is Horde'),
+(29,0,33931,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 33931 if team is Alliance'),
+(29,0,33932,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 33932 if team is Alliance'),
+(29,0,33933,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 33933 if team is Alliance'),
+(29,0,33931,0,0,48,0,396220,1,0,0,0,0,'','Allow conversation line 33931 if objective count 0'),
+(29,0,33932,0,0,48,0,396220,1,1,0,0,0,'','Allow conversation line 33931 if objective count 1'),
+(29,0,33933,0,0,48,0,396220,1,2,0,0,0,'','Allow conversation line 33931 if objective count 2'),
+(29,0,36181,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36181 if team is Horde'),
+(29,0,36182,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36182 if team is Horde'),
+(29,0,36183,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36183 if team is Horde'),
+(29,0,36181,0,0,48,0,397255,1,0,0,0,0,'','Allow conversation line 36181 if objective count 0'),
+(29,0,36182,0,0,48,0,397255,1,1,0,0,0,'','Allow conversation line 36182 if objective count 1'),
+(29,0,36183,0,0,48,0,397255,1,2,0,0,0,'','Allow conversation line 36183 if objective count 2'),
+(29,0,36161,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36161 if team is Alliance'),
+(29,0,36162,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36162 if team is Horde'),
+(29,0,36188,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36188 if team is Alliance'),
+(29,0,36189,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36189 if team is Horde'),
+(29,0,36190,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36190 if team is Alliance'),
+(29,0,36191,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36191 if team is Horde'),
+(29,0,36192,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36192 if team is Alliance'),
+(29,0,36193,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36193 if team is Horde'),
+(29,0,36194,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36194 if team is Alliance'),
+(29,0,36195,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36195 if team is Horde'),
+(29,0,36196,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36196 if team is Alliance'),
+(29,0,36197,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36197 if team is Horde'),
+(29,0,36198,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36198 if team is Alliance'),
+(29,0,36199,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36199 if team is Horde'),
+(29,0,36200,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36200 if team is Alliance'),
+(29,0,36201,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36201 if team is Horde'),
+(29,0,36202,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36202 if team is Alliance'),
+(29,0,36203,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36203 if team is Horde'),
+(29,0,36208,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36208 if team is Alliance'),
+(29,0,36209,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36209 if team is Horde'),
+(29,0,36210,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36210 if team is Alliance'),
+(29,0,36211,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36211 if team is Horde'),
+(29,0,36212,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36212 if team is Alliance'),
+(29,0,36213,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36213 if team is Horde'),
+(29,0,36214,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36214 if team is Alliance'),
+(29,0,36215,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36215 if team is Horde'),
+(29,0,36275,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36275 if team is Alliance'),
+(29,0,36276,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36276 if team is Horde'),
+(29,0,36277,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36277 if team is Alliance'),
+(29,0,36278,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36278 if team is Horde'),
+(29,0,36279,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36279 if team is Alliance'),
+(29,0,36280,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36280 if team is Horde'),
+(29,0,36281,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36281 if team is Alliance'),
+(29,0,36282,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36282 if team is Horde'),
+(29,0,36283,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36283 if team is Alliance'),
+(29,0,36284,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36284 if team is Horde'),
+(29,0,36285,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36285 if team is Alliance'),
+(29,0,36286,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36286 if team is Horde'),
+(29,0,36287,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36287 if team is Alliance'),
+(29,0,36288,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36288 if team is Horde'),
+(29,0,36289,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36289 if team is Alliance'),
+(29,0,36290,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36290 if team is Horde'),
+(29,0,36291,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36291 if team is Alliance'),
+(29,0,36292,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36292 if team is Horde'),
+(29,0,36293,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36293 if team is Alliance'),
+(29,0,36294,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36294 if team is Horde'),
+(29,0,34690,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 34690 if team is Alliance'),
+(29,0,34691,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 34691 if team is Alliance'),
+(29,0,34690,0,0,48,0,396220,1,1,0,0,0,'','Allow conversation line 34690 if objective count 1'),
+(29,0,34691,0,0,48,0,396220,1,2,0,0,0,'','Allow conversation line 34691 if objective count 2'),
+(29,0,36206,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36206 if team is Horde'),
+(29,0,36207,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36207 if team is Horde'),
+(29,0,36206,0,0,48,0,397255,1,1,0,0,0,'','Allow conversation line 36206 if objective count 1'),
+(29,0,36207,0,0,48,0,397255,1,2,0,0,0,'','Allow conversation line 36207 if objective count 2'),
+(29,0,34012,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 34012 if team is Alliance'),
+(29,0,34013,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 34013 if team is Alliance'),
+(29,0,34014,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 34014 if team is Alliance'),
+(29,0,34012,0,0,48,0,396220,1,0,0,0,0,'','Allow conversation line 34012 if objective count 0'),
+(29,0,34013,0,0,48,0,396220,1,1,0,0,0,'','Allow conversation line 34013 if objective count 1'),
+(29,0,34014,0,0,48,0,396220,1,2,0,0,0,'','Allow conversation line 34014 if objective count 2'),
+(29,0,36249,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36249 if team is Horde'),
+(29,0,36250,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36250 if team is Horde'),
+(29,0,36251,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36251 if team is Horde'),
+(29,0,36249,0,0,48,0,397255,1,0,0,0,0,'','Allow conversation line 36249 if objective count 0'),
+(29,0,36250,0,0,48,0,397255,1,1,0,0,0,'','Allow conversation line 36250 if objective count 1'),
+(29,0,36251,0,0,48,0,397255,1,2,0,0,0,'','Allow conversation line 36251 if objective count 2'),
+(29,0,34015,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 34015 if team is Alliance'),
+(29,0,34016,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 34016 if team is Alliance'),
+(29,0,34017,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 34017 if team is Alliance'),
+(29,0,34015,0,0,48,0,396220,1,0,0,0,0,'','Allow conversation line 34015 if objective count 0'),
+(29,0,34016,0,0,48,0,396220,1,1,0,0,0,'','Allow conversation line 34016 if objective count 1'),
+(29,0,34017,0,0,48,0,396220,1,2,0,0,0,'','Allow conversation line 34017 if objective count 2'),
+(29,0,36246,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36246 if team is Horde'),
+(29,0,36247,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36247 if team is Horde'),
+(29,0,36248,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36248 if team is Horde'),
+(29,0,36246,0,0,48,0,397255,1,0,0,0,0,'','Allow conversation line 36246 if objective count 0'),
+(29,0,36247,0,0,48,0,397255,1,1,0,0,0,'','Allow conversation line 36247 if objective count 1'),
+(29,0,36248,0,0,48,0,397255,1,2,0,0,0,'','Allow conversation line 36248 if objective count 2'),
+(29,0,34018,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 34018 if team is Alliance'),
+(29,0,34019,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 34019 if team is Alliance'),
+(29,0,34018,0,0,48,0,396220,1,1,0,0,0,'','Allow conversation line 34018 if objective count 1'),
+(29,0,34019,0,0,48,0,396220,1,2,0,0,0,'','Allow conversation line 34019 if objective count 2'),
+(29,0,36244,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36244 if team is Horde'),
+(29,0,36245,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36245 if team is Horde'),
+(29,0,36244,0,0,48,0,397255,1,1,0,0,0,'','Allow conversation line 36244 if objective count 1'),
+(29,0,36245,0,0,48,0,397255,1,2,0,0,0,'','Allow conversation line 36245 if objective count 2'),
+(29,0,36252,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36252 if team is Alliance'),
+(29,0,36253,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36253 if team is Horde'),
+(29,0,34020,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 34020 if team is Alliance'),
+(29,0,34021,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 34021 if team is Alliance'),
+(29,0,34022,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 34022 if team is Alliance'),
+(29,0,34020,0,0,48,0,396220,1,0,0,0,0,'','Allow conversation line 34020 if objective count 0'),
+(29,0,34021,0,0,48,0,396220,1,1,0,0,0,'','Allow conversation line 34021 if objective count 1'),
+(29,0,34022,0,0,48,0,396220,1,2,0,0,0,'','Allow conversation line 34022 if objective count 2'),
+(29,0,36256,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36256 if team is Horde'),
+(29,0,36257,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36257 if team is Horde'),
+(29,0,36258,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36258 if team is Horde'),
+(29,0,36256,0,0,48,0,397255,1,0,0,0,0,'','Allow conversation line 36256 if objective count 0'),
+(29,0,36257,0,0,48,0,397255,1,1,0,0,0,'','Allow conversation line 36257 if objective count 1'),
+(29,0,36258,0,0,48,0,397255,1,2,0,0,0,'','Allow conversation line 36258 if objective count 2'),
+(29,0,34024,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 34024 if team is Alliance'),
+(29,0,34025,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 34025 if team is Alliance'),
+(29,0,34024,0,0,48,0,396220,1,1,0,0,0,'','Allow conversation line 34024 if objective count 1'),
+(29,0,34025,0,0,48,0,396220,1,2,0,0,0,'','Allow conversation line 34025 if objective count 2'),
+(29,0,36254,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36254 if team is Horde'),
+(29,0,36255,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36255 if team is Horde'),
+(29,0,36254,0,0,48,0,397255,1,1,0,0,0,'','Allow conversation line 36254 if objective count 1'),
+(29,0,36255,0,0,48,0,397255,1,2,0,0,0,'','Allow conversation line 36255 if objective count 2'),
+(29,0,36259,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36259 if team is Alliance'),
+(29,0,36260,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36260 if team is Horde'),
+(29,0,36261,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36261 if team is Alliance'),
+(29,0,36262,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36262 if team is Horde'),
+(29,0,34697,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 34697 if team is Alliance'),
+(29,0,34698,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 34698 if team is Alliance'),
+(29,0,34697,0,0,48,0,396220,1,1,0,0,0,'','Allow conversation line 34697 if objective count 1'),
+(29,0,34698,0,0,48,0,396220,1,2,0,0,0,'','Allow conversation line 34698 if objective count 2'),
+(29,0,36218,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36218 if team is Horde'),
+(29,0,36219,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36219 if team is Horde'),
+(29,0,36218,0,0,48,0,397255,1,1,0,0,0,'','Allow conversation line 36218 if objective count 1'),
+(29,0,36219,0,0,48,0,397255,1,2,0,0,0,'','Allow conversation line 36219 if objective count 2'),
+(29,0,36224,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36224 if team is Alliance'),
+(29,0,36225,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36225 if team is Horde'),
+(29,0,36226,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36226 if team is Alliance'),
+(29,0,36227,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36227 if team is Horde'),
+(29,0,36228,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36228 if team is Alliance'),
+(29,0,36229,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36229 if team is Horde'),
+(29,0,34692,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 34692 if team is Alliance'),
+(29,0,34693,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 34693 if team is Alliance'),
+(29,0,34692,0,0,48,0,396220,1,1,0,0,0,'','Allow conversation line 34692 if objective count 1'),
+(29,0,34693,0,0,48,0,396220,1,2,0,0,0,'','Allow conversation line 34693 if objective count 2'),
+(29,0,36231,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36231 if team is Horde'),
+(29,0,36232,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36232 if team is Horde'),
+(29,0,36231,0,0,48,0,397255,1,1,0,0,0,'','Allow conversation line 36231 if objective count 1'),
+(29,0,36232,0,0,48,0,397255,1,2,0,0,0,'','Allow conversation line 36232 if objective count 2'),
+(29,0,36235,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36235 if team is Alliance'),
+(29,0,36236,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36236 if team is Horde'),
+(29,0,36237,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36237 if team is Alliance'),
+(29,0,36238,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36238 if team is Horde'),
+(29,0,36242,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36242 if team is Alliance'),
+(29,0,36243,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36243 if team is Horde'),
+(29,0,36222,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36222 if team is Alliance'),
+(29,0,36223,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36223 if team is Horde'),
+(29,0,36233,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 36233 if team is Alliance'),
+(29,0,36234,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36234 if team is Horde');
+
+-- Northbound Quest
+
+-- Create new serverside areatrigger for approching Quillboar Briarpatch for follower spawn
+DELETE FROM `areatrigger` WHERE `SpawnId`=@SPAWNID;
+INSERT INTO `areatrigger` (`SpawnId`,`AreaTriggerId`,`IsServerSide`,`MapId`,`PosX`,`PosY`,`PosZ`,`Orientation`,`PhaseUseFlags`,`PhaseId`,`PhaseGroup`,`Shape`,`ShapeData0`,`ShapeData1`,`ShapeData2`,`ShapeData3`,`ShapeData4`,`ShapeData5`,`ShapeData6`,`ShapeData7`,`ScriptName`,`Comment`) VALUES
+(@SPAWNID,@ID,1,2175,-175,-2585,33.567165,2.361945,0,0,0,1,2,60,30,8,60,30,0,0,'at_northbound_linger','Exiles Reach - Northbound check');
+-- Add new serverside areatrigger for approching Quillboar Brarpatch to template
+DELETE FROM `areatrigger_template` WHERE `Id`=@ID;
+INSERT INTO `areatrigger_template` (`Id`,`IsServerSide`,`Type`,`Flags`,`Data0`,`Data1`,`Data2`,`Data3`,`Data4`,`Data5`,`Data6`,`Data7`,`VerifiedBuild`) VALUES
+(@ID,1,1,0,2,60,30,8,60,30,0,0,0);
+
+UPDATE `creature` SET `StringId`="huxworth_briarpatch" WHERE `guid`=1051267;
+UPDATE `creature` SET `StringId`="dawntracker_briarpatch" WHERE `guid`=1051270;
+
+DELETE FROM `creature_summoned_data` WHERE `CreatureID` IN (165360,175034);
+INSERT INTO `creature_summoned_data` (`CreatureID`,`CreatureIDVisibleToSummoner`,`GroundMountDisplayID`,`FlyingMountDisplayID`) VALUES
+(165360,164605,NULL,NULL),
+(175034,166918,NULL,NULL);
+
+DELETE FROM `creature_equip_template` WHERE `CreatureID` IN (165360,175034);
+INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`AppearanceModID1`,`ItemVisual1`,`ItemID2`,`AppearanceModID2`,`ItemVisual2`,`ItemID3`,`AppearanceModID3`,`ItemVisual3`,`VerifiedBuild`) VALUES
+(165360,1,163887,0,0,163891,0,0,0,0,0,50000),
+(175034,1,165616,0,0,0,0,0,0,0,0,50000);
+
+UPDATE `creature_template` SET `ScriptName`="npc_leader_northbound" WHERE `entry` IN (165360,175034);
+
+-- Spawn Conditions for
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=32 AND `SourceGroup`=5 AND `SourceEntry`=156651 AND `ConditionValue1`=55173;
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=32 AND `SourceGroup`=5 AND `SourceEntry`=166906 AND `ConditionValue1`=59935;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(32,5,156651,0,0,47,0,55173,1,0,0,0,0,'','Spawn of creature with entry 156651 requires Quest 55173 not taken'),
+(32,5,166906,0,0,47,0,59935,1,0,0,0,0,'','Spawn of creature with entry 166906 requires Quest 59935 not taken');
+-- Spawn Conditions for
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=32 AND `SourceGroup`=5 AND `SourceEntry` IN (156662,166997) AND `SourceId`=0 AND `ElseGroup`=0;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(32,5,156662,0,0,1,0,305660,0,0,1,0,0,'','Spawn of creature with entry 156662 if player does not has aura 305660'),
+(32,5,166997,0,0,1,0,344382,0,0,1,0,0,'','Spawn of creature with entry 166997 if player does not has aura 344382');
+
+DELETE FROM `spell_script_names` WHERE `spell_id` IN (305661,344383,305665,344385);
+INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
+(305661,'spell_summon_leader_northbound'),
+(344383,'spell_summon_leader_northbound'),
+(305665,'spell_scene_linger_northbound'),
+(344385,'spell_scene_linger_northbound');
+
+DELETE FROM `quest_template_addon` WHERE `ID` IN (55173,59935);
+INSERT INTO `quest_template_addon` (`ID`,`AllowableClasses`,`PrevQuestID`,`NextQuestID`,`ScriptName`) VALUES
+(55173,0,0,0,'quest_northbound_alliance'), -- Alliance
+(59935,0,0,0,'quest_northbound_horde'); -- Horde
+
+DELETE FROM `phase_area` WHERE `AreaId`=10452 AND `PhaseId` IN (13846,15312);
+INSERT INTO `phase_area` (`AreaId`,`PhaseId`,`Comment`) VALUES
+(10452,13846, 'Cosmetic - NPE - Austin Huxworth scout at Quilboar Briarpatch'),
+(10452,15312, 'Cosmetic - NPE - Mithdran Dawntracker scout at Quilboar Briarpatch');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=26 AND `SourceGroup` IN (13846,15312) AND `SourceEntry` IN (10452);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(26,13846,10452,0,0,47,0,55173,74,0,0,0,0,'','Apply PHASE 13846 IF Quest 55173 IS in Progress | complete | rewarded'),
+(26,13846,10452,0,0,47,0,55186,74,0,1,0,0,'','Apply PHASE 13846 IF Quest 55186 IS NOT in Progress | complete | rewarded'),
+(26,13846,10452,0,1,47,0,55173,74,0,0,0,0,'','Apply PHASE 13846 IF Quest 55173 IS in Progress | complete | rewarded'),
+(26,13846,10452,0,1,47,0,55184,74,0,1,0,0,'','Apply PHASE 13846 IF Quest 55184 IS NOT in Progress | complete | rewarded'),
+(26,15312,10452,0,0,47,0,59935,74,0,0,0,0,'','Apply PHASE 15312 IF Quest 59935 IS in Progress | complete | rewarded'),
+(26,15312,10452,0,0,47,0,59938,74,0,1,0,0,'','Apply PHASE 15312 IF Quest 59938 IS NOT in Progress | complete | rewarded'),
+(26,15312,10452,0,1,47,0,59935,74,0,0,0,0,'','Apply PHASE 15312 IF Quest 59935 IS in Progress | complete | rewarded'),
+(26,15312,10452,0,1,47,0,59939,74,0,1,0,0,'','Apply PHASE 15312 IF Quest 59939 IS NOT in Progress | complete | rewarded');
+
+-- Conversation leaders
+DELETE FROM `conversation_actors` WHERE `ConversationId` IN (12066,14499,12070);
+INSERT INTO `conversation_actors` (`ConversationId`,`ConversationActorId`,`ConversationActorGuid`,`Idx`,`CreatureId`,`CreatureDisplayInfoId`,`NoActorObject`,`ActivePlayerObject`,`VerifiedBuild`) VALUES
+(12066,71310,0,1,0,0,0,0,45745), -- Alliance Leader
+(12066,71297,0,2,0,0,0,0,45745), -- Alliance Survivor
+(14499,79890,0,1,0,0,0,0,45745), -- Horde Leader
+(14499,79888,0,2,0,0,0,0,45745), -- Horde Survivor
+(12070,71317,0,0,0,0,0,0,45745), -- Alliance guy
+(12070,76319,0,1,0,0,0,0,45745); -- Horde guy
+
+DELETE FROM `conversation_line_template` WHERE `Id` IN (29348,29349,29350,29351,36300,36301,36302,36303,29367,36321);
+INSERT INTO `conversation_line_template` (`Id`,`UiCameraID`,`ActorIdx`,`Flags`,`VerifiedBuild`) VALUES
+(29348,0,0,0,45745), -- Player
+(29349,0,1,0,45745), -- Alliance
+(29350,0,2,0,45745), -- Alliance
+(29351,0,1,0,45745), -- Alliance
+(36300,0,0,0,45745), -- Player
+(36301,0,1,0,45745), -- Horde
+(36302,0,2,0,45745), -- Horde
+(36303,0,1,0,45745), -- Horde
+(29367,0,0,0,45745), -- Alliance
+(36321,0,1,0,45745); -- Horde
+
+DELETE FROM `conversation_template` WHERE `Id` IN (12066,14499,12070);
+INSERT INTO `conversation_template` (`Id`,`FirstLineId`,`TextureKitId`,`ScriptName`,`VerifiedBuild`) VALUES
+(12066,29348,0,'',45745),
+(14499,36300,0,'',45745),
+(12070,29367,0,'',45745);
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=29 AND `SourceEntry` IN (29348,29349,29350,29351,36300,36301,36302,36303,29367,36321);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(29,0,29367,0,0,6,0,469,0,0,0,0,0,'','Allow conversation line 29367 if team is Alliance'),
+(29,0,36321,0,0,6,0,67,0,0,0,0,0,'','Allow conversation line 36321 if team is Horde');
diff --git a/src/server/scripts/ExilesReach/zone_exiles_reach.cpp b/src/server/scripts/ExilesReach/zone_exiles_reach.cpp
index 9f1083c9cea..26bb9c5c3fe 100644
--- a/src/server/scripts/ExilesReach/zone_exiles_reach.cpp
+++ b/src/server/scripts/ExilesReach/zone_exiles_reach.cpp
@@ -15,6 +15,7 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include "AreaTrigger.h"
#include "AreaTriggerAI.h"
#include "Conversation.h"
#include "CreatureAIImpl.h"
@@ -30,11 +31,13 @@
#include "ScriptedCreature.h"
#include "ScriptMgr.h"
#include "ScriptSystem.h"
+#include "SpellAuras.h"
#include "SpellInfo.h"
#include "SpellScript.h"
#include "TemporarySummon.h"
#include "Transport.h"
#include "Loot.h"
+#include "SpellHistory.h"
template<class privateAI, class publicAI>
CreatureAI* GetPrivatePublicPairAISelector(Creature* creature)
@@ -284,6 +287,8 @@ public:
// 325108 - Summon Throg - Combat Training (DNT)
class spell_summon_sparring_partner : public SpellScript
{
+ // @TODO: drop after TARGET_UNK_142 impl
+
void SelectTarget(WorldObject*& target)
{
Player* caster = GetCaster()->ToPlayer();
@@ -325,7 +330,7 @@ struct npc_sparring_partner_exiles_reach : public ScriptedAI
_actorId = ACTOR_ID_HORDE;
_actorIndex = 1;
}
- me->SetUnitFlag(UNIT_FLAG_IMMUNE_TO_PC);
+ me->SetImmuneToPC(true);
_events.ScheduleEvent(EVENT_MOVE_TO_A_POSITION, 1s);
}
@@ -1521,10 +1526,10 @@ struct npc_lana_jordan_beach_laying : public ScriptedAI
enum ExilesReachMurlocsData
{
- ITEM_STITCHED_CLOTH_SHOES = 174791,
- ITEM_STITCHED_LEATHER_BOOTS = 174792,
- ITEM_LINKED_MAIL_BOOTS = 174793,
- ITEM_DENTED_PLATE_BOOTS = 174794,
+ ITEM_STITCHED_CLOTH_SHOES = 174791,
+ ITEM_STITCHED_LEATHER_BOOTS = 174792,
+ ITEM_LINKED_MAIL_BOOTS = 174793,
+ ITEM_DENTED_PLATE_BOOTS = 174794,
QUEST_MURLOC_HIDEAWAY_BOOTS_DROPPED = 58883
};
@@ -1836,7 +1841,7 @@ struct npc_garrick_summoned_beach : public ScriptedAI
}
case EVENT_FOLLOW_PLAYER:
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
- me->GetMotionMaster()->MoveFollow(player, 0.0f, 0.0f);
+ me->GetMotionMaster()->MoveFollow(player, 0.0f, float(M_PI / 4.0f));
break;
default:
break;
@@ -1933,7 +1938,7 @@ struct npc_grimaxe_summoned_beach : public ScriptedAI
}
case EVENT_FOLLOW_PLAYER:
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
- me->GetMotionMaster()->MoveFollow(player, 0.0f, 0.0f);
+ me->GetMotionMaster()->MoveFollow(player, 0.0f, float(M_PI / 4.0f));
break;
default:
break;
@@ -2018,6 +2023,8 @@ public:
// 325076 - Summon Warlord Grimaxe
class spell_summon_survivor_beach : public SpellScript
{
+ // @TODO: drop after TARGET_UNK_142 impl
+
void SelectTarget(WorldObject*& target)
{
Player* caster = GetCaster()->ToPlayer();
@@ -2186,6 +2193,1618 @@ struct areatrigger_find_the_lost_expedition_follower : AreaTriggerAI
}
};
+enum EnhancedCombatTacticsData
+{
+ SPELL_SUMMON_CAPTAIN_GARRICK_COMBAT = 320211,
+ SPELL_SUMMON_WARLORD_GRIMAXE_COMBAT = 325180
+};
+
+// 59254 - Enhanced Combat Tactics (Alliance)
+// 59339 - Enhanced Combat Tactics (Alliance Monk)
+// 59933 - Enhanced Combat Tactics (Horde)
+// 59934 - Enhanced Combat Tactics (Horde Monk)
+class quest_enhanced_combat_tactics : public QuestScript
+{
+public:
+ quest_enhanced_combat_tactics() : QuestScript("quest_enhanced_combat_tactics") { }
+
+ void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
+ {
+ switch (newStatus)
+ {
+ case QUEST_STATUS_INCOMPLETE:
+ player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
+ player->CastSpell(player, player->GetTeam() == ALLIANCE ? SPELL_SUMMON_CAPTAIN_GARRICK_COMBAT : SPELL_SUMMON_WARLORD_GRIMAXE_COMBAT);
+ break;
+ case QUEST_STATUS_NONE:
+ player->RemoveAura(player->GetTeam() == ALLIANCE ? SPELL_SUMMON_CAPTAIN_GARRICK_COMBAT : SPELL_SUMMON_WARLORD_GRIMAXE_COMBAT);
+ player->UpdateObjectVisibility();
+ player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
+ break;
+ default:
+ break;
+ }
+ }
+};
+
+// 320175 - Summon Garrick - Combat Training (DNT)
+// 325181 - Summon Grimaxe - Combat Training (DNT)
+class spell_summon_combat_trainer : public SpellScript
+{
+ // @TODO: drop after TARGET_UNK_142 impl
+
+ void SelectTarget(WorldObject*& target)
+ {
+ Player* caster = GetCaster()->ToPlayer();
+ if (!caster)
+ return;
+
+ Creature* partner = FindCreatureIgnorePhase(caster, caster->GetTeam() == ALLIANCE ? "garrick_camp" : "grimaxe_camp", 10.0f);
+ if (!partner)
+ return;
+
+ target = partner;
+ }
+
+ void Register() override
+ {
+ OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_summon_combat_trainer::SelectTarget, EFFECT_0, TARGET_DEST_NEARBY_ENTRY_OR_DB);
+ }
+};
+
+enum EnhancedCombatTrainerData
+{
+ ACTOR_ID_ALLIANCE_ENHANCED_TRAINING = 74771,
+ ACTOR_ID_HORDE_ENHANCED_TRAINING = 76285,
+
+ CHARGE_CATEGORY_CHARGE_SPELL = 1386,
+
+ CONVERSATION_PREFIGHT_WALK_ENHANCED = 13710,
+ CONVERSATION_USE_SPELLS_AT_RANGE = 13630,
+ CONVERSATION_READY_COMBAT = 14440,
+ // Warrior
+ CONVERSATION_READY_COMBAT_WARRIOR = 14441,
+ CONVERSATION_CHARGE_ZERO_RES_ENHANCED = 14444,
+ CONVERSATION_SLAM_ENHANCED = 14447,
+ CONVERSATION_CHARGE_ONE_RES_ENHANCED = 14448,
+ CONVERSATION_CHARGE_FINAL_ENHANCED = 14449,
+ CONVERSATION_CHARGE_KICKBACK = 13611,
+ // Paladin
+ CONVERSATION_HOLY_POWER_ONE_PALADIN = 14452,
+ CONVERSATION_CRUSADER_STRIKE_ONE_PALADIN = 14453,
+ CONVERSATION_CRUSADER_STRIKE_TWO_PALADIN = 14454,
+ CONVERSATION_SHIELD_SLAM_ONE_PALADIN = 14455,
+ CONVERSATION_HOLY_POWER_TWO_PALADIN = 14456,
+ CONVERSATION_SHIELD_SLAM_TWO_PALADIN = 14457,
+ CONVERSATION_CRUSADER_STRIKE_THREE_PALADIN = 14458,
+ CONVERSATION_HOLY_POWER_THREE_PALADIN = 14459,
+ // Rogue
+ CONVERSATION_SINISTER_STRIKE_ONE_ROGUE = 14486,
+ CONVERSATION_REGULAR_ATTACKS_ROGUE = 14487,
+ CONVERSATION_THREE_COMBO_POINTS_ROGUE = 14488,
+ CONVERSATION_THREE_COMBO_EVISCERATE_ROGUE = 14489,
+ CONVERSATION_SINISTER_STRIKE_TWO_ROGUE = 14490,
+ CONVERSATION_FOUR_COMBO_POINTS_ROGUE = 14491,
+ CONVERSATION_FOUR_COMBO_EVISCERATE_ROGUE = 14492,
+ CONVERSATION_SINISTER_STRIKE_THREE_ROGUE = 14493,
+ CONVERSATION_FIVE_COMBO_POINTS_ROGUE = 14494,
+ CONVERSATION_FAILED_EVISCERATE_ROGUE = 14495,
+ // Priest
+ CONVERSATION_SHADOW_WORD_PAIN_QUEST_CREDIT_PRIEST = 13892,
+ CONVERSATION_SMITE_PRE_COMBAT_PRIEST = 14460,
+ CONVERSATION_SHADOW_WORD_PAIN_PRE_COMBAT_PRIEST = 14461,
+ CONVERSATION_SHADOW_WORD_PAIN_TOO_SOON_PRIEST = 14462,
+ CONVERSATION_SHADOW_WORD_PAIN_FADING_PRIEST = 14463,
+ // Shaman
+ CONVERSATION_LIGHTNINGBOLT_FIRST_SHAMAN = 13631,
+ CONVERSATION_PRIMAL_STRIKE_FIRST_SHAMAN = 13632,
+ CONVERSATION_PRIMAL_STRIKE_QUEST_CREDIT_SHAMAN = 13633,
+ CONVERSATION_LIGHTNINGBOLT_RANGE_SHAMAN = 14475,
+ // Mage
+ CONVERSATION_FROSTBOLT_MAGE = 13634,
+ CONVERSATION_FIRE_BLAST_QUEST_CREDIT_MAGE = 13635,
+ CONVERSATION_FROSTBOLT_CLOSE_MAGE = 14476,
+ CONVERSATION_FIRE_BLAST_MAGE_NO_CREDIT = 14477,
+ // Warlock
+ CONVERSATION_CORRUPTION_QUEST_CREDIT_WARLOCK = 13895,
+ CONVERSATION_SHADOW_BOLT_PRE_COMBAT_WARLOCK = 14465,
+ CONVERSATION_CORRUPTION_CAST_PRE_COMBAT_WARLOCK = 14466,
+ CONVERSATION_CORRUPTION_CAST_TOO_SOON_WARLOCK = 14467,
+ CONVERSATION_CORRUPTION_IS_FADING_WARLOCK = 14468,
+ // Druid
+ CONVERSATION_MOONFIRE_QUEST_CREDIT_DRUID = 13893,
+ CONVERSATION_WRATH_PRE_COMBAT_DRUID = 14471,
+ CONVERSATION_MOONFIRE_CAST_PRE_COMBAT_DRUID = 14472,
+ CONVERSATION_MOONFIRE_CAST_TOO_SOON_DRUID = 14473,
+ CONVERSATION_MOONFIRE_WEARING_OFF_DRUID = 14474,
+
+ // All classes
+ EVENT_COMBAT_TRAINING_WALK_AND_TALK = 1,
+ EVENT_COMBAT_TRAINING_FACE_PLAYER,
+ EVENT_COMBAT_RUN_BACK,
+ EVENT_COMBAT_TRAINING_END,
+ EVENT_COMBAT_CHECK_PLAYER,
+ // Rogue
+ EVENT_COMBAT_TRAINING_SINISTER_CHECK_ROGUE,
+ // Priest, Warlock, Druid
+ EVENT_COMBAT_TRAINING_SPELL_FADING,
+ // Shaman
+ EVENT_COMBAT_TRAINING_RESET_SHAMAN,
+ EVENT_COMBAT_TRAINING_AGGRO_CHECK_SHAMAN,
+ // Mage
+ EVENT_COMBAT_TRAINING_RESET_MAGE,
+ EVENT_COMBAT_TRAINING_AGGRO_CHECK_MAGE,
+
+ NPC_ALLIANCE_SPARRING_PARTNER_ENHANCED = 164577,
+ NPC_ALLIANCE_SPARRING_PARTNER_ENHANCED2 = 164775,
+ //NPC_HORDE_SPARING_PARTNER_ENHANCED = 166916,
+ NPC_INVISBUNNY_CAMP = 167761,
+
+ PATH_COMBAT_TRAINER_HOME = 10512100,
+
+ POINT_WALK_POINT_ENHANCED_TRAINING = 1,
+ POINT_RUN_POINT_ENHANCED_TRAINING = 2,
+ POINT_TRAINING_POINT_ENHANCED_TRAINING = 3,
+
+ QUEST_ENHANCED_COMBAT_TACTICS_ALLIANCE = 59254,
+ QUEST_ENHANCED_COMBAT_TACTICS_ALLIANCE_MONK = 59339,
+ QUEST_ENHANCED_COMBAT_TACTICS_HORDE = 59933,
+ QUEST_ENHANCED_COMBAT_TACTICS_HORDE_MONK = 59934,
+
+ QUEST_OBJECTIVE_HORDE_ABILITIES_PROVEN = 397255,
+ QUEST_OBJECTIVE_HORDE_TIGER_PALM = 397258,
+ QUEST_OBJECTIVE_HORDE_BLACKOUT_KICK = 397259,
+ QUEST_OBJECTIVE_ALLIANCE_ABILITIES_PROVEN = 396220,
+ QUEST_OBJECTIVE_ALLIANCE_TIGER_PALM = 396353,
+ QUEST_OBJECTIVE_ALLIANCE_BLACKOUT_KICK = 396354,
+
+ SPELL_DRINK_HEALING_POTION = 320229,
+ SPELL_KNOCKBACK = 320735,
+ SPELL_CHARGE_KNOCKBACK_DRUID = 320767,
+ SPELL_CHARGE = 100,
+ SPELL_SLAM = 1464,
+ SPELL_CHARGE_KNOCKBACK_WARRIOR = 320583,
+ SPELL_SHIELD_OF_THE_RIGHTEOUS = 53600,
+ SPELL_CRUSADER_STRIKE = 35395,
+ SPELL_SINISTER_STRIKE = 1752,
+ SPELL_EVISCERATE = 196819,
+ SPELL_SMITE = 585,
+ SPELL_SHADOW_WORD_PAIN = 589,
+ SPELL_CHARGE_KNOCKBACK = 320605,
+ SPELL_PRIMAL_STRIKE = 73899,
+ SPELL_LIGHTNING_BOLT = 188196,
+ SPELL_FIRE_BLAST = 319836,
+ SPELL_FROSTBOLT = 116,
+ SPELL_CORRUPTION = 172,
+ SPELL_SHADOWBOLT = 686,
+ SPELL_MOONFIRE = 164812,
+ SPELL_WRATH = 5176,
+ SPELL_TIGER_PALM = 100780,
+ SPELL_BLACKOUT_KICK = 100784,
+ SPELL_RANGED_ROOT_DNT = 320608,
+ SPELL_AGGRO_RADIUS_CHECK_DNT_WARRIOR = 320741,
+ SPELL_AGGRO_RADIUS_CHECK_DNT_PRIEST = 320649,
+ SPELL_AGGRO_RADIUS_CHECK_DNT_SHAMAN = 320705,
+ SPELL_AGGRO_RADIUS_CHECK_DNT_WARRIOR_MAGE = 320741,
+ SPELL_AGGRO_RADIUS_CHECK_DNT_WARLOCK = 320606,
+ SPELL_AGGRO_RADIUS_CHECK_DNT_DRUID = 320766
+};
+
+Position const EnhancedTrainingWalkPosition = { -250.60243f, -2485.2517f, 17.787413f };
+Position const EnhancedTrainingRunPosition = { -231.5225f, -2480.5276f, 19.019197f };
+
+// 164577 - Alliance Sparring Partner
+// 166916 - Horde Sparring Partner
+struct npc_sparring_partner_combat_training : public ScriptedAI
+{
+ npc_sparring_partner_combat_training(Creature* creature) : ScriptedAI(creature), _questID(0), _summonSpellAuraID(0) { }
+
+ virtual void OnReadyPointReached() { }
+
+ virtual void HandleClassEvent(uint32 /*eventId*/) { }
+
+ void JustAppeared() override
+ {
+ _events.ScheduleEvent(EVENT_COMBAT_TRAINING_WALK_AND_TALK, 2s);
+ }
+
+ void IsSummonedBy(WorldObject* summonerWO) override
+ {
+ Unit* summoner = summonerWO->ToUnit();
+ if (!summoner)
+ return;
+
+ Player* player = summoner->ToPlayer();
+ if (!player)
+ return;
+
+ _playerGUID = player->GetGUID();
+
+ if (player->GetTeam() == ALLIANCE)
+ {
+ _summonSpellAuraID = SPELL_SUMMON_CAPTAIN_GARRICK_COMBAT;
+
+ if (player->GetClass() == CLASS_MONK)
+ _questID = QUEST_ENHANCED_COMBAT_TACTICS_ALLIANCE_MONK;
+ else
+ _questID = QUEST_ENHANCED_COMBAT_TACTICS_ALLIANCE;
+ }
+ else
+ {
+ _summonSpellAuraID = SPELL_SUMMON_WARLORD_GRIMAXE_COMBAT;
+
+ if (player->GetClass() == CLASS_MONK)
+ _questID = QUEST_ENHANCED_COMBAT_TACTICS_HORDE_MONK;
+ else
+ _questID = QUEST_ENHANCED_COMBAT_TACTICS_HORDE;
+ }
+ }
+
+ uint8 GetQuestCredits()
+ {
+ Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID);
+ if (!player)
+ return 0;
+
+ uint32 objectiveId = 0;
+ switch (_questID)
+ {
+ case QUEST_ENHANCED_COMBAT_TACTICS_ALLIANCE:
+ objectiveId = QUEST_OBJECTIVE_ALLIANCE_ABILITIES_PROVEN;
+ break;
+ case QUEST_ENHANCED_COMBAT_TACTICS_HORDE:
+ objectiveId = QUEST_OBJECTIVE_HORDE_ABILITIES_PROVEN;
+ break;
+ default:
+ break;
+ }
+
+ return player->GetQuestSlotObjectiveData(_questID, objectiveId);
+ }
+
+ void EnterEvadeMode(EvadeReason /*why*/) override
+ {
+ if (!me->IsAlive())
+ return;
+
+ me->CombatStop(true);
+ EngagementOver();
+ me->ResetPlayerDamageReq();
+ }
+
+ void MovementInform(uint32 uiType, uint32 uiId) override
+ {
+ if (uiType != POINT_MOTION_TYPE)
+ return;
+
+ switch (uiId)
+ {
+ case POINT_WALK_POINT_ENHANCED_TRAINING:
+ me->SetWalk(false);
+ me->GetMotionMaster()->MovePoint(POINT_RUN_POINT_ENHANCED_TRAINING, EnhancedTrainingRunPosition);
+ break;
+ case POINT_RUN_POINT_ENHANCED_TRAINING:
+ {
+ std::list<Creature*> sparpoints;
+ GetCreatureListWithEntryInGrid(sparpoints, me, NPC_INVISBUNNY_CAMP, 100.0f);
+ Trinity::Containers::RandomResize(sparpoints, 1);
+
+ for (Creature* creature : sparpoints)
+ me->GetMotionMaster()->MovePoint(POINT_TRAINING_POINT_ENHANCED_TRAINING, creature->GetPosition());
+ break;
+ }
+ case POINT_TRAINING_POINT_ENHANCED_TRAINING:
+ {
+ Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID);
+ if (!player)
+ break;
+
+ me->SetFacingToObject(player);
+ me->SetImmuneToPC(false);
+ me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
+ _events.ScheduleEvent(EVENT_COMBAT_CHECK_PLAYER, 1s);
+
+ OnReadyPointReached();
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
+ {
+ damage = me->GetHealth() - 1;
+
+ if (me->HealthBelowPctDamaged(20, damage))
+ me->CastSpell(me, SPELL_DRINK_HEALING_POTION);
+ }
+
+ void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/) override
+ {
+ if (target->GetHealthPct() < 91)
+ damage = 0;
+ }
+
+ void StartConversationWithPlayer(uint32 conversationId)
+ {
+ if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
+ {
+ Conversation* conversation = Conversation::CreateConversation(conversationId, player, *player, player->GetGUID(), nullptr, false);
+ if (!conversation)
+ return;
+
+ conversation->AddActor(ACTOR_ID_ALLIANCE_ENHANCED_TRAINING, 0, player->GetTeam() == ALLIANCE ? me->GetGUID() : ObjectGuid::Empty);
+ conversation->AddActor(ACTOR_ID_HORDE_ENHANCED_TRAINING, 1, player->GetTeam() == HORDE ? me->GetGUID() : ObjectGuid::Empty);
+ conversation->Start();
+ }
+ }
+
+ void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
+ {
+ // Used to check if reached home
+ if (pathId == PATH_COMBAT_TRAINER_HOME)
+ {
+ if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
+ {
+ player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
+ player->RemoveAura(_summonSpellAuraID);
+ }
+ }
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_COMBAT_TRAINING_WALK_AND_TALK:
+ // Used by all classes
+ me->SetWalk(true);
+ me->GetMotionMaster()->MovePoint(POINT_WALK_POINT_ENHANCED_TRAINING, EnhancedTrainingWalkPosition);
+ StartConversationWithPlayer(CONVERSATION_PREFIGHT_WALK_ENHANCED);
+ break;
+ case EVENT_COMBAT_TRAINING_FACE_PLAYER:
+ {
+ // Used by all classes
+ if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
+ me->SetFacingToObject(player);
+
+ me->SetImmuneToPC(false);
+ me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
+ break;
+ }
+ case EVENT_COMBAT_TRAINING_END:
+ // Used by all classes
+ me->SetImmuneToPC(true);
+ me->SetUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
+ me->RemoveAllAuras();
+ if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
+ {
+ me->SetFacingToObject(player);
+ StartConversationWithPlayer(CONVERSATION_CHARGE_FINAL_ENHANCED);
+ _events.ScheduleEvent(EVENT_COMBAT_RUN_BACK, 4s);
+ }
+ break;
+ case EVENT_COMBAT_RUN_BACK:
+ // Used by all classes
+ me->GetMotionMaster()->Clear();
+ me->GetMotionMaster()->MovePath(PATH_COMBAT_TRAINER_HOME, false);
+ break;
+ default:
+ HandleClassEvent(eventId);
+ break;
+ }
+ }
+
+ if (!UpdateVictim())
+ return;
+
+ DoMeleeAttackIfReady();
+ }
+
+protected:
+ uint32 _questID;
+ uint32 _summonSpellAuraID;
+ EventMap _events;
+ ObjectGuid _playerGUID;
+};
+
+// 164577 - Alliance Sparring Partner
+// 166916 - Horde Sparring Partner
+struct npc_sparring_partner_enhanced_combat_training_warrior : public npc_sparring_partner_combat_training
+{
+ npc_sparring_partner_enhanced_combat_training_warrior(Creature* creature) : npc_sparring_partner_combat_training(creature), _slamCounter(0), _secondaryCheck(false) { }
+
+ void ResetWarrior(Player* player)
+ {
+ _slamCounter = 0;
+ me->SetImmuneToPC(true);
+ me->SetUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
+ player->GetSpellHistory()->ResetCharges(CHARGE_CATEGORY_CHARGE_SPELL);
+ me->CastSpell(me, SPELL_AGGRO_RADIUS_CHECK_DNT_WARRIOR_MAGE);
+ me->CastSpell(me, SPELL_RANGED_ROOT_DNT);
+ _events.ScheduleEvent(EVENT_COMBAT_TRAINING_FACE_PLAYER, 1s);
+ StartConversationWithPlayer(CONVERSATION_CHARGE_KICKBACK);
+ }
+
+ void OnReadyPointReached() override
+ {
+ StartConversationWithPlayer(CONVERSATION_READY_COMBAT_WARRIOR);
+ me->CastSpell(me, SPELL_AGGRO_RADIUS_CHECK_DNT_WARRIOR_MAGE);
+ me->CastSpell(me, SPELL_RANGED_ROOT_DNT);
+ _secondaryCheck = true;
+ }
+
+ void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
+ {
+ Player* player = caster->ToPlayer();
+ if (!player)
+ return;
+
+ if (spellInfo->Id == SPELL_CHARGE)
+ {
+ me->RemoveAura(SPELL_RANGED_ROOT_DNT);
+ me->RemoveAura(SPELL_AGGRO_RADIUS_CHECK_DNT_WARRIOR_MAGE);
+
+ player->KilledMonsterCredit(NPC_ALLIANCE_SPARRING_PARTNER_ENHANCED);
+
+ switch (GetQuestCredits())
+ {
+ case 1:
+ StartConversationWithPlayer(CONVERSATION_CHARGE_ZERO_RES_ENHANCED);
+ break;
+ case 2:
+ StartConversationWithPlayer(CONVERSATION_CHARGE_ONE_RES_ENHANCED);
+ break;
+ case 3:
+ _events.ScheduleEvent(EVENT_COMBAT_TRAINING_END, 1s);
+ break;
+ default:
+ break;
+ }
+ }
+ else if (spellInfo->Id == SPELL_SLAM)
+ {
+ ++_slamCounter;
+
+ if (_slamCounter == 3 && GetQuestCredits())
+ ResetWarrior(player);
+
+ if (!_secondaryCheck)
+ return;
+
+ _secondaryCheck = false;
+ StartConversationWithPlayer(CONVERSATION_SLAM_ENHANCED);
+ }
+ }
+
+private:
+ uint8 _slamCounter;
+ bool _secondaryCheck;
+};
+
+// 164577 - Alliance Sparring Partner
+// 166916 - Horde Sparring Partner
+struct npc_sparring_partner_enhanced_combat_training_paladin : public npc_sparring_partner_combat_training
+{
+ npc_sparring_partner_enhanced_combat_training_paladin(Creature* creature) : npc_sparring_partner_combat_training(creature), _secondaryCheck(false), _holyPowerCheck(false) { }
+
+ void OnReadyPointReached() override
+ {
+ StartConversationWithPlayer(CONVERSATION_READY_COMBAT);
+ _holyPowerCheck = true;
+ _secondaryCheck = true;
+ }
+
+ void HandleClassEvent(uint32 eventId) override
+ {
+ switch (eventId)
+ {
+ case EVENT_COMBAT_CHECK_PLAYER:
+ {
+ if (_holyPowerCheck) // Used by paladin
+ {
+ if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
+ {
+ if (player->GetPower(POWER_HOLY_POWER) >= 3)
+ {
+ switch (GetQuestCredits())
+ {
+ case 0:
+ StartConversationWithPlayer(CONVERSATION_HOLY_POWER_ONE_PALADIN);
+ break;
+ case 1:
+ StartConversationWithPlayer(CONVERSATION_HOLY_POWER_TWO_PALADIN);
+ break;
+ case 2:
+ StartConversationWithPlayer(CONVERSATION_HOLY_POWER_THREE_PALADIN);
+ break;
+ default:
+ break;
+ }
+ _holyPowerCheck = false;
+ }
+ }
+ }
+ _events.ScheduleEvent(EVENT_COMBAT_CHECK_PLAYER, 500ms);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
+ {
+ Player* player = caster->ToPlayer();
+ if (!player)
+ return;
+
+ if (spellInfo->Id == SPELL_SHIELD_OF_THE_RIGHTEOUS)
+ {
+ player->KilledMonsterCredit(NPC_ALLIANCE_SPARRING_PARTNER_ENHANCED);
+
+ switch (GetQuestCredits())
+ {
+ case 1:
+ StartConversationWithPlayer(CONVERSATION_SHIELD_SLAM_ONE_PALADIN);
+ _secondaryCheck = true;
+ break;
+ case 2:
+ StartConversationWithPlayer(CONVERSATION_SHIELD_SLAM_TWO_PALADIN);
+ _secondaryCheck = true;
+ break;
+ case 3:
+ _events.ScheduleEvent(EVENT_COMBAT_TRAINING_END, 1s);
+ _events.CancelEvent(EVENT_COMBAT_CHECK_PLAYER);
+ break;
+ default:
+ break;
+ }
+ }
+ else if (spellInfo->Id == SPELL_CRUSADER_STRIKE)
+ {
+ if (_secondaryCheck)
+ {
+ switch (GetQuestCredits())
+ {
+ case 0:
+ StartConversationWithPlayer(CONVERSATION_CRUSADER_STRIKE_ONE_PALADIN);
+ break;
+ case 1:
+ StartConversationWithPlayer(CONVERSATION_CRUSADER_STRIKE_TWO_PALADIN);
+ break;
+ case 2:
+ StartConversationWithPlayer(CONVERSATION_CRUSADER_STRIKE_THREE_PALADIN);
+ break;
+ default:
+ break;
+ }
+ _secondaryCheck = false;
+ _holyPowerCheck = true;
+ }
+ }
+ }
+
+private:
+ bool _secondaryCheck;
+ bool _holyPowerCheck;
+};
+
+// 164577 - Alliance Sparring Partner
+// 166916 - Horde Sparring Partner
+struct npc_sparring_partner_enhanced_combat_training_rogue : public npc_sparring_partner_combat_training
+{
+ npc_sparring_partner_enhanced_combat_training_rogue(Creature* creature) : npc_sparring_partner_combat_training(creature), _comboPointsCounter(0), _secondaryCheck(false), _comboPointCheck(false) { }
+
+ void OnReadyPointReached() override
+ {
+ StartConversationWithPlayer(CONVERSATION_READY_COMBAT);
+ _comboPointCheck = true;
+ _secondaryCheck = true;
+ }
+
+ void JustEngagedWith(Unit* /*who*/) override
+ {
+ Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID);
+ if (!player)
+ return;
+
+ if (!GetQuestCredits())
+ _events.ScheduleEvent(EVENT_COMBAT_TRAINING_SINISTER_CHECK_ROGUE, 8s, 20s);
+ }
+
+ void HandleClassEvent(uint32 eventId) override
+ {
+ switch (eventId)
+ {
+ case EVENT_COMBAT_TRAINING_SINISTER_CHECK_ROGUE:
+ StartConversationWithPlayer(CONVERSATION_REGULAR_ATTACKS_ROGUE);
+ _events.ScheduleEvent(EVENT_COMBAT_TRAINING_SINISTER_CHECK_ROGUE, 8s, 20s);
+ break;
+ case EVENT_COMBAT_CHECK_PLAYER:
+ {
+ if (_comboPointCheck) // Used by rogue
+ {
+ if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
+ _comboPointsCounter = player->GetPower(POWER_COMBO_POINTS);
+
+ if (_comboPointsCounter >= (GetQuestCredits() + 3))
+ {
+ switch (GetQuestCredits())
+ {
+ case 0:
+ StartConversationWithPlayer(CONVERSATION_THREE_COMBO_POINTS_ROGUE);
+ break;
+ case 1:
+ StartConversationWithPlayer(CONVERSATION_FOUR_COMBO_POINTS_ROGUE);
+ break;
+ case 2:
+ StartConversationWithPlayer(CONVERSATION_FIVE_COMBO_POINTS_ROGUE);
+ break;
+ default:
+ break;
+ }
+ _comboPointCheck = false;
+ }
+ }
+ _events.ScheduleEvent(EVENT_COMBAT_CHECK_PLAYER, 500ms);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
+ {
+ Player* player = caster->ToPlayer();
+ if (!player)
+ return;
+
+ if (spellInfo->Id == SPELL_EVISCERATE)
+ {
+ _comboPointCheck = true;
+ if (_comboPointsCounter >= (GetQuestCredits() + 3))
+ {
+ player->KilledMonsterCredit(NPC_ALLIANCE_SPARRING_PARTNER_ENHANCED);
+
+ switch (GetQuestCredits())
+ {
+ case 1:
+ StartConversationWithPlayer(CONVERSATION_THREE_COMBO_EVISCERATE_ROGUE);
+ _secondaryCheck = true;
+ break;
+ case 2:
+ StartConversationWithPlayer(CONVERSATION_FOUR_COMBO_EVISCERATE_ROGUE);
+ _secondaryCheck = true;
+ break;
+ case 3:
+ _events.ScheduleEvent(EVENT_COMBAT_TRAINING_END, 1s);
+ _events.CancelEvent(EVENT_COMBAT_CHECK_PLAYER);
+ break;
+ default:
+ break;
+ }
+ }
+ else
+ {
+ StartConversationWithPlayer(CONVERSATION_FAILED_EVISCERATE_ROGUE);
+ }
+ }
+ else if (spellInfo->Id == SPELL_SINISTER_STRIKE)
+ {
+ if (!GetQuestCredits())
+ _events.RescheduleEvent(EVENT_COMBAT_TRAINING_SINISTER_CHECK_ROGUE, 8s, 20s);
+
+ if (_secondaryCheck)
+ {
+ switch (GetQuestCredits())
+ {
+ case 0:
+ StartConversationWithPlayer(CONVERSATION_SINISTER_STRIKE_ONE_ROGUE);
+ break;
+ case 1:
+ StartConversationWithPlayer(CONVERSATION_SINISTER_STRIKE_TWO_ROGUE);
+ break;
+ case 2:
+ StartConversationWithPlayer(CONVERSATION_SINISTER_STRIKE_THREE_ROGUE);
+ break;
+ default:
+ break;
+ }
+ _secondaryCheck = false;
+ }
+ }
+ }
+
+private:
+ uint8 _comboPointsCounter;
+ bool _secondaryCheck;
+ bool _comboPointCheck;
+};
+
+// 164577 - Alliance Sparring Partner
+// 166916 - Horde Sparring Partner
+struct npc_sparring_partner_enhanced_combat_training_priest : public npc_sparring_partner_combat_training
+{
+ npc_sparring_partner_enhanced_combat_training_priest(Creature* creature) : npc_sparring_partner_combat_training(creature), _shadowWordPainInPandemicWindow(false), _secondaryCheck(false) { }
+
+ void OnReadyPointReached() override
+ {
+ StartConversationWithPlayer(CONVERSATION_READY_COMBAT);
+ me->CastSpell(me, SPELL_AGGRO_RADIUS_CHECK_DNT_PRIEST);
+ me->CastSpell(me, SPELL_RANGED_ROOT_DNT);
+ _secondaryCheck = true;
+ }
+
+ void HandleClassEvent(uint32 eventId) override
+ {
+ switch (eventId)
+ {
+ case EVENT_COMBAT_TRAINING_SPELL_FADING:
+ {
+ Aura* aura = me->GetAura(SPELL_MOONFIRE);
+ if (!aura)
+ break;
+
+ if (!_shadowWordPainInPandemicWindow)
+ {
+ int32 pandemicDuration = CalculatePct(aura->GetMaxDuration(), 30.0f);
+ if (aura->GetDuration() <= pandemicDuration)
+ {
+ _shadowWordPainInPandemicWindow = true;
+ StartConversationWithPlayer(CONVERSATION_SHADOW_WORD_PAIN_FADING_PRIEST);
+ }
+ }
+ _events.ScheduleEvent(EVENT_COMBAT_TRAINING_SPELL_FADING, 1s);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
+ {
+ Player* player = caster->ToPlayer();
+ if (!player)
+ return;
+
+ if (spellInfo->Id == SPELL_SHADOW_WORD_PAIN)
+ {
+ if (_events.GetTimeUntilEvent(EVENT_COMBAT_TRAINING_SPELL_FADING) == Milliseconds::max())
+ _events.ScheduleEvent(EVENT_COMBAT_TRAINING_SPELL_FADING, 1s);
+
+ if (!_shadowWordPainInPandemicWindow)
+ {
+ if (_secondaryCheck)
+ {
+ StartConversationWithPlayer(CONVERSATION_SHADOW_WORD_PAIN_PRE_COMBAT_PRIEST);
+ me->SetImmuneToPC(false);
+ me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
+ me->RemoveAura(SPELL_RANGED_ROOT_DNT);
+ _secondaryCheck = false;
+ }
+ else
+ StartConversationWithPlayer(CONVERSATION_SHADOW_WORD_PAIN_TOO_SOON_PRIEST);
+ }
+ else
+ {
+ _shadowWordPainInPandemicWindow = false;
+ player->KilledMonsterCredit(NPC_ALLIANCE_SPARRING_PARTNER_ENHANCED);
+
+ if (player->GetQuestStatus(_questID) == QUEST_STATUS_COMPLETE)
+ _events.ScheduleEvent(EVENT_COMBAT_TRAINING_END, 1s);
+ else
+ StartConversationWithPlayer(CONVERSATION_SHADOW_WORD_PAIN_QUEST_CREDIT_PRIEST);
+ }
+ }
+ else if (spellInfo->Id == SPELL_SMITE)
+ {
+ if (_secondaryCheck)
+ StartConversationWithPlayer(CONVERSATION_SMITE_PRE_COMBAT_PRIEST);
+ }
+ }
+
+private:
+ bool _shadowWordPainInPandemicWindow;
+ bool _secondaryCheck;
+};
+
+// 164577 - Alliance Sparring Partner
+// 166916 - Horde Sparring Partner
+struct npc_sparring_partner_enhanced_combat_training_shaman : public npc_sparring_partner_combat_training
+{
+ npc_sparring_partner_enhanced_combat_training_shaman(Creature* creature) : npc_sparring_partner_combat_training(creature), _primalStrikeCounter(0), _secondaryCheck(false) { }
+
+ void OnReadyPointReached() override
+ {
+ StartConversationWithPlayer(CONVERSATION_READY_COMBAT);
+ me->CastSpell(me, SPELL_AGGRO_RADIUS_CHECK_DNT_SHAMAN);
+ me->CastSpell(me, SPELL_RANGED_ROOT_DNT);
+ _secondaryCheck = true;
+ }
+
+ void HandleClassEvent(uint32 eventId) override
+ {
+ switch (eventId)
+ {
+ case EVENT_COMBAT_TRAINING_RESET_SHAMAN:
+ if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
+ {
+ me->CastSpell(player, SPELL_KNOCKBACK);
+ _events.ScheduleEvent(EVENT_COMBAT_TRAINING_AGGRO_CHECK_SHAMAN, 2s);
+ }
+ break;
+ case EVENT_COMBAT_TRAINING_AGGRO_CHECK_SHAMAN:
+ me->CastSpell(me, SPELL_AGGRO_RADIUS_CHECK_DNT_SHAMAN);
+ me->SetImmuneToPC(false);
+ me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
+ _secondaryCheck = true;
+ break;
+ default:
+ break;
+ }
+ }
+
+ void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
+ {
+ Player* player = caster->ToPlayer();
+ if (!player)
+ return;
+
+ if (spellInfo->Id == SPELL_PRIMAL_STRIKE)
+ {
+ if (!player->IsWithinDist(me, 2.0f))
+ return;
+
+ ++_primalStrikeCounter;
+
+ if (_primalStrikeCounter < 3)
+ {
+ if (_primalStrikeCounter == 1)
+ StartConversationWithPlayer(CONVERSATION_PRIMAL_STRIKE_FIRST_SHAMAN);
+ return;
+ }
+
+ _primalStrikeCounter = 0;
+ player->KilledMonsterCredit(NPC_ALLIANCE_SPARRING_PARTNER_ENHANCED);
+
+ if (player->GetQuestStatus(_questID) == QUEST_STATUS_COMPLETE)
+ {
+ _events.ScheduleEvent(EVENT_COMBAT_TRAINING_END, 1s);
+ }
+ else
+ {
+ StartConversationWithPlayer(CONVERSATION_PRIMAL_STRIKE_QUEST_CREDIT_SHAMAN);
+ me->SetImmuneToPC(true);
+ me->SetUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
+ _events.ScheduleEvent(EVENT_COMBAT_TRAINING_RESET_SHAMAN, 3s);
+ }
+ }
+ else if (spellInfo->Id == SPELL_LIGHTNING_BOLT)
+ {
+ me->RemoveAura(SPELL_RANGED_ROOT_DNT);
+ me->RemoveAura(SPELL_AGGRO_RADIUS_CHECK_DNT_SHAMAN);
+ if (_secondaryCheck)
+ {
+ StartConversationWithPlayer(CONVERSATION_LIGHTNINGBOLT_FIRST_SHAMAN);
+ _secondaryCheck = false;
+ }
+ else
+ {
+ if (player->IsWithinDist(me, 2.0f))
+ StartConversationWithPlayer(CONVERSATION_LIGHTNINGBOLT_RANGE_SHAMAN);
+ }
+ }
+ }
+
+private:
+ uint8 _primalStrikeCounter;
+ bool _secondaryCheck;
+};
+
+// 164577 - Alliance Sparring Partner
+// 166916 - Horde Sparring Partner
+struct npc_sparring_partner_enhanced_combat_training_mage : public npc_sparring_partner_combat_training
+{
+ npc_sparring_partner_enhanced_combat_training_mage(Creature* creature) : npc_sparring_partner_combat_training(creature), _secondaryCheck(true) { }
+
+ void OnReadyPointReached() override
+ {
+ StartConversationWithPlayer(CONVERSATION_READY_COMBAT);
+ me->CastSpell(me, SPELL_AGGRO_RADIUS_CHECK_DNT_WARRIOR_MAGE);
+ me->CastSpell(me, SPELL_RANGED_ROOT_DNT);
+ _secondaryCheck = true;
+ }
+
+ void HandleClassEvent(uint32 eventId) override
+ {
+ switch (eventId)
+ {
+ case EVENT_COMBAT_TRAINING_RESET_MAGE:
+ if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
+ {
+ me->CastSpell(player, SPELL_KNOCKBACK);
+ _events.ScheduleEvent(EVENT_COMBAT_TRAINING_AGGRO_CHECK_MAGE, 2s);
+ }
+ break;
+ case EVENT_COMBAT_TRAINING_AGGRO_CHECK_MAGE:
+ me->CastSpell(me, SPELL_AGGRO_RADIUS_CHECK_DNT_WARRIOR_MAGE);
+ me->SetImmuneToPC(false);
+ me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
+ _secondaryCheck = true;
+ break;
+ default:
+ break;
+ }
+ }
+
+ void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
+ {
+ Player* player = caster->ToPlayer();
+ if (!player)
+ return;
+
+ if (spellInfo->Id == SPELL_FIRE_BLAST)
+ {
+ if (player->IsWithinDist(me, 2.0f))
+ {
+ player->KilledMonsterCredit(NPC_ALLIANCE_SPARRING_PARTNER_ENHANCED);
+
+ if (player->GetQuestStatus(_questID) == QUEST_STATUS_COMPLETE)
+ {
+ _events.ScheduleEvent(EVENT_COMBAT_TRAINING_END, 1s);
+ }
+ else
+ {
+ StartConversationWithPlayer(CONVERSATION_FIRE_BLAST_QUEST_CREDIT_MAGE);
+ me->SetImmuneToPC(true);
+ me->SetUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
+ _events.ScheduleEvent(EVENT_COMBAT_TRAINING_RESET_MAGE, 4s);
+ }
+ }
+ else
+ {
+ StartConversationWithPlayer(CONVERSATION_FIRE_BLAST_MAGE_NO_CREDIT);
+ }
+ }
+ else if (spellInfo->Id == SPELL_FROSTBOLT)
+ {
+ me->RemoveAura(SPELL_RANGED_ROOT_DNT);
+ me->RemoveAura(SPELL_AGGRO_RADIUS_CHECK_DNT_WARRIOR_MAGE);
+ if (_secondaryCheck)
+ {
+ StartConversationWithPlayer(CONVERSATION_FROSTBOLT_MAGE);
+ _secondaryCheck = false;
+ }
+ else
+ {
+ if (player->IsWithinDist(me, 2.0f))
+ StartConversationWithPlayer(CONVERSATION_FROSTBOLT_CLOSE_MAGE);
+ }
+ }
+ }
+
+private:
+ bool _secondaryCheck;
+};
+
+// 164577 - Alliance Sparring Partner
+// 166916 - Horde Sparring Partner
+struct npc_sparring_partner_enhanced_combat_training_warlock : public npc_sparring_partner_combat_training
+{
+ npc_sparring_partner_enhanced_combat_training_warlock(Creature* creature) : npc_sparring_partner_combat_training(creature), _corruptionInPandemicWindow(false), _secondaryCheck(false) { }
+
+ void OnReadyPointReached() override
+ {
+ StartConversationWithPlayer(CONVERSATION_READY_COMBAT);
+ me->CastSpell(me, SPELL_AGGRO_RADIUS_CHECK_DNT_WARLOCK);
+ me->CastSpell(me, SPELL_RANGED_ROOT_DNT);
+ _secondaryCheck = true;
+ }
+
+ void HandleClassEvent(uint32 eventId) override
+ {
+ switch (eventId)
+ {
+ case EVENT_COMBAT_TRAINING_SPELL_FADING:
+ {
+ Aura* aura = me->GetAura(SPELL_MOONFIRE);
+ if (!aura)
+ break;
+
+ if (!_corruptionInPandemicWindow)
+ {
+ int32 pandemicDuration = CalculatePct(aura->GetMaxDuration(), 30.0f);
+ if (aura->GetDuration() <= pandemicDuration)
+ {
+ _corruptionInPandemicWindow = true;
+ StartConversationWithPlayer(CONVERSATION_CORRUPTION_IS_FADING_WARLOCK);
+ }
+ }
+ _events.ScheduleEvent(EVENT_COMBAT_TRAINING_SPELL_FADING, 1s);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
+ {
+ Player* player = caster->ToPlayer();
+ if (!player)
+ return;
+
+ if (spellInfo->Id == SPELL_CORRUPTION)
+ {
+ if (_events.GetTimeUntilEvent(EVENT_COMBAT_TRAINING_SPELL_FADING) == Milliseconds::max())
+ _events.ScheduleEvent(EVENT_COMBAT_TRAINING_SPELL_FADING, 1s);
+
+ if (!_corruptionInPandemicWindow)
+ {
+ if (_secondaryCheck)
+ {
+ StartConversationWithPlayer(CONVERSATION_CORRUPTION_CAST_PRE_COMBAT_WARLOCK);
+ me->SetImmuneToPC(false);
+ me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
+ me->RemoveAura(SPELL_RANGED_ROOT_DNT);
+ _secondaryCheck = false;
+ }
+ else
+ StartConversationWithPlayer(CONVERSATION_CORRUPTION_CAST_TOO_SOON_WARLOCK);
+ }
+ else
+ {
+ _corruptionInPandemicWindow = false;
+ player->KilledMonsterCredit(NPC_ALLIANCE_SPARRING_PARTNER_ENHANCED);
+
+ if (player->GetQuestStatus(_questID) == QUEST_STATUS_COMPLETE)
+ _events.ScheduleEvent(EVENT_COMBAT_TRAINING_END, 1s);
+ else
+ StartConversationWithPlayer(CONVERSATION_CORRUPTION_QUEST_CREDIT_WARLOCK);
+ }
+ }
+ else if (spellInfo->Id == SPELL_SHADOWBOLT)
+ {
+ if (_secondaryCheck)
+ StartConversationWithPlayer(CONVERSATION_SHADOW_BOLT_PRE_COMBAT_WARLOCK);
+ }
+ }
+
+private:
+ bool _corruptionInPandemicWindow;
+ bool _secondaryCheck;
+};
+
+// 164577 - Alliance Sparring Partner
+// 166916 - Horde Sparring Partner
+struct npc_sparring_partner_enhanced_combat_training_monk : public npc_sparring_partner_combat_training
+{
+ npc_sparring_partner_enhanced_combat_training_monk(Creature* creature) : npc_sparring_partner_combat_training(creature) { }
+
+ void OnReadyPointReached() override
+ {
+ StartConversationWithPlayer(CONVERSATION_READY_COMBAT);
+ }
+
+ void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
+ {
+ Player* player = caster->ToPlayer();
+ if (!player)
+ return;
+
+ if (spellInfo->Id == SPELL_TIGER_PALM)
+ player->KilledMonsterCredit(NPC_ALLIANCE_SPARRING_PARTNER_ENHANCED);
+ else if (spellInfo->Id == SPELL_BLACKOUT_KICK)
+ player->KilledMonsterCredit(NPC_ALLIANCE_SPARRING_PARTNER_ENHANCED2);
+
+ if (player->GetQuestStatus(_questID) == QUEST_STATUS_COMPLETE)
+ _events.ScheduleEvent(EVENT_COMBAT_TRAINING_END, 1s);
+ }
+};
+
+// 164577 - Alliance Sparring Partner
+// 166916 - Horde Sparring Partner
+struct npc_sparring_partner_enhanced_combat_training_druid : public npc_sparring_partner_combat_training
+{
+ npc_sparring_partner_enhanced_combat_training_druid(Creature* creature) : npc_sparring_partner_combat_training(creature), _hitByMoonfire(false), _moonfireInPandemicWindow(false) { }
+
+ void OnReadyPointReached() override
+ {
+ StartConversationWithPlayer(CONVERSATION_READY_COMBAT);
+ me->CastSpell(me, SPELL_AGGRO_RADIUS_CHECK_DNT_DRUID);
+ me->CastSpell(me, SPELL_RANGED_ROOT_DNT);
+ _moonfireInPandemicWindow = false;
+ _hitByMoonfire = false;
+ }
+
+ void HandleClassEvent(uint32 eventId) override
+ {
+ switch (eventId)
+ {
+ case EVENT_COMBAT_TRAINING_SPELL_FADING:
+ {
+ Aura* aura = me->GetAura(SPELL_MOONFIRE);
+ if (!aura)
+ break;
+
+ if (!_moonfireInPandemicWindow)
+ {
+ int32 pandemicDuration = CalculatePct(aura->GetMaxDuration(), 30.0f);
+ if (aura->GetDuration() <= pandemicDuration)
+ {
+ _moonfireInPandemicWindow = true;
+ StartConversationWithPlayer(CONVERSATION_MOONFIRE_WEARING_OFF_DRUID);
+ }
+ }
+ _events.ScheduleEvent(EVENT_COMBAT_TRAINING_SPELL_FADING, 1s);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
+ {
+ Player* player = caster->ToPlayer();
+ if (!player)
+ return;
+
+ if (spellInfo->Id == SPELL_MOONFIRE)
+ {
+ if (_events.GetTimeUntilEvent(EVENT_COMBAT_TRAINING_SPELL_FADING) == Milliseconds::max())
+ _events.ScheduleEvent(EVENT_COMBAT_TRAINING_SPELL_FADING, 1s);
+
+ if (!_moonfireInPandemicWindow)
+ {
+ if (!_hitByMoonfire)
+ {
+ StartConversationWithPlayer(CONVERSATION_MOONFIRE_CAST_PRE_COMBAT_DRUID);
+ me->SetImmuneToPC(false);
+ me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
+ me->RemoveAura(SPELL_RANGED_ROOT_DNT);
+ _hitByMoonfire = true;
+ }
+ else
+ StartConversationWithPlayer(CONVERSATION_MOONFIRE_CAST_TOO_SOON_DRUID);
+ }
+ else
+ {
+ _moonfireInPandemicWindow = false;
+ player->KilledMonsterCredit(NPC_ALLIANCE_SPARRING_PARTNER_ENHANCED);
+
+ if (player->GetQuestStatus(_questID) == QUEST_STATUS_COMPLETE)
+ _events.ScheduleEvent(EVENT_COMBAT_TRAINING_END, 1s);
+ else
+ StartConversationWithPlayer(CONVERSATION_MOONFIRE_QUEST_CREDIT_DRUID);
+ }
+ }
+ else if (spellInfo->Id == SPELL_WRATH)
+ {
+ if (!_hitByMoonfire)
+ StartConversationWithPlayer(CONVERSATION_WRATH_PRE_COMBAT_DRUID);
+ }
+ }
+
+private:
+ bool _hitByMoonfire;
+ bool _moonfireInPandemicWindow;
+};
+
+CreatureAI* SparringPartnerEnhancedCombatTrainingSelector(Creature* creature)
+{
+ TempSummon* summon = creature->ToTempSummon();
+ if (!summon)
+ return new NullCreatureAI(creature);
+
+ Unit* summoner = summon->GetSummonerUnit();
+ if (!summoner)
+ return new NullCreatureAI(creature);
+
+ Player* player = summoner->ToPlayer();
+ if (!player)
+ return new NullCreatureAI(creature);
+
+ switch (player->GetClass())
+ {
+ case CLASS_WARRIOR:
+ return new npc_sparring_partner_enhanced_combat_training_warrior(creature);
+ case CLASS_PALADIN:
+ return new npc_sparring_partner_enhanced_combat_training_paladin(creature);
+ case CLASS_ROGUE:
+ return new npc_sparring_partner_enhanced_combat_training_rogue(creature);
+ case CLASS_PRIEST:
+ return new npc_sparring_partner_enhanced_combat_training_priest(creature);
+ case CLASS_SHAMAN:
+ return new npc_sparring_partner_enhanced_combat_training_shaman(creature);
+ case CLASS_MAGE:
+ return new npc_sparring_partner_enhanced_combat_training_mage(creature);
+ case CLASS_WARLOCK:
+ return new npc_sparring_partner_enhanced_combat_training_warlock(creature);
+ case CLASS_MONK:
+ return new npc_sparring_partner_enhanced_combat_training_monk(creature);
+ case CLASS_DRUID:
+ return new npc_sparring_partner_enhanced_combat_training_druid(creature);
+ default:
+ return new NullCreatureAI(creature);
+ }
+ if (creature->IsPrivateObject())
+ return new npc_survivors_beach_leave_private<PATH_KEE_LA_STANDING, 7 * IN_MILLISECONDS>(creature);
+ return new NullCreatureAI(creature);
+};
+
+struct at_aggro_radius_check_enhanced_combat_tactics : AreaTriggerAI
+{
+ at_aggro_radius_check_enhanced_combat_tactics(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { }
+
+ void OnUnitEnter(Unit* unit) override
+ {
+ Player* player = unit->ToPlayer();
+ if (!player)
+ return;
+
+ Unit* caster = at->GetCaster();
+ if (!caster)
+ {
+ at->RemoveFromWorld();
+ return;
+ }
+
+ caster->SetFacingToObject(player);
+
+ switch (player->GetClass())
+ {
+ case CLASS_WARRIOR:
+ caster->CastSpell(player, SPELL_CHARGE_KNOCKBACK_WARRIOR);
+ break;
+ case CLASS_PRIEST:
+ case CLASS_SHAMAN:
+ case CLASS_MAGE:
+ case CLASS_WARLOCK:
+ caster->CastSpell(player, SPELL_CHARGE_KNOCKBACK);
+ break;
+ case CLASS_DRUID:
+ caster->CastSpell(player, SPELL_CHARGE_KNOCKBACK_DRUID);
+ break;
+ default:
+ break;
+ }
+ }
+};
+
+// 320605 - Charge Knockback (DNT)
+class spell_knockback_charge_enhanced_training : public SpellScript
+{
+ void HandleLaunch(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+ }
+
+ void HandleEffect(SpellEffIndex effIndex)
+ {
+ Unit* caster = GetCaster();
+ if (!caster)
+ return;
+
+ Player* player = GetHitUnit()->ToPlayer();
+ if (!player)
+ return;
+
+ Conversation* conversation = Conversation::CreateConversation(GetSpellInfo()->GetEffect(effIndex).MiscValue, player, *player, player->GetGUID(), nullptr, false);
+ if (!conversation)
+ return;
+
+ conversation->AddActor(ACTOR_ID_ALLIANCE_ENHANCED_TRAINING, 0, player->GetTeam() == ALLIANCE ? caster->GetGUID() : ObjectGuid::Empty);
+ conversation->AddActor(ACTOR_ID_HORDE_ENHANCED_TRAINING, 1, player->GetTeam() == ALLIANCE ? ObjectGuid::Empty : caster->GetGUID());
+ conversation->Start();
+ }
+
+ void Register() override
+ {
+ OnEffectLaunchTarget += SpellEffectFn(spell_knockback_charge_enhanced_training::HandleLaunch, EFFECT_1, SPELL_EFFECT_CREATE_PRIVATE_CONVERSATION);
+ OnEffectHitTarget += SpellEffectFn(spell_knockback_charge_enhanced_training::HandleEffect, EFFECT_1, SPELL_EFFECT_CREATE_PRIVATE_CONVERSATION);
+ }
+};
+
+enum NorthboundData
+{
+ CONVERSATION_QUEST_NORTHBOUND_ACCEPT_ALLIANCE = 12066,
+ CONVERSATION_QUEST_NORTHBOUND_ACCEPT_HORDE = 14499,
+
+ POINT_LEADER_RUN = 0,
+
+ ACTOR_ID_0_NORTHBOUND_ACCEPT_ALLIANCE = 71310,
+ ACTOR_ID_1_NORTHBOUND_ACCEPT_ALLIANCE = 71297,
+ ACTOR_ID_0_NORTHBOUND_ACCEPT_HORDE = 79890,
+ ACTOR_ID_1_NORTHBOUND_ACCEPT_HORDE = 79888,
+ ACTOR_ID_0_NORTHBOUND_AREATRIGGER_ALLIANCE = 71317,
+ ACTOR_ID_1_NORTHBOUND_AREATRIGGER_HORDE = 76319,
+
+ QUEST_NORTHBOND_ALLIANCE = 55173,
+ QUEST_NORTHBOND_HORDE = 59935,
+
+ SPELL_SUMMON_ADMIRAL_GARRICK_GUARDIAN_NORTHBOUND = 305660,
+ SPELL_SUMMON_WARLORD_GRIMAXE_GUARDIAN_NORTHBOUND = 344382,
+ SPELL_LINGER_NORTHBOUND_ALLIANCE = 305665,
+ SPELL_LINGER_NORTHBOUND_HORDE = 344385,
+};
+
+Position const GarrickQuillboarBriarpatchPosition = { -142.62154f, -2641.0364f, 48.775497f };
+Position const GrimaxeQuillboarBriarpatchPosition = { -142.56076f, -2640.9915f, 48.755478f };
+
+// 165360 - Alliance Survivor
+// This script is used by Captian Garrick Follower for Northbound quest
+struct npc_leader_northbound : public ScriptedAI
+{
+ npc_leader_northbound(Creature* creature) : ScriptedAI(creature), _conversationId(0), _actorIdOne(0), _actorIdTwo(0), _lingerSpellId(0), _guardianSpellId(0) {}
+
+ void JustAppeared() override
+ {
+ Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID);
+ if (!player)
+ return;
+
+ player->UpdateVisibilityForPlayer();
+
+ Creature* survivor = FindCreatureIgnorePhase(player, player->GetTeam() == ALLIANCE ? "alaria_standing_abandoned_camp" : "wonza_standing_abandoned_camp", 5.0f);
+ if (!survivor)
+ return;
+
+ if (player->GetTeam() == ALLIANCE)
+ {
+ _conversationId = CONVERSATION_QUEST_NORTHBOUND_ACCEPT_ALLIANCE;
+ _actorIdOne = ACTOR_ID_0_NORTHBOUND_ACCEPT_ALLIANCE;
+ _actorIdTwo = ACTOR_ID_1_NORTHBOUND_ACCEPT_ALLIANCE;
+ _runToPosition = GarrickQuillboarBriarpatchPosition;
+ _lingerSpellId = SPELL_LINGER_NORTHBOUND_ALLIANCE;
+ _guardianSpellId = SPELL_SUMMON_ADMIRAL_GARRICK_GUARDIAN_NORTHBOUND;
+ }
+ else
+ {
+ _conversationId = CONVERSATION_QUEST_NORTHBOUND_ACCEPT_HORDE;
+ _actorIdOne = ACTOR_ID_0_NORTHBOUND_ACCEPT_HORDE;
+ _actorIdTwo = ACTOR_ID_1_NORTHBOUND_ACCEPT_HORDE;
+ _runToPosition = GrimaxeQuillboarBriarpatchPosition;
+ _lingerSpellId = SPELL_LINGER_NORTHBOUND_HORDE;
+ _guardianSpellId = SPELL_SUMMON_WARLORD_GRIMAXE_GUARDIAN_NORTHBOUND;
+ }
+
+ Conversation* conversation = Conversation::CreateConversation(_conversationId, player, *player, player->GetGUID(), nullptr, false);
+ if (!conversation)
+ return;
+
+ conversation->AddActor(0, 0, player->GetGUID());
+ conversation->AddActor(_actorIdOne, 1, me->GetGUID());
+ conversation->AddActor(_actorIdTwo, 2, survivor->GetGUID());
+ conversation->Start();
+ }
+
+ void IsSummonedBy(WorldObject* summoner) override
+ {
+ Player* player = summoner->ToPlayer();
+ if (!player)
+ return;
+
+ _playerGUID = player->GetGUID();
+
+ _events.ScheduleEvent(EVENT_FOLLOW_PLAYER, 3s);
+ }
+
+ void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
+ {
+ if (spellInfo->Id == _lingerSpellId)
+ {
+ me->GetMotionMaster()->Remove(FOLLOW_MOTION_TYPE);
+ me->GetMotionMaster()->MovePoint(POINT_LEADER_RUN, _runToPosition, false);
+ }
+ return;
+ }
+
+ void MovementInform(uint32 uiType, uint32 uiId) override
+ {
+ if (uiType != POINT_MOTION_TYPE)
+ return;
+
+ if (uiId != POINT_LEADER_RUN)
+ return;
+
+ me->SetFacingTo(6.0737457275390625);
+
+ if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
+ {
+ player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
+ player->RemoveAura(_guardianSpellId);
+ player->UpdateVisibilityForPlayer();
+ }
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_FOLLOW_PLAYER:
+ if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
+ me->GetMotionMaster()->MoveFollow(player, 0.0f, float(M_PI / 4.0f));
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+private:
+ EventMap _events;
+ ObjectGuid _playerGUID;
+ uint32 _conversationId;
+ uint32 _actorIdOne;
+ uint32 _actorIdTwo;
+ Position _runToPosition;
+ uint32 _lingerSpellId;
+ uint32 _guardianSpellId;
+};
+
+// 55173 - Northbound
+// 59935 - Northbound
+class quest_northbound : public QuestScript
+{
+public:
+ quest_northbound(char const* script) : QuestScript(script) { }
+
+ void HandleQuestStatusChange(Player* player, QuestStatus newStatus, uint32 summonSpellId)
+ {
+ switch (newStatus)
+ {
+ case QUEST_STATUS_INCOMPLETE:
+ player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
+ player->CastSpell(player, summonSpellId);
+ break;
+ case QUEST_STATUS_NONE:
+ player->RemoveAura(summonSpellId);
+ player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT);
+ player->UpdateVisibilityForPlayer();
+ break;
+ default:
+ break;
+ }
+ }
+};
+
+// 55173 - Northbound
+class quest_northbound_alliance : public quest_northbound
+{
+public:
+ quest_northbound_alliance() : quest_northbound("quest_northbound_alliance") { }
+
+ void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
+ {
+ HandleQuestStatusChange(player, newStatus, SPELL_SUMMON_ADMIRAL_GARRICK_GUARDIAN_NORTHBOUND);
+ }
+};
+
+// 59935 - Northbound
+class quest_northbound_horde : public quest_northbound
+{
+public:
+ quest_northbound_horde() : quest_northbound("quest_northbound_horde") { }
+
+ void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
+ {
+ HandleQuestStatusChange(player, newStatus, SPELL_SUMMON_WARLORD_GRIMAXE_GUARDIAN_NORTHBOUND);
+ }
+};
+
+// 305661 - Summon Admiral Garrick Guardian Summons Alliance Entry: 165360
+// 344383 - Summon Admiral Garrick Guardian Summons Horde Entry: 175034
+class spell_summon_leader_northbound : public SpellScript
+{
+ // @TODO: drop after TARGET_UNK_142 impl
+
+ void SelectTarget(WorldObject*& target)
+ {
+ Player* caster = GetCaster()->ToPlayer();
+ if (!caster)
+ return;
+
+ Creature* survivor = FindCreatureIgnorePhase(caster, caster->GetTeam() == ALLIANCE ? "garrick_camp" : "grimaxe_camp", 5.0f);
+ if (!survivor)
+ return;
+
+ target = survivor;
+ }
+
+ void Register() override
+ {
+ OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_summon_leader_northbound::SelectTarget, EFFECT_0, TARGET_DEST_NEARBY_ENTRY_OR_DB);
+ }
+};
+
+struct at_northbound_linger : AreaTriggerAI
+{
+ at_northbound_linger(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { }
+
+ void OnUnitEnter(Unit* unit) override
+ {
+ Player* player = unit->ToPlayer();
+ if (!player)
+ return;
+
+ if (player->GetTeam() == ALLIANCE)
+ {
+ if (player->GetQuestStatus(QUEST_NORTHBOND_ALLIANCE) != QUEST_STATUS_COMPLETE)
+ return;
+
+ if (!player->HasAura(SPELL_SUMMON_ADMIRAL_GARRICK_GUARDIAN_NORTHBOUND))
+ return;
+
+ if (player->HasAura(SPELL_LINGER_NORTHBOUND_ALLIANCE))
+ return;
+
+ player->CastSpell(player, SPELL_LINGER_NORTHBOUND_ALLIANCE);
+ }
+ else
+ {
+ if (player->GetQuestStatus(QUEST_NORTHBOND_HORDE) != QUEST_STATUS_COMPLETE)
+ return;
+
+ if (!player->HasAura(SPELL_SUMMON_WARLORD_GRIMAXE_GUARDIAN_NORTHBOUND))
+ return;
+
+ if (player->HasAura(SPELL_LINGER_NORTHBOUND_HORDE))
+ return;
+
+ player->CastSpell(player, SPELL_LINGER_NORTHBOUND_HORDE);
+ }
+ }
+};
+
+// @TODO: drop
+// 305665 - Scene Linger (DNT)
+// 344385 - Scene Linger (DNT)
+class spell_scene_linger_northbound: public SpellScript
+{
+ void HandleLaunch(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+ }
+
+ void HandleEffect(SpellEffIndex effIndex)
+ {
+ Player* player = GetHitUnit()->ToPlayer();
+ if (!player)
+ return;
+
+ Creature* scout = FindCreatureIgnorePhase(player, player->GetTeam() == ALLIANCE ? "huxworth_briarpatch" : "dawntracker_briarpatch", 100.0f);
+ if (!scout)
+ return;
+
+ Conversation* conversation = Conversation::CreateConversation(GetSpellInfo()->GetEffect(effIndex).MiscValue, player, *player, player->GetGUID(), nullptr, false);
+ if (!conversation)
+ return;
+
+ conversation->AddActor(ACTOR_ID_0_NORTHBOUND_AREATRIGGER_ALLIANCE, 0, player->GetTeam() == ALLIANCE ? scout->GetGUID() : ObjectGuid::Empty);
+ conversation->AddActor(ACTOR_ID_1_NORTHBOUND_AREATRIGGER_HORDE, 1, player->GetTeam() == ALLIANCE ? ObjectGuid::Empty : scout->GetGUID());
+ conversation->Start();
+ }
+
+ void Register() override
+ {
+ OnEffectLaunchTarget += SpellEffectFn(spell_scene_linger_northbound::HandleLaunch, EFFECT_2, SPELL_EFFECT_CREATE_PRIVATE_CONVERSATION);
+ OnEffectHitTarget += SpellEffectFn(spell_scene_linger_northbound::HandleEffect, EFFECT_2, SPELL_EFFECT_CREATE_PRIVATE_CONVERSATION);
+ }
+};
+
void AddSC_zone_exiles_reach()
{
// Ship
@@ -2205,7 +3824,6 @@ void AddSC_zone_exiles_reach()
new quest_brace_for_impact();
new player_exiles_reach_ship_crash();
new scene_alliance_and_horde_ship();
-
// Beach
RegisterSpellScript(spell_knocked_down_exiles_reach_beach);
new scene_alliance_and_horde_crash();
@@ -2235,7 +3853,6 @@ void AddSC_zone_exiles_reach()
new quest_finding_the_lost_expedition_alliance();
new quest_finding_the_lost_expedition_horde();
RegisterSpellScript(spell_summon_survivor_beach);
-
// Abandoned Camp
new GenericCreatureScript<npc_captain_abandoned_camp_exiles_reach<QUEST_COOKING_MEAT_ALLIANCE, CONVERSATION_QUEST_COOKING_MEAT_ACCEPT_ALLIANCE>>("npc_captain_garrick_abandoned_camp");
new GenericCreatureScript<npc_captain_abandoned_camp_exiles_reach<QUEST_COOKING_MEAT_HORDE, CONVERSATION_QUEST_COOKING_MEAT_ACCEPT_HORDE>>("npc_warlord_grimaxe_abandoned_camp");
@@ -2243,4 +3860,17 @@ void AddSC_zone_exiles_reach()
new quest_cooking_meat_horde();
RegisterAreaTriggerAI(areatrigger_find_the_lost_expedition);
RegisterAreaTriggerAI(areatrigger_find_the_lost_expedition_follower);
-}
+ // Quest Enhanced Combat Tactics
+ new quest_enhanced_combat_tactics();
+ RegisterSpellScript(spell_summon_combat_trainer);
+ new FactoryCreatureScript<CreatureAI, &SparringPartnerEnhancedCombatTrainingSelector>("npc_sparring_partner_combat_training");
+ RegisterAreaTriggerAI(at_aggro_radius_check_enhanced_combat_tactics);
+ RegisterSpellScript(spell_knockback_charge_enhanced_training);
+ // Quest Northbound
+ RegisterCreatureAI(npc_leader_northbound);
+ new quest_northbound_alliance();
+ new quest_northbound_horde();
+ RegisterSpellScript(spell_summon_leader_northbound);
+ RegisterAreaTriggerAI(at_northbound_linger);
+ RegisterSpellScript(spell_scene_linger_northbound);
+};