Scripts/Wailing Caverns: Rewrite Naralex event (#31445)

(cherry picked from commit 542e046815ea038b998d3efc0b95d3458fe92276)
This commit is contained in:
offl
2026-06-28 23:55:27 +02:00
committed by Shauren
parent 22dde9ee14
commit ac285efd29
4 changed files with 585 additions and 419 deletions
@@ -0,0 +1,189 @@
--
UPDATE `smart_scripts` SET `id` = 4 WHERE `entryorguid` = 3669 AND `source_type` = 0 AND `id` = 0;
UPDATE `smart_scripts` SET `id` = 0, `action_param1` = 0, `action_param3` = 1 WHERE `entryorguid` = 3669 AND `source_type` = 0 AND `id` = 1;
UPDATE `smart_scripts` SET `id` = 4 WHERE `entryorguid` = 3670 AND `source_type` = 0 AND `id` = 0;
UPDATE `smart_scripts` SET `id` = 0, `action_param1` = 1, `action_param3` = 1 WHERE `entryorguid` = 3670 AND `source_type` = 0 AND `id` = 1;
UPDATE `smart_scripts` SET `id` = 8 WHERE `entryorguid` = 3671 AND `source_type` = 0 AND `id` = 0;
UPDATE `smart_scripts` SET `id` = 0, `action_param1` = 2, `action_param3` = 1 WHERE `entryorguid` = 3671 AND `source_type` = 0 AND `id` = 6;
UPDATE `smart_scripts` SET `id` = 4 WHERE `entryorguid` = 3673 AND `source_type` = 0 AND `id` = 0;
UPDATE `smart_scripts` SET `id` = 0, `action_param1` = 3, `action_param3` = 1 WHERE `entryorguid` = 3673 AND `source_type` = 0 AND `id` = 1;
UPDATE `smart_scripts` SET `action_param1` = 4, `action_param3` = 1 WHERE `entryorguid` = 3654 AND `source_type` = 0 AND `id` = 0;
UPDATE `creature_template` SET `unit_flags` = 0 WHERE `entry` = 3678;
DELETE FROM `creature_text` WHERE `CreatureID` IN (3678,3679);
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(3678,0,0,"At last! Naralex can be awakened! Come aid me, brave adventurers!",14,0,100,0,0,0,2101,0,"Disciple of Naralex SAY_ALL_DONE"),
(3678,1,0,"I must make the necessary preparations before the awakening ritual can begin. You must protect me!",12,0,100,1,0,0,1255,0,"Disciple of Naralex SAY_PROGRESS_1"),
(3678,2,0,"These caverns were once a temple of promise for regrowth in the Barrens. Now, they are the halls of nightmares.",12,0,100,1,0,0,1256,0,"Disciple of Naralex SAY_PROGRESS_2"),
(3678,3,0,"Come. We must continue. There is much to be done before we can pull Naralex from his nightmare.",12,0,100,25,0,0,1257,0,"Disciple of Naralex SAY_PROGRESS_3"),
(3678,4,0,"Within this circle of fire I must cast the spell to banish the spirits of the slain Fanglords.",12,0,100,0,0,0,1258,0,"Disciple of Naralex SAY_PROGRESS_4"),
(3678,5,0,"The caverns have been purified. To Naralex's chamber we go!",12,0,100,1,0,0,1259,0,"Disciple of Naralex SAY_PROGRESS_5"),
(3678,6,0,"Beyond this corridor, Naralex lies in fitful sleep. Let us go awaken him before it is too late.",12,0,100,25,0,0,1263,0,"Disciple of Naralex SAY_PROGRESS_6"),
(3678,7,0,"Protect me brave souls as I delve into the Emerald Dream to rescue Naralex and put an end to this corruption!",12,0,100,20,0,0,1264,0,"Disciple of Naralex SAY_PROGRESS_7"),
(3678,8,0,"%s begins to perform the awakening ritual on Naralex.",16,0,100,0,0,0,1265,0,"Disciple of Naralex SAY_PROGRESS_8"),
(3678,9,0,"At last! Naralex awakes from the nightmare.",12,0,100,25,0,0,1267,0,"Disciple of Naralex SAY_PROGRESS_9"),
(3678,10,0,"Attacked! Help get this $n off of me!",12,0,100,0,0,0,1273,0,"Disciple of Naralex SAY_AGGRO"),
(3678,10,1,"Deal with this $n! I need to prepare to awake Naralex!",12,0,100,0,0,0,1274,0,"Disciple of Naralex SAY_AGGRO"),
(3678,10,2,"I can't handle this $n alone! Help!",12,0,100,0,0,0,1275,0,"Disciple of Naralex SAY_AGGRO"),
(3678,10,3,"This $n is a minion from Naralex's nightmare no doubt!",12,0,100,0,0,0,1276,0,"Disciple of Naralex SAY_AGGRO"),
(3678,10,4,"Help!",12,0,100,0,0,0,1277,0,"Disciple of Naralex SAY_AGGRO"),
(3679,0,0,"%s tosses fitfully in troubled sleep.",16,0,100,0,0,0,1268,0,"Naralex EMOTE_AWAKENING_1"),
(3679,1,0,"%s writhes in agony. The Disciple seems to be breaking through.",16,0,100,0,0,0,1269,0,"Naralex EMOTE_AWAKENING_2"),
(3679,2,0,"%s dreams up a horrendous vision. Something stirs beneath the murky waters.",16,0,100,0,0,0,1270,0,"Naralex EMOTE_AWAKENING_3"),
(3679,3,0,"I AM AWAKE, AT LAST!",14,0,100,15,0,5789,1271,0,"Naralex SAY_AWAKENING_4"),
(3679,4,0,"Ah, to be pulled from the dreaded nightmare! I thank you, my loyal Disciple, along with your brave companions.",12,0,100,2,0,0,1272,0,"Naralex SAY_AWAKENING_5"),
(3679,5,0,"We must go and gather with the other Disciples. There is much work to be done before I can make another attempt to restore the Barrens. Farewell, brave souls!",12,0,100,1,0,0,2103,0,"Naralex SAY_AWAKENING_6");
DELETE FROM `creature_summon_groups` WHERE `summonerId` = 3678 AND `summonerType` = 0;
INSERT INTO `creature_summon_groups` (`summonerId`,`summonerType`,`groupId`,`entry`,`position_x`,`position_y`,`position_z`,`orientation`,`summonType`,`summonTime`,`Comment`) VALUES
(3678,0,0,3636,-67.947014,206.72076,-93.50498,1.890911,6,300000,"Disciple of Naralex - Group 0 - Deviate Ravager"),
(3678,0,0,3636,-69.287880,211.94266,-93.44985,4.095106,6,300000,"Disciple of Naralex - Group 0 - Deviate Ravager"),
(3678,0,1,5048,-60.2539,273.098,-92.760864,0.40142572,6,300000,"Disciple of Naralex - Group 1 - Deviate Adder"),
(3678,0,1,5048,-50.1238,274.717,-92.760864,3.03687290,6,300000,"Disciple of Naralex - Group 1 - Deviate Adder"),
(3678,0,1,5048,-57.5453,280.207,-92.760864,5.07890800,6,300000,"Disciple of Naralex - Group 1 - Deviate Adder"),
(3678,0,2,5762,171.395,213.766,-105.507670,5.0440016,6,300000,"Disciple of Naralex - Group 2 - Deviate Moccasin"),
(3678,0,2,5762,171.690,213.234,-105.419660,1.6231562,6,300000,"Disciple of Naralex - Group 2 - Deviate Moccasin"),
(3678,0,2,5762,178.669,262.253,-106.152664,1.3264502,6,300000,"Disciple of Naralex - Group 2 - Deviate Moccasin"),
(3678,0,3,5763,125.646,169.517,-106.152664,0.94247776,6,300000,"Disciple of Naralex - Group 3 - Nightmare Ectoplasm"),
(3678,0,3,5763,155.845,186.688,-107.083664,0.05235988,6,300000,"Disciple of Naralex - Group 3 - Nightmare Ectoplasm"),
(3678,0,3,5763,162.067,218.715,-105.362660,1.98967530,6,300000,"Disciple of Naralex - Group 3 - Nightmare Ectoplasm"),
(3678,0,3,5763,96.7788,283.762,-104.785670,3.82227100,6,300000,"Disciple of Naralex - Group 3 - Nightmare Ectoplasm"),
(3678,0,3,5763,126.322,282.248,-103.797660,0.94247776,6,300000,"Disciple of Naralex - Group 3 - Nightmare Ectoplasm"),
(3678,0,3,5763,164.627,274.123,-107.297660,4.66002900,6,300000,"Disciple of Naralex - Group 3 - Nightmare Ectoplasm"),
(3678,0,3,5763,144.843,278.079,-104.574660,4.43313650,6,300000,"Disciple of Naralex - Group 3 - Nightmare Ectoplasm"),
(3678,0,4,3654,150.943,262.797,-103.90366,3.700098,6,300000,"Disciple of Naralex - Group 4 - Mutanus the Devourer");
DELETE FROM `waypoint_path_node` WHERE `PathId` = 29426;
DELETE FROM `waypoint_path` WHERE `PathId` = 29426;
DELETE FROM `waypoint_path` WHERE `PathId` IN (367800,367801,367802,367803,367804,367900);
INSERT INTO `waypoint_path` (`PathId`, `MoveType`, `Flags`, `Velocity`, `Comment`) VALUES
(367800, 0, 0, NULL, 'Migrated from refactor'),
(367801, 0, 0, NULL, 'Migrated from refactor'),
(367802, 0, 0, NULL, 'Migrated from refactor'),
(367803, 0, 0, NULL, 'Migrated from refactor'),
(367804, 1, 0, NULL, 'Migrated from refactor'),
(367900, 1, 2, NULL, 'Migrated from refactor');
DELETE FROM `waypoint_path_node` WHERE `PathId` IN (367800,367801,367802,367803,367804,367900);
INSERT INTO `waypoint_path_node` (`PathId`, `NodeId`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `Delay`) VALUES
(367800,1,-113.91917,142.769,-80.914154,NULL,0),
(367800,2,-111.23017,153.39638,-80.598915,NULL,0),
(367800,3,-110.97073,165.60736,-79.444725,NULL,0),
(367800,4,-109.30049,181.25143,-79.76007,NULL,0),
(367800,5,-110.1942,190.9626,-80.42993,NULL,0),
(367800,6,-109.58964,199.15425,-81.23881,NULL,0),
(367800,7,-110.56909,206.86935,-82.88934,NULL,0),
(367800,8,-110.30787,216.23227,-85.9362,NULL,0),
(367800,9,-108.06385,227.87166,-89.926414,NULL,0),
(367800,10,-104.28827,234.40804,-91.64163,NULL,0),
(367801,1,-99.53033,230.78362,-91.13202,NULL,0),
(367801,2,-97.78033,229.78362,-90.88202,NULL,0),
(367801,3,-95.03033,229.03362,-90.38202,NULL,0),
(367801,4,-93.78033,228.78362,-90.38202,NULL,0),
(367801,5,-91.78033,228.28362,-90.38202,NULL,0),
(367801,6,-90.78033,228.28362,-91.13202,NULL,0),
(367801,7,-87.28033,227.78362,-92.38202,NULL,0),
(367801,8,-85.272385,227.1592,-93.12241,NULL,0),
(367801,9,-81.619774,223.63588,-93.58602,NULL,0),
(367801,10,-71.02429,212.48766,-93.52011,NULL,0),
(367801,11,-66.8499,209.88943,-93.30499,NULL,0),
(367801,12,-61.41215,207.00401,-93.55031,NULL,0),
(367801,13,-49.681805,204.15556,-95.96281,NULL,0),
(367801,14,-41.188667,204.99422,-96.51606,NULL,0),
(367801,15,-35.381386,212.98494,-96.097084,NULL,0),
(367801,16,-33.46709,223.27979,-95.68127,NULL,0),
(367801,17,-31.874804,231.84636,-94.49322,NULL,0),
(367801,18,-33.1077,240.3214,-93.5856,NULL,0),
(367801,19,-38.079693,250.99289,-93.11742,NULL,0),
(367801,20,-43.072884,259.32315,-92.84188,NULL,0),
(367801,21,-54.713943,273.85025,-92.84426,NULL,0),
(367802,1,-49.880116,287.8062,-92.24503,NULL,0),
(367802,2,-47.99677,295.32455,-90.81826,NULL,0),
(367802,3,-38.468487,306.85004,-89.96177,NULL,0),
(367802,4,-34.199474,309.35944,-89.57565,NULL,0),
(367802,5,-23.514927,310.80438,-88.513176,NULL,0),
(367802,6,-9.611309,305.38797,-88.19709,NULL,0),
(367802,7,-3.915017,301.293,-86.814804,NULL,0),
(367802,8,-0.235204,294.51816,-85.46129,NULL,0),
(367802,9,3.204272,288.31448,-85.4905,NULL,0),
(367802,10,10.753059,278.38467,-85.8368,NULL,0),
(367802,11,16.977774,273.39676,-86.23834,NULL,0),
(367802,12,25.977861,264.6067,-86.788,NULL,0),
(367802,13,29.228964,257.175,-87.57598,NULL,0),
(367802,14,30.13821,248.86757,-87.36985,NULL,0),
(367802,15,38.86757,240.09755,-87.588615,NULL,0),
(367802,16,43.998184,234.17651,-87.98252,NULL,0),
(367802,17,48.403416,229.11066,-88.36456,NULL,0),
(367802,18,54.5601,210.85043,-89.80927,NULL,0),
(367803,1,67.69076,205.52835,-92.56347,NULL,0),
(367803,2,71.46944,206.84753,-93.108925,NULL,0),
(367803,3,77.15617,209.72255,-93.07799,NULL,0),
(367803,4,80.431854,214.86958,-93.177925,NULL,0),
(367803,5,83.29396,220.0915,-93.69437,NULL,0),
(367803,6,86.2444,225.64459,-94.54216,NULL,0),
(367803,7,89.99905,229.58038,-95.01256,NULL,0),
(367803,8,94.13328,232.7041,-95.36724,NULL,0),
(367803,9,99.00888,233.9866,-95.57549,NULL,0),
(367803,10,104.59536,233.409,-95.82651,NULL,0),
(367803,11,109.07845,232.6175,-96.046,NULL,0),
(367803,12,112.8708,233.57512,-96.32112,NULL,0),
(367803,13,114.51453,235.30222,-96.160706,NULL,0),
(367803,14,114.94154,237.7185,-96.02783,NULL,0),
(367804,1,119.04473,234.3336,-94.031525,NULL,0),
(367804,2,123.39298,232.1507,-93.80932,NULL,0),
(367804,3,129.23982,232.90259,-94.39268,NULL,0),
(367804,4,133.76927,236.9294,-95.39268,NULL,0),
(367804,5,136.03003,244.8155,-95.80936,NULL,0),
(367804,6,134.06624,253.92725,-95.1149,NULL,0),
(367804,7,123.16401,266.276,-93.587135,NULL,0),
(367804,8,113.3055,265.7754,-91.4482,NULL,0),
(367804,9,95.87152,250.9106,-87.55935,NULL,0),
(367804,10,87.43284,232.42879,-85.761505,NULL,0),
(367804,11,83.19081,218.43571,-84.08354,NULL,0),
(367804,12,70.24749,206.56226,-85.1376,NULL,0),
(367804,13,47.183872,206.66559,-83.493935,NULL,0),
(367804,14,34.54772,204.78317,-82.05306,NULL,0),
(367804,15,7.085161,202.25589,-77.79443,NULL,0),
(367804,16,-42.047256,203.44832,-83.76682,NULL,0),
(367804,17,-65.46242,208.19424,-83.76682,NULL,0),
(367804,18,-84.21845,225.56584,-83.76682,NULL,0),
(367900,1,117.57947,245.2589,-92.93683,NULL,0),
(367900,2,122.07437,244.77504,-91.96459,NULL,0),
(367900,3,126.5081,244.80745,-91.52022,NULL,0),
(367900,4,130.2855,244.1119,-91.49244,NULL,0),
(367900,5,131.33621,246.79683,-90.96464,NULL,0),
(367900,6,131.5437,250.70665,-90.85357,NULL,0),
(367900,7,131.16864,254.23598,-90.909134,NULL,0),
(367900,8,129.56184,256.8811,-90.77021,NULL,0),
(367900,9,125.7399,260.43616,-90.35347,NULL,0),
(367900,10,120.87533,261.45663,-91.15907,NULL,0),
(367900,11,116.536,261.01016,-91.46457,NULL,0),
(367900,12,107.43984,258.64542,-91.270226,NULL,0),
(367900,13,98.73815,250.1042,-90.18684,NULL,0),
(367900,14,91.52554,238.34152,-89.32576,NULL,0),
(367900,15,88.4579,228.32156,-88.59779,NULL,0),
(367900,16,83.84989,220.01965,-86.313835,NULL,0),
(367900,17,77.0841,211.77414,-84.73362,NULL,0),
(367900,18,67.49621,205.84052,-84.928276,NULL,0),
(367900,19,53.191616,205.93796,-84.08481,NULL,0),
(367900,20,33.344265,203.22813,-79.139854,NULL,0),
(367900,21,5.091723,198.6573,-71.71256,NULL,0),
(367900,22,-32.916367,204.26924,-83.12926,NULL,0),
(367900,23,-62.042313,206.22604,-83.12926,NULL,0);
@@ -15,29 +15,28 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* ScriptData
SDName: Instance_Wailing_Caverns
SD%Complete: 99
SDComment: Everything seems to work, still need some checking
SDCategory: Wailing Caverns
EndScriptData */
#include "ScriptMgr.h"
#include "Creature.h"
#include "CreatureAI.h"
#include "InstanceScript.h"
#include "Map.h"
#include "wailing_caverns.h"
static constexpr ObjectData creatureData[] =
{
{ NPC_DISCIPLE, DATA_DISCIPLE },
{ NPC_NARALEX, DATA_NARALEX }
};
static constexpr DungeonEncounterData Encounters[] =
{
{ BOSS_LADY_ANACONDRA, {{ 585 } } },
{ BOSS_LORD_COBRAHN, {{ 586 } } },
{ BOSS_KRESH, {{ 587 } } },
{ BOSS_LORD_PYTHAS, {{ 588 } } },
{ BOSS_SKUM, {{ 589 } } },
{ BOSS_LORD_SERPENTIS, {{ 590 } } },
{ BOSS_VERDAN_THE_EVERLIVING, {{ 591 } } },
{ BOSS_MUTANUS_THE_DEVOURER, {{ 592 } } },
{ DATA_LADY_ANACONDRA, {{ 585 } } },
{ DATA_LORD_COBRAHN, {{ 586 } } },
{ DATA_KRESH, {{ 587 } } },
{ DATA_LORD_PYTHAS, {{ 588 } } },
{ DATA_SKUM, {{ 589 } } },
{ DATA_LORD_SERPENTIS, {{ 590 } } },
{ DATA_VERDAN_THE_EVERLIVING, {{ 591 } } },
{ DATA_MUTANUS_THE_DEVOURER, {{ 592 } } },
};
class instance_wailing_caverns : public InstanceMapScript
@@ -55,77 +54,50 @@ public:
instance_wailing_caverns_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
{
SetHeaders(DataHeader);
SetBossNumber(MAX_ENCOUNTER);
SetBossNumber(EncounterCount);
LoadObjectData(creatureData, {});
LoadDungeonEncounterData(Encounters);
yelled = false;
}
bool yelled;
ObjectGuid NaralexGUID;
void OnCreatureCreate(Creature* creature) override
{
if (creature->GetEntry() == DATA_NARALEX)
NaralexGUID = creature->GetGUID();
}
void OnUnitDeath(Unit* unit) override
{
switch (unit->GetEntry())
{
case NPC_KRESH: SetBossState(BOSS_KRESH, DONE); break;
case NPC_SKUM: SetBossState(BOSS_SKUM, DONE); break;
case NPC_VERDAN_THE_EVERLIVING: SetBossState(BOSS_VERDAN_THE_EVERLIVING, DONE); break;
case NPC_KRESH: SetBossState(DATA_KRESH, DONE); break;
case NPC_SKUM: SetBossState(DATA_SKUM, DONE); break;
case NPC_VERDAN_THE_EVERLIVING: SetBossState(DATA_VERDAN_THE_EVERLIVING, DONE); break;
default:
break;
}
}
void SetData(uint32 type, uint32 data) override
bool SetBossState(uint32 type, EncounterState state) override
{
if (!InstanceScript::SetBossState(type, state))
return false;
switch (type)
{
case TYPE_LORD_COBRAHN: SetBossState(BOSS_LORD_COBRAHN, EncounterState(data));break;
case TYPE_LORD_PYTHAS: SetBossState(BOSS_LORD_PYTHAS, EncounterState(data));break;
case TYPE_LADY_ANACONDRA: SetBossState(BOSS_LADY_ANACONDRA, EncounterState(data));break;
case TYPE_LORD_SERPENTIS: SetBossState(BOSS_LORD_SERPENTIS, EncounterState(data));break;
case TYPE_NARALEX_EVENT: SetBossState(4, EncounterState(data));break;
case TYPE_NARALEX_PART1: SetBossState(5, EncounterState(data));break;
case TYPE_NARALEX_PART2: SetBossState(6, EncounterState(data));break;
case TYPE_NARALEX_PART3: SetBossState(7, EncounterState(data));break;
case TYPE_MUTANUS_THE_DEVOURER: SetBossState(BOSS_MUTANUS_THE_DEVOURER, EncounterState(data));break;
case TYPE_NARALEX_YELLED: yelled = true; break;
default: break;
case DATA_LORD_COBRAHN:
case DATA_LORD_PYTHAS:
case DATA_LADY_ANACONDRA:
case DATA_LORD_SERPENTIS:
if (state == DONE)
{
if (GetBossState(DATA_LORD_COBRAHN) == DONE && GetBossState(DATA_LORD_PYTHAS) == DONE
&& GetBossState(DATA_LADY_ANACONDRA) == DONE && GetBossState(DATA_LORD_SERPENTIS) == DONE)
{
if (Creature* disciple = GetCreature(DATA_DISCIPLE))
disciple->AI()->DoAction(ACTION_ALL_DONE);
}
}
break;
default:
break;
}
}
uint32 GetData(uint32 type) const override
{
switch (type)
{
case TYPE_LORD_COBRAHN: return GetBossState(BOSS_LORD_COBRAHN);
case TYPE_LORD_PYTHAS: return GetBossState(BOSS_LORD_PYTHAS);
case TYPE_LADY_ANACONDRA: return GetBossState(BOSS_LADY_ANACONDRA);
case TYPE_LORD_SERPENTIS: return GetBossState(BOSS_LORD_SERPENTIS);
case TYPE_NARALEX_EVENT: return GetBossState(4);
case TYPE_NARALEX_PART1: return GetBossState(5);
case TYPE_NARALEX_PART2: return GetBossState(6);
case TYPE_NARALEX_PART3: return GetBossState(7);
case TYPE_MUTANUS_THE_DEVOURER: return GetBossState(BOSS_MUTANUS_THE_DEVOURER);
case TYPE_NARALEX_YELLED: return yelled;
default: break;
}
return 0;
}
ObjectGuid GetGuidData(uint32 data) const override
{
if (data == DATA_NARALEX)return NaralexGUID;
return ObjectGuid::Empty;
return true;
}
};
};
void AddSC_instance_wailing_caverns()
@@ -15,366 +15,375 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* ScriptData
SDName: Wailing Caverns
SD%Complete: 95
SDComment: Need to add skill usage for Disciple of Naralex
SDCategory: Wailing Caverns
EndScriptData */
/* ContentData
EndContentData */
#include "ScriptMgr.h"
#include "InstanceScript.h"
#include "MotionMaster.h"
#include "ObjectAccessor.h"
#include "Player.h"
#include "ScriptedEscortAI.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
#include "TemporarySummon.h"
#include "wailing_caverns.h"
/*######
## npc_disciple_of_naralex
######*/
/*
* Spawns are supposed to be pooled, NYI
* Some spawns attack on spawn, some moves to position, NYI, all attacks on spawn currently
* This is based on Cata sniffs and WotLK classic video, timers were changed in Cata and requires to be revisited
*/
enum Enums
enum DiscipleTexts
{
SAY_AT_LAST = 0,
SAY_MAKE_PREPARATIONS = 1,
SAY_TEMPLE_OF_PROMISE = 2,
SAY_MUST_CONTINUE = 3,
SAY_BANISH_THE_SPIRITS = 4,
SAY_CAVERNS_PURIFIED = 5,
SAY_BEYOND_THIS_CORRIDOR = 6,
SAY_EMERALD_DREAM = 7,
EMOTE_AWAKENING_RITUAL = 8,
EMOTE_TROUBLED_SLEEP = 0,
EMOTE_WRITHE_IN_AGONY = 1,
EMOTE_HORRENDOUS_VISION = 2,
SAY_MUTANUS_THE_DEVOURER = 9,
SAY_I_AM_AWAKE = 3,
SAY_NARALEX_AWAKES = 10,
SAY_THANK_YOU = 4,
SAY_FAREWELL = 5,
SAY_ATTACKED = 11,
// Disciple
SAY_ALL_DONE = 0,
SAY_PROGRESS_1 = 1,
SAY_PROGRESS_2 = 2,
SAY_PROGRESS_3 = 3,
SAY_PROGRESS_4 = 4,
SAY_PROGRESS_5 = 5,
SAY_PROGRESS_6 = 6,
SAY_PROGRESS_7 = 7,
SAY_PROGRESS_8 = 8,
SAY_PROGRESS_9 = 9,
SAY_AGGRO = 10,
GOSSIP_OPTION_LET_EVENT_BEGIN = 201,
NPC_TEXT_NARALEX_SLEEPS_AGAIN = 698,
NPC_TEXT_FANGLORDS_ARE_DEAD = 699,
SPELL_MARK_OF_THE_WILD_RANK_2 = 5232,
SPELL_SERPENTINE_CLEANSING = 6270,
SPELL_NARALEXS_AWAKENING = 6271,
SPELL_FLIGHT_FORM = 33943,
NPC_DEVIATE_RAVAGER = 3636,
NPC_DEVIATE_VIPER = 5755,
NPC_DEVIATE_MOCCASIN = 5762,
NPC_NIGHTMARE_ECTOPLASM = 5763,
NPC_MUTANUS_THE_DEVOURER = 3654,
PATH_ESCORT_NARALEX_DISCIPLE = 29426,
// Naralex
EMOTE_AWAKENING_1 = 0,
EMOTE_AWAKENING_2 = 1,
EMOTE_AWAKENING_3 = 2,
SAY_AWAKENING_4 = 3,
SAY_AWAKENING_5 = 4,
SAY_AWAKENING_6 = 5
};
class npc_disciple_of_naralex : public CreatureScript
enum DiscipleSpells
{
public:
npc_disciple_of_naralex() : CreatureScript("npc_disciple_of_naralex") { }
SPELL_MARK_OF_THE_WILD = 5232,
SPELL_SERPENTINE_CLEANSING = 6270,
SPELL_NARALEXS_AWAKENING = 6271,
SPELL_OWL_FORM = 8153,
struct npc_disciple_of_naralexAI : public EscortAI
SPELL_SLEEP = 1090,
SPELL_DRUIDS_POTION = 8141
};
enum DiscipleEvents
{
EVENT_PROGRESS_1 = 1,
EVENT_PROGRESS_2,
EVENT_PROGRESS_3,
EVENT_PROGRESS_4,
EVENT_PROGRESS_5,
EVENT_PROGRESS_6,
EVENT_PROGRESS_7,
EVENT_PROGRESS_8,
EVENT_PROGRESS_9,
EVENT_PROGRESS_10,
EVENT_PROGRESS_11,
EVENT_PROGRESS_12,
EVENT_PROGRESS_13,
EVENT_PROGRESS_14,
EVENT_PROGRESS_15,
EVENT_PROGRESS_16,
EVENT_PROGRESS_17,
EVENT_PROGRESS_18,
EVENT_PROGRESS_19,
EVENT_PROGRESS_20,
EVENT_PROGRESS_21,
EVENT_PROGRESS_22,
EVENT_PROGRESS_23,
EVENT_PROGRESS_24,
EVENT_PROGRESS_25,
EVENT_PROGRESS_26,
EVENT_PROGRESS_27,
EVENT_SLEEP,
EVENT_DRUIDS_POTION
};
enum DisciplePaths
{
PATH_PROGRESS_1 = 367800,
PATH_PROGRESS_2 = 367801,
PATH_PROGRESS_3 = 367802,
PATH_PROGRESS_4 = 367803,
PATH_PROGRESS_5 = 367804,
PATH_NARALEX = 367900
};
enum DiscipleSummonGroups
{
SUMMON_GROUP_1 = 0,
SUMMON_GROUP_2 = 1,
SUMMON_GROUP_3 = 2,
SUMMON_GROUP_4 = 3,
SUMMON_GROUP_5 = 4
};
enum DiscipleMisc
{
GOSSIP_MENU_EVENT = 202
};
// 3678 - Disciple of Naralex
struct npc_disciple_of_naralex : public ScriptedAI
{
npc_disciple_of_naralex(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
void Reset() override
{
npc_disciple_of_naralexAI(Creature* creature) : EscortAI(creature)
_combatEvents.Reset();
}
void JustEngagedWith(Unit* who) override
{
_combatEvents.ScheduleEvent(EVENT_SLEEP, 5s, 10s);
_combatEvents.ScheduleEvent(EVENT_DRUIDS_POTION, 5s, 10s);
if (roll_chance(30))
Talk(SAY_AGGRO, who);
}
void JustSummoned(Creature* summoned) override
{
summoned->AI()->AttackStart(me);
}
void DoAction(int32 action) override
{
if (action == ACTION_ALL_DONE)
Talk(SAY_ALL_DONE);
}
void WaypointPathEnded(uint32/* waypointId*/, uint32 pathId) override
{
switch (pathId)
{
instance = creature->GetInstanceScript();
eventTimer = 0;
currentEvent = 0;
eventProgress = 0;
me->setActive(true);
me->SetFarVisible(true);
me->SetImmuneToPC(false);
case PATH_PROGRESS_1:
_events.ScheduleEvent(EVENT_PROGRESS_4, 1s);
break;
case PATH_PROGRESS_2:
_events.ScheduleEvent(EVENT_PROGRESS_8, 0s);
break;
case PATH_PROGRESS_3:
_events.ScheduleEvent(EVENT_PROGRESS_12, 1s);
break;
case PATH_PROGRESS_4:
_events.ScheduleEvent(EVENT_PROGRESS_14, 1s);
break;
case PATH_PROGRESS_5:
_events.ScheduleEvent(EVENT_PROGRESS_27, 0s);
break;
default:
break;
}
}
uint32 eventTimer;
uint32 currentEvent;
uint32 eventProgress;
InstanceScript* instance;
void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
void UpdateAI(uint32 diff) override
{
if (!me->IsInCombat())
{
switch (waypointId)
_events.Update(diff);
while (uint32 eventId = _events.ExecuteEvent())
{
case 4:
eventProgress = 1;
currentEvent = TYPE_NARALEX_PART1;
instance->SetData(TYPE_NARALEX_PART1, IN_PROGRESS);
break;
case 5:
Talk(SAY_MUST_CONTINUE);
instance->SetData(TYPE_NARALEX_PART1, DONE);
break;
case 11:
eventProgress = 1;
currentEvent = TYPE_NARALEX_PART2;
instance->SetData(TYPE_NARALEX_PART2, IN_PROGRESS);
break;
case 19:
Talk(SAY_BEYOND_THIS_CORRIDOR);
break;
case 24:
eventProgress = 1;
currentEvent = TYPE_NARALEX_PART3;
instance->SetData(TYPE_NARALEX_PART3, IN_PROGRESS);
break;
}
}
void Reset() override
{
}
void JustEngagedWith(Unit* who) override
{
Talk(SAY_ATTACKED, who);
}
void JustDied(Unit* /*killer*/) override
{
instance->SetData(TYPE_NARALEX_EVENT, FAIL);
instance->SetData(TYPE_NARALEX_PART1, FAIL);
instance->SetData(TYPE_NARALEX_PART2, FAIL);
instance->SetData(TYPE_NARALEX_PART3, FAIL);
}
void JustSummoned(Creature* summoned) override
{
summoned->AI()->AttackStart(me);
}
void UpdateAI(uint32 diff) override
{
if (currentEvent != TYPE_NARALEX_PART3)
EscortAI::UpdateAI(diff);
if (eventTimer <= diff)
{
eventTimer = 0;
if (instance->GetData(currentEvent) == IN_PROGRESS)
switch (eventId)
{
switch (currentEvent)
{
case TYPE_NARALEX_PART1:
if (eventProgress == 1)
{
++eventProgress;
Talk(SAY_TEMPLE_OF_PROMISE);
me->SummonCreature(NPC_DEVIATE_RAVAGER, -82.1763f, 227.874f, -93.3233f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5s);
me->SummonCreature(NPC_DEVIATE_RAVAGER, -72.9506f, 216.645f, -93.6756f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5s);
}
case EVENT_PROGRESS_1:
me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_ACTIVE);
me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);
_events.ScheduleEvent(EVENT_PROGRESS_2, 10s);
break;
case TYPE_NARALEX_PART2:
if (eventProgress == 1)
{
++eventProgress;
Talk(SAY_BANISH_THE_SPIRITS);
DoCast(me, SPELL_SERPENTINE_CLEANSING);
//CAST_AI(EscortAI, me->AI())->SetCanDefend(false);
eventTimer = 30000;
me->SummonCreature(NPC_DEVIATE_VIPER, -61.5261f, 273.676f, -92.8442f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5s);
me->SummonCreature(NPC_DEVIATE_VIPER, -58.4658f, 280.799f, -92.8393f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5s);
me->SummonCreature(NPC_DEVIATE_VIPER, -50.002f, 278.578f, -92.8442f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5s);
}
else
if (eventProgress == 2)
{
//CAST_AI(EscortAI, me->AI())->SetCanDefend(true);
Talk(SAY_CAVERNS_PURIFIED);
instance->SetData(TYPE_NARALEX_PART2, DONE);
if (me->HasAura(SPELL_SERPENTINE_CLEANSING))
me->RemoveAura(SPELL_SERPENTINE_CLEANSING);
}
case EVENT_PROGRESS_2:
Talk(SAY_PROGRESS_1);
_events.ScheduleEvent(EVENT_PROGRESS_3, 3500ms);
break;
case EVENT_PROGRESS_3:
me->GetMotionMaster()->MovePath(PATH_PROGRESS_1, false);
break;
case TYPE_NARALEX_PART3:
if (eventProgress == 1)
{
++eventProgress;
eventTimer = 4000;
me->SetStandState(UNIT_STAND_STATE_KNEEL);
Talk(SAY_EMERALD_DREAM);
}
else
if (eventProgress == 2)
{
++eventProgress;
eventTimer = 15000;
//CAST_AI(EscortAI, me->AI())->SetCanDefend(false);
if (Creature* naralex = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_NARALEX)))
DoCast(naralex, SPELL_NARALEXS_AWAKENING, true);
Talk(EMOTE_AWAKENING_RITUAL);
}
else
if (eventProgress == 3)
{
++eventProgress;
eventTimer = 15000;
if (Creature* naralex = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_NARALEX)))
naralex->AI()->Talk(EMOTE_TROUBLED_SLEEP);
me->SummonCreature(NPC_DEVIATE_MOCCASIN, 135.943f, 199.701f, -103.529f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15s);
me->SummonCreature(NPC_DEVIATE_MOCCASIN, 151.08f, 221.13f, -103.609f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15s);
me->SummonCreature(NPC_DEVIATE_MOCCASIN, 128.007f, 227.428f, -97.421f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15s);
}
else
if (eventProgress == 4)
{
++eventProgress;
eventTimer = 30000;
if (Creature* naralex = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_NARALEX)))
naralex->AI()->Talk(EMOTE_WRITHE_IN_AGONY);
me->SummonCreature(NPC_NIGHTMARE_ECTOPLASM, 133.413f, 207.188f, -102.469f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15s);
me->SummonCreature(NPC_NIGHTMARE_ECTOPLASM, 142.857f, 218.645f, -102.905f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15s);
me->SummonCreature(NPC_NIGHTMARE_ECTOPLASM, 105.102f, 227.211f, -102.752f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15s);
me->SummonCreature(NPC_NIGHTMARE_ECTOPLASM, 153.372f, 235.149f, -102.826f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15s);
me->SummonCreature(NPC_NIGHTMARE_ECTOPLASM, 149.524f, 251.113f, -102.558f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15s);
me->SummonCreature(NPC_NIGHTMARE_ECTOPLASM, 136.208f, 266.466f, -102.977f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15s);
me->SummonCreature(NPC_NIGHTMARE_ECTOPLASM, 126.167f, 274.759f, -102.962f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15s);
}
else
if (eventProgress == 5)
{
++eventProgress;
if (Creature* naralex = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_NARALEX)))
naralex->AI()->Talk(EMOTE_HORRENDOUS_VISION);
if (Creature* mutanus = me->SummonCreature(NPC_MUTANUS_THE_DEVOURER, 150.872f, 262.905f, -103.503f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5min))
Talk(SAY_MUTANUS_THE_DEVOURER, mutanus);
instance->SetData(TYPE_MUTANUS_THE_DEVOURER, IN_PROGRESS);
}
else
if (eventProgress == 6 && instance->GetData(TYPE_MUTANUS_THE_DEVOURER) == DONE)
{
++eventProgress;
eventTimer = 3000;
if (Creature* naralex = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_NARALEX)))
{
if (me->HasAura(SPELL_NARALEXS_AWAKENING))
me->RemoveAura(SPELL_NARALEXS_AWAKENING);
naralex->SetStandState(UNIT_STAND_STATE_STAND);
naralex->AI()->Talk(SAY_I_AM_AWAKE);
}
Talk(SAY_NARALEX_AWAKES);
}
else
if (eventProgress == 7)
{
++eventProgress;
eventTimer = 6000;
if (Creature* naralex = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_NARALEX)))
naralex->AI()->Talk(SAY_THANK_YOU);
}
else
if (eventProgress == 8)
{
++eventProgress;
eventTimer = 8000;
if (Creature* naralex = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_NARALEX)))
{
naralex->AI()->Talk(SAY_FAREWELL);
naralex->AddAura(SPELL_FLIGHT_FORM, naralex);
}
me->SetStandState(UNIT_STAND_STATE_STAND);
me->AddAura(SPELL_FLIGHT_FORM, me);
}
else
if (eventProgress == 9)
{
++eventProgress;
eventTimer = 1500;
if (Creature* naralex = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_NARALEX)))
naralex->GetMotionMaster()->MovePoint(25, naralex->GetPositionX(), naralex->GetPositionY(), naralex->GetPositionZ());
}
else
if (eventProgress == 10)
{
++eventProgress;
eventTimer = 2500;
if (Creature* naralex = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_NARALEX)))
{
naralex->GetMotionMaster()->MovePoint(0, 117.095512f, 247.107971f, -96.167870f);
naralex->GetMotionMaster()->MovePoint(1, 90.388809f, 276.135406f, -83.389801f);
}
me->GetMotionMaster()->MovePoint(26, 117.095512f, 247.107971f, -96.167870f);
me->GetMotionMaster()->MovePoint(27, 144.375443f, 281.045837f, -82.477135f);
}
else
if (eventProgress == 11)
{
if (Creature* naralex = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_NARALEX)))
naralex->SetVisible(false);
me->SetVisible(false);
instance->SetData(TYPE_NARALEX_PART3, DONE);
}
case EVENT_PROGRESS_4:
Talk(SAY_PROGRESS_2);
_events.ScheduleEvent(EVENT_PROGRESS_5, 7s);
break;
case EVENT_PROGRESS_5:
me->SummonCreatureGroup(SUMMON_GROUP_1);
_events.ScheduleEvent(EVENT_PROGRESS_6, 10s);
break;
case EVENT_PROGRESS_6:
me->SetFacingTo(5.742133140563964843f);
Talk(SAY_PROGRESS_3);
_events.ScheduleEvent(EVENT_PROGRESS_7, 3s);
break;
case EVENT_PROGRESS_7:
me->GetMotionMaster()->MovePath(PATH_PROGRESS_2, false);
break;
case EVENT_PROGRESS_8:
DoCastSelf(SPELL_SERPENTINE_CLEANSING);
Talk(SAY_PROGRESS_4);
_events.ScheduleEvent(EVENT_PROGRESS_9, 18s);
break;
case EVENT_PROGRESS_9:
me->SummonCreatureGroup(SUMMON_GROUP_2);
_events.ScheduleEvent(EVENT_PROGRESS_10, 12s);
break;
case EVENT_PROGRESS_10:
Talk(SAY_PROGRESS_5);
_events.ScheduleEvent(EVENT_PROGRESS_11, 5s);
break;
case EVENT_PROGRESS_11:
me->GetMotionMaster()->MovePath(PATH_PROGRESS_3, false);
break;
case EVENT_PROGRESS_12:
Talk(SAY_PROGRESS_6);
_events.ScheduleEvent(EVENT_PROGRESS_13, 5s);
break;
case EVENT_PROGRESS_13:
me->GetMotionMaster()->MovePath(PATH_PROGRESS_4, false);
break;
case EVENT_PROGRESS_14:
Talk(SAY_PROGRESS_7);
_events.ScheduleEvent(EVENT_PROGRESS_15, 5s);
break;
case EVENT_PROGRESS_15:
DoCastSelf(SPELL_NARALEXS_AWAKENING);
Talk(SAY_PROGRESS_8);
_events.ScheduleEvent(EVENT_PROGRESS_16, 4s);
break;
case EVENT_PROGRESS_16:
me->SummonCreatureGroup(SUMMON_GROUP_3);
_events.ScheduleEvent(EVENT_PROGRESS_17, 15s);
break;
case EVENT_PROGRESS_17:
if (Creature* naralex = _instance->GetCreature(DATA_NARALEX))
naralex->AI()->Talk(EMOTE_AWAKENING_1);
_events.ScheduleEvent(EVENT_PROGRESS_18, 25s);
break;
case EVENT_PROGRESS_18:
me->SummonCreatureGroup(SUMMON_GROUP_4);
_events.ScheduleEvent(EVENT_PROGRESS_19, 20s);
break;
case EVENT_PROGRESS_19:
if (Creature* naralex = _instance->GetCreature(DATA_NARALEX))
naralex->AI()->Talk(EMOTE_AWAKENING_2);
_events.ScheduleEvent(EVENT_PROGRESS_20, 30s);
break;
case EVENT_PROGRESS_20:
if (Creature* naralex = _instance->GetCreature(DATA_NARALEX))
naralex->AI()->Talk(EMOTE_AWAKENING_3);
me->SummonCreatureGroup(SUMMON_GROUP_5);
_events.ScheduleEvent(EVENT_PROGRESS_21, 25s);
break;
case EVENT_PROGRESS_21:
{
if (Creature* naralex = _instance->GetCreature(DATA_NARALEX))
{
naralex->SetStandState(UNIT_STAND_STATE_STAND);
naralex->AI()->Talk(SAY_AWAKENING_4);
}
_events.ScheduleEvent(EVENT_PROGRESS_22, 3s);
break;
}
case EVENT_PROGRESS_22:
me->RemoveAurasDueToSpell(SPELL_NARALEXS_AWAKENING);
Talk(SAY_PROGRESS_9);
_events.ScheduleEvent(EVENT_PROGRESS_23, 3s);
break;
case EVENT_PROGRESS_23:
if (Creature* naralex = _instance->GetCreature(DATA_NARALEX))
naralex->AI()->Talk(SAY_AWAKENING_5);
_events.ScheduleEvent(EVENT_PROGRESS_24, 6s);
break;
case EVENT_PROGRESS_24:
if (Creature* naralex = _instance->GetCreature(DATA_NARALEX))
naralex->AI()->Talk(SAY_AWAKENING_6);
_events.ScheduleEvent(EVENT_PROGRESS_25, 3s);
break;
case EVENT_PROGRESS_25:
DoCastSelf(SPELL_OWL_FORM);
if (Creature* naralex = _instance->GetCreature(DATA_NARALEX))
naralex->CastSpell(naralex, SPELL_OWL_FORM);
me->SetFaction(FACTION_FRIENDLY);
_events.ScheduleEvent(EVENT_PROGRESS_26, 8s);
break;
case EVENT_PROGRESS_26:
{
if (Creature* naralex = _instance->GetCreature(DATA_NARALEX))
{
naralex->SetDisableGravity(true);
naralex->GetMotionMaster()->MovePath(PATH_NARALEX, false);
}
me->SetDisableGravity(true);
me->GetMotionMaster()->MovePath(PATH_PROGRESS_5, false);
break;
}
}
} else eventTimer -= diff;
}
bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
ClearGossipMenuFor(player);
if (action == GOSSIP_ACTION_INFO_DEF + 1)
{
CloseGossipMenuFor(player);
if (instance)
instance->SetData(TYPE_NARALEX_EVENT, IN_PROGRESS);
Talk(SAY_MAKE_PREPARATIONS);
me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_ACTIVE);
me->SetImmuneToPC(false);
LoadPath(PATH_ESCORT_NARALEX_DISCIPLE);
Start(false, player->GetGUID());
SetDespawnAtFar(false);
SetDespawnAtEnd(false);
}
return true;
}
bool OnGossipHello(Player* player) override
{
DoCast(player, SPELL_MARK_OF_THE_WILD_RANK_2, true);
if ((instance->GetData(TYPE_LORD_COBRAHN) == DONE) && (instance->GetData(TYPE_LORD_PYTHAS) == DONE) &&
(instance->GetData(TYPE_LADY_ANACONDRA) == DONE) && (instance->GetData(TYPE_LORD_SERPENTIS) == DONE))
{
InitGossipMenuFor(player, GOSSIP_OPTION_LET_EVENT_BEGIN);
AddGossipItemFor(player, GOSSIP_OPTION_LET_EVENT_BEGIN, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
SendGossipMenuFor(player, NPC_TEXT_FANGLORDS_ARE_DEAD, me->GetGUID());
if (!instance->GetData(TYPE_NARALEX_YELLED))
{
Talk(SAY_AT_LAST);
instance->SetData(TYPE_NARALEX_YELLED, 1);
case EVENT_PROGRESS_27:
if (Creature* naralex = _instance->GetCreature(DATA_NARALEX))
naralex->DespawnOrUnsummon();
me->DespawnOrUnsummon();
break;
default:
break;
}
}
else
{
SendGossipMenuFor(player, NPC_TEXT_NARALEX_SLEEPS_AGAIN, me->GetGUID());
}
return true;
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetWailingCavernsAI<npc_disciple_of_naralexAI>(creature);
if (!UpdateVictim())
return;
_combatEvents.Update(diff);
while (uint32 eventId = _combatEvents.ExecuteEvent())
{
switch (eventId)
{
case EVENT_SLEEP:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
DoCast(target, SPELL_SLEEP);
_combatEvents.Repeat(20s, 30s);
break;
case EVENT_DRUIDS_POTION:
if (HealthBelowPct(80))
DoCastSelf(SPELL_DRUIDS_POTION);
_combatEvents.Repeat(10s, 15s);
break;
default:
break;
}
}
}
bool OnGossipHello(Player* player) override
{
DoCast(player, SPELL_MARK_OF_THE_WILD);
if (_instance->GetBossState(DATA_LORD_COBRAHN) == DONE && _instance->GetBossState(DATA_LORD_PYTHAS) == DONE
&& _instance->GetBossState(DATA_LADY_ANACONDRA) == DONE && _instance->GetBossState(DATA_LORD_SERPENTIS) == DONE)
{
player->PrepareGossipMenu(me, GOSSIP_MENU_EVENT, true);
player->SendPreparedGossip(me);
return true;
}
return false;
}
bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
{
CloseGossipMenuFor(player);
_events.ScheduleEvent(EVENT_PROGRESS_1, 0s);
return false;
}
private:
EventMap _events;
EventMap _combatEvents;
InstanceScript* _instance;
};
void AddSC_wailing_caverns()
{
new npc_disciple_of_naralex();
RegisterWailingCavernsCreatureAI(npc_disciple_of_naralex);
}
@@ -23,47 +23,43 @@
#define WCScriptName "instance_wailing_caverns"
#define DataHeader "WC"
enum WCBossIds
{
BOSS_LORD_COBRAHN = 0,
BOSS_LORD_PYTHAS = 1,
BOSS_LADY_ANACONDRA = 2,
BOSS_LORD_SERPENTIS = 3,
BOSS_MUTANUS_THE_DEVOURER = 8,
BOSS_KRESH = 9,
BOSS_SKUM = 10,
BOSS_VERDAN_THE_EVERLIVING = 11,
MAX_ENCOUNTER
};
constexpr uint32 EncounterCount = 8;
enum WCDataTypes
{
TYPE_LORD_COBRAHN = 1,
TYPE_LORD_PYTHAS = 2,
TYPE_LADY_ANACONDRA = 3,
TYPE_LORD_SERPENTIS = 4,
TYPE_NARALEX_EVENT = 5,
TYPE_NARALEX_PART1 = 6,
TYPE_NARALEX_PART2 = 7,
TYPE_NARALEX_PART3 = 8,
TYPE_MUTANUS_THE_DEVOURER = 9,
TYPE_NARALEX_YELLED = 10,
DATA_LORD_COBRAHN = 0, // Used in SAI (Creature 3669)
DATA_LORD_PYTHAS = 1, // Used in SAI (Creature 3670)
DATA_LADY_ANACONDRA = 2, // Used in SAI (Creature 3671)
DATA_LORD_SERPENTIS = 3, // Used in SAI (Creature 3673)
DATA_MUTANUS_THE_DEVOURER = 4, // Used in SAI (Creature 3654)
DATA_KRESH = 5,
DATA_SKUM = 6,
DATA_VERDAN_THE_EVERLIVING= 7,
DATA_NARALEX = 3679,
DATA_DISCIPLE,
DATA_NARALEX
};
enum WCCreatureIds
{
NPC_DISCIPLE = 3678,
NPC_NARALEX = 3679,
NPC_KRESH = 3653,
NPC_SKUM = 3674,
NPC_VERDAN_THE_EVERLIVING = 5775
};
enum WCActions
{
ACTION_ALL_DONE = 0
};
template <class AI, class T>
inline AI* GetWailingCavernsAI(T* obj)
{
return GetInstanceAI<AI>(obj, WCScriptName);
}
#define RegisterWailingCavernsCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetWailingCavernsAI)
#endif