Scripts/ZA: implement Akil'zon encounter
This commit is contained in:
1 parent
1192d02373
commit
4494794c60
4 files changed
+699
-24
No files matched your search
@@ -0,0 +1,51 @@
|
||||
UPDATE `creature_template` SET `DamageModifier`= 120, `BaseVariance`= 0.5, `mechanic_immune_mask`= 650854271, `mingold`= 17000, `maxgold`= 23000 WHERE `entry`= 23574;
|
||||
UPDATE `creature_template` SET `ScriptName`= 'npc_akilzon_soaring_eagle', `mechanic_immune_mask`= 650854271 WHERE `entry`= 24858;
|
||||
UPDATE `creature_template` SET `speed_run`= 1.4285, `vehicleId`= 1612, `ScriptName`= 'npc_akilzon_amani_kidnapper', `mechanic_immune_mask`= 650854271, `flags_extra`= 256 WHERE `entry`= 52638;
|
||||
|
||||
DELETE FROM `spell_linked_spell` WHERE `spell_trigger` IN (44008, 43648, 44007, 43658);
|
||||
DELETE FROM `spell_script_names` WHERE `ScriptName` IN
|
||||
('spell_akilzon_electrical_storm',
|
||||
'spell_akilzon_teleport_self',
|
||||
'spell_akilzon_electrical_overloard_graphic_pulse',
|
||||
'spell_akilzon_electrical_storm_damage',
|
||||
'spell_akilzon_grab_passenger',
|
||||
'spell_akilzon_summon_amani_kidnapper');
|
||||
|
||||
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
|
||||
(43648, 'spell_akilzon_electrical_storm'),
|
||||
(44006, 'spell_akilzon_teleport_self'),
|
||||
(43658, 'spell_akilzon_electrical_overloard_graphic_pulse'),
|
||||
(43657, 'spell_akilzon_electrical_storm_damage'),
|
||||
(97300, 'spell_akilzon_electrical_storm_damage'),
|
||||
(98869, 'spell_akilzon_grab_passenger'),
|
||||
(97316, 'spell_akilzon_summon_amani_kidnapper');
|
||||
|
||||
DELETE FROM `creature_text` WHERE `CreatureID`= 23574;
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `comment`) VALUES
|
||||
(23574, 0, 0, 'I be da predator! You da prey...', 14, 0, 100, 0, 0, 12013, 23235, 'Akil\'zon to Player'),
|
||||
(23574, 1, 0, 'Feed, me bruddahs!', 14, 0, 100, 0, 0, 12014, 23931, 'Akil\'zon to Akil\'zon'),
|
||||
(23574, 2, 0, 'An electrical storm appears!', 41, 0, 100, 0, 0, 0, 23603, 'Akil\'zon to Player'),
|
||||
(23574, 3, 0, 'Stop your cryin\'!', 14, 0, 100, 0, 0, 0, 23233, 'Akil\'zon to Player'),
|
||||
(23574, 3, 1, 'Ya got nothin\'!', 14, 0, 100, 0, 0, 0, 23234, 'Akil\'zon to Player'),
|
||||
(23574, 4, 0, 'You can\'t... kill... me spirit!', 14, 0, 100, 0, 0, 12019, 23232, 'Akil\'zon to Player');
|
||||
|
||||
DELETE FROM `creature_template_movement` WHERE `CreatureId` IN (24858, 52638);
|
||||
INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Flight`) VALUES
|
||||
(24858, 2, 1),
|
||||
(52638, 1, 1);
|
||||
|
||||
DELETE FROM `creature` WHERE `guid` IN (291846, 291854, 291855, 291848, 291836, 291849, 291845, 291840, 291843, 291850, 291837, 291851, 291838, 291842, 291853, 291852);
|
||||
DELETE FROM `creature_addon` WHERE `guid` IN (291846, 291854, 291855, 291848, 291836, 291849, 291845, 291840, 291843, 291850, 291837, 291851, 291838, 291842, 291853, 291852);
|
||||
|
||||
DELETE FROM `reference_loot_template` WHERE `Entry`= 34150;
|
||||
DELETE FROM `creature_loot_template` WHERE `Entry`= 23574;
|
||||
INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`) VALUES
|
||||
(23574, 69551, 0, 0, 1, 1, 1, 1),
|
||||
(23574, 69552, 0, 0, 1, 1, 1, 1),
|
||||
(23574, 69549, 0, 0, 1, 1, 1, 1),
|
||||
(23574, 69550, 0, 0, 1, 1, 1, 1),
|
||||
(23574, 69553, 0, 0, 1, 1, 1, 1);
|
||||
|
||||
DELETE FROM `creature_onkill_reward` WHERE `creature_id`= 23574;
|
||||
INSERT INTO `creature_onkill_reward` (`creature_id`, `CurrencyId1`, `CurrencyCount1`, `RewOnKillRepFaction1`, `MaxStanding1`, `IsTeamAward1`, `RewOnKillRepValue1`, `TeamDependent`) VALUES
|
||||
(23574, 395, 7000, 1162, 7, 0, 250, 0);
|
||||
@@ -15,53 +15,322 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "CellImpl.h"
|
||||
#include "GridNotifiersImpl.h"
|
||||
#include "InstanceScript.h"
|
||||
#include "MotionMaster.h"
|
||||
#include "ObjectAccessor.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "TemporarySummon.h"
|
||||
#include "Weather.h"
|
||||
#include "zulaman.h"
|
||||
#include "InstanceScript.h"
|
||||
#include "ObjectAccessor.h"
|
||||
#include "PassiveAI.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "Spell.h"
|
||||
#include "SpellAuraEffects.h"
|
||||
#include "SpellScript.h"
|
||||
#include "SpellMgr.h"
|
||||
#include "Weather.h"
|
||||
|
||||
enum Texts
|
||||
{
|
||||
// Akil'zon
|
||||
SAY_AGGRO = 0,
|
||||
SAY_SUMMON_EAGLES = 1,
|
||||
SAY_ANNOUNCE_ELECTRICAL_STORM = 2,
|
||||
SAY_SLAY = 3,
|
||||
SAY_DEATH = 4
|
||||
};
|
||||
|
||||
enum Spells
|
||||
{
|
||||
// Akil'zon
|
||||
SPELL_STATIC_DISRUPTION = 43622,
|
||||
SPELL_CALL_LIGHTNING = 43661,
|
||||
SPELL_GUST_OF_WIND = 43621,
|
||||
SPELL_ELECTRICAL_STORM = 43648,
|
||||
|
||||
// Soaring Eagle
|
||||
SPELL_EAGLE_SWOOP = 44732,
|
||||
|
||||
// Amani Kidnapper
|
||||
SPELL_GRAB_PASSENGER = 98869,
|
||||
SPELL_PLUCKED = 97318,
|
||||
|
||||
// Player
|
||||
SPELL_TELEPORT_SELF = 44006,
|
||||
SPELL_ELECTRICAL_STORM_AREA_AURA = 44007,
|
||||
SPELL_ELECTRICAL_ARC_1 = 43653,
|
||||
SPELL_ELECTRICAL_ARC_2 = 43654,
|
||||
SPELL_ELECTRICAL_ARC_3 = 43655,
|
||||
SPELL_ELECTRICAL_ARC_4 = 43656,
|
||||
SPELL_ELECTRICAL_ARC_5 = 43659
|
||||
};
|
||||
|
||||
uint32 const electricalArcSpells[5] =
|
||||
{
|
||||
SPELL_ELECTRICAL_ARC_1,
|
||||
SPELL_ELECTRICAL_ARC_2,
|
||||
SPELL_ELECTRICAL_ARC_3,
|
||||
SPELL_ELECTRICAL_ARC_4,
|
||||
SPELL_ELECTRICAL_ARC_5
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
// Akil'zon
|
||||
EVENT_STATIC_DISRUPTION = 1,
|
||||
EVENT_CALL_LIGHTNING,
|
||||
EVENT_GUST_OF_WIND,
|
||||
EVENT_ELECTRICAL_STORM,
|
||||
EVENT_START_RAIN,
|
||||
EVENT_END_RAIN,
|
||||
EVENT_SUMMON_SOARING_EAGLES,
|
||||
|
||||
// Soaring Eagle
|
||||
EVENT_EAGLE_SWOOP,
|
||||
EVENT_EAGLE_SCREECH,
|
||||
EVENT_MOVE_RANDOM,
|
||||
EVENT_MOVE_CYCLIC_PATH
|
||||
};
|
||||
|
||||
enum Actions
|
||||
{
|
||||
// Soaring Eagle
|
||||
ACTION_DO_RANDOM_MOVEMENT = 1
|
||||
};
|
||||
|
||||
enum Data
|
||||
{
|
||||
DATA_EAGLE_NUMBER = 0
|
||||
};
|
||||
|
||||
enum MovePoints
|
||||
{
|
||||
// Amani Kidnapper
|
||||
POINT_GRAB_PASSENGER = 1
|
||||
};
|
||||
|
||||
enum Misc
|
||||
{
|
||||
ZONE_ID_ZULAMAN = 3805,
|
||||
SOUND_ID_EAGLE_SCREECH = 12196
|
||||
};
|
||||
|
||||
Position const SoaringEagleSummonPositions[] =
|
||||
{
|
||||
{ 355.0323f, 1411.f, 91.6518f, 5.856372f },
|
||||
{ 356.82877f, 1422.785f, 91.71573f, 1.518436f },
|
||||
{ 368.7743f, 1377.933f, 91.78314f, 0.4260757f },
|
||||
{ 361.3212f, 1380.682f, 91.76196f, 3.036873f },
|
||||
{ 396.1938f, 1398.954f, 91.53065f, 4.3096f },
|
||||
{ 395.2363f, 1391.221f, 91.78426f, 3.787364f },
|
||||
{ 386.3385f, 1430.294f, 92.51662f, 3.173957f },
|
||||
{ 379.344f, 1434.552f, 91.64027f, 0.9599311f }
|
||||
};
|
||||
|
||||
std::vector<Position> AmaniKidnapperCyclicPath =
|
||||
{
|
||||
{ 360.25174f, 1422.9219f, 79.72605f },
|
||||
{ 373.98438f, 1431.1823f, 79.85269f },
|
||||
{ 395.0295f, 1425.8403f, 79.52386f },
|
||||
{ 399.20486f, 1398.4219f, 79.31239f },
|
||||
{ 390.6059f, 1390.1146f, 79.76962f },
|
||||
{ 372.62674f, 1383.9062f, 79.27089f },
|
||||
{ 354.83682f, 1397.5192f, 79.283394f },
|
||||
{ 353.40973f, 1414.5608f, 79.529434f }
|
||||
};
|
||||
|
||||
std::vector<Position> SoraringEagleCyclicPath0 =
|
||||
{
|
||||
{ 352.03665f, 1411.3475f, 91.7419f },
|
||||
{ 352.768f, 1412.0295f, 91.7419f },
|
||||
{ 389.26443f, 1394.4066f, 90.3169f },
|
||||
{ 405.69748f, 1381.4075f, 90.3169f },
|
||||
{ 418.16028f, 1383.2f, 90.3169f },
|
||||
{ 415.5009f, 1387.942f, 90.3169f },
|
||||
{ 399.76562f, 1414.877f, 90.3169f },
|
||||
{ 380.8964f, 1424.8958f, 90.3169f },
|
||||
{ 357.7345f, 1418.2468f, 90.3169f },
|
||||
{ 342.5394f, 1404.734f, 90.3169f },
|
||||
{ 343.50098f, 1395.6887f, 90.3169f },
|
||||
{ 340.88748f, 1384.222f, 90.3169f },
|
||||
{ 360.84256f, 1382.7749f, 90.3169f },
|
||||
{ 369.62912f, 1388.5502f, 90.3169f },
|
||||
{ 376.77408f, 1400.9977f, 90.3169f },
|
||||
{ 388.67688f, 1423.4247f, 90.3169f },
|
||||
{ 398.8929f, 1441.9341f, 90.3169f },
|
||||
{ 382.19348f, 1437.8445f, 90.3169f },
|
||||
{ 370.78647f, 1423.2487f, 90.3169f },
|
||||
{ 356.91635f, 1397.7987f, 90.3169f },
|
||||
{ 354.5165f, 1380.9031f, 90.3169f },
|
||||
{ 395.601f, 1376.0145f, 90.3169f },
|
||||
{ 422.74762f, 1384.6039f, 90.3169f },
|
||||
{ 398.88052f, 1410.5187f, 90.3169f },
|
||||
{ 382.2971f, 1424.7145f, 90.3169f },
|
||||
{ 360.14865f, 1431.6875f, 90.3169f },
|
||||
{ 345.7219f, 1422.5363f, 90.3169f },
|
||||
{ 345.66623f, 1416.4381f, 90.3169f },
|
||||
{ 389.26443f, 1394.4066f, 90.3169f },
|
||||
{ 405.69748f, 1381.4075f, 90.3169f }
|
||||
};
|
||||
|
||||
std::vector<Position> SoraringEagleCyclicPath2 =
|
||||
{
|
||||
{ 367.06046f, 1376.0284f, 91.747284f },
|
||||
{ 366.48688f, 1376.8475f, 91.747284f },
|
||||
{ 402.18002f, 1393.9266f, 92.29734f },
|
||||
{ 405.5344f, 1407.2664f, 92.29734f },
|
||||
{ 391.50912f, 1426.6482f, 92.29734f },
|
||||
{ 384.56445f, 1434.1189f, 92.29734f },
|
||||
{ 357.36685f, 1441.9121f, 92.29734f },
|
||||
{ 351.07693f, 1440.2948f, 92.29734f },
|
||||
{ 329.53537f, 1422.8164f, 92.29734f },
|
||||
{ 331.16852f, 1411.1921f, 92.29734f },
|
||||
{ 352.1847f, 1384.4667f, 92.29734f },
|
||||
{ 394.28995f, 1393.1965f, 92.29734f },
|
||||
{ 410.53754f, 1400.7565f, 92.29734f },
|
||||
{ 397.51172f, 1432.3961f, 92.29734f },
|
||||
{ 351.6988f, 1433.4469f, 92.29734f },
|
||||
{ 335.5918f, 1438.5464f, 92.29734f },
|
||||
{ 328.19498f, 1434.6647f, 92.29734f },
|
||||
{ 319.32867f, 1429.3776f, 92.29734f },
|
||||
{ 329.76138f, 1413.6876f, 92.29734f },
|
||||
{ 365.2091f, 1407.883f, 92.29734f },
|
||||
{ 402.18002f, 1393.9266f, 92.29734f },
|
||||
{ 405.5344f, 1407.2664f, 92.29734f }
|
||||
};
|
||||
|
||||
std::vector<Position> SoraringEagleCyclicPath4 =
|
||||
{
|
||||
{ 396.47882f, 1402.0371f, 91.81095f },
|
||||
{ 397.27747f, 1401.4353f, 91.81095f },
|
||||
{ 387.03668f, 1381.7903f, 89.69339f },
|
||||
{ 370.12805f, 1370.0513f, 89.69339f },
|
||||
{ 359.64487f, 1373.1759f, 89.69339f },
|
||||
{ 350.18198f, 1386.6072f, 89.69339f },
|
||||
{ 345.56348f, 1402.6711f, 89.69339f },
|
||||
{ 355.46756f, 1424.0919f, 89.69339f },
|
||||
{ 367.25217f, 1433.9203f, 89.69339f },
|
||||
{ 373.7067f, 1438.8328f, 89.69339f },
|
||||
{ 386.6186f, 1435.4559f, 89.69339f },
|
||||
{ 405.42404f, 1418.889f, 89.69339f },
|
||||
{ 410.99643f, 1390.823f, 89.69339f },
|
||||
{ 397.09592f, 1382.1975f, 89.69339f },
|
||||
{ 376.45215f, 1393.8619f, 89.69339f },
|
||||
{ 356.00858f, 1404.278f, 89.69339f },
|
||||
{ 344.35168f, 1416.3293f, 89.69339f },
|
||||
{ 351.9594f, 1439.8646f, 89.69339f },
|
||||
{ 353.33682f, 1441.8173f, 89.69339f },
|
||||
{ 368.85004f, 1445.7336f, 89.69339f },
|
||||
{ 381.1107f, 1440.9076f, 89.69339f },
|
||||
{ 392.25012f, 1433.5304f, 89.69339f },
|
||||
{ 388.21756f, 1408.2224f, 89.69339f },
|
||||
{ 378.6734f, 1393.3729f, 89.69339f },
|
||||
{ 368.74435f, 1377.1985f, 89.69339f },
|
||||
{ 358.59244f, 1357.8248f, 89.69339f },
|
||||
{ 352.95963f, 1373.3104f, 89.69339f },
|
||||
{ 354.78592f, 1394.457f, 89.69339f },
|
||||
{ 362.43695f, 1408.394f, 89.69339f },
|
||||
{ 379.70877f, 1427.434f, 89.69339f },
|
||||
{ 392.25433f, 1431.5131f, 89.69339f },
|
||||
{ 402.16602f, 1427.8239f, 89.69339f },
|
||||
{ 387.03668f, 1381.7903f, 89.69339f },
|
||||
{ 370.12805f, 1370.0513f, 89.69339f }
|
||||
};
|
||||
|
||||
std::vector<Position> SoraringEagleCyclicPath6 =
|
||||
{
|
||||
{ 389.7559f, 1429.5692f, 91.704124f },
|
||||
{ 389.15408f, 1430.3678f, 91.704124f },
|
||||
{ 364.2945f, 1429.2323f, 99.35547f },
|
||||
{ 385.5457f, 1429.0762f, 97.52219f },
|
||||
{ 403.14258f, 1412.2823f, 91.68882f },
|
||||
{ 400.02182f, 1390.2379f, 91.68882f },
|
||||
{ 376.41537f, 1384.655f, 94.605484f },
|
||||
{ 359.02756f, 1371.6508f, 94.605484f },
|
||||
{ 346.9107f, 1391.9337f, 94.605484f },
|
||||
{ 341.37088f, 1418.3412f, 94.605484f },
|
||||
{ 350.69977f, 1429.8486f, 94.605484f },
|
||||
{ 370.01108f, 1435.0266f, 94.605484f },
|
||||
{ 392.06976f, 1429.9241f, 94.605484f },
|
||||
{ 386.54068f, 1408.4303f, 94.605484f },
|
||||
{ 373.95096f, 1376.0957f, 94.605484f },
|
||||
{ 357.72754f, 1363.8644f, 94.605484f },
|
||||
{ 347.01358f, 1378.5763f, 94.605484f },
|
||||
{ 347.7666f, 1389.9219f, 94.605484f },
|
||||
{ 365.9999f, 1404.3414f, 94.605484f },
|
||||
{ 383.0139f, 1413.7719f, 94.605484f },
|
||||
{ 409.8304f, 1421.2222f, 94.605484f },
|
||||
{ 401.74924f, 1445.9572f, 94.605484f },
|
||||
{ 382.86514f, 1454.6213f, 94.605484f },
|
||||
{ 365.86273f, 1452.1888f, 94.605484f },
|
||||
{ 351.98242f, 1449.2568f, 94.605484f },
|
||||
{ 334.17416f, 1440.2583f, 94.605484f },
|
||||
{ 334.8176f, 1426.2494f, 94.605484f },
|
||||
{ 345.3902f, 1406.333f, 94.605484f },
|
||||
{ 362.73828f, 1394.9055f, 94.605484f },
|
||||
{ 394.5153f, 1384.1464f, 94.605484f },
|
||||
{ 419.7296f, 1377.4557f, 94.605484f },
|
||||
{ 409.288f, 1407.1461f, 94.605484f },
|
||||
{ 386.95444f, 1434.5723f, 94.605484f },
|
||||
{ 349.70334f, 1440.1602f, 98.16106f },
|
||||
{ 333.68912f, 1444.1354f, 100.02217f },
|
||||
{ 312.27518f, 1440.3971f, 100.02216f },
|
||||
{ 303.0779f, 1411.3394f, 97.49439f },
|
||||
{ 321.6631f, 1412.2037f, 94.605484f },
|
||||
{ 364.2945f, 1429.2323f, 99.35547f },
|
||||
{ 385.5457f, 1429.0762f, 97.52219f }
|
||||
};
|
||||
|
||||
std::unordered_map<uint8, std::vector<Position>> CyclicPathsByEagleNumber =
|
||||
{
|
||||
{ 0, SoraringEagleCyclicPath0 },
|
||||
{ 2, SoraringEagleCyclicPath2 },
|
||||
{ 4, SoraringEagleCyclicPath4 },
|
||||
{ 6, SoraringEagleCyclicPath6 }
|
||||
};
|
||||
|
||||
struct boss_akilzon : public BossAI
|
||||
{
|
||||
boss_akilzon(Creature* creature) : BossAI(creature, DATA_ALKILZON)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_Reset();
|
||||
}
|
||||
boss_akilzon(Creature* creature) : BossAI(creature, DATA_ALKILZON) { }
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
_JustEngagedWith();
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_STATIC_DISRUPTION, 6s);
|
||||
events.ScheduleEvent(EVENT_CALL_LIGHTNING, 7s);
|
||||
events.ScheduleEvent(EVENT_GUST_OF_WIND, 9s + 500ms);
|
||||
events.ScheduleEvent(EVENT_ELECTRICAL_STORM, 49s);
|
||||
events.ScheduleEvent(EVENT_START_RAIN, 41s);
|
||||
events.ScheduleEvent(EVENT_SUMMON_SOARING_EAGLES, 11s);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
|
||||
me->GetMap()->SetZoneWeather(ZONE_ID_ZULAMAN, WEATHER_STATE_FOG, 0.f);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (who->IsPlayer())
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason /*why*/) override
|
||||
{
|
||||
_EnterEvadeMode();
|
||||
summons.DespawnAll();
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
|
||||
me->GetMap()->SetZoneWeather(ZONE_ID_ZULAMAN, WEATHER_STATE_FOG, 0.f);
|
||||
_DespawnAtEvade();
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon) override
|
||||
{
|
||||
summons.Summon(summon);
|
||||
summon->SetReactState(REACT_PASSIVE);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -71,11 +340,354 @@ struct boss_akilzon : public BossAI
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_STATIC_DISRUPTION:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me)))
|
||||
DoCast(target, SPELL_STATIC_DISRUPTION);
|
||||
events.Repeat(12s);
|
||||
break;
|
||||
case EVENT_CALL_LIGHTNING:
|
||||
DoCastVictim(SPELL_CALL_LIGHTNING);
|
||||
events.Repeat(7s, 9s);
|
||||
break;
|
||||
case EVENT_GUST_OF_WIND:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, [this](Unit const* target)->bool
|
||||
{
|
||||
return target && me->GetVictim() != target && !target->HasAura(SPELL_PLUCKED);
|
||||
}))
|
||||
DoCast(target, SPELL_GUST_OF_WIND);
|
||||
events.Repeat(24s);
|
||||
break;
|
||||
case EVENT_ELECTRICAL_STORM:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me)))
|
||||
DoCast(target, SPELL_ELECTRICAL_STORM);
|
||||
|
||||
events.RescheduleEvent(EVENT_STATIC_DISRUPTION, 14s + 500ms);
|
||||
events.RescheduleEvent(EVENT_GUST_OF_WIND, 17s);
|
||||
events.RescheduleEvent(EVENT_CALL_LIGHTNING, 18s);
|
||||
events.ScheduleEvent(EVENT_END_RAIN, 8s);
|
||||
events.ScheduleEvent(EVENT_START_RAIN, 41s);
|
||||
events.ScheduleEvent(EVENT_SUMMON_SOARING_EAGLES, 19s);
|
||||
events.Repeat(49s);
|
||||
break;
|
||||
case EVENT_START_RAIN:
|
||||
me->GetMap()->SetZoneWeather(ZONE_ID_ZULAMAN, WEATHER_STATE_MEDIUM_RAIN, 0.75f);
|
||||
break;
|
||||
case EVENT_END_RAIN:
|
||||
me->GetMap()->SetZoneWeather(ZONE_ID_ZULAMAN, WEATHER_STATE_FOG, 0.f);
|
||||
break;
|
||||
case EVENT_SUMMON_SOARING_EAGLES:
|
||||
Talk(SAY_SUMMON_EAGLES);
|
||||
for (uint8 i = 0; i < 8; i++)
|
||||
{
|
||||
bool cyclic = i == 0 || i == 2 || i == 4 || i == 6;
|
||||
|
||||
if (Creature* eagle = DoSummon(NPC_SOARING_EAGLE, SoaringEagleSummonPositions[i], 4000))
|
||||
{
|
||||
if (cyclic)
|
||||
{
|
||||
eagle->GetMotionMaster()->MoveCyclicPath(CyclicPathsByEagleNumber[i].data(), CyclicPathsByEagleNumber[i].size(), false, true);
|
||||
eagle->AI()->SetData(DATA_EAGLE_NUMBER, i);
|
||||
}
|
||||
else
|
||||
eagle->AI()->DoAction(ACTION_DO_RANDOM_MOVEMENT);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
struct npc_akilzon_soaring_eagle : public PassiveAI
|
||||
{
|
||||
npc_akilzon_soaring_eagle(Creature* creature) : PassiveAI(creature), _randomMovement(false), _eagleNumber(0) { }
|
||||
|
||||
void JustAppeared() override
|
||||
{
|
||||
_events.ScheduleEvent(EVENT_EAGLE_SCREECH, 3s, 6s);
|
||||
_events.ScheduleEvent(EVENT_EAGLE_SWOOP, 3s, 6s);
|
||||
DoZoneInCombat();
|
||||
}
|
||||
|
||||
void DoAction(int32 action) override
|
||||
{
|
||||
switch (action)
|
||||
{
|
||||
case ACTION_DO_RANDOM_MOVEMENT:
|
||||
_events.ScheduleEvent(EVENT_MOVE_RANDOM, 1ms);
|
||||
_randomMovement = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data) override
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_EAGLE_NUMBER:
|
||||
_eagleNumber = data;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
_events.Update(diff);
|
||||
|
||||
while (uint32 eventId = _events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_EAGLE_SCREECH:
|
||||
me->PlayDirectSound(SOUND_ID_EAGLE_SCREECH);
|
||||
_events.Repeat(3s + 500ms, 10s);
|
||||
break;
|
||||
case EVENT_EAGLE_SWOOP:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.f, true, 0))
|
||||
DoCast(target, SPELL_EAGLE_SWOOP);
|
||||
_events.Repeat(5s, 6s);
|
||||
|
||||
if (_randomMovement)
|
||||
_events.RescheduleEvent(EVENT_MOVE_RANDOM, 2s);
|
||||
else
|
||||
_events.ScheduleEvent(EVENT_MOVE_CYCLIC_PATH, 2s);
|
||||
break;
|
||||
case EVENT_MOVE_RANDOM:
|
||||
{
|
||||
Position pos = me->GetHomePosition();
|
||||
pos.RelocateOffset({ frand(-7.f, 7.f), frand(-7.f, 7.f), frand(-1.f, 1.f) });
|
||||
if (me->GetPositionZ() <= 90.f)
|
||||
pos.m_positionZ = std::min(me->GetPositionZ() + 10.f, pos.GetPositionZ());
|
||||
|
||||
me->GetMotionMaster()->MovePoint(0, pos, false);
|
||||
_events.Repeat(1s + 200ms);
|
||||
break;
|
||||
}
|
||||
case EVENT_MOVE_CYCLIC_PATH:
|
||||
me->GetMotionMaster()->MoveCyclicPath(CyclicPathsByEagleNumber[_eagleNumber].data(), CyclicPathsByEagleNumber[_eagleNumber].size(), false, true);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap _events;
|
||||
bool _randomMovement;
|
||||
uint8 _eagleNumber;
|
||||
};
|
||||
|
||||
struct npc_akilzon_amani_kidnapper : public PassiveAI
|
||||
{
|
||||
npc_akilzon_amani_kidnapper(Creature* creature) : PassiveAI(creature) { }
|
||||
|
||||
void IsSummonedBy(Unit* /*summoner*/) override
|
||||
{
|
||||
if (InstanceScript* instance = me->GetInstanceScript())
|
||||
if (Creature* akilzon = instance->GetCreature(DATA_ALKILZON))
|
||||
akilzon->AI()->JustSummoned(me);
|
||||
}
|
||||
|
||||
void JustAppeared() override
|
||||
{
|
||||
if (TempSummon* summon = me->ToTempSummon())
|
||||
if (Unit* summoner = summon->GetSummoner())
|
||||
me->GetMotionMaster()->MovePoint(POINT_GRAB_PASSENGER, summoner->GetPosition(), false);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
me->DespawnOrUnsummon(6s);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 pointId) override
|
||||
{
|
||||
if (type != POINT_MOTION_TYPE)
|
||||
return;
|
||||
|
||||
switch (pointId)
|
||||
{
|
||||
case POINT_GRAB_PASSENGER:
|
||||
if (TempSummon* summon = me->ToTempSummon())
|
||||
if (Unit* summoner = summon->GetSummoner())
|
||||
DoCast(summoner, SPELL_GRAB_PASSENGER);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void PassengerBoarded(Unit* /*passenger*/, int8 /*seatId*/, bool apply) override
|
||||
{
|
||||
if (!apply)
|
||||
return;
|
||||
|
||||
me->GetMotionMaster()->MoveCyclicPath(AmaniKidnapperCyclicPath.data(), AmaniKidnapperCyclicPath.size(), false, true);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 /*diff*/) override { }
|
||||
};
|
||||
|
||||
class spell_akilzon_electrical_storm : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_akilzon_electrical_storm);
|
||||
|
||||
bool Validate(SpellInfo const* /*spellInfo*/) override
|
||||
{
|
||||
return ValidateSpellInfo(
|
||||
{
|
||||
SPELL_TELEPORT_SELF,
|
||||
SPELL_ELECTRICAL_STORM_AREA_AURA
|
||||
});
|
||||
}
|
||||
|
||||
void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
Unit* target = GetTarget();
|
||||
target->SetDisableGravity(true);
|
||||
target->SendSetPlayHoverAnim(true);
|
||||
target->SetControlled(true, UNIT_STATE_ROOT);
|
||||
target->CastSpell(target, SPELL_ELECTRICAL_STORM_AREA_AURA, true);
|
||||
target->CastSpell(target, SPELL_TELEPORT_SELF, true);
|
||||
}
|
||||
|
||||
void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
Unit* target = GetTarget();
|
||||
target->SetDisableGravity(false);
|
||||
target->SetControlled(false, UNIT_STATE_ROOT);
|
||||
target->RemoveAurasDueToSpell(SPELL_ELECTRICAL_STORM_AREA_AURA);
|
||||
target->SendSetPlayHoverAnim(false);
|
||||
target->CastSpell(target, GetSpellInfo()->Effects[EFFECT_2].BasePoints);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
AfterEffectApply += AuraEffectApplyFn(spell_akilzon_electrical_storm::AfterApply, EFFECT_0, SPELL_AURA_BLOCK_SPELL_FAMILY, AURA_EFFECT_HANDLE_REAL);
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_akilzon_electrical_storm::AfterRemove, EFFECT_0, SPELL_AURA_BLOCK_SPELL_FAMILY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_akilzon_electrical_storm_damage : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_akilzon_electrical_storm_damage);
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& targets)
|
||||
{
|
||||
if (targets.empty())
|
||||
return;
|
||||
|
||||
targets.remove_if([](WorldObject const* target)->bool
|
||||
{
|
||||
return (!target->ToUnit() || target->ToUnit()->HasAura(SPELL_ELECTRICAL_STORM_AREA_AURA));
|
||||
});
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_akilzon_electrical_storm_damage::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_akilzon_electrical_storm_damage::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ALLY);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_akilzon_electrical_overloard_graphic_pulse : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_akilzon_electrical_overloard_graphic_pulse);
|
||||
|
||||
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
|
||||
});
|
||||
}
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
for (uint8 i = 0; i < 5; i++)
|
||||
GetHitUnit()->CastSpell(GetHitUnit(), electricalArcSpells[i], true);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_akilzon_electrical_overloard_graphic_pulse::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_akilzon_teleport_self : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_akilzon_teleport_self);
|
||||
|
||||
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);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_akilzon_grab_passenger : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_akilzon_grab_passenger);
|
||||
|
||||
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Unit* caster = GetCaster())
|
||||
GetHitUnit()->CastSpell(caster, GetEffectValue(), true);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_akilzon_grab_passenger::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_akilzon_summon_amani_kidnapper : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_akilzon_summon_amani_kidnapper);
|
||||
|
||||
void SetDest(SpellDestination& dest)
|
||||
{
|
||||
dest.RelocateOffset({ 0.0f, 0.0f, 30.0f, 0.0f });
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_akilzon_summon_amani_kidnapper::SetDest, EFFECT_0, TARGET_DEST_CASTER);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_akilzon()
|
||||
{
|
||||
RegisterZulAamanCreatureAI(boss_akilzon);
|
||||
RegisterZulAamanCreatureAI(npc_akilzon_soaring_eagle);
|
||||
RegisterZulAamanCreatureAI(npc_akilzon_amani_kidnapper);
|
||||
RegisterAuraScript(spell_akilzon_electrical_storm);
|
||||
RegisterSpellScript(spell_akilzon_electrical_storm_damage);
|
||||
RegisterSpellScript(spell_akilzon_electrical_overloard_graphic_pulse);
|
||||
RegisterSpellScript(spell_akilzon_teleport_self);
|
||||
RegisterSpellScript(spell_akilzon_grab_passenger);
|
||||
RegisterSpellScript(spell_akilzon_summon_amani_kidnapper);
|
||||
}
|
||||
@@ -42,6 +42,12 @@ ObjectData const gameobjectData[] =
|
||||
{ 0, 0 } // END
|
||||
};
|
||||
|
||||
DoorData const doorData[] =
|
||||
{
|
||||
{ GO_DOODAD_ZULAMAN_WIND_DOOR, DATA_ALKILZON, DOOR_TYPE_ROOM },
|
||||
{ 0, 0, DOOR_TYPE_ROOM } // END
|
||||
};
|
||||
|
||||
Position const AmanishiGuardianDistanceCheckPos = { 120.223f, 1585.766f, 43.43f };
|
||||
Position const AmanishiSavageDistanceCheckPos = { 122.176f, 1528.203f, 21.233f };
|
||||
|
||||
@@ -57,6 +63,7 @@ public:
|
||||
SetHeaders(DataHeader);
|
||||
SetBossNumber(EncounterCount);
|
||||
LoadObjectData(creatureData, gameobjectData);
|
||||
LoadDoorData(doorData);
|
||||
_remainingSpeedRunTime = 0;
|
||||
_savagesAtGateTriggered = false;
|
||||
_speedRunState = NOT_STARTED;
|
||||
|
||||
@@ -54,6 +54,10 @@ enum ZACreatureIds
|
||||
BOSS_HEXLORD_MALACRASS = 24239,
|
||||
BOSS_DAAKARA = 23863,
|
||||
|
||||
// Encounter related creatures
|
||||
/*Akil'zon*/
|
||||
NPC_SOARING_EAGLE = 24858,
|
||||
|
||||
NPC_VOLJIN = 52924,
|
||||
NPC_HEXLORD_MALACRASS_TRIGGER = 24363,
|
||||
NPC_AMANISHI_GUARDIAN = 23597,
|
||||
@@ -62,8 +66,9 @@ enum ZACreatureIds
|
||||
|
||||
enum ZAGameObjectIds
|
||||
{
|
||||
GO_STRANGE_GONG = 187359,
|
||||
GO_MASSIVE_GATE = 186728,
|
||||
GO_STRANGE_GONG = 187359,
|
||||
GO_MASSIVE_GATE = 186728,
|
||||
GO_DOODAD_ZULAMAN_WIND_DOOR = 186858,
|
||||
};
|
||||
|
||||
enum ZAEvents
|
||||
|
||||
Reference in new issue
Block a user