Compare commits
21
Commits
f60ffe5032
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7288b8fedc | ||
|
|
36b30fd12a | ||
|
|
18ba84dd4e | ||
|
|
1e80d7d867 | ||
|
|
72a879d9cb | ||
|
|
aa08843e07 | ||
|
|
f2abcf67f6 | ||
|
|
cd572e8c6c | ||
|
|
b41cd95bb8 | ||
|
|
4985ab08a5 | ||
|
|
40ae64dd29 | ||
|
|
2640fdfa8e | ||
|
|
5e5965090b | ||
|
|
e90e395c35 | ||
|
|
b28dd6f77e | ||
|
|
5de7d827b3 | ||
|
|
95ff338eca | ||
|
|
1911c8b01b | ||
|
|
bc9e2c6d08 | ||
|
|
7816605b95 | ||
|
|
d259e0c817 |
@@ -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);
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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] =
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -26,8 +26,14 @@ enum Spells
|
||||
SPELL_FINAL_HARVEST_DAMAGE = 321253,
|
||||
SPELL_NECROTIC_BOLT = 320170,
|
||||
SPELL_UNHOLY_FRENZY = 320012,
|
||||
SPELL_NECROTIC_BREATH_TRIGGER = 337074,
|
||||
EVENT_LAND_OF_THE_DEAD = 1,
|
||||
SPELL_NECROTIC_BREATH_TRIGGER = 337074,
|
||||
};
|
||||
|
||||
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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -81,4 +71,4 @@ public:
|
||||
void AddSC_instance_darkflame_cleft()
|
||||
{
|
||||
new instance_darkflame_cleft();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user