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.', '', '', '', '', '', '', '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 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(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,7 +3909,88 @@ struct npc_huxsworth_hunter_quest_private : public ScriptedAI private: EventMap _events; - ObjectGuid _playerGUID; +}; + +enum HuxsworthBriarpatchData +{ + 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 + { + me->RemoveNpcFlag(UNIT_NPC_FLAG_QUESTGIVER | UNIT_NPC_FLAG_GOSSIP); + } + + void JustAppeared() override + { + me->SetStandState(UNIT_STAND_STATE_STAND); + if (Creature* garrick = ObjectAccessor::GetCreature(*me, _garrickGUID)) + garrick->SetStandState(UNIT_STAND_STATE_STAND); + + _events.ScheduleEvent(EVENT_HUXSWORTH_GARRICK_CONVERSATION, 2s); + } + + void UpdateAI(uint32 diff) override + { + _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; + } + } + } + +public: + void SetGarrickGUID(ObjectGuid garrickGUID) + { + _garrickGUID = garrickGUID; + } + +private: + EventMap _events; + ObjectGuid _garrickGUID; }; // 166996 - Mithdran Dawntracker @@ -3971,15 +4009,6 @@ struct npc_dawntracker_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); @@ -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 objs; + + Trinity::ObjectEntryAndPrivateOwnerIfExistsCheck check(player->GetGUID(), conversationId); + Trinity::WorldObjectListSearcher 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("npc_captain_garrick_ship"); + new FactoryCreatureScript("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("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_cork_fizzlepop_briarpatch"); + new GenericCreatureScript("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); };