diff --git a/data/sql/updates/pending_db_world/rev_1760735142745843700.sql b/data/sql/updates/pending_db_world/rev_1760735142745843700.sql new file mode 100644 index 000000000..218ca40a9 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1760735142745843700.sql @@ -0,0 +1,93 @@ +-- +UPDATE `creature_template` SET `unit_flags` = `unit_flags`|64|256|512|32768|33554432, `ScriptName` = '' WHERE `entry` IN (28961, 28965, 30980, 30982); + +DELETE FROM `areatrigger_scripts` WHERE `entry` IN (5082, 5083, 5084); +INSERT INTO `areatrigger_scripts` (`entry`, `ScriptName`) VALUES +(5082, 'at_hol_hall_of_watchers'), +(5083, 'at_hol_hall_of_watchers'), +(5084, 'at_hol_hall_of_watchers'); + +DELETE FROM `creature_template_addon` WHERE `entry` IN (28965, 28961, 30980, 30982); +INSERT INTO `creature_template_addon` (`entry`,`path_id`,`bytes1`,`mount`,`auras`) VALUES +(28965, 0, 0, 0, '52881'), -- 28965 - 16245, 52881 +(28961, 0, 0, 0, '52898'), -- 28961 - 16245, 52898 +(30980, 0, 0, 0, '52898'), +(30982, 0, 0, 0, '52881'); + +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 28961; + +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 28961); +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 +(28961, 0, 0, 0, 0, 0, 100, 0, 10000, 25000, 10000, 25000, 0, 0, 11, 23600, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Titanium Siegebreaker - In Combat - Cast \'Piercing Howl\''), +(28961, 0, 1, 0, 0, 0, 100, 0, 5000, 10000, 5000, 10000, 0, 0, 11, 52890, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Titanium Siegebreaker - In Combat - Cast \'Penetrating Strike\''), +(28961, 0, 2, 0, 0, 0, 100, 0, 12000, 12000, 12000, 12000, 0, 0, 11, 52891, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Titanium Siegebreaker - In Combat - Cast \'Blade Turning\''), +(28961, 0, 3, 9, 2, 0, 100, 1, 0, 2, 1000, 1000, 0, 0, 11, 19134, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Titanium Siegebreaker - Between 0-2% Health - Cast \'Frightening Shout\' (No Repeat)'), +(28961, 0, 4, 0, 37, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 16245, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Titanium Siegebreaker - On Initialize - Cast \'Freeze Anim\''), +(28961, 0, 5, 6, 72, 0, 100, 0, 0, 0, 0, 0, 0, 0, 19, 768, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Titanium Siegebreaker - On Action 0 Done - Remove Flags Immune To Players & Immune To NPC\'s'), +(28961, 0, 6, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 28, 16245, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Titanium Siegebreaker - On Action 0 Done - Remove Aura \'Freeze Anim\''), +(28961, 0, 7, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 19, 256, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Titanium Siegebreaker - On Evade - Remove Flags Immune To Players'), +(28961, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 42, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Titanium Siegebreaker - On Reset - Set Invincibility Hp 1%'), +(28961, 0, 9, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 37, 500, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Titanium Siegebreaker - Between 0-2% Health - Kill Self (No Repeat)'); + +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 28965; + +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 28965); +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 +(28965, 0, 0, 0, 0, 0, 100, 0, 10000, 25000, 10000, 25000, 0, 0, 11, 52904, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Titanium Thunderer - In Combat - Cast \'Throw\''), +(28965, 0, 1, 0, 0, 0, 100, 0, 15000, 30000, 15000, 30000, 0, 0, 11, 52885, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Titanium Thunderer - In Combat - Cast \'Deadly Throw\''), +(28965, 0, 2, 0, 0, 0, 100, 0, 15000, 15000, 15000, 15000, 0, 0, 11, 52879, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Titanium Thunderer - In Combat - Cast \'Deflection\''), +(28965, 0, 3, 0, 37, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 16245, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Titanium Thunderer - On Initialize - Cast \'Freeze Anim\''), +(28965, 0, 4, 5, 72, 0, 100, 0, 0, 0, 0, 0, 0, 0, 19, 768, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Titanium Thunderer - On Action 0 Done - Remove Flags Immune To Players & Immune To NPC\'s'), +(28965, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 28, 16245, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Titanium Thunderer - On Action 0 Done - Remove Aura \'Freeze Anim\''), +(28965, 0, 6, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 19, 256, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Titanium Thunderer - On Evade - Remove Flags Immune To Players'); + +SET @CGUID := 52885; +DELETE FROM `creature` WHERE `id1` IN (28961, 28965); +DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+30; +INSERT INTO `creature` (`guid`, `id1`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `VerifiedBuild`) VALUES +(@CGUID+0, 28961, 602, 4272, 4272, 3, 1, 1, 1259.378173828125, -145.273757934570312, 52.29970932006835937, 4.834561824798583984, 7200, 0, 0, 6285, 0, 0, 0, 0, 0, 63834), +(@CGUID+1, 28961, 602, 4272, 4272, 3, 1, 1, 1264.5328369140625, -145.5595703125, 52.26771926879882812, 4.764749050140380859, 7200, 0, 0, 5802, 0, 0, 0, 0, 0, 63834), +(@CGUID+2, 28965, 602, 4272, 4272, 3, 1, 1, 1224.5123291015625, -145.291229248046875, 52.67881393432617187, 4.694935798645019531, 7200, 0, 0, 6285, 0, 0, 0, 0, 0, 63834), +(@CGUID+3, 28961, 602, 4272, 4272, 3, 1, 1, 1215.1031494140625, -145.157012939453125, 52.66891098022460937, 4.764749050140380859, 7200, 0, 0, 6285, 0, 0, 0, 0, 0, 63834), +(@CGUID+4, 28965, 602, 4272, 4272, 3, 1, 1, 1263.8841552734375, -183.708663940429687, 52.27320098876953125, 1.605702877044677734, 7200, 0, 0, 5802, 0, 0, 0, 0, 0, 63834), +(@CGUID+5, 28965, 602, 4272, 4272, 3, 1, 1, 1259.0084228515625, -183.691726684570312, 52.26767730712890625, 1.605702877044677734, 7200, 0, 0, 5802, 0, 0, 0, 0, 0, 63834), +(@CGUID+6, 28961, 602, 4272, 4272, 3, 1, 1, 1225.5767822265625, -184.354385375976562, 52.68161392211914062, 1.65806281566619873, 7200, 0, 0, 6285, 0, 0, 0, 0, 0, 63834), +(@CGUID+7, 28961, 602, 4272, 4272, 3, 1, 1, 1248.0032958984375, -145.068801879882812, 52.37061309814453125, 4.694935798645019531, 7200, 0, 0, 5802, 0, 0, 0, 0, 0, 63834), +(@CGUID+8, 28965, 602, 4272, 4272, 3, 1, 1, 1253.1517333984375, -183.504989624023437, 52.34642791748046875, 1.623156189918518066, 7200, 0, 0, 6285, 0, 0, 0, 0, 0, 63834), +(@CGUID+9, 28965, 602, 4272, 4272, 3, 1, 1, 1253.5120849609375, -145.027999877929687, 52.33613204956054687, 4.694935798645019531, 7200, 0, 0, 6285, 0, 0, 0, 0, 0, 63834), +(@CGUID+10, 28961, 602, 4272, 4272, 3, 1, 1, 1248.0181884765625, -183.460174560546875, 52.38129043579101562, 1.570796370506286621, 7200, 0, 0, 5802, 0, 0, 0, 0, 0, 63834), +(@CGUID+11, 28965, 602, 4272, 4272, 3, 1, 1, 1220.2291259765625, -145.243927001953125, 52.66761016845703125, 4.764749050140380859, 7200, 0, 0, 6285, 0, 0, 0, 0, 0, 63834), +(@CGUID+12, 28965, 602, 4272, 4272, 3, 1, 1, 1181.0302734375, -146.033523559570312, 52.79578399658203125, 4.729842185974121093, 7200, 0, 0, 6285, 0, 0, 0, 0, 0, 63834), +(@CGUID+13, 28961, 602, 4272, 4272, 3, 1, 1, 1209.4744873046875, -144.967559814453125, 52.67555618286132812, 4.677482128143310546, 7200, 0, 0, 5802, 0, 0, 0, 0, 0, 63834), +(@CGUID+14, 28965, 602, 4272, 4272, 3, 1, 1, 1162.207763671875, -154.09527587890625, 52.79578399658203125, 0, 7200, 0, 0, 5802, 0, 0, 0, 0, 0, 63834), +(@CGUID+15, 28961, 602, 4272, 4272, 3, 1, 1, 1157.05712890625, -199.659942626953125, 52.46372222900390625, 0.03490658476948738, 7200, 0, 0, 6285, 0, 0, 0, 0, 0, 63834), +(@CGUID+16, 28965, 602, 4272, 4272, 3, 1, 1, 1156.6702880859375, -205.869796752929687, 52.49854278564453125, 6.2657318115234375, 7200, 0, 0, 6285, 0, 0, 0, 0, 0, 63834), +(@CGUID+17, 28961, 602, 4272, 4272, 3, 1, 1, 1219.8778076171875, -184.285049438476562, 52.66225814819335937, 1.692969322204589843, 7200, 0, 0, 6285, 0, 0, 0, 0, 0, 63834), +(@CGUID+18, 28961, 602, 4272, 4272, 3, 1, 1, 1175.3406982421875, -146.038192749023437, 52.79578781127929687, 4.660028934478759765, 7200, 0, 0, 5802, 0, 0, 0, 0, 0, 63834), +(@CGUID+19, 28961, 602, 4272, 4272, 3, 1, 1, 1191.956298828125, -212.037765502929687, 52.10306549072265625, 3.228859186172485351, 7200, 0, 0, 5802, 0, 0, 0, 0, 0, 63834), +(@CGUID+20, 28965, 602, 4272, 4272, 3, 1, 1, 1170.35205078125, -145.817596435546875, 52.79578781127929687, 4.764749050140380859, 7200, 0, 0, 5802, 0, 0, 0, 0, 0, 63834), +(@CGUID+21, 28961, 602, 4272, 4272, 3, 1, 1, 1192.097412109375, -206.172744750976562, 52.09882354736328125, 3.246312379837036132, 7200, 0, 0, 5802, 0, 0, 0, 0, 0, 63834), +(@CGUID+22, 28961, 602, 4272, 4272, 3, 1, 1, 1191.9901123046875, -218.161788940429687, 52.5872344970703125, 3.176499128341674804, 7200, 0, 0, 6285, 0, 0, 0, 0, 0, 63834), +(@CGUID+23, 28965, 602, 4272, 4272, 3, 1, 1, 1213.839599609375, -184.1123046875, 52.65846633911132812, 1.675516128540039062, 7200, 0, 0, 6285, 0, 0, 0, 0, 0, 63834), +(@CGUID+24, 28961, 602, 4272, 4272, 3, 1, 1, 1162.1590576171875, -159.638992309570312, 52.79578781127929687, 0, 7200, 0, 0, 6285, 0, 0, 0, 0, 0, 63834), +(@CGUID+25, 28965, 602, 4272, 4272, 3, 1, 1, 1156.6553955078125, -212.220382690429687, 52.53575897216796875, 6.2657318115234375, 7200, 0, 0, 6285, 0, 0, 0, 0, 0, 63834), +(@CGUID+26, 28961, 602, 4272, 4272, 3, 1, 1, 1162.192138671875, -165.84429931640625, 52.79578781127929687, 0.05235987901687622, 7200, 0, 0, 5802, 0, 0, 0, 0, 0, 63834), +(@CGUID+27, 28965, 602, 4272, 4272, 3, 1, 1, 1156.8057861328125, -218.583663940429687, 52.55777740478515625, 0.03490658476948738, 7200, 0, 0, 6285, 0, 0, 0, 0, 0, 63834), +(@CGUID+28, 28961, 602, 4272, 4272, 3, 1, 1, 1209.2860107421875, -184.312179565429687, 52.66295242309570312, 1.640609502792358398, 7200, 0, 0, 5802, 0, 0, 0, 0, 0, 63834), +(@CGUID+29, 28965, 602, 4272, 4272, 3, 1, 1, 1186.61962890625, -146.100265502929687, 52.79578781127929687, 4.764749050140380859, 7200, 0, 0, 6285, 0, 0, 0, 0, 0, 63834), +(@CGUID+30, 28965, 602, 4272, 4272, 3, 1, 1, 1162.243896484375, -171.8046875, 52.79578399658203125, 0, 7200, 0, 0, 6285, 0, 0, 0, 0, 0, 63834); + +DELETE FROM `spell_proc_event` WHERE `entry` = 52881; +INSERT INTO `spell_proc_event` (`entry`, `procEx`, `Cooldown`) VALUES +(52881, 0x00000020, 12000); + +UPDATE `spell_proc_event` SET `Cooldown` = 6000 WHERE `entry` = 52898; + +DELETE FROM `spelldifficulty_dbc` WHERE `ID` IN (52891, 52885, 52879, 52904); +INSERT INTO `spelldifficulty_dbc` (`ID`, `DifficultySpellID_1`, `DifficultySpellID_2`, `DifficultySpellID_3`, `DifficultySpellID_4`) VALUES +(52891, 52891, 59173, 0, 0), -- Blade Turning +(52885, 52885, 59180, 0, 0), -- Deadly Throw +(52879, 52879, 59181, 0, 0), -- Deflection +(52904, 52904, 59179, 0, 0); -- Throw + +DELETE FROM `linked_respawn` WHERE `guid` IN (126835, 126837, 126838, 126839, 126840, 126841, 126843, 126844, 126846, 126847, 126849, 126850, 126851, 126852, 126853, 126854, 126855, 126856, 126857, 126860, 126862) AND `linkType` = 0; diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp index 2489020e5..30e110231 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp @@ -372,160 +372,8 @@ private: InstanceScript* m_pInstance; }; -enum monumentSpells -{ - SPELL_FREEZE_ANIM = 16245, - SPELL_AWAKEN = 52875, - - SPELL_PIERCING_HOWL = 23600, - SPELL_PENETRATING_STRIKE = 52890, - SPELL_FRIGHTENING_SHOUT = 19134, - SPELL_BLADE_TURNING_N = 52891, - SPELL_BLADE_TURNING_H = 59173, - - SPELL_DEADLY_THROW_N = 52885, - SPELL_DEADLY_THROW_H = 59180, - SPELL_DEFLECTION_N = 52879, - SPELL_DEFLECTION_H = 59181, - SPELL_THROW_N = 52904, - SPELL_THROW_H = 59179, -}; - -enum monumentEvents -{ - EVENT_PIERCING_HOWL = 1, - EVENT_PENETRATING_STRIKE = 2, - EVENT_FRIGHTENING_SHOUT = 3, - EVENT_BLADE_TURNING = 4, - - EVENT_DEADLY_THROW = 11, - EVENT_DEFLECTION = 12, - EVENT_THROW = 13, - - EVENT_UNFREEZE = 20, -}; - -struct npc_hol_monument : public ScriptedAI -{ - npc_hol_monument(Creature* creature) : ScriptedAI(creature) - { - _attackGUID.Clear(); - _isActive = urand(0, 1); - me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - me->CastSpell(me, SPELL_FREEZE_ANIM, true); - } - - void MoveInLineOfSight(Unit* who) override - { - if (_attackGUID) - ScriptedAI::MoveInLineOfSight(who); - else if (_isActive && who->IsPlayer()) - { - if ((who->GetPositionX() < me->GetPositionX() || who->GetPositionY() < -220.0f) && me->GetDistance2d(who) < 40) - { - _isActive = false; - _attackGUID = who->GetGUID(); - events.Reset(); - events.RescheduleEvent(EVENT_UNFREEZE, 5s); - } - } - } - - void JustEngagedWith(Unit*) override - { - events.Reset(); - if (me->GetEntry() == 28961) // NPC_TITANIUM_SIEGEBREAKER - { - events.ScheduleEvent(EVENT_PIERCING_HOWL, 10s, 25s); - events.ScheduleEvent(EVENT_PENETRATING_STRIKE, 5s, 10s); - events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 20s, 28s); - events.ScheduleEvent(EVENT_BLADE_TURNING, 12s); - } - else - { - events.ScheduleEvent(EVENT_THROW, 10s, 25s); - events.ScheduleEvent(EVENT_DEADLY_THROW, 15s, 30s); - events.ScheduleEvent(EVENT_DEFLECTION, 15s); - } - } - - void AttackStart(Unit* who) override - { - if (!_attackGUID || !_isActive) - return; - ScriptedAI::AttackStart(who); - } - - void UpdateAI(uint32 diff) override - { - if (!_isActive && !_attackGUID) - return; - - events.Update(diff); - uint32 eventId = events.ExecuteEvent(); - - if (eventId == EVENT_UNFREEZE) - { - me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - me->CastSpell(me, SPELL_AWAKEN, true); - me->RemoveAllAuras(); - _isActive = true; - if (Unit* target = ObjectAccessor::GetUnit(*me, _attackGUID)) - AttackStart(target); - return; - } - - //Return since we have no target or if we are disabled from fight - if (!UpdateVictim()) - return; - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (eventId) - { - case EVENT_PIERCING_HOWL: - me->CastSpell(me->GetVictim(), SPELL_PIERCING_HOWL, false); - events.Repeat(10s, 25s); - break; - case EVENT_PENETRATING_STRIKE: - me->CastSpell(me->GetVictim(), SPELL_PENETRATING_STRIKE, false); - events.Repeat(5s, 10s); - break; - case EVENT_FRIGHTENING_SHOUT: - me->CastSpell(me->GetVictim(), SPELL_FRIGHTENING_SHOUT, false); - events.Repeat(20s, 28s); - break; - case EVENT_BLADE_TURNING: - me->CastSpell(me->GetVictim(), me->GetMap()->IsHeroic() ? SPELL_BLADE_TURNING_H : SPELL_BLADE_TURNING_N, false); - events.Repeat(12s); - break; - case EVENT_THROW: - me->CastSpell(SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true, 0), me->GetMap()->IsHeroic() ? SPELL_THROW_H : SPELL_THROW_N, true); - events.Repeat(10s, 25s); - break; - case EVENT_DEADLY_THROW: - me->CastSpell(SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true, 0), me->GetMap()->IsHeroic() ? SPELL_DEADLY_THROW_H : SPELL_DEADLY_THROW_N, true); - events.Repeat(15s, 30s); - break; - case EVENT_DEFLECTION: - me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_DEFLECTION_H : SPELL_DEFLECTION_N, false); - events.Repeat(15s); - break; - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap events; - bool _isActive; - ObjectGuid _attackGUID; -}; - void AddSC_boss_volkhan() { RegisterHallOfLightningCreatureAI(boss_volkhan); RegisterHallOfLightningCreatureAI(npc_molten_golem); - RegisterHallOfLightningCreatureAI(npc_hol_monument); } diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h index 825d41d2d..99b3fecb8 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h @@ -45,10 +45,8 @@ enum HoLDataTypes enum HoLNPCs { - NPC_BJARNGRIM = 28586, - NPC_VOLKHAN = 28587, - NPC_IONAR = 28546, - NPC_LOKEN = 28923, + NPC_TITANIUM_THUNDERER = 28965, + NPC_TITANIUM_SIEGEBREAKER = 28961 }; enum HoLGOs @@ -58,6 +56,11 @@ enum HoLGOs GO_LOKEN_THRONE = 192654 }; +enum HoLActions +{ + ACTION_ACTIVATE_TITANIUM_VRYKUL, +}; + template inline AI* GetHallsOfLightningAI(T* obj) { diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp index a094fd69a..1341f31c0 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp @@ -15,8 +15,10 @@ * with this program. If not, see . */ +#include "AreaTriggerScript.h" #include "CreatureScript.h" #include "InstanceMapScript.h" +#include "Player.h" #include "ScriptedCreature.h" #include "halls_of_lightning.h" @@ -82,7 +84,52 @@ public: } }; +enum TitaniumHallwaySpells +{ + SPELL_FREEZE_ANIM = 16245, + SPELL_AWAKEN = 52875, +}; + +class at_hol_hall_of_watchers : public OnlyOnceAreaTriggerScript +{ +public: + at_hol_hall_of_watchers() : OnlyOnceAreaTriggerScript("at_hol_hall_of_watchers") {} + + bool _OnTrigger(Player* player, const AreaTrigger* /*at*/) override + { + std::list creatures; + player->GetCreatureListWithEntryInGrid(creatures, { NPC_TITANIUM_SIEGEBREAKER, NPC_TITANIUM_THUNDERER }, 50.0f); + creatures.remove_if([&](Creature const* creature) -> bool + { + return !player->IsWithinLOSInMap(creature) || !creature->HasAura(SPELL_FREEZE_ANIM); + }); + + if (creatures.empty()) + return false; + + Acore::Containers::RandomResize(creatures, urand(2, 4)); + + ObjectGuid target = player->GetGUID(); + + for (Creature* creature : creatures) + { + creature->SetHomePosition(player->GetPosition()); + creature->AI()->DoCastSelf(SPELL_AWAKEN); + creature->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); + + creature->m_Events.AddEventAtOffset([creature, target] { + creature->AI()->DoAction(ACTION_ACTIVATE_TITANIUM_VRYKUL); + if (Player* targetPlayer = ObjectAccessor::GetPlayer(*creature, target)) + creature->AI()->AttackStart(targetPlayer); + }, 5s); + } + + return false; + } +}; + void AddSC_instance_halls_of_lightning() { new instance_halls_of_lightning(); + new at_hol_hall_of_watchers(); }