Scripts/Zul'Aman: Rewrite Akil'zon (#31877)

(cherry picked from commit 05e43d76c325741a2e893026e30ab422432adb00)
This commit is contained in:
offl
2026-07-24 00:39:57 +02:00
committed by Shauren
parent 856a3771ee
commit 06b3f1888f
2 changed files with 653 additions and 94 deletions
@@ -0,0 +1,252 @@
--
SET @CGUID := 147490; -- 8
SET @SPAWN_GROUP_ID := 381; -- 4
-- Akil'zon
UPDATE `creature_template` SET `unit_flags2`=0x800 WHERE `entry`=23574;
UPDATE `creature_template_difficulty` SET `LevelScalingDeltaMin`=2, `LevelScalingDeltaMax`=2, `ContentTuningID`=1112, `StaticFlags1`=0x90880000, `StaticFlags2`=0x4C, `StaticFlags4`=0x510000, `VerifiedBuild`=68887 WHERE `Entry`=23574 AND `DifficultyID`=2;
DELETE FROM `creature_text` WHERE `CreatureID` = 23574;
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(23574,0,0,"I be da predator! You da prey...",14,0,100,0,0,12013,23235,0,"Akil'zon SAY_AGGRO"),
(23574,1,0,"Feed, me bruddahs!",14,0,100,0,0,12014,23931,0,"Akil'zon SAY_SUMMON"),
(23574,2,0,"All you be doin' is wastin' me time!",14,0,100,0,0,12016,23236,0,"Akil'zon SAY_BERSERK"),
(23574,3,0,"Ya got nothin'!",14,0,100,0,0,12017,23234,0,"Akil'zon SAY_SLAY_1"),
(23574,3,1,"Stop your cryin'!",14,0,100,0,0,12018,23233,0,"Akil'zon SAY_SLAY_2"),
(23574,4,0,"You can't... kill... me spirit!",14,0,100,0,0,12019,23232,0,"Akil'zon SAY_DEATH"),
(23574,5,0,"My eagles gonna bear your spirits to me. Your sacrifices not gonna be in vain....",14,0,100,0,0,12122,23307,0,"Akil'zon SAY_EVENT_1"),
(23574,5,1,"Your death gonna be quick, strangers. You shoulda never come to this place....",14,0,100,0,0,12123,23308,0,"Akil'zon SAY_EVENT_2"),
(23574,6,0,"An electrical storm appears!",41,0,100,0,0,0,23603,0,"Akil'zon EMOTE_STORM");
-- Soaring Eagle
UPDATE `creature_template` SET `ScriptName` = 'npc_soaring_eagle' WHERE `entry` = 24858;
UPDATE `creature_template_difficulty` SET `ContentTuningID`=1112, `StaticFlags1`=0x20080000, `VerifiedBuild`=68887 WHERE `Entry`=24858 AND `DifficultyID`=2;
DELETE FROM `creature` WHERE `id`=24858 AND `map`=568;
INSERT INTO `creature` (`guid`,`id`,`map`,`zoneId`,`areaId`,`spawnDifficulties`,`phaseId`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`wander_distance`,`currentwaypoint`,`MovementType`,`ScriptName`,`StringId`,`VerifiedBuild`) VALUES
(@CGUID+0,24858,568,0,0,'1,2',0,0,0,355.33228,1410.8638,91.63957,5.856256484985351562,259200,0,0,2,'',NULL,0),
(@CGUID+1,24858,568,0,0,'1,2',0,0,0,356.3942,1419.819,91.724396,4.567828655242919921,259200,0,0,0,'',NULL,0),
(@CGUID+2,24858,568,0,0,'1,2',0,0,0,369.08588,1378.0735,91.788025,0.423484355211257934,259200,0,0,2,'',NULL,0),
(@CGUID+3,24858,568,0,0,'1,2',0,0,0,362.54413,1379.9407,91.75828,5.741417884826660156,259200,0,0,0,'',NULL,0),
(@CGUID+4,24858,568,0,0,'1,2',0,0,0,396.04984,1398.6158,91.4911,4.309737205505371093,259200,0,0,2,'',NULL,0),
(@CGUID+5,24858,568,0,0,'1,2',0,0,0,394.63245,1394.0079,91.796165,1.772356867790222167,259200,0,0,0,'',NULL,0),
(@CGUID+6,24858,568,0,0,'1,2',0,0,0,385.94797,1430.2812,92.62734,3.174873828887939453,259200,0,0,2,'',NULL,0),
(@CGUID+7,24858,568,0,0,'1,2',0,0,0,381.91397,1433.9738,91.658966,6.053234577178955078,259200,0,0,0,'',NULL,0);
DELETE FROM `spawn_group_template` WHERE `groupId` BETWEEN @SPAWN_GROUP_ID+0 AND @SPAWN_GROUP_ID+3;
INSERT INTO `spawn_group_template` (`groupId`, `groupName`, `groupFlags`) VALUES
(@SPAWN_GROUP_ID+0,"Zul'Aman - Soaring Eagle Group 1",4),
(@SPAWN_GROUP_ID+1,"Zul'Aman - Soaring Eagle Group 2",4),
(@SPAWN_GROUP_ID+2,"Zul'Aman - Soaring Eagle Group 3",4),
(@SPAWN_GROUP_ID+3,"Zul'Aman - Soaring Eagle Group 4",4);
DELETE FROM `spawn_group` WHERE `spawnId` BETWEEN @CGUID+0 AND @CGUID+7 AND `spawnType` = 0;
INSERT INTO `spawn_group` (`groupId`, `spawnType`, `spawnId`) VALUES
(@SPAWN_GROUP_ID+0,0,@CGUID+0),
(@SPAWN_GROUP_ID+0,0,@CGUID+1),
(@SPAWN_GROUP_ID+1,0,@CGUID+2),
(@SPAWN_GROUP_ID+1,0,@CGUID+3),
(@SPAWN_GROUP_ID+2,0,@CGUID+4),
(@SPAWN_GROUP_ID+2,0,@CGUID+5),
(@SPAWN_GROUP_ID+3,0,@CGUID+6),
(@SPAWN_GROUP_ID+3,0,@CGUID+7);
DELETE FROM `waypoint_path` WHERE `PathId` IN ((@CGUID+0)*10,(@CGUID+2)*10,(@CGUID+4)*10,(@CGUID+6)*10);
INSERT INTO `waypoint_path` (`PathId`, `MoveType`, `Flags`, `Velocity`, `Comment`) VALUES
((@CGUID+0)*10, 1, 2, NULL, 'Migrated from refactor'),
((@CGUID+2)*10, 1, 2, NULL, 'Migrated from refactor'),
((@CGUID+4)*10, 1, 2, NULL, 'Migrated from refactor'),
((@CGUID+6)*10, 1, 2, NULL, 'Migrated from refactor');
DELETE FROM `waypoint_path_node` WHERE `PathId` IN ((@CGUID+0)*10,(@CGUID+2)*10,(@CGUID+4)*10,(@CGUID+6)*10);
INSERT INTO `waypoint_path_node` (`PathId`,`NodeId`,`PositionX`,`PositionY`,`PositionZ`,`Orientation`,`Delay`) VALUES
((@CGUID+0)*10,1,352.03665,1411.3475,91.7419,NULL,0),
((@CGUID+0)*10,2,352.768,1412.0295,91.7419,NULL,0),
((@CGUID+0)*10,3,389.26443,1394.4066,90.3169,NULL,0),
((@CGUID+0)*10,4,405.69748,1381.4075,90.3169,NULL,0),
((@CGUID+0)*10,5,418.16028,1383.2,90.3169,NULL,0),
((@CGUID+0)*10,6,415.5009,1387.942,90.3169,NULL,0),
((@CGUID+0)*10,7,399.76562,1414.877,90.3169,NULL,0),
((@CGUID+0)*10,8,380.8964,1424.8958,90.3169,NULL,0),
((@CGUID+0)*10,9,357.7345,1418.2468,90.3169,NULL,0),
((@CGUID+0)*10,10,342.5394,1404.734,90.3169,NULL,0),
((@CGUID+0)*10,11,343.50098,1395.6887,90.3169,NULL,0),
((@CGUID+0)*10,12,340.88748,1384.222,90.3169,NULL,0),
((@CGUID+0)*10,13,360.84256,1382.7749,90.3169,NULL,0),
((@CGUID+0)*10,14,369.62912,1388.5502,90.3169,NULL,0),
((@CGUID+0)*10,15,376.77408,1400.9977,90.3169,NULL,0),
((@CGUID+0)*10,16,388.67688,1423.4247,90.3169,NULL,0),
((@CGUID+0)*10,17,398.8929,1441.9341,90.3169,NULL,0),
((@CGUID+0)*10,18,382.19348,1437.8445,90.3169,NULL,0),
((@CGUID+0)*10,19,370.78647,1423.2487,90.3169,NULL,0),
((@CGUID+0)*10,20,356.91635,1397.7987,90.3169,NULL,0),
((@CGUID+0)*10,21,354.5165,1380.9031,90.3169,NULL,0),
((@CGUID+0)*10,22,395.601,1376.0145,90.3169,NULL,0),
((@CGUID+0)*10,23,422.74762,1384.6039,90.3169,NULL,0),
((@CGUID+0)*10,24,398.88052,1410.5187,90.3169,NULL,0),
((@CGUID+0)*10,25,382.2971,1424.7145,90.3169,NULL,0),
((@CGUID+0)*10,26,360.14865,1431.6875,90.3169,NULL,0),
((@CGUID+0)*10,27,345.7219,1422.5363,90.3169,NULL,0),
((@CGUID+0)*10,28,345.66623,1416.4381,90.3169,NULL,0),
((@CGUID+0)*10,29,389.26443,1394.4066,90.3169,NULL,0),
((@CGUID+0)*10,30,405.69748,1381.4075,90.3169,NULL,0),
((@CGUID+2)*10,1,367.06046,1376.0284,91.747284,NULL,0),
((@CGUID+2)*10,2,366.48688,1376.8475,91.747284,NULL,0),
((@CGUID+2)*10,3,402.18002,1393.9266,92.29734,NULL,0),
((@CGUID+2)*10,4,405.5344,1407.2664,92.29734,NULL,0),
((@CGUID+2)*10,5,391.50912,1426.6482,92.29734,NULL,0),
((@CGUID+2)*10,6,384.56445,1434.1189,92.29734,NULL,0),
((@CGUID+2)*10,7,357.36685,1441.9121,92.29734,NULL,0),
((@CGUID+2)*10,8,351.07693,1440.2948,92.29734,NULL,0),
((@CGUID+2)*10,9,329.53537,1422.8164,92.29734,NULL,0),
((@CGUID+2)*10,10,331.16852,1411.1921,92.29734,NULL,0),
((@CGUID+2)*10,11,352.1847,1384.4667,92.29734,NULL,0),
((@CGUID+2)*10,12,394.28995,1393.1965,92.29734,NULL,0),
((@CGUID+2)*10,13,410.53754,1400.7565,92.29734,NULL,0),
((@CGUID+2)*10,14,397.51172,1432.3961,92.29734,NULL,0),
((@CGUID+2)*10,15,351.6988,1433.4469,92.29734,NULL,0),
((@CGUID+2)*10,16,335.5918,1438.5464,92.29734,NULL,0),
((@CGUID+2)*10,17,328.19498,1434.6647,92.29734,NULL,0),
((@CGUID+2)*10,18,319.32867,1429.3776,92.29734,NULL,0),
((@CGUID+2)*10,19,329.76138,1413.6876,92.29734,NULL,0),
((@CGUID+2)*10,20,365.2091,1407.883,92.29734,NULL,0),
((@CGUID+2)*10,21,402.18002,1393.9266,92.29734,NULL,0),
((@CGUID+2)*10,22,405.5344,1407.2664,92.29734,NULL,0),
((@CGUID+4)*10,1,396.47882,1402.0371,91.81095,NULL,0),
((@CGUID+4)*10,2,397.27747,1401.4353,91.81095,NULL,0),
((@CGUID+4)*10,3,387.03668,1381.7903,89.69339,NULL,0),
((@CGUID+4)*10,4,370.12805,1370.0513,89.69339,NULL,0),
((@CGUID+4)*10,5,359.64487,1373.1759,89.69339,NULL,0),
((@CGUID+4)*10,6,350.18198,1386.6072,89.69339,NULL,0),
((@CGUID+4)*10,7,345.56348,1402.6711,89.69339,NULL,0),
((@CGUID+4)*10,8,355.46756,1424.0919,89.69339,NULL,0),
((@CGUID+4)*10,9,367.25217,1433.9203,89.69339,NULL,0),
((@CGUID+4)*10,10,373.7067,1438.8328,89.69339,NULL,0),
((@CGUID+4)*10,11,386.6186,1435.4559,89.69339,NULL,0),
((@CGUID+4)*10,12,405.42404,1418.889,89.69339,NULL,0),
((@CGUID+4)*10,13,410.99643,1390.823,89.69339,NULL,0),
((@CGUID+4)*10,14,397.09592,1382.1975,89.69339,NULL,0),
((@CGUID+4)*10,15,376.45215,1393.8619,89.69339,NULL,0),
((@CGUID+4)*10,16,356.00858,1404.278,89.69339,NULL,0),
((@CGUID+4)*10,17,344.35168,1416.3293,89.69339,NULL,0),
((@CGUID+4)*10,18,351.9594,1439.8646,89.69339,NULL,0),
((@CGUID+4)*10,19,353.33682,1441.8173,89.69339,NULL,0),
((@CGUID+4)*10,20,368.85004,1445.7336,89.69339,NULL,0),
((@CGUID+4)*10,21,381.1107,1440.9076,89.69339,NULL,0),
((@CGUID+4)*10,22,392.25012,1433.5304,89.69339,NULL,0),
((@CGUID+4)*10,23,388.21756,1408.2224,89.69339,NULL,0),
((@CGUID+4)*10,24,378.6734,1393.3729,89.69339,NULL,0),
((@CGUID+4)*10,25,368.74435,1377.1985,89.69339,NULL,0),
((@CGUID+4)*10,26,358.59244,1357.8248,89.69339,NULL,0),
((@CGUID+4)*10,27,352.95963,1373.3104,89.69339,NULL,0),
((@CGUID+4)*10,28,354.78592,1394.457,89.69339,NULL,0),
((@CGUID+4)*10,29,362.43695,1408.394,89.69339,NULL,0),
((@CGUID+4)*10,30,379.70877,1427.434,89.69339,NULL,0),
((@CGUID+4)*10,31,392.25433,1431.5131,89.69339,NULL,0),
((@CGUID+4)*10,32,402.16602,1427.8239,89.69339,NULL,0),
((@CGUID+4)*10,33,387.03668,1381.7903,89.69339,NULL,0),
((@CGUID+4)*10,34,370.12805,1370.0513,89.69339,NULL,0),
((@CGUID+6)*10,1,389.7559,1429.5692,91.704124,NULL,0),
((@CGUID+6)*10,2,389.15408,1430.3678,91.704124,NULL,0),
((@CGUID+6)*10,3,364.2945,1429.2323,99.35547,NULL,0),
((@CGUID+6)*10,4,385.5457,1429.0762,97.52219,NULL,0),
((@CGUID+6)*10,5,403.14258,1412.2823,91.68882,NULL,0),
((@CGUID+6)*10,6,400.02182,1390.2379,91.68882,NULL,0),
((@CGUID+6)*10,7,376.41537,1384.655,94.605484,NULL,0),
((@CGUID+6)*10,8,359.02756,1371.6508,94.605484,NULL,0),
((@CGUID+6)*10,9,346.9107,1391.9337,94.605484,NULL,0),
((@CGUID+6)*10,10,341.37088,1418.3412,94.605484,NULL,0),
((@CGUID+6)*10,11,350.69977,1429.8486,94.605484,NULL,0),
((@CGUID+6)*10,12,370.01108,1435.0266,94.605484,NULL,0),
((@CGUID+6)*10,13,392.06976,1429.9241,94.605484,NULL,0),
((@CGUID+6)*10,14,386.54068,1408.4303,94.605484,NULL,0),
((@CGUID+6)*10,15,373.95096,1376.0957,94.605484,NULL,0),
((@CGUID+6)*10,16,357.72754,1363.8644,94.605484,NULL,0),
((@CGUID+6)*10,17,347.01358,1378.5763,94.605484,NULL,0),
((@CGUID+6)*10,18,347.7666,1389.9219,94.605484,NULL,0),
((@CGUID+6)*10,19,365.9999,1404.3414,94.605484,NULL,0),
((@CGUID+6)*10,20,383.0139,1413.7719,94.605484,NULL,0),
((@CGUID+6)*10,21,409.8304,1421.2222,94.605484,NULL,0),
((@CGUID+6)*10,22,401.74924,1445.9572,94.605484,NULL,0),
((@CGUID+6)*10,23,382.86514,1454.6213,94.605484,NULL,0),
((@CGUID+6)*10,24,365.86273,1452.1888,94.605484,NULL,0),
((@CGUID+6)*10,25,351.98242,1449.2568,94.605484,NULL,0),
((@CGUID+6)*10,26,334.17416,1440.2583,94.605484,NULL,0),
((@CGUID+6)*10,27,334.8176,1426.2494,94.605484,NULL,0),
((@CGUID+6)*10,28,345.3902,1406.333,94.605484,NULL,0),
((@CGUID+6)*10,29,362.73828,1394.9055,94.605484,NULL,0),
((@CGUID+6)*10,30,394.5153,1384.1464,94.605484,NULL,0),
((@CGUID+6)*10,31,419.7296,1377.4557,94.605484,NULL,0),
((@CGUID+6)*10,32,409.288,1407.1461,94.605484,NULL,0),
((@CGUID+6)*10,33,386.95444,1434.5723,94.605484,NULL,0),
((@CGUID+6)*10,34,349.70334,1440.1602,98.16106,NULL,0),
((@CGUID+6)*10,35,333.68912,1444.1354,100.02217,NULL,0),
((@CGUID+6)*10,36,312.27518,1440.3971,100.02216,NULL,0),
((@CGUID+6)*10,37,303.0779,1411.3394,97.49439,NULL,0),
((@CGUID+6)*10,38,321.6631,1412.2037,94.605484,NULL,0),
((@CGUID+6)*10,39,364.2945,1429.2323,99.35547,NULL,0),
((@CGUID+6)*10,40,385.5457,1429.0762,97.52219,NULL,0);
DELETE FROM `creature_addon` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+7;
INSERT INTO `creature_addon` (`guid`, `PathId`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `visibilityDistanceType`, `auras`) VALUES
(@CGUID+0,(@CGUID+0)*10,0,0,0,0,0,1,0,0,0,''),
(@CGUID+2,(@CGUID+2)*10,0,0,0,0,0,1,0,0,0,''),
(@CGUID+4,(@CGUID+4)*10,0,0,0,0,0,1,0,0,0,''),
(@CGUID+6,(@CGUID+6)*10,0,0,0,0,0,1,0,0,0,'');
DELETE FROM `creature_formations` WHERE `leaderGUID` BETWEEN @CGUID+0 AND @CGUID+7;
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
(@CGUID+0,@CGUID+0,0,0,0,0,0),
(@CGUID+0,@CGUID+1,5,0,512,0,0),
(@CGUID+2,@CGUID+2,0,0,0,0,0),
(@CGUID+2,@CGUID+3,5,0,512,0,0),
(@CGUID+4,@CGUID+4,0,0,0,0,0),
(@CGUID+4,@CGUID+5,5,0,512,0,0),
(@CGUID+6,@CGUID+6,0,0,0,0,0),
(@CGUID+6,@CGUID+7,5,0,512,0,0);
-- Amani Kidnapper
UPDATE `creature_template` SET `speed_run`=1.4285714285714285714285714285714, `VehicleId`=1612, `ScriptName` = 'npc_akilzon_amani_kidnapper' WHERE `entry` = 52638;
UPDATE `creature_template_difficulty` SET `ContentTuningID`=1112, `StaticFlags1`=0x20880006, `StaticFlags2`=0x8, `StaticFlags3`=0x10000000, `StaticFlags4`=0x400000, `VerifiedBuild`=68887 WHERE `Entry`=52638 AND `DifficultyID`=2;
DELETE FROM `creature_template_addon` WHERE `entry`=52638;
INSERT INTO `creature_template_addon` (`entry`, `AnimTier`) VALUES
(52638, 3);
DELETE FROM `waypoint_path` WHERE `PathId`=526380;
INSERT INTO `waypoint_path` (`PathId`, `MoveType`, `Flags`, `Velocity`, `Comment`) VALUES
(526380, 1, 2, 6.75, 'Amani Kidnapper - Cyclic');
DELETE FROM `waypoint_path_node` WHERE `PathId`=526380;
INSERT INTO `waypoint_path_node` (`PathId`,`NodeId`,`PositionX`,`PositionY`,`PositionZ`,`Orientation`,`Delay`) VALUES
(526380,0,360.25174,1422.9219,79.72605,NULL,0),
(526380,1,373.98438,1431.1823,79.85269,NULL,0),
(526380,2,395.0295,1425.8403,79.52386,NULL,0),
(526380,3,399.20486,1398.4219,79.31239,NULL,0),
(526380,4,390.6059,1390.1146,79.76962,NULL,0),
(526380,5,372.62674,1383.9062,79.27089,NULL,0),
(526380,6,354.83682,1397.5192,79.283394,NULL,0),
(526380,7,353.40973,1414.5608,79.529434,NULL,0);
-- Spell scripts
DELETE FROM `spell_script_names` WHERE `ScriptName` IN (
'spell_akilzon_eagle_swoop_primer',
'spell_akilzon_teleport_self',
'spell_akilzon_electrical_overload_primer',
'spell_akilzon_electrical_storm_damage',
'spell_akilzon_summon_amani_kidnapper',
'spell_akilzon_grab_passenger');
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(44733, 'spell_akilzon_eagle_swoop_primer'),
(44006, 'spell_akilzon_teleport_self'),
(44735, 'spell_akilzon_electrical_overload_primer'),
(43657, 'spell_akilzon_electrical_storm_damage'),
(97316, 'spell_akilzon_summon_amani_kidnapper'),
(98869, 'spell_akilzon_grab_passenger');
DELETE FROM `spell_linked_spell` WHERE `spell_trigger` IN (44007,44008);
UPDATE `serverside_spell_effect` SET `EffectBasePoints`=44732 WHERE `SpellID`=44733 AND `EffectIndex`=0;
@@ -15,27 +15,54 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* Combat timers requires to be revisited
* SAY_EVENT is NYI
*/
#include "ScriptMgr.h"
#include "Containers.h"
#include "GridNotifiers.h"
#include "InstanceScript.h"
#include "Map.h"
#include "MotionMaster.h"
#include "ScriptedCreature.h"
#include "SpellAuraEffects.h"
#include "SpellMgr.h"
#include "SpellScript.h"
#include "TemporarySummon.h"
#include "Weather.h"
#include "zulaman.h"
enum Spells
enum AkilzonTexts
{
SPELL_STATIC_DISRUPTION = 43622,
SPELL_STATIC_VISUAL = 45265,
SPELL_CALL_LIGHTNING = 43661, // Missing timer
SPELL_GUST_OF_WIND = 43621,
SPELL_ELECTRICAL_STORM = 43648,
SPELL_BERSERK = 45078,
SPELL_ELECTRICAL_OVERLOAD = 43658,
SPELL_EAGLE_SWOOP = 44732,
SPELL_ZAP = 43137,
SPELL_SAND_STORM = 25160,
SAY_AGGRO = 0,
SAY_SUMMON = 1,
SAY_BERSERK = 2,
SAY_SLAY = 3,
SAY_DEATH = 4,
SAY_EVENT = 5,
EMOTE_STORM = 6
};
enum AkilzonSpells
{
// Akil'zon
SPELL_GUST_OF_WIND = 43621,
SPELL_STATIC_DISRUPTION = 43622,
SPELL_CALL_LIGHTNING = 43661,
SPELL_ELECTRICAL_STORM = 44735,
SPELL_BERSERK = 45078,
// Soaring Eagle
SPELL_EAGLE_SWOOP = 44733,
// Amani Kidnapper
SPELL_GRAB_PASSENGER = 98869,
// Scripts
SPELL_ELECTRICAL_STORM_AURA = 44007,
SPELL_TELEPORT_SELF = 44006,
SPELL_ELECTRICAL_ARC_1 = 43653,
SPELL_ELECTRICAL_ARC_2 = 43654,
SPELL_ELECTRICAL_ARC_3 = 43655,
@@ -43,75 +70,303 @@ enum Spells
SPELL_ELECTRICAL_ARC_5 = 43659
};
enum Says
enum AkilzonEvents
{
SAY_AGGRO = 0,
SAY_PLAYER_KILL = 1,
EMOTE_ELECTRICAL_STORM = 2,
SAY_SUMMON_EAGLE = 3,
SAY_SUMMON_BIRDS = 4,
SAY_BERSERK = 5,
SAY_DEATH = 6
EVENT_GUST_OF_WIND = 1,
EVENT_STATIC_DISRUPTION,
EVENT_CALL_LIGHTNING,
EVENT_SUMMON_EAGLES,
EVENT_SET_WEATHER,
EVENT_SET_WEATHER_2,
EVENT_ELECTRICAL_STORM,
EVENT_BERSERK
};
class boss_akilzon : public CreatureScript
enum AkilzonMisc
{
public:
boss_akilzon() : CreatureScript("boss_akilzon") { }
SPAWN_GROUP_EAGLE_1 = 381,
SPAWN_GROUP_EAGLE_2 = 382,
SPAWN_GROUP_EAGLE_3 = 383,
SPAWN_GROUP_EAGLE_4 = 384,
AREA_ZULAMAN = 3805,
SOUND_EAGLE = 12196,
POINT_KIDNAPPER_PLAYER = 52638,
PATH_KIDNAPPER_CYCLIC = 526380
};
struct boss_akilzonAI : public BossAI
static constexpr std::array<uint32, 4> EagleSpawnGroupsData =
{
SPAWN_GROUP_EAGLE_1,
SPAWN_GROUP_EAGLE_2,
SPAWN_GROUP_EAGLE_3,
SPAWN_GROUP_EAGLE_4
};
// 23574 - Akil'zon
struct boss_akilzon : public BossAI
{
boss_akilzon(Creature* creature) : BossAI(creature, BOSS_AKILZON) { }
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_GUST_OF_WIND, 10s, 20s);
events.ScheduleEvent(EVENT_STATIC_DISRUPTION, 6s, 12s);
events.ScheduleEvent(EVENT_CALL_LIGHTNING, 5s, 15s);
events.ScheduleEvent(EVENT_SUMMON_EAGLES, 1min);
events.ScheduleEvent(EVENT_SET_WEATHER, 40s);
events.ScheduleEvent(EVENT_BERSERK, 10min);
}
void OnSpellCast(SpellInfo const* spellInfo) override
{
if (spellInfo->Id == SPELL_BERSERK)
Talk(SAY_BERSERK);
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
for (uint32 group : EagleSpawnGroupsData)
me->GetMap()->SpawnGroupDespawn(group);
// Guessed. What should we do?
me->GetMap()->SetZoneWeather(AREA_ZULAMAN, WEATHER_STATE_FINE, 0.0f);
_DespawnAtEvade();
}
void KilledUnit(Unit* /*who*/) override
{
Talk(SAY_SLAY);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
Talk(SAY_DEATH);
for (uint32 group : EagleSpawnGroupsData)
me->GetMap()->SpawnGroupDespawn(group);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
boss_akilzonAI(Creature* creature) : BossAI(creature, BOSS_AKILZON) { }
void Reset() override
switch (eventId)
{
_Reset();
case EVENT_GUST_OF_WIND:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 80.0f, true))
DoCast(target, SPELL_GUST_OF_WIND);
events.Repeat(10s, 25s);
break;
case EVENT_STATIC_DISRUPTION:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
DoCast(target, SPELL_STATIC_DISRUPTION);
events.Repeat(12s, 18s);
break;
case EVENT_CALL_LIGHTNING:
DoCastVictim(SPELL_CALL_LIGHTNING);
events.Repeat(5s, 25s);
break;
case EVENT_SUMMON_EAGLES:
Talk(SAY_SUMMON);
for (uint32 group : EagleSpawnGroupsData)
me->GetMap()->SpawnGroupSpawn(group, true);
events.Repeat(1min);
break;
case EVENT_SET_WEATHER:
me->GetMap()->SetZoneWeather(AREA_ZULAMAN, WEATHER_STATE_MEDIUM_RAIN, 0.75f);
events.Repeat(1min);
events.ScheduleEvent(EVENT_ELECTRICAL_STORM, 8500ms);
events.ScheduleEvent(EVENT_SET_WEATHER_2, 17s);
break;
case EVENT_SET_WEATHER_2:
me->GetMap()->SetZoneWeather(AREA_ZULAMAN, WEATHER_STATE_FOG, 0.0f);
break;
case EVENT_ELECTRICAL_STORM:
DoCastSelf(SPELL_ELECTRICAL_STORM);
break;
case EVENT_BERSERK:
DoCastSelf(SPELL_BERSERK);
break;
default:
break;
}
void JustEngagedWith(Unit* who) override
{
Talk(SAY_AGGRO);
BossAI::JustEngagedWith(who);
}
void JustDied(Unit* /*killer*/) override
{
Talk(SAY_DEATH);
_JustDied();
}
void KilledUnit(Unit* who) override
{
if (who->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_PLAYER_KILL);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
/*
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
default:
break;
}
}
*/
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetZulAmanAI<boss_akilzonAI>(creature);
}
}
};
// 24858 - Soaring Eagle
struct npc_soaring_eagle : public ScriptedAI
{
using ScriptedAI::ScriptedAI;
void InitializeAI() override
{
me->SetReactState(REACT_PASSIVE);
me->SetCorpseDelay(15, true);
ScriptedAI::InitializeAI();
}
void JustAppeared() override
{
_scheduler.Schedule(0s, 10s, [this](TaskContext& task)
{
DoPlaySoundToSet(me, SOUND_EAGLE);
DoCastSelf(SPELL_EAGLE_SWOOP);
task.Repeat(1s, 15s);
});
}
void UpdateAI(uint32 diff) override
{
_scheduler.Update(diff);
UpdateVictim();
}
private:
TaskScheduler _scheduler;
};
// 52638 - Amani Kidnapper
struct npc_akilzon_amani_kidnapper : public ScriptedAI
{
using ScriptedAI::ScriptedAI;
void IsSummonedBy(WorldObject* summoner) override
{
if (InstanceScript* instance = me->GetInstanceScript())
if (Creature* akilzon = instance->GetCreature(BOSS_AKILZON))
akilzon->AI()->JustSummoned(me);
me->SetReactState(REACT_PASSIVE);
me->SetCorpseDelay(5, true);
me->GetMotionMaster()->MovePoint(POINT_KIDNAPPER_PLAYER, summoner->GetPosition(), false);
}
void MovementInform(uint32 type, uint32 pointId) override
{
if (type != POINT_MOTION_TYPE || pointId != POINT_KIDNAPPER_PLAYER)
return;
if (TempSummon* summon = me->ToTempSummon())
if (Unit* summoner = summon->GetSummonerUnit())
DoCast(summoner, SPELL_GRAB_PASSENGER);
}
void PassengerBoarded(Unit* /*passenger*/, int8 /*seatId*/, bool apply) override
{
if (apply)
me->GetMotionMaster()->MovePath(PATH_KIDNAPPER_CYCLIC, true);
}
};
// 44733 - Eagle Swoop Primer
class spell_akilzon_eagle_swoop_primer : public SpellScript
{
bool Validate(SpellInfo const* spellInfo) override
{
return ValidateSpellInfo({ uint32(spellInfo->GetEffect(EFFECT_0).CalcValueAsInt()) });
}
void FilterTargets(std::list<WorldObject*>& targets)
{
Trinity::Containers::RandomResize(targets, 1);
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValueAsInt()), true);
}
void Register() override
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_akilzon_eagle_swoop_primer::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
OnEffectHitTarget += SpellEffectFn(spell_akilzon_eagle_swoop_primer::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
// 44735 - Electrical Overload Primer
class spell_akilzon_electrical_overload_primer : public SpellScript
{
bool Validate(SpellInfo const* spellInfo) override
{
return ValidateSpellInfo({ uint32(spellInfo->GetEffect(EFFECT_0).CalcValueAsInt()) });
}
void FilterTargets(std::list<WorldObject*>& targets)
{
Trinity::Containers::RandomResize(targets, 1);
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValueAsInt()));
}
void Register() override
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_akilzon_electrical_overload_primer::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
OnEffectHitTarget += SpellEffectFn(spell_akilzon_electrical_overload_primer::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
// 43658 - Electrical Overload Graphic Pulse
class spell_akilzon_electrical_overload : public SpellScript
{
bool Validate(SpellInfo const* spellInfo) override
{
return ValidateSpellInfo(
{
SPELL_ELECTRICAL_ARC_1,
SPELL_ELECTRICAL_ARC_2,
SPELL_ELECTRICAL_ARC_3,
SPELL_ELECTRICAL_ARC_4,
SPELL_ELECTRICAL_ARC_5
}) && ValidateSpellInfo({ spellInfo->GetEffect(EFFECT_1).TriggerSpell });
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
Unit* caster = GetCaster();
caster->CastSpell(nullptr, SPELL_ELECTRICAL_ARC_1, true);
caster->CastSpell(nullptr, SPELL_ELECTRICAL_ARC_2, true);
caster->CastSpell(nullptr, SPELL_ELECTRICAL_ARC_3, true);
caster->CastSpell(nullptr, SPELL_ELECTRICAL_ARC_4, true);
caster->CastSpell(nullptr, SPELL_ELECTRICAL_ARC_5, true);
}
void HandleEffect(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
SpellInfo const* damageSpellSpellInfo = sSpellMgr->AssertSpellInfo(GetEffectInfo().TriggerSpell, GetCastDifficulty());
if (SpellInfo const* triggeringSpellSpellInfo = GetTriggeringSpell())
if (AuraEffect const* eff = GetCaster()->GetAuraEffect(triggeringSpellSpellInfo->Id, EFFECT_1))
GetCaster()->CastSpell(nullptr, uint32(GetEffectInfo().TriggerSpell), CastSpellExtraArgs()
.SetTriggerFlags(TRIGGERED_FULL_MASK)
.AddSpellMod(SPELLVALUE_BASE_POINT0, eff->GetTickNumber() * damageSpellSpellInfo->GetEffect(EFFECT_0).CalcValue()));
}
void Register() override
{
OnEffectHit += SpellEffectFn(spell_akilzon_electrical_overload::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
OnEffectLaunch += SpellEffectFn(spell_akilzon_electrical_overload::HandleEffect, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL);
}
};
// 43648 - Electrical Storm
@@ -125,8 +380,16 @@ class spell_akilzon_electrical_storm : public SpellScript
void HandleAfterHit()
{
Unit* target = GetHitUnit();
target->CastSpell(target, SPELL_ELECTRICAL_STORM_AURA, true);
target->CastSpell(target, SPELL_TELEPORT_SELF, true);
if (Creature* caster = GetCaster()->ToCreature())
caster->AI()->Talk(EMOTE_STORM, target);
// this is a hack to ensure that DynamicObject granting SPELL_ELECTRICAL_STORM_AURA is only removed after damaging periodic fades
target->m_Events.AddEventAtOffset([target]
{
target->CastSpell(nullptr, SPELL_ELECTRICAL_STORM_AURA, true);
target->CastSpell(nullptr, SPELL_TELEPORT_SELF, true);
}, 100ms);
}
void Register() override
@@ -135,40 +398,84 @@ class spell_akilzon_electrical_storm : public SpellScript
}
};
// 43658 - Electrical Overload Graphic Pulse
class spell_akilzon_electrical_overload : public SpellScript
// 43657 - Electrical Storm
class spell_akilzon_electrical_storm_damage : public SpellScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo(
{
SPELL_ELECTRICAL_ARC_1,
SPELL_ELECTRICAL_ARC_2,
SPELL_ELECTRICAL_ARC_3,
SPELL_ELECTRICAL_ARC_4,
SPELL_ELECTRICAL_ARC_5
});
return ValidateSpellInfo({ SPELL_ELECTRICAL_STORM_AURA });
}
void HandleScript(SpellEffIndex /*effIndex*/)
void FilterTargets(std::list<WorldObject*>& targets)
{
Unit* caster = GetCaster();
caster->CastSpell(caster, SPELL_ELECTRICAL_ARC_1, true);
caster->CastSpell(caster, SPELL_ELECTRICAL_ARC_2, true);
caster->CastSpell(caster, SPELL_ELECTRICAL_ARC_3, true);
caster->CastSpell(caster, SPELL_ELECTRICAL_ARC_4, true);
caster->CastSpell(caster, SPELL_ELECTRICAL_ARC_5, true);
targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_ELECTRICAL_STORM_AURA));
}
void Register() override
{
OnEffectHit += SpellEffectFn(spell_akilzon_electrical_overload::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_akilzon_electrical_storm_damage::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
}
};
// 44006 - Teleport Self
class spell_akilzon_teleport_self : public SpellScript
{
void SetDest(SpellDestination& dest)
{
dest.RelocateOffset({ 0.0f, 0.0f, 10.0f, 0.0f });
}
void Register() override
{
OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_akilzon_teleport_self::SetDest, EFFECT_0, TARGET_DEST_CASTER);
}
};
// 97316 - Summon Amani Kidnapper
class spell_akilzon_summon_amani_kidnapper : public SpellScript
{
static void SetDest(SpellScript const&, SpellDestination& dest)
{
static constexpr Position Offset = { 0.0f, 0.0f, 30.0f, 0.0f };
dest.RelocateOffset(Offset);
}
void Register()
{
OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_akilzon_summon_amani_kidnapper::SetDest, EFFECT_0, TARGET_DEST_CASTER);
}
};
// 98869 - Grab Passenger
class spell_akilzon_grab_passenger : public SpellScript
{
bool Validate(SpellInfo const* spellInfo) override
{
return ValidateSpellInfo({ uint32(spellInfo->GetEffect(EFFECT_0).CalcValueAsInt()) });
}
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
{
GetHitUnit()->CastSpell(GetCaster(), GetEffectValueAsInt(), true);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_akilzon_grab_passenger::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
void AddSC_boss_akilzon()
{
new boss_akilzon();
RegisterSpellScript(spell_akilzon_electrical_storm);
RegisterZulAmanCreatureAI(boss_akilzon);
RegisterZulAmanCreatureAI(npc_soaring_eagle);
RegisterZulAmanCreatureAI(npc_akilzon_amani_kidnapper);
RegisterSpellScript(spell_akilzon_eagle_swoop_primer);
RegisterSpellScript(spell_akilzon_electrical_overload_primer);
RegisterSpellScript(spell_akilzon_electrical_overload);
RegisterSpellScript(spell_akilzon_electrical_storm);
RegisterSpellScript(spell_akilzon_electrical_storm_damage);
RegisterSpellScript(spell_akilzon_teleport_self);
RegisterSpellScript(spell_akilzon_summon_amani_kidnapper);
RegisterSpellScript(spell_akilzon_grab_passenger);
}