Merge branch 'master' into Vmaps

This commit is contained in:
天鹭 2025-11-04 22:55:32 +08:00 committed by GitHub
commit 5e4c8001e1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 554 additions and 253 deletions

View 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';

View 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);

View 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

View 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));

View File

@ -1968,10 +1968,7 @@ void Player::UpdateCharmedAI()
Unit* target = GetVictim();
if (target)
{
SetInFront(target);
SendMovementFlagUpdate(true);
}
if (HasUnitState(UNIT_STATE_CASTING))
return;

View File

@ -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);

View File

@ -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))
{

View File

@ -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

View File

@ -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);
}

View File

@ -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

View File

@ -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

View File

@ -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;
}
}