mirror of
https://github.com/azerothcore/azerothcore-wotlk.git
synced 2025-11-10 12:24:22 +08:00
Merge branch 'master' into ScheduleCreatureRespawn
This commit is contained in:
commit
08a21b16c8
113
data/sql/updates/db_world/2025_10_11_01.sql
Normal file
113
data/sql/updates/db_world/2025_10_11_01.sql
Normal 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');
|
||||
7
data/sql/updates/db_world/2025_10_11_02.sql
Normal file
7
data/sql/updates/db_world/2025_10_11_02.sql
Normal 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');
|
||||
13
data/sql/updates/db_world/2025_10_11_03.sql
Normal file
13
data/sql/updates/db_world/2025_10_11_03.sql
Normal 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!\'');
|
||||
27
data/sql/updates/db_world/2025_10_11_04.sql
Normal file
27
data/sql/updates/db_world/2025_10_11_04.sql
Normal 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');
|
||||
3
data/sql/updates/db_world/2025_10_11_05.sql
Normal file
3
data/sql/updates/db_world/2025_10_11_05.sql
Normal 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);
|
||||
6
data/sql/updates/db_world/2025_10_11_06.sql
Normal file
6
data/sql/updates/db_world/2025_10_11_06.sql
Normal 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;
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
};
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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();
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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 );
|
||||
|
||||
@ -628,7 +628,6 @@ public: // opcodes handlers
|
||||
void HandlePlayedTime(WorldPackets::Character::PlayedTimeClient& packet);
|
||||
|
||||
// new
|
||||
void HandleMoveUnRootAck(WorldPacket& recvPacket);
|
||||
void HandleMoveRootAck(WorldPacket& recvPacket);
|
||||
|
||||
// new inspect
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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();
|
||||
}
|
||||
@ -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:
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user