diff options
| -rw-r--r-- | sql/updates/world/master/2024_01_09_05_world.sql | 269 | ||||
| -rw-r--r-- | src/server/scripts/ExilesReach/zone_exiles_reach.cpp | 1000 |
2 files changed, 1127 insertions, 142 deletions
diff --git a/sql/updates/world/master/2024_01_09_05_world.sql b/sql/updates/world/master/2024_01_09_05_world.sql new file mode 100644 index 00000000000..d29628ecdb7 --- /dev/null +++ b/sql/updates/world/master/2024_01_09_05_world.sql @@ -0,0 +1,269 @@ +-- Set by TC Devs +-- New areatrigger +SET @ID := 58; -- One required +SET @SPAWNID := 58; -- One required +SET @CREATEPROPID := 46; -- One required + +-- Briar Patch + +-- Create new serverside areatrigger for leaving Quillboar Briarpatch conversation "Used Phase 13878 Not sure if right phase" +DELETE FROM `areatrigger` WHERE `SpawnId`=@SPAWNID; +INSERT INTO `areatrigger` (`SpawnId`,`AreaTriggerCreatePropertiesId`,`IsCustom`,`MapId`,`PosX`,`PosY`,`PosZ`,`Orientation`,`PhaseUseFlags`,`PhaseId`,`PhaseGroup`,`ScriptName`,`Comment`) VALUES +(@SPAWNID,@CREATEPROPID,1,2175,71.47106,-2463.159,87.024765,0.79634166,0,0,0,'at_briarpatch_to_plains','Exiles Reach - Down with Quilboar quest complete'); + +DELETE FROM `areatrigger_create_properties` WHERE `Id`=@CREATEPROPID AND `IsCustom`=1; +INSERT INTO `areatrigger_create_properties` (`Id`, `IsCustom`, `AreaTriggerId`, `IsAreatriggerCustom`, `Flags`, `MoveCurveId`, `ScaleCurveId`, `MorphCurveId`, `FacingCurveId`, `AnimId`, `AnimKitId`, `DecalPropertiesId`, `TimeToTarget`, `TimeToTargetScale`, `Shape`, `ShapeData0`, `ShapeData1`, `ShapeData2`, `ShapeData3`, `ShapeData4`, `ShapeData5`, `ShapeData6`, `ShapeData7`, `ScriptName`, `VerifiedBuild`) VALUES +(@CREATEPROPID, 1, @ID, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1,4,60,30,4,60,30,0,0, '', 0); + +-- Add new serverside areatrigger for leaving Quillboar Brarpatch to template +DELETE FROM `areatrigger_template` WHERE `Id`=@ID AND `IsCustom`=1; +INSERT INTO `areatrigger_template` (`Id`,`IsCustom`,`Flags`,`VerifiedBuild`) VALUES +(@ID,1,1,0); + +UPDATE `creature` SET `spawntimesecs`=120 WHERE `id` IN (151091,150237,150238,156676); +UPDATE `creature` SET `PhaseId`=15276 WHERE `guid` IN (1051256,1051265); +UPDATE `creature` SET `StringId`='briarpatch_bunny_alliance' WHERE `guid` IN (1051256); +DELETE FROM `creature` WHERE `Id` IN (167008,154301); + +UPDATE `creature_template` SET `flags_extra`=128 WHERE `entry`=155371; +UPDATE `creature_template` SET `ScriptName`="npc_geolord_grekog" WHERE `entry`=151091; +UPDATE `creature_template` SET `ScriptName`="npc_cork_fizzlepop_briarpatch" WHERE `entry`=167008; +UPDATE `creature_template` SET `ScriptName`="npc_lindie_springstock_briarpatch" WHERE `entry`=154301; +UPDATE `creature_template` SET `ScriptName`="npc_quilboar_warrior" WHERE `entry`=150237; +UPDATE `creature_template` SET `ScriptName`="npc_quilboar_geomancer" WHERE `entry`=150238; +UPDATE `creature_template` SET `ScriptName`="npc_ogre_overseer" WHERE `entry`=156676; +UPDATE `creature_template` SET `ScriptName`="npc_captain_garrick" WHERE `entry`=156280; + +UPDATE `creature_template_movement` SET `Ground`=1, `Flight`=0 WHERE `CreatureId` IN (167008,154301); + +DELETE FROM `creature_template_movement` WHERE `CreatureId`=155371; +INSERT INTO `creature_template_movement` (`CreatureId`,`Ground`,`Swim`,`Flight`,`Rooted`,`Chase`,`Random`,`InteractionPauseTimer`) VALUES +(155371,0,0,1,1,0,0,0); + +DELETE FROM `phase_area` WHERE `AreaId`=10424 AND `PhaseId` IN (15314,15276); +INSERT INTO `phase_area` (`AreaId`,`PhaseId`,`Comment`) VALUES +(10424,15314, 'Cosmetic - NPE - Cork Fizzlepop before quest 59938 complete'), +(10424,15276, 'Cosmetic - NPE - Lindie Springstock before quest 55186 complete'); + +DELETE FROM `phase_name` WHERE `ID` IN (15314,15276); +INSERT INTO `phase_name` (`ID`,`Name`) VALUES +(15276,'Cosmetic - NPE - Lindie Springstock before quest 55186 complete'), +(15314,'Cosmetic - NPE - Cork Fizzlepop before quest 59938 complete'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=26 AND `SourceGroup` IN (15314,15276) AND `SourceEntry`=10424; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(26,15314,10424,0,0,47,0,59938,9,0,0,0,0,'','Apply Phase 15314 if Quest 59938 (Down with the Quilboar) is not taken | in progress'), +(26,15314,10424,0,0,6,0,67,0,0,0,0,0,'','Apply Phase 15314 if team is Horde'), +(26,15276,10424,0,0,47,0,55186,9,0,0,0,0,'','Apply Phase 15276 if Quest 55186 (Down with the Quilboar) is not taken | in progress'), +(26,15276,10424,0,0,6,0,469,0,0,0,0,0,'','Apply Phase 15276 if team is Alliance'); + +-- Conversation data for Geolord Grek'og +DELETE FROM `conversation_actors` WHERE `ConversationId` IN (13712); +INSERT INTO `conversation_actors` (`ConversationId`,`ConversationActorId`,`ConversationActorGuid`,`Idx`,`CreatureId`,`CreatureDisplayInfoId`,`NoActorObject`,`ActivePlayerObject`,`VerifiedBuild`) VALUES +(13712,70670,1051258,0,0,0,0,0,52649), -- Geolord Grek'og +(13712,71238,0,1,0,0,0,0,52649), -- Lindie Springstock +(13712,75976,0,2,0,0,0,0,52649); -- Cork Fizzlepop + +DELETE FROM `conversation_line_template` WHERE `Id` IN (34175,34176,36346); +INSERT INTO `conversation_line_template` (`Id`,`UiCameraID`,`ActorIdx`,`Flags`,`VerifiedBuild`) VALUES +(34175,0,0,0,52649), +(34176,0,1,0,52649), +(36346,0,2,0,52649); + +DELETE FROM `conversation_template` WHERE `Id` IN (13712); +INSERT INTO `conversation_template` (`Id`,`FirstLineId`,`TextureKitId`,`Flags`,`ScriptName`,`VerifiedBuild`) VALUES +(13712,34175,0,0x04,'',52649); + +-- Conversation entering plains +DELETE FROM `conversation_actors` WHERE `ConversationId` IN (12076,14514); +INSERT INTO `conversation_actors` (`ConversationId`,`ConversationActorId`,`ConversationActorGuid`,`Idx`,`CreatureId`,`CreatureDisplayInfoId`,`NoActorObject`,`ActivePlayerObject`,`VerifiedBuild`) VALUES +(12076,71328,8000019,0,0,0,0,0,52649), -- Lindie Springstock +(12076,71330,8000018,1,0,0,0,0,52649), -- Captain Garrick +(14514,75979,8000016,0,0,0,0,0,52649), -- Cork Fizzlepop +(14514,75977,8000015,1,0,0,0,0,52649); -- Warlord Breka Grimaxe + +DELETE FROM `conversation_line_template` WHERE `Id` IN (29386,29387,29388,36347,36348,36349); +INSERT INTO `conversation_line_template` (`Id`,`UiCameraID`,`ActorIdx`,`Flags`,`VerifiedBuild`) VALUES +(29386,0,0,0,52649), +(29387,0,1,0,52649), +(29388,0,0,0,52649), +(36347,0,0,0,52649), +(36348,0,1,0,52649), +(36349,0,0,0,52649); + +DELETE FROM `conversation_template` WHERE `Id` IN (12076,14514); +INSERT INTO `conversation_template` (`Id`,`FirstLineId`,`TextureKitId`,`ScriptName`,`VerifiedBuild`) VALUES +(12076,29386,0,'',52649), +(14514,36347,0,'',52649); + +-- Quest data +DELETE FROM `creature_queststarter` WHERE `id`=154327 AND `quest` IN (55184,55186); +DELETE FROM `creature_queststarter` WHERE `id`=166996 AND `quest` IN (59938,59939); +INSERT INTO `creature_queststarter` (`id`, `quest`, `VerifiedBuild`) VALUES +(154327, 55186, 52649), -- Down with the Quilboar accept from Austin Huxworth +(154327, 55184, 52649), -- Forbidden Quilboar Necromancy accept from Austin Huxworth +(166996, 59938, 52649), -- Down with the Quilboar accept from Mithdran Dawntracker +(166996, 59939, 52649); -- Forbidden Quilboar Necromancy accept from Mithdran Dawntracker + +DELETE FROM `creature_questender` WHERE `id`=149899 AND `quest` IN (55186); +DELETE FROM `creature_questender` WHERE `id`=149915 AND `quest` IN (55184); +DELETE FROM `creature_questender` WHERE `id`=167019 AND `quest` IN (59938); +DELETE FROM `creature_questender` WHERE `id`=167020 AND `quest` IN (59939); +INSERT INTO `creature_questender` (`id`, `quest`, `VerifiedBuild`) VALUES +(149899, 55186, 52649), -- Down with the Quilboar turn in to Lindie Springstock +(149915, 55184, 52649), -- Forbidden Quilboar Necromancy turn in to Austin Huxworth +(167019, 59938, 52649), -- Down with the Quilboar turn in to Cork Fizzlepop +(167020, 59939, 52649); -- Forbidden Quilboar Necromancy turn in to Mithdran Dawntracker + +-- Condition for source Quest available condition type Quest rewarded +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=19 AND `SourceGroup`=0 AND `SourceEntry` IN (55186,55184,59938,59939) AND `SourceId`=0; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(19, 0, 55186, 0, 0, 8, 0, 55173, 0, 0, 0, 0, 0, '', 'AND0 Quest Down with the Quilboar available if quest Northbound has been rewarded Alliance.'), +(19, 0, 55186, 0, 0, 15, 0, 4, 0, 0, 1, 0, 0, '', 'AND0 Quest Down with the Quilboar available if player is not a Hunter Alliance.'), +(19, 0, 55186, 0, 1, 8, 0, 59342, 0, 0, 0, 0, 0, '', 'OR1 Quest Down with the Quilboar available if quest Taming the Wilds has been rewarded Alliance.'), +(19, 0, 55184, 0, 0, 8, 0, 55173, 0, 0, 0, 0, 0, '', 'AND0 Quest Forbidden Quilboar Necromancy available if quest Northbound has been rewarded Alliance.'), +(19, 0, 55184, 0, 0, 15, 0, 4, 0, 0, 1, 0, 0, '', 'AND0 Quest Forbidden Quilboar Necromancy available if player is not a Hunter Alliance.'), +(19, 0, 55184, 0, 1, 8, 0, 59342, 0, 0, 0, 0, 0, '', 'OR1 Quest Forbidden Quilboar Necromancy available if quest Taming the Wilds has been rewarded Alliance.'), +(19, 0, 59938, 0, 0, 8, 0, 59935, 0, 0, 0, 0, 0, '', 'AND0 Quest Down with the Quilboar available if quest Northbound has been rewarded Horde.'), +(19, 0, 59938, 0, 0, 15, 0, 4, 0, 0, 1, 0, 0, '', 'AND0 Quest Down with the Quilboar available if player is not a Hunter Horde.'), +(19, 0, 59938, 0, 1, 8, 0, 59937, 0, 0, 0, 0, 0, '', 'OR1 Quest Down with the Quilboar available if quest Taming the Wilds has been rewarded Horde.'), +(19, 0, 59939, 0, 0, 8, 0, 59935, 0, 0, 0, 0, 0, '', 'AND0 Quest Forbidden Quilboar Necromancy available if quest Northbound has been rewarded Horde.'), +(19, 0, 59939, 0, 0, 15, 0, 4, 0, 0, 1, 0, 0, '', 'AND0 Quest Forbidden Quilboar Necromancy available if player is not a Hunter Horde.'), +(19, 0, 59939, 0, 1, 8, 0, 59937, 0, 0, 0, 0, 0, '', 'OR1 Quest Forbidden Quilboar Necromancy available if quest Taming the Wilds has been rewarded Horde.'); + +DELETE FROM `quest_template_addon` WHERE `ID` IN (55186,55184,59938,59939); +INSERT INTO `quest_template_addon` (`ID`,`AllowableClasses`,`PrevQuestID`,`NextQuestID`,`ScriptName`) VALUES +(55186,0,0,0,'quest_briarpatch_alliance'), -- Alliance +(55184,0,0,0,'quest_briarpatch_alliance'), -- Alliance +(59938,0,0,0,'quest_briarpatch_horde'), -- Horde +(59939,0,0,0,'quest_briarpatch_horde'); -- Horde + +-- Spell data +DELETE FROM `spell_script_names` WHERE `spell_id` IN (298984,325309); +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(298984,'spell_validated_quest_accept_briarpatch_alliance'), +(325309,'spell_validated_quest_accept_briarpatch_horde'); + +-- Conversation data +DELETE FROM `conversation_actors` WHERE `ConversationId` IN (12073,14513); +INSERT INTO `conversation_actors` (`ConversationId`,`ConversationActorId`,`ConversationActorGuid`,`Idx`,`CreatureId`,`CreatureDisplayInfoId`,`NoActorObject`,`ActivePlayerObject`,`VerifiedBuild`) VALUES +(12073,71326,0,0,0,0,0,0,45745), -- Austin Huxworth +(12073,71327,0,1,0,0,0,0,45745), -- Captain Garrick +(14513,76330,0,0,0,0,0,0,45745), -- Mithdran Dawntracker +(14513,76330,0,1,0,0,0,0,45745); -- Warlord Grimaxe + +DELETE FROM `conversation_line_template` WHERE `Id` IN (29375,29376,34174,36343,36344,36345); +INSERT INTO `conversation_line_template` (`Id`,`UiCameraID`,`ActorIdx`,`Flags`,`VerifiedBuild`) VALUES +(29375,0,0,0,45745), -- Alliance +(29376,0,1,0,45745), -- Alliance +(34174,0,0,0,45745), -- Alliance +(36343,0,0,0,45745), -- Horde +(36344,0,1,0,45745), -- Horde +(36345,0,0,0,45745); -- Horde + +DELETE FROM `conversation_template` WHERE `Id` IN (12073,14513); +INSERT INTO `conversation_template` (`Id`,`FirstLineId`,`TextureKitId`,`ScriptName`,`VerifiedBuild`) VALUES +(12073,29375,0,'',45745), +(14513,36343,0,'',45745); + +-- Creature text for Exile's Reach Briarpatch +DELETE FROM `creature_text` WHERE `CreatureID` IN (150237,156676) AND `GroupID` IN (0,1); +DELETE FROM `creature_text` WHERE `CreatureID` IN (150238) AND `GroupID` IN (0,1,2); +DELETE FROM `creature_text` WHERE `CreatureID` IN (154301,167008) AND `GroupID` IN (0); +INSERT INTO `creature_text` (`CreatureID`,`GroupID`,`ID`,`Text`,`Type`,`Language`,`Probability`,`Emote`,`Duration`,`Sound`,`BroadcastTextId`,`TextRange`,`comment`) VALUES +(150237, 0, 0, 'The geolord demands your demise!', 12, 0, 100, 0, 0, 150271, 176076, 0, 'Quilboar Warrior aggro'), +(150237, 0, 1, 'The ogres give us strength!', 12, 0, 100, 0, 0, 150276, 176074, 0, 'Quilboar Warrior aggro'), +(150237, 0, 2, 'Your blood will earn our reward!', 12, 0, 100, 0, 0, 150277, 176075, 0, 'Quilboar Warrior aggro'), +(150237, 0, 3, 'We serve the geolord!', 12, 0, 100, 0, 0, 150279, 176077, 0, 'Quilboar Warrior aggro'), +(150237, 0, 4, 'Witness our power!', 12, 0, 100, 0, 0, 150280, 176078, 0, 'Quilboar Warrior aggro'), +(150237, 0, 5, 'Death to the outsiders!', 12, 0, 100, 0, 0, 150281, 176079, 0, 'Quilboar Warrior aggro'), +(150237, 0, 6, 'Our thorns will strangle you!', 12, 0, 100, 0, 0, 150282, 176080, 0, 'Quilboar Warrior aggro'), +(150237, 0, 7, 'More sacrifices for the ritual!', 12, 0, 100, 0, 0, 150283, 176082, 0, 'Quilboar Warrior aggro'), +(150237, 1, 0, 'I return... to... the earth...', 12, 0, 100, 0, 0, 150284, 176083, 0, 'Quilboar Warrior death'), +(150237, 1, 1, 'Our tribe... will... survive...', 12, 0, 100, 0, 0, 150285, 176084, 0, 'Quilboar Warrior death'), +(150237, 1, 2, 'Ogres... will... kill you...', 12, 0, 100, 0, 0, 150286, 176085, 0, 'Quilboar Warrior death'), +(150237, 1, 3, 'The geolord... will not... lose...', 12, 0, 100, 0, 0, 150287, 176086, 0, 'Quilboar Warrior death'), +(150237, 1, 4, 'Thorns... take... you...', 12, 0, 100, 0, 0, 150288, 176088, 0, 'Quilboar Warrior death'), +(150238, 0, 0, 'The geolord demands your demise!', 12, 0, 100, 0, 0, 150271, 176076, 0, 'Quilboar Geomancer aggro'), +(150238, 0, 1, 'The ogres give us strength!', 12, 0, 100, 0, 0, 150276, 176074, 0, 'Quilboar Geomancer aggro'), +(150238, 0, 2, 'Your blood will earn our reward!', 12, 0, 100, 0, 0, 150277, 176075, 0, 'Quilboar Geomancer aggro'), +(150238, 0, 3, 'We serve the geolord!', 12, 0, 100, 0, 0, 150279, 176077, 0, 'Quilboar Geomancer aggro'), +(150238, 0, 4, 'Witness our power!', 12, 0, 100, 0, 0, 150280, 176078, 0, 'Quilboar Geomancer aggro'), +(150238, 0, 5, 'Death to the outsiders!', 12, 0, 100, 0, 0, 150281, 176079, 0, 'Quilboar Geomancer aggro'), +(150238, 0, 6, 'Our thorns will strangle you!', 12, 0, 100, 0, 0, 150282, 176080, 0, 'Quilboar Geomancer aggro'), +(150238, 0, 7, 'More sacrifices for the ritual!', 12, 0, 100, 0, 0, 150283, 176082, 0, 'Quilboar Geomancer aggro'), +(150238, 1, 0, 'I return... to... the earth...', 12, 0, 100, 0, 0, 150284, 176083, 0, 'Quilboar Geomancer death'), +(150238, 1, 1, 'Our tribe... will... survive...', 12, 0, 100, 0, 0, 150285, 176084, 0, 'Quilboar Geomancer death'), +(150238, 1, 2, 'Ogres... will... kill you...', 12, 0, 100, 0, 0, 150286, 176085, 0, 'Quilboar Geomancer death'), +(150238, 1, 3, 'The geolord... will not... lose...', 12, 0, 100, 0, 0, 150287, 176086, 0, 'Quilboar Geomancer death'), +(150238, 1, 4, 'Thorns... take... you...', 12, 0, 100, 0, 0, 150288, 176088, 0, 'Quilboar Geomancer death'), +(150238, 2, 0, '%s attempts to run away in fear!', 16, 0, 100, 0, 0, 0, 0, 0, 'Quilboar Geomancer flee'), +(156676, 0, 0, 'New sacrifice!', 12, 0, 100, 0, 0, 150269, 178950, 0, 'Ogre Overseer aggro'), +(156676, 1, 0, 'Sacrifice... for... ritual...', 12, 0, 100, 0, 0, 150271, 178951, 0, 'Ogre Overseer death'), +(154301, 0, 0, 'I knew the Alliance would rescue us! Let''s get out of here!', 12, 0, 100, 0, 0, 152861, 176943, 0, 'Lindie Springstock rescued'), +(167008, 0, 0, 'And that''s why I always bet on the Horde! Let''s scram!', 12, 0, 100, 0, 0, 156983, 196265, 0, 'Lindie Springstock rescued'); + +-- Spellscript +DELETE FROM `spell_script_names` WHERE `spell_id`=313265; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(313265, 'spell_quilboar_sleep_dnt'); + +-- Fix Ref loot "Thanks Meji" +UPDATE `reference_loot_template` SET `GroupId`=1 WHERE `Entry`=10100; + +-- Fix previous commits + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=26 AND `SourceGroup` IN (15315,15318,13779,13776) AND `SourceEntry` = 0; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(26,15315,0,0,0,47,0,59938,66,0,0,0,0,'','Apply Phase 15315 if Quest 59938 (Down with the Quilboar) is completed or rewarded'), +(26,15318,0,0,0,47,0,59938,66,0,0,0,0,'','Apply Phase 15318 if Quest 59938 (Down with the Quilboar) is completed or rewarded'), +(26,13779,0,0,0,47,0,55186,66,0,0,0,0,'','Apply Phase 13779 if Quest 55186 (Down with the Quilboar) is completed or rewarded'), +(26,13776,0,0,0,47,0,55186,66,0,0,0,0,'','Apply Phase 13776 if Quest 55186 (Down with the Quilboar) is completed or rewarded'); + +-- Loot for Quilboar Warrior & Quilboar Geomancer +SET @ID := 150237; +UPDATE `creature_template_difficulty` SET `LootID`=@ID, GoldMin=4, GoldMax=20 WHERE `Entry` IN (@ID,@ID+1); +DELETE FROM `creature_loot_template` WHERE `Entry` IN (@ID); +INSERT INTO `creature_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(@ID,771,0,20,0,1,0,1,1,'Quilboar Warrior/Geomancer - Chipped Boar Tusk'), +(@ID,174811,0,20,0,1,0,1,1,'Quilboar Warrior/Geomancer - Stitched Cloth Tunic'), +(@ID,174812,0,20,0,1,0,1,1,'Quilboar Warrior/Geomancer - Stitched Leather Tunic'), +(@ID,174813,0,20,0,1,0,1,1,'Quilboar Warrior/Geomancer - Linked Mail Hauberk'), +(@ID,174814,0,20,0,1,0,1,1,'Quilboar Warrior/Geomancer - Dented Chestplate'), +(@ID,0,10100,15,0,1,0,1,1,'Quilboar Warrior/Geomancer - Poor Quality Table Level 1 to 5'); + +-- Conditions for class loot +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=1 AND `SourceGroup`=@ID; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(1,@ID,174811,0,0,15,0,400,0,0,0,0,0,'','Item drops for cloth wearer'), +(1,@ID,174811,0,0,47,0,58882,64,0,1,0,0,'','Item drops if quest 58882 is not rewarded'), +(1,@ID,174812,0,0,15,0,3592,0,0,0,0,0,'','Item drops for leather wearer'), +(1,@ID,174812,0,0,47,0,58882,64,0,1,0,0,'','Item drops if quest 58882 is not rewarded'), +(1,@ID,174813,0,0,15,0,4168,0,0,0,0,0,'','Item drops for mail wearer'), +(1,@ID,174813,0,0,47,0,58882,64,0,1,0,0,'','Item drops if quest 58882 is not rewarded'), +(1,@ID,174814,0,0,15,0,35,0,0,0,0,0,'','Item drops for plate wearer'), +(1,@ID,174814,0,0,47,0,58882,64,0,1,0,0,'','Item drops if quest 58882 is not rewarded'); + +DELETE FROM `quest_template` WHERE `ID`=58882; +INSERT INTO `quest_template` (`ID`,`QuestType`,`RewardXPMultiplier`,`RewardMoneyMultiplier`,`RewardArtifactXPMultiplier`,`Flags`,`LogTitle`) VALUES +(58882,2,1,1,1,1024, '[Hidden Tracker] Quilboar Briarpatch Chestpiece Dropped'); + +-- fix due to accidental removal +DELETE FROM `quest_template` WHERE `ID`=58904; +INSERT INTO `quest_template` (`ID`, `QuestType`, `QuestPackageID`, `ContentTuningID`, `QuestSortID`, `QuestInfoID`, `SuggestedGroupNum`, `RewardNextQuest`, `RewardXPDifficulty`, `RewardXPMultiplier`, `RewardMoneyDifficulty`, `RewardMoneyMultiplier`, `RewardBonusMoney`, `RewardDisplaySpell1`, `RewardDisplaySpell2`, `RewardDisplaySpell3`, `RewardSpell`, `RewardHonor`, `RewardKillHonor`, `StartItem`, `RewardArtifactXPDifficulty`, `RewardArtifactXPMultiplier`, `RewardArtifactCategoryID`, `Flags`, `FlagsEx`, `FlagsEx2`, `RewardItem1`, `RewardAmount1`, `RewardItem2`, `RewardAmount2`, `RewardItem3`, `RewardAmount3`, `RewardItem4`, `RewardAmount4`, `ItemDrop1`, `ItemDropQuantity1`, `ItemDrop2`, `ItemDropQuantity2`, `ItemDrop3`, `ItemDropQuantity3`, `ItemDrop4`, `ItemDropQuantity4`, `RewardChoiceItemID1`, `RewardChoiceItemQuantity1`, `RewardChoiceItemDisplayID1`, `RewardChoiceItemID2`, `RewardChoiceItemQuantity2`, `RewardChoiceItemDisplayID2`, `RewardChoiceItemID3`, `RewardChoiceItemQuantity3`, `RewardChoiceItemDisplayID3`, `RewardChoiceItemID4`, `RewardChoiceItemQuantity4`, `RewardChoiceItemDisplayID4`, `RewardChoiceItemID5`, `RewardChoiceItemQuantity5`, `RewardChoiceItemDisplayID5`, `RewardChoiceItemID6`, `RewardChoiceItemQuantity6`, `RewardChoiceItemDisplayID6`, `POIContinent`, `POIx`, `POIy`, `POIPriority`, `RewardTitle`, `RewardArenaPoints`, `RewardSkillLineID`, `RewardNumSkillUps`, `PortraitGiver`, `PortraitGiverMount`, `PortraitGiverModelSceneID`, `PortraitTurnIn`, `RewardFactionID1`, `RewardFactionValue1`, `RewardFactionOverride1`, `RewardFactionCapIn1`, `RewardFactionID2`, `RewardFactionValue2`, `RewardFactionOverride2`, `RewardFactionCapIn2`, `RewardFactionID3`, `RewardFactionValue3`, `RewardFactionOverride3`, `RewardFactionCapIn3`, `RewardFactionID4`, `RewardFactionValue4`, `RewardFactionOverride4`, `RewardFactionCapIn4`, `RewardFactionID5`, `RewardFactionValue5`, `RewardFactionOverride5`, `RewardFactionCapIn5`, `RewardFactionFlags`, `RewardCurrencyID1`, `RewardCurrencyQty1`, `RewardCurrencyID2`, `RewardCurrencyQty2`, `RewardCurrencyID3`, `RewardCurrencyQty3`, `RewardCurrencyID4`, `RewardCurrencyQty4`, `AcceptedSoundKitID`, `CompleteSoundKitID`, `AreaGroupID`, `TimeAllowed`, `AllowableRaces`, `TreasurePickerID`, `Expansion`, `ManagedWorldStateID`, `QuestSessionBonus`, `LogTitle`, `LogDescription`, `QuestDescription`, `AreaDescription`, `PortraitGiverText`, `PortraitGiverName`, `PortraitTurnInText`, `PortraitTurnInName`, `QuestCompletionLog`, `VerifiedBuild`) VALUES +(58904, 2, 0, 0, 10833, 255, 0, 0, 5, 1, 5, 1, 219400, 0, 0, 0, 0, 0, 0, 174867, 0, 1, 0, 34082816, 32768, 4096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 890, 878, 0, 0, 18446744073709551615, 0, 7, 0, 0, 'Shards of Corruption', 'Collect $0oa Shards of Corruption.', '<You feel the pull of something dark and inhuman on your mind, it\'s writhing tendrils digging in, tugging at your sanity. You feel compelled to collect more shards... all of them.>', '', '', '', '', '', 'Locate the Idol of Iniquity.', 35435); + +-- Loot for Geolord Grek'og +SET @ID := 151091; +UPDATE `creature_template_difficulty` SET `LootID`=@ID, GoldMin=4, GoldMax=20 WHERE `Entry` IN (@ID); +DELETE FROM `creature_loot_template` WHERE `Entry` IN (@ID); +INSERT INTO `creature_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(@ID,771,0,100,0,1,0,1,1,'Geolord Grek''og - Chipped Boar Tusk'); + +UPDATE `creature_summoned_data` SET `DespawnOnQuestsRemoved`='59342,55186,55184' WHERE `CreatureID`=154327; -- Austin Huxworth +UPDATE `creature_summoned_data` SET `DespawnOnQuestsRemoved`='59937,59938,59939' WHERE `CreatureID`=166996; -- Mithdran Dawntracker + +DELETE FROM `creature_summoned_data` WHERE `CreatureID` IN(156662, 166997); +INSERT INTO `creature_summoned_data` (`CreatureID`, `DespawnOnQuestsRemoved`) VALUES +(156662, '55186,55184'), -- Garrick +(166997, '59938,59939'); -- Grimaxe diff --git a/src/server/scripts/ExilesReach/zone_exiles_reach.cpp b/src/server/scripts/ExilesReach/zone_exiles_reach.cpp index 68f8ac17418..231d6605ccc 100644 --- a/src/server/scripts/ExilesReach/zone_exiles_reach.cpp +++ b/src/server/scripts/ExilesReach/zone_exiles_reach.cpp @@ -24,6 +24,8 @@ #include "Player.h" #include "CellImpl.h" #include "Containers.h" +#include "GridNotifiers.h" +#include "GridNotifiersImpl.h" #include "MotionMaster.h" #include "ObjectAccessor.h" #include "ObjectMgr.h" @@ -38,6 +40,7 @@ #include "Transport.h" #include "Loot.h" #include "SpellHistory.h" +#include "WorldStateMgr.h" template<class privateAI, class publicAI> CreatureAI* GetPrivatePublicPairAISelector(Creature* creature) @@ -334,16 +337,6 @@ struct npc_sparring_partner_exiles_reach : public ScriptedAI _events.ScheduleEvent(EVENT_MOVE_TO_A_POSITION, 1s); } - void IsSummonedBy(WorldObject* summonerWO) override - { - Unit* summoner = summonerWO->ToUnit(); - - if (!summoner || !summoner->IsPlayer()) - return; - - _playerGUID = summoner->GetGUID(); - } - void EnterEvadeMode(EvadeReason /*why*/) override { if (!me->IsAlive()) @@ -367,8 +360,8 @@ struct npc_sparring_partner_exiles_reach : public ScriptedAI me->GetMotionMaster()->MovePoint(POSITION_SPARPOINT_READY, me->GetFirstCollisionPosition(2.0f, rand_norm() * static_cast<float>(2 * M_PI))); break; case POSITION_SPARPOINT_READY: - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) - me->SetFacingToObject(player); + if (Unit* owner = me->GetOwner()) + me->SetFacingToObject(owner); me->SetImmuneToPC(false); me->SetUninteractible(false); break; @@ -382,11 +375,11 @@ struct npc_sparring_partner_exiles_reach : public ScriptedAI if (pathId != _path) return; - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + if (Unit* owner = me->GetOwner()) { me->DespawnOrUnsummon(); - player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT); - player->CastSpell(player, SPELL_COMBAT_TRAINING_COMPLETE); + owner->CastSpell(owner, SPELL_UPDATE_PHASE_SHIFT); + owner->CastSpell(owner, SPELL_COMBAT_TRAINING_COMPLETE); } } @@ -401,7 +394,7 @@ struct npc_sparring_partner_exiles_reach : public ScriptedAI me->SetUninteractible(true); _events.CancelEvent(EVENT_JUMP_BEHIND); - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + if (Player* player = me->GetAffectingPlayer()) { me->SetFacingToObject(player); Talk(TALK_SPARING_COMPLETE, player); @@ -432,9 +425,9 @@ struct npc_sparring_partner_exiles_reach : public ScriptedAI void StartPrivateConversation(uint32 conversationId) { - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + if (Unit* owner = me->GetOwner()) { - Conversation* conversation = Conversation::CreateConversation(conversationId, player, *player, player->GetGUID(), nullptr, false); + Conversation* conversation = Conversation::CreateConversation(conversationId, owner, *owner, owner->GetGUID(), nullptr, false); conversation->AddActor(_actorId, _actorIndex, me->GetGUID()); conversation->Start(); } @@ -492,7 +485,6 @@ private: uint8 _actorIndex; uint32 _actorId; uint32 _path; - ObjectGuid _playerGUID; }; enum FirstMateStandYourGroundData @@ -1027,7 +1019,7 @@ public: } }; -CreatureAI* CaptainGarrickShipAISelector(Creature* creature) +CreatureAI* CaptainGarrickAISelector(Creature* creature) { if (creature->IsPrivateObject()) { @@ -1542,11 +1534,16 @@ struct npc_murloc_spearhunter_watershaper : public ScriptedAI { for (auto const& [playerGuid, loot] : me->m_personalLoot) { - for (LootItem const& lootItem : loot->items) + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGuid)) { - if (lootItem.itemid == ITEM_STITCHED_CLOTH_SHOES || lootItem.itemid == ITEM_STITCHED_LEATHER_BOOTS || lootItem.itemid == ITEM_LINKED_MAIL_BOOTS || lootItem.itemid == ITEM_DENTED_PLATE_BOOTS) - if (Player* player = ObjectAccessor::GetPlayer(*me, playerGuid)) + if (player->IsQuestRewarded(QUEST_MURLOC_HIDEAWAY_BOOTS_DROPPED)) + break; + + for (LootItem const& lootItem : loot->items) + { + if (lootItem.itemid == ITEM_STITCHED_CLOTH_SHOES || lootItem.itemid == ITEM_STITCHED_LEATHER_BOOTS || lootItem.itemid == ITEM_LINKED_MAIL_BOOTS || lootItem.itemid == ITEM_DENTED_PLATE_BOOTS) player->SetRewardedQuest(QUEST_MURLOC_HIDEAWAY_BOOTS_DROPPED); + } } } } @@ -1752,18 +1749,12 @@ struct npc_garrick_summoned_beach : public ScriptedAI { npc_garrick_summoned_beach(Creature* creature) : ScriptedAI(creature), _reachedCamp(false) {} - void IsSummonedBy(WorldObject* summoner) override + void IsSummonedBy(WorldObject* /*summoner*/) override { - Player* player = summoner->ToPlayer(); - if (!player) - return; - - _playerGUID = player->GetGUID(); - _events.ScheduleEvent(EVENT_INITIAL_SPAWN_CHECK, 1s); } - void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override + void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override { if (spellInfo->Id != SPELL_GARRICK_PING) return; @@ -1773,9 +1764,9 @@ struct npc_garrick_summoned_beach : public ScriptedAI _reachedCamp = true; - if (Player* player = caster->ToPlayer()) + if (Unit* owner = me->GetOwner()) { - Conversation* conversation = Conversation::CreateConversation(CONVERSATION_LINE_ESCORT_SURVIVOR_CAMP, player, *player, _playerGUID, nullptr, false); + Conversation* conversation = Conversation::CreateConversation(CONVERSATION_LINE_ESCORT_SURVIVOR_CAMP, owner, *owner, owner->GetGUID(), nullptr, false); conversation->AddActor(ACTOR_ID_ALLIANCE_SURVIVOR, 1, me->GetGUID()); conversation->Start(); @@ -1789,10 +1780,10 @@ struct npc_garrick_summoned_beach : public ScriptedAI if (uiType != POINT_MOTION_TYPE || uiId != POINT_CAMP_POSITION) return; - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + if (Unit* owner = me->GetOwner()) { - player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT); - player->RemoveAura(SPELL_SUMMON_ADMIRAL_GARRICK_GUARDIAN); + owner->CastSpell(owner, SPELL_UPDATE_PHASE_SHIFT); + owner->RemoveAura(SPELL_SUMMON_ADMIRAL_GARRICK_GUARDIAN); } } @@ -1806,22 +1797,22 @@ struct npc_garrick_summoned_beach : public ScriptedAI { case EVENT_INITIAL_SPAWN_CHECK: { - Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID); - if (!player) + Unit* owner = me->GetOwner(); + if (!owner) break; - Creature* survivor = FindCreatureIgnorePhase(player, "spawn_check"); + Creature* survivor = FindCreatureIgnorePhase(owner, "spawn_check"); if (!survivor) { - if (player->GetAreaId() != AREA_ABANDONED_CAMP) - player->RemoveAura(SPELL_SUMMON_ADMIRAL_GARRICK_GUARDIAN); + if (owner->GetAreaId() != AREA_ABANDONED_CAMP) + owner->RemoveAura(SPELL_SUMMON_ADMIRAL_GARRICK_GUARDIAN); else _events.ScheduleEvent(EVENT_FOLLOW_PLAYER, 0s); } else { - Conversation* conversation = Conversation::CreateConversation(CONVERSATION_LINE_ESCORT_ALLIANCE_SURVIVOR, player, *player, _playerGUID, nullptr, false); + Conversation* conversation = Conversation::CreateConversation(CONVERSATION_LINE_ESCORT_ALLIANCE_SURVIVOR, owner, *owner, owner->GetGUID(), nullptr, false); conversation->AddActor(ACTOR_ID_ALLIANCE_SURVIVOR, 1, me->GetGUID()); conversation->Start(); @@ -1830,8 +1821,8 @@ struct npc_garrick_summoned_beach : public ScriptedAI break; } case EVENT_FOLLOW_PLAYER: - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) - me->GetMotionMaster()->MoveFollow(player, 0.0f, float(M_PI / 4.0f)); + if (Unit* owner = me->GetOwner()) + me->GetMotionMaster()->MoveFollow(owner, 0.0f, float(M_PI / 4.0f)); break; default: break; @@ -1840,7 +1831,6 @@ struct npc_garrick_summoned_beach : public ScriptedAI } private: EventMap _events; - ObjectGuid _playerGUID; bool _reachedCamp; }; @@ -1850,19 +1840,14 @@ struct npc_grimaxe_summoned_beach : public ScriptedAI { npc_grimaxe_summoned_beach(Creature* creature) : ScriptedAI(creature), _reachedCamp(false) {} - void IsSummonedBy(WorldObject* summoner) override + void IsSummonedBy(WorldObject* /*summoner*/) override { - Player* player = summoner->ToPlayer(); - if (!player) - return; - - _playerGUID = player->GetGUID(); _reachedCamp = false; _events.ScheduleEvent(EVENT_INITIAL_SPAWN_CHECK, 1s); } - void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override + void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override { if (spellInfo->Id != SPELL_GARRICK_PING) return; @@ -1870,9 +1855,9 @@ struct npc_grimaxe_summoned_beach : public ScriptedAI if (_reachedCamp) return; - if (Player* player = caster->ToPlayer()) + if (Unit* owner = me->GetOwner()) { - Conversation* conversation = Conversation::CreateConversation(CONVERSATION_LINE_ESCORT_SURVIVOR_CAMP, player, *player, _playerGUID, nullptr, false); + Conversation* conversation = Conversation::CreateConversation(CONVERSATION_LINE_ESCORT_SURVIVOR_CAMP, owner, *owner, owner->GetGUID(), nullptr, false); conversation->AddActor(ACTOR_ID_HORDE_SURVIVOR, 3, me->GetGUID()); conversation->Start(); @@ -1886,10 +1871,10 @@ struct npc_grimaxe_summoned_beach : public ScriptedAI if (uiType != POINT_MOTION_TYPE || uiId != POINT_CAMP_POSITION) return; - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + if (Unit* owner = me->GetOwner()) { - player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT); - player->RemoveAura(SPELL_SUMMON_WARLORD_GRIMAXE_GUARDIAN); + owner->CastSpell(owner, SPELL_UPDATE_PHASE_SHIFT); + owner->RemoveAura(SPELL_SUMMON_WARLORD_GRIMAXE_GUARDIAN); } } @@ -1903,22 +1888,22 @@ struct npc_grimaxe_summoned_beach : public ScriptedAI { case EVENT_INITIAL_SPAWN_CHECK: { - Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID); - if (!player) + Unit* owner = me->GetOwner(); + if (!owner) break; - Creature* survivor = FindCreatureIgnorePhase(player, "spawn_check"); + Creature* survivor = FindCreatureIgnorePhase(owner, "spawn_check"); if (!survivor) { - if (player->GetAreaId() != AREA_ABANDONED_CAMP) - player->RemoveAura(SPELL_SUMMON_WARLORD_GRIMAXE_GUARDIAN); + if (owner->GetAreaId() != AREA_ABANDONED_CAMP) + owner->RemoveAura(SPELL_SUMMON_WARLORD_GRIMAXE_GUARDIAN); else _events.ScheduleEvent(EVENT_FOLLOW_PLAYER, 0s); } else { - Conversation* conversation = Conversation::CreateConversation(CONVERSATION_LINE_ESCORT_HORDE_SURVIVOR, player, *player, _playerGUID, nullptr, false); + Conversation* conversation = Conversation::CreateConversation(CONVERSATION_LINE_ESCORT_HORDE_SURVIVOR, owner, *owner, owner->GetGUID(), nullptr, false); conversation->AddActor(ACTOR_ID_HORDE_SURVIVOR, 2, me->GetGUID()); conversation->Start(); @@ -1927,8 +1912,8 @@ struct npc_grimaxe_summoned_beach : public ScriptedAI break; } case EVENT_FOLLOW_PLAYER: - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) - me->GetMotionMaster()->MoveFollow(player, 0.0f, float(M_PI / 4.0f)); + if (Unit* owner = me->GetOwner()) + me->GetMotionMaster()->MoveFollow(owner, 0.0f, float(M_PI / 4.0f)); break; default: break; @@ -1937,7 +1922,6 @@ struct npc_grimaxe_summoned_beach : public ScriptedAI } private: EventMap _events; - ObjectGuid _playerGUID; bool _reachedCamp; }; @@ -2400,16 +2384,10 @@ struct npc_sparring_partner_combat_training : public ScriptedAI void IsSummonedBy(WorldObject* summonerWO) override { - Unit* summoner = summonerWO->ToUnit(); - if (!summoner) - return; - - Player* player = summoner->ToPlayer(); + Player* player = summonerWO->GetAffectingPlayer(); if (!player) return; - _playerGUID = player->GetGUID(); - if (player->GetTeam() == ALLIANCE) { _summonSpellAuraID = SPELL_SUMMON_CAPTAIN_GARRICK_COMBAT; @@ -2432,7 +2410,7 @@ struct npc_sparring_partner_combat_training : public ScriptedAI uint8 GetQuestCredits() { - Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID); + Player* player = me->GetAffectingPlayer(); if (!player) return 0; @@ -2485,11 +2463,11 @@ struct npc_sparring_partner_combat_training : public ScriptedAI } case POINT_TRAINING_POINT_ENHANCED_TRAINING: { - Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID); - if (!player) + Unit* owner = me->GetOwner(); + if (!owner) break; - me->SetFacingToObject(player); + me->SetFacingToObject(owner); me->SetImmuneToPC(false); me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE); _events.ScheduleEvent(EVENT_COMBAT_CHECK_PLAYER, 1s); @@ -2518,7 +2496,7 @@ struct npc_sparring_partner_combat_training : public ScriptedAI void StartConversationWithPlayer(uint32 conversationId) { - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + if (Player* player = me->GetAffectingPlayer()) { Conversation* conversation = Conversation::CreateConversation(conversationId, player, *player, player->GetGUID(), nullptr, false); if (!conversation) @@ -2535,10 +2513,10 @@ struct npc_sparring_partner_combat_training : public ScriptedAI // Used to check if reached home if (pathId == PATH_COMBAT_TRAINER_HOME) { - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + if (Unit* owner = me->GetOwner()) { - player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT); - player->RemoveAura(_summonSpellAuraID); + owner->CastSpell(owner, SPELL_UPDATE_PHASE_SHIFT); + owner->RemoveAura(_summonSpellAuraID); } } } @@ -2560,8 +2538,8 @@ struct npc_sparring_partner_combat_training : public ScriptedAI case EVENT_COMBAT_TRAINING_FACE_PLAYER: { // Used by all classes - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) - me->SetFacingToObject(player); + if (Unit* owner = me->GetOwner()) + me->SetFacingToObject(owner); me->SetImmuneToPC(false); me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE); @@ -2572,9 +2550,9 @@ struct npc_sparring_partner_combat_training : public ScriptedAI me->SetImmuneToPC(true); me->SetUnitFlag(UNIT_FLAG_UNINTERACTIBLE); me->RemoveAllAuras(); - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + if (Unit* owner = me->GetOwner()) { - me->SetFacingToObject(player); + me->SetFacingToObject(owner); StartConversationWithPlayer(CONVERSATION_CHARGE_FINAL_ENHANCED); _events.ScheduleEvent(EVENT_COMBAT_RUN_BACK, 4s); } @@ -2598,7 +2576,6 @@ protected: uint32 _questID; uint32 _summonSpellAuraID; EventMap _events; - ObjectGuid _playerGUID; }; // 164577 - Alliance Sparring Partner @@ -2696,9 +2673,9 @@ struct npc_sparring_partner_enhanced_combat_training_paladin : public npc_sparri { if (_holyPowerCheck) // Used by paladin { - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + if (Unit* owner = me->GetOwner()) { - if (player->GetPower(POWER_HOLY_POWER) >= 3) + if (owner->GetPower(POWER_HOLY_POWER) >= 3) { switch (GetQuestCredits()) { @@ -2798,10 +2775,6 @@ struct npc_sparring_partner_enhanced_combat_training_rogue : public npc_sparring 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); } @@ -2818,8 +2791,8 @@ struct npc_sparring_partner_enhanced_combat_training_rogue : public npc_sparring { if (_comboPointCheck) // Used by rogue { - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) - _comboPointsCounter = player->GetPower(POWER_COMBO_POINTS); + if (Unit* owner = me->GetOwner()) + _comboPointsCounter = owner->GetPower(POWER_COMBO_POINTS); if (_comboPointsCounter >= (GetQuestCredits() + 3)) { @@ -3023,9 +2996,9 @@ struct npc_sparring_partner_enhanced_combat_training_shaman : public npc_sparrin switch (eventId) { case EVENT_COMBAT_TRAINING_RESET_SHAMAN: - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + if (Unit* owner = me->GetOwner()) { - me->CastSpell(player, SPELL_KNOCKBACK); + me->CastSpell(owner, SPELL_KNOCKBACK); _events.ScheduleEvent(EVENT_COMBAT_TRAINING_AGGRO_CHECK_SHAMAN, 2s); } break; @@ -3116,9 +3089,9 @@ struct npc_sparring_partner_enhanced_combat_training_mage : public npc_sparring_ switch (eventId) { case EVENT_COMBAT_TRAINING_RESET_MAGE: - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + if (Unit* owner = me->GetOwner()) { - me->CastSpell(player, SPELL_KNOCKBACK); + me->CastSpell(owner, SPELL_KNOCKBACK); _events.ScheduleEvent(EVENT_COMBAT_TRAINING_AGGRO_CHECK_MAGE, 2s); } break; @@ -3536,7 +3509,7 @@ struct npc_leader_northbound : public ScriptedAI void JustAppeared() override { - Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID); + Player* player = me->GetAffectingPlayer(); if (!player) return; @@ -3575,14 +3548,8 @@ struct npc_leader_northbound : public ScriptedAI conversation->Start(); } - void IsSummonedBy(WorldObject* summoner) override + void IsSummonedBy(WorldObject* /*summoner*/) override { - Player* player = summoner->ToPlayer(); - if (!player) - return; - - _playerGUID = player->GetGUID(); - _events.ScheduleEvent(EVENT_FOLLOW_PLAYER, 3s); } @@ -3606,7 +3573,7 @@ struct npc_leader_northbound : public ScriptedAI me->SetFacingTo(6.0737457275390625); - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + if (Player* player = me->GetAffectingPlayer()) { player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT); player->RemoveAura(_guardianSpellId); @@ -3623,8 +3590,8 @@ struct npc_leader_northbound : public ScriptedAI switch (eventId) { case EVENT_FOLLOW_PLAYER: - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) - me->GetMotionMaster()->MoveFollow(player, 0.0f, float(M_PI / 4.0f)); + if (Unit* owner = me->GetOwner()) + me->GetMotionMaster()->MoveFollow(owner, 0.0f, float(M_PI / 4.0f)); break; default: break; @@ -3634,7 +3601,6 @@ struct npc_leader_northbound : public ScriptedAI private: EventMap _events; - ObjectGuid _playerGUID; uint32 _conversationId; uint32 _actorIdOne; uint32 _actorIdTwo; @@ -3899,15 +3865,6 @@ struct npc_huxsworth_hunter_quest_private : public ScriptedAI _events.ScheduleEvent(EVENT_ME_TURN_TO_PLAYER, 1s); } - void IsSummonedBy(WorldObject* summoner) override - { - Player* player = summoner->ToPlayer(); - if (!player) - return; - - _playerGUID = player->GetGUID(); - } - void UpdateAI(uint32 diff) override { _events.Update(diff); @@ -3917,7 +3874,7 @@ struct npc_huxsworth_hunter_quest_private : public ScriptedAI switch (eventId) { case EVENT_ME_TURN_TO_PLAYER: - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + if (Player* player = ObjectAccessor::GetPlayer(*me, me->GetPrivateObjectOwner())) { me->SetFacingToObject(player); me->SetEmoteState(EMOTE_STATE_TALK); @@ -3927,7 +3884,7 @@ struct npc_huxsworth_hunter_quest_private : public ScriptedAI } break; case EVENT_ME_END_OF_CAST: - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + if (Player* player = ObjectAccessor::GetPlayer(*me, me->GetPrivateObjectOwner())) { if (player->GetQuestStatus(QUEST_TRACKER_TAMING_THE_WILDS_COMPLETE) != QUEST_STATUS_REWARDED) player->CastSpell(player, SPELL_TUTORIAL_HEALTH_DNT); @@ -3952,13 +3909,26 @@ struct npc_huxsworth_hunter_quest_private : public ScriptedAI private: EventMap _events; - ObjectGuid _playerGUID; }; -// 166996 - Mithdran Dawntracker -struct npc_dawntracker_hunter_quest_private : public ScriptedAI +enum HuxsworthBriarpatchData { - npc_dawntracker_hunter_quest_private(Creature* creature) : ScriptedAI(creature) { } + CONVERSATION_BRIARPATCH_ALLIANCE = 12073, + + CONVERSATION_ACTOR_GARRICK_BRIARPATCH = 71326, + CONVERSATION_ACTOR_HUXSWORTH_BRIARPATCH = 71327, + + EVENT_HUXSWORTH_GARRICK_CONVERSATION = 1, + EVENT_HUXSWORTH_GARRICK_RUN_BRIARPATCH = 2, +}; + +Position const GarrickBriarpatchDespawnPosition = { -112.92383f, -2640.541f, 52.35042f }; +Position const HuxworthBriarpatchDespawnPosition = { -112.61979f, -2645.9775f, 52.22835f }; + +// 154327 - Austin Huxsworth +struct npc_huxsworth_briarpatch_quest_private : public ScriptedAI +{ + npc_huxsworth_briarpatch_quest_private(Creature* creature) : ScriptedAI(creature) { } void InitializeAI() override { @@ -3968,16 +3938,75 @@ struct npc_dawntracker_hunter_quest_private : public ScriptedAI void JustAppeared() override { me->SetStandState(UNIT_STAND_STATE_STAND); - _events.ScheduleEvent(EVENT_ME_TURN_TO_PLAYER, 1s); + if (Creature* garrick = ObjectAccessor::GetCreature(*me, _garrickGUID)) + garrick->SetStandState(UNIT_STAND_STATE_STAND); + + _events.ScheduleEvent(EVENT_HUXSWORTH_GARRICK_CONVERSATION, 2s); } - void IsSummonedBy(WorldObject* summoner) override + void UpdateAI(uint32 diff) override { - Player* player = summoner->ToPlayer(); - if (!player) - return; + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_HUXSWORTH_GARRICK_CONVERSATION: + { + if (Unit* player = ObjectAccessor::GetPlayer(*me, me->GetPrivateObjectOwner())) + { + Conversation* conversation = Conversation::CreateConversation(CONVERSATION_BRIARPATCH_ALLIANCE, player, *player, player->GetGUID(), nullptr, false); + if (!conversation) + break; + + conversation->AddActor(CONVERSATION_ACTOR_GARRICK_BRIARPATCH, 0, _garrickGUID); + conversation->AddActor(CONVERSATION_ACTOR_HUXSWORTH_BRIARPATCH, 1, me->GetGUID()); + conversation->Start(); + _events.ScheduleEvent(EVENT_HUXSWORTH_GARRICK_RUN_BRIARPATCH, 13s); + } + break; + } + case EVENT_HUXSWORTH_GARRICK_RUN_BRIARPATCH: + if (Creature* garrick = ObjectAccessor::GetCreature(*me, _garrickGUID)) + { + garrick->GetMotionMaster()->MovePoint(0, GarrickBriarpatchDespawnPosition); + garrick->DespawnOrUnsummon(3s); + } + me->GetMotionMaster()->MovePoint(0, HuxworthBriarpatchDespawnPosition); + me->DespawnOrUnsummon(3s); + break; + default: + break; + } + } + } - _playerGUID = player->GetGUID(); +public: + void SetGarrickGUID(ObjectGuid garrickGUID) + { + _garrickGUID = garrickGUID; + } + +private: + EventMap _events; + ObjectGuid _garrickGUID; +}; + +// 166996 - Mithdran Dawntracker +struct npc_dawntracker_hunter_quest_private : public ScriptedAI +{ + npc_dawntracker_hunter_quest_private(Creature* creature) : ScriptedAI(creature) { } + + void InitializeAI() override + { + me->RemoveNpcFlag(UNIT_NPC_FLAG_QUESTGIVER | UNIT_NPC_FLAG_GOSSIP); + } + + void JustAppeared() override + { + me->SetStandState(UNIT_STAND_STATE_STAND); + _events.ScheduleEvent(EVENT_ME_TURN_TO_PLAYER, 1s); } void UpdateAI(uint32 diff) override @@ -3989,7 +4018,7 @@ struct npc_dawntracker_hunter_quest_private : public ScriptedAI switch (eventId) { case EVENT_ME_TURN_TO_PLAYER: - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + if (Unit* player = ObjectAccessor::GetPlayer(*me, me->GetPrivateObjectOwner())) { me->SetFacingToObject(player); me->SetEmoteState(EMOTE_STATE_TALK); @@ -4004,7 +4033,7 @@ struct npc_dawntracker_hunter_quest_private : public ScriptedAI } break; case EVENT_ME_END_OF_CAST: - if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) + if (Player* player = ObjectAccessor::GetPlayer(*me, me->GetPrivateObjectOwner())) { if (player->GetQuestStatus(QUEST_TRACKER_TAMING_THE_WILDS_COMPLETE) != QUEST_STATUS_REWARDED) player->CastSpell(player, SPELL_TUTORIAL_HEALTH_DNT); @@ -4015,10 +4044,9 @@ struct npc_dawntracker_hunter_quest_private : public ScriptedAI player->CastSpell(player, SPELL_LEARN_TAME_BEAST); player->CastSpell(player, SPELL_LEARN_CALL_PET); } - - me->SetEmoteState(EMOTE_STATE_NONE); - Talk(SAY_FIND_A_BEAST_HORDE); } + me->SetEmoteState(EMOTE_STATE_NONE); + Talk(SAY_FIND_A_BEAST_HORDE); me->DespawnOrUnsummon(4s); break; default: @@ -4029,7 +4057,88 @@ struct npc_dawntracker_hunter_quest_private : public ScriptedAI private: EventMap _events; - ObjectGuid _playerGUID; +}; + +enum DawntrackerBriarpatch +{ + CONVERSATION_BRIARPATCH_HORDE = 14513, + + CONVERSATION_ACTOR_GRIMAXE_BRIARPATCH = 76330, + CONVERSATION_ACTOR_DAWNTRACKER_BRIARPATCH = 76331, + + EVENT_DAWNTRACKER_GRIMAXE_CONVERSATION = 1, + EVENT_DAWNTRACKER_GRIMAXE_RUN_BRIARPATCH = 2, +}; + +Position const GrimaxeBriarpatchDespawnPosition = { -112.92383f, -2640.541f, 52.35042f }; +Position const DawntrackerBriarpatchDespawnPosition = { -112.61979f, -2645.9775f, 52.22835f }; + +// 166996 - Mithdran Dawntracker +struct npc_dawntracker_briarpatch_quest_private : public ScriptedAI +{ + npc_dawntracker_briarpatch_quest_private(Creature* creature) : ScriptedAI(creature) { } + + void InitializeAI() override + { + me->RemoveNpcFlag(UNIT_NPC_FLAG_QUESTGIVER | UNIT_NPC_FLAG_GOSSIP); + } + + void JustAppeared() override + { + me->SetStandState(UNIT_STAND_STATE_STAND); + if (Creature* grimaxe = ObjectAccessor::GetCreature(*me, _grimaxeGUID)) + grimaxe->SetStandState(UNIT_STAND_STATE_STAND); + + _events.ScheduleEvent(EVENT_DAWNTRACKER_GRIMAXE_CONVERSATION, 2s); + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_DAWNTRACKER_GRIMAXE_CONVERSATION: + { + if (Unit* player = ObjectAccessor::GetPlayer(*me, me->GetPrivateObjectOwner())) + { + Conversation* conversation = Conversation::CreateConversation(CONVERSATION_BRIARPATCH_HORDE, player, *player, player->GetGUID(), nullptr, false); + if (!conversation) + break; + + conversation->AddActor(CONVERSATION_ACTOR_GRIMAXE_BRIARPATCH, 0, _grimaxeGUID); + conversation->AddActor(CONVERSATION_ACTOR_DAWNTRACKER_BRIARPATCH, 1, me->GetGUID()); + conversation->Start(); + _events.ScheduleEvent(EVENT_HUXSWORTH_GARRICK_RUN_BRIARPATCH, 13s); + } + break; + } + case EVENT_DAWNTRACKER_GRIMAXE_RUN_BRIARPATCH: + if (Creature* grimaxe = ObjectAccessor::GetCreature(*me, _grimaxeGUID)) + { + grimaxe->GetMotionMaster()->MovePoint(0, GrimaxeBriarpatchDespawnPosition ); + grimaxe->DespawnOrUnsummon(2s); + } + me->GetMotionMaster()->MovePoint(0, DawntrackerBriarpatchDespawnPosition); + me->DespawnOrUnsummon(2s); + break; + default: + break; + } + } + } + +public: + void SetGrimaxeGUID(ObjectGuid grimaxeGUID) + { + _grimaxeGUID = grimaxeGUID; + } + +private: + EventMap _events; + ObjectGuid _grimaxeGUID; }; CreatureAI* HuxsworthBriarpatchSelector(Creature* creature) @@ -4038,11 +4147,12 @@ CreatureAI* HuxsworthBriarpatchSelector(Creature* creature) { if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner())) { - if ((privateObjectOwner->GetQuestStatus(QUEST_TAMING_THE_WILDS_ALLIANCE) == QUEST_STATUS_INCOMPLETE)) + if (privateObjectOwner->GetQuestStatus(QUEST_TAMING_THE_WILDS_ALLIANCE) == QUEST_STATUS_INCOMPLETE) return new npc_huxsworth_hunter_quest_private(creature); + else + return new npc_huxsworth_briarpatch_quest_private(creature); } } - return new NullCreatureAI(creature); }; @@ -4052,11 +4162,12 @@ CreatureAI* DawntrackerBriarpatchSelector(Creature* creature) { if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner())) { - if ((privateObjectOwner->GetQuestStatus(QUEST_TAMING_THE_WILDS_HORDE) == QUEST_STATUS_INCOMPLETE)) + if (privateObjectOwner->GetQuestStatus(QUEST_TAMING_THE_WILDS_HORDE) == QUEST_STATUS_INCOMPLETE) return new npc_dawntracker_hunter_quest_private(creature); + else + return new npc_dawntracker_briarpatch_quest_private(creature); } } - return new NullCreatureAI(creature); }; @@ -4102,6 +4213,598 @@ class spell_tutorial_health_dnt : public SpellScript } }; +enum QuilboarQuest +{ + QUEST_DOWN_WITH_THE_QUILBOAR_ALLIANCE = 55186, + QUEST_FORBIDDEN_QUILBOAR_NECROMANY_ALLIANCE = 55184, + QUEST_DOWN_WITH_THE_QUILBOAR_HORDE = 59938, + QUEST_FORBIDDEN_QUILBOAR_NECROMANY_HORDE = 59939, + + SPELL_VALIDATED_QUEST_ACCEPT_BRIARPATCH_ALLIANCE = 298984, + SPELL_VALIDATED_QUEST_ACCEPT_BRIARPATCH_HORDE = 325309 +}; + +// 55186 - Quest Down with the Quilboar "Alliance" +// 55184 - Forbidden Quilboar Necromancy "Alliance" +// 59938 - Quest Down with the Quilboar "Horde" +// 59939 - Forbidden Quilboar Necromancy "Horde" +class quest_briarpatch : public QuestScript +{ +public: + quest_briarpatch(char const* script) : QuestScript(script) { } + + void HandleQuestStatusChange(Player* player, QuestStatus newStatus, uint32 questDown, uint32 questForbidden, uint32 spellValidated) + { + switch (newStatus) + { + case QUEST_STATUS_INCOMPLETE: + if (player->GetQuestStatus(questDown) != QUEST_STATUS_NONE && player->GetQuestStatus(questForbidden) != QUEST_STATUS_NONE) + { + player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT); + player->CastSpell(player, spellValidated); + } + break; + case QUEST_STATUS_NONE: + player->CastSpell(player, SPELL_UPDATE_PHASE_SHIFT); + break; + default: + break; + } + } +}; + +// 55186 - Quest Down with the Quilboar "Alliance" +// 55184 - Forbidden Quilboar Necromancy "Alliance" +class quest_briarpatch_alliance : public quest_briarpatch +{ +public: + quest_briarpatch_alliance() : quest_briarpatch("quest_briarpatch_alliance") { } + + void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override + { + HandleQuestStatusChange(player, newStatus, QUEST_DOWN_WITH_THE_QUILBOAR_ALLIANCE, QUEST_FORBIDDEN_QUILBOAR_NECROMANY_ALLIANCE, SPELL_VALIDATED_QUEST_ACCEPT_BRIARPATCH_ALLIANCE); + } +}; + +// 59938 - Quest Down with the Quilboar "Horde" +// 59939 - Forbidden Quilboar Necromancy "Horde" +class quest_briarpatch_horde : public quest_briarpatch +{ +public: + quest_briarpatch_horde() : quest_briarpatch("quest_briarpatch_horde") { } + + void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override + { + HandleQuestStatusChange(player, newStatus, QUEST_DOWN_WITH_THE_QUILBOAR_HORDE, QUEST_FORBIDDEN_QUILBOAR_NECROMANY_HORDE, SPELL_VALIDATED_QUEST_ACCEPT_BRIARPATCH_HORDE); + } +}; + +// 298984 - Validated Quest Accept +class spell_validated_quest_accept_briarpatch_alliance : public SpellScript +{ + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Player* player = GetCaster()->ToPlayer()) + { + Creature* huxsworth = FindCreatureIgnorePhase(player, "huxworth_briarpatch", 10.0f); + Creature* garrick = FindCreatureIgnorePhase(player, "garrick_briarpatch", 10.0f); + if (!huxsworth || !garrick) + return; + + Creature* huxsworthPersonal = huxsworth->SummonPersonalClone(huxsworth->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player); + Creature* garrickPersonal = garrick->SummonPersonalClone(garrick->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player); + if (!huxsworthPersonal || !garrickPersonal) + return; + + if (npc_huxsworth_briarpatch_quest_private* huxworthAI = CAST_AI(npc_huxsworth_briarpatch_quest_private, huxsworthPersonal->AI())) + huxworthAI->SetGarrickGUID(garrickPersonal->GetGUID()); + } + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_validated_quest_accept_briarpatch_alliance::HandleScript, EFFECT_0, SPELL_EFFECT_SEND_EVENT); + } +}; + +// 325309 - Validated Quest Accept +class spell_validated_quest_accept_briarpatch_horde : public SpellScript +{ + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Player* player = GetCaster()->ToPlayer()) + { + Creature* dawntracker = FindCreatureIgnorePhase(player, "dawntracker_briarpatch", 10.0f); + Creature* grimaxe = FindCreatureIgnorePhase(player, "grimaxe_briarpatch", 10.0f); + if (!dawntracker || !grimaxe) + return; + + Creature* dawntrackerPersonal = dawntracker->SummonPersonalClone(dawntracker->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player); + Creature* grimaxePersonal = grimaxe->SummonPersonalClone(grimaxe->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player); + if (!dawntrackerPersonal || !grimaxePersonal) + return; + + if (npc_dawntracker_briarpatch_quest_private* dawntrackerAI = CAST_AI(npc_dawntracker_briarpatch_quest_private, dawntrackerPersonal->AI())) + dawntrackerAI->SetGrimaxeGUID(grimaxePersonal->GetGUID()); + } + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_validated_quest_accept_briarpatch_horde::HandleScript, EFFECT_0, SPELL_EFFECT_SEND_EVENT); + } +}; + +enum GeolordData +{ + CONVERSATION_GEOLORD_AGGRO = 13712, + + CONVERSATION_ACTOR_GEOLORD = 70670, + CONVERSATION_ACTOR_LINDIE = 71238, + CONVERSATION_ACTOR_CORK = 75976, + + EVENT_CAST_EARTH_BOLT = 1, + EVENT_CAST_UPHEAVAL = 2, + + NPC_CORK_FIZZLEPOP = 167008, + NPC_LINDIE_SPRINGSTOCK = 154301, + NPC_INVIS_BUNNY_GEOLORD = 155371, + + ACTION_FREE_PRISONER = 1, + + SPELL_NECROTIC_RITUAL_DNT = 305513, + SPELL_EARTH_BOLT = 270453, + SPELL_UPHEAVAL = 319273, + + WORLDSTATE_HORDE = 4486 +}; + +Position const PrisonerPosition = { 16.4271f, -2511.82f, 78.8215f, 5.66398f }; + +// 151091 - Geolord Grek'og +struct npc_geolord_grekog : public ScriptedAI +{ + npc_geolord_grekog(Creature* creature) : ScriptedAI(creature) { } + + void JustAppeared() override + { + uint32 prisonerEntry = NPC_LINDIE_SPRINGSTOCK; + + if (sWorldStateMgr->GetValue(WORLDSTATE_HORDE, me->GetMap()) == 1) + prisonerEntry = NPC_CORK_FIZZLEPOP; + + Creature* bunny = me->FindNearestCreatureWithOptions(25.0f, { .CreatureId = NPC_INVIS_BUNNY_GEOLORD, .IgnorePhases = true }); + if (!bunny) + return; + + if (Creature* prisoner = bunny->SummonCreature(prisonerEntry, PrisonerPosition, TEMPSUMMON_MANUAL_DESPAWN)) + _prisonerGUID = prisoner->GetGUID(); + } + + void JustDied(Unit* /*killer*/) override + { + if (Creature* prisoner = ObjectAccessor::GetCreature(*me, _prisonerGUID)) + prisoner->AI()->DoAction(ACTION_FREE_PRISONER); + } + + void JustEngagedWith(Unit* who) override + { + if (Player* player = who->ToPlayer()) + { + Conversation::CreateConversation(CONVERSATION_GEOLORD_AGGRO, player, *player, player->GetGUID(), nullptr, true); + + _events.ScheduleEvent(EVENT_CAST_EARTH_BOLT, 3s, 5s); + _events.ScheduleEvent(EVENT_CAST_UPHEAVAL, 10s, 15s); + } + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_CAST_EARTH_BOLT: + { + DoCastVictim(SPELL_EARTH_BOLT); + _events.ScheduleEvent(EVENT_CAST_EARTH_BOLT, 10s, 12s); + break; + } + case EVENT_CAST_UPHEAVAL: + { + DoCastSelf(SPELL_UPHEAVAL); + _events.ScheduleEvent(EVENT_CAST_UPHEAVAL, 10s, 15s); + break; + } + default: + break; + } + } + } +private: + EventMap _events; + ObjectGuid _prisonerGUID; +}; + +enum BriarpatchPrisonerData +{ + EVENT_RUN_TO_PLAINS = 1, + + SAY_GET_OUT_OF_HERE = 0 +}; + +Position const BriarpatchPrisonerJumpToPosition = { 19.5174f, -2513.75f, 74.0545f }; +Position const PrisonerBriarpatchDespawnPosition = { 51.005207f, -2485.644f, 78.15223f }; + +// 167008 - Cork Fizzlepop +// 154301 - Lindie Springstock +struct npc_briarpatch_prisoner : public ScriptedAI +{ + npc_briarpatch_prisoner(Creature* creature) : ScriptedAI(creature) { } + + void JustAppeared() override + { + me->SetDisableGravity(true); + me->SetTemplateRooted(true); + me->CastSpell(me, SPELL_NECROTIC_RITUAL_DNT); + } + + void DoAction(int32 param) override + { + if (param == ACTION_FREE_PRISONER) + { + me->RemoveAllAuras(); + me->SetDisableGravity(false); + me->SetTemplateRooted(false); + me->GetMotionMaster()->MoveJump(BriarpatchPrisonerJumpToPosition, 7.9894905f, 19.29110336303710937f); + Talk(SAY_GET_OUT_OF_HERE); + _events.ScheduleEvent(EVENT_RUN_TO_PLAINS, 4s); + } + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_RUN_TO_PLAINS: + me->GetMotionMaster()->MovePoint(0, PrisonerBriarpatchDespawnPosition); + me->DespawnOrUnsummon(5s); + break; + default: + break; + } + } + } +private: + EventMap _events; +}; + +enum OgreOverseerQuilboarText +{ + SAY_AGGRO = 0, + SAY_DEATH = 1, +}; + +enum ExilesReachQuilboarData +{ + ITEM_STITCHED_CLOTH_TUNIC = 174811, + ITEM_STITCHED_LEATHER_TUNIC = 174812, + ITEM_LINKED_MAIL_HAUBERK = 174813, + ITEM_DENTED_CHESTPLATE = 174814, + + QUEST_BRIARPATCH_CHEST_DROPPED = 58904 +}; + +enum QuilboarWarriorGeomancerData +{ + EVENT_BRUTAL_STRIKE = 1, + EVENT_GEOMANCER_EARTH_BOLT = 1, + + SPELL_NECROTIC_BURST = 313261, + SPELL_QUILBOAR_SLEEP_DNT = 313265, + SPELL_BRUTAL_STRIKE = 317383, + SPELL_GEOMANCER_EARTH_BOLT = 321188 +}; + +// 150237 - Quilboar Warrior +struct npc_quilboar_warrior : public ScriptedAI +{ + npc_quilboar_warrior(Creature* creature) : ScriptedAI(creature) { } + + void Reset() override + { + _events.Reset(); + } + + void JustEngagedWith(Unit* who) override + { + me->RemoveAura(SPELL_QUILBOAR_SLEEP_DNT); + + if (roll_chance_f(33.33f)) + Talk(SAY_AGGRO, who); + + _events.ScheduleEvent(EVENT_BRUTAL_STRIKE, 3s, 5s); + } + + void JustDied(Unit* killer) override + { + if (roll_chance_f(33.33f)) + Talk(SAY_DEATH, killer); + + for (auto const& [playerGuid, loot] : me->m_personalLoot) + { + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGuid)) + { + if (player->IsQuestRewarded(QUEST_BRIARPATCH_CHEST_DROPPED)) + break; + + for (LootItem const& lootItem : loot->items) + { + if (lootItem.itemid == ITEM_STITCHED_CLOTH_TUNIC || lootItem.itemid == ITEM_STITCHED_LEATHER_TUNIC || lootItem.itemid == ITEM_LINKED_MAIL_HAUBERK || lootItem.itemid == ITEM_DENTED_CHESTPLATE) + { + player->SetRewardedQuest(QUEST_BRIARPATCH_CHEST_DROPPED); + break; + } + } + } + } + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_BRUTAL_STRIKE: + DoCastVictim(SPELL_BRUTAL_STRIKE); + _events.ScheduleEvent(EVENT_BRUTAL_STRIKE, 8s, 12s); + break; + default: + break; + } + } + } + +private: + EventMap _events; +}; + +// 150238 - Quilboar Geomancer +struct npc_quilboar_geomancer : public ScriptedAI +{ + npc_quilboar_geomancer(Creature* creature) : ScriptedAI(creature) { } + + void Reset() override + { + _events.Reset(); + } + + void JustEngagedWith(Unit* who) override + { + me->RemoveAura(SPELL_QUILBOAR_SLEEP_DNT); + + if (roll_chance_f(33.33f)) + Talk(SAY_AGGRO, who); + + _events.ScheduleEvent(EVENT_GEOMANCER_EARTH_BOLT, 3s, 5s); + } + + void JustDied(Unit* killer) override + { + if (roll_chance_f(33.33f)) + Talk(SAY_DEATH, killer); + + for (auto const& [playerGuid, loot] : me->m_personalLoot) + { + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGuid)) + { + if (player->IsQuestRewarded(QUEST_BRIARPATCH_CHEST_DROPPED)) + break; + + for (LootItem const& lootItem : loot->items) + { + if (lootItem.itemid == ITEM_STITCHED_CLOTH_TUNIC || lootItem.itemid == ITEM_STITCHED_LEATHER_TUNIC || lootItem.itemid == ITEM_LINKED_MAIL_HAUBERK || lootItem.itemid == ITEM_DENTED_CHESTPLATE) + { + player->SetRewardedQuest(QUEST_BRIARPATCH_CHEST_DROPPED); + break; + } + } + } + } + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_GEOMANCER_EARTH_BOLT: + DoCastVictim(SPELL_GEOMANCER_EARTH_BOLT); + _events.ScheduleEvent(EVENT_GEOMANCER_EARTH_BOLT, 3s, 10s); + break; + default: + break; + } + } + } +private: + EventMap _events; +}; + +enum ExilesReachOgreOverseerData +{ + EVENT_OVERSEER_BACKHAND = 1, + EVENT_OVERSEER_EARTHSHATTER = 2, + + ITEM_BATTERED_CLOAK = 11847, + ITEM_OVERSEERS_MANDATE = 174790, + + QUEST_BRIARPATCH_OVERSEER_CLOAK_DROPPED = 56051, + + SPELL_BACKHAND = 276991, + SPELL_EARTHSHATTER = 319292 +}; + +// 156676 - Ogre Overseer +struct npc_ogre_overseer : public ScriptedAI +{ + npc_ogre_overseer(Creature* creature) : ScriptedAI(creature) { } + + void Reset() override + { + _events.Reset(); + } + + void JustEngagedWith(Unit* who) override + { + Talk(SAY_AGGRO, who); + + _events.ScheduleEvent(EVENT_OVERSEER_BACKHAND, 5s); + _events.ScheduleEvent(EVENT_OVERSEER_EARTHSHATTER, 10s, 15s); + } + + void JustDied(Unit* killer) override + { + Talk(SAY_DEATH, killer); + + for (auto const& [playerGuid, loot] : me->m_personalLoot) + { + if (Player* player = ObjectAccessor::GetPlayer(*me, playerGuid)) + { + if (player->IsQuestRewarded(QUEST_BRIARPATCH_OVERSEER_CLOAK_DROPPED)) + break; + + for (LootItem const& lootItem : loot->items) + { + if (lootItem.itemid == ITEM_BATTERED_CLOAK) + { + player->SetRewardedQuest(QUEST_BRIARPATCH_OVERSEER_CLOAK_DROPPED); + break; + } + } + } + } + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_OVERSEER_BACKHAND: + DoCastVictim(SPELL_BACKHAND); + _events.ScheduleEvent(EVENT_OVERSEER_BACKHAND, 15s, 20s); + break; + case EVENT_OVERSEER_EARTHSHATTER: + DoCastAOE(SPELL_EARTHSHATTER); + _events.ScheduleEvent(EVENT_OVERSEER_EARTHSHATTER, 15s, 20s); + break; + default: + break; + } + } + } +private: + EventMap _events; +}; + +enum BriarpathPlainsConversations +{ + CONVERSATION_DOWN_WITH_THE_QUILLBOAR_COMPLETE_ALLIANCE = 12076, + CONVERSATION_DOWN_WITH_THE_QUILLBOAR_COMPLETE_HORDE = 14514 +}; + +struct at_briarpatch_to_plains : AreaTriggerAI +{ + at_briarpatch_to_plains(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { } + + // @TODO: remove when conversation cooldown is implemented + void StartConversation(Player* player, uint32 conversationId) + { + std::vector<WorldObject*> objs; + + Trinity::ObjectEntryAndPrivateOwnerIfExistsCheck check(player->GetGUID(), conversationId); + Trinity::WorldObjectListSearcher<Trinity::ObjectEntryAndPrivateOwnerIfExistsCheck> checker(nullptr, objs, check, GRID_MAP_TYPE_MASK_CONVERSATION); + Cell::VisitGridObjects(player, checker, 100.0f); + + if (objs.empty()) + Conversation::CreateConversation(conversationId, player, *player, player->GetGUID(), nullptr); + } + + void OnUnitEnter(Unit* unit) override + { + Player* player = unit->ToPlayer(); + if (!player) + return; + + if (player->GetTeam() == ALLIANCE) + { + if (player->GetQuestStatus(QUEST_DOWN_WITH_THE_QUILBOAR_ALLIANCE) != QUEST_STATUS_COMPLETE) + return; + + StartConversation(player, CONVERSATION_DOWN_WITH_THE_QUILLBOAR_COMPLETE_ALLIANCE); + } + else + { + if (player->GetQuestStatus(QUEST_DOWN_WITH_THE_QUILBOAR_HORDE) != QUEST_STATUS_COMPLETE) + return; + + StartConversation(player, CONVERSATION_DOWN_WITH_THE_QUILLBOAR_COMPLETE_HORDE); + } + } +}; + +class spell_quilboar_sleep_dnt : public AuraScript +{ + void ApplyEffect(AuraEffect const* /* aurEff */, AuraEffectHandleModes /*mode*/) + { + if (Creature* target = GetTarget()->ToCreature()) + target->SetReactState(REACT_PASSIVE); + } + + void RemoveEffect(AuraEffect const* /* aurEff */, AuraEffectHandleModes /*mode*/) + { + if (Creature* target = GetTarget()->ToCreature()) + { + target->SetReactState(REACT_AGGRESSIVE); + target->SetStandState(UNIT_STAND_STATE_STAND); + } + } + + void Register() override + { + OnEffectRemove += AuraEffectRemoveFn(spell_quilboar_sleep_dnt::RemoveEffect, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectApply += AuraEffectApplyFn(spell_quilboar_sleep_dnt::ApplyEffect, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } +}; + void AddSC_zone_exiles_reach() { // Ship @@ -4111,7 +4814,7 @@ void AddSC_zone_exiles_reach() new quest_stand_your_ground(); RegisterCreatureAI(npc_sparring_partner_exiles_reach); RegisterSpellScript(spell_summon_sparring_partner); - new FactoryCreatureScript<CreatureAI, &CaptainGarrickShipAISelector>("npc_captain_garrick_ship"); + new FactoryCreatureScript<CreatureAI, &CaptainGarrickAISelector>("npc_captain_garrick"); RegisterPrivatePublicCreatureAIPair("npc_warlord_grimaxe_lower_ship", npc_ship_captain_warming_up_private, NullCreatureAI); RegisterPrivatePublicCreatureAIPair("npc_warlord_grimaxe_upper_ship", npc_ship_captain_brace_for_impact_private, NullCreatureAI); RegisterPrivatePublicCreatureAIPair("npc_cole_ship", npc_first_mate_brace_for_impact_private, npc_first_mate_stand_your_ground); @@ -4177,4 +4880,17 @@ void AddSC_zone_exiles_reach() new FactoryCreatureScript<CreatureAI, &DawntrackerBriarpatchSelector>("npc_dawntracker_briarpatch"); RegisterSpellScript(spell_tutorial_health_dnt_proc_aura); RegisterSpellScript(spell_tutorial_health_dnt); + // Briarpatch + new quest_briarpatch_alliance(); + new quest_briarpatch_horde(); + RegisterSpellScript(spell_validated_quest_accept_briarpatch_alliance); + RegisterSpellScript(spell_validated_quest_accept_briarpatch_horde); + RegisterCreatureAI(npc_geolord_grekog); + new GenericCreatureScript<npc_briarpatch_prisoner>("npc_cork_fizzlepop_briarpatch"); + new GenericCreatureScript<npc_briarpatch_prisoner>("npc_lindie_springstock_briarpatch"); + RegisterCreatureAI(npc_quilboar_warrior); + RegisterCreatureAI(npc_quilboar_geomancer); + RegisterCreatureAI(npc_ogre_overseer); + RegisterAreaTriggerAI(at_briarpatch_to_plains); + RegisterSpellScript(spell_quilboar_sleep_dnt); }; |
