Merge branch 'master' into Fix-the-crash-2

This commit is contained in:
天鹭 2025-10-12 07:51:49 +08:00 committed by GitHub
commit 4ccc606878
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
21 changed files with 331 additions and 547 deletions

View File

@ -0,0 +1,113 @@
-- DB update 2025_10_11_00 -> 2025_10_11_01
-- Add Waypoint
DELETE FROM `waypoints` WHERE (`entry` IN (2300200));
INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `orientation`, `point_comment`) VALUES
(2300200, 1, 3691.97, -3962.41, 35.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 2, 3675.02, -3960.49, 35.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 3, 3653.19, -3958.33, 33.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 4, 3621.12, -3958.51, 29.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 5, 3604.86, -3963, 29.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 6, 3569.94, -3970.25, 29.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 7, 3541.03, -3975.64, 29.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 8, 3510.84, -3978.71, 29.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 9, 3472.7, -3997.07, 29.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 10, 3439.15, -4014.55, 29.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 11, 3412.8, -4025.87, 29.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 12, 3384.95, -4038.04, 29.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 13, 3346.77, -4052.93, 29.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 14, 3299.56, -4071.59, 29.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 15, 3261.22, -4080.38, 30.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 16, 3220.68, -4083.09, 31.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 17, 3187.11, -4070.45, 33.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 18, 3162.78, -4062.75, 33.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 19, 3136.09, -4050.32, 33.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 20, 3119.47, -4044.51, 36.0363, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 21, 3098.95, -4019.8, 33.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 22, 3073.07, -4011.42, 33.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 23, 3051.71, -3993.37, 33.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 24, 3027.52, -3978.6, 33.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 25, 3003.78, -3960.14, 33.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 26, 2977.99, -3941.98, 31.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 27, 2964.57, -3932.07, 30.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 28, 2947.9, -3921.31, 29.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 29, 2924.91, -3910.8, 29.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 30, 2903.04, -3896.42, 29.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 31, 2884.75, -3874.03, 29.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 32, 2868.19, -3851.48, 29.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 33, 2854.62, -3819.72, 29.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 34, 2825.53, -3790.4, 29.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 35, 2804.31, -3773.05, 29.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 36, 2769.78, -3763.57, 29.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 37, 2727.23, -3745.92, 30.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 38, 2680.12, -3737.49, 30.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 39, 2647.62, -3739.94, 30.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 40, 2616.6, -3745.75, 30.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 41, 2589.38, -3731.97, 30.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 42, 2562.94, -3722.35, 31.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 43, 2521.05, -3716.6, 31.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 44, 2485.26, -3706.67, 31.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 45, 2458.93, -3696.67, 31.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 46, 2432, -3692.03, 31.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 47, 2399.59, -3681.97, 31.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 48, 2357.75, -3666.6, 31.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 49, 2311.99, -3656.88, 31.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 50, 2263.41, -3649.55, 31.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 51, 2209.05, -3641.76, 31.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 52, 2164.83, -3637.64, 31.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 53, 2122.42, -3639, 31.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 54, 2075.73, -3643.59, 31.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 55, 2033.59, -3649.52, 31.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 56, 1985.22, -3662.99, 31.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 57, 1927.09, -3679.56, 33.9118, NULL, 'Rizzle Sprysprocket escape'),
(2300200, 58, 1873.57, -3695.32, 33.9118, NULL, 'Rizzle Sprysprocket escape');
-- Set General SmartAI, Add Gossip ID, ScriptName, NpcFlag.
UPDATE `creature_template` SET `npcflag` = `npcflag` |1, `gossip_menu_id` = 21893, `ScriptName` = '', `AIName` = 'SmartAI' WHERE `entry` = 23002;
-- Add SmartAI
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 23002);
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`, `event_param6`, `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
(23002, 0, 0, 1, 54, 0, 100, 0, 0, 0, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Rizzle Sprysprocket - On Just Summoned - Remove Npc Flags Gossip'),
(23002, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 64, 12, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Rizzle Sprysprocket - On Just Summoned - Store Targetlist'),
(23002, 0, 2, 3, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 39865, 2, 0, 1, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Rizzle Sprysprocket - On Just Summoned - Cast \'Rizzle`s Blackjack\''),
(23002, 0, 3, 4, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Rizzle Sprysprocket - On Just Summoned - Say Line 0'),
(23002, 0, 4, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 80, 2300200, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Rizzle Sprysprocket - On Just Summoned - Run Script'),
(23002, 0, 5, 6, 60, 1, 100, 0, 15000, 20000, 25000, 30000, 0, 0, 11, 40525, 2, 0, 0, 0, 0, 12, 12, 0, 0, 0, 0, 0, 0, 0, 'Rizzle Sprysprocket - On Update - Cast \'Rizzle`s Frost Grenade\' (Phase 1)'),
(23002, 0, 6, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 12, 12, 0, 0, 0, 0, 0, 0, 0, 'Rizzle Sprysprocket - On Update - Say Line 1 (Phase 1)'),
(23002, 0, 7, 8, 101, 1, 100, 0, 1, 10, 1000, 1000, 1000, 0, 55, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Rizzle Sprysprocket - On 1 or More Players in Range - Stop Waypoint (Phase 1)'),
(23002, 0, 8, 9, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 28, 39912, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Rizzle Sprysprocket - On 1 or More Players in Range - Remove Aura \'Periodic Depth Charge Release\' (Phase 1)'),
(23002, 0, 9, 10, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Rizzle Sprysprocket - On 1 or More Players in Range - Say Line 2 (Phase 1)'),
(23002, 0, 10, 11, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Rizzle Sprysprocket - On 1 or More Players in Range - Add Npc Flags Gossip (Phase 1)'),
(23002, 0, 11, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Rizzle Sprysprocket - On 1 or More Players in Range - Set Event Phase 0 (Phase 1)'),
(23002, 0, 12, 13, 62, 0, 100, 0, 21893, 0, 0, 0, 0, 0, 11, 39886, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Rizzle Sprysprocket - On Gossip Option 0 Selected - Cast \'Give Southfury Moonstone\''),
(23002, 0, 13, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 41, 3000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Rizzle Sprysprocket - On Gossip Option 0 Selected - Despawn In 3000 ms'),
(23002, 0, 14, 0, 58, 0, 100, 0, 58, 2300200, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Rizzle Sprysprocket - On Path 2300200 Finished - Despawn Instant');
-- Set Action List
DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` = 2300200);
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`, `event_param6`, `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
(2300200, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 23025, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Rizzle Sprysprocket - Actionlist - Cast \'Blink Cooldown Reduction\''),
(2300200, 9, 1, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Rizzle Sprysprocket - Actionlist - Say Line 3'),
(2300200, 9, 2, 0, 0, 0, 100, 0, 500, 500, 0, 0, 0, 0, 11, 39871, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Rizzle Sprysprocket - Actionlist - Cast \'Rizzle`s Escape\''),
(2300200, 9, 3, 0, 0, 0, 100, 0, 1000, 1000, 0, 0, 0, 0, 11, 39912, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Rizzle Sprysprocket - Actionlist - Cast \'Periodic Depth Charge Release\''),
(2300200, 9, 4, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Rizzle Sprysprocket - Actionlist - Set Event Phase 1'),
(2300200, 9, 5, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 53, 1, 2300200, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Rizzle Sprysprocket - Actionlist - Start Waypoint Path 2300200');
-- Set Conditions
DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` IN (15, 22)) AND (`SourceGroup` IN (8, 21893)) AND (`SourceEntry` IN (0, 23002)) AND (`SourceId` = 0) AND (`ElseGroup` = 0) AND (`ConditionTypeOrReference` = 47) AND (`ConditionTarget` = 0) AND (`ConditionValue1` = 10994) AND (`ConditionValue2` = 8) AND (`ConditionValue3` = 0);
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(15, 21893, 0, 0, 0, 47, 0, 10994, 8, 0, 0, 0, 0, '', 'Gossip displayed only if player has Chasing the Moonstone incomplete'),
(22, 8, 23002, 0, 0, 47, 0, 10994, 8, 0, 0, 0, 0, '', 'Event occurs only if player has Chasing the Moonstone incomplete.');
-- Set SmartAI (Rizzle's Depth Charge)
UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE `entry` = 23025;
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 23025);
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`, `event_param6`, `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
(23025, 0, 0, 1, 54, 0, 100, 0, 0, 0, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Rizzle\'s Depth Charge - On Just Summoned - Set hover 1'),
(23025, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Rizzle\'s Depth Charge - On Just Summoned - Set Swim On'),
(23025, 0, 2, 3, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 18, 33554432, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Rizzle\'s Depth Charge - On Just Summoned - Set Flags Not Selectable'),
(23025, 0, 3, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Rizzle\'s Depth Charge - On Just Summoned - Set Reactstate Passive'),
(23025, 0, 4, 5, 101, 0, 100, 0, 1, 5, 1000, 1000, 1000, 0, 11, 38576, 2, 0, 0, 0, 0, 21, 5, 0, 0, 0, 0, 0, 0, 0, 'Rizzle\'s Depth Charge - On 1 or More Players in Range - Cast \'Knockback\''),
(23025, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 41, 1000, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Rizzle\'s Depth Charge - On 1 or More Players in Range - Despawn In 1000 ms');

View File

@ -0,0 +1,7 @@
-- DB update 2025_10_11_01 -> 2025_10_11_02
--
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 29920);
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`, `event_param6`, `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
(29920, 0, 0, 0, 0, 0, 100, 0, 10000, 15000, 10000, 15000, 0, 0, 11, 55652, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Ruins Dweller - In Combat - Cast \'Spring\''),
(29920, 0, 1, 0, 0, 0, 100, 0, 2000, 7000, 8000, 14000, 0, 0, 11, 55643, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Ruins Dweller - In Combat - Cast \'Regurgitate\''),
(29920, 0, 2, 0, 31, 0, 100, 0, 55652, 0, 0, 0, 0, 0, 14, 0, 100, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Ruins Dweller - On Target Spellhit \'Spring\' - Set All Threat 0-100');

View File

@ -0,0 +1,13 @@
-- DB update 2025_10_11_02 -> 2025_10_11_03
--
DELETE FROM `smart_scripts` WHERE (`entryorguid` = 780602) AND (`source_type` = 9) AND (`id` IN (5));
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`, `event_param6`, `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
(780602, 9, 5, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 26, 836, 0, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 0, 'Homing Robot OOX-09/HL - Actionlist - Quest Credit \'Rescue OOX-09/HL!\'');
DELETE FROM `smart_scripts` WHERE (`entryorguid` = 780702) AND (`source_type` = 9) AND (`id` IN (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`, `event_param6`, `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
(780702, 9, 6, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 26, 2767, 0, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 0, 'Homing Robot OOX-22/FE - Actionlist - Quest Credit \'Rescue OOX-22/FE!\'');
DELETE FROM `smart_scripts` WHERE (`entryorguid` = 778402) AND (`source_type` = 9) AND (`id` IN (5));
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`, `event_param6`, `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
(778402, 9, 5, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 26, 648, 0, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 0, 'Homing Robot OOX-17/TN - Actionlist - Quest Credit \'Rescue OOX-17/TN!\'');

View File

@ -0,0 +1,27 @@
-- DB update 2025_10_11_03 -> 2025_10_11_04
--
DELETE FROM `creature` WHERE (`guid` = 248652) AND (`id1` = 14693);
DELETE FROM `game_event_creature` WHERE (`guid` = 248652) AND (`eventEntry` = 120);
DELETE FROM `smart_scripts` WHERE (`entryorguid` = 4543) AND (`source_type` = 0) AND (`id` IN (7));
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`, `event_param6`, `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
(4543, 0, 7, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 0, 12, 14693, 8, 0, 0, 0, 0, 8, 0, 0, 0, 0, 1797.84, 1233.68, 18.3153, 1.58286, 'Bloodmage Thalnos - On Just Died - Summon Creature \'Scorn\'');
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 14693;
DELETE FROM `smart_scripts` WHERE (`entryorguid` = 14693) AND (`source_type` = 0) AND (`id` IN (4));
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`, `event_param6`, `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
(14693, 0, 4, 0, 54, 0, 100, 0, 0, 0, 0, 0, 0, 0, 53, 0, 1469300, 1, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scorn - On Just Summoned - Start Patrol Path 1469300');
DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 22) AND (`SourceGroup` = 8) AND (`SourceEntry` = 4543) AND (`SourceId` = 0) AND (`ElseGroup` = 0);
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(22, 8, 4543, 0, 0, 12, 0, 120, 0, 0, 0, 0, 0, '', 'Scourge Invasion - Boss in instance activation event must be active');
SET @ENTRY := 14693;
DELETE FROM `waypoints` WHERE `entry` = @ENTRY * 100;
INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `point_comment`) VALUES
(@ENTRY*100, 1, 1798.01, 1312.39, 18.69, NULL, 0, 'Scorn'),
(@ENTRY*100, 2, 1805.39, 1323.66, 18.91, NULL, 0, 'Scorn'),
(@ENTRY*100, 3, 1797.70, 1383.27, 18.76, NULL, 0, 'Scorn'),
(@ENTRY*100, 4, 1805.39, 1323.66, 18.91, NULL, 0, 'Scorn'),
(@ENTRY*100, 5, 1798.01, 1312.39, 18.69, NULL, 0, 'Scorn'),
(@ENTRY*100, 6, 1798.01, 1223.17, 18.274, NULL, 0, 'Scorn - spawn point');

View File

@ -0,0 +1,3 @@
-- DB update 2025_10_11_04 -> 2025_10_11_05
-- Moorabi hard reset
UPDATE `creature_template` SET `flags_extra` = `flags_extra` | 2147483648 WHERE `entry` IN (29305, 30530);

View File

@ -0,0 +1,6 @@
-- DB update 2025_10_11_05 -> 2025_10_11_06
-- Correctly uses Option0 instead of Option1 to summon the Terokk
UPDATE `smart_scripts` SET `event_param2` = 0 WHERE `entryorguid` = 185928 AND `source_type` = 1 AND `id` = 0;
-- Removes the duplicated option.
DELETE FROM `gossip_menu_option` WHERE `MenuID` = 8687 AND `OptionID` = 1;

View File

@ -2500,6 +2500,7 @@ void Player::GiveLevel(uint8 level)
m_Played_time[PLAYED_TIME_LEVEL] = 0; // Level Played Time reset
_ApplyAllLevelScaleItemMods(false);
_RemoveAllAuraStatMods();
SetLevel(level);
@ -2522,6 +2523,7 @@ void Player::GiveLevel(uint8 level)
UpdateSkillsToMaxSkillsForLevel();
_ApplyAllLevelScaleItemMods(true);
_ApplyAllAuraStatMods();
if (!isDead())
{
@ -4429,12 +4431,6 @@ void Player::SetMovement(PlayerMovementType pType)
const PackedGuid& guid = GetPackGUID();
switch (pType)
{
case MOVE_ROOT:
data.Initialize(SMSG_FORCE_MOVE_ROOT, guid.size() + 4);
break;
case MOVE_UNROOT:
data.Initialize(SMSG_FORCE_MOVE_UNROOT, guid.size() + 4);
break;
case MOVE_WATER_WALK:
data.Initialize(SMSG_MOVE_WATER_WALK, guid.size() + 4);
break;
@ -4488,10 +4484,10 @@ void Player::BuildPlayerRepop()
SetHealth(1); // convert player body to ghost
SetMovement(MOVE_WATER_WALK);
SetWaterWalking(true);
if (!GetSession()->isLogingOut())
{
SetMovement(MOVE_UNROOT);
}
if (!IsImmobilizedState())
SendMoveRoot(false);
RemoveUnitFlag(UNIT_FLAG_SKINNABLE); // BG - remove insignia related
int32 corpseReclaimDelay = CalculateCorpseReclaimDelay();
if (corpseReclaimDelay >= 0)
@ -4528,7 +4524,7 @@ void Player::ResurrectPlayer(float restore_percent, bool applySickness)
setDeathState(DeathState::Alive);
SetMovement(MOVE_LAND_WALK);
SetMovement(MOVE_UNROOT);
SendMoveRoot(false);
SetWaterWalking(false);
m_deathTimer = 0;
@ -4592,7 +4588,7 @@ void Player::KillPlayer()
if (IsFlying() && !GetTransport())
GetMotionMaster()->MoveFall();
SetMovement(MOVE_ROOT);
SendMoveRoot(true);
StopMirrorTimers(); //disable timers(bars)
@ -11701,9 +11697,6 @@ void Player::SendInitialPacketsAfterAddToMap()
GetZoneAndAreaId(newzone, newarea);
UpdateZone(newzone, newarea); // also call SendInitWorldStates();
if (HasStunAura())
SetMovement(MOVE_ROOT);
WorldPacket setCompoundState(SMSG_MULTIPLE_MOVES, 100);
setCompoundState << uint32(0); // size placeholder

View File

@ -448,8 +448,6 @@ typedef std::list<Item*> ItemDurationList;
enum PlayerMovementType
{
MOVE_ROOT = 1,
MOVE_UNROOT = 2,
MOVE_WATER_WALK = 3,
MOVE_LAND_WALK = 4
};

View File

@ -18293,73 +18293,65 @@ void Unit::SetStunned(bool apply)
}
}
void Unit::SetRooted(bool apply, bool isStun)
void Unit::SetRooted(bool apply, bool stun, bool logout)
{
const uint32 state = (stun ? (logout ? UNIT_STATE_LOGOUT_TIMER : UNIT_STATE_STUNNED) : UNIT_STATE_ROOT);
if (apply)
{
// MOVEMENTFLAG_ROOT cannot be used in conjunction with MOVEMENTFLAG_MASK_MOVING (tested 3.3.5a)
// this will freeze clients. That's why we remove MOVEMENTFLAG_MASK_MOVING before
// setting MOVEMENTFLAG_ROOT
RemoveUnitMovementFlag(MOVEMENTFLAG_MASK_MOVING);
AddUnitState(state);
if (IsFalling())
{
AddUnitMovementFlag(MOVEMENTFLAG_PENDING_ROOT);
}
else
{
AddUnitMovementFlag(MOVEMENTFLAG_ROOT);
}
// Creature specific
if (!IsPlayer())
{
if (isStun && movespline->Finalized())
{
StopMovingOnCurrentPos();
}
else
{
StopMoving();
}
}
if (m_movedByPlayer)
{
WorldPacket data(SMSG_FORCE_MOVE_ROOT, GetPackGUID().size() + 4);
data << GetPackGUID();
data << m_movedByPlayer->ToPlayer()->GetSession()->GetOrderCounter(); // movement counter
m_movedByPlayer->ToPlayer()->SendDirectMessage(&data);
m_movedByPlayer->ToPlayer()->GetSession()->IncrementOrderCounter();
}
else
{
WorldPacket data(SMSG_SPLINE_MOVE_ROOT, GetPackGUID().size());
data << GetPackGUID();
SendMessageToSet(&data, true);
}
SendMoveRoot(true);
}
else
{
RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT | MOVEMENTFLAG_PENDING_ROOT);
ClearUnitState(state);
if (!HasUnitState(UNIT_STATE_STUNNED)) // prevent moving if it also has stun effect
// Prevent giving ability to move if more immobilizers are active
if (!IsImmobilizedState())
SendMoveRoot(false);
}
}
void Unit::SendMoveRoot(bool apply)
{
const Player* client = GetClientControlling();
// Apply flags in-place when unit currently is not controlled by a player
if (!client)
{
if (apply)
{
if (m_movedByPlayer)
{
WorldPacket data(SMSG_FORCE_MOVE_UNROOT, GetPackGUID().size() + 4);
data << GetPackGUID();
data << m_movedByPlayer->ToPlayer()->GetSession()->GetOrderCounter(); // movement counter
m_movedByPlayer->ToPlayer()->SendDirectMessage(&data);
m_movedByPlayer->ToPlayer()->GetSession()->IncrementOrderCounter();
}
else
{
WorldPacket data(SMSG_SPLINE_MOVE_UNROOT, GetPackGUID().size());
data << GetPackGUID();
SendMessageToSet(&data, true);
}
m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_MASK_MOVING_FLY);
m_movementInfo.AddMovementFlag(MOVEMENTFLAG_ROOT);
if (!client)
StopMoving();
}
else
m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_ROOT);
}
if (!IsInWorld())
return;
const PackedGuid& guid = GetPackGUID();
// Wrath+ spline root: when unit is currently not controlled by a player
if (!client)
{
WorldPacket data(apply ? SMSG_SPLINE_MOVE_ROOT : SMSG_SPLINE_MOVE_UNROOT, guid.size());
data << guid;
SendMessageToSet(&data, true);
}
// Wrath+ force root: when unit is controlled by a player
else
{
auto const counter = client->GetSession()->GetOrderCounter();
WorldPacket data(apply ? SMSG_FORCE_MOVE_ROOT : SMSG_FORCE_MOVE_UNROOT, guid.size() + 4);
data << guid;
data << counter;
client->GetSession()->SendPacket(&data);
client->GetSession()->IncrementOrderCounter();
}
}

View File

@ -2066,7 +2066,8 @@ protected:
void SetFeared(bool apply, Unit* fearedBy = nullptr, bool isFear = false);
void SetConfused(bool apply);
void SetStunned(bool apply);
void SetRooted(bool apply, bool isStun = false);
void SetRooted(bool apply, bool stun = false, bool logout = false);
void SendMoveRoot(bool state);
//----------- Protected variables ----------//
UnitAI* i_AI;

View File

@ -197,7 +197,9 @@ enum UnitState
UNIT_STATE_IGNORE_PATHFINDING = 0x10000000, // do not use pathfinding in any MovementGenerator
UNIT_STATE_NO_ENVIRONMENT_UPD = 0x20000000,
UNIT_STATE_NO_COMBAT_MOVEMENT = 0x40000000, // serverside only - should not be changed outside the core and should be placed at the end
// serverside region
UNIT_STATE_NO_COMBAT_MOVEMENT = 0x40000000, // should not be changed outside the core and should be placed at the end
UNIT_STATE_LOGOUT_TIMER = 0x80000000, // Unit is logging out
UNIT_STATE_ALL_STATE_SUPPORTED = UNIT_STATE_DIED | UNIT_STATE_MELEE_ATTACKING | UNIT_STATE_STUNNED | UNIT_STATE_ROAMING | UNIT_STATE_CHASE
| UNIT_STATE_FLEEING | UNIT_STATE_IN_FLIGHT | UNIT_STATE_FOLLOW | UNIT_STATE_ROOT | UNIT_STATE_CONFUSED

View File

@ -1164,8 +1164,11 @@ void WorldSession::HandlePlayerLoginToCharInWorld(Player* pCurrChar)
SendPacket(&data);
// Xinef: fix possible problem with flag UNIT_FLAG_STUNNED added during logout
if (!pCurrChar->HasUnitState(UNIT_STATE_STUNNED))
if (pCurrChar->HasUnitState(UNIT_STATE_LOGOUT_TIMER))
{
pCurrChar->SetRooted(false, true, true);
pCurrChar->RemoveUnitFlag(UNIT_FLAG_STUNNED);
}
pCurrChar->SendInitialPacketsBeforeAddToMap();

View File

@ -468,7 +468,7 @@ void WorldSession::HandleLogoutRequestOpcode(WorldPackets::Character::LogoutRequ
GetPlayer()->SetStandState(UNIT_STAND_STATE_SIT);
}
GetPlayer()->SetRooted(true);
GetPlayer()->SetRooted(true, true, true);
GetPlayer()->SetUnitFlag(UNIT_FLAG_STUNNED);
}
@ -492,7 +492,7 @@ void WorldSession::HandleLogoutCancelOpcode(WorldPackets::Character::LogoutCance
// not remove flags if can't free move - its not set in Logout request code.
if (GetPlayer()->CanFreeMove())
{
GetPlayer()->SetRooted(false);
GetPlayer()->SetRooted(false, true, true);
GetPlayer()->SetStandState(UNIT_STAND_STATE_STAND);
GetPlayer()->RemoveUnitFlag(UNIT_FLAG_STUNNED);

View File

@ -967,79 +967,36 @@ void WorldSession::ComputeNewClockDelta()
void WorldSession::HandleMoveRootAck(WorldPacket& recvData)
{
LOG_DEBUG("network", "WORLD: {}", GetOpcodeNameForLogging((Opcodes)recvData.GetOpcode()));
ObjectGuid guid;
recvData >> guid.ReadAsPacked();
Unit* mover = _player->m_mover;
if (!mover || guid != mover->GetGUID())
{
recvData.rfinish(); // prevent warnings spam
return;
}
uint32 movementCounter;
recvData >> movementCounter;
uint32 counter;
MovementInfo movementInfo;
movementInfo.guid = guid;
recvData >> guid.ReadAsPacked();
recvData >> counter;
ReadMovementInfo(recvData, &movementInfo);
/* process position-change */
int64 movementTime = (int64) movementInfo.time + _timeSyncClockDelta;
if (_timeSyncClockDelta == 0 || movementTime < 0 || movementTime > 0xFFFFFFFF)
{
LOG_INFO("misc", "The computed movement time using clockDelta is erronous. Using fallback instead");
movementInfo.time = getMSTime();
}
else
{
movementInfo.time = (uint32)movementTime;
}
movementInfo.guid = mover->GetGUID();
mover->m_movementInfo = movementInfo;
mover->UpdatePosition(movementInfo.pos);
}
void WorldSession::HandleMoveUnRootAck(WorldPacket& recvData)
{
ObjectGuid guid;
recvData >> guid.ReadAsPacked();
Unit* mover = _player->m_mover;
if (!mover || guid != mover->GetGUID())
{
recvData.rfinish(); // prevent warnings spam
if (mover->GetGUID() != guid)
return;
}
uint32 movementCounter;
recvData >> movementCounter;
MovementInfo movementInfo;
movementInfo.guid = guid;
ReadMovementInfo(recvData, &movementInfo);
/* process position-change */
int64 movementTime = (int64) movementInfo.time + _timeSyncClockDelta;
if (_timeSyncClockDelta == 0 || movementTime < 0 || movementTime > 0xFFFFFFFF)
if (recvData.GetOpcode() == CMSG_FORCE_MOVE_UNROOT_ACK) // unroot case
{
LOG_INFO("misc", "The computed movement time using clockDelta is erronous. Using fallback instead");
movementInfo.time = getMSTime();
if (!mover->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_ROOT))
return;
}
else
else // root case
{
movementInfo.time = (uint32)movementTime;
if (mover->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_ROOT))
return;
}
if (G3D::fuzzyEq(movementInfo.fallTime, 0.f))
{
movementInfo.RemoveMovementFlag(MOVEMENTFLAG_FALLING);
}
movementInfo.guid = mover->GetGUID();
mover->m_movementInfo = movementInfo;
mover->UpdatePosition(movementInfo.pos);
if (!ProcessMovementInfo(movementInfo, mover, _player, recvData))
return;
WorldPacket data(recvData.GetOpcode() == CMSG_FORCE_MOVE_UNROOT_ACK ? MSG_MOVE_UNROOT : MSG_MOVE_ROOT);
data << guid.WriteAsPacked();
WriteMovementInfo(&data, &movementInfo);
mover->SendMessageToSet(&data, _player);
}

View File

@ -363,7 +363,7 @@ void OpcodeTable::Initialize()
/*0x0E8*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_MOVE_ROOT, STATUS_NEVER);
/*0x0E9*/ DEFINE_HANDLER(CMSG_FORCE_MOVE_ROOT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveRootAck );
/*0x0EA*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_MOVE_UNROOT, STATUS_NEVER);
/*0x0EB*/ DEFINE_HANDLER(CMSG_FORCE_MOVE_UNROOT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveUnRootAck );
/*0x0EB*/ DEFINE_HANDLER(CMSG_FORCE_MOVE_UNROOT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveRootAck );
/*0x0EC*/ DEFINE_HANDLER(MSG_MOVE_ROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
/*0x0ED*/ DEFINE_HANDLER(MSG_MOVE_UNROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
/*0x0EE*/ DEFINE_HANDLER(MSG_MOVE_HEARTBEAT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );

View File

@ -628,7 +628,6 @@ public: // opcodes handlers
void HandlePlayedTime(WorldPackets::Character::PlayedTimeClient& packet);
// new
void HandleMoveUnRootAck(WorldPacket& recvPacket);
void HandleMoveRootAck(WorldPacket& recvPacket);
// new inspect

View File

@ -74,7 +74,6 @@ void AddSC_instance_wailing_caverns(); //Wailing caverns
void AddSC_zulfarrak();
void AddSC_instance_zulfarrak(); //Zul'Farrak instance script
void AddSC_ashenvale();
void AddSC_azshara();
void AddSC_azuremyst_isle();
void AddSC_bloodmyst_isle();
void AddSC_boss_azuregos();
@ -157,7 +156,6 @@ void AddKalimdorScripts()
AddSC_zulfarrak();
AddSC_instance_zulfarrak(); //Zul'Farrak instance script
AddSC_ashenvale();
AddSC_azshara();
AddSC_azuremyst_isle();
AddSC_bloodmyst_isle();
AddSC_boss_azuregos();

View File

@ -1,361 +0,0 @@
/*
* 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 "CreatureScript.h"
#include "Player.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
/*####
# npc_rizzle_sprysprocket
####*/
enum RizzleSprysprocketData
{
QUEST_CHASING_THE_MOONSTONE = 10994,
NPC_DEPTH_CHARGE = 23025,
SPELL_RIZZLE_BLACKJACK = 39865,
SPELL_RIZZLE_ESCAPE = 39871,
SPELL_RIZZLE_FROST_GRENADE = 40525,
SPELL_DEPTH_CHARGE_TRAP = 38576,
SPELL_PERIODIC_DEPTH_CHARGE = 39912,
SPELL_GIVE_SOUTHFURY_MOONSTONE = 39886,
SAY_RIZZLE_START = 0,
SAY_RIZZLE_GRENADE = 1,
SAY_RIZZLE_FINAL = 2,
MSG_ESCAPE_NOTICE = 3,
GOSSIP_GET_MOONSTONE = 21893
};
Position const WPs[58] =
{
{3691.97f, -3962.41f, 35.9118f, 3.67f},
{3675.02f, -3960.49f, 35.9118f, 3.67f},
{3653.19f, -3958.33f, 33.9118f, 3.59f},
{3621.12f, -3958.51f, 29.9118f, 3.48f},
{3604.86f, -3963, 29.9118f, 3.48f},
{3569.94f, -3970.25f, 29.9118f, 3.44f},
{3541.03f, -3975.64f, 29.9118f, 3.41f},
{3510.84f, -3978.71f, 29.9118f, 3.41f},
{3472.7f, -3997.07f, 29.9118f, 3.35f},
{3439.15f, -4014.55f, 29.9118f, 3.29f},
{3412.8f, -4025.87f, 29.9118f, 3.25f},
{3384.95f, -4038.04f, 29.9118f, 3.24f},
{3346.77f, -4052.93f, 29.9118f, 3.22f},
{3299.56f, -4071.59f, 29.9118f, 3.20f},
{3261.22f, -4080.38f, 30.9118f, 3.19f},
{3220.68f, -4083.09f, 31.9118f, 3.18f},
{3187.11f, -4070.45f, 33.9118f, 3.16f},
{3162.78f, -4062.75f, 33.9118f, 3.15f},
{3136.09f, -4050.32f, 33.9118f, 3.07f},
{3119.47f, -4044.51f, 36.0363f, 3.07f},
{3098.95f, -4019.8f, 33.9118f, 3.07f},
{3073.07f, -4011.42f, 33.9118f, 3.07f},
{3051.71f, -3993.37f, 33.9118f, 3.02f},
{3027.52f, -3978.6f, 33.9118f, 3.00f},
{3003.78f, -3960.14f, 33.9118f, 2.98f},
{2977.99f, -3941.98f, 31.9118f, 2.96f},
{2964.57f, -3932.07f, 30.9118f, 2.96f},
{2947.9f, -3921.31f, 29.9118f, 2.96f},
{2924.91f, -3910.8f, 29.9118f, 2.94f},
{2903.04f, -3896.42f, 29.9118f, 2.93f},
{2884.75f, -3874.03f, 29.9118f, 2.90f},
{2868.19f, -3851.48f, 29.9118f, 2.82f},
{2854.62f, -3819.72f, 29.9118f, 2.80f},
{2825.53f, -3790.4f, 29.9118f, 2.744f},
{2804.31f, -3773.05f, 29.9118f, 2.71f},
{2769.78f, -3763.57f, 29.9118f, 2.70f},
{2727.23f, -3745.92f, 30.9118f, 2.69f},
{2680.12f, -3737.49f, 30.9118f, 2.67f},
{2647.62f, -3739.94f, 30.9118f, 2.66f},
{2616.6f, -3745.75f, 30.9118f, 2.64f},
{2589.38f, -3731.97f, 30.9118f, 2.61f},
{2562.94f, -3722.35f, 31.9118f, 2.56f},
{2521.05f, -3716.6f, 31.9118f, 2.55f},
{2485.26f, -3706.67f, 31.9118f, 2.51f},
{2458.93f, -3696.67f, 31.9118f, 2.51f},
{2432, -3692.03f, 31.9118f, 2.46f},
{2399.59f, -3681.97f, 31.9118f, 2.45f},
{2357.75f, -3666.6f, 31.9118f, 2.44f},
{2311.99f, -3656.88f, 31.9118f, 2.94f},
{2263.41f, -3649.55f, 31.9118f, 3.02f},
{2209.05f, -3641.76f, 31.9118f, 2.99f},
{2164.83f, -3637.64f, 31.9118f, 3.15f},
{2122.42f, -3639, 31.9118f, 3.21f},
{2075.73f, -3643.59f, 31.9118f, 3.22f},
{2033.59f, -3649.52f, 31.9118f, 3.42f},
{1985.22f, -3662.99f, 31.9118f, 3.42f},
{1927.09f, -3679.56f, 33.9118f, 3.42f},
{1873.57f, -3695.32f, 33.9118f, 3.44f}
};
class npc_rizzle_sprysprocket : public CreatureScript
{
public:
npc_rizzle_sprysprocket() : CreatureScript("npc_rizzle_sprysprocket") { }
struct npc_rizzle_sprysprocketAI : public ScriptedAI
{
npc_rizzle_sprysprocketAI(Creature* creature) : ScriptedAI(creature) { }
void Reset() override
{
SpellEscapeTimer = 1300;
TeleportTimer = 3500;
CheckTimer = 10000;
GrenadeTimer = 30000;
MustDieTimer = 3000;
CurrWP = 0;
PlayerGUID.Clear();
MustDie = false;
Escape = false;
ContinueWP = false;
Reached = false;
}
void JustEngagedWith(Unit* /*who*/) override { }
void AttackStart(Unit* who) override
{
if (!who || PlayerGUID)
return;
Player* player = who->ToPlayer();
if (player && player->GetQuestStatus(QUEST_CHASING_THE_MOONSTONE) == QUEST_STATUS_INCOMPLETE)
{
PlayerGUID = who->GetGUID();
Talk(SAY_RIZZLE_START);
DoCast(who, SPELL_RIZZLE_BLACKJACK, false);
return;
}
}
void sGossipSelect(Player* player, uint32 /*sender*/, uint32 /*action*/) override
{
CloseGossipMenuFor(player);
me->CastSpell(player, SPELL_GIVE_SOUTHFURY_MOONSTONE, true);
MustDieTimer = 3000;
MustDie = true;
}
void MovementInform(uint32 type, uint32 id) override
{
if (type != POINT_MOTION_TYPE)
return;
if (id == 57)
{
me->DespawnOrUnsummon();
return;
}
++CurrWP;
ContinueWP = true;
}
void UpdateAI(uint32 diff) override
{
if (MustDie)
{
if (MustDieTimer <= diff)
{
me->DespawnOrUnsummon();
return;
}
else MustDieTimer -= diff;
}
if (!Escape)
{
if (!PlayerGUID)
return;
if (SpellEscapeTimer <= diff)
{
DoCast(me, SPELL_RIZZLE_ESCAPE, false);
SpellEscapeTimer = 10000;
}
else SpellEscapeTimer -= diff;
if (TeleportTimer <= diff)
{
// temp solution - unit can't be teleported by core using spelleffect 5, only players
me->NearTeleportTo(3706.39f, -3969.15f, 35.9118f, me->GetOrientation());
//begin swimming and summon depth charges
Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID);
if (!player)
return;
Talk(MSG_ESCAPE_NOTICE, player);
DoCast(me, SPELL_PERIODIC_DEPTH_CHARGE);
me->SetHover(true);
me->SetSwim(true);
me->SetSpeed(MOVE_RUN, 0.85f, true);
me->GetMotionMaster()->MovementExpired();
me->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP]);
Escape = true;
}
else TeleportTimer -= diff;
return;
}
if (ContinueWP)
{
me->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP]);
ContinueWP = false;
}
if (GrenadeTimer <= diff)
{
if (Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID))
{
Talk(SAY_RIZZLE_GRENADE, player);
DoCast(player, SPELL_RIZZLE_FROST_GRENADE, true);
}
GrenadeTimer = 30000;
}
else GrenadeTimer -= diff;
if (CheckTimer <= diff)
{
Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID);
if (!player)
{
me->DespawnOrUnsummon();
return;
}
if (me->IsWithinDist(player, 10) && me->GetPositionX() > player->GetPositionX() && !Reached)
{
Talk(SAY_RIZZLE_FINAL);
me->ReplaceAllNpcFlags(NPCFlags(1));
me->SetFaction(FACTION_FRIENDLY);
me->GetMotionMaster()->MoveIdle();
me->RemoveAurasDueToSpell(SPELL_PERIODIC_DEPTH_CHARGE);
Reached = true;
}
CheckTimer = 1000;
}
else CheckTimer -= diff;
}
private:
ObjectGuid PlayerGUID;
uint32 SpellEscapeTimer;
uint32 TeleportTimer;
uint32 CheckTimer;
uint32 GrenadeTimer;
uint32 MustDieTimer;
uint32 CurrWP;
bool MustDie;
bool Escape;
bool ContinueWP;
bool Reached;
};
bool OnGossipHello(Player* player, Creature* creature) override
{
if (player->GetQuestStatus(QUEST_CHASING_THE_MOONSTONE) != QUEST_STATUS_INCOMPLETE)
return true;
AddGossipItemFor(player, GOSSIP_GET_MOONSTONE, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
SendGossipMenuFor(player, 10811, creature->GetGUID());
return true;
}
CreatureAI* GetAI(Creature* creature) const override
{
return new npc_rizzle_sprysprocketAI(creature);
}
};
/*####
# npc_depth_charge
####*/
class npc_depth_charge : public CreatureScript
{
public:
npc_depth_charge() : CreatureScript("npc_depth_charge") { }
struct npc_depth_chargeAI : public ScriptedAI
{
npc_depth_chargeAI(Creature* creature) : ScriptedAI(creature) { }
bool WeMustDie;
uint32 WeMustDieTimer;
void Reset() override
{
me->SetHover(true);
me->SetSwim(true);
me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
WeMustDie = false;
WeMustDieTimer = 1000;
}
void JustEngagedWith(Unit* /*who*/) override { }
void AttackStart(Unit* /*who*/) override { }
void MoveInLineOfSight(Unit* who) override
{
if (!who)
return;
if (who->IsPlayer() && me->IsWithinDistInMap(who, 5))
{
DoCast(who, SPELL_DEPTH_CHARGE_TRAP);
WeMustDie = true;
return;
}
}
void UpdateAI(uint32 diff) override
{
if (WeMustDie)
{
if (WeMustDieTimer <= diff)
me->DespawnOrUnsummon();
else
WeMustDieTimer -= diff;
}
return;
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return new npc_depth_chargeAI(creature);
}
};
void AddSC_azshara()
{
new npc_rizzle_sprysprocket();
new npc_depth_charge();
}

View File

@ -125,17 +125,18 @@ public:
void Reset() override
{
BossAI::Reset();
for (uint8 i = 0; i < 5; i++)
me->SummonCreature(NPC_LIVING_MOJO, mojoPosition[i].GetPositionX(), mojoPosition[i].GetPositionY(), mojoPosition[i].GetPositionZ(), 0, TEMPSUMMON_MANUAL_DESPAWN, 0);
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
}
void InitializeAI() override
{
BossAI::InitializeAI();
me->CastSpell(me, SPELL_FREEZE_ANIM, true);
if (!me->IsInEvadeMode())
{
me->CastSpell(me, SPELL_FREEZE_ANIM, true);
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
for (const auto & i : mojoPosition)
me->SummonCreature(NPC_LIVING_MOJO, i.GetPositionX(), i.GetPositionY(), i.GetPositionZ(), 0, TEMPSUMMON_MANUAL_DESPAWN, 0);
}
else
{
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
}
}
void JustReachedHome() override
@ -144,9 +145,9 @@ public:
me->CastSpell(me, SPELL_FREEZE_ANIM, true);
}
void JustEngagedWith(Unit* who) override
void ScheduleTasks() override
{
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_COLOSSUS_START_FIGHT, 1s);
events.ScheduleEvent(EVENT_COLOSSUS_MIGHTY_BLOW, 10s);
events.ScheduleEvent(EVENT_COLOSSUS_MORTAL_STRIKE, 7s);
events.ScheduleEvent(EVENT_COLOSSUS_HEALTH_1, 1s);
@ -183,6 +184,7 @@ public:
summons.Despawn(summon);
if (summon->GetEntry() == NPC_DRAKKARI_ELEMENTAL)
{
me->SetHealth(me->GetMaxHealth() / 2);
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
me->RemoveAurasDueToSpell(SPELL_FREEZE_ANIM);
if (me->GetVictim())
@ -231,7 +233,7 @@ public:
events.ScheduleEvent(EVENT_COLOSSUS_HEALTH_1, 1s);
break;
case EVENT_COLOSSUS_HEALTH_2:
if (me->HealthBelowPct(21))
if (me->HealthBelowPct(2))
{
me->CastSpell(me, SPELL_EMERGE, false);
me->CastSpell(me, SPELL_EMERGE_SUMMON, true);
@ -301,7 +303,7 @@ public:
switch (events.ExecuteEvent())
{
case EVENT_ELEMENTAL_HEALTH:
if (me->HealthBelowPct(51))
if (me->HealthBelowPct(56))
{
me->CastSpell(me, SPELL_FACE_ME, true);
me->CastSpell(me, SPELL_SURGE_VISUAL, true);
@ -315,7 +317,7 @@ public:
case EVENT_ELEMENTAL_SURGE:
Talk(SAY_SURGE);
me->CastSpell(me, SPELL_SURGE_VISUAL, true);
me->CastSpell(me->GetVictim(), SPELL_SURGE, false);
DoCastRandomTarget(SPELL_SURGE, 0, 40, true, false, true);
events.ScheduleEvent(EVENT_ELEMENTAL_SURGE, 15s);
break;
case EVENT_ELEMENTAL_VOLLEY:

View File

@ -92,12 +92,18 @@ public:
BossAI::JustEngagedWith(who);
me->CastSpell(me, SPELL_MOJO_FRENZY, true);
events.ScheduleEvent(EVENT_GROUND_TREMOR, 18s);
events.ScheduleEvent(EVENT_NUMBLING_SHOUT, 10s);
events.ScheduleEvent(EVENT_GROUND_TREMOR, 13s, 30s);
events.ScheduleEvent(EVENT_NUMBLING_SHOUT, 8s, 38s);
events.ScheduleEvent(EVENT_DETERMINED_STAB, 20s);
events.ScheduleEvent(EVENT_TRANSFORMATION, 12s);
}
void EnterEvadeMode(EvadeReason why) override
{
summons.DespawnAll();
BossAI::EnterEvadeMode(why);
}
void SpellHitTarget(Unit* /*caster*/, SpellInfo const* spellInfo) override
{
if (spellInfo->Id == SPELL_TRANSFORMATION)
@ -113,6 +119,7 @@ public:
{
Talk(SAY_DEATH);
Talk(EMOTE_ALTAR);
BossAI::JustDied(killer);
}
@ -144,29 +151,52 @@ public:
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
while (uint32 eventId = events.ExecuteEvent())
{
case EVENT_GROUND_TREMOR:
if (roll_chance_i(50))
Talk(SAY_QUAKE);
me->CastSpell(me, me->GetDisplayId() != me->GetNativeDisplayId() ? SPELL_QUAKE : SPELL_GROUND_TREMOR, false);
events.ScheduleEvent(EVENT_GROUND_TREMOR, 10s);
break;
case EVENT_NUMBLING_SHOUT:
me->CastSpell(me, me->GetDisplayId() != me->GetNativeDisplayId() ? SPELL_NUMBING_ROAR : SPELL_NUMBING_SHOUT, false);
events.ScheduleEvent(EVENT_NUMBLING_SHOUT, 10s);
break;
case EVENT_DETERMINED_STAB:
me->CastSpell(me->GetVictim(), me->GetDisplayId() != me->GetNativeDisplayId() ? SPELL_DETERMINED_GORE : SPELL_DETERMINED_STAB, false);
events.ScheduleEvent(EVENT_DETERMINED_STAB, 8s);
break;
case EVENT_TRANSFORMATION:
Talk(EMOTE_TRANSFORM);
Talk(SAY_TRANSFORM);
me->CastSpell(me, SPELL_TRANSFORMATION, false);
me->CastSpell(me, SPELL_SUMMON_PHANTOM_TRANSFORM, true);
events.ScheduleEvent(EVENT_TRANSFORMATION, 10s);
break;
switch (eventId)
{
case EVENT_GROUND_TREMOR:
if (roll_chance_i(50))
Talk(SAY_QUAKE);
if (me->GetDisplayId() != me->GetNativeDisplayId())
{
me->CastSpell(me, SPELL_QUAKE, false);
events.ScheduleEvent(EVENT_GROUND_TREMOR, 16s, 63s);
}
else
{
me->CastSpell(me, SPELL_GROUND_TREMOR, false);
events.ScheduleEvent(EVENT_GROUND_TREMOR, 13s, 27s);
}
return;
case EVENT_NUMBLING_SHOUT:
if (me->GetDisplayId() != me->GetNativeDisplayId())
{
me->CastSpell(me, SPELL_NUMBING_ROAR, false);
events.ScheduleEvent(EVENT_NUMBLING_SHOUT, 8s, 54s);
}
else
{
me->CastSpell(me, SPELL_NUMBING_SHOUT, false);
events.ScheduleEvent(EVENT_NUMBLING_SHOUT, 6s, 27s);
}
return;
case EVENT_DETERMINED_STAB:
me->CastSpell(me->GetVictim(), me->GetDisplayId() != me->GetNativeDisplayId() ? SPELL_DETERMINED_GORE : SPELL_DETERMINED_STAB, false);
events.ScheduleEvent(EVENT_DETERMINED_STAB, 8s);
return;
case EVENT_TRANSFORMATION:
Talk(EMOTE_TRANSFORM);
Talk(SAY_TRANSFORM);
me->CastSpell(me, SPELL_TRANSFORMATION, false);
me->CastSpell(me, SPELL_SUMMON_PHANTOM_TRANSFORM, true);
events.ScheduleEvent(EVENT_TRANSFORMATION, 10s);
return;
}
}
DoMeleeAttackIfReady();

View File

@ -1066,7 +1066,7 @@ class go_southfury_moonstone : public GameObjectScript
public:
go_southfury_moonstone() : GameObjectScript("go_southfury_moonstone") { }
bool OnGossipHello(Player* player, GameObject* /*go*/) override
bool OnGossipHello(Player* player, GameObject* go) override
{
//implicitTarget=48 not implemented as of writing this code, and manual summon may be just ok for our purpose
//player->CastSpell(player, SPELL_SUMMON_RIZZLE, false);
@ -1076,6 +1076,7 @@ public:
// no need casting spell blackjack, it's casted by script npc_rizzle_sprysprocket.
//creature->CastSpell(player, SPELL_BLACKJACK, false);
creature->AI()->AttackStart(player);
go->DespawnOrUnsummon(8000ms);
}
return false;