21 Commits
Author SHA1 Message Date
luis 7288b8fedc del 2026-09-26 22:32:10 -03:00
luis 36b30fd12a Scripts/Spells: Implement hunter talent Horsehair Tether 2026-09-26 20:47:50 -03:00
luis 18ba84dd4e db fix 2026-09-26 20:37:08 -03:00
luis 1e80d7d867 Scripts/Spells: Implement hunter talent Trailblazer 2026-09-26 20:32:03 -03:00
luis 72a879d9cb Core/Spells: Fixed Rapid Fire being interrupted by Auto Shot 2026-09-26 20:30:31 -03:00
luis aa08843e07 Scripts/Spells: Add missing action bar glow for hunter talent Surging Shots proc 2026-09-26 20:29:23 -03:00
luis f2abcf67f6 Scripts/Spells: Update hunter talent Surging Shots 2026-09-26 20:28:14 -03:00
luis cd572e8c6c i will add sql later not assign spell script 2026-09-26 20:26:05 -03:00
luis b41cd95bb8 wq 2026-09-26 16:39:44 -03:00
luis 4985ab08a5 fix wq 2026-09-26 15:34:24 -03:00
luis 40ae64dd29 Core/ Implement bonus quest system 2026-09-26 11:12:34 -03:00
luis 2640fdfa8e wq eversong woods 2026-09-26 08:34:24 -03:00
luis 5e5965090b already applied 2026-09-26 08:04:26 -03:00
luis e90e395c35 Prey Fixed 2026-09-26 07:55:02 -03:00
luis b28dd6f77e Adv client 2026-09-26 07:47:52 -03:00
Céfiro_Caecias 5de7d827b3 DB/World: Orc Starting Zone 2026-09-25 20:00:00 -03:00
Céfiro_Caecias 95ff338eca DB/World: DBErrors Fixes 2026-09-25 16:40:56 -03:00
luis 1911c8b01b fix crash 2026-09-25 13:53:04 -03:00
Céfiro_Caecias bc9e2c6d08 DB/World: Gameobject Translates 2026-09-25 09:20:18 -03:00
Céfiro_Caecias 7816605b95 Update 2026_09_24_05_world.sql 2026-09-25 08:20:05 -03:00
Céfiro_Caecias d259e0c817 Update 2026_09_24_05_world.sql 2026-09-25 08:14:30 -03:00
34 changed files with 24025 additions and 999 deletions
@@ -0,0 +1,71 @@
--
-- Table structure for table `quest_v2_cli_task`
--
DROP TABLE IF EXISTS `quest_v2_cli_task`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `quest_v2_cli_task` (
`ID` int unsigned NOT NULL DEFAULT '0',
`QuestTitle` text,
`BulletText` text,
`UniqueBitFlag` int NOT NULL DEFAULT '0',
`ConditionID` int unsigned NOT NULL DEFAULT '0',
`FiltActiveQuest` int unsigned NOT NULL DEFAULT '0',
`FiltClasses` smallint NOT NULL DEFAULT '0',
`FiltCompletedQuestLogic` int unsigned NOT NULL DEFAULT '0',
`FiltMaxFactionID` int unsigned NOT NULL DEFAULT '0',
`FiltMaxFactionValue` int unsigned NOT NULL DEFAULT '0',
`FiltMinFactionID` int unsigned NOT NULL DEFAULT '0',
`FiltMinFactionValue` int unsigned NOT NULL DEFAULT '0',
`FiltMinSkillID` int unsigned NOT NULL DEFAULT '0',
`FiltMinSkillValue` int unsigned NOT NULL DEFAULT '0',
`FiltNonActiveQuest` int unsigned NOT NULL DEFAULT '0',
`BreadCrumbID` int unsigned NOT NULL DEFAULT '0',
`StartItem` int NOT NULL DEFAULT '0',
`WorldStateExpressionID` int NOT NULL DEFAULT '0',
`QuestInfoID` int unsigned NOT NULL DEFAULT '0',
`ContentTuningID` int NOT NULL DEFAULT '0',
`CovenantID` int NOT NULL DEFAULT '0',
`Field_9_0_2_36206_022` int NOT NULL DEFAULT '0',
`Flags1` int NOT NULL DEFAULT '0',
`Flags2` int NOT NULL DEFAULT '0',
`Flags3` int NOT NULL DEFAULT '0',
`FiltCompletedQuest1` int unsigned NOT NULL DEFAULT '0',
`FiltCompletedQuest2` int unsigned NOT NULL DEFAULT '0',
`FiltCompletedQuest3` int unsigned NOT NULL DEFAULT '0',
`FiltRaceMasks1` int NOT NULL DEFAULT '0',
`FiltRaceMasks2` int NOT NULL DEFAULT '0',
`VerifiedBuild` int NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `quest_v2_cli_task_locale`
--
DROP TABLE IF EXISTS `quest_v2_cli_task_locale`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `quest_v2_cli_task_locale` (
`ID` int unsigned NOT NULL DEFAULT '0',
`locale` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`QuestTitle_lang` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`BulletText_lang` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`VerifiedBuild` int NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`locale`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
/*!50500 PARTITION BY LIST COLUMNS(locale)
(PARTITION deDE VALUES IN ('deDE') ENGINE = InnoDB,
PARTITION esES VALUES IN ('esES') ENGINE = InnoDB,
PARTITION esMX VALUES IN ('esMX') ENGINE = InnoDB,
PARTITION frFR VALUES IN ('frFR') ENGINE = InnoDB,
PARTITION itIT VALUES IN ('itIT') ENGINE = InnoDB,
PARTITION koKR VALUES IN ('koKR') ENGINE = InnoDB,
PARTITION ptBR VALUES IN ('ptBR') ENGINE = InnoDB,
PARTITION ruRU VALUES IN ('ruRU') ENGINE = InnoDB,
PARTITION zhCN VALUES IN ('zhCN') ENGINE = InnoDB,
PARTITION zhTW VALUES IN ('zhTW') ENGINE = InnoDB) */;
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -272,7 +272,7 @@ INSERT INTO `creature_template_spell` (`CreatureID`, `Index`, `Spell`, `Verified
(156267, 0, 305557, 69875);
INSERT INTO `quest_template_addon` (`ID`, `PrevQuestID`, `NextQuestID`, `ExclusiveGroup`, `BreadcrumbForQuestId`) VALUES
REPLACE INTO `quest_template_addon` (`ID`, `PrevQuestID`, `NextQuestID`, `ExclusiveGroup`, `BreadcrumbForQuestId`) VALUES
(54933, 0, 0, 0, 0), -- Freeing the Light
(54951, 55122, 54952, 0, 0), -- Emergency First Aid (Alliance)
(54952, 54951, 55174, 0, 0), -- Finding the Lost Expedition (Alliance)
@@ -376,11 +376,12 @@ INSERT INTO `quest_template_addon` (`ID`, `PrevQuestID`, `NextQuestID`, `Exclusi
(66349, 0, 0, 0, 0), -- Training Rock
(85678, 55639, 0, 0, 0), -- Repair Yourself (Alliance)
(85679, 59949, 0, 0, 0); -- Repair Yourself (Horde)
ON DUPLICATE KEY UPDATE
`PrevQuestID` = VALUES(`PrevQuestID`),
`NextQuestID` = VALUES(`NextQuestID`),
`ExclusiveGroup` = VALUES(`ExclusiveGroup`),
`BreadcrumbForQuestId` = VALUES(`BreadcrumbForQuestId`);
-- ON DUPLICATE KEY UPDATE
-- `PrevQuestID` = VALUES(`PrevQuestID`),
-- `NextQuestID` = VALUES(`NextQuestID`),
-- `ExclusiveGroup` = VALUES(`ExclusiveGroup`),
-- `BreadcrumbForQuestId` = VALUES(`BreadcrumbForQuestId`);
-- Retail quest givers and turn-ins that were missing. The creature and quest pairs are the
-- sniffed rows of TrinityCore TDB 1210.26091, so every quest can be picked up and handed in
File diff suppressed because one or more lines are too long
@@ -0,0 +1,67 @@
-- ==============
-- DBErrors Fixes
-- ==============
UPDATE `quest_template_addon` SET `ProvidedItemCount`=1 WHERE `ID` IN (59941,59930,54951,56034);
UPDATE `creature_template` SET `npcflag`=2 WHERE `entry` IN (245394,245397,245667,245686);
UPDATE `creature_template_difficulty` SET `LootID`=154145 WHERE `Entry`=154145;
UPDATE `creature_template_difficulty` SET `LootID`=154146 WHERE `Entry`=154146;
UPDATE `creature_template_difficulty` SET `LootID`=154147 WHERE `Entry`=154147;
UPDATE `creature_template` SET `npcflag`=65667 WHERE `entry`=191025;
UPDATE `npc_vendor` SET `maxcount`=0 WHERE `entry`=190526 AND `item`=6533 AND `ExtendedCost`=0 AND `type`=1;
UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN (17826,17827);
UPDATE `creature_template` SET `ScriptName`='npc_malfunctioning_goliath' WHERE `entry`=171750;
UPDATE `creature_template` SET `ScriptName`='npc_smashspite_fel_bat' WHERE `entry`=100759;
UPDATE `creature_template` SET `ScriptName`='npc_amarth' WHERE `entry`=162692;
UPDATE `creature_template` SET `ScriptName`='npc_brh_boulder_instance_trash' WHERE `entry`=100485;
UPDATE `creature_template` SET `ScriptName`='npc_brh_fel_bat' WHERE `entry`=102781;
UPDATE `creature_template` SET `ScriptName`='npc_illysanna_commandir' WHERE `entry`=98706;
UPDATE `creature_template` SET `ScriptName`='npc_illysanna_eye_beam_stalker' WHERE `entry`=100436;
UPDATE `creature_template` SET `ScriptName`='npc_illysanna_trash_generic' WHERE `entry`=100486;
UPDATE `creature_template` SET `ScriptName`='npc_kurtalos_ravencrest' WHERE `entry`=98965;
UPDATE `creature_template` SET `ScriptName`='npc_kurtalos_stinging_swarm' WHERE `entry`=101008;
UPDATE `creature_template` SET `ScriptName`='npc_tushui_huojin_trainee' WHERE `entry` IN (54587,65471);
UPDATE `creature_template` SET `ScriptName`='npc_huojin_trainee' WHERE `entry` IN (54586,65470);
UPDATE `creature_template` SET `ScriptName`='' WHERE `entry`=236190;
UPDATE `creature_template` SET `ScriptName`='boss_illysanna_ravencrest' WHERE `entry`=98696;
UPDATE `creature_template` SET `ScriptName`='boss_nalthor' WHERE `entry`=166945;
UPDATE `creature_template` SET `ScriptName`='boss_swampface' WHERE `entry`=226396;
UPDATE `creature_template` SET `ScriptName`='boss_geezle_gigazap' WHERE `entry`=242255;
UPDATE `creature_template` SET `ScriptName`='boss_amarth' WHERE `entry`=163157;
UPDATE `creature_template` SET `ScriptName`='npc_kurtalos_trigger' WHERE `entry` IN (101054,100861,101028);
UPDATE `creature_template` SET `ScriptName`='boss_bront' WHERE `entry`=226402;
UPDATE `creature_template` SET `ScriptName`='boss_big_momma' WHERE `entry`=226398;
UPDATE `creature_template` SET `ScriptName`='boss_latosius' WHERE `entry`=98970;
UPDATE `creature_template` SET `ScriptName`='boss_blightbone' WHERE `entry`=162691;
UPDATE `creature_template` SET `ScriptName`='npc_brh_boulder' WHERE `entry`=100485;
UPDATE `creature_template` SET `ScriptName`='boss_keeza_quickfuse' WHERE `entry`=226403;
UPDATE `creature_template` SET `ScriptName`='npc_brh_wyrmtongue_scavenger' WHERE `entry`=98792;
UPDATE `creature_template` SET `ScriptName`='boss_smashspite_the_hateful' WHERE `entry`=98949;
UPDATE `creature_template` SET `ScriptName`='boss_surgeon_stitchflesh' WHERE `entry`=166882;
UPDATE `creature_template` SET `ScriptName`='npc_carrion_worm_nw' WHERE `entry`=164702;
UPDATE `instance_template` SET `script`='instance_operation_floodgate' WHERE `map`=2773;
UPDATE `instance_template` SET `script`='instance_necrotic_wake' WHERE `map`=2286;
DELETE FROM `spell_script_names` WHERE `spell_id`=197484 AND `ScriptName`='spell_illysanna_dark_rush';
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(197484, 'spell_illysanna_dark_rush');
DELETE FROM `spell_script_names` WHERE `spell_id`=197696 AND `ScriptName`='spell_illysanna_eye_beams';
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(197696, 'spell_illysanna_eye_beams');
DELETE FROM `spell_script_names` WHERE `spell_id`=197394 AND `ScriptName`='spell_illysanna_periodic_energize';
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(197394, 'spell_illysanna_periodic_energize');
DELETE FROM `spell_script_names` WHERE `spell_id`=198835 AND `ScriptName`='spell_latosius_random_teleport';
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(198835, 'spell_latosius_random_teleport');
DELETE FROM `spell_script_names` WHERE `spell_id`=198114 AND `ScriptName`='spell_smashpite_brutality_proc';
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(198114, 'spell_smashpite_brutality_proc');
DELETE FROM `spell_script_names` WHERE `spell_id`=201733 AND `ScriptName`='spell_kurtalos_stinging_swarm';
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(201733, 'spell_kurtalos_stinging_swarm');
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
@@ -0,0 +1,242 @@
DELETE FROM `creature_equip_template` WHERE (`ID`=1 AND `CreatureID` IN (253836,253746,263618,258755,265177,258068,257091,265186,259231,253690,271147,253689,253686,253691)) OR (`ID`=2 AND `CreatureID`=267123);
INSERT INTO `creature_equip_template` (`CreatureID`, `ID`, `ItemID1`, `AppearanceModID1`, `ItemVisual1`, `ItemID2`, `AppearanceModID2`, `ItemVisual2`, `ItemID3`, `AppearanceModID3`, `ItemVisual3`, `VerifiedBuild`) VALUES
(253836, 1, 155799, 0, 0, 0, 0, 0, 0, 0, 0, 69933), -- Quartermaster Grof
(253746, 1, 235234, 0, 0, 0, 0, 0, 0, 0, 0, 69933), -- Yona
(263618, 1, 0, 0, 0, 0, 0, 0, 235240, 0, 0, 69933), -- Scout Oma'ema
(258755, 1, 160435, 0, 0, 0, 0, 0, 0, 0, 0, 69933), -- Captain Tokka
(265177, 1, 235241, 0, 0, 0, 0, 0, 0, 0, 0, 69933), -- Gerodka
(258068, 1, 235241, 0, 0, 235245, 0, 0, 0, 0, 0, 69933), -- Olawu
(257091, 1, 242519, 0, 0, 235231, 0, 0, 0, 0, 0, 69933), -- Ra'kamu
(265186, 1, 235241, 0, 0, 0, 0, 0, 0, 0, 0, 69933), -- Kokona
(259231, 1, 155369, 0, 0, 0, 0, 0, 0, 0, 0, 69933), -- Jin'dan Deadtusk
(253690, 1, 235236, 0, 0, 0, 0, 0, 0, 0, 0, 69933), -- Amani Talon
(271147, 1, 235237, 0, 0, 235231, 0, 0, 235240, 0, 0, 69933), -- Amani Defender
(253689, 1, 265869, 0, 0, 0, 0, 0, 0, 0, 0, 69933), -- Shadowpine Wing
(253686, 1, 235241, 0, 0, 0, 0, 0, 0, 0, 0, 69933), -- Witherbark Fang
(253691, 1, 235242, 0, 0, 265884, 0, 0, 0, 0, 0, 69933), -- Revantusk Basher
(267123, 2, 2202, 0, 0, 0, 0, 0, 0, 0, 0, 69933); -- Brewfest Celebrant
UPDATE `creature_equip_template` SET `VerifiedBuild`=69933 WHERE (`ID`=1 AND `CreatureID` IN (246605,249753,240840,246626,240392,242487,243154,243049,253269,250584,222127,259567,250664,260573,241703,240936,242803,242802,260535,261304,260519,241425,208623,259667,251071,259777,250975,244493,258660,246231)) OR (`ID`=2 AND `CreatureID`=260519) OR (`ID`=3 AND `CreatureID` IN (260519,251071)) OR (`ID`=4 AND `CreatureID` IN (260519,251071)) OR (`ID`=6 AND `CreatureID`=260519) OR (`ID`=5 AND `CreatureID`=251071);
DELETE FROM `gameobject_template_addon` WHERE `entry` IN (454765 /*HDressing 2.0 - Standing, Kite02 Hanging - Children - JZB*/, 656417 /*Mysterious Tablet*/, 642665 /*Ruin Door*/, 654283 /*Door*/, 674231 /*Instance Portal*/, 648564 /*Vul'zahn's Smuggled Treasure*/, 672536 /*Thalassian Lumber*/, 653064 /*Ossified Relic*/, 642673 /*Box of Lukewarm Fish Guts*/, 642672 /*Scavenged Pepperplant*/, 642671 /*Box of Stale Hardtack*/, 642668 /*Basket of Salted Split Boar*/, 653410 /*Hearty Forage*/, 656382 /*Bar Tab Barrel*/, 454770 /*HDressing 2.0 - Poster, Medium - Trial of Style/Noblegarde/Children/Pilgrim/Midsummer/Brewfest - JZB*/);
INSERT INTO `gameobject_template_addon` (`entry`, `faction`, `flags`, `WorldEffectID`, `AIAnimKitID`) VALUES
(454765, 114, 0x0, 0, 0), -- HDressing 2.0 - Standing, Kite02 Hanging - Children - JZB
(656417, 0, 0x40020, 0, 0), -- Mysterious Tablet
(642665, 0, 0x30, 0, 0), -- Ruin Door
(654283, 0, 0x30, 0, 0), -- Door
(674231, 0, 0x20, 0, 0), -- Instance Portal
(648564, 0, 0x204000, 31586, 0), -- Vul'zahn's Smuggled Treasure
(672536, 94, 0x44000, 0, 0), -- Thalassian Lumber
(653064, 0, 0x40005, 0, 0), -- Ossified Relic
(642673, 0, 0x40000, 0, 0), -- Box of Lukewarm Fish Guts
(642672, 0, 0x40000, 0, 0), -- Scavenged Pepperplant
(642671, 0, 0x40000, 0, 0), -- Box of Stale Hardtack
(642668, 0, 0x40000, 0, 0), -- Basket of Salted Split Boar
(653410, 0, 0x1, 0, 0), -- Hearty Forage
(656382, 35, 0x20800004, 0, 0), -- Bar Tab Barrel
(454770, 114, 0x0, 0, 0); -- HDressing 2.0 - Poster, Medium - Trial of Style/Noblegarde/Children/Pilgrim/Midsummer/Brewfest - JZB
DELETE FROM `quest_offer_reward` WHERE `ID` IN (96525 /*Prey: Out of Our Depth*/, 96474 /*Prey: Something for Astalor*/, 96466 /*Prey: Anguish Island*/);
INSERT INTO `quest_offer_reward` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `RewardText`, `VerifiedBuild`) VALUES
(96525, 0, 0, 0, 0, 0, 0, 0, 0, 'You reek of fear and desperation.\n\nFascinating.', 69933), -- Prey: Out of Our Depth
(96474, 0, 0, 0, 0, 0, 0, 0, 0, '<Ethrandil sighs heavily.>\n\nOf course there are ghosts.', 69933), -- Prey: Something for Astalor
(96466, 0, 0, 0, 0, 0, 0, 0, 0, 'Snakes. \n\nWhy\'d it have to be snakes?', 69933); -- Prey: Anguish Island
DELETE FROM `quest_poi` WHERE (`QuestID`=96525 AND `BlobIndex`=0 AND `Idx1`=2) OR (`QuestID`=96525 AND `BlobIndex`=0 AND `Idx1`=1) OR (`QuestID`=96525 AND `BlobIndex`=0 AND `Idx1`=0) OR (`QuestID`=96474 AND `BlobIndex`=0 AND `Idx1`=2) OR (`QuestID`=96474 AND `BlobIndex`=0 AND `Idx1`=1) OR (`QuestID`=96474 AND `BlobIndex`=0 AND `Idx1`=0) OR (`QuestID`=96744 AND `BlobIndex`=0 AND `Idx1`=2) OR (`QuestID`=96744 AND `BlobIndex`=0 AND `Idx1`=1) OR (`QuestID`=96744 AND `BlobIndex`=0 AND `Idx1`=0) OR (`QuestID`=98234 AND `BlobIndex`=0 AND `Idx1`=1) OR (`QuestID`=98234 AND `BlobIndex`=0 AND `Idx1`=0) OR (`QuestID`=96635 AND `BlobIndex`=0 AND `Idx1`=1) OR (`QuestID`=96635 AND `BlobIndex`=0 AND `Idx1`=0);
INSERT INTO `quest_poi` (`QuestID`, `BlobIndex`, `Idx1`, `ObjectiveIndex`, `QuestObjectiveID`, `QuestObjectID`, `MapID`, `UiMapID`, `Priority`, `Flags`, `WorldEffectID`, `PlayerConditionID`, `NavigationPlayerConditionID`, `SpawnTrackingID`, `AlwaysAllowMergingBlobs`, `VerifiedBuild`) VALUES
(96525, 0, 2, 32, 0, 0, 0, 2512, 0, 0, 0, 0, 0, 3257755, 0, 69933), -- Prey: Out of Our Depth
(96525, 0, 1, 0, 473479, 265504, 0, 2512, 0, 0, 0, 0, 0, 3260539, 0, 69933), -- Prey: Out of Our Depth
(96525, 0, 0, -1, 0, 0, 0, 2393, 0, 0, 0, 0, 0, 2853599, 0, 69933), -- Prey: Out of Our Depth
(96474, 0, 2, 32, 0, 0, 0, 2512, 0, 0, 0, 0, 0, 0, 0, 69933), -- Prey: Something for Astalor
(96474, 0, 1, 1, 473364, 265318, 0, 2512, 0, 0, 0, 0, 0, 3258102, 0, 69933), -- Prey: Something for Astalor
(96474, 0, 0, -1, 0, 0, 0, 2512, 0, 0, 0, 0, 0, 3257755, 0, 69933), -- Prey: Something for Astalor
(96744, 0, 2, 32, 0, 0, 3075, 2600, 0, 2, 0, 0, 0, 0, 0, 69933), -- Bouncy Mushrooms
(96744, 0, 1, 31, 0, 0, 3075, 2600, 0, 2, 0, 0, 0, 0, 0, 69933), -- Bouncy Mushrooms
(96744, 0, 0, -1, 0, 0, 3075, 2600, 0, 2, 0, 0, 0, 0, 0, 69933), -- Bouncy Mushrooms
(98234, 0, 1, 32, 0, 0, 0, 2393, 0, 0, 0, 0, 0, 3118247, 0, 69933), -- Week 1 of 3: Gladiator's Distinction
(98234, 0, 0, -1, 0, 0, 0, 2393, 0, 0, 0, 0, 0, 3118247, 0, 69933), -- Week 1 of 3: Gladiator's Distinction
(96635, 0, 1, 32, 0, 0, 0, 2393, 0, 0, 0, 0, 0, 0, 0, 69933), -- Upgrade Practicum
(96635, 0, 0, -1, 0, 0, 0, 2393, 0, 0, 0, 0, 0, 2736116, 0, 69933); -- Upgrade Practicum
UPDATE `quest_poi` SET `VerifiedBuild`=69933 WHERE (`QuestID`=92150 AND `BlobIndex`=0 AND `Idx1`=1) OR (`QuestID`=92150 AND `BlobIndex`=0 AND `Idx1`=0) OR (`QuestID`=98218 AND `BlobIndex`=0 AND `Idx1`=0) OR (`QuestID`=96472 AND `BlobIndex`=0 AND `Idx1`=2) OR (`QuestID`=96472 AND `BlobIndex`=0 AND `Idx1`=1) OR (`QuestID`=96472 AND `BlobIndex`=0 AND `Idx1`=0) OR (`QuestID`=71242 AND `BlobIndex`=0 AND `Idx1`=0);
DELETE FROM `quest_poi_points` WHERE (`QuestID`=96525 AND `Idx1`=2 AND `Idx2`=0) OR (`QuestID`=96525 AND `Idx1`=1 AND `Idx2`=0) OR (`QuestID`=96525 AND `Idx1`=0 AND `Idx2`=0) OR (`QuestID`=96474 AND `Idx1`=2 AND `Idx2`=0) OR (`QuestID`=96474 AND `Idx1`=1 AND `Idx2`=0) OR (`QuestID`=96474 AND `Idx1`=0 AND `Idx2`=0) OR (`QuestID`=96744 AND `Idx1`=2 AND `Idx2`=0) OR (`QuestID`=96744 AND `Idx1`=1 AND `Idx2`=11) OR (`QuestID`=96744 AND `Idx1`=1 AND `Idx2`=10) OR (`QuestID`=96744 AND `Idx1`=1 AND `Idx2`=9) OR (`QuestID`=96744 AND `Idx1`=1 AND `Idx2`=8) OR (`QuestID`=96744 AND `Idx1`=1 AND `Idx2`=7) OR (`QuestID`=96744 AND `Idx1`=1 AND `Idx2`=6) OR (`QuestID`=96744 AND `Idx1`=1 AND `Idx2`=5) OR (`QuestID`=96744 AND `Idx1`=1 AND `Idx2`=4) OR (`QuestID`=96744 AND `Idx1`=1 AND `Idx2`=3) OR (`QuestID`=96744 AND `Idx1`=1 AND `Idx2`=2) OR (`QuestID`=96744 AND `Idx1`=1 AND `Idx2`=1) OR (`QuestID`=96744 AND `Idx1`=1 AND `Idx2`=0) OR (`QuestID`=96744 AND `Idx1`=0 AND `Idx2`=0) OR (`QuestID`=98234 AND `Idx1`=1 AND `Idx2`=0) OR (`QuestID`=98234 AND `Idx1`=0 AND `Idx2`=0) OR (`QuestID`=96635 AND `Idx1`=1 AND `Idx2`=0) OR (`QuestID`=96635 AND `Idx1`=0 AND `Idx2`=0);
INSERT INTO `quest_poi_points` (`QuestID`, `Idx1`, `Idx2`, `X`, `Y`, `Z`, `VerifiedBuild`) VALUES
(96525, 2, 0, 5940, -12071, 140, 69933), -- Prey: Out of Our Depth
(96525, 1, 0, 5937, -12073, 138, 69933), -- Prey: Out of Our Depth
(96525, 0, 0, 8548, -4927, 25, 69933), -- Prey: Out of Our Depth
(96474, 2, 0, 5937, -12072, 139, 69933), -- Prey: Something for Astalor
(96474, 1, 0, 5935, -12074, 138, 69933), -- Prey: Something for Astalor
(96474, 0, 0, 5940, -12071, 140, 69933), -- Prey: Something for Astalor
(96744, 2, 0, -2132, -1740, 0, 69933), -- Bouncy Mushrooms
(96744, 1, 11, -2208, -1787, 0, 69933), -- Bouncy Mushrooms
(96744, 1, 10, -2236, -1777, 0, 69933), -- Bouncy Mushrooms
(96744, 1, 9, -2247, -1730, 0, 69933), -- Bouncy Mushrooms
(96744, 1, 8, -2206, -1667, 0, 69933), -- Bouncy Mushrooms
(96744, 1, 7, -2176, -1631, 0, 69933), -- Bouncy Mushrooms
(96744, 1, 6, -2122, -1592, 0, 69933), -- Bouncy Mushrooms
(96744, 1, 5, -2057, -1592, 0, 69933), -- Bouncy Mushrooms
(96744, 1, 4, -2034, -1633, 0, 69933), -- Bouncy Mushrooms
(96744, 1, 3, -2029, -1676, 0, 69933), -- Bouncy Mushrooms
(96744, 1, 2, -2034, -1710, 0, 69933), -- Bouncy Mushrooms
(96744, 1, 1, -2065, -1780, 0, 69933), -- Bouncy Mushrooms
(96744, 1, 0, -2144, -1790, 0, 69933), -- Bouncy Mushrooms
(96744, 0, 0, -2121, -1740, 0, 69933), -- Bouncy Mushrooms
(98234, 1, 0, 8565, -4706, 19, 69933), -- Week 1 of 3: Gladiator's Distinction
(98234, 0, 0, 8565, -4706, 19, 69933), -- Week 1 of 3: Gladiator's Distinction
(96635, 1, 0, 8612, -4698, 20, 69933), -- Upgrade Practicum
(96635, 0, 0, 8612, -4698, 20, 69933); -- Upgrade Practicum
UPDATE `quest_poi_points` SET `VerifiedBuild`=69933 WHERE (`QuestID`=92150 AND `Idx1`=1 AND `Idx2`=0) OR (`QuestID`=92150 AND `Idx1`=0 AND `Idx2`=10) OR (`QuestID`=92150 AND `Idx1`=0 AND `Idx2`=9) OR (`QuestID`=92150 AND `Idx1`=0 AND `Idx2`=8) OR (`QuestID`=92150 AND `Idx1`=0 AND `Idx2`=7) OR (`QuestID`=92150 AND `Idx1`=0 AND `Idx2`=6) OR (`QuestID`=92150 AND `Idx1`=0 AND `Idx2`=5) OR (`QuestID`=92150 AND `Idx1`=0 AND `Idx2`=4) OR (`QuestID`=92150 AND `Idx1`=0 AND `Idx2`=3) OR (`QuestID`=92150 AND `Idx1`=0 AND `Idx2`=2) OR (`QuestID`=92150 AND `Idx1`=0 AND `Idx2`=1) OR (`QuestID`=92150 AND `Idx1`=0 AND `Idx2`=0) OR (`QuestID`=98218 AND `Idx1`=0 AND `Idx2`=0) OR (`QuestID`=96472 AND `Idx1`=2 AND `Idx2`=0) OR (`QuestID`=96472 AND `Idx1`=1 AND `Idx2`=11) OR (`QuestID`=96472 AND `Idx1`=1 AND `Idx2`=10) OR (`QuestID`=96472 AND `Idx1`=1 AND `Idx2`=9) OR (`QuestID`=96472 AND `Idx1`=1 AND `Idx2`=8) OR (`QuestID`=96472 AND `Idx1`=1 AND `Idx2`=7) OR (`QuestID`=96472 AND `Idx1`=1 AND `Idx2`=6) OR (`QuestID`=96472 AND `Idx1`=1 AND `Idx2`=5) OR (`QuestID`=96472 AND `Idx1`=1 AND `Idx2`=4) OR (`QuestID`=96472 AND `Idx1`=1 AND `Idx2`=3) OR (`QuestID`=96472 AND `Idx1`=1 AND `Idx2`=2) OR (`QuestID`=96472 AND `Idx1`=1 AND `Idx2`=1) OR (`QuestID`=96472 AND `Idx1`=1 AND `Idx2`=0) OR (`QuestID`=96472 AND `Idx1`=0 AND `Idx2`=0) OR (`QuestID`=71242 AND `Idx1`=0 AND `Idx2`=0);
DELETE FROM `quest_details` WHERE `ID` IN (96525 /*Prey: Out of Our Depth*/, 96474 /*Prey: Something for Astalor*/);
INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES
(96525, 0, 0, 0, 0, 0, 0, 0, 0, 69933), -- Prey: Out of Our Depth
(96474, 0, 0, 0, 0, 0, 0, 0, 0, 69933); -- Prey: Something for Astalor
UPDATE `ui_map_quest_line` SET `VerifiedBuild`=69933 WHERE (`UIMapId`=2512 AND `QuestLineId` IN (6329,6302,6277,6276,6274,6271,6264,6232,6231,6230,6229,6227,6224,6128,6123,6118,6115,6114,6090,6089,6087,6086,6055,6050,6045,6031,5999,5988,5981,5979,5975,5971,5939,5938,5905,5901,5778,5724,5723,5722));
UPDATE `ui_map_quest` SET `VerifiedBuild`=69933 WHERE (`UIMapId`=2395 AND `QuestId`=92122) OR (`UIMapId`=2393 AND `QuestId`=92122) OR (`UIMapId`=2512 AND `QuestId` IN (93440,93051,93050,93049,93048,93047,91930));
DELETE FROM `creature_queststarter` WHERE (`id`=265267 AND `quest` IN (96525,96474));
INSERT INTO `creature_queststarter` (`id`, `quest`, `VerifiedBuild`) VALUES
(265267, 96525, 69933), -- Prey: Out of Our Depth offered by Sanctum Attendant Ethrandil
(265267, 96474, 69933); -- Prey: Something for Astalor offered by Sanctum Attendant Ethrandil
DELETE FROM `creature_questender` WHERE (`id`=246231 AND `quest`=96525) OR (`id`=265267 AND `quest` IN (96474,96466));
INSERT INTO `creature_questender` (`id`, `quest`, `VerifiedBuild`) VALUES
(246231, 96525, 69933), -- Prey: Out of Our Depth ended by Astalor Bloodsworn
(265267, 96474, 69933), -- Prey: Something for Astalor ended by Sanctum Attendant Ethrandil
(265267, 96466, 69933); -- Prey: Anguish Island ended by Sanctum Attendant Ethrandil
DELETE FROM `world_quest_template` WHERE `QuestID` IN (93905 /*Ongoing Stoppage*/, 93704 /*Traditional Harvests*/, 83529 /*Hallowfall Fishing Derby*/, 53229 /*Arathi Donations: Enchant Ring - Seal of Critical Strike*/, 69931 /*Swoop And Grab*/, 81622 /*Bells of the Light*/, 53706 /*Salvage the Supplies*/, 53717 /*Hold the Highland*/, 53265 /*Arathi Donations: Gold*/, 96640 /*Bounty of the Cursed*/, 53219 /*Arathi Donations: Monel-Hardened Stirrups*/, 54266 /*Mortar Master Zapfritz*/);
INSERT INTO `world_quest_template` (`QuestID`, `Duration`, `VariableID`, `Value`) VALUES
(93905, 302400, 29850, 1), -- Ongoing Stoppage
(93704, 604800, 30194, 5), -- Traditional Harvests
(83529, 604800, 26597, 2), -- Hallowfall Fishing Derby
(53229, 86400, 16728, 1), -- Arathi Donations: Enchant Ring - Seal of Critical Strike
(69931, 302400, 22194, 1), -- Swoop And Grab
(81622, 86400, 25937, 1), -- Bells of the Light
(53706, 25200, 16289, 1), -- Salvage the Supplies
(53717, 25200, 16289, 1), -- Hold the Highland
(53265, 86400, 16717, 1), -- Arathi Donations: Gold
(96640, 86400, 31553, 1), -- Bounty of the Cursed
(53219, 86400, 16721, 1), -- Arathi Donations: Monel-Hardened Stirrups
(54266, 25200, 16289, 1); -- Mortar Master Zapfritz
UPDATE `world_quest_template` SET `VariableID`=14247 WHERE `QuestID`=49096; -- Invasion Point: Naigtal
DELETE FROM `spawn_tracking_template` WHERE `SpawnTrackingId` IN (3260539 /*Map: 0 (Eastern Kingdoms) - Phase: 29042*/, 3258102 /*Map: 0 (Eastern Kingdoms) - Phase: 0*/);
INSERT INTO `spawn_tracking_template` (`SpawnTrackingId`, `MapId`, `PhaseId`, `PhaseGroup`, `PhaseUseFlags`, `VerifiedBuild`) VALUES
(3260539, 0, 29042, 0, 0, 69933), -- Map: 0 (Eastern Kingdoms) - Phase: 29042
(3258102, 0, 0, 0, 0, 69933); -- Map: 0 (Eastern Kingdoms) - Phase: 0
UPDATE `spawn_tracking_template` SET `PhaseId`=29045 WHERE `SpawnTrackingId`=3257755;
UPDATE `spawn_tracking_template` SET `PhaseId`=27393 WHERE `SpawnTrackingId`=2853599;
UPDATE `spawn_tracking_template` SET `VerifiedBuild`=69933 WHERE `SpawnTrackingId` IN (3118247, 3235595, 2736116, 2265851);
UPDATE `spawn_tracking_template` SET `PhaseId`=0, `VerifiedBuild`=69933 WHERE `SpawnTrackingId` IN (3246680, 3246676); -- Map: 3075 (Naigtal) - Phase: 0
DELETE FROM `spawn_tracking_quest_objective` WHERE (`SpawnTrackingId`=3260539 AND `QuestObjectiveId`=473479) OR (`SpawnTrackingId`=3258102 AND `QuestObjectiveId`=473364);
INSERT INTO `spawn_tracking_quest_objective` (`SpawnTrackingId`, `QuestObjectiveId`, `VerifiedBuild`) VALUES
(3260539, 473479, 69933), -- 3260539
(3258102, 473364, 69933); -- 3258102
DELETE FROM `spell_target_position` WHERE (`ID`=1294999 AND `EffectIndex`=0 AND `OrderIndex`=0);
INSERT INTO `spell_target_position` (`ID`, `EffectIndex`, `OrderIndex`, `MapID`, `PositionX`, `PositionY`, `PositionZ`, `VerifiedBuild`) VALUES
(1294999, 0, 0, 0, 8516.7900390625, -4928.5, 26.53000068664550781, 69933); -- Spell: 1294999 ([DNT] The Coiled Isle to Sanctum) Effect 0: 252 (SPELL_EFFECT_TELEPORT_UNITS)
UPDATE `creature_model_info` SET `VerifiedBuild`=69933 WHERE `DisplayID` IN (30184, 136591, 68157, 99826, 128652, 85945, 129212, 129213, 42741, 124183, 59003, 128634, 124457, 128650, 89802, 126522, 99827, 99832, 128622, 86546, 16065, 126891, 126897, 99831, 126893, 129211, 129208, 128633, 89418, 129979, 128680, 115399, 126895, 126896, 128631, 129210, 129209, 26907, 137094, 120336, 136919, 139428, 138985, 138984, 136696, 138901, 136851, 138652, 124216, 131065, 130720, 138072, 130816, 131061, 131162, 131069, 130813, 130968, 130810, 131059, 130808, 130798, 131161, 104521, 130719, 131075, 131076, 130836, 131168, 131290, 130796, 114621, 125982, 131163, 87552, 87543, 130795, 130717, 131074, 130970, 130979, 130973, 56187, 124959, 130725, 130814, 130972, 130726, 130793, 28998, 131160, 114623, 131165, 130982, 131070, 28111, 136712, 136665, 136733, 138983, 5554, 136747, 136848, 137096, 137683);
UPDATE `creature_model_info` SET `BoundingRadius`=0.5, `CombatReach`=0.5, `VerifiedBuild`=69933 WHERE `DisplayID`=143389;
UPDATE `creature_model_info` SET `BoundingRadius`=0.790108144283294677, `CombatReach`=1.65000009536743164 WHERE `DisplayID`=131956;
UPDATE `creature_model_info` SET `BoundingRadius`=1.201061129570007324, `VerifiedBuild`=69933 WHERE `DisplayID`=125877;
UPDATE `creature_model_info` SET `BoundingRadius`=1.980034708976745605, `CombatReach`=3.20000004768371582 WHERE `DisplayID`=136107;
UPDATE `creature_model_info` SET `BoundingRadius`=1.231379508972167968, `CombatReach`=1.20000004768371582 WHERE `DisplayID`=129981;
UPDATE `creature_model_info` SET `BoundingRadius`=0.300000011920928955, `VerifiedBuild`=69933 WHERE `DisplayID`=144522;
UPDATE `creature_model_info` SET `BoundingRadius`=1.254667878150939941, `CombatReach`=1.65000009536743164, `VerifiedBuild`=69933 WHERE `DisplayID`=137937;
UPDATE `creature_model_info` SET `BoundingRadius`=0.401224195957183837, `CombatReach`=1, `VerifiedBuild`=69933 WHERE `DisplayID` IN (143769, 143767);
UPDATE `creature_model_info` SET `BoundingRadius`=0.382999986410140991, `CombatReach`=1.5, `VerifiedBuild`=69933 WHERE `DisplayID`=144432;
UPDATE `creature_model_info` SET `BoundingRadius`=1, `VerifiedBuild`=69933 WHERE `DisplayID` IN (138073, 138071);
UPDATE `creature_model_info` SET `BoundingRadius`=1.596849918365478515, `CombatReach`=2.099999904632568359, `VerifiedBuild`=69933 WHERE `DisplayID`=145432;
UPDATE `creature_model_info` SET `BoundingRadius`=0.521591424942016601, `CombatReach`=1.299999952316284179, `VerifiedBuild`=69933 WHERE `DisplayID`=144389;
UPDATE `creature_model_info` SET `BoundingRadius`=1.017498612403869628, `CombatReach`=1.10000002384185791, `VerifiedBuild`=69933 WHERE `DisplayID` IN (139947, 141422);
UPDATE `creature_model_info` SET `BoundingRadius`=0.561713874340057373, `CombatReach`=1.399999976158142089, `VerifiedBuild`=69933 WHERE `DisplayID`=144393;
UPDATE `creature_model_info` SET `BoundingRadius`=0.5, `CombatReach`=1, `VerifiedBuild`=69933 WHERE `DisplayID` IN (113180, 113182);
UPDATE `creature_model_info` SET `DisplayID_Other_Gender`=0, `VerifiedBuild`=69933 WHERE `DisplayID`=21838;
UPDATE `creature_template_spell` SET `Spell`=264667, `VerifiedBuild`=69933 WHERE (`CreatureID`=165189 AND `Index`=6); -- Generic Hunter Pet
UPDATE `creature_template_spell` SET `Spell`=2649, `VerifiedBuild`=69933 WHERE (`CreatureID`=165189 AND `Index`=5); -- Generic Hunter Pet
UPDATE `creature_template_spell` SET `Spell`=159953, `VerifiedBuild`=69933 WHERE (`CreatureID`=165189 AND `Index`=4); -- Generic Hunter Pet
UPDATE `creature_template_spell` SET `Spell`=54680, `VerifiedBuild`=69933 WHERE (`CreatureID`=165189 AND `Index`=3); -- Generic Hunter Pet
DELETE FROM `npc_vendor` WHERE (`entry`=259939 AND `item`=267400 AND `ExtendedCost`=11494 AND `type`=1) OR (`entry`=259939 AND `item`=267399 AND `ExtendedCost`=11494 AND `type`=1) OR (`entry`=259939 AND `item`=256756 AND `ExtendedCost`=11030 AND `type`=1) OR (`entry`=259939 AND `item`=256754 AND `ExtendedCost`=11030 AND `type`=1) OR (`entry`=259939 AND `item`=264666 AND `ExtendedCost`=11397 AND `type`=1) OR (`entry`=259939 AND `item`=263933 AND `ExtendedCost`=11140 AND `type`=1) OR (`entry`=259939 AND `item`=278241 AND `ExtendedCost`=11351 AND `type`=1) OR (`entry`=259939 AND `item`=266199 AND `ExtendedCost`=11351 AND `type`=1) OR (`entry`=259939 AND `item`=266198 AND `ExtendedCost`=11351 AND `type`=1) OR (`entry`=259939 AND `item`=266197 AND `ExtendedCost`=11351 AND `type`=1) OR (`entry`=259939 AND `item`=266196 AND `ExtendedCost`=11351 AND `type`=1) OR (`entry`=259939 AND `item`=258030 AND `ExtendedCost`=11144 AND `type`=1) OR (`entry`=259939 AND `item`=258026 AND `ExtendedCost`=11144 AND `type`=1) OR (`entry`=259939 AND `item`=258028 AND `ExtendedCost`=11144 AND `type`=1) OR (`entry`=259939 AND `item`=258024 AND `ExtendedCost`=10948 AND `type`=1) OR (`entry`=259939 AND `item`=258022 AND `ExtendedCost`=10948 AND `type`=1) OR (`entry`=259939 AND `item`=257192 AND `ExtendedCost`=10951 AND `type`=1) OR (`entry`=259939 AND `item`=257191 AND `ExtendedCost`=10950 AND `type`=1) OR (`entry`=259939 AND `item`=264434 AND `ExtendedCost`=11360 AND `type`=1) OR (`entry`=259939 AND `item`=259991 AND `ExtendedCost`=10991 AND `type`=1);
INSERT INTO `npc_vendor` (`entry`, `slot`, `item`, `maxcount`, `ExtendedCost`, `type`, `PlayerConditionID`, `IgnoreFiltering`, `VerifiedBuild`) VALUES
(259939, 21, 267400, 0, 11494, 1, 0, 0, 69933), -- Technique: Wild Hanging Scroll
(259939, 20, 267399, 0, 11494, 1, 0, 0, 69933), -- Technique: Sturdy Ren'dorei Cask
(259939, 19, 256756, 0, 11030, 1, 0, 0, 69933), -- Formula: Enchant Boots - Farstrider's Hunt
(259939, 18, 256754, 0, 11030, 1, 0, 0, 69933), -- Formula: Enchant Shoulders - Nature's Embrace
(259939, 17, 264666, 0, 11397, 1, 0, 0, 69933), -- Rod of Exanguishation
(259939, 16, 263933, 0, 11140, 1, 0, 0, 69933), -- Preyseeker's Hearthstone
(259939, 15, 278241, 0, 11351, 1, 0, 0, 69933), -- Arsenal: Preyseeker's Lost Armaments
(259939, 14, 266199, 0, 11351, 1, 0, 0, 69933), -- Ensemble: Preyseeker's Polished Armor
(259939, 13, 266198, 0, 11351, 1, 0, 0, 69933), -- Ensemble: Preyseeker's Rugged Armor
(259939, 12, 266197, 0, 11351, 1, 0, 0, 69933), -- Ensemble: Preyseeker's Sleek Armor
(259939, 11, 266196, 0, 11351, 1, 0, 0, 69933), -- Ensemble: Preyseeker's Refined Armor
(259939, 10, 258030, 0, 11144, 1, 0, 0, 69933), -- Famed Preyseeker's Knapsack
(259939, 9, 258026, 0, 11144, 1, 0, 0, 69933), -- Famed Preyseeker's Shoulder-spikes
(259939, 8, 258028, 0, 11144, 1, 0, 0, 69933), -- Famed Preyseeker's Plumed Helm
(259939, 7, 258024, 0, 10948, 1, 0, 0, 69933), -- Skilled Preyseeker's Shoulder-spikes
(259939, 6, 258022, 0, 10948, 1, 0, 0, 69933), -- Skilled Preyseeker's Plumed Helm
(259939, 5, 257192, 0, 10951, 1, 0, 0, 69933), -- Preyseeker's Wrath
(259939, 4, 257191, 0, 10950, 1, 0, 0, 69933), -- Preyseeker's Hubris
(259939, 3, 264434, 0, 11360, 1, 0, 0, 69933), -- Voldy
(259939, 2, 259991, 0, 10991, 1, 0, 0, 69933); -- Lil' Preyseeker
DELETE FROM `gameobject_template` WHERE `entry` IN (656417 /*Mysterious Tablet*/, 642665 /*Ruin Door*/, 654283 /*Door*/, 674231 /*Instance Portal*/, 654266 /*Camfire*/, 672536 /*Thalassian Lumber*/, 648564 /*Vul'zahn's Smuggled Treasure*/, 587292 /*Mailbox*/, 653399 /*Medicinal Herbs*/, 653410 /*Hearty Forage*/, 653467 /*Reclaimed Weaponry*/, 653394 /*Crate of Supplies*/, 653395 /*Crate of Supplies*/, 653397 /*Basket of Supplies*/, 653064 /*Ossified Relic*/, 642822 /*Stale Hardtack*/, 642804 /*Army Stew Pot*/, 642668 /*Basket of Salted Split Boar*/, 642672 /*Scavenged Pepperplant*/, 642821 /*Salted Split Boar*/, 642671 /*Box of Stale Hardtack*/, 642811 /*Crate*/, 642673 /*Box of Lukewarm Fish Guts*/, 642809 /*Fish?*/, 587291 /*Forge*/, 587290 /*Anvil*/);
INSERT INTO `gameobject_template` (`entry`, `type`, `displayId`, `name`, `IconName`, `castBarCaption`, `unk1`, `size`, `Data0`, `Data1`, `Data2`, `Data3`, `Data4`, `Data5`, `Data6`, `Data7`, `Data8`, `Data9`, `Data10`, `Data11`, `Data12`, `Data13`, `Data14`, `Data15`, `Data16`, `Data17`, `Data18`, `Data19`, `Data20`, `Data21`, `Data22`, `Data23`, `Data24`, `Data25`, `Data26`, `Data27`, `Data28`, `Data29`, `Data30`, `Data31`, `Data32`, `Data33`, `Data34`, `RequiredLevel`, `ContentTuningId`, `VerifiedBuild`) VALUES
(656417, 10, 105670, 'Mysterious Tablet', 'questinteract', 'Investigating', '', 1, 2722, 0, 0, 3000, 0, 0, 0, 10703, 0, 2, 1298114, 0, 0, 1, 56085, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 500, 0, 80, 3085, 69933), -- Mysterious Tablet
(642665, 0, 113515, 'Ruin Door', '', '', '', 1, 0, 0, 3000, 0, 0, 0, 0, 0, 1, 1, 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, 69933), -- Ruin Door
(654283, 0, 125627, 'Door', '', '', '', 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 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, 69933), -- Door
(674231, 5, 129861, 'Instance Portal', '', '', '', 3, 0, 0, 0, 1, 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, 69933), -- Instance Portal
(654266, 8, 110245, 'Camfire', '', '', '', 1, 4, 10, 2061, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69933), -- Camfire
(672536, 50, 106528, 'Thalassian Lumber', 'axe', '', '', 1, 4098, 133662, 0, 0, 0, 0, 30, 0, 0, 0, 0, 147322, 0, 1, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5937, 69933), -- Thalassian Lumber
(648564, 3, 108890, 'Vul\'zahn\'s Smuggled Treasure', '', 'Opening', '', 0.800000011920928955, 4393, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37521, 0, 0, 0, 0, 5, 32768, 0, 0, 0, 0, 0, 1289548, 0, 0, 7610, 140507, 0, 0, 0, 0, 90, 5381, 69933), -- Vul'zahn's Smuggled Treasure
(587292, 19, 49487, 'Mailbox', '', '', '', 1, 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, 69933), -- Mailbox
(653399, 10, 30842, 'Medicinal Herbs', 'questinteract', '', '', 1.20000004768371582, 0, 0, 0, 3000, 0, 0, 0, 0, 0, 0, 1294511, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69933), -- Medicinal Herbs
(653410, 10, 125466, 'Hearty Forage', 'questinteract', '', '', 0.699999988079071044, 0, 0, 0, 3000, 0, 0, 0, 0, 0, 0, 1294926, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69933), -- Hearty Forage
(653467, 10, 105896, 'Reclaimed Weaponry', 'questinteract', '', '', 1, 0, 0, 0, 3000, 0, 0, 0, 0, 0, 0, 1294991, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69933), -- Reclaimed Weaponry
(653394, 5, 106299, 'Crate of Supplies', '', '', '', 2, 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, 69933), -- Crate of Supplies
(653395, 5, 106299, 'Crate of Supplies', '', '', '', 1.20000004768371582, 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, 69933), -- Crate of Supplies
(653397, 5, 108410, 'Basket of Supplies', '', '', '', 1, 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, 69933), -- Basket of Supplies
(653064, 10, 122674, 'Ossified Relic', 'questinteract', '', '', 1, 4426, 96474, 0, 3000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69933), -- Ossified Relic
(642822, 5, 105279, 'Stale Hardtack', '', '', '', 1, 0, 1, 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, 90, 5381, 69933), -- Stale Hardtack
(642804, 5, 49777, 'Army Stew Pot', '', '', '', 0.800000011920928955, 0, 1, 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, 90, 5381, 69933), -- Army Stew Pot
(642668, 10, 102872, 'Basket of Salted Split Boar', 'questinteract', '', '', 1, 3039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 417169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 154166, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 2699, 69933), -- Basket of Salted Split Boar
(642672, 10, 47067, 'Scavenged Pepperplant', 'questinteract', '', '', 1, 3039, 0, 0, 1, 0, 0, 0, 0, 0, 0, 417162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 154166, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 2699, 69933), -- Scavenged Pepperplant
(642821, 5, 75162, 'Salted Split Boar', '', '', '', 1, 0, 1, 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, 90, 5381, 69933), -- Salted Split Boar
(642671, 10, 102863, 'Box of Stale Hardtack', 'questinteract', '', '', 1, 3039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 417165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 154166, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 2699, 69933), -- Box of Stale Hardtack
(642811, 5, 45884, 'Crate', '', '', '', 1, 0, 1, 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, 90, 5381, 69933), -- Crate
(642673, 10, 102863, 'Box of Lukewarm Fish Guts', 'questinteract', '', '', 1, 3039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 417164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 154166, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 2699, 69933), -- Box of Lukewarm Fish Guts
(642809, 5, 78259, 'Fish?', '', '', '', 1, 0, 1, 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, 90, 5381, 69933), -- Fish?
(587291, 8, 75301, 'Forge', '', '', '', 1, 3, 10, 0, 0, 0, 0, 0, 0, 103829, 0, 30092, 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, 69933), -- Forge
(587290, 8, 48031, 'Anvil', '', '', '', 1, 1, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69933); -- Anvil
DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_hun_no_hard_feelings';
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(34477, 'spell_hun_no_hard_feelings');
DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_hun_trailblazer';
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(199921, 'spell_hun_trailblazer');
@@ -1935,6 +1935,16 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PrepareStatement(HOTFIX_SEL_QUEST_V2, "SELECT ID, UniqueBitFlag, UiQuestDetailsTheme FROM quest_v2 WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_QUEST_V2, "SELECT MAX(ID) + 1 FROM quest_v2", CONNECTION_SYNCH);
// QuestV2CliTask.db2
PrepareStatement(HOTFIX_SEL_QUEST_V2_CLI_TASK, "SELECT ID, QuestTitle, BulletText, UniqueBitFlag, ConditionID, FiltActiveQuest, FiltClasses, "
"FiltCompletedQuestLogic, FiltMaxFactionID, FiltMaxFactionValue, FiltMinFactionID, FiltMinFactionValue, FiltMinSkillID, FiltMinSkillValue, "
"FiltNonActiveQuest, BreadCrumbID, StartItem, WorldStateExpressionID, QuestInfoID, ContentTuningID, CovenantID, Field_9_0_2_36206_022, "
"Flags1, Flags2, Flags3, FiltCompletedQuest1, FiltCompletedQuest2, FiltCompletedQuest3, FiltRaceMasks1, FiltRaceMasks2 "
"FROM quest_v2_cli_task WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_QUEST_V2_CLI_TASK, "SELECT MAX(ID) + 1 FROM quest_v2_cli_task", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_QUEST_V2_CLI_TASK, "SELECT ID, QuestTitle_lang, BulletText_lang FROM quest_v2_cli_task_locale"
" WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH);
// QuestXp.db2
PrepareStatement(HOTFIX_SEL_QUEST_XP, "SELECT ID, Difficulty1, Difficulty2, Difficulty3, Difficulty4, Difficulty5, Difficulty6, Difficulty7, "
"Difficulty8, Difficulty9, Difficulty10 FROM quest_xp WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+4 -10
View File
@@ -395,17 +395,11 @@ void ArenaTeam::Disband()
sArenaTeamMgr->RemoveArenaTeam(TeamId);
}
void ArenaTeam::SendStats(WorldSession* session)
void ArenaTeam::SendStats(WorldSession* /*session*/)
{
WorldPacket data(SMSG_ARENA_TEAM_STATS, 4*7);
data << uint32(GetId()); // team id
data << uint32(Stats.Rating); // rating
data << uint32(Stats.WeekGames); // games this week
data << uint32(Stats.WeekWins); // wins this week
data << uint32(Stats.SeasonGames); // played this season
data << uint32(Stats.SeasonWins); // wins this season
data << uint32(Stats.Rank); // rank
session->SendPacket(&data);
// Retail has no arena team stats packet since arena teams were replaced by rated
// matchmaking - SMSG_ARENA_TEAM_STATS only survives in Opcodes.h as a compile
// placeholder with no value, so sending it would put opcode 0xBADD on the wire.
}
void ArenaTeam::NotifyStatsChanged()
+39
View File
@@ -5441,6 +5441,45 @@ struct QuestV2LoadInfo
static constexpr DB2LoadInfo Instance{ Fields, 3, &QuestV2Meta::Instance, HOTFIX_SEL_QUEST_V2 };
};
struct QuestV2CliTaskLoadInfo
{
static constexpr DB2FieldMeta Fields[30] =
{
{.IsSigned = false, .Type = FT_INT, .Name = "ID" },
{.IsSigned = false, .Type = FT_STRING, .Name = "QuestTitle" },
{.IsSigned = false, .Type = FT_STRING, .Name = "BulletText" },
{.IsSigned = true, .Type = FT_INT, .Name = "UniqueBitFlag" },
{.IsSigned = false, .Type = FT_INT, .Name = "ConditionID" },
{.IsSigned = false, .Type = FT_INT, .Name = "FiltActiveQuest" },
{.IsSigned = true, .Type = FT_SHORT, .Name = "FiltClasses" },
{.IsSigned = false, .Type = FT_INT, .Name = "FiltCompletedQuestLogic" },
{.IsSigned = false, .Type = FT_INT, .Name = "FiltMaxFactionID" },
{.IsSigned = false, .Type = FT_INT, .Name = "FiltMaxFactionValue" },
{.IsSigned = false, .Type = FT_INT, .Name = "FiltMinFactionID" },
{.IsSigned = false, .Type = FT_INT, .Name = "FiltMinFactionValue" },
{.IsSigned = false, .Type = FT_INT, .Name = "FiltMinSkillID" },
{.IsSigned = false, .Type = FT_INT, .Name = "FiltMinSkillValue" },
{.IsSigned = false, .Type = FT_INT, .Name = "FiltNonActiveQuest" },
{.IsSigned = false, .Type = FT_INT, .Name = "BreadCrumbID" },
{.IsSigned = true, .Type = FT_INT, .Name = "StartItem" },
{.IsSigned = true, .Type = FT_INT, .Name = "WorldStateExpressionID" },
{.IsSigned = false, .Type = FT_INT, .Name = "QuestInfoID" },
{.IsSigned = true, .Type = FT_INT, .Name = "ContentTuningID" },
{.IsSigned = true, .Type = FT_INT, .Name = "CovenantID" },
{.IsSigned = true, .Type = FT_INT, .Name = "Field_9_0_2_36206_022" },
{.IsSigned = true, .Type = FT_INT, .Name = "Flags1" },
{.IsSigned = true, .Type = FT_INT, .Name = "Flags2" },
{.IsSigned = true, .Type = FT_INT, .Name = "Flags3" },
{.IsSigned = false, .Type = FT_INT, .Name = "FiltCompletedQuest1" },
{.IsSigned = false, .Type = FT_INT, .Name = "FiltCompletedQuest2" },
{.IsSigned = false, .Type = FT_INT, .Name = "FiltCompletedQuest3" },
{.IsSigned = true, .Type = FT_INT, .Name = "FiltRaceMasks1" },
{.IsSigned = true, .Type = FT_INT, .Name = "FiltRaceMasks2" },
};
static constexpr DB2LoadInfo Instance{ Fields, 30, &QuestV2CliTaskMeta::Instance, HOTFIX_SEL_QUEST_V2_CLI_TASK };
};
struct QuestXpLoadInfo
{
static constexpr DB2FieldMeta Fields[11] =
+2
View File
@@ -379,6 +379,7 @@ DB2Storage<QuestMoneyRewardEntry> sQuestMoneyRewardStore("QuestMon
DB2Storage<QuestPackageItemEntry> sQuestPackageItemStore("QuestPackageItem.db2", &QuestPackageItemLoadInfo::Instance);
DB2Storage<QuestSortEntry> sQuestSortStore("QuestSort.db2", &QuestSortLoadInfo::Instance);
DB2Storage<QuestV2Entry> sQuestV2Store("QuestV2.db2", &QuestV2LoadInfo::Instance);
DB2Storage<QuestV2CliTaskEntry> sQuestV2CliTaskStore("QuestV2CliTask.db2", &QuestV2CliTaskLoadInfo::Instance);
DB2Storage<QuestXPEntry> sQuestXPStore("QuestXP.db2", &QuestXpLoadInfo::Instance);
DB2Storage<RandPropPointsEntry> sRandPropPointsStore("RandPropPoints.db2", &RandPropPointsLoadInfo::Instance);
DB2Storage<RewardPackEntry> sRewardPackStore("RewardPack.db2", &RewardPackLoadInfo::Instance);
@@ -1505,6 +1506,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul
LOAD_DB2(sQuestPackageItemStore);
LOAD_DB2(sQuestSortStore);
LOAD_DB2(sQuestV2Store);
LOAD_DB2(sQuestV2CliTaskStore);
LOAD_DB2(sQuestXPStore);
LOAD_DB2(sRandPropPointsStore);
LOAD_DB2(sRewardPackStore);
+1
View File
@@ -446,6 +446,7 @@ TC_GAME_API extern DB2Storage<RenownRewardsEntry> sRenownRewar
TC_GAME_API extern DB2Storage<RenownRewardsPlunderstormEntry> sRenownRewardsPlunderstormStore;
TC_GAME_API extern DB2Storage<CampaignXConditionEntry> sCampaignXConditionStore;
TC_GAME_API extern DB2Storage<QuestLineEntry> sQuestLineStore;
TC_GAME_API extern DB2Storage<QuestV2CliTaskEntry> sQuestV2CliTaskStore;
TC_GAME_API extern DB2Storage<CurrencyCategoryEntry> sCurrencyCategoryStore;
TC_GAME_API extern DB2Storage<FactionGroupEntry> sFactionGroupStore;
TC_GAME_API extern DB2Storage<UiTextureKitEntry> sUiTextureKitStore;
+28
View File
@@ -6761,6 +6761,34 @@ struct BattlePetStateEntry
uint16 BattlePetVisualID;
};
struct QuestV2CliTaskEntry
{
uint32 ID;
LocalizedString QuestTitle;
LocalizedString BulletText;
int32 UniqueBitFlag;
uint32 ConditionID;
uint32 FiltActiveQuest;
int16 FiltClasses;
uint32 FiltCompletedQuestLogic;
uint32 FiltMaxFactionID;
uint32 FiltMaxFactionValue;
uint32 FiltMinFactionID;
uint32 FiltMinFactionValue;
uint32 FiltMinSkillID;
uint32 FiltMinSkillValue;
uint32 FiltNonActiveQuest;
uint32 BreadCrumbID;
int32 StartItem;
int32 WorldStateExpressionID;
uint32 QuestInfoID;
int32 ContentTuningID;
int32 CovenantID;
int32 Field_9_0_2_36206_022;
std::array<int32, 3> Flags;
std::array<uint32, 3> FiltCompletedQuest;
std::array<int32, 2> FiltRaceMasks;
};
//WowCommunity
#pragma pack(pop)
#endif
+1 -1
View File
@@ -23,7 +23,7 @@
#include <span>
#include <vector>
class ItemTemplate;
struct ItemTemplate;
class Player;
struct ItemBonusEntry;
struct MapDifficultyEntry;
@@ -168,6 +168,7 @@
#include "OmniumFolioMgr.h"
#include "CovenantPackets.h"
#include "WeeklyRewardsMgr.h"
#include "WorldQuestMgr.h"
#include "QuaternionData.h"
#include "LFGPackets.h"
#include <cmath>
@@ -6279,6 +6280,7 @@ bool Player::UpdatePosition(float x, float y, float z, float orientation, bool t
CheckAreaExplore();
//WowCommunity
UpdateWorldQuestPosition(x, y);
_UpdateArchaeologySurveyIndicator();
//WowCommunity
@@ -15196,6 +15198,12 @@ void Player::AddQuest(Quest const* quest, Object* questGiver)
if (questGiver && questGiver->GetTypeId() == TYPEID_PLAYER)
limittime = questGiver->ToPlayer()->getQuestStatusMap()[quest_id].Timer / IN_MILLISECONDS;
// World quests rotate on their own schedule, so the static LimitTime from the quest
// template is wrong. Override before the timer is derived below, otherwise this is a no-op.
if (quest->IsWorldQuest())
if (uint32 worldQuestTimer = sWorldQuestMgr->GetTimerForQuest(uint32(quest_id)))
limittime = worldQuestTimer;
AddTimedQuest(quest_id);
questStatusData.Timer = limittime * IN_MILLISECONDS;
endTime = GameTime::GetGameTime() + limittime;
@@ -15203,6 +15211,7 @@ void Player::AddQuest(Quest const* quest, Object* questGiver)
else
questStatusData.Timer = 0;
if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
{
pvpInfo.IsHostile = true;
@@ -36116,3 +36125,56 @@ void Player::UpdateDynamicFlight(bool apply)
RemoveAura(SPELL_DYNAMIC_FLIGHT);
}
}
void Player::UpdateWorldQuestPosition(float x, float y)
{
if (time(nullptr) < m_areaQuestTimer)
return;
m_areaQuestTimer = time(nullptr) + 2;
for (auto bonus_quest : sObjectMgr->BonusQuestsRects)
{
if (IsQuestRewarded(bonus_quest.first))
continue;
bool found = false;
for (uint32 i = 0; i < bonus_quest.second.size(); ++i)
{
if (bonus_quest.second[i].IsIn(GetMapId(), x, y))
found = true;
}
uint32 slot = FindQuestSlot(bonus_quest.first);
Quest const* quest = sObjectMgr->GetQuestTemplate(bonus_quest.first);
if (!quest)
continue;
if (!found && slot < MAX_QUEST_LOG_SIZE)
{
SetQuestSlot(slot, 0);
RemoveActiveQuest(uint32(bonus_quest.first), true);
}
else if (found && slot >= MAX_QUEST_LOG_SIZE)
{
if (!CanTakeQuest(quest, false))
continue;
//if (quest->IsWorldQuest())
//{
// // Uniting the Isles, required for Legion world quests
// if (!HasWorldQuestEnabled(quest->GetExpansion()))
// continue;
// if (!sWorldQuestMgr->IsQuestActive(quest->GetQuestId()))
// continue;
//}
// AddQuest -> SetQuestSlot already zeroes UF::QuestLog::ObjectiveProgress for the
// slot, and AdjustQuestObjectiveProgress seeds real progress, so there are no
// server-side per-objective counters left to copy here.
AddQuest(quest, this);
}
}
}
+4
View File
@@ -3973,6 +3973,10 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player>
int32 GetQuestObjectiveProgress(uint32 questId, int8 storageIndex) const;
void PlayConversation(uint32 conversationId);
void UpdateDynamicFlight(bool apply = false);
void UpdateWorldQuestPosition(float x, float y);
protected:
uint32 m_areaQuestTimer;
//WowCommunity
};
+5 -3
View File
@@ -3307,8 +3307,10 @@ bool Unit::IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled /*= false*/,
if (!skipChanneled && m_currentSpells[CURRENT_CHANNELED_SPELL] &&
(m_currentSpells[CURRENT_CHANNELED_SPELL]->getState() != SPELL_STATE_FINISHED))
{
if ((!isAutoshoot || !m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS)) &&
(!skipChanneledAllowingActions || !m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR5_ALLOW_ACTIONS_DURING_CHANNEL)))
SpellInfo const* channeledSpellInfo = m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo;
if ((!isAutoshoot || !channeledSpellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS) || channeledSpellInfo->HasChannelInterruptFlag(SpellAuraInterruptFlags::Action | SpellAuraInterruptFlags::ActionDelayed)) &&
(!skipChanneledAllowingActions || !channeledSpellInfo->HasAttribute(SPELL_ATTR5_ALLOW_ACTIONS_DURING_CHANNEL)))
return true;
}
// autorepeat spells may be finished or delayed, but they are still considered cast
@@ -4389,7 +4391,7 @@ void Unit::RemoveAurasWithInterruptFlags(InterruptFlags flag, SpellInfo const* s
&& spell->GetSpellInfo()->HasChannelInterruptFlag(flag)
&& (!source || spell->GetSpellInfo()->Id != source->Id)
&& !IsInterruptFlagIgnoredForSpell(flag, this, spell->GetSpellInfo(), true, source))
InterruptNonMeleeSpells(false);
InterruptSpell(CURRENT_CHANNELED_SPELL, false, false);
UpdateInterruptMask();
}
+70
View File
@@ -12411,3 +12411,73 @@ bool ObjectMgr::HasEnabledSpellScript(uint32 spellId, std::string_view scriptNam
return script.second.second && GetScriptName(script.second.first) == scriptName;
});
}
void ObjectMgr::LoadQuestTasks()
{
for (auto const& it : _questTemplates)
{
Quest const* quest_template = it.second.get();
if (!quest_template)
continue;
//CriteriaEntry const* criteria = sCriteriaStore.LookupEntry(l_I);
//if (!criteria || criteria->Type != CRITERIA_TYPE_COMPLETE_QUEST)
// continue;
if (quest_template->GetQuestType() != QUEST_TYPE_TASK)
continue;
QuestV2CliTaskEntry const* cliTask = sQuestV2CliTaskStore.LookupEntry(quest_template->GetQuestId());
if (!cliTask)
continue;
if (QuestPOIData const* questPOIs = GetQuestPOIData(quest_template->GetQuestId()))
{
if (questPOIs->Blobs.empty())
continue;
for (auto itr = questPOIs->Blobs.begin(); itr != questPOIs->Blobs.end(); ++itr)
{
BonusQuestRectEntry rec;
rec.MapID = itr->MapID;
rec.MinX = 5000000.f;
rec.MinY = 5000000.f;
rec.MaxX = -5000000.f;
rec.MaxY = -5000000.f;
for (auto const& poi : itr->Points)
{
if (poi.X == 0 && poi.Y == 0)
continue;
rec.MaxX = std::max(rec.MaxX, poi.X);
rec.MaxY = std::max(rec.MaxY, poi.Y);
rec.MinX = std::min(rec.MinX, poi.X);
rec.MinY = std::min(rec.MinY, poi.Y);
}
// If the area is a single point, we assume 50m
if (itr->Points.size() == 1)
{
rec.MinX -= 50;
rec.MaxX += 50;
rec.MinY -= 50;
rec.MaxY += 50;
}
else
{
int32 areaWidth = std::abs(rec.MaxX - rec.MinX);
rec.MinX -= 0.175f * float(areaWidth);
rec.MaxX += 0.175f * float(areaWidth);
int32 areaHeight = std::abs(rec.MaxY - rec.MinY);
rec.MinY -= 0.175f * float(areaHeight);
rec.MaxY += 0.175f * float(areaHeight);
}
BonusQuestsRects[quest_template->GetQuestId()].push_back(rec);
}
}
}
}
+13
View File
@@ -1199,6 +1199,19 @@ class TC_GAME_API ObjectMgr
SpellScriptsBounds GetSpellScriptsBounds(uint32 spellId);
//WowCommunity
bool HasEnabledSpellScript(uint32 spellId, std::string_view scriptName);
void LoadQuestTasks();
struct BonusQuestRectEntry
{
int32 MinX, MinY, MaxX, MaxY;
uint32 MapID;
bool IsIn(uint32 mapID, int x, int y)
{
return MapID == mapID && MinX <= x && MaxX >= x && MinY <= y && MaxY >= y;
}
};
std::map<uint32, std::vector<BonusQuestRectEntry>> BonusQuestsRects;
//WowCommunity
RepRewardRate const* GetRepRewardRate(uint32 factionId) const
{
+4
View File
@@ -203,6 +203,10 @@ void WorldSession::SendFeatureSystemStatusGlueScreen()
{ "housingEnableMoveHouse"sv, "1"sv },
{ "housingEnableCreateCharterNeighborhood"sv, "0"sv },
{ "housingEnableCreateGuildNeighborhood"sv, "0"sv },
// Advanced flying keyboard turn factors - client defaults (5.0/8.0) multiply the
// banking turn rate and make A/D snap-turn during skyriding; 1.0 is the sane base.
{ "advFlyKeyboardMinTurnFactor"sv, "1"sv },
{ "advFlyKeyboardMaxTurnFactor"sv, "1"sv },
};
// shop2 endpoint advertisement. The client reaches the modern store over HTTPS at whatever host
+2 -3
View File
@@ -41,6 +41,7 @@
#include "ReputationMgr.h"
#include "ScriptMgr.h"
#include "World.h"
#include "WorldQuestMgr.h"
//WowCommunity
#include "Item.h"
@@ -759,9 +760,7 @@ void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPackets::Quest::Ques
void WorldSession::HandleRequestWorldQuestUpdate(WorldPackets::Quest::RequestWorldQuestUpdate& /*packet*/)
{
WorldPackets::Quest::WorldQuestUpdateResponse response;
/// @todo: 7.x Has to be implemented
//response.WorldQuestUpdates.push_back(WorldPackets::Quest::WorldQuestUpdateInfo(lastUpdate, questID, timer, variableID, value));
sWorldQuestMgr->FillActiveWorldQuests(response.WorldQuestUpdates);
SendPacket(response.Write());
}
+42 -7
View File
@@ -154,14 +154,49 @@ void WorldQuestMgr::Update(uint32 diff)
void WorldQuestMgr::FillActiveWorldQuests(std::vector<WorldPackets::Quest::WorldQuestUpdateInfo>& updates) const
{
updates.reserve(updates.size() + _active.size());
time_t const now = GameTime::GetGameTime();
for (auto const& [questId, active] : _active)
{
// Retail contract: the client derives remaining time from LastUpdate + Timer, so Timer must be
// the REMAINING time (EndTime - now), not the full active duration. Sending EndTime - StartTime
// pins the client countdown at full forever; the quest never visibly ticks toward expiry and
// this file's own comment on SMSG_WORLD_QUEST_UPDATE_RESPONSE explicitly says the opposite.
uint32 remaining = active.EndTime > now ? uint32(active.EndTime - now) : 0;
updates.emplace_back(active.StartTime, active.QuestID, remaining, active.VariableID, active.Value);
// Retail contract, from 12.0.7 captures: Timer is the quest's FULL rotation duration, not the
// remaining time. Verified on quest 81815 - Timer stays byte-identical at 302400 across eight
// SMSG_WORLD_QUEST_UPDATE_RESPONSE packets sent 7 minutes apart, so it is a constant. The client
// derives the countdown itself as Timer - (now - LastUpdate), which is why LastUpdate is sent
// alongside it. Sending EndTime - now here would make the client subtract elapsed time twice
// and the countdown would run at double speed and hit zero Duration seconds early.
uint32 duration = active.EndTime > active.StartTime ? uint32(active.EndTime - active.StartTime) : 0;
updates.emplace_back(active.StartTime, active.QuestID, duration, active.VariableID, active.Value);
}
}
TeamId WorldQuestMgr::GetQuestTeamId(Quest const* quest)
{
// Quest::GetAllowableRaces() is a RaceMask<int32, 2>, not a raw integer - RawValue is a
// std::array, so it cannot be compared/masked directly. Use the RaceMask operators with
// the matching <int32, 2> specialisations.
Trinity::RaceMask<int32, 2> const allowableRaces = quest->GetAllowableRaces();
// No race restriction at all: usable by both teams.
if (allowableRaces == RACEMASK_ALL_v<int32, 2>)
return TEAM_NEUTRAL;
if (!(allowableRaces & RACEMASK_ALLIANCE_v<int32, 2>).IsEmpty())
return TEAM_ALLIANCE;
if (!(allowableRaces & RACEMASK_HORDE_v<int32, 2>).IsEmpty())
return TEAM_HORDE;
return TEAM_NEUTRAL;
}
ActiveWorldQuest* WorldQuestMgr::GetActiveWorldQuest(uint32 questId)
{
auto const itr = _active.find(questId);
return itr != _active.end() ? &itr->second : nullptr;
}
uint32 WorldQuestMgr::GetTimerForQuest(uint32 questId)
{
if (ActiveWorldQuest const* worldQuest = GetActiveWorldQuest(questId))
return worldQuest->GetRemainingTime();
return 0;
}
+16
View File
@@ -19,10 +19,14 @@
#define TRINITY_WORLDQUESTMGR_H
#include "Define.h"
#include "GameTime.h"
#include "SharedDefines.h"
#include <ctime>
#include <unordered_map>
#include <vector>
class Quest;
namespace WorldPackets::Quest
{
struct WorldQuestUpdateInfo;
@@ -45,6 +49,15 @@ struct ActiveWorldQuest
time_t EndTime = 0; // StartTime + template Duration
int32 VariableID = 0;
int32 Value = 0;
// Remaining seconds until expiry, clamped at 0. Derived from EndTime (populated by
// WorldQuestMgr::Activate) rather than a template lookup, so this stays valid without
// needing WorldQuestMgr to be complete at this point in the header.
uint32 GetRemainingTime() const
{
time_t const now = GameTime::GetGameTime();
return EndTime > now ? uint32(EndTime - now) : 0;
}
};
// Activates world quests from `world_quest_template`, tracks their expiry, refreshes them on a
@@ -73,6 +86,9 @@ class TC_GAME_API WorldQuestMgr
// Appends every currently-active world quest to the SMSG_WORLD_QUEST_UPDATE_RESPONSE payload.
void FillActiveWorldQuests(std::vector<WorldPackets::Quest::WorldQuestUpdateInfo>& updates) const;
ActiveWorldQuest* GetActiveWorldQuest(uint32 questId);
TeamId GetQuestTeamId(Quest const* quest);
uint32 GetTimerForQuest(uint32 questId);
bool IsWorldQuestActive(uint32 questId) const { return _active.find(questId) != _active.end(); }
private:
+3
View File
@@ -2220,6 +2220,9 @@ bool World::SetInitialWorldSettings()
TC_LOG_INFO("server.loading", "Loading delve data...");
sDelveMgr->Initialize();
TC_LOG_INFO("server.loading", "Loading Quest task...");
sObjectMgr->LoadQuestTasks();
TC_LOG_INFO("server.loading", "Loading Perks Program vendor items...");
sPerksProgramMgr->LoadVendorItems();
@@ -1,770 +0,0 @@
/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "AreaTriggerAI.h"
#include "CellImpl.h"
#include "Containers.h"
#include "GameObject.h"
#include "GridNotifiersImpl.h"
#include "InstanceScript.h"
#include "MotionMaster.h"
#include "MoveSplineInit.h"
#include "ObjectAccessor.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellAuras.h"
#include "SpellAuraEffects.h"
#include "SpellScript.h"
#include "ecodome_aldani.h"
enum AzhiccarSpells
{
// Intro
SPELL_DEVOUR_INTRO = 1233112,
SPELL_DEVOUR_INTRO_SELECTOR = 1233116,
SPELL_DEVOUR_INSTAKILL = 1233147,
SPELL_KNOCKBACK = 1222792,
// Combat
SPELL_DEVOUR = 1217232,
SPELL_DEVOUR_AREATRIGGER = 1217240,
SPELL_DEVOUR_SELECTOR = 1217255,
SPELL_DEVOURER_VORTEX = 1227068,
SPELL_DIGESTIVE_SPITTLE = 1217446,
SPELL_DIGESTIVE_SPITTLE_NPC_SLOW = 1217526,
SPELL_ENERGY_CONTROLLER = 1217202,
SPELL_FEAST = 1217241,
SPELL_FEAST_HEAL = 1217247,
SPELL_FEAST_INSTAKILL = 1217252,
SPELL_INVADING_SHRIEK_DAMAGE = 1231850,
SPELL_INVADING_SHRIEK_DUMMY = 1217330,
SPELL_INVADING_SHRIEK_PERIODIC = 1217327,
SPELL_INVADING_SHRIEK_SUMMON = 1217331,
SPELL_PLAYER_DETECTION = 1217757,
SPELL_THRASH = 1217664,
SPELL_TOXIC_REGURGITATION_CAST = 1227745,
SPELL_TOXIC_REGURGITATION_MARKER = 1227748,
SPELL_TOXIC_REGURGITATION_MISSILE = 1217438,
SPELL_TOXIC_REGURGITATION_SELECTOR = 1217436,
// Mites
SPELL_UNCONTROLLED = 1231811,
SPELL_STUNNED = 1235707,
};
enum AzhiccarEvents
{
EVENT_INVADING_SHRIEK = 1,
EVENT_TOXIC_REGURGITATION,
EVENT_CHECK_ENERGY
};
enum AzhiccarActions
{
ACTION_START_INTRO = 1
};
enum AzhiccarTexts
{
SAY_DEVOUR = 0
};
enum AzhiccarMisc
{
ANIMKIT_NONE = 0,
ANIMKIT_EMERGE = 21290,
ANIMKIT_MITE_DEVOUR_BIRTH = 11428,
SPELL_VISUALKIT_ALARM = 222521,
POINT_AZHICCAR = 0,
SPELL_VISUAL_DEVOURED = 155836,
NPC_PORTAL_STALKER = 237454,
NPC_FRENZIED_MITE = 236190,
};
static constexpr Position AzhiccarPosition = { 436.8889f, -746.0f, 1002.0926f };
static constexpr Position OrphanSpellVisualPosition = { 436.8889f, -746.0f, 1018.0926f };
// 234893 - Azhiccar
struct boss_azhiccar : public BossAI
{
boss_azhiccar(Creature* creature) : BossAI(creature, DATA_AZHICCAR), _invadingShriekCount(1), _toxicRegurgitationCount(1) { }
void JustAppeared() override
{
if (instance->GetData(DATA_AZHICCAR_INTRO) == DONE)
{
me->SetUninteractible(false);
me->SetImmuneToAll(false);
me->SetAIAnimKitId(ANIMKIT_NONE);
me->PlayOneShotAnimKitId(ANIMKIT_EMERGE);
}
me->SetPowerType(POWER_ENERGY);
me->SetPower(POWER_ENERGY, 0);
DoCastSelf(SPELL_DEVOURER_VORTEX);
}
void Reset() override
{
BossAI::Reset();
_invadingShriekCount = 1;
_toxicRegurgitationCount = 1;
_lastPortalPositions.clear();
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
DoCastSelf(SPELL_PLAYER_DETECTION);
DoCastSelf(SPELL_ENERGY_CONTROLLER);
events.ScheduleEvent(EVENT_TOXIC_REGURGITATION, 15400ms);
events.ScheduleEvent(EVENT_INVADING_SHRIEK, 5200ms);
if (IsHeroicOrHigher())
events.ScheduleEvent(EVENT_CHECK_ENERGY, 500ms);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
summons.DespawnAll();
me->RemoveAllAreaTriggers();
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
summons.DespawnAll();
me->RemoveAllAreaTriggers();
_EnterEvadeMode();
_DespawnAtEvade();
}
void OnSpellStart(SpellInfo const* spellInfo) override
{
switch (spellInfo->Id)
{
case SPELL_DEVOUR:
{
Talk(SAY_DEVOUR);
break;
}
default:
break;
}
}
void DoAction(int32 actionId) override
{
switch (actionId)
{
case ACTION_START_INTRO:
{
me->SetAIAnimKitId(ANIMKIT_NONE);
me->PlayOneShotAnimKitId(ANIMKIT_EMERGE);
scheduler.Schedule(2s + 170ms, [this](TaskContext context)
{
DoCastSelf(SPELL_KNOCKBACK);
DoCastSelf(SPELL_DEVOUR_INTRO);
context.Schedule(7s, [this](TaskContext const&)
{
me->SetUninteractible(false);
me->SetImmuneToAll(false);
instance->SetData(DATA_AZHICCAR_INTRO, DONE);
});
});
break;
}
default:
break;
}
}
void UpdateAI(uint32 diff) override
{
scheduler.Update(diff);
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_INVADING_SHRIEK:
{
std::vector<float> portalAngles =
{
float(M_PI / 4.0f),
-float(M_PI / 4.0f),
-(3.0f * float(M_PI / 4.0f)),
(3.0f * float(M_PI / 4.0f))
};
Trinity::Containers::RandomResize(portalAngles, 3);
static constexpr float PORTAL_STALKER_DIST = 30.0f;
_lastPortalPositions.clear();
for (float angle : portalAngles)
{
angle += me->GetOrientation();
Position pos = me->GetPosition();
me->MovePosition(pos, PORTAL_STALKER_DIST, angle);
me->SummonCreature(NPC_PORTAL_STALKER, pos, TEMPSUMMON_TIMED_DESPAWN, 4100ms);
_lastPortalPositions.push_back(pos);
}
DoCastSelf(SPELL_INVADING_SHRIEK_PERIODIC);
_invadingShriekCount++;
if (_invadingShriekCount % 2 == 0)
events.Repeat(37200ms);
else
events.Repeat(48500ms);
break;
}
case EVENT_TOXIC_REGURGITATION:
{
DoCastSelf(SPELL_TOXIC_REGURGITATION_SELECTOR);
_toxicRegurgitationCount++;
if (_toxicRegurgitationCount % 2 == 0)
events.Repeat(18200ms);
else
events.Repeat(67500ms);
break;
}
case EVENT_CHECK_ENERGY:
{
if (me->GetPower(POWER_ENERGY) >= 100)
{
DoCastSelf(SPELL_DEVOUR);
if (IsMythic())
{
for (Position const& lastPos : _lastPortalPositions)
{
me->SummonCreature(NPC_PORTAL_STALKER, lastPos, TEMPSUMMON_TIMED_DESPAWN, 2s);
for (uint8 i = 0; i < 3; i++)
{
Position pos(lastPos);
me->MovePosition(pos, 3.0f, frand(0, 2 * float(M_PI)));
me->m_Events.AddEventAtOffset([caster = me, pos]()
{
caster->CastSpell(pos, SPELL_INVADING_SHRIEK_SUMMON, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR
});
}, 2100ms);
}
}
}
events.Repeat(25s);
}
else
events.Repeat(500ms);
break;
}
default:
break;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
}
}
private:
uint32 _invadingShriekCount;
uint32 _toxicRegurgitationCount;
std::vector<Position> _lastPortalPositions;
};
// 236190 - Frenzied Mite
struct npc_azhiccar_frenzied_mite : public ScriptedAI
{
npc_azhiccar_frenzied_mite(Creature* creature) : ScriptedAI(creature) {}
void JustAppeared() override
{
Creature* azhiccar = me->GetInstanceScript()->GetCreature(DATA_AZHICCAR);
if (!azhiccar)
return;
if (azhiccar->GetPower(POWER_ENERGY) >= 100)
{
me->SetReactState(REACT_PASSIVE);
DoCastSelf(SPELL_STUNNED);
me->PlayOneShotAnimKitId(ANIMKIT_MITE_DEVOUR_BIRTH);
}
else
DoCastSelf(SPELL_UNCONTROLLED);
}
};
// 1217202 - Energy Controller
class spell_azhiccar_energy_controller : public AuraScript
{
static constexpr std::array<uint8, 3> AzhiccarEnergizeCycle = { 1, 2, 2 };
void PeriodicTick(AuraEffect const* aurEff) const
{
if (GetTarget()->HasAura(SPELL_DEVOUR))
return;
uint8 cycleIdx = aurEff->GetTickNumber() % AzhiccarEnergizeCycle.size();
GetTarget()->ModifyPower(POWER_ENERGY, AzhiccarEnergizeCycle[cycleIdx]);
}
void Register() override
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_azhiccar_energy_controller::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
}
};
// 1217436 - Toxic Regurgitation
class spell_azhiccar_toxic_regurgitation_selector : public SpellScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_TOXIC_REGURGITATION_MARKER, SPELL_TOXIC_REGURGITATION_CAST });
}
void HandleHitTarget(SpellEffIndex /*effIndex*/) const
{
Unit* caster = GetCaster();
CastSpellExtraArgs args;
args.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR;
args.TriggeringSpell = GetSpell();
caster->CastSpell(caster, SPELL_TOXIC_REGURGITATION_CAST, args);
caster->CastSpell(GetHitUnit(), SPELL_TOXIC_REGURGITATION_MARKER, args);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_azhiccar_toxic_regurgitation_selector::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
// 1227745 - Toxic Regurgitation
class spell_azhiccar_toxic_regurgitation_cast : public SpellScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_TOXIC_REGURGITATION_MARKER, SPELL_TOXIC_REGURGITATION_MISSILE });
}
void HandleOnHit() const
{
Unit* caster = GetCaster();
std::list<Player*> players;
Trinity::UnitAuraCheck check(true, SPELL_TOXIC_REGURGITATION_MARKER);
Trinity::PlayerListSearcher<Trinity::UnitAuraCheck> searcher(caster, players, check);
Cell::VisitWorldObjects(caster, searcher, 200.0f);
for (Player* player : players)
{
caster->CastSpell(player, SPELL_TOXIC_REGURGITATION_MISSILE, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
.TriggeringSpell = GetSpell()
});
}
}
void Register() override
{
OnHit += SpellHitFn(spell_azhiccar_toxic_regurgitation_cast::HandleOnHit);
}
};
// 1217327 - Invading Shriek
class spell_azhiccar_invading_shriek : public SpellScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo ({ SPELL_INVADING_SHRIEK_DAMAGE });
}
void HandleAfterCast() const
{
Unit* caster = GetCaster();
caster->CastSpell(caster, SPELL_INVADING_SHRIEK_DAMAGE, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
.TriggeringSpell = GetSpell()
});
}
void Register() override
{
AfterCast += SpellCastFn(spell_azhiccar_invading_shriek::HandleAfterCast);
}
};
// 1217327 - Invading Shriek
class spell_azhiccar_invading_shriek_aura : public AuraScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo ({ SPELL_INVADING_SHRIEK_DAMAGE });
}
void OnApply(AuraEffect const* /*auraEffect*/, AuraEffectHandleModes /*mode*/)
{
std::vector<Creature*> stalkers;
GetCaster()->GetCreatureListWithEntryInGrid(stalkers, NPC_PORTAL_STALKER, 150.0f);
Trinity::Containers::RandomShuffle(stalkers);
for (Creature* creature : stalkers)
_stalkerList.push(creature->GetGUID());
}
void OnPeriodic(AuraEffect const* aurEff)
{
if (aurEff->GetTickNumber() <= 1)
return;
Unit* caster = GetCaster();
ObjectGuid guid = _stalkerList.front();
_stalkerList.pop();
if (Creature* stalker = ObjectAccessor::GetCreature(*caster, guid))
{
caster->CastSpell(stalker->GetPosition(), SPELL_INVADING_SHRIEK_DUMMY, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
.TriggeringAura = aurEff
});
}
}
void Register() override
{
AfterEffectApply += AuraEffectApplyFn(spell_azhiccar_invading_shriek_aura::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
OnEffectPeriodic += AuraEffectPeriodicFn(spell_azhiccar_invading_shriek_aura::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
}
private:
std::queue<ObjectGuid> _stalkerList;
};
// 1217330 - Invading Shriek
class spell_azhiccar_invading_shriek_dummy : public SpellScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_INVADING_SHRIEK_SUMMON });
}
void HandleHit(SpellEffIndex /*effIndex*/) const
{
GetCaster()->CastSpell(GetHitDest()->GetPosition(), SPELL_INVADING_SHRIEK_SUMMON, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
.TriggeringSpell = GetSpell()
});
}
void Register() override
{
OnEffectHit += SpellEffectFn(spell_azhiccar_invading_shriek_dummy::HandleHit, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
// 1217758 - Player Detection (SERVERSIDE)
class spell_azhiccar_player_detection : public SpellScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_DEVOUR, SPELL_THRASH });
}
void HandlePlayerDetection() const
{
Unit* caster = GetCaster();
int64 const targetsHit = GetUnitTargetCountForEffect(EFFECT_0);
if (targetsHit > 0)
return;
Spell* currentChanneledSpell = caster->GetCurrentSpell(CURRENT_CHANNELED_SPELL);
if (currentChanneledSpell && (currentChanneledSpell->GetSpellInfo()->Id == SPELL_DEVOUR))
return;
if (caster->HasAura(SPELL_DEVOUR))
return;
caster->CastSpell(caster, SPELL_THRASH, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
}
void Register() override
{
AfterCast += SpellCastFn(spell_azhiccar_player_detection::HandlePlayerDetection);
}
};
// 1217232 - Devour
class spell_azhiccar_devour : public AuraScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_DEVOUR_AREATRIGGER, SPELL_DEVOUR_SELECTOR });
}
void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
Unit* caster = GetCaster();
caster->CastSpell(caster, SPELL_DEVOUR_AREATRIGGER, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
caster->CastSpell(caster, SPELL_DEVOUR_SELECTOR, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
}
void Register() override
{
AfterEffectApply += AuraEffectRemoveFn(spell_azhiccar_devour::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
}
};
// 1217255 - Devour
class spell_azhiccar_devour_selector : public SpellScript
{
void FilterTargets(std::list<WorldObject*>& targets)
{
targets.remove_if([](WorldObject* target) {
return !target->IsPlayer() && target->GetEntry() != NPC_FRENZIED_MITE;
});
}
void HandleHitTarget(SpellEffIndex /*effIndex*/) const
{
Unit* target = GetHitUnit();
std::function<void(Movement::MoveSplineInit&)> initializer = [](Movement::MoveSplineInit& init)
{
init.SetBackward();
init.MoveTo(AzhiccarPosition.GetPositionX(), AzhiccarPosition.GetPositionY(), AzhiccarPosition.GetPositionZ(), false);
};
target->SendPlaySpellVisualKit(SPELL_VISUALKIT_ALARM, 4, 9000);
target->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), POINT_AZHICCAR, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE);
target->SetSpeed(MOVE_RUN_BACK, 12.0f);
}
void Register() override
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_azhiccar_devour_selector::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENTRY);
OnEffectHitTarget += SpellEffectFn(spell_azhiccar_devour_selector::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
// 1217241 - Feast
// 1217252 - Feast
class spell_azhiccar_feast : public SpellScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_FEAST_HEAL });
}
void HandleHit(SpellEffIndex /*effIndex*/)
{
Unit* caster = GetCaster();
caster->CastSpell(caster, SPELL_FEAST_HEAL, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
.TriggeringSpell = GetSpell()
});
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_azhiccar_feast::HandleHit, EFFECT_0, SPELL_EFFECT_ANY);
}
};
// 1217441 - Digestive Spittle
// Id - 36181
struct at_azhiccar_digestive_spittle : AreaTriggerAI
{
using AreaTriggerAI::AreaTriggerAI;
void OnUnitEnter(Unit* unit) override
{
Unit* caster = at->GetCaster();
if (!caster)
return;
caster->CastSpell(unit, (unit->IsPlayer() ? SPELL_DIGESTIVE_SPITTLE : SPELL_DIGESTIVE_SPITTLE_NPC_SLOW), TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
}
void OnUnitExit(Unit* unit, AreaTriggerExitReason /*reason*/) override
{
unit->RemoveAurasDueToSpell(SPELL_DIGESTIVE_SPITTLE);
unit->RemoveAurasDueToSpell(SPELL_DIGESTIVE_SPITTLE_NPC_SLOW);
}
};
// 1217240 - Devour
// Id - 38188
struct at_azhiccar_devour_force : AreaTriggerAI
{
using AreaTriggerAI::AreaTriggerAI;
void OnUnitEnter(Unit* unit) override
{
if (!unit->IsPlayer() || unit->GetEntry() == NPC_PORTAL_STALKER)
return;
unit->ApplyMovementForce(at->GetGUID(), at->GetPosition(), 3.0f, MovementForceType::Gravity);
}
void OnUnitExit(Unit* unit, AreaTriggerExitReason /*reason*/) override
{
unit->RemoveMovementForce(at->GetGUID());
}
};
// 1217240 - Devour
// Id - 38189
struct at_azhiccar_devour : AreaTriggerAI
{
using AreaTriggerAI::AreaTriggerAI;
void OnUnitEnter(Unit* unit) override
{
Unit* caster = at->GetCaster();
if (!caster)
return;
if (unit->IsPlayer())
caster->CastSpell(unit, SPELL_FEAST, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
else if (unit->HasAura(SPELL_DEVOUR_SELECTOR))
caster->CastSpell(unit, SPELL_FEAST_INSTAKILL, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
}
};
// Id - 176
struct at_azhiccar_intro : AreaTriggerAI
{
at_azhiccar_intro(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { }
void OnUnitEnter(Unit* unit) override
{
InstanceScript* instance = at->GetInstanceScript();
if (!instance)
return;
Player* player = unit->ToPlayer();
if (!player || player->IsGameMaster())
return;
if (Creature* azhiccar = instance->GetCreature(DATA_AZHICCAR))
azhiccar->AI()->DoAction(ACTION_START_INTRO);
at->Remove();
}
};
// 245411 - Ravaging Scavenger
// 245412 - Voracious Gorger
struct npc_azhiccar_intro_creature : public ScriptedAI
{
npc_azhiccar_intro_creature(Creature* creature) : ScriptedAI(creature) { }
void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
{
if (spellInfo->Id == SPELL_DEVOUR_INTRO_SELECTOR)
{
_scheduler.Schedule(2000ms, 4500ms, [this](TaskContext const&)
{
me->SendPlayOrphanSpellVisual(OrphanSpellVisualPosition, me->GetPosition(), SPELL_VISUAL_DEVOURED, 45.0f, false);
DoCastSelf(SPELL_DEVOUR_INSTAKILL);
me->DespawnOrUnsummon(5s);
});
}
}
void UpdateAI(uint32 diff) override
{
_scheduler.Update(diff);
}
private:
TaskScheduler _scheduler;
};
// 1233116 - Devour
class spell_azhiccar_devour_intro_selector : public SpellScript
{
void HandleHitTarget(SpellEffIndex /*effIndex*/) const
{
Unit* target = GetHitUnit();
std::function<void(Movement::MoveSplineInit&)> initializer = [](Movement::MoveSplineInit& init)
{
init.SetBackward();
init.MoveTo(AzhiccarPosition.GetPositionX(), AzhiccarPosition.GetPositionY(), AzhiccarPosition.GetPositionZ(), false);
};
target->SendPlaySpellVisualKit(SPELL_VISUALKIT_ALARM, 4, 9000);
target->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), POINT_AZHICCAR, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE);
target->SetSpeed(MOVE_RUN_BACK, 16.0f);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_azhiccar_devour_intro_selector::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
void AddSC_boss_azhiccar()
{
RegisterEcodomeAldaniCreatureAI(boss_azhiccar);
RegisterEcodomeAldaniCreatureAI(npc_azhiccar_frenzied_mite);
RegisterSpellScript(spell_azhiccar_energy_controller);
RegisterSpellScript(spell_azhiccar_toxic_regurgitation_selector);
RegisterSpellScript(spell_azhiccar_toxic_regurgitation_cast);
RegisterSpellAndAuraScriptPair(spell_azhiccar_invading_shriek, spell_azhiccar_invading_shriek_aura);
RegisterSpellScript(spell_azhiccar_invading_shriek_dummy);
RegisterSpellScript(spell_azhiccar_player_detection);
RegisterSpellScript(spell_azhiccar_devour);
RegisterSpellScript(spell_azhiccar_devour_selector);
RegisterSpellScript(spell_azhiccar_feast);
RegisterAreaTriggerAI(at_azhiccar_digestive_spittle);
RegisterAreaTriggerAI(at_azhiccar_devour_force);
RegisterAreaTriggerAI(at_azhiccar_devour);
// Intro
RegisterAreaTriggerAI(at_azhiccar_intro);
RegisterEcodomeAldaniCreatureAI(npc_azhiccar_intro_creature);
RegisterSpellScript(spell_azhiccar_devour_intro_selector);
}
@@ -1,58 +0,0 @@
/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef DEF_ECODOME_ALDANI_H_
#define DEF_ECODOME_ALDANI_H_
#include "CreatureAIImpl.h"
#define EAScriptName "instance_ecodome_aldani"
#define DataHeader "EcodomeAldani"
uint32 const EncounterCount = 3;
enum EcodomeAldaniDataTypes
{
// Encounters
DATA_AZHICCAR = 0,
DATA_TAAHBAT_AND_AWAZJ = 1,
DATA_SOUL_SCRIBE = 2,
DATA_TAAHBAT,
DATA_AWAZJ,
DATA_AZHICCAR_INTRO
};
enum EcodomeAldaniCreatureIds
{
// Bosses
BOSS_AZHICCAR = 234893,
BOSS_TAAHBAT = 234933,
BOSS_AWAZJ = 241375,
BOSS_SOUL_SCRIBE = 247283
};
template <class AI, class T>
inline AI* GetEcodomeAldaniAI(T* obj)
{
return GetInstanceAI<AI>(obj, EAScriptName);
}
#define RegisterEcodomeAldaniCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetEcodomeAldaniAI)
#endif
@@ -1,93 +0,0 @@
/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "Creature.h"
#include "InstanceScript.h"
#include "ScriptMgr.h"
#include "ecodome_aldani.h"
static constexpr ObjectData creatureData[] =
{
{ BOSS_AZHICCAR, DATA_AZHICCAR },
{ BOSS_TAAHBAT, DATA_TAAHBAT },
{ BOSS_AWAZJ, DATA_AWAZJ },
{ BOSS_SOUL_SCRIBE, DATA_SOUL_SCRIBE },
{ 0, 0 } // END
};
static constexpr DungeonEncounterData encounters[] =
{
{ DATA_AZHICCAR, {{ 3107 }} },
{ DATA_TAAHBAT_AND_AWAZJ, {{ 3108 }} },
{ DATA_SOUL_SCRIBE, {{ 3109 }} }
};
class instance_ecodome_aldani : public InstanceMapScript
{
public:
instance_ecodome_aldani() : InstanceMapScript(EAScriptName, 2830) { }
struct instance_ecodome_aldani_InstanceMapScript: public InstanceScript
{
instance_ecodome_aldani_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
{
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadObjectData(creatureData, {});
LoadDungeonEncounterData(encounters);
_azhiccarIntroState = NOT_STARTED;
}
uint32 GetData(uint32 dataId) const override
{
switch (dataId)
{
case DATA_AZHICCAR_INTRO:
return _azhiccarIntroState;
default:
break;
}
return 0;
}
void SetData(uint32 dataId, uint32 value) override
{
switch (dataId)
{
case DATA_AZHICCAR_INTRO:
_azhiccarIntroState = value;
break;
default:
break;
}
}
private:
uint8 _azhiccarIntroState;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override
{
return new instance_ecodome_aldani_InstanceMapScript(map);
}
};
void AddSC_instance_ecodome_aldani()
{
new instance_ecodome_aldani();
}
@@ -18,14 +18,10 @@
// This is where scripts' loading functions should be declared:
// Eco-Dome Aldani
void AddSC_boss_azhiccar();
void AddSC_instance_ecodome_aldani();
// The name of this function should match:
// void Add${NameOfDirectory}Scripts()
void AddKareshScripts()
{
// Eco-Dome Aldani
AddSC_boss_azhiccar();
AddSC_instance_ecodome_aldani();
}
@@ -27,7 +27,13 @@ enum Spells
SPELL_NECROTIC_BOLT = 320170,
SPELL_UNHOLY_FRENZY = 320012,
SPELL_NECROTIC_BREATH_TRIGGER = 337074,
EVENT_LAND_OF_THE_DEAD = 1,
};
enum events
{
EVENT_NECROTIC_BOLT = 1,
EVENT_LAND_OF_THE_DEAD,
EVENT_FINAL_HARVEST,
EVENT_NECROTIC_BREATH
};
@@ -48,9 +54,9 @@ struct boss_amarth : public BossAI
{
_JustEngagedWith(who);
Talk(0);
events.ScheduleEvent(SPELL_NECROTIC_BOLT, 3s);
events.ScheduleEvent(EVENT_NECROTIC_BOLT, 3s);
events.ScheduleEvent(EVENT_LAND_OF_THE_DEAD, 5s);
events.ScheduleEvent(SPELL_FINAL_HARVEST, 8s);
events.ScheduleEvent(EVENT_FINAL_HARVEST, 8s);
events.ScheduleEvent(EVENT_NECROTIC_BREATH, 10s);
if (Creature* amarth = me->FindNearestCreature(NPC_AMARTH, 30.0f, true))
amarth->EnterVehicle(me);
@@ -70,7 +76,7 @@ struct boss_amarth : public BossAI
{
switch (eventId)
{
case SPELL_NECROTIC_BOLT:
case EVENT_NECROTIC_BOLT:
DoCastVictim(SPELL_NECROTIC_BOLT, false);
events.Repeat(15s);
break;
@@ -83,7 +89,7 @@ struct boss_amarth : public BossAI
events.Repeat(20s);
break;
case SPELL_FINAL_HARVEST:
case EVENT_FINAL_HARVEST:
me->CastSpell(nullptr, SPELL_FINAL_HARVEST, false);
events.Repeat(25s);
break;
@@ -47,7 +47,8 @@ enum Events
EVENT_SPELL_CAST_START = 1,
EVENT_SPELL_PERIODIC_DAMAGE,
EVENT_SPELL_PERIODIC_MISSED,
EVENT_UNIT_SPELLCAST_START
EVENT_UNIT_SPELLCAST_START,
EVENT_BLOOD_GORGE
};
//162691
@@ -184,7 +185,7 @@ struct npc_carrion_worm_nw : public ScriptedAI
void JustEngagedWith(Unit* /*who*/) override
{
_events.ScheduleEvent(SPELL_BLOOD_GORGE, 3s);
_events.ScheduleEvent(EVENT_BLOOD_GORGE, 3s);
}
void ExecuteEvent(uint32 eventId) override
@@ -198,7 +199,7 @@ struct npc_carrion_worm_nw : public ScriptedAI
switch (eventId)
{
case SPELL_BLOOD_GORGE:
case EVENT_BLOOD_GORGE:
DoCastVictim(SPELL_BLOOD_GORGE, false);
me->AddAura(SPELL_BLOOD_GORGE_BUFF, me);
_events.Repeat(10s);
+97 -4
View File
@@ -63,6 +63,8 @@ enum HunterSpells
SPELL_HUNTER_GREVIOUS_INJURY = 1217789,
SPELL_HUNTER_HIGH_EXPLOSIVE_TRAP = 236775,
SPELL_HUNTER_HIGH_EXPLOSIVE_TRAP_DAMAGE = 236777,
SPELL_HUNTER_HORSEHAIR_TETHER_TALENT = 472729,
SPELL_HUNTER_HORSEHAIR_TETHER_GRIP = 472731,
SPELL_HUNTER_IMPLOSIVE_TRAP = 462032,
SPELL_HUNTER_IMPLOSIVE_TRAP_DAMAGE = 462033,
SPELL_HUNTER_INTIMIDATION = 19577,
@@ -80,6 +82,8 @@ enum HunterSpells
SPELL_HUNTER_MISDIRECTION = 34477,
SPELL_HUNTER_MISDIRECTION_PROC = 35079,
SPELL_HUNTER_MULTI_SHOT_FOCUS = 213363,
SPELL_HUNTER_NO_HARD_FEELINGS_TALENT = 459546,
SPELL_HUNTER_NO_HARD_FEELINGS_AURA = 459547,
SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_TRIGGERED = 54114,
SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF = 55711,
SPELL_HUNTER_POSTHASTE_INCREASE_SPEED = 118922,
@@ -99,12 +103,14 @@ enum HunterSpells
SPELL_HUNTER_STEADY_SHOT_FOCUS = 77443,
SPELL_HUNTER_STREAMLINE_TALENT = 260367,
SPELL_HUNTER_STREAMLINE_BUFF = 342076,
SPELL_HUNTER_SURGING_SHOTS_ACTION_BAR_GLOW = 391561,
SPELL_HUNTER_T9_4P_GREATNESS = 68130,
SPELL_HUNTER_T29_2P_MARKSMANSHIP_DAMAGE = 394371,
SPELL_HUNTER_TAKE_AIM = 1273132,
SPELL_HUNTER_TAR_TRAP = 187699,
SPELL_HUNTER_TAR_TRAP_AREATRIGGER = 187700,
SPELL_HUNTER_TAR_TRAP_SLOW = 135299,
SPELL_HUNTER_TRAILBLAZER = 231390,
SPELL_HUNTER_WILDERNESS_MEDICINE_TALENT = 343242,
SPELL_HUNTER_WILDERNESS_MEDICINE_DISPEL = 384784,
SPELL_ROAR_OF_SACRIFICE_TRIGGERED = 67481,
@@ -346,6 +352,9 @@ struct at_hun_binding_shot : AreaTriggerAI
{
caster->CastSpell(unit, SPELL_HUNTER_BINDING_SHOT_STUN, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
caster->CastSpell(unit, SPELL_HUNTER_BINDING_SHOT_IMMUNE, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
if (caster->HasAura(SPELL_HUNTER_HORSEHAIR_TETHER_TALENT))
unit->CastSpell(at->GetPosition(), SPELL_HUNTER_HORSEHAIR_TETHER_GRIP, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
}
}
}
@@ -976,6 +985,38 @@ class spell_hun_beast_cleave_pet : public AuraScript
}
};
// 459546 - No Hard Feelings (attached to 34477 - Misdirection)
class spell_hun_no_hard_feelings : public SpellScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_HUNTER_NO_HARD_FEELINGS_TALENT, SPELL_HUNTER_NO_HARD_FEELINGS_AURA });
}
bool Load() override
{
return GetCaster()->HasAura(SPELL_HUNTER_NO_HARD_FEELINGS_TALENT);
}
void HandleHitTarget(SpellEffIndex /*effIndex*/) const
{
Unit* caster = GetCaster();
Unit* target = GetHitUnit();
if (!target->IsPet() || target->GetOwnerGUID() != caster->GetGUID())
return;
caster->CastSpell(target, SPELL_HUNTER_NO_HARD_FEELINGS_AURA, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
.TriggeringSpell = GetSpell()
});
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_hun_no_hard_feelings::HandleHitTarget, EFFECT_0, SPELL_EFFECT_REDIRECT_THREAT);
}
};
// 2643 - Multi-Shot
class spell_hun_multi_shot : public SpellScript
{
@@ -1662,17 +1703,25 @@ class spell_hun_surging_shots : public AuraScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_HUNTER_RAPID_FIRE });
return ValidateSpellInfo({ SPELL_HUNTER_RAPID_FIRE, SPELL_HUNTER_SURGING_SHOTS_ACTION_BAR_GLOW });
}
void HandleProc(ProcEventInfo const& /*eventInfo*/) const
static bool RollProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& /*procInfo*/)
{
GetTarget()->GetSpellHistory()->ResetCooldown(SPELL_HUNTER_RAPID_FIRE, true);
return roll_chance(aurEff->GetAmount());
}
static void HandleProc(AuraScript const&, AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo)
{
Unit* caster = eventInfo.GetActor();
caster->GetSpellHistory()->ResetCooldown(SPELL_HUNTER_RAPID_FIRE, true);
caster->CastSpell(caster, SPELL_HUNTER_SURGING_SHOTS_ACTION_BAR_GLOW, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
}
void Register() override
{
OnProc += AuraProcFn(spell_hun_surging_shots::HandleProc);
DoCheckEffectProc += AuraCheckEffectProcFn(spell_hun_surging_shots::RollProc, EFFECT_2, SPELL_AURA_DUMMY);
OnEffectProc += AuraEffectProcFn(spell_hun_surging_shots::HandleProc, EFFECT_2, SPELL_AURA_DUMMY);
}
};
@@ -1828,6 +1877,48 @@ struct areatrigger_hun_tar_trap_activate : AreaTriggerAI
}
};
// 199921 - Trailblazer
class spell_hun_trailblazer : public AuraScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_HUNTER_TRAILBLAZER });
}
static void CalcPeriodic(AuraScript const&, AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude)
{
isPeriodic = true;
amplitude = 3 * IN_MILLISECONDS;
}
void HandleDummyTick(AuraEffect const* /*aurEff*/) const
{
Unit* caster = GetTarget();
if (!caster->HasAura(SPELL_HUNTER_TRAILBLAZER))
caster->CastSpell(caster, SPELL_HUNTER_TRAILBLAZER, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
}
static void HandleProc(AuraScript const&, AuraEffect* aurEff, ProcEventInfo const& eventInfo)
{
aurEff->ResetPeriodic(true);
eventInfo.GetActor()->RemoveAurasDueToSpell(SPELL_HUNTER_TRAILBLAZER);
}
void HandleOnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
{
GetTarget()->RemoveAurasDueToSpell(SPELL_HUNTER_TRAILBLAZER);
}
void Register() override
{
DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_hun_trailblazer::CalcPeriodic, EFFECT_0, SPELL_AURA_DUMMY);
OnEffectPeriodic += AuraEffectPeriodicFn(spell_hun_trailblazer::HandleDummyTick, EFFECT_0, SPELL_AURA_DUMMY);
OnEffectProc += AuraEffectProcFn(spell_hun_trailblazer::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
AfterEffectRemove += AuraEffectRemoveFn(spell_hun_trailblazer::HandleOnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
}
};
// 67151 - Item - Hunter T9 4P Bonus (Steady Shot)
class spell_hun_t9_4p_bonus : public AuraScript
{
@@ -2567,6 +2658,7 @@ void AddSC_hunter_spell_scripts()
RegisterSpellScript(spell_hun_misdirection);
RegisterSpellScript(spell_hun_misdirection_proc);
RegisterSpellScript(spell_hun_multi_shot);
RegisterSpellScript(spell_hun_no_hard_feelings);
RegisterSpellScript(spell_hun_penetrating_shots);
RegisterSpellScript(spell_hun_pet_heart_of_the_phoenix);
RegisterSpellScript(spell_hun_posthaste);
@@ -2588,6 +2680,7 @@ void AddSC_hunter_spell_scripts()
RegisterSpellScript(spell_hun_tame_beast);
RegisterAreaTriggerAI(areatrigger_hun_tar_trap);
RegisterAreaTriggerAI(areatrigger_hun_tar_trap_activate);
RegisterSpellScript(spell_hun_trailblazer);
RegisterSpellScript(spell_hun_t9_4p_bonus);
RegisterSpellScript(spell_hun_t29_2p_marksmanship_bonus);
RegisterSpellScript(spell_hun_wilderness_medicine);
@@ -51,16 +51,6 @@ public:
if (!leaderguid)
return;
if (Player* leader = ObjectAccessor::GetPlayer(*player, leaderguid))
{
if (leader->GetTeam() == HORDE)
faction_group = HORDE;
else if (leader->GetTeam() == ALLIANCE)
faction_group = ALLIANCE;
else
faction_group = HORDE;
}
player->GetGroup()->AddFollowerModeBots(player);
}
@@ -49,16 +49,6 @@ public:
if (!leaderguid)
return;
if (Player* leader = ObjectAccessor::GetPlayer(*player, leaderguid))
{
if (leader->GetTeam() == HORDE)
faction_group = HORDE;
else if (leader->GetTeam() == ALLIANCE)
faction_group = ALLIANCE;
else
faction_group = HORDE;
}
player->GetGroup()->AddFollowerModeBots(player);
}
@@ -54,16 +54,6 @@ public:
if (!leaderguid)
return;
if (Player* leader = ObjectAccessor::GetPlayer(*player, leaderguid))
{
if (leader->GetTeam() == HORDE)
faction_group = HORDE;
else if (leader->GetTeam() == ALLIANCE)
faction_group = ALLIANCE;
else
faction_group = HORDE;
}
player->GetGroup()->AddFollowerModeBots(player);
}