mirror of
https://github.com/azerothcore/azerothcore-wotlk.git
synced 2025-11-10 20:34:53 +08:00
Merge branch 'master' into Vmaps
This commit is contained in:
commit
5e4c8001e1
54
data/sql/updates/db_world/2025_11_03_00.sql
Normal file
54
data/sql/updates/db_world/2025_11_03_00.sql
Normal file
@ -0,0 +1,54 @@
|
||||
-- DB update 2025_11_01_03 -> 2025_11_03_00
|
||||
--
|
||||
DELETE FROM `spelldifficulty_dbc` WHERE `ID` IN (53618, 53616, 53617, 53602);
|
||||
INSERT INTO `spelldifficulty_dbc` (`ID`, `DifficultySpellID_1`, `DifficultySpellID_2`, `DifficultySpellID_3`, `DifficultySpellID_4`) VALUES
|
||||
(53618, 53618, 59350, 0, 0),
|
||||
(53616, 53616, 59360, 0, 0),
|
||||
(53617, 53617, 59359, 0, 0),
|
||||
(53602, 53602, 59349, 0, 0);
|
||||
|
||||
DELETE FROM `creature_summon_groups` WHERE `summonerId` = 29120 AND `entry` = 22515;
|
||||
INSERT INTO `creature_summon_groups` (`summonerId`, `summonerType`, `groupId`, `entry`, `position_x`, `position_y`, `position_z`, `orientation`, `summonType`, `summonTime`, `Comment`) VALUES
|
||||
(29120, 0, 1, 22515, 549.622, 352.047, 240.8899, 3.45575, 8, 0, 'Anub''arak - Group 1 - World Trigger'),
|
||||
(29120, 0, 2, 22515, 478.739, 252.85, 250.544, 0.0523599, 8, 0, 'Anub''arak - Group 2 - World Trigger'),
|
||||
(29120, 0, 2, 22515, 621.319, 268.482, 250.544, 3.33358, 8, 0, 'Anub''arak - Group 2 - World Trigger'),
|
||||
(29120, 0, 2, 22515, 622.904, 252.945, 250.544, 3.12414, 8, 0, 'Anub''arak - Group 2 - World Trigger'),
|
||||
(29120, 0, 2, 22515, 478.149, 269.009, 250.544, 6.12611, 8, 0, 'Anub''arak - Group 2 - World Trigger'),
|
||||
(29120, 0, 2, 22515, 478.547, 297.045, 250.544, 5.79449, 8, 0, 'Anub''arak - Group 2 - World Trigger'),
|
||||
(29120, 0, 2, 22515, 478.291, 224.827, 250.235, 0.401426, 8, 0, 'Anub''arak - Group 2 - World Trigger'),
|
||||
(29120, 0, 2, 22515, 620.622, 298.263, 250.544, 3.7001, 8, 0, 'Anub''arak - Group 2 - World Trigger'),
|
||||
(29120, 0, 2, 22515, 620.704, 224.562, 250.232, 2.53073, 8, 0, 'Anub''arak - Group 2 - World Trigger');
|
||||
|
||||
-- Position where Anub'ar Guardian and Anub'ar Venomancer run to after spawning
|
||||
SET @POS_X := 551.0095;
|
||||
SET @POS_Y := 274.026;
|
||||
SET @POS_Z := 223.89513;
|
||||
|
||||
-- Update comments, spelldifficulty_dbc
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 29216);
|
||||
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
|
||||
(29216, 0, 0, 0, 0, 0, 100, 0, 5000, 8000, 6000, 6000, 0, 0, 11, 53618, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Anub\'ar Guardian - In Combat - Cast \'Sunder Armor\''),
|
||||
(29216, 0, 1, 0, 0, 0, 100, 0, 2000, 3000, 8000, 8000, 0, 0, 11, 52532, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Anub\'ar Guardian - In Combat - Cast \'Strike\''),
|
||||
(29216, 0, 2, 0, 54, 0, 100, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 0, @POS_X, @POS_Y, @POS_Z, 0, 'Anub\'ar Guardian - On Just Summoned - Move To Position');
|
||||
|
||||
-- Update comments, spelldifficulty_dbc
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 29217);
|
||||
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
|
||||
(29217, 0, 0, 0, 0, 0, 100, 0, 5000, 8000, 18000, 22000, 0, 0, 11, 53616, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Anub\'ar Venomancer - In Combat - Cast \'Poison Bolt Volley\''),
|
||||
(29217, 0, 1, 0, 0, 0, 100, 0, 2000, 3000, 7000, 7000, 0, 0, 11, 53617, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Anub\'ar Venomancer - In Combat - Cast \'Poison Bolt\''),
|
||||
(29217, 0, 2, 0, 54, 0, 100, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 0, @POS_X, @POS_Y, @POS_Z, 0, 'Anub\'ar Venomancer - On Just Summoned - Move To Position');
|
||||
|
||||
-- Update comments, bump jump range from 50 to 100 yards, spelldifficulty_dbc
|
||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 29213);
|
||||
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
|
||||
(29213, 0, 0, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 97, 20, 10, 1, 0, 0, 0, 21, 100, 0, 0, 0, 0, 0, 0, 0, 'Anub\'ar Darter - On Respawn - Jump To Pos'),
|
||||
(29213, 0, 1, 0, 0, 0, 100, 0, 4000, 5000, 7000, 7000, 0, 0, 11, 53602, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Anub\'ar Darter - In Combat - Cast \'Dart\'');
|
||||
|
||||
-- Update comments, remove visual, bump jump range from 50 to 100 yards, spelldifficulty_dbc
|
||||
DELETE FROM `smart_scripts` WHERE (`entryorguid` = 29214) AND (`source_type` = 0);
|
||||
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
|
||||
(29214, 0, 0, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 97, 20, 10, 1, 0, 0, 0, 21, 100, 0, 0, 0, 0, 0, 0, 0, 'Anub\'ar Assassin - On Respawn - Jump To Pos'),
|
||||
(29214, 0, 1, 0, 67, 0, 100, 0, 5000, 5000, 5000, 5000, 0, 5, 11, 52540, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Anub\'ar Assassin - On Behind Target - Cast \'Backstab\''),
|
||||
(29214, 0, 2, 0, 0, 0, 100, 1, 3000, 3000, 0, 0, 0, 0, 28, 53611, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Anub\'ar Assassin - In Combat - Remove Aura \'Anub`ar Assasssin Visual Passive\' (No Repeat)');
|
||||
|
||||
UPDATE `spell_script_names` SET `ScriptName`='spell_azjol_nerub_carrion_beetles' WHERE `spell_id`=53520 AND `ScriptName`='spell_azjol_nerub_carrion_beetels';
|
||||
7
data/sql/updates/db_world/2025_11_03_01.sql
Normal file
7
data/sql/updates/db_world/2025_11_03_01.sql
Normal file
@ -0,0 +1,7 @@
|
||||
-- DB update 2025_11_03_00 -> 2025_11_03_01
|
||||
|
||||
DELETE FROM `areatrigger_scripts` WHERE `entry` = 5338;
|
||||
|
||||
DELETE FROM `areatrigger_teleport` WHERE `ID` = 5338;
|
||||
INSERT INTO `areatrigger_teleport` (`ID`, `Name`, `target_map`, `target_position_x`, `target_position_y`, `target_position_z`, `target_orientation`) VALUES
|
||||
(5338, 'Naxxanar Top -> Down', 571, 3733.68, 3563.25, 290.812, 3.66519);
|
||||
106
data/sql/updates/db_world/2025_11_04_00.sql
Normal file
106
data/sql/updates/db_world/2025_11_04_00.sql
Normal file
@ -0,0 +1,106 @@
|
||||
-- DB update 2025_11_03_01 -> 2025_11_04_00
|
||||
-- fix appearances of newly added 'Winter Reveler's
|
||||
-- assign correct model to creature 15792 `Troll Male Winter Reveler` used by spell 26252 `Winter Reveler - Troll Male`
|
||||
UPDATE `creature_template_model` SET `CreatureDisplayID` = 18809, `VerifiedBuild` = 0 WHERE (`CreatureID` = 15792) AND (`Idx` = 0);
|
||||
|
||||
-- assign costume auras
|
||||
DELETE FROM `creature_addon` WHERE (`guid` BETWEEN 66801 AND 66898);
|
||||
INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES
|
||||
(66801, 0, 0, 0, 1, 0, 0, '26247'), -- Orc Female
|
||||
(66802, 0, 0, 0, 1, 0, 0, '26248'), -- Orc Male
|
||||
(66803, 0, 0, 0, 1, 0, 0, '26247'), -- Orc Female
|
||||
(66804, 0, 0, 0, 1, 0, 0, '26248'), -- Orc Male
|
||||
(66805, 0, 0, 0, 1, 0, 0, '26239'), -- Human Male
|
||||
(66806, 0, 0, 0, 1, 0, 0, '26240'), -- Human Female
|
||||
(66807, 0, 0, 0, 1, 0, 0, '26239'), -- Human Male
|
||||
(66808, 0, 0, 0, 1, 0, 0, '26240'), -- Human Female
|
||||
(66809, 0, 0, 0, 1, 0, 0, '26251'), -- Troll Female
|
||||
(66810, 0, 0, 0, 1, 0, 0, '26252'), -- Troll Male
|
||||
(66811, 0, 0, 0, 1, 0, 0, '26249'), -- Tauren Female
|
||||
(66812, 0, 0, 0, 1, 0, 0, '26250'), -- Tauren Male
|
||||
(66813, 0, 0, 0, 1, 0, 0, '26241'), -- Dwarf Male
|
||||
(66814, 0, 0, 0, 1, 0, 0, '26242'), -- Dwarf Female
|
||||
(66815, 0, 0, 0, 1, 0, 0, '26253'), -- Undead Female
|
||||
(66816, 0, 0, 0, 1, 0, 0, '26254'), -- Undead Male
|
||||
(66817, 0, 0, 0, 1, 0, 0, '26243'), -- Goblin Female
|
||||
(66818, 0, 0, 0, 1, 0, 0, '26244'), -- Goblin Male
|
||||
(66819, 0, 0, 0, 1, 0, 0, '26249'), -- Tauren Female
|
||||
(66820, 0, 0, 0, 1, 0, 0, '26250'), -- Tauren Male
|
||||
(66821, 0, 0, 0, 1, 0, 0, '26249'), -- Tauren Female
|
||||
(66822, 0, 0, 0, 1, 0, 0, '26250'), -- Tauren Male
|
||||
(66823, 0, 0, 0, 1, 0, 0, '26239'), -- Human Male
|
||||
(66824, 0, 0, 0, 1, 0, 0, '26240'), -- Human Female
|
||||
(66825, 0, 0, 0, 1, 0, 0, '26245'), -- Night Elf Female
|
||||
(66826, 0, 0, 0, 1, 0, 0, '26246'), -- Night Elf Male
|
||||
(66827, 0, 0, 0, 1, 0, 0, '26249'), -- Tauren Female
|
||||
(66828, 0, 0, 0, 1, 0, 0, '26250'), -- Tauren Male
|
||||
(66829, 0, 0, 0, 1, 0, 0, '26249'), -- Tauren Female
|
||||
(66830, 0, 0, 0, 1, 0, 0, '26250'), -- Tauren Male
|
||||
(66831, 0, 0, 0, 1, 0, 0, '39860'), -- Blood Elf Female
|
||||
(66832, 0, 0, 0, 1, 0, 0, '39861'), -- Blood Elf Male
|
||||
(66833, 0, 0, 0, 1, 0, 0, '26243'), -- Goblin Female
|
||||
(66834, 0, 0, 0, 1, 0, 0, '26244'), -- Goblin Male
|
||||
(66835, 0, 0, 0, 1, 0, 0, '26245'), -- Night Elf Female
|
||||
(66836, 0, 0, 0, 1, 0, 0, '26246'), -- Night Elf Male
|
||||
(66837, 0, 0, 0, 1, 0, 0, '26247'), -- Orc Female
|
||||
(66838, 0, 0, 0, 1, 0, 0, '26248'), -- Orc Male
|
||||
(66839, 0, 0, 0, 1, 0, 0, '26245'), -- Night Elf Female
|
||||
(66840, 0, 0, 0, 1, 0, 0, '26246'), -- Night Elf Male
|
||||
(66841, 0, 0, 0, 1, 0, 0, '26245'), -- Night Elf Female
|
||||
(66842, 0, 0, 0, 1, 0, 0, '26246'), -- Night Elf Male
|
||||
(66843, 0, 0, 0, 1, 0, 0, '26245'), -- Night Elf Female
|
||||
(66844, 0, 0, 0, 1, 0, 0, '26246'), -- Night Elf Male
|
||||
(66845, 0, 0, 0, 1, 0, 0, '26243'), -- Goblin Female
|
||||
(66846, 0, 0, 0, 1, 0, 0, '26244'), -- Goblin Male
|
||||
(66847, 0, 0, 0, 1, 0, 0, '26247'), -- Orc Female
|
||||
(66848, 0, 0, 0, 1, 0, 0, '26248'), -- Orc Male
|
||||
(66849, 0, 0, 0, 1, 0, 0, '39858'), -- Draenei Female
|
||||
(66850, 0, 0, 0, 1, 0, 0, '39859'), -- Draenei Male
|
||||
(66851, 0, 0, 0, 1, 0, 0, '39860'), -- Blood Elf Female
|
||||
(66852, 0, 0, 0, 1, 0, 0, '39861'), -- Blood Elf Male
|
||||
(66853, 0, 0, 0, 1, 0, 0, '26247'), -- Orc Female
|
||||
(66854, 0, 0, 0, 1, 0, 0, '26248'), -- Orc Male
|
||||
(66855, 0, 0, 0, 1, 0, 0, '39860'), -- Blood Elf Female
|
||||
(66856, 0, 0, 0, 1, 0, 0, '39861'), -- Blood Elf Male
|
||||
(66857, 0, 0, 0, 1, 0, 0, '26247'), -- Orc Female
|
||||
(66858, 0, 0, 0, 1, 0, 0, '26248'), -- Orc Male
|
||||
(66859, 0, 0, 0, 1, 0, 0, '39858'), -- Draenei Female
|
||||
(66860, 0, 0, 0, 1, 0, 0, '39859'), -- Draenei Male
|
||||
(66861, 0, 0, 0, 1, 0, 0, '39858'), -- Draenei Female
|
||||
(66862, 0, 0, 0, 1, 0, 0, '39859'), -- Draenei Male
|
||||
(66863, 0, 0, 0, 1, 0, 0, '26241'), -- Dwarf Male
|
||||
(66864, 0, 0, 0, 1, 0, 0, '26242'), -- Dwarf Female
|
||||
(66865, 0, 0, 0, 1, 0, 0, '39860'), -- Blood Elf Female
|
||||
(66866, 0, 0, 0, 1, 0, 0, '39861'), -- Blood Elf Male
|
||||
(66867, 0, 0, 0, 1, 0, 0, '39860'), -- Blood Elf Female
|
||||
(66868, 0, 0, 0, 1, 0, 0, '39861'), -- Blood Elf Male
|
||||
(66869, 0, 0, 0, 1, 0, 0, '26239'), -- Human Male
|
||||
(66870, 0, 0, 0, 1, 0, 0, '26240'), -- Human Female
|
||||
(66871, 0, 0, 0, 1, 0, 0, '39858'), -- Draenei Female
|
||||
(66872, 0, 0, 0, 1, 0, 0, '39859'), -- Draenei Male
|
||||
(66873, 0, 0, 0, 1, 0, 0, '26253'), -- Undead Female
|
||||
(66874, 0, 0, 0, 1, 0, 0, '26254'), -- Undead Male
|
||||
(66875, 0, 0, 0, 1, 0, 0, '39876'), -- Gnome Female
|
||||
(66876, 0, 0, 0, 1, 0, 0, '39877'), -- Gnome Male
|
||||
(66877, 0, 0, 0, 1, 0, 0, '26245'), -- Night Elf Female
|
||||
(66878, 0, 0, 0, 1, 0, 0, '26246'), -- Night Elf Male
|
||||
(66879, 0, 0, 0, 1, 0, 0, '26251'), -- Troll Female
|
||||
(66880, 0, 0, 0, 1, 0, 0, '26252'), -- Troll Male
|
||||
(66881, 0, 0, 0, 1, 0, 0, '39858'), -- Draenei Female
|
||||
(66882, 0, 0, 0, 1, 0, 0, '39859'), -- Draenei Male
|
||||
(66883, 0, 0, 0, 1, 0, 0, '26247'), -- Orc Female
|
||||
(66884, 0, 0, 0, 1, 0, 0, '26248'), -- Orc Male
|
||||
(66885, 0, 0, 0, 1, 0, 0, '39858'), -- Draenei Female
|
||||
(66886, 0, 0, 0, 1, 0, 0, '39859'), -- Draenei Male
|
||||
(66887, 0, 0, 0, 1, 0, 0, '39860'), -- Blood Elf Female
|
||||
(66888, 0, 0, 0, 1, 0, 0, '39861'), -- Blood Elf Male
|
||||
(66889, 0, 0, 0, 1, 0, 0, '26243'), -- Goblin Female
|
||||
(66890, 0, 0, 0, 1, 0, 0, '26244'), -- Goblin Male
|
||||
(66891, 0, 0, 0, 1, 0, 0, '39860'), -- Blood Elf Female
|
||||
(66892, 0, 0, 0, 1, 0, 0, '39861'), -- Blood Elf Male
|
||||
(66893, 0, 0, 0, 1, 0, 0, '39860'), -- Blood Elf Female
|
||||
(66894, 0, 0, 0, 1, 0, 0, '39861'), -- Blood Elf Male
|
||||
(66895, 0, 0, 0, 1, 0, 0, '26239'), -- Human Male
|
||||
(66896, 0, 0, 0, 1, 0, 0, '26240'), -- Human Female
|
||||
(66897, 0, 0, 0, 1, 0, 0, '39860'), -- Blood Elf Female
|
||||
(66898, 0, 0, 0, 1, 0, 0, '39861'); -- Blood Elf Male
|
||||
3
data/sql/updates/db_world/2025_11_04_01.sql
Normal file
3
data/sql/updates/db_world/2025_11_04_01.sql
Normal file
@ -0,0 +1,3 @@
|
||||
-- DB update 2025_11_04_00 -> 2025_11_04_01
|
||||
-- fix z position of some 195164 'Pumpkin' spawns
|
||||
UPDATE `gameobject` SET `position_z` = (`position_z` + 0.7), `VerifiedBuild` = 0 WHERE (`id` = 195164) AND (`guid` IN (18978, 18979, 18980, 18981, 18982, 18983, 18984, 18985, 18986, 18987, 19018, 19019, 19020, 19021, 19022, 19023, 19024, 19025, 19026, 19027, 19115, 19116, 19117, 19118, 19119, 19120, 19121, 19122, 19123, 19124, 19151, 19152, 19153, 19154, 19155, 19156, 19157, 19158, 19159, 19160, 19304, 19305, 19306, 19307, 19308, 19309, 19310, 19311, 19312, 19313));
|
||||
@ -1968,10 +1968,7 @@ void Player::UpdateCharmedAI()
|
||||
|
||||
Unit* target = GetVictim();
|
||||
if (target)
|
||||
{
|
||||
SetInFront(target);
|
||||
SendMovementFlagUpdate(true);
|
||||
}
|
||||
|
||||
if (HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
@ -10963,7 +10963,11 @@ void Unit::SetCharm(Unit* charm, bool apply)
|
||||
charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
|
||||
}
|
||||
else
|
||||
{
|
||||
charm->m_ControlledByPlayer = false;
|
||||
if (!HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
|
||||
charm->RemoveUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
|
||||
}
|
||||
|
||||
// PvP, FFAPvP
|
||||
charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, GetByteValue(UNIT_FIELD_BYTES_2, 1));
|
||||
@ -16709,6 +16713,13 @@ void Unit::StopMovingOnCurrentPos()
|
||||
|
||||
void Unit::SendMovementFlagUpdate(bool self /* = false */)
|
||||
{
|
||||
if (IsRooted())
|
||||
{
|
||||
// each case where this occurs has to be examined and reported and dealt with.
|
||||
LOG_ERROR("Unit", "Attempted sending heartbeat with root flag for guid {}", GetGUID().ToString());
|
||||
return;
|
||||
}
|
||||
|
||||
WorldPacket data;
|
||||
BuildHeartBeatMsg(&data);
|
||||
SendMessageToSet(&data, self);
|
||||
|
||||
@ -113,7 +113,7 @@ bool ChaseMovementGenerator<T>::DispatchSplineToPosition(T* owner, float x, floa
|
||||
}
|
||||
|
||||
owner->StopMoving();
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (cutPath)
|
||||
@ -134,7 +134,7 @@ bool ChaseMovementGenerator<T>::DispatchSplineToPosition(T* owner, float x, floa
|
||||
init.SetWalk(walk);
|
||||
init.Launch();
|
||||
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
@ -219,18 +219,21 @@ bool ChaseMovementGenerator<T>::DoUpdate(T* owner, uint32 time_diff)
|
||||
{
|
||||
i_recheckDistance.Reset(400); // Sniffed value
|
||||
|
||||
if (i_recalculateTravel && PositionOkay(owner, target, _movingTowards ? maxTarget : Optional<float>(), angle))
|
||||
if (m_currentMode != CHASE_MODE_DISTANCING)
|
||||
{
|
||||
if ((owner->HasUnitState(UNIT_STATE_CHASE_MOVE) && !target->isMoving() && !mutualChase) || _range)
|
||||
if (i_recalculateTravel && PositionOkay(owner, target, _movingTowards ? maxTarget : Optional<float>(), angle))
|
||||
{
|
||||
i_recalculateTravel = false;
|
||||
i_path = nullptr;
|
||||
if (cOwner)
|
||||
cOwner->SetCannotReachTarget();
|
||||
owner->StopMoving();
|
||||
owner->SetInFront(target);
|
||||
MovementInform(owner);
|
||||
return true;
|
||||
if ((owner->HasUnitState(UNIT_STATE_CHASE_MOVE) && !target->isMoving() && !mutualChase) || _range)
|
||||
{
|
||||
i_recalculateTravel = false;
|
||||
i_path = nullptr;
|
||||
if (cOwner)
|
||||
cOwner->SetCannotReachTarget();
|
||||
owner->StopMoving();
|
||||
owner->SetInFront(target);
|
||||
MovementInform(owner);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -262,6 +265,9 @@ bool ChaseMovementGenerator<T>::DoUpdate(T* owner, uint32 time_diff)
|
||||
i_leashExtensionTimer.Reset(cOwner->GetAttackTime(BASE_ATTACK));
|
||||
}
|
||||
|
||||
if (m_currentMode == CHASE_MODE_DISTANCING)
|
||||
return true;
|
||||
|
||||
// if the target moved, we have to consider whether to adjust
|
||||
if (!_lastTargetPosition || target->GetPosition() != _lastTargetPosition.value() || mutualChase != _mutualChase || !owner->IsWithinLOSInMap(target))
|
||||
{
|
||||
|
||||
@ -28,7 +28,7 @@ enum ANData
|
||||
{
|
||||
DATA_KRIKTHIR = 0,
|
||||
DATA_HADRONOX = 1,
|
||||
DATA_ANUBARAK_EVENT = 2,
|
||||
DATA_ANUBARAK = 2,
|
||||
MAX_ENCOUNTERS = 3
|
||||
};
|
||||
|
||||
@ -41,6 +41,8 @@ enum ANIds
|
||||
NPC_SKITTERING_INFECTIOR = 28736,
|
||||
NPC_KRIKTHIR_THE_GATEWATCHER = 28684,
|
||||
NPC_HADRONOX = 28921,
|
||||
NPC_ANUBARAK = 29120,
|
||||
|
||||
NPC_ANUB_AR_CHAMPION = 29062,
|
||||
NPC_ANUB_AR_NECROMANCER = 29063,
|
||||
NPC_ANUB_AR_CRYPTFIEND = 29064,
|
||||
@ -59,4 +61,6 @@ inline AI* GetAzjolNerubAI(T* obj)
|
||||
return GetInstanceAI<AI>(obj, AzjolNerubScriptName);
|
||||
}
|
||||
|
||||
#define RegisterAzjolNerubCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetAzjolNerubAI)
|
||||
|
||||
#endif
|
||||
|
||||
@ -55,223 +55,347 @@ enum Yells
|
||||
enum Misc
|
||||
{
|
||||
ACHIEV_TIMED_START_EVENT = 20381,
|
||||
};
|
||||
|
||||
EVENT_CARRION_BEETELS = 1,
|
||||
enum Events
|
||||
{
|
||||
EVENT_CARRION_BEETLES = 1,
|
||||
EVENT_LEECHING_SWARM = 2,
|
||||
EVENT_IMPALE = 3,
|
||||
EVENT_POUND = 4,
|
||||
EVENT_CLOSE_DOORS = 5,
|
||||
EVENT_EMERGE = 6,
|
||||
EVENT_SUMMON_VENOMANCER = 7,
|
||||
EVENT_SUMMON_DARTER = 8,
|
||||
EVENT_SUMMON_GUARDIAN = 9,
|
||||
EVENT_SUMMON_ASSASSINS = 10,
|
||||
EVENT_ENABLE_ROTATE = 11,
|
||||
EVENT_ENABLE_ROTATE = 5,
|
||||
EVENT_CLOSE_DOORS = 6,
|
||||
EVENT_EMERGE = 7,
|
||||
EVENT_SUMMON_GUARDIAN = 8,
|
||||
EVENT_SUMMON_VENOMANCER = 9,
|
||||
EVENT_SUMMON_DARTER = 10,
|
||||
EVENT_SUMMON_ASSASSINS = 11,
|
||||
EVENT_KILL_TALK = 12
|
||||
};
|
||||
|
||||
enum ANAnubarakNpcs
|
||||
enum CreatureIds
|
||||
{
|
||||
NPC_WORLD_TRIGGER = 22515,
|
||||
NPC_ANUBAR_GUARDIAN = 29216,
|
||||
NPC_ANUBAR_VENOMANCER = 29217
|
||||
NPC_ANUBAR_VENOMANCER = 29217,
|
||||
};
|
||||
|
||||
class boss_anub_arak : public CreatureScript
|
||||
enum Phases : uint8
|
||||
{
|
||||
public:
|
||||
boss_anub_arak() : CreatureScript("boss_anub_arak") { }
|
||||
PHASE_EMERGED = 1,
|
||||
PHASE_SUBMERGED
|
||||
};
|
||||
|
||||
struct boss_anub_arakAI : public BossAI
|
||||
enum SubPhase : uint8
|
||||
{
|
||||
SUBMERGE_NONE = 0,
|
||||
SUBMERGE_75 = 1,
|
||||
SUBMERGE_50 = 2,
|
||||
SUBMERGE_25 = 3,
|
||||
};
|
||||
|
||||
enum SummonGroups
|
||||
{
|
||||
SUMMON_GROUP_WORLD_TRIGGER_GUARDIAN = 1,
|
||||
SUMMON_GROUP_WORLD_TRIGGER_BALCONY = 2
|
||||
};
|
||||
|
||||
struct boss_anub_arak : public BossAI
|
||||
{
|
||||
explicit boss_anub_arak(Creature* creature) : BossAI(creature, DATA_ANUBARAK), _intro(false),
|
||||
_submergePhase(SUBMERGE_NONE), _remainingLargeSummonsBeforeEmerge(0), _balconySummons(me)
|
||||
{
|
||||
me->m_SightDistance = 120.0f;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
BossAI::Reset();
|
||||
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
|
||||
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
_remainingLargeSummonsBeforeEmerge = 0;
|
||||
_submergePhase = SUBMERGE_NONE;
|
||||
|
||||
ScheduleHealthCheckEvent({ 75, 50, 25 }, [&]{
|
||||
events.Reset();
|
||||
Talk(SAY_SUBMERGE);
|
||||
DoCastSelf(SPELL_CLEAR_ALL_DEBUFFS, true);
|
||||
DoCastSelf(SPELL_SUBMERGE, false);
|
||||
}, false);
|
||||
}
|
||||
|
||||
void SpellHitTarget(Unit* /*caster*/, SpellInfo const* spellInfo) override
|
||||
{
|
||||
if (spellInfo->Id == SPELL_SUBMERGE)
|
||||
{
|
||||
boss_anub_arakAI(Creature* creature) : BossAI(creature, DATA_ANUBARAK_EVENT)
|
||||
{
|
||||
me->m_SightDistance = 120.0f;
|
||||
_intro = false;
|
||||
_summonedMinions = false;
|
||||
}
|
||||
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->RemoveAurasDueToSpell(SPELL_LEECHING_SWARM);
|
||||
DoCastSelf(SPELL_IMPALE_PERIODIC, true);
|
||||
|
||||
void EnterEvadeMode(EvadeReason why) override
|
||||
{
|
||||
me->DisableRotate(false);
|
||||
BossAI::EnterEvadeMode(why);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
{
|
||||
if (!_intro && who->IsPlayer())
|
||||
{
|
||||
_intro = true;
|
||||
Talk(SAY_INTRO);
|
||||
}
|
||||
BossAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) override
|
||||
{
|
||||
if (!events.HasTimeUntilEvent(EVENT_KILL_TALK))
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon) override
|
||||
{
|
||||
summons.Summon(summon);
|
||||
if (!summon->IsTrigger())
|
||||
summon->SetInCombatWithZone();
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
BossAI::Reset();
|
||||
_summonedMinions = false;
|
||||
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
|
||||
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
|
||||
ScheduleHealthCheckEvent({ 75, 50, 25 }, [&]{
|
||||
Talk(SAY_SUBMERGE);
|
||||
_summonedMinions = false;
|
||||
DoCastSelf(SPELL_CLEAR_ALL_DEBUFFS, true);
|
||||
DoCastSelf(SPELL_SUBMERGE, false);
|
||||
|
||||
me->m_Events.AddEventAtOffset([this] {
|
||||
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
|
||||
DoCastSelf(SPELL_IMPALE_PERIODIC, true);
|
||||
}, 2s);
|
||||
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_EMERGE, 60s);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 2s);
|
||||
events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 4s);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 15s);
|
||||
events.ScheduleEvent(EVENT_SUMMON_VENOMANCER, 20s);
|
||||
events.ScheduleEvent(EVENT_SUMMON_DARTER, 30s);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 35s);
|
||||
}, false);
|
||||
}
|
||||
|
||||
void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override
|
||||
{
|
||||
if (!me->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
|
||||
return;
|
||||
|
||||
if (_summonedMinions && !summons.IsAnyCreatureWithEntryAlive(NPC_ANUBAR_GUARDIAN) && !summons.IsAnyCreatureWithEntryAlive(NPC_ANUBAR_VENOMANCER))
|
||||
{
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_EMERGE, 5s);
|
||||
}
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* ) override
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
|
||||
events.ScheduleEvent(EVENT_CARRION_BEETELS, 6500ms);
|
||||
events.ScheduleEvent(EVENT_LEECHING_SWARM, 20s);
|
||||
events.ScheduleEvent(EVENT_POUND, 15s);
|
||||
events.ScheduleEvent(EVENT_CLOSE_DOORS, 5s);
|
||||
}
|
||||
|
||||
void SummonHelpers(float x, float y, float z, uint32 spellId)
|
||||
{
|
||||
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
|
||||
me->SummonCreature(spellInfo->Effects[EFFECT_0].MiscValue, x, y, z, 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
scheduler.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_CLOSE_DOORS:
|
||||
_JustEngagedWith();
|
||||
break;
|
||||
case EVENT_CARRION_BEETELS:
|
||||
me->CastSpell(me, SPELL_CARRION_BEETLES, false);
|
||||
events.ScheduleEvent(EVENT_CARRION_BEETELS, 25s);
|
||||
break;
|
||||
case EVENT_LEECHING_SWARM:
|
||||
Talk(SAY_LOCUST);
|
||||
me->CastSpell(me, SPELL_LEECHING_SWARM, false);
|
||||
events.ScheduleEvent(EVENT_LEECHING_SWARM, 20s);
|
||||
break;
|
||||
case EVENT_POUND:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 10.0f))
|
||||
{
|
||||
me->CastSpell(me, SPELL_SELF_ROOT, true);
|
||||
me->DisableRotate(true);
|
||||
me->SendMovementFlagUpdate();
|
||||
events.ScheduleEvent(EVENT_ENABLE_ROTATE, 3300ms);
|
||||
me->CastSpell(target, SPELL_POUND, false);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_POUND, 18s);
|
||||
break;
|
||||
case EVENT_ENABLE_ROTATE:
|
||||
me->RemoveAurasDueToSpell(SPELL_SELF_ROOT);
|
||||
me->DisableRotate(false);
|
||||
break;
|
||||
case EVENT_EMERGE:
|
||||
me->CastSpell(me, SPELL_EMERGE, true);
|
||||
me->RemoveAura(SPELL_SUBMERGE);
|
||||
me->RemoveAura(SPELL_IMPALE_PERIODIC);
|
||||
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
|
||||
events.ScheduleEvent(EVENT_CARRION_BEETELS, 6500ms);
|
||||
events.ScheduleEvent(EVENT_LEECHING_SWARM, 20s);
|
||||
events.ScheduleEvent(EVENT_POUND, 15s);
|
||||
break;
|
||||
case EVENT_SUMMON_ASSASSINS:
|
||||
SummonHelpers(509.32f, 247.42f, 239.48f, SPELL_SUMMON_ASSASSIN);
|
||||
SummonHelpers(589.51f, 240.19f, 236.0f, SPELL_SUMMON_ASSASSIN);
|
||||
break;
|
||||
case EVENT_SUMMON_DARTER:
|
||||
SummonHelpers(509.32f, 247.42f, 239.48f, SPELL_SUMMON_DARTER);
|
||||
SummonHelpers(589.51f, 240.19f, 236.0f, SPELL_SUMMON_DARTER);
|
||||
break;
|
||||
case EVENT_SUMMON_GUARDIAN:
|
||||
SummonHelpers(550.34f, 316.00f, 234.30f, SPELL_SUMMON_GUARDIAN);
|
||||
break;
|
||||
case EVENT_SUMMON_VENOMANCER:
|
||||
_summonedMinions = true;
|
||||
SummonHelpers(550.34f, 316.00f, 234.30f, SPELL_SUMMON_VENOMANCER);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!me->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
bool _intro;
|
||||
bool _summonedMinions;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return GetAzjolNerubAI<boss_anub_arakAI>(creature);
|
||||
++_submergePhase;
|
||||
ScheduleSubmerged();
|
||||
}
|
||||
}
|
||||
|
||||
void ScheduleEmerged()
|
||||
{
|
||||
events.Reset();
|
||||
events.SetPhase(PHASE_EMERGED);
|
||||
events.ScheduleEvent(EVENT_CARRION_BEETLES, 6500ms, 0, PHASE_EMERGED);
|
||||
events.ScheduleEvent(EVENT_LEECHING_SWARM, 20s, 0, PHASE_EMERGED);
|
||||
events.ScheduleEvent(EVENT_POUND, 15s, 0, PHASE_EMERGED);
|
||||
};
|
||||
|
||||
void ScheduleSubmerged()
|
||||
{
|
||||
events.Reset();
|
||||
events.SetPhase(PHASE_SUBMERGED);
|
||||
events.ScheduleEvent(EVENT_EMERGE, 60s, 0, PHASE_SUBMERGED);
|
||||
|
||||
switch (_submergePhase)
|
||||
{
|
||||
case SUBMERGE_75:
|
||||
events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 4s, 0, PHASE_SUBMERGED);
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 7s, 0, PHASE_SUBMERGED);
|
||||
|
||||
_remainingLargeSummonsBeforeEmerge = IsHeroic() ? 2 : 1;
|
||||
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 4s, 0, PHASE_SUBMERGED);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 24s, 0, PHASE_SUBMERGED);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 44s, 0, PHASE_SUBMERGED);
|
||||
break;
|
||||
case SUBMERGE_50:
|
||||
events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 4s, 0, PHASE_SUBMERGED);
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 7s, 0, PHASE_SUBMERGED);
|
||||
|
||||
events.ScheduleEvent(EVENT_SUMMON_VENOMANCER, 24s, 0, PHASE_SUBMERGED);
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SUMMON_VENOMANCER, 29s, 0, PHASE_SUBMERGED);
|
||||
|
||||
_remainingLargeSummonsBeforeEmerge = IsHeroic() ? 4 : 2;
|
||||
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 4s, 0, PHASE_SUBMERGED);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 24s, 0, PHASE_SUBMERGED);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 44s, 0, PHASE_SUBMERGED);
|
||||
break;
|
||||
case SUBMERGE_25:
|
||||
events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 4s, 0, PHASE_SUBMERGED);
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 7s, 0, PHASE_SUBMERGED);
|
||||
|
||||
events.ScheduleEvent(EVENT_SUMMON_VENOMANCER, 24s, 0, PHASE_SUBMERGED);
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SUMMON_VENOMANCER, 29s, 0, PHASE_SUBMERGED);
|
||||
|
||||
_remainingLargeSummonsBeforeEmerge = IsHeroic() ? 4 : 2;
|
||||
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 4s, 0, PHASE_SUBMERGED);
|
||||
events.ScheduleEvent(EVENT_SUMMON_DARTER, 4s, 0, PHASE_SUBMERGED);
|
||||
|
||||
events.ScheduleEvent(EVENT_SUMMON_DARTER, 12s, 0, PHASE_SUBMERGED);
|
||||
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 24s, 0, PHASE_SUBMERGED);
|
||||
events.ScheduleEvent(EVENT_SUMMON_DARTER, 26s, 0, PHASE_SUBMERGED);
|
||||
|
||||
events.ScheduleEvent(EVENT_SUMMON_DARTER, 32s, 0, PHASE_SUBMERGED);
|
||||
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 44s, 0, PHASE_SUBMERGED);
|
||||
events.ScheduleEvent(EVENT_SUMMON_DARTER, 45s, 0, PHASE_SUBMERGED);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
Talk(SAY_AGGRO);
|
||||
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
|
||||
events.SetPhase(PHASE_EMERGED);
|
||||
events.ScheduleEvent(EVENT_CLOSE_DOORS, 5s);
|
||||
ScheduleEmerged();
|
||||
|
||||
// set up world triggers
|
||||
std::list<TempSummon*> summoned;
|
||||
me->SummonCreatureGroup(SUMMON_GROUP_WORLD_TRIGGER_GUARDIAN, &summoned);
|
||||
if (summoned.empty())
|
||||
{
|
||||
EnterEvadeMode(EVADE_REASON_OTHER);
|
||||
return;
|
||||
}
|
||||
TempSummon* guardianTrigger = summoned.front();
|
||||
_guardianTriggerGUID = guardianTrigger->GetGUID();
|
||||
|
||||
summoned.clear();
|
||||
_balconySummons.clear();
|
||||
me->SummonCreatureGroup(SUMMON_GROUP_WORLD_TRIGGER_BALCONY, &summoned);
|
||||
if (summoned.empty())
|
||||
{
|
||||
EnterEvadeMode(EVADE_REASON_OTHER);
|
||||
return;
|
||||
}
|
||||
for (auto const& summon : summoned)
|
||||
_balconySummons.Summon(summon);
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason why) override
|
||||
{
|
||||
me->DisableRotate(false);
|
||||
BossAI::EnterEvadeMode(why);
|
||||
summons.DespawnAll();
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
{
|
||||
if (!_intro && who->IsPlayer())
|
||||
{
|
||||
_intro = true;
|
||||
Talk(SAY_INTRO);
|
||||
}
|
||||
BossAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) override
|
||||
{
|
||||
if (!events.HasTimeUntilEvent(EVENT_KILL_TALK))
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
|
||||
}
|
||||
}
|
||||
|
||||
void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override
|
||||
{
|
||||
if (!me->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
|
||||
return;
|
||||
|
||||
switch (summon->GetEntry())
|
||||
{
|
||||
case NPC_ANUBAR_GUARDIAN:
|
||||
case NPC_ANUBAR_VENOMANCER:
|
||||
{
|
||||
--_remainingLargeSummonsBeforeEmerge;
|
||||
if (_remainingLargeSummonsBeforeEmerge == 0)
|
||||
{
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_EMERGE, 5s);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SummonedCreatureEvade(Creature* /*summon*/) override
|
||||
{
|
||||
EnterEvadeMode(EVADE_REASON_OTHER);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
scheduler.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_CLOSE_DOORS:
|
||||
BossAI::_JustEngagedWith();
|
||||
break;
|
||||
case EVENT_CARRION_BEETLES:
|
||||
DoCastSelf(SPELL_CARRION_BEETLES);
|
||||
events.ScheduleEvent(EVENT_CARRION_BEETLES, 25s, 0, PHASE_EMERGED);
|
||||
break;
|
||||
case EVENT_LEECHING_SWARM:
|
||||
Talk(SAY_LOCUST);
|
||||
DoCastSelf(SPELL_LEECHING_SWARM);
|
||||
events.ScheduleEvent(EVENT_LEECHING_SWARM, 20s, 0, PHASE_EMERGED);
|
||||
break;
|
||||
case EVENT_POUND:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 10.0f))
|
||||
{
|
||||
DoCastSelf(SPELL_SELF_ROOT, true);
|
||||
me->DisableRotate(true);
|
||||
me->SendMovementFlagUpdate();
|
||||
events.ScheduleEvent(EVENT_ENABLE_ROTATE, 3300ms);
|
||||
DoCast(target, SPELL_POUND);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_POUND, 18s);
|
||||
break;
|
||||
case EVENT_ENABLE_ROTATE:
|
||||
me->RemoveAurasDueToSpell(SPELL_SELF_ROOT);
|
||||
me->DisableRotate(false);
|
||||
break;
|
||||
case EVENT_EMERGE:
|
||||
me->RemoveAurasDueToSpell(SPELL_SUBMERGE);
|
||||
me->RemoveAurasDueToSpell(SPELL_IMPALE_PERIODIC);
|
||||
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
|
||||
DoCastSelf(SPELL_EMERGE);
|
||||
ScheduleEmerged();
|
||||
break;
|
||||
case EVENT_SUMMON_GUARDIAN:
|
||||
if (Creature* trigger = ObjectAccessor::GetCreature(*me, _guardianTriggerGUID))
|
||||
trigger->CastSpell(trigger, SPELL_SUMMON_GUARDIAN, true, nullptr, nullptr, me->GetGUID());
|
||||
break;
|
||||
case EVENT_SUMMON_VENOMANCER:
|
||||
if (Creature* trigger = ObjectAccessor::GetCreature(*me, _guardianTriggerGUID))
|
||||
trigger->CastSpell(trigger, SPELL_SUMMON_VENOMANCER, true, nullptr, nullptr, me->GetGUID());
|
||||
break;
|
||||
case EVENT_SUMMON_DARTER:
|
||||
if (Creature* trigger = ObjectAccessor::GetCreature(*me, Acore::Containers::SelectRandomContainerElement(_balconySummons)))
|
||||
trigger->CastSpell(trigger, SPELL_SUMMON_DARTER, true, nullptr, nullptr, me->GetGUID());
|
||||
break;
|
||||
case EVENT_SUMMON_ASSASSINS:
|
||||
if (Creature* trigger = ObjectAccessor::GetCreature(*me, Acore::Containers::SelectRandomContainerElement(_balconySummons)))
|
||||
trigger->CastSpell(trigger, SPELL_SUMMON_ASSASSIN, true, nullptr, nullptr, me->GetGUID());
|
||||
if (Creature* trigger = ObjectAccessor::GetCreature(*me, Acore::Containers::SelectRandomContainerElement(_balconySummons)))
|
||||
trigger->CastSpell(trigger, SPELL_SUMMON_ASSASSIN, true, nullptr, nullptr, me->GetGUID());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (!me->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask) override
|
||||
{
|
||||
if (me->HasAura(SPELL_SUBMERGE) && damage >= me->GetHealth())
|
||||
damage = me->GetHealth() - 1;
|
||||
|
||||
BossAI::DamageTaken(attacker, damage, damagetype, damageSchoolMask);
|
||||
}
|
||||
|
||||
private:
|
||||
bool _intro;
|
||||
uint8 _submergePhase;
|
||||
uint8 _remainingLargeSummonsBeforeEmerge;
|
||||
ObjectGuid _guardianTriggerGUID;
|
||||
SummonList _balconySummons;
|
||||
};
|
||||
|
||||
class spell_azjol_nerub_carrion_beetels : public AuraScript
|
||||
class spell_azjol_nerub_carrion_beetles : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_azjol_nerub_carrion_beetels)
|
||||
PrepareAuraScript(spell_azjol_nerub_carrion_beetles)
|
||||
|
||||
void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
|
||||
void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
|
||||
{
|
||||
// Xinef: 2 each second
|
||||
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_CARRION_BEETLES, true);
|
||||
@ -280,7 +404,7 @@ class spell_azjol_nerub_carrion_beetels : public AuraScript
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_azjol_nerub_carrion_beetels::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_azjol_nerub_carrion_beetles::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
@ -288,7 +412,7 @@ class spell_azjol_nerub_pound : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_azjol_nerub_pound);
|
||||
|
||||
void HandleApplyAura(SpellEffIndex /*effIndex*/)
|
||||
void HandleApplyAura(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Unit* unitTarget = GetHitUnit())
|
||||
GetCaster()->CastSpell(unitTarget, SPELL_POUND_DAMAGE, true);
|
||||
@ -320,8 +444,8 @@ class spell_azjol_nerub_impale_summon : public SpellScript
|
||||
|
||||
void AddSC_boss_anub_arak()
|
||||
{
|
||||
new boss_anub_arak();
|
||||
RegisterSpellScript(spell_azjol_nerub_carrion_beetels);
|
||||
RegisterAzjolNerubCreatureAI(boss_anub_arak);
|
||||
RegisterSpellScript(spell_azjol_nerub_carrion_beetles);
|
||||
RegisterSpellScript(spell_azjol_nerub_pound);
|
||||
RegisterSpellScript(spell_azjol_nerub_impale_summon);
|
||||
}
|
||||
|
||||
@ -25,17 +25,18 @@
|
||||
|
||||
DoorData const doorData[] =
|
||||
{
|
||||
{ GO_KRIKTHIR_DOORS, DATA_KRIKTHIR, DOOR_TYPE_PASSAGE },
|
||||
{ GO_ANUBARAK_DOORS1, DATA_ANUBARAK_EVENT, DOOR_TYPE_ROOM },
|
||||
{ GO_ANUBARAK_DOORS2, DATA_ANUBARAK_EVENT, DOOR_TYPE_ROOM },
|
||||
{ GO_ANUBARAK_DOORS3, DATA_ANUBARAK_EVENT, DOOR_TYPE_ROOM },
|
||||
{ 0, 0, DOOR_TYPE_ROOM }
|
||||
{ GO_KRIKTHIR_DOORS, DATA_KRIKTHIR, DOOR_TYPE_PASSAGE },
|
||||
{ GO_ANUBARAK_DOORS1, DATA_ANUBARAK, DOOR_TYPE_ROOM },
|
||||
{ GO_ANUBARAK_DOORS2, DATA_ANUBARAK, DOOR_TYPE_ROOM },
|
||||
{ GO_ANUBARAK_DOORS3, DATA_ANUBARAK, DOOR_TYPE_ROOM },
|
||||
{ 0, 0, DOOR_TYPE_ROOM }
|
||||
};
|
||||
|
||||
ObjectData const creatureData[] =
|
||||
{
|
||||
{ NPC_KRIKTHIR_THE_GATEWATCHER, DATA_KRIKTHIR },
|
||||
{ NPC_HADRONOX, DATA_HADRONOX },
|
||||
{ NPC_ANUBARAK, DATA_ANUBARAK },
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
@ -53,7 +54,7 @@ BossBoundaryData const boundaries =
|
||||
{
|
||||
{ DATA_KRIKTHIR, new RectangleBoundary(400.0f, 580.0f, 623.5f, 810.0f) },
|
||||
{ DATA_HADRONOX, new ZRangeBoundary(666.0f, 776.0f) },
|
||||
{ DATA_ANUBARAK_EVENT, new CircleBoundary(Position(550.6178f, 253.5917f), 26.0f) }
|
||||
{ DATA_ANUBARAK, new CircleBoundary(Position(550.6178f, 253.5917f), 32.0f) }
|
||||
};
|
||||
|
||||
class instance_azjol_nerub : public InstanceMapScript
|
||||
|
||||
@ -205,9 +205,7 @@ struct boss_volkhan : public BossAI
|
||||
me->SetOrientation(2.19f);
|
||||
|
||||
// and client
|
||||
WorldPacket data;
|
||||
me->BuildHeartBeatMsg(&data);
|
||||
me->SendMessageToSet(&data, false);
|
||||
me->SendMovementFlagUpdate(false);
|
||||
me->SetControlled(true, UNIT_STATE_ROOT);
|
||||
}
|
||||
else
|
||||
|
||||
@ -389,7 +389,7 @@ public:
|
||||
Talk(SAY_BRANN_ESCORT_START);
|
||||
me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->SetRegeneratingHealth(false);
|
||||
me->SetRegeneratingHealth(true);
|
||||
break;
|
||||
case ACTION_START_TRIBUNAL:
|
||||
{
|
||||
@ -616,15 +616,8 @@ public:
|
||||
{
|
||||
if (!canExecuteEvents)
|
||||
return;
|
||||
uint32 Time = 40000 - (2500 * WaveNum);
|
||||
SummonCreatures(NPC_DARK_RUNE_PROTECTOR, 3, 0);
|
||||
if (WaveNum > 2)
|
||||
events.ScheduleEvent(EVENT_SUMMON_STORMCALLER, Seconds(urand(10 - WaveNum, 15 - WaveNum)));
|
||||
if (WaveNum > 5)
|
||||
events.ScheduleEvent(EVENT_SUMMON_CUSTODIAN, Seconds(urand(10 - WaveNum, 15 - WaveNum)));
|
||||
|
||||
WaveNum++;
|
||||
events.Repeat(Milliseconds(Time));
|
||||
events.Repeat(IsHeroic() ? 23500ms : 32500ms);
|
||||
break;
|
||||
}
|
||||
case EVENT_SUMMON_STORMCALLER:
|
||||
@ -633,7 +626,7 @@ public:
|
||||
return;
|
||||
|
||||
SummonCreatures(NPC_DARK_RUNE_STORMCALLER, 2, 1);
|
||||
|
||||
events.Repeat(IsHeroic() ? 32s : 41500ms);
|
||||
break;
|
||||
}
|
||||
case EVENT_SUMMON_CUSTODIAN:
|
||||
@ -642,7 +635,7 @@ public:
|
||||
return;
|
||||
|
||||
SummonCreatures(NPC_IRON_GOLEM_CUSTODIAN, 1, 1);
|
||||
|
||||
events.Repeat(IsHeroic() ? 32s : 45s);
|
||||
break;
|
||||
}
|
||||
case EVENT_TRIBUNAL_END:
|
||||
@ -836,17 +829,14 @@ void brann_bronzebeard::brann_bronzebeardAI::InitializeEvent()
|
||||
Creature* cr = nullptr;
|
||||
if ((cr = me->SummonCreature(NPC_KADDRAK, 923.7f, 326.9f, 219.5f, 2.1f, TEMPSUMMON_TIMED_DESPAWN, 580000)))
|
||||
{
|
||||
cr->SetInCombatWithZone();
|
||||
KaddrakGUID = cr->GetGUID();
|
||||
}
|
||||
if ((cr = me->SummonCreature(NPC_MARNAK, 895.974f, 363.571f, 219.337f, 5.5f, TEMPSUMMON_TIMED_DESPAWN, 580000)))
|
||||
{
|
||||
cr->SetInCombatWithZone();
|
||||
MarnakGUID = cr->GetGUID();
|
||||
}
|
||||
if ((cr = me->SummonCreature(NPC_ABEDNEUM, 892.25f, 331.25f, 223.86f, 0.6f, TEMPSUMMON_TIMED_DESPAWN, 580000)))
|
||||
{
|
||||
cr->SetInCombatWithZone();
|
||||
AbedneumGUID = cr->GetGUID();
|
||||
}
|
||||
|
||||
@ -859,8 +849,9 @@ void brann_bronzebeard::brann_bronzebeardAI::InitializeEvent()
|
||||
events.ScheduleEvent(EVENT_MARNAK_VISUAL, 105s);
|
||||
events.ScheduleEvent(EVENT_ABEDNEUM_VISUAL, 207s);
|
||||
|
||||
// Fight
|
||||
events.ScheduleEvent(EVENT_SUMMON_MONSTERS, 47s);
|
||||
events.ScheduleEvent(EVENT_SUMMON_MONSTERS, 52s);
|
||||
events.ScheduleEvent(EVENT_SUMMON_STORMCALLER, 122s);
|
||||
events.ScheduleEvent(EVENT_SUMMON_CUSTODIAN, 228s);
|
||||
events.ScheduleEvent(EVENT_KADDRAK_HEAD, 47s);
|
||||
events.ScheduleEvent(EVENT_MARNAK_HEAD, 115s);
|
||||
events.ScheduleEvent(EVENT_ABEDNEUM_HEAD, 217s);
|
||||
@ -981,7 +972,6 @@ public:
|
||||
|
||||
void JustEngagedWith(Unit*) override
|
||||
{
|
||||
events.ScheduleEvent(EVENT_DRP_CHARGE, 10s);
|
||||
events.ScheduleEvent(EVENT_DRP_CLEAVE, 7s);
|
||||
}
|
||||
|
||||
@ -996,14 +986,6 @@ public:
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_DRP_CHARGE:
|
||||
{
|
||||
if (Unit* tgt = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
me->CastSpell(tgt, SPELL_DRP_CHARGE, false);
|
||||
|
||||
events.Repeat(10s);
|
||||
break;
|
||||
}
|
||||
case EVENT_DRP_CLEAVE:
|
||||
{
|
||||
me->CastSpell(me->GetVictim(), SPELL_DRP_CLEAVE, false);
|
||||
@ -1012,6 +994,14 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
if (Unit* victim = me->GetVictim())
|
||||
{
|
||||
if (!me->IsWithinMeleeRange(victim) && !me->HasUnitState(UNIT_STATE_CHARGING))
|
||||
{
|
||||
me->CastSpell(victim, SPELL_DRP_CHARGE, false);
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
@ -1095,7 +1085,7 @@ public:
|
||||
void JustEngagedWith(Unit*) override
|
||||
{
|
||||
events.ScheduleEvent(EVENT_IGC_CRUSH, 6s);
|
||||
events.ScheduleEvent(EVENT_IGC_GROUND_SMASH, 4s);
|
||||
events.ScheduleEvent(EVENT_IGC_GROUND_SMASH, 20s);
|
||||
}
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
@ -1117,7 +1107,7 @@ public:
|
||||
case EVENT_IGC_GROUND_SMASH:
|
||||
{
|
||||
me->CastSpell(me->GetVictim(), SPELL_IGC_GROUND_SMASH, false);
|
||||
events.Repeat(5s);
|
||||
events.Repeat(20s, 40s);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user