Merge branch 'azerothcore:master' into Playerbot

This commit is contained in:
ZhengPeiRu21
2023-01-12 09:20:22 -07:00
committed by GitHub
52 changed files with 836 additions and 158 deletions
+1 -1
View File
@@ -223,7 +223,7 @@ function inst_simple_restarter {
function inst_download_client_data {
# change the following version when needed
local VERSION=v15
local VERSION=v16
echo "#######################"
echo "Client data downloader"
@@ -0,0 +1,83 @@
-- DB update 2023_01_04_02 -> 2023_01_05_00
-- Pathing for Kel'Thuzad Entry: 20350
UPDATE `creature` SET `wander_distance`=0,`MovementType`=0,`position_x`=1777.6586,`position_y`=1058.5917,`position_z`=7.1008496 WHERE `id1`=20350; -- Kel'Thuzad
UPDATE `creature` SET `wander_distance`=0,`MovementType`=0,`position_x`=1777.6586,`position_y`=1058.5917,`position_z`=7.1008496 WHERE `id1`=20353; -- Helcular
DELETE FROM `waypoints` WHERE `entry`=20350;
INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`point_comment`) VALUES
(20350,1,1777.6586,1058.5917,7.1008496,NULL,0,'Kel\'Thuzad'),
(20350,2,1785.8223,1057.3224,7.46938,NULL,0,'Kel\'Thuzad'),
(20350,3,1802.3959,1061.4431,8.593266,NULL,0,'Kel\'Thuzad'),
(20350,4,1816.5465,1069.8398,10.483082,NULL,0,'Kel\'Thuzad'),
(20350,5,1829.2474,1075.3346,11.50713,NULL,0,'Kel\'Thuzad'),
(20350,6,1840.346,1076.9652,13.023953,NULL,0,'Kel\'Thuzad'),
(20350,7,1854.4879,1072.2803,15.144437,NULL,0,'Kel\'Thuzad'),
(20350,8,1864.5223,1065.2603,15.909603,NULL,0,'Kel\'Thuzad'),
(20350,9,1883.5319,1056.9219,18.170403,NULL,0,'Kel\'Thuzad'),
(20350,10,1896.4857,1052.8398,17.920403,NULL,0,'Kel\'Thuzad'),
(20350,11,1917.8785,1051.4784,19.08978,NULL,0,'Kel\'Thuzad'),
(20350,12,1930.2494,1051.6864,19.907164,NULL,0,'Kel\'Thuzad'),
(20350,13,1947.8518,1045.3527,21.082039,NULL,0,'Kel\'Thuzad'),
(20350,14,1958.8525,1035.1572,23.207039,NULL,0,'Kel\'Thuzad'),
(20350,15,1969.4431,1028.3741,24.45784,NULL,0,'Kel\'Thuzad'),
(20350,16,1980.2985,1028.6941,25.294388,NULL,0,'Kel\'Thuzad'),
(20350,17,1969.4431,1028.3741,24.45784,NULL,0,'Kel\'Thuzad'),
(20350,18,1958.8616,1035.1549,23.17591,NULL,0,'Kel\'Thuzad'),
(20350,19,1947.8604,1045.3506,20.957039,NULL,0,'Kel\'Thuzad'),
(20350,20,1930.2494,1051.6864,19.907164,NULL,0,'Kel\'Thuzad'),
(20350,21,1917.8785,1051.4784,19.08978,NULL,0,'Kel\'Thuzad'),
(20350,22,1896.4857,1052.8398,17.920403,NULL,0,'Kel\'Thuzad'),
(20350,23,1883.5319,1056.9219,18.170403,NULL,0,'Kel\'Thuzad'),
(20350,24,1864.5223,1065.2603,15.909603,NULL,0,'Kel\'Thuzad'),
(20350,25,1854.4879,1072.2803,15.144437,NULL,0,'Kel\'Thuzad'),
(20350,26,1840.346,1076.9652,13.023953,NULL,0,'Kel\'Thuzad'),
(20350,27,1829.2474,1075.3346,11.50713,NULL,0,'Kel\'Thuzad'),
(20350,28,1816.5465,1069.8398,10.483082,NULL,0,'Kel\'Thuzad'),
(20350,29,1802.3959,1061.4431,8.593266,NULL,0,'Kel\'Thuzad'),
(20350,30,1785.8223,1057.3224,7.46938,NULL,0,'Kel\'Thuzad');
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 20350);
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(20350, 0, 0, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 53, 0, 20350, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Kel\'Thuzad - On Reset - Start Waypoint'),
(20350, 0, 1, 0, 40, 0, 2, 0, 0, 20350, 0, 0, 0, 80, 2035000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Kel\'Thuzad - On Waypoint 0 Reached - Run Script (2% Chance)');
DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` = 2035000);
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(2035000, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 54, 49200, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Kel\'Thuzad - On Script - Pause Waypoint'),
(2035000, 9, 1, 0, 0, 0, 100, 0, 2400, 2400, 0, 0, 0, 45, 1, 1, 0, 0, 0, 0, 19, 20353, 10, 0, 0, 0, 0, 0, 0, 'Kel\'Thuzad - On Script - Set Data 1 1'), -- Intentionally delayed so that Helcular can catch up and Orientation is set correctly
(2035000, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 19, 20353, 10, 0, 0, 0, 0, 0, 0, 'Kel\'Thuzad - On Script - Set Orientation Closest Creature \'Helcular\''),
(2035000, 9, 3, 0, 0, 0, 100, 0, 2600, 2600, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Kel\'Thuzad - On Script - Say Line 0'),
(2035000, 9, 4, 0, 0, 0, 100, 0, 8400, 8400, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Kel\'Thuzad - On Script - Say Line 1'),
(2035000, 9, 5, 0, 0, 0, 100, 0, 12000, 12000, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Kel\'Thuzad - On Script - Say Line 2'),
(2035000, 9, 6, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Kel\'Thuzad - On Script - Say Line 3'),
(2035000, 9, 7, 0, 0, 0, 100, 0, 11000, 11000, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Kel\'Thuzad - On Script - Say Line 4'),
(2035000, 9, 8, 0, 0, 0, 100, 0, 1200, 1200, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Kel\'Thuzad - On Script - Say Line 5');
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 20353);
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(20353, 0, 0, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 29, 0.05, 90, 0, 0, 0, 0, 19, 20350, 10, 0, 0, 0, 0, 0, 0, 'Helcular - On Reset - Start Follow Closest Creature \'Kel\'Thuzad\''),
(20353, 0, 1, 0, 38, 0, 100, 0, 1, 1, 0, 0, 0, 80, 2035300, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Helcular - On Data Set 1 1 - Run Script');
DELETE FROM `smart_scripts` WHERE (`entryorguid` = 2035300) AND (`source_type` = 9);
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(2035300, 9, 0, 0, 0, 0, 100, 0, 2400, 2400, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 19, 20350, 10, 0, 0, 0, 0, 0, 0, 'Helcular - On Script - Set Orientation Closest Creature \'Kel\'Thuzad\''),
(2035300, 9, 1, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Helcular - On Script - Say Line 0'),
(2035300, 9, 2, 0, 0, 0, 100, 0, 1200, 1200, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Helcular - On Script - Say Line 1'),
(2035300, 9, 3, 0, 0, 0, 100, 0, 8400, 8400, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Helcular - On Script - Say Line 2'),
(2035300, 9, 4, 0, 0, 0, 100, 0, 17000, 17000, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Helcular - On Script - Say Line 3'),
(2035300, 9, 5, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Helcular - On Script - Set Data 1 0');
DELETE FROM `creature_text` WHERE `CreatureID`=20350;
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(20350, 0, 0, 'Keep your voice down, Helcular. Strangers abound...', 12, 0, 100, 1, 0, 0, 18033, 0, 'Kel\'Thuzad'),
(20350, 1, 0, 'Necromancy. It is called necromancy. And yes, I have it within my power to bless you with this gift.', 12, 0, 100, 1, 0, 0, 18042, 0, 'Kel\'Thuzad'),
(20350, 2, 0, 'That is none of your concern, Helcular, as you are neither Kirin Tor nor a necromancer.', 12, 0, 100, 274, 0, 0, 18044, 0, 'Kel\'Thuzad'),
(20350, 3, 0, 'But to be perfectly frank, I do not give a damn what the Kirin Tor think! They are fools, set in their archaic ways.', 12, 0, 100, 1, 0, 0, 18050, 0, 'Kel\'Thuzad'),
(20350, 4, 0, '%s nods.', 16, 0, 100, 0, 0, 0, 18034, 0, 'Kel\'Thuzad'),
(20350, 5, 0, 'In due time, Helcular... All in due time...', 12, 0, 100, 1, 0, 0, 18052, 0, 'Kel\'Thuzad');
DELETE FROM `creature_text` WHERE `CreatureID`=20353;
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(20353, 0, 0, '%s nods.', 16, 0, 100, 273, 0, 0, 18034, 0, 'Helcular'),
(20353, 1, 0, 'So you can teach me this... this...', 12, 0, 100, 6, 0, 0, 18041, 0, 'Helcular'),
(20353, 2, 0, 'And the Kirin Tor? What have they to say of necromancy?', 12, 0, 100, 6, 0, 0, 18043, 0, 'Helcular'),
(20353, 3, 0, 'Then teach me, Kel\'Thuzad. Teach me everything you know...', 12, 0, 100, 1, 0, 0, 18051, 0, 'Helcular');
+179
View File
@@ -0,0 +1,179 @@
-- DB update 2023_01_05_00 -> 2023_01_05_01
-- Set correct spawn pos
UPDATE `creature` SET `position_x`=1815.927978515625, `position_y`=1020.21331787109375, `position_z`=11.68548202514648437, `orientation`=4.817108631134033203, `equipment_id`=1, `VerifiedBuild`=47187 WHERE `id1`=20351;
UPDATE `creature` SET `position_x`=1814.1473388671875, `position_y`=1018.730712890625, `position_z`=11.68548202514648437, `orientation`=6.2657318115234375, `equipment_id`=1, `VerifiedBuild`=47187 WHERE `id1`=20400;
-- Set Equipment (previously empty)
DELETE FROM `creature_equip_template` WHERE (`CreatureID` IN (20351, 20400));
INSERT INTO `creature_equip_template` (`CreatureID`, `ID`, `ItemID1`, `ItemID2`, `ItemID3`, `VerifiedBuild`) VALUES
(20351, 1, 2704, 0, 0, 0),
(20400, 1, 2704, 0, 0, 0);
DELETE FROM `creature_template_addon` WHERE (`entry` IN (20351, 20400));
INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES
(20351, 0, 0, 0, 1, 0, 0, ''),
(20400, 0, 0, 0, 1, 0, 0, '');
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 20351;
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 20351);
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(20351, 0, 0, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Reset - Set Event Phase 1'),
(20351, 0, 1, 0, 60, 1, 100, 0, 3600, 3600, 3600, 3600, 0, 5, 92, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Update - Play Emote 92 (Phase 1)'),
(20351, 0, 2, 3, 60, 1, 100, 0, 180000, 180000, 180000, 180000, 0, 22, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Update - Set Event Phase 0 (Phase 1)'),
(20351, 0, 3, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 80, 2035100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Update - Run Script'),
(20351, 0, 4, 0, 40, 0, 100, 0, 11, 20351, 0, 0, 0, 80, 2035101, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Waypoint 11 Reached - Run Script'),
(20351, 0, 5, 0, 40, 0, 100, 0, 14, 20351, 0, 0, 0, 80, 2035102, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Waypoint 14 Reached - Run Script'),
(20351, 0, 6, 0, 58, 0, 100, 0, 29, 20351, 0, 0, 0, 80, 2035103, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Waypoint Finished - Run Script');
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 20400;
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 20400);
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(20400, 0, 0, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Reset - Set Event Phase 1'),
(20400, 0, 1, 0, 60, 1, 100, 0, 3600, 3600, 3600, 3600, 0, 5, 92, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Update - Play Emote 92 (Phase 1)'),
(20400, 0, 2, 3, 38, 0, 100, 0, 1, 1, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Data Set 1 1 - Set Event Phase 0'),
(20400, 0, 3, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 80, 2040000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Data Set 1 1 - Run Script'),
(20400, 0, 4, 0, 38, 0, 100, 0, 1, 2, 0, 0, 0, 80, 2040001, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Data Set 1 2 - Run Script'),
(20400, 0, 5, 0, 38, 0, 100, 0, 1, 3, 0, 0, 0, 80, 2040002, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Data Set 1 3 - Run Script'),
(20400, 0, 6, 0, 38, 0, 100, 0, 1, 4, 0, 0, 0, 80, 2040003, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Data Set 1 4 - Run Script');
-- Pathing for Captain Sanders Entry: 20351
DELETE FROM `waypoints` WHERE `entry`=20351;
INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`point_comment`) VALUES
(20351,1,1811.1932,1025.7975,11.685483,NULL,0,'Captain Sanders'),
(20351,2,1811.046,1035.7515,11.413217,NULL,0,'Captain Sanders'),
(20351,3,1810.3229,1043.4323,11.685482,NULL,0,'Captain Sanders'),
(20351,4,1817.0609,1043.4369,11.67465,NULL,0,'Captain Sanders'),
(20351,5,1817.4949,1053.8794,11.11829,NULL,0,'Captain Sanders'),
(20351,6,1811.2274,1060.154,9.906864,NULL,0,'Captain Sanders'),
(20351,7,1800.7808,1061.7118,8.49329,NULL,0,'Captain Sanders'),
(20351,8,1791.0525,1057.8472,7.8332715,NULL,0,'Captain Sanders'),
(20351,9,1787.0084,1046.652,9.74416,NULL,0,'Captain Sanders'),
(20351,10,1781.4646,1033.0979,9.537182,NULL,0,'Captain Sanders'),
(20351,11,1775.1431,1014.3824,6.5410886,NULL,0,'Captain Sanders'), -- Intermediate Event
(20351,12,1758.1819,1016.2374,5.8595204,NULL,0,'Captain Sanders'),
(20351,13,1739.5063,1016.105,2.416039,NULL,0,'Captain Sanders'),
(20351,14,1731.3119,1014.4211,1.5693786,NULL,0,'Captain Sanders'), -- Boat Scene
(20351,15,1757.7401,1016.1464,5.8391347,NULL,0,'Captain Sanders'),
(20351,16,1768.027,1016.7231,6.1815915,NULL,0,'Captain Sanders'),
(20351,17,1775.2412,1017.6554,6.0808835,NULL,0,'Captain Sanders'),
(20351,18,1784.6741,1026.9069,10.753368,NULL,0,'Captain Sanders'),
(20351,19,1790.1174,1049.2361,9.626728,NULL,0,'Captain Sanders'),
(20351,20,1799.3375,1057.9951,8.322407,NULL,0,'Captain Sanders'),
(20351,21,1810.4957,1058.3661,10.12952,NULL,0,'Captain Sanders'),
(20351,22,1816.9808,1056.8551,11.11829,NULL,0,'Captain Sanders'),
(20351,23,1817.2922,1043.6241,11.674123,NULL,0,'Captain Sanders'),
(20351,24,1810.0059,1042.9373,11.685482,NULL,0,'Captain Sanders'),
(20351,25,1809.8413,1038.6426,11.685481,NULL,0,'Captain Sanders'),
(20351,26,1811.0175,1032.7227,11.060482,NULL,0,'Captain Sanders'),
(20351,27,1811.5898,1024.587,11.685483,NULL,0,'Captain Sanders'),
(20351,28,1814.4944,1020.6591,11.685482,NULL,0,'Captain Sanders'),
(20351,29,1815.928,1020.2133,11.685482,NULL,0,'Captain Sanders'); -- End
-- 0x204214460013DFC000618C0000233C55 .go xyz 1811.1932 1025.7975 11.685483
DELETE FROM `smart_scripts` WHERE (`entryorguid` = 2035100) AND (`source_type` = 9);
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(2035100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Set Event Phase 0'),
(2035100, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 45, 1, 1, 0, 0, 0, 0, 19, 20400, 10, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Set Data 1 1'),
(2035100, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 19, 20400, 10, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Set Orientation Closest Creature \'Captain Edward Hanes\''),
(2035100, 9, 3, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 19, 20400, 10, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Say Line 0'),
(2035100, 9, 4, 0, 0, 0, 100, 0, 10000, 10000, 0, 0, 0, 53, 0, 20351, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Start Waypoint');
DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` = 2040000);
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(2040000, 9, 0, 0, 0, 0, 100, 0, 2500, 2500, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 19, 20351, 10, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Script - Set Orientation Closest Creature \'Captain Sanders\''),
(2040000, 9, 1, 0, 0, 0, 100, 0, 7500, 7500, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 19, 20351, 10, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Script - Say Line 0'),
(2040000, 9, 2, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 0, 29, 1, 180, 0, 0, 0, 0, 19, 20351, 10, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Script - Start Follow Closest Creature \'Captain Sanders\'');
DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` = 2035101);
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(2035101, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 54, 14000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Pause Waypoint'),
(2035101, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 45, 1, 2, 0, 0, 0, 0, 19, 20400, 10, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Set Data 1 2'),
(2035101, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 1.0995573997497559, 'Captain Sanders - On Script - Set Orientation 1.0995573997497559'),
(2035101, 9, 3, 0, 0, 0, 100, 0, 1600, 1600, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 5.777040004730225, 'Captain Sanders - On Script - Set Orientation 5.777040004730225'),
(2035101, 9, 4, 0, 0, 0, 100, 0, 6000, 6000, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 19, 20400, 10, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Set Orientation Closest Creature \'Captain Edward Hanes\''),
(2035101, 9, 5, 0, 0, 0, 100, 0, 1400, 1400, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 19, 20400, 10, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Say Line 1'),
(2035101, 9, 6, 0, 0, 0, 100, 0, 3600, 3600, 0, 0, 0, 1, 2, 0, 1, 0, 0, 0, 19, 20400, 10, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Say Line 2');
DELETE FROM `smart_scripts` WHERE (`entryorguid` = 2040001) AND (`source_type` = 9);
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(2040001, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Script - Start Follow Self'),
(2040001, 9, 1, 0, 0, 0, 100, 0, 3600, 3600, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 19, 20351, 10, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Script - Set Orientation Closest Creature \'Captain Sanders\''),
(2040001, 9, 2, 0, 0, 0, 100, 0, 1400, 1400, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 19, 20351, 10, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Script - Say Line 1'),
(2040001, 9, 3, 0, 0, 0, 100, 0, 8600, 8600, 0, 0, 0, 5, 273, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Script - Play Emote 273'),
(2040001, 9, 4, 0, 0, 0, 100, 0, 1400, 1400, 0, 0, 0, 29, 1, 180, 0, 0, 0, 0, 19, 20351, 10, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Script - Start Follow Closest Creature \'Captain Sanders\'');
DELETE FROM `smart_scripts` WHERE (`entryorguid` = 2040002) AND (`source_type` = 9);
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(2040002, 9, 0 , 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Script - Start Follow Self'),
(2040002, 9, 1 , 0, 0, 0, 100, 0, 100, 100, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 1729.3556, 1014.00525, 1.151654, 1.7166426181793213, 'Captain Edward Hanes - On Script - Move To Position'),
(2040002, 9, 2 , 0, 0, 0, 100, 0, 6000, 6000, 0, 0, 0, 1, 2, 0, 1, 0, 0, 0, 19, 20351, 1, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Script - Say Line 2'),
(2040002, 9, 3 , 0, 0, 0, 100, 0, 9700, 9700, 0, 0, 0, 1, 3, 0, 1, 0, 0, 0, 19, 20351, 10, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Script - Say Line 3'),
(2040002, 9, 4 , 0, 0, 0, 100, 0, 9600, 9600, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 2.8274333477020264, 'Captain Edward Hanes - On Script - Set Orientation 2.8274333477020264'),
(2040002, 9, 5 , 0, 0, 0, 100, 0, 1400, 1400, 0, 0, 0, 1, 4, 0, 1, 0, 0, 0, 19, 20351, 10, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Script - Say Line 4'),
(2040002, 9, 6 , 0, 0, 0, 100, 0, 10600, 10600, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 19, 20351, 10, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Script - Set Orientation Closest Creature \'Captain Sanders\''),
(2040002, 9, 7 , 0, 0, 0, 100, 0, 1400, 1400, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Script - Say Line 5'),
(2040002, 9, 8 , 0, 0, 0, 100, 0, 23000, 23000, 0, 0, 0, 1, 6, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Script - Say Line 6'),
(2040002, 9, 9 , 0, 0, 0, 100, 0, 10000, 10000, 0, 0, 0, 1, 7, 0, 1, 0, 0, 0, 19, 20351, 10, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Script - Say Line 7'),
(2040002, 9, 10, 0, 0, 0, 100, 0, 9500, 9500, 0, 0, 0, 5, 273, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Script - Play Emote 273'),
(2040002, 9, 11, 0, 0, 0, 100, 0, 3600, 3600, 0, 0, 0, 29, 1, 180, 0, 0, 0, 0, 19, 20351, 10, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Script - Start Follow Closest Creature \'Captain Sanders\'');
DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` = 2035102);
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(2035102, 9, 0 , 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 45, 1, 3, 0, 0, 0, 0, 19, 20400, 10, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Set Data 1 3'),
(2035102, 9, 1 , 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 54, 84900, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Pause Waypoint'),
(2035102, 9, 2 , 0, 0, 0, 100, 0, 100, 100, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 2.4434609413146973, 'Captain Sanders - On Script - Set Orientation 2.4434609413146973'),
(2035102, 9, 3 , 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 1, 3, 0, 1, 0, 0, 0, 19, 20400, 10, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Say Line 3'),
(2035102, 9, 4 , 0, 0, 0, 100, 0, 2100, 2100, 0, 0, 0, 5, 6, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Play Emote 6'),
(2035102, 9, 5 , 0, 0, 0, 100, 0, 2400, 2400, 0, 0, 0, 5, 92, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Play Emote 92'),
(2035102, 9, 6 , 0, 0, 0, 100, 0, 4900, 4900, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 1.780235767364502, 'Captain Sanders - On Script - Set Orientation 1.780235767364502'),
(2035102, 9, 7 , 0, 0, 0, 100, 0, 1400, 1400, 0, 0, 0, 1, 4, 0, 1, 0, 0, 0, 19, 20400, 10, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Say Line 4'),
(2035102, 9, 8 , 0, 0, 0, 100, 0, 2200, 2200, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Play Emote 5'),
(2035102, 9, 9 , 0, 0, 0, 100, 0, 7400, 7400, 0, 0, 0, 1, 5, 0, 1, 0, 0, 0, 19, 20400, 10, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Say Line 5'),
(2035102, 9, 10, 0, 0, 0, 100, 0, 9600, 9600, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 2.9146997928619385, 'Captain Sanders - On Script - Set Orientation 2.9146997928619385'),
(2035102, 9, 11, 0, 0, 0, 100, 0, 3800, 3800, 0, 0, 0, 1, 6, 0, 1, 0, 0, 0, 19, 20400, 10, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Say Line 6'),
(2035102, 9, 12, 0, 0, 0, 100, 0, 7300, 7300, 0, 0, 0, 1, 7, 0, 1, 0, 0, 0, 19, 20400, 10, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Say Line 7'),
(2035102, 9, 13, 0, 0, 0, 100, 0, 6000, 6000, 0, 0, 0, 1, 8, 0, 1, 0, 0, 0, 19, 20400, 10, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Say Line 8'),
(2035102, 9, 14, 0, 0, 0, 100, 0, 7300, 7300, 0, 0, 0, 1, 9, 0, 1, 0, 0, 0, 19, 20400, 10, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Say Line 9'),
(2035102, 9, 15, 0, 0, 0, 100, 0, 2200, 2200, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Play Emote 5'),
(2035102, 9, 16, 0, 0, 0, 100, 0, 6300, 6300, 0, 0, 0, 1, 10, 0, 1, 0, 0, 0, 19, 20400, 10, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Say Line 10'),
(2035102, 9, 17, 0, 0, 0, 100, 0, 13300, 13300, 0, 0, 0, 1, 11, 0, 1, 0, 0, 0, 19, 20400, 10, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Say Line 11'),
(2035102, 9, 18, 0, 0, 0, 100, 0, 3400, 3400, 0, 0, 0, 5, 273, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Play Emote 273');
DELETE FROM `smart_scripts` WHERE (`entryorguid` = 2035103) AND (`source_type` = 9);
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(2035103, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 45, 1, 4, 0, 0, 0, 0, 19, 20400, 10, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Set Data 1 4'),
(2035103, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 1815.927978515625, 1020.2133178710938, 11.685482025146484, 4.817108631134033, 'Captain Sanders - On Script - Move To Position'),
(2035103, 9, 2, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Sanders - On Script - Set Event Phase 1');
DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` = 2040003);
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(2040003, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Script - Start Follow Self'),
(2040003, 9, 1, 0, 0, 0, 100, 0, 200, 200, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 1814.1473388671875, 1018.730712890625, 11.685482025146484, 6.2657318115234375, 'Captain Edward Hanes - On Script - Move To Position'),
(2040003, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Script - Set Data 1 0'),
(2040003, 9, 3, 0, 0, 0, 100, 0, 4800, 4800, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Captain Edward Hanes - On Script - Set Event Phase 1');
DELETE FROM `creature_text` WHERE `CreatureID`=20351;
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(20351, 0 , 0, 'Avast, Ed! Lemme show ye me ship! *hic*', 12, 0, 100, 1, 0, 0, 18064, 0, 'Captain Sanders'),
(20351, 1 , 0, 'I just be makin\' sure we wasn\'t followed! *hic*', 12, 0, 100, 5, 0, 0, 18067, 0, 'Captain Sanders'),
(20351, 2 , 0, 'It be clear...', 12, 0, 100, 273, 0, 0, 18068, 0, 'Captain Sanders'),
(20351, 3 , 0, 'Thar she be! Ain\'t she a beaut?', 12, 0, 100, 25, 0, 0, 18069, 0, 'Captain Sanders'),
(20351, 4 , 0, 'That thar monster be yers, Ed? Arrr... She\'s a big\'un!', 12, 0, 100, 25, 0, 0, 18071, 0, 'Captain Sanders'),
(20351, 5 , 0, 'Arrr, Ed! She definitely be seaworthy!', 12, 0, 100, 5, 0, 0, 18073, 0, 'Captain Sanders'),
(20351, 6 , 0, 'Can ye keep a secret, Ed? Arr, dead men tell no tales!', 12, 0, 100, 6, 0, 0, 18075, 0, 'Captain Sanders'),
(20351, 7 , 0, 'It be me treasure, Ed. Me life\'s work! Arrr... One white shirt fit fer a pirate king to be wearin\'!', 12, 0, 100, 1, 0, 0, 18077, 0, 'Captain Sanders'),
(20351, 8 , 0, 'One red sash that ye can put on yer head or your britches. Pride o\' the fleet, that sash is...', 12, 0, 100, 1, 0, 0, 18078, 0, 'Captain Sanders'),
(20351, 9 , 0, 'An\' last but certainly not least, one enormous bag! Big enough to fit eight whole apples! Eight, Ed! Can ye believe it!?', 12, 0, 100, 1, 0, 0, 18079, 0, 'Captain Sanders'),
(20351, 10, 0, 'Yarrr! Keep it down, Ed! Thar be scallywags about! Their scallywag ears be listenin\' for gasps like the one that just escaped yer lips!', 12, 0, 100, 1, 0, 0, 18081, 0, 'Captain Sanders'),
(20351, 11, 0, 'It be alright, Ed. Me booty be locked away good in that thar chest. No fool will ever have Cap\'n Sanders\'s treasure! Let\'s go get another drink. The spirits be runnin\' low.', 12, 0, 100, 1, 0, 0, 18083, 0, 'Captain Sanders');
DELETE FROM `creature_text` WHERE `CreatureID`=20400;
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(20400, 0, 0, 'Lead the way, Sanders!', 12, 0, 100, 1, 0, 0, 18065, 0, 'Captain Edward Hanes'),
(20400, 1, 0, 'What are you doing, Sanders?', 12, 0, 100, 1, 0, 0, 18066, 0, 'Captain Edward Hanes'),
(20400, 2, 0, 'Aye, she\'s a beaut alright. And you parked her right next to my frigate! *hic*', 12, 0, 100, 1, 0, 0, 18070, 0, 'Captain Edward Hanes'),
(20400, 3, 0, 'Ayep! She\'s all mine... I\'m gonna sail her around the world. Across the sea!', 12, 0, 100, 1, 0, 0, 18072, 0, 'Captain Edward Hanes'),
(20400, 4, 0, 'Sanders, what have you got in that chest?', 12, 0, 100, 1, 0, 0, 18074, 0, 'Captain Edward Hanes'),
(20400, 5, 0, '%s nods.', 16, 0, 100, 0, 0, 0, 18076, 0, 'Captain Edward Hanes'),
(20400, 6, 0, '%s gasps.', 16, 0, 100, 0, 0, 0, 18080, 0, 'Captain Edward Hanes'),
(20400, 7, 0, 'I\'m sorry, Sanders. I\'ve just never seen such a bounty. It took me by surprise.', 12, 0, 100, 1, 0, 0, 18082, 0, 'Captain Edward Hanes');
@@ -0,0 +1,5 @@
-- DB update 2023_01_05_01 -> 2023_01_05_02
DELETE FROM `quest_greeting_locale` WHERE `ID` = 3390 AND `locale` IN ('esES', 'esMX');
INSERT INTO `quest_greeting_locale` (`ID`, `type`, `locale`, `Greeting`, `VerifiedBuild`) VALUES
(3390, 0, 'esES', 'Los Baldíos cuentan con una gran riqueza de sustancias de las que nosotros, los boticarios de Lordaeron, podemos aprovecharnos.', 47014),
(3390, 0, 'esMX', 'Los Baldíos cuentan con una gran riqueza de sustancias de las que nosotros, los boticarios de Lordaeron, podemos aprovecharnos.', 47014);
@@ -0,0 +1,33 @@
-- DB update 2023_01_05_02 -> 2023_01_06_00
DELETE FROM `gossip_menu_option` WHERE `MenuID` = 3651 AND `OptionID` IN (0, 1, 2);
INSERT INTO `gossip_menu_option` (`MenuID`, `OptionID`, `OptionIcon`, `OptionText`, `OptionBroadcastTextID`, `OptionType`, `OptionNpcFlag`, `ActionMenuID`, `ActionPoiID`, `BoxCoded`, `BoxMoney`, `BoxText`, `BoxBroadcastTextID`, `VerifiedBuild`) VALUES
(3651, 0, 0, 'May I have another Dawn\'s Gambit, Betina? I want to test it again...', 7198, 1, 1, 0, 0, 0, 0, '', 0, 0),
(3651, 1, 0, 'Betina, I\'d like a replacement Seal of the Dawn please!', 10458, 1, 1, 0, 0, 0, 0, '', 0, 0),
(3651, 2, 0, 'Betina, I\'d like a replacement Rune of the Dawn please!', 10462, 1, 1, 0, 0, 0, 0, '', 0, 0);
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 15 AND `SourceGroup` = 3651 AND `SourceId` IN (0, 1, 2);
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(15, 3651, 0, 0, 0, 2, 0, 12368, 1, 0, 1, 0, 0, '', 'If player does not have \'Dawn\'s Gambit\' in inventory'),
(15, 3651, 0, 0, 0, 2, 0, 12368, 1, 1, 1, 0, 0, '', 'If player does not have \'Dawn\'s Gambit\' in bank'),
(15, 3651, 0, 0, 0, 8, 0, 4771, 0, 0, 0, 0, 0, '', 'If player has quest \'Dawn\'s Gambit\' rewarded'),
(15, 3651, 1, 0, 0, 2, 0, 13209, 1, 0, 1, 0, 0, '', 'If player does not have \'Seal of the Dawn\' in inventory'),
(15, 3651, 1, 0, 0, 2, 0, 13209, 1, 1, 1, 0, 0, '', 'If player does not have \'Seal of the Dawn\' in bank'),
(15, 3651, 1, 0, 0, 2, 0, 19812, 1, 0, 1, 0, 0, '', 'If player does not have \'Rune of the Dawn\' in inventory'),
(15, 3651, 1, 0, 0, 2, 0, 19812, 1, 1, 1, 0, 0, '', 'If player does not have \'Rune of the Dawn\' in bank'),
(15, 3651, 1, 0, 0, 8, 0, 5213, 0, 0, 0, 0, 0, '', 'If player has quest \'The Active Agent\' rewarded'),
(15, 3651, 2, 0, 0, 2, 0, 13209, 1, 0, 1, 0, 0, '', 'If player does not have \'Seal of the Dawn\' in inventory'),
(15, 3651, 2, 0, 0, 2, 0, 13209, 1, 1, 1, 0, 0, '', 'If player does not have \'Seal of the Dawn\' in bank'),
(15, 3651, 2, 0, 0, 2, 0, 19812, 1, 0, 1, 0, 0, '', 'If player does not have \'Rune of the Dawn\' in inventory'),
(15, 3651, 2, 0, 0, 2, 0, 19812, 1, 1, 1, 0, 0, '', 'If player does not have \'Rune of the Dawn\' in bank'),
(15, 3651, 2, 0, 0, 8, 0, 5213, 0, 0, 0, 0, 0, '', 'If player has quest \'The Active Agent\' rewarded');
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 11035;
DELETE FROM `smart_scripts` WHERE `entryorguid` = 11035 AND `source_type` = 0 AND `id` IN (1, 2, 3, 4, 5, 6);
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(11035, 0, 1, 2, 62, 0, 100, 0, 3651, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Betina Bigglezink - On Gossip Option 0 Selected - Close Gossip'),
(11035, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 11, 18367, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Betina Bigglezink - On Link - Cast \'Create Dawn\'s Gambit\''),
(11035, 0, 3, 4, 62, 0, 100, 0, 3651, 1, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Betina Bigglezink - On Gossip Option 1 Selected - Close Gossip'),
(11035, 0, 4, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 11, 24179, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Betina Bigglezink - On Link - Cast \'Create Rune of the Dawn\''),
(11035, 0, 5, 6, 62, 0, 100, 0, 3651, 2, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Betina Bigglezink - On Gossip Option 2 Selected - Close Gossip'),
(11035, 0, 6, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 11, 24201, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Betina Bigglezink - On Link - Cast \'Create Seal of the Dawn\'');
@@ -0,0 +1,8 @@
-- DB update 2023_01_06_00 -> 2023_01_06_01
--
-- Worn Stone Tokens are 100%
UPDATE `creature_loot_template` SET `Chance`=100 WHERE `Item`=3714 AND `entry` IN (2271, 2272, 2358, 2415, 2628);
-- Encrusted Tail Fins should be 100% and only off Saltscale Murlocs
UPDATE `creature_loot_template` SET `Chance`=100 WHERE `Item`=5796 AND `entry` IN (871, 873, 875, 877, 879);
DELETE FROM `creature_loot_template` WHERE `Entry` IN (4457, 4458, 4459, 4460, 4461) AND `Item`=5796 AND `Reference`=0 AND `GroupId`=0;
@@ -0,0 +1,8 @@
-- DB update 2023_01_06_01 -> 2023_01_07_00
--
UPDATE `creature_template` SET `ScriptName` = '', `AIName` = 'SmartAI' WHERE `Entry` = 22095;
DELETE FROM `smart_scripts` WHERE `entryorguid`=22095;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(22095, 0, 0, 0, 6, 0, 75, 0, 0, 0, 0, 0, 0, 11, 39130, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Infested Root-Walker - On Just Died - Cast \'Summon Wood Mites\''),
(22095, 0, 1, 0, 0, 0, 100, 0, 15000, 20000, 32000, 38000, 0, 11, 39000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Infested Root-Walker - In Combat - Cast \'Regrowth\' (No Repeat)');
@@ -0,0 +1,5 @@
-- DB update 2023_01_07_00 -> 2023_01_07_01
--
DELETE FROM `spell_script_names` WHERE `spell_id` = 47776 AND `ScriptName` = 'spell_item_worn_troll_dice';
INSERT INTO `spell_script_names` VALUES
(47776, 'spell_item_worn_troll_dice');
@@ -0,0 +1,3 @@
-- DB update 2023_01_07_01 -> 2023_01_07_02
--
UPDATE `creature_template` SET `flags_extra`=`flags_extra`|0x00000200 WHERE `entry` IN (17536,18432);
@@ -0,0 +1,9 @@
-- DB update 2023_01_07_02 -> 2023_01_07_03
-- Immunities
UPDATE `creature_template` SET `mechanic_immune_mask` = 6292 WHERE (`entry` = 18423);
-- Spawn time
UPDATE `creature` SET `spawntimesecs`=60 WHERE `guid`=31747 AND `id1`=18423;
-- Mortal strike
DELETE FROM `smart_scripts` WHERE (`entryorguid` = 18423) AND (`source_type` = 0) AND (`id` IN (3));
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(18423, 0, 3, 0, 2, 0, 100, 0, 20, 80, 5000, 15000, 0, 11, 15708, 32, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Cho\'war the Pillager - Between 20-80% Health - Cast \'15708\' (No Repeat)');
@@ -0,0 +1,12 @@
-- DB update 2023_01_07_03 -> 2023_01_07_04
--
DELETE FROM `creature_text` WHERE `CreatureID`=23577;
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(23577,0,0,'Get on ya knees and bow.... to da fang and claw!',14,0,100,0,0,12020,0,0,'Halazzi - SAY_AGGRO'),
(23577,1,0,'You can\t fight da power!',14,0,100,0,0,12026,0,0,'Halazzi - SAY_KILL'),
(23577,1,1,'Ya all gonna fail!',14,0,100,0,0,12027,0,0,'Halazzi - SAY_KILL'),
(23577,2,0,'Me gonna carve ya now!',14,0,100,0,0,12023,0,0,'Halazzi - SAY_SABER'),
(23577,2,1,'You gonna leave in pieces!',14,0,100,0,0,12024,0,0,'Halazzi - SAY_SABER'),
(23577,3,0,'I fight wit\ untamed spirit....',14,0,100,0,0,12021,0,0,'Halazzi - SAY_SPLIT'),
(23577,4,0,'Spirit, come back to me!',14,0,100,0,0,12022,0,0,'Halazzi - SAY_MERGE'),
(23577,5,0,'Chaga... choka\jinn.',14,0,100,0,0,12028,0,0,'Halazzi - SAY_DEATH');
@@ -0,0 +1,12 @@
-- DB update 2023_01_07_04 -> 2023_01_07_05
--
DELETE FROM `spell_script_names` WHERE `spell_id` IN (31704,31701,31702,31703);
INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
(31704,'spell_the_black_stalker_levitate'),
(31701,'spell_the_black_stalker_levitation_pulse'),
(31702,'spell_the_black_stalker_someone_grab_me'),
(31703,'spell_the_black_stalker_magnetic_pull');
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` = 31702;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
(13,1,31702,0,0,31,0,3,17992,0,0,0,0,"","Group 0: Spell 'Someone Grab Me' (Effect 0) targets creature 'Coilfang Invisible Vacuum Dummy'");
@@ -0,0 +1,5 @@
-- DB update 2023_01_07_05 -> 2023_01_07_06
--
DELETE FROM `spell_script_names` WHERE `spell_id`=32065;
INSERT INTO `spell_script_names` VALUES
(32065,'spell_fungal_decay');
@@ -0,0 +1,5 @@
-- DB update 2023_01_07_06 -> 2023_01_07_07
--
DELETE FROM `spell_script_names` WHERE `spell_id`=37678 AND `ScriptName`='spell_item_elixir_of_shadows';
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(37678, 'spell_item_elixir_of_shadows');
@@ -3803,6 +3803,14 @@ JoinBGAndLFG.Enable = 0
LeaveGroupOnLogout.Enabled = 1
#
# QuestPOI.Enabled
# Description: Show points of interest on the map
# Default: 1 - Enabled
# 0 - Disabled
QuestPOI.Enabled = 1
#
# ChangeFaction.MaxMoney
# Description: Maximum amount of gold allowed on the character to perform a faction change.
@@ -1267,10 +1267,14 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
}
case SMART_ACTION_SUMMON_CREATURE:
{
WorldObject* summoner = GetBaseObject() ? GetBaseObject() : unit;
EnumFlag<SmartActionSummonCreatureFlags> flags(static_cast<SmartActionSummonCreatureFlags>(e.action.summonCreature.flags));
bool preferUnit = flags.HasFlag(SmartActionSummonCreatureFlags::PreferUnit);
WorldObject* summoner = preferUnit ? unit : Coalesce<WorldObject>(GetBaseObject(), unit);
if (!summoner)
break;
bool personalSpawn = flags.HasFlag(SmartActionSummonCreatureFlags::PersonalSpawn);
if (e.GetTargetType() == SMART_TARGET_RANDOM_POINT)
{
float range = (float)e.target.randomPoint.range;
@@ -1282,7 +1286,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
randomPoint = me->GetRandomPoint(me->GetPosition(), range);
else
randomPoint = me->GetRandomPoint(srcPos, range);
if (Creature* summon = summoner->SummonCreature(e.action.summonCreature.creature, randomPoint, (TempSummonType)e.action.summonCreature.type, e.action.summonCreature.duration))
if (Creature* summon = summoner->SummonCreature(e.action.summonCreature.creature, randomPoint, (TempSummonType)e.action.summonCreature.type, e.action.summonCreature.duration, 0, nullptr, personalSpawn))
{
if (unit && e.action.summonCreature.attackInvoker)
summon->AI()->AttackStart(unit);
@@ -1301,7 +1305,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
y += e.target.y;
z += e.target.z;
o += e.target.o;
if (Creature* summon = summoner->SummonCreature(e.action.summonCreature.creature, x, y, z, o, (TempSummonType)e.action.summonCreature.type, e.action.summonCreature.duration))
if (Creature* summon = summoner->SummonCreature(e.action.summonCreature.creature, x, y, z, o, (TempSummonType)e.action.summonCreature.type, e.action.summonCreature.duration, nullptr, personalSpawn))
{
if (e.action.summonCreature.attackInvoker == 2) // pussywizard: proper attackInvoker implementation
summon->AI()->AttackStart(unit);
@@ -534,7 +534,7 @@ enum SMART_ACTION
SMART_ACTION_ACTIVATE_GOBJECT = 9, //
SMART_ACTION_RANDOM_EMOTE = 10, // EmoteId1, EmoteId2, EmoteId3...
SMART_ACTION_CAST = 11, // SpellId, CastFlags, LimitTargets
SMART_ACTION_SUMMON_CREATURE = 12, // CreatureID, summonType, duration in ms, attackInvoker, attackScriptOwner
SMART_ACTION_SUMMON_CREATURE = 12, // CreatureID, summonType, duration in ms, attackInvoker, attackScriptOwner, flags(SmartActionSummonCreatureFlags)
SMART_ACTION_THREAT_SINGLE_PCT = 13, // Threat%
SMART_ACTION_THREAT_ALL_PCT = 14, // Threat%
SMART_ACTION_CALL_AREAEXPLOREDOREVENTHAPPENS = 15, // QuestID
@@ -696,6 +696,17 @@ enum SMART_ACTION
SMART_ACTION_AC_END = 225, // placeholder
};
enum class SmartActionSummonCreatureFlags
{
None = 0,
PersonalSpawn = 1,
PreferUnit = 2,
All = PersonalSpawn | PreferUnit
};
DEFINE_ENUM_FLAG(SmartActionSummonCreatureFlags);
struct SmartAction
{
SMART_ACTION type;
@@ -820,6 +831,7 @@ struct SmartAction
uint32 duration;
SAIBool attackInvoker;
uint32 attackScriptOwner;
uint32 flags; // SmartActionSummonCreatureFlags
} summonCreature;
struct
+17 -1
View File
@@ -454,11 +454,27 @@ void ThreatMgr::AddThreat(Unit* victim, float threat, SpellSchoolMask schoolMask
void ThreatMgr::DoAddThreat(Unit* victim, float threat)
{
uint32 redirectThreadPct = victim->GetRedirectThreatPercent();
Unit* redirectTarget = victim->GetRedirectThreatTarget();
// Personal Spawns from same summoner can aggro each other
if (TempSummon* tempSummonVictim = victim->ToTempSummon())
{
if (tempSummonVictim->IsVisibleBySummonerOnly())
{
if (!GetOwner()->ToTempSummon() ||
!GetOwner()->ToTempSummon()->IsVisibleBySummonerOnly() ||
tempSummonVictim->GetSummonerGUID() != GetOwner()->ToTempSummon()->GetSummonerGUID())
{
redirectThreadPct = 100;
redirectTarget = tempSummonVictim->GetSummonerUnit();
}
}
}
// must check > 0.0f, otherwise dead loop
if (threat > 0.0f && redirectThreadPct)
{
if (Unit* redirectTarget = victim->GetRedirectThreatTarget())
if (redirectTarget)
{
float redirectThreat = CalculatePct(threat, redirectThreadPct);
threat -= redirectThreat;
@@ -25,7 +25,7 @@
TempSummon::TempSummon(SummonPropertiesEntry const* properties, ObjectGuid owner, bool isWorldObject) :
Creature(isWorldObject), m_Properties(properties), m_type(TEMPSUMMON_MANUAL_DESPAWN),
m_timer(0), m_lifetime(0)
m_timer(0), m_lifetime(0), _visibleBySummonerOnly(false)
{
if (owner)
{
@@ -57,14 +57,19 @@ public:
uint32 GetTimer() { return m_timer; }
void SetTimer(uint32 t) { m_timer = t; }
void SetVisibleBySummonerOnly(bool visibleBySummonerOnly) { _visibleBySummonerOnly = visibleBySummonerOnly; }
[[nodiscard]] bool IsVisibleBySummonerOnly() const { return _visibleBySummonerOnly; }
const SummonPropertiesEntry* const m_Properties;
std::string GetDebugInfo() const override;
private:
TempSummonType m_type;
uint32 m_timer;
uint32 m_lifetime;
ObjectGuid m_summonerGUID;
bool _visibleBySummonerOnly;
};
class Minion : public TempSummon
+19 -5
View File
@@ -1773,6 +1773,17 @@ bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth, boo
WorldObject const* viewpoint = this;
if (Player const* thisPlayer = ToPlayer())
{
if (Creature const* creature = obj->ToCreature())
{
if (TempSummon const* tempSummon = creature->ToTempSummon())
{
if (tempSummon->IsVisibleBySummonerOnly() && GetGUID() != tempSummon->GetSummonerGUID())
{
return false;
}
}
}
if (thisPlayer->isDead() && thisPlayer->GetHealth() > 0 && // Cheap way to check for ghost state
!(obj->m_serverSideVisibility.GetValue(SERVERSIDE_VISIBILITY_GHOST) & m_serverSideVisibility.GetValue(SERVERSIDE_VISIBILITY_GHOST) & GHOST_VISIBILITY_GHOST))
{
@@ -2115,7 +2126,7 @@ void WorldObject::AddObjectToRemoveList()
map->AddObjectToRemoveList(this);
}
TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropertiesEntry const* properties /*= nullptr*/, uint32 duration /*= 0*/, WorldObject* summoner /*= nullptr*/, uint32 spellId /*= 0*/, uint32 vehId /*= 0*/)
TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropertiesEntry const* properties /*= nullptr*/, uint32 duration /*= 0*/, WorldObject* summoner /*= nullptr*/, uint32 spellId /*= 0*/, uint32 vehId /*= 0*/, bool visibleBySummonerOnly /*= false*/)
{
uint32 mask = UNIT_MASK_SUMMON;
if (properties)
@@ -2204,6 +2215,9 @@ TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropert
summon->SetHomePosition(pos);
summon->InitStats(duration);
summon->SetVisibleBySummonerOnly(visibleBySummonerOnly);
if (!AddToMap(summon->ToCreature(), summon->GetOwnerGUID().IsPlayer() || (summoner && summoner->GetTransport())))
{
delete summon;
@@ -2236,7 +2250,7 @@ void Map::SummonCreatureGroup(uint8 group, std::list<TempSummon*>* list /*= null
list->push_back(summon);
}
TempSummon* WorldObject::SummonCreature(uint32 id, float x, float y, float z, float ang, TempSummonType spwtype, uint32 despwtime, SummonPropertiesEntry const* properties)
TempSummon* WorldObject::SummonCreature(uint32 id, float x, float y, float z, float ang, TempSummonType spwtype, uint32 despwtime, SummonPropertiesEntry const* properties, bool visibleBySummonerOnly)
{
if (!x && !y && !z)
{
@@ -2245,7 +2259,7 @@ TempSummon* WorldObject::SummonCreature(uint32 id, float x, float y, float z, fl
}
Position pos;
pos.Relocate(x, y, z, ang);
return SummonCreature(id, pos, spwtype, despwtime, 0, properties);
return SummonCreature(id, pos, spwtype, despwtime, 0, properties, visibleBySummonerOnly);
}
GameObject* Map::SummonGameObject(uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport)
@@ -2301,11 +2315,11 @@ void WorldObject::ClearZoneScript()
m_zoneScript = nullptr;
}
TempSummon* WorldObject::SummonCreature(uint32 entry, const Position& pos, TempSummonType spwtype, uint32 duration, uint32 /*vehId*/, SummonPropertiesEntry const* properties) const
TempSummon* WorldObject::SummonCreature(uint32 entry, const Position& pos, TempSummonType spwtype, uint32 duration, uint32 /*vehId*/, SummonPropertiesEntry const* properties, bool visibleBySummonerOnly /*= false*/) const
{
if (Map* map = FindMap())
{
if (TempSummon* summon = map->SummonCreature(entry, pos, properties, duration, (WorldObject*) this))
if (TempSummon* summon = map->SummonCreature(entry, pos, properties, duration, (WorldObject*)this, 0, 0, visibleBySummonerOnly))
{
summon->SetTempSummonType(spwtype);
return summon;
+2 -2
View File
@@ -522,8 +522,8 @@ public:
void ClearZoneScript();
[[nodiscard]] ZoneScript* GetZoneScript() const { return m_zoneScript; }
TempSummon* SummonCreature(uint32 id, const Position& pos, TempSummonType spwtype = TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime = 0, uint32 vehId = 0, SummonPropertiesEntry const* properties = nullptr) const;
TempSummon* SummonCreature(uint32 id, float x, float y, float z, float ang = 0, TempSummonType spwtype = TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime = 0, SummonPropertiesEntry const* properties = nullptr);
TempSummon* SummonCreature(uint32 id, const Position& pos, TempSummonType spwtype = TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime = 0, uint32 vehId = 0, SummonPropertiesEntry const* properties = nullptr, bool visibleBySummonerOnly = false) const;
TempSummon* SummonCreature(uint32 id, float x, float y, float z, float ang = 0, TempSummonType spwtype = TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime = 0, SummonPropertiesEntry const* properties = nullptr, bool visibleBySummonerOnly = false);
GameObject* SummonGameObject(uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport = true, GOSummonType summonType = GO_SUMMON_TIMED_OR_CORPSE_DESPAWN);
Creature* SummonTrigger(float x, float y, float z, float ang, uint32 dur, bool setLevel = false, CreatureAI * (*GetAI)(Creature*) = nullptr);
void SummonCreatureGroup(uint8 group, std::list<TempSummon*>* list = nullptr);
+4
View File
@@ -2441,6 +2441,10 @@ float Pet::GetNativeObjectScale() const
else
scale = creatureFamily->minScale + float(GetLevel() - creatureFamily->minScaleLevel) / creatureFamily->maxScaleLevel * (creatureFamily->maxScale - creatureFamily->minScale);
if (CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.LookupEntry(GetNativeDisplayId()))
if (displayInfo->scale > 1.f && GetCreatureTemplate()->IsExotic())
scale *= displayInfo->scale;
return scale;
}
+1 -1
View File
@@ -16049,7 +16049,7 @@ void Player::RemoveRestFlag(RestFlag restFlag)
uint32 Player::DoRandomRoll(uint32 minimum, uint32 maximum)
{
ASSERT(minimum <= maximum || maximum <= 10000);
ASSERT(minimum <= maximum);
uint32 roll = urand(minimum, maximum);
+11
View File
@@ -1698,6 +1698,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, CalcDamageInfo* damageInfo, Weapon
if (fullBlockMask == ((1 << 0) | (1 << 1)))
{
damageInfo->TargetState = VICTIMSTATE_BLOCKS;
damageInfo->procEx |= PROC_EX_FULL_BLOCK;
damageInfo->blocked_amount -= remainingBlock;
}
break;
@@ -1804,6 +1805,16 @@ void Unit::CalculateMeleeDamage(Unit* victim, CalcDamageInfo* damageInfo, Weapon
{
damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_RESIST);
}
if (damageInfo->HitInfo & (HITINFO_PARTIAL_ABSORB | HITINFO_FULL_ABSORB))
{
damageInfo->procEx |= PROC_EX_ABSORB;
}
if (damageInfo->HitInfo & HITINFO_FULL_RESIST)
{
damageInfo->procEx |= PROC_EX_RESIST;
}
}
void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss)
+7
View File
@@ -7743,6 +7743,13 @@ void ObjectMgr::LoadPointsOfInterest()
void ObjectMgr::LoadQuestPOI()
{
if (!sWorld->getBoolConfig(CONFIG_QUEST_POI_ENABLED))
{
LOG_INFO("server.loading", ">> Loaded 0 quest POI definitions. Disabled by config.");
LOG_INFO("server.loading", " ");
return;
}
uint32 oldMSTime = getMSTime();
_questPOIStore.clear(); // need for reload case
+15 -1
View File
@@ -1264,7 +1264,21 @@ public:
}
[[nodiscard]] QuestGreetingLocale const* GetQuestGreetingLocale(TypeID type, uint32 id) const
{
QuestGreetingLocaleContainer::const_iterator itr = _questGreetingLocaleStore.find(MAKE_PAIR32(type, id));
uint32 typeIndex;
if (type == TYPEID_UNIT)
{
typeIndex = 0;
}
else if (type == TYPEID_GAMEOBJECT)
{
typeIndex = 1;
}
else
{
return nullptr;
}
QuestGreetingLocaleContainer::const_iterator itr = _questGreetingLocaleStore.find(MAKE_PAIR32(typeIndex, id));
if (itr == _questGreetingLocaleStore.end()) return nullptr;
return &itr->second;
}
@@ -597,7 +597,7 @@ namespace Acore
void Visit(PlayerMapType& m)
{
for (PlayerMapType::iterator itr = m.begin(); itr != m.end(); ++itr)
if (itr->GetSource()->InSamePhase(i_searcher) && itr->GetSource()->IsWithinDist(i_searcher, i_dist))
if (itr->GetSource()->HaveAtClient(i_searcher) && itr->GetSource()->IsWithinDist(i_searcher, i_dist))
i_do(itr->GetSource());
}
@@ -567,6 +567,12 @@ void WorldSession::HandleRandomRollOpcode(WorldPackets::Misc::RandomRollClient&
minimum = packet.Min;
maximum = packet.Max;
/** error handling **/
if (minimum > maximum || maximum > 10000) // < 32768 for urand call
{
return;
}
GetPlayer()->DoRandomRoll(minimum, maximum);
}
+3 -2
View File
@@ -414,12 +414,13 @@ bool LootItem::AllowedForPlayer(Player const* player, ObjectGuid source) const
}
bool isMasterLooter = player->GetGroup() && player->GetGroup()->GetMasterLooterGuid() == player->GetGUID();
bool itemVisibleForMasterLooter = !needs_quest && (!follow_loot_rules || !is_underthreshold);
// DB conditions check
if (!sConditionMgr->IsObjectMeetToConditions(const_cast<Player*>(player), conditions))
{
// Master Looter can see conditioned recipes
if (isMasterLooter && (!follow_loot_rules || !is_underthreshold))
if (isMasterLooter && itemVisibleForMasterLooter)
{
if ((pProto->Flags & ITEM_FLAG_HIDE_UNUSABLE_RECIPE) || (pProto->Class == ITEM_CLASS_RECIPE && pProto->Bonding == BIND_WHEN_PICKED_UP && pProto->Spells[1].SpellId != 0))
{
@@ -442,7 +443,7 @@ bool LootItem::AllowedForPlayer(Player const* player, ObjectGuid source) const
}
// Master looter can see all items even if the character can't loot them
if (isMasterLooter && (!follow_loot_rules || !is_underthreshold))
if (isMasterLooter && itemVisibleForMasterLooter)
{
return true;
}
+1 -1
View File
@@ -500,7 +500,7 @@ public:
void UpdateIteratorBack(Player* player);
TempSummon* SummonCreature(uint32 entry, Position const& pos, SummonPropertiesEntry const* properties = nullptr, uint32 duration = 0, WorldObject* summoner = nullptr, uint32 spellId = 0, uint32 vehId = 0);
TempSummon* SummonCreature(uint32 entry, Position const& pos, SummonPropertiesEntry const* properties = nullptr, uint32 duration = 0, WorldObject* summoner = nullptr, uint32 spellId = 0, uint32 vehId = 0, bool visibleBySummonerOnly = false);
GameObject* SummonGameObject(uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport = true);
GameObject* SummonGameObject(uint32 entry, Position const& pos, float rotation0 = 0.0f, float rotation1 = 0.0f, float rotation2 = 0.0f, float rotation3 = 0.0f, uint32 respawnTime = 100, bool checkTransport = true);
void SummonCreatureGroup(uint8 group, std::list<TempSummon*>* list = nullptr);
@@ -191,7 +191,10 @@ namespace Movement
uint32 nodes = move_spline.getPath().size();
data << nodes;
data.append<Vector3>(&move_spline.getPath()[0], nodes);
if (nodes)
{
data.append<Vector3>(&move_spline.getPath()[0], nodes);
}
data << uint8(move_spline.spline.mode()); // added in 3.1
data << (move_spline.isCyclic() ? Vector3::zero() : move_spline.FinalDestination());
}
@@ -6177,7 +6177,7 @@ void AuraEffect::HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster)
case 56654:
case 58882:
int32 amount = int32(target->GetMaxPower(POWER_MANA) * GetAmount() / 100.0f);
target->CastCustomSpell(target, triggerSpellId, &amount, nullptr, nullptr, true);
target->CastCustomSpell(target, triggerSpellId, &amount, nullptr, nullptr, true, nullptr, this);
return;
}
}
+9
View File
@@ -2917,6 +2917,15 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target)
{
m_caster->CombatStart(effectUnit, !(m_spellInfo->AttributesEx3 & SPELL_ATTR3_SUPRESS_TARGET_PROCS));
// Patch 3.0.8: All player spells which cause a creature to become aggressive to you will now also immediately cause the creature to be tapped.
if (Creature* creature = effectUnit->ToCreature())
{
if (!creature->hasLootRecipient() && m_caster->IsPlayer())
{
creature->SetLootRecipient(m_caster);
}
}
// Unsure if there are more spells that are not supposed to stop enemy from
// regenerating HP from food, so for now it stays as an ID.
const uint32 SPELL_PREMEDITATION = 14183;
+1 -1
View File
@@ -753,7 +753,7 @@ public:
HitTriggerSpellList m_hitTriggerSpells;
// effect helpers
void SummonGuardian(uint32 i, uint32 entry, SummonPropertiesEntry const* properties, uint32 numSummons);
void SummonGuardian(uint32 i, uint32 entry, SummonPropertiesEntry const* properties, uint32 numSummons, bool personalSpawn);
void CalculateJumpSpeeds(uint8 i, float dist, float& speedxy, float& speedz);
SpellCastResult CanOpenLock(uint32 effIndex, uint32 lockid, SkillType& skillid, int32& reqSkillValue, int32& skillValue);
+14 -24
View File
@@ -2354,6 +2354,7 @@ void Spell::EffectSummonType(SpellEffIndex effIndex)
if (!m_originalCaster)
return;
bool personalSpawn = (properties->Flags & SUMMON_PROP_FLAG_ONLY_VISIBLE_TO_SUMMONER) != 0;
int32 duration = m_spellInfo->GetDuration();
if (Player* modOwner = m_originalCaster->GetSpellModOwner())
modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_DURATION, duration);
@@ -2398,7 +2399,7 @@ void Spell::EffectSummonType(SpellEffIndex effIndex)
case SUMMON_CATEGORY_UNK:
if (properties->Flags & 512)
{
SummonGuardian(effIndex, entry, properties, numSummons);
SummonGuardian(effIndex, entry, properties, numSummons, personalSpawn);
break;
}
switch (properties->Type)
@@ -2407,18 +2408,18 @@ void Spell::EffectSummonType(SpellEffIndex effIndex)
case SUMMON_TYPE_GUARDIAN:
case SUMMON_TYPE_GUARDIAN2:
case SUMMON_TYPE_MINION:
SummonGuardian(effIndex, entry, properties, numSummons);
SummonGuardian(effIndex, entry, properties, numSummons, personalSpawn);
break;
// Summons a vehicle, but doesn't force anyone to enter it (see SUMMON_CATEGORY_VEHICLE)
case SUMMON_TYPE_VEHICLE:
case SUMMON_TYPE_VEHICLE2:
summon = m_caster->GetMap()->SummonCreature(entry, *destTarget, properties, duration, m_originalCaster, m_spellInfo->Id);
summon = m_caster->GetMap()->SummonCreature(entry, *destTarget, properties, duration, m_originalCaster, m_spellInfo->Id, 0, personalSpawn);
break;
case SUMMON_TYPE_LIGHTWELL:
case SUMMON_TYPE_TOTEM:
{
// protection code
summon = m_caster->GetMap()->SummonCreature(entry, *destTarget, properties, duration, m_originalCaster, m_spellInfo->Id);
summon = m_caster->GetMap()->SummonCreature(entry, *destTarget, properties, duration, m_originalCaster, m_spellInfo->Id, 0, personalSpawn);
if (!summon || !summon->IsTotem())
return;
@@ -2436,7 +2437,7 @@ void Spell::EffectSummonType(SpellEffIndex effIndex)
case SUMMON_TYPE_JEEVES:
case SUMMON_TYPE_MINIPET:
{
summon = m_caster->GetMap()->SummonCreature(entry, *destTarget, properties, duration, m_originalCaster, m_spellInfo->Id);
summon = m_caster->GetMap()->SummonCreature(entry, *destTarget, properties, duration, m_originalCaster, m_spellInfo->Id, 0, personalSpawn);
if (!summon || !summon->HasUnitTypeMask(UNIT_MASK_MINION))
return;
@@ -2470,7 +2471,7 @@ void Spell::EffectSummonType(SpellEffIndex effIndex)
// randomize position for multiple summons
pos = m_caster->GetRandomPoint(*destTarget, radius);
summon = m_originalCaster->SummonCreature(entry, pos, summonType, duration);
summon = m_originalCaster->SummonCreature(entry, pos, summonType, duration, 0, nullptr, personalSpawn);
if (!summon)
continue;
@@ -2492,10 +2493,10 @@ void Spell::EffectSummonType(SpellEffIndex effIndex)
// Xinef: SummonGuardian function can summon a few npcs of same type, remove old summons with same entry here
if (m_originalCaster)
m_originalCaster->RemoveAllMinionsByEntry(entry);
SummonGuardian(effIndex, entry, properties, numSummons);
SummonGuardian(effIndex, entry, properties, numSummons, personalSpawn);
break;
case SUMMON_CATEGORY_PUPPET:
summon = m_caster->GetMap()->SummonCreature(entry, *destTarget, properties, duration, m_originalCaster, m_spellInfo->Id);
summon = m_caster->GetMap()->SummonCreature(entry, *destTarget, properties, duration, m_originalCaster, m_spellInfo->Id, 0, personalSpawn);
break;
case SUMMON_CATEGORY_VEHICLE:
// Summoning spells (usually triggered by npc_spellclick) that spawn a vehicle and that cause the clicker
@@ -2506,7 +2507,7 @@ void Spell::EffectSummonType(SpellEffIndex effIndex)
if (std::fabs(m_caster->GetPositionZ() - destTarget->GetPositionZ()) > 6.0f)
destTarget->m_positionZ = m_caster->GetPositionZ();
summon = m_originalCaster->GetMap()->SummonCreature(entry, *destTarget, properties, duration, m_caster, m_spellInfo->Id);
summon = m_originalCaster->GetMap()->SummonCreature(entry, *destTarget, properties, duration, m_caster, m_spellInfo->Id, 0, personalSpawn);
if (!summon || !summon->IsVehicle())
return;
@@ -3176,7 +3177,7 @@ void Spell::EffectSummonPet(SpellEffIndex effIndex)
// Xinef: unsummon old guardian
if (Guardian* oldPet = m_originalCaster->GetGuardianPet())
oldPet->UnSummon();
SummonGuardian(effIndex, petentry, properties, 1);
SummonGuardian(effIndex, petentry, properties, 1, false);
}
return;
}
@@ -3903,17 +3904,6 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex)
m_caster->TextEmote(buf);
break;
}
// Roll 'dem Bones - Worn Troll Dice
case 47776:
{
char buf[128];
const char* gender = "his";
if (m_caster->getGender() > 0)
gender = "her";
sprintf(buf, "%s causually tosses %s [Worn Troll Dice]. One %u and one %u.", m_caster->GetName().c_str(), gender, urand(1, 6), urand(1, 6));
m_caster->TextEmote(buf);
break;
}
case 52173: // Coyote Spirit Despawn
case 60243: // Blood Parrot Despawn
if (unitTarget->GetTypeId() == TYPEID_UNIT && unitTarget->ToCreature()->IsSummon())
@@ -5186,7 +5176,7 @@ void Spell::EffectPullTowards(SpellEffIndex effIndex)
pos.Relocate(m_caster->GetPositionX(), m_caster->GetPositionY(), m_caster->GetPositionZ() + 1.0f, m_caster->GetOrientation());
}
float speedXY = float(m_spellInfo->Effects[effIndex].MiscValue) * 0.1f;
float speedXY = float(m_spellInfo->Effects[effIndex].MiscValue) ? float(m_spellInfo->Effects[effIndex].MiscValue) * 0.1f : 30.f;
float speedZ = unitTarget->GetDistance(pos) / speedXY * 0.5f * Movement::gravity;
unitTarget->GetMotionMaster()->MoveJump(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), speedXY, speedZ);
@@ -6005,7 +5995,7 @@ void Spell::EffectGameObjectSetDestructionState(SpellEffIndex effIndex)
gameObjTarget->SetDestructibleState(GameObjectDestructibleState(m_spellInfo->Effects[effIndex].MiscValue), player, true);
}
void Spell::SummonGuardian(uint32 i, uint32 entry, SummonPropertiesEntry const* properties, uint32 numGuardians)
void Spell::SummonGuardian(uint32 i, uint32 entry, SummonPropertiesEntry const* properties, uint32 numGuardians, bool personalSpawn)
{
Unit* caster = m_originalCaster;
if (!caster)
@@ -6105,7 +6095,7 @@ void Spell::SummonGuardian(uint32 i, uint32 entry, SummonPropertiesEntry const*
pos = m_caster->GetRandomPoint(*destTarget, radius);
}
summon = map->SummonCreature(entry, pos, properties, duration, caster, m_spellInfo->Id);
summon = map->SummonCreature(entry, pos, properties, duration, caster, m_spellInfo->Id, 0, personalSpawn);
if (!summon)
return;
+1
View File
@@ -2725,6 +2725,7 @@ bool SpellInfo::_IsPositiveEffect(uint8 effIndex, bool deep) const
return true;
return false;
case SPELL_AURA_MOD_ROOT:
case SPELL_AURA_MOD_FEAR:
case SPELL_AURA_MOD_SILENCE:
case SPELL_AURA_GHOST:
case SPELL_AURA_PERIODIC_LEECH:
+1
View File
@@ -174,6 +174,7 @@ enum WorldBoolConfigs
CONFIG_ALLOW_JOIN_BG_AND_LFG,
CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS,
CONFIG_LEAVE_GROUP_ON_LOGOUT,
CONFIG_QUEST_POI_ENABLED,
CONFIG_VMAP_BLIZZLIKE_PVP_LOS,
CONFIG_OBJECT_SPARKLES,
CONFIG_LOW_LEVEL_REGEN_BOOST,
+2
View File
@@ -1280,6 +1280,8 @@ void World::LoadConfigSettings(bool reload)
m_bool_configs[CONFIG_LEAVE_GROUP_ON_LOGOUT] = sConfigMgr->GetOption<bool>("LeaveGroupOnLogout.Enabled", true);
m_bool_configs[CONFIG_QUEST_POI_ENABLED] = sConfigMgr->GetOption<bool>("QuestPOI.Enabled", true);
m_int_configs[CONFIG_CHANGE_FACTION_MAX_MONEY] = sConfigMgr->GetOption<uint32>("ChangeFaction.MaxMoney", 0);
///- Read the "Data" directory from the config file
@@ -709,6 +709,13 @@ public:
DoZoneInCombat();
}
void EnterEvadeMode(EvadeReason reason) override
{
ScriptedAI::EnterEvadeMode(reason);
instance->SetBossState(DATA_OPERA_PERFORMANCE, FAIL);
}
void JustDied(Unit* /*killer*/) override
{
Talk(SAY_CRONE_DEATH);
@@ -891,6 +898,13 @@ public:
me->DespawnOrUnsummon();
}
void EnterEvadeMode(EvadeReason reason) override
{
ScriptedAI::EnterEvadeMode(reason);
instance->SetBossState(DATA_OPERA_PERFORMANCE, FAIL);
}
void JustDied(Unit* /*killer*/) override
{
DoPlaySoundToSet(me, SOUND_WOLF_DEATH);
@@ -1138,6 +1152,13 @@ public:
void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override;
void EnterEvadeMode(EvadeReason reason) override
{
ScriptedAI::EnterEvadeMode(reason);
instance->SetBossState(DATA_OPERA_PERFORMANCE, FAIL);
}
void JustDied(Unit*) override
{
Talk(SAY_JULIANNE_DEATH02);
@@ -1287,6 +1308,13 @@ public:
ScriptedAI::MoveInLineOfSight(who);
}
void EnterEvadeMode(EvadeReason reason) override
{
ScriptedAI::EnterEvadeMode(reason);
instance->SetBossState(DATA_OPERA_PERFORMANCE, FAIL);
}
void JustDied(Unit* /*killer*/) override
{
Talk(SAY_ROMULO_DEATH);
@@ -73,7 +73,18 @@ public:
case NPC_RELAY:
m_uiRelayGUID = creature->GetGUID();
break;
case NPC_BARNES:
_barnesGUID = creature->GetGUID();
if (GetBossState(DATA_OPERA_PERFORMANCE) != DONE && !creature->IsAlive())
{
creature->Respawn(true);
}
break;
default:
break;
}
InstanceScript::OnCreatureCreate(creature);
}
void OnUnitDeath(Unit* unit) override
@@ -162,6 +173,13 @@ public:
sideEntrance->RemoveGameObjectFlag(GO_FLAG_LOCKED);
instance->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, 16812, nullptr);
}
else if (state == FAIL)
{
HandleGameObject(m_uiStageDoorLeftGUID, false);
HandleGameObject(m_uiStageDoorRightGUID, false);
HandleGameObject(m_uiCurtainGUID, false);
DoRespawnCreature(_barnesGUID, true);
}
break;
case DATA_CHESS:
if (state == DONE)
@@ -336,6 +354,7 @@ public:
ObjectGuid ImageGUID;
ObjectGuid DustCoveredChest;
ObjectGuid m_uiRelayGUID;
ObjectGuid _barnesGUID;
GuidVector _operaDecorations[EVENT_RAJ];
};
};
@@ -90,7 +90,8 @@ enum KZMiscCreatures
NPC_DREADBEAST = 16177,
NPC_SHADOWBEAST = 16176,
NPC_KILREK = 17229,
NPC_RELAY = 17645
NPC_RELAY = 17645,
NPC_BARNES = 16812
};
enum KZGameObjectIds
@@ -56,12 +56,11 @@ enum PhaseHalazzi
enum Yells
{
SAY_AGGRO = 0,
SAY_SABER = 1,
SAY_SPLIT = 2,
SAY_MERGE = 3,
SAY_KILL = 4,
SAY_DEATH = 5,
SAY_BERSERK = 6
SAY_KILL = 1,
SAY_SABER = 2,
SAY_SPLIT = 3,
SAY_MERGE = 4,
SAY_DEATH = 5
};
class boss_halazzi : public CreatureScript
@@ -197,7 +196,6 @@ public:
if (BerserkTimer <= diff)
{
Talk(SAY_BERSERK);
DoCast(me, SPELL_BERSERK, true);
BerserkTimer = 60000;
}
@@ -207,6 +205,7 @@ public:
{
if (SaberlashTimer <= diff)
{
Talk(SAY_SABER);
// A tank with more than 490 defense skills should receive no critical hit
//DoCast(me, 41296, true);
DoCastVictim(SPELL_SABER_LASH, true);
@@ -211,7 +211,7 @@ public:
return;
}
if (summon->GetEntry() == NPC_ONYXIAN_LAIR_GUARD && Phase != PHASE_LANDED)
if (summon->GetEntry() == NPC_ONYXIAN_LAIR_GUARD && Phase < PHASE_AIRPHASE)
{
return;
}
@@ -221,8 +221,6 @@ public:
summon->AI()->AttackStart(target);
DoZoneInCombat(summon);
}
summons.Summon(summon);
}
void MovementInform(uint32 type, uint32 id) override
@@ -20,16 +20,33 @@
#include "SpellScript.h"
#include "the_underbog.h"
/*
How levitation sequence works: boss casts Levitate and it triggers a chain of spells, target(any target, player or pet, any position in
threat list) eventually gets pulled towards by randomly selected trigger. Then target becomes protected from Pull Towards by Suspension
aura which is triggered every 1 sec up to 4 times. Since it has stun mechanic, diminishing returns cuts off its duration every cast in
half (20 > 10 > 5 > 0). Eventually player becomes immune to Suspension and vulnerable to another pull towards.
Whole levitate sequence is designed to pull player towards up to 3 times. Usually it works like this: player gets pulled towards,
gets protected by Suspension from Pull Towards next 2 times. If player is unlucky, boss can cast Levitate on same player again, in that case
player can be pulled towards 2 times in a row without any protection from fall damage by Suspension(case from sniffs).
However currently diminishing returns affects Suspension after first cast, its duration is 10 instead of 20 seconds and player will be
immune to 4th cast. That allows to pull player towards when levitation sequence ends. Levitation sequence has sensetive design and looks
like lack of delays between packets makes it work differently too.
Of course as was said above player can be pulled towards 2 times in a row but that looks like a rare case.
*/
enum eBlackStalker
{
SPELL_LEVITATE = 31704,
SPELL_SUSPENSION = 31719,
SPELL_LEVITATION_PULSE = 31701,
SPELL_MAGNETIC_PULL = 31705,
SPELL_CHAIN_LIGHTNING = 31717,
SPELL_STATIC_CHARGE = 31715,
SPELL_SUMMON_SPORE_STRIDER = 38755,
SPELL_LEVITATION_PULSE = 31701,
SPELL_SOMEONE_GRAB_ME = 31702,
SPELL_MAGNETIC_PULL = 31703,
SPELL_SUSPENSION_PRIMER = 31720,
SPELL_SUSPENSION = 31719,
EVENT_LEVITATE = 1,
EVENT_SPELL_CHAIN = 2,
EVENT_SPELL_STATIC = 3,
@@ -47,15 +64,9 @@ struct boss_the_black_stalker : public BossAI
{
}
void Reset() override
{
lTarget.Clear();
BossAI::Reset();
}
void EnterCombat(Unit* who) override
{
events.ScheduleEvent(EVENT_LEVITATE, 12000);
events.ScheduleEvent(EVENT_LEVITATE, urand(8000, 12000));
events.ScheduleEvent(EVENT_SPELL_CHAIN, 6000);
events.ScheduleEvent(EVENT_SPELL_STATIC, 10000);
events.ScheduleEvent(EVENT_CHECK, 5000);
@@ -88,6 +99,10 @@ struct boss_the_black_stalker : public BossAI
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_CHECK:
@@ -107,7 +122,6 @@ struct boss_the_black_stalker : public BossAI
case EVENT_SPELL_CHAIN:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
me->CastSpell(target, SPELL_CHAIN_LIGHTNING, false);
events.DelayEvents(3000);
events.RepeatEvent(9000);
break;
case EVENT_SPELL_STATIC:
@@ -116,46 +130,16 @@ struct boss_the_black_stalker : public BossAI
events.RepeatEvent(10000);
break;
case EVENT_LEVITATE:
events.RepeatEvent(15000);
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1))
{
me->CastSpell(target, SPELL_LEVITATE, false);
lTarget = target->GetGUID();
events.DelayEvents(5000);
events.ScheduleEvent(EVENT_LEVITATE_TARGET_1, 2000);
}
DoCastSelf(SPELL_LEVITATE);
events.RepeatEvent(urand(18000, 24000));
break;
case EVENT_LEVITATE_TARGET_1:
if (Unit* target = ObjectAccessor::GetUnit(*me, lTarget))
{
if (!target->HasAura(SPELL_LEVITATE))
lTarget.Clear();
else
{
target->CastSpell(target, SPELL_MAGNETIC_PULL, true);
events.ScheduleEvent(EVENT_LEVITATE_TARGET_2, 1500);
}
}
break;
case EVENT_LEVITATE_TARGET_2:
if (Unit* target = ObjectAccessor::GetUnit(*me, lTarget))
{
if (!target->HasAura(SPELL_LEVITATE))
lTarget.Clear();
else
{
target->AddAura(SPELL_SUSPENSION, target);
lTarget.Clear();
}
}
break;
}
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
DoMeleeAttackIfReady();
}
private:
ObjectGuid lTarget;
};
class spell_gen_allergies : public AuraScript
@@ -180,8 +164,97 @@ class spell_gen_allergies : public AuraScript
}
};
// 31704 - Levitate
class spell_the_black_stalker_levitate : public SpellScript
{
PrepareSpellScript(spell_the_black_stalker_levitate);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_LEVITATION_PULSE });
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
GetHitUnit()->CastSpell(GetHitUnit(), SPELL_LEVITATION_PULSE, true);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_the_black_stalker_levitate::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
// 31701 - Levitation Pulse
class spell_the_black_stalker_levitation_pulse : public SpellScript
{
PrepareSpellScript(spell_the_black_stalker_levitation_pulse);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_SOMEONE_GRAB_ME });
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
GetCaster()->CastSpell(GetCaster(), SPELL_SOMEONE_GRAB_ME, true);
}
void Register() override
{
OnEffectHit += SpellEffectFn(spell_the_black_stalker_levitation_pulse::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
// 31702 - Someone Grab Me
class spell_the_black_stalker_someone_grab_me : public SpellScript
{
PrepareSpellScript(spell_the_black_stalker_someone_grab_me);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_MAGNETIC_PULL, SPELL_SUSPENSION });
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
if (!GetCaster()->HasAura(SPELL_SUSPENSION))
GetHitUnit()->CastSpell(GetCaster(), SPELL_MAGNETIC_PULL);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_the_black_stalker_someone_grab_me::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
// 31703 - Magnetic Pull
class spell_the_black_stalker_magnetic_pull : public SpellScript
{
PrepareSpellScript(spell_the_black_stalker_magnetic_pull);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_SUSPENSION_PRIMER });
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
GetHitUnit()->CastSpell(GetHitUnit(), SPELL_SUSPENSION_PRIMER, true);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_the_black_stalker_magnetic_pull::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
void AddSC_boss_the_black_stalker()
{
RegisterUnderbogCreatureAI(boss_the_black_stalker);
RegisterSpellScript(spell_gen_allergies);
RegisterSpellScript(spell_the_black_stalker_levitate);
RegisterSpellScript(spell_the_black_stalker_levitation_pulse);
RegisterSpellScript(spell_the_black_stalker_someone_grab_me);
RegisterSpellScript(spell_the_black_stalker_magnetic_pull);
}
@@ -0,0 +1,46 @@
/*
* This file is part of the AzerothCore 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 Affero General Public License as published by the
* Free Software Foundation; either version 3 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 Affero 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 "ScriptMgr.h"
#include "SpellScript.h"
#include "the_underbog.h"
class spell_fungal_decay : public AuraScript
{
PrepareAuraScript(spell_fungal_decay);
void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
ModStackAmount(5);
}
void PeriodicTick(AuraEffect const* /*aurEff*/)
{
ModStackAmount(-1);
}
void Register() override
{
OnEffectApply += AuraEffectApplyFn(spell_fungal_decay::OnApply, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL);
OnEffectPeriodic += AuraEffectPeriodicFn(spell_fungal_decay::PeriodicTick, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE);
}
};
void AddSC_underbog()
{
RegisterSpellScript(spell_fungal_decay);
}
@@ -196,6 +196,8 @@ public:
{
Talk(EMOTE_NAZAN);
events.Reset();
me->SetReactState(REACT_PASSIVE);
me->InterruptNonMeleeSpells(true);
me->GetMotionMaster()->MovePoint(POINT_MIDDLE, -1406.5f, 1746.5f, 81.2f, false);
}
}
@@ -206,8 +208,10 @@ public:
{
me->SetCanFly(false);
me->SetDisableGravity(false);
events.ScheduleEvent(EVENT_RESTORE_COMBAT, 0);
me->SetReactState(REACT_AGGRESSIVE);
events.ScheduleEvent(EVENT_RESTORE_COMBAT, 1);
events.ScheduleEvent(EVENT_SPELL_CONE_OF_FIRE, 5000);
events.ScheduleEvent(EVENT_SPELL_FIREBALL, 6000);
if (IsHeroic())
events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 10000);
}
@@ -50,7 +50,8 @@ void AddSC_boss_hydromancer_thespia(); //CR Steam Vault
void AddSC_boss_mekgineer_steamrigger();
void AddSC_boss_warlord_kalithresh();
void AddSC_instance_steam_vault();
void AddSC_boss_hungarfen(); //CR Underbog
void AddSC_underbog(); //CR Underbog
void AddSC_boss_hungarfen();
void AddSC_boss_ghazan();
void AddSC_boss_the_black_stalker();
void AddSC_instance_the_underbog();
@@ -145,7 +146,8 @@ void AddOutlandScripts()
AddSC_boss_mekgineer_steamrigger();
AddSC_boss_warlord_kalithresh();
AddSC_instance_steam_vault();
AddSC_boss_hungarfen(); //CR Underbog
AddSC_underbog(); //CR Underbog
AddSC_boss_hungarfen();
AddSC_boss_ghazan();
AddSC_boss_the_black_stalker();
AddSC_instance_the_underbog();
@@ -24,7 +24,6 @@ EndScriptData */
/* ContentData
npc_unkor_the_ruthless
npc_infested_root_walker
npc_rotting_forest_rager
npc_netherweb_victim
npc_floon
@@ -446,38 +445,6 @@ public:
};
};
/*######
## npc_infested_root_walker
######*/
class npc_infested_root_walker : public CreatureScript
{
public:
npc_infested_root_walker() : CreatureScript("npc_infested_root_walker") { }
CreatureAI* GetAI(Creature* creature) const override
{
return new npc_infested_root_walkerAI(creature);
}
struct npc_infested_root_walkerAI : public ScriptedAI
{
npc_infested_root_walkerAI(Creature* creature) : ScriptedAI(creature) { }
void Reset() override { }
void EnterCombat(Unit* /*who*/) override { }
void DamageTaken(Unit* done_by, uint32& damage, DamageEffectType, SpellSchoolMask) override
{
if (done_by && done_by->GetTypeId() == TYPEID_PLAYER)
if (me->GetHealth() <= damage)
if (rand() % 100 < 75)
//Summon Wood Mites
DoCast(me, 39130, true);
}
};
};
/*######
## npc_rotting_forest_rager
######*/
@@ -872,7 +839,6 @@ void AddSC_terokkar_forest()
// Theirs
new npc_unkor_the_ruthless();
new npc_infested_root_walker();
new npc_rotting_forest_rager();
new npc_floon();
new npc_isla_starmane();
+64
View File
@@ -23,7 +23,9 @@
#include "Battleground.h"
#include "GameTime.h"
#include "ObjectMgr.h"
#include "Player.h"
#include "Pet.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SkillDiscovery.h"
@@ -3757,6 +3759,66 @@ class spell_item_green_whelp_armor : public AuraScript
}
};
// 37678 - elixir of shadows
/// @todo Temporary fix until pet restrictions vs player restrictions are investigated
class spell_item_elixir_of_shadows : public SpellScript
{
PrepareSpellScript(spell_item_elixir_of_shadows);
void HandleEffect(SpellEffIndex /*effIndex*/)
{
if (Player* player = GetCaster()->ToPlayer())
if (Pet* pet = player->GetPet())
pet->AddAura(37678 /*Elixir of Shadows*/, pet);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_item_elixir_of_shadows::HandleEffect, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
OnEffectHitTarget += SpellEffectFn(spell_item_elixir_of_shadows::HandleEffect, EFFECT_1, SPELL_EFFECT_APPLY_AURA);
}
};
enum TrollDice
{
TEXT_WORN_TROLL_DICE = 26152
};
// 47776 - Roll 'dem Bones
class spell_item_worn_troll_dice : public SpellScript
{
PrepareSpellScript(spell_item_worn_troll_dice);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
if (!sObjectMgr->GetBroadcastText(TEXT_WORN_TROLL_DICE))
return false;
return true;
}
bool Load() override
{
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
GetCaster()->TextEmote(TEXT_WORN_TROLL_DICE, GetHitUnit());
static uint32 const minimum = 1;
static uint32 const maximum = 6;
// roll twice
GetCaster()->ToPlayer()->DoRandomRoll(minimum, maximum);
GetCaster()->ToPlayer()->DoRandomRoll(minimum, maximum);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_item_worn_troll_dice::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
void AddSC_item_spell_scripts()
{
RegisterSpellScript(spell_item_massive_seaforium_charge);
@@ -3873,4 +3935,6 @@ void AddSC_item_spell_scripts()
RegisterSpellScript(spell_item_snowman);
RegisterSpellScript(spell_item_freeze_rookery_egg);
RegisterSpellScript(spell_item_green_whelp_armor);
RegisterSpellScript(spell_item_elixir_of_shadows);
RegisterSpellScript(spell_item_worn_troll_dice);
}
@@ -840,7 +840,10 @@ public:
break;
case TEXT_EMOTE_DANCE:
if (!player->HasAura(SPELL_SEDUCTION))
{
player->RemoveAurasByType(SPELL_AURA_MOUNTED);
DoCast(player, SPELL_SEDUCTION, true);
}
break;
}
}
+16 -16
View File
@@ -426,22 +426,22 @@ enum SummonPropGroup
enum SummonPropFlags
{
SUMMON_PROP_FLAG_NONE = 0x00000000, // 1342 spells in 3.0.3
SUMMON_PROP_FLAG_ATTACK_SUMMONER = 0x00000001, // 75 spells in 3.0.3, something unfriendly TODO: Needs implementation
SUMMON_PROP_FLAG_ASSIST_COMBAT_SUMMON = 0x00000002, // 616 spells in 3.0.3, something friendly TODO: Needs implementation
SUMMON_PROP_FLAG_USE_LEVEL_OFFSET = 0x00000004, // 22 spells in 3.0.3, no idea... TODO: Needs implementation
SUMMON_PROP_FLAG_DESPAWN_ON_SUMMONER_DEATH = 0x00000008, // 49 spells in 3.0.3, some mounts TODO: Needs implementation
SUMMON_PROP_FLAG_ONLY_VISIBLE_TO_SUMMONER = 0x00000010, // 25 spells in 3.0.3, quest related? TODO: Needs implementation
SUMMON_PROP_FLAG_CANNOT_DISMISS_PET = 0x00000020, // 0 spells in 3.3.5, unused TODO: Needs implementation
SUMMON_PROP_FLAG_USE_DEMON_TIMEOUT = 0x00000040, // 12 spells in 3.0.3, no idea TODO: Needs implementation
SUMMON_PROP_FLAG_UNLIMITED_SUMMONS = 0x00000080, // 4 spells in 3.0.3, no idea TODO: Needs implementation
SUMMON_PROP_FLAG_USE_CREATURE_LEVEL = 0x00000100, // 51 spells in 3.0.3, no idea, many quest related TODO: Needs implementation
SUMMON_PROP_FLAG_JOIN_SUMMONER_SPAWN_GROUP = 0x00000200, // 51 spells in 3.0.3, something defensive TODO: Needs implementation
SUMMON_PROP_FLAG_DO_NOT_TOGGLE = 0x00000400, // 3 spells, requires something near? TODO: Needs implementation
SUMMON_PROP_FLAG_DESPAWN_WHEN_EXPIRED = 0x00000800, // 30 spells in 3.0.3, no idea TODO: Needs implementation
SUMMON_PROP_FLAG_USE_SUMMONER_FACTION = 0x00001000, // Lightwell, Jeeves, Gnomish Alarm-o-bot, Build vehicles(wintergrasp) TODO: Needs implementation
SUMMON_PROP_FLAG_DO_NOT_FOLLOW_MOUNTED_SUMMONER = 0x00002000, // Guides, player follows TODO: Needs implementation
SUMMON_PROP_FLAG_SAVE_PET_AUTOCAST = 0x00004000, // Force of Nature, Shadowfiend, Feral Spirit, Summon Water Elemental TODO: Needs implementation
SUMMON_PROP_FLAG_IGNORE_SUMMONER_PHASE = 0x00008000, // Light/Dark Bullet, Soul/Fiery Consumption, Twisted Visage, Twilight Whelp. Phase related? TODO: Needs implementation
SUMMON_PROP_FLAG_ATTACK_SUMMONER = 0x00000001, // NYI 75 spells in 3.0.3, something unfriendly
SUMMON_PROP_FLAG_ASSIST_COMBAT_SUMMON = 0x00000002, // NYI 616 spells in 3.0.3, something friendly
SUMMON_PROP_FLAG_USE_LEVEL_OFFSET = 0x00000004, // NYI 22 spells in 3.0.3, no idea...
SUMMON_PROP_FLAG_DESPAWN_ON_SUMMONER_DEATH = 0x00000008, // NYI 49 spells in 3.0.3, some mounts
SUMMON_PROP_FLAG_ONLY_VISIBLE_TO_SUMMONER = 0x00000010, // 25 spells in 3.0.3, quest related?
SUMMON_PROP_FLAG_CANNOT_DISMISS_PET = 0x00000020, // NYI 0 spells in 3.3.5, unused
SUMMON_PROP_FLAG_USE_DEMON_TIMEOUT = 0x00000040, // NYI 12 spells in 3.0.3, no idea
SUMMON_PROP_FLAG_UNLIMITED_SUMMONS = 0x00000080, // NYI 4 spells in 3.0.3, no idea
SUMMON_PROP_FLAG_USE_CREATURE_LEVEL = 0x00000100, // NYI 51 spells in 3.0.3, no idea, many quest related
SUMMON_PROP_FLAG_JOIN_SUMMONER_SPAWN_GROUP = 0x00000200, // NYI 51 spells in 3.0.3, something defensive
SUMMON_PROP_FLAG_DO_NOT_TOGGLE = 0x00000400, // NYI 3 spells, requires something near?
SUMMON_PROP_FLAG_DESPAWN_WHEN_EXPIRED = 0x00000800, // NYI 30 spells in 3.0.3, no idea
SUMMON_PROP_FLAG_USE_SUMMONER_FACTION = 0x00001000, // NYI Lightwell, Jeeves, Gnomish Alarm-o-bot, Build vehicles(wintergrasp)
SUMMON_PROP_FLAG_DO_NOT_FOLLOW_MOUNTED_SUMMONER = 0x00002000, // NYI Guides, player follows
SUMMON_PROP_FLAG_SAVE_PET_AUTOCAST = 0x00004000, // NYI Force of Nature, Shadowfiend, Feral Spirit, Summon Water Elemental
SUMMON_PROP_FLAG_IGNORE_SUMMONER_PHASE = 0x00008000, // NYI Light/Dark Bullet, Soul/Fiery Consumption, Twisted Visage, Twilight Whelp. Phase related?
};
enum VehicleSeatFlags