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

This commit is contained in:
offl
2025-12-28 20:05:53 +02:00
committed by GitHub
parent 3f1085245c
commit 542e046815
4 changed files with 563 additions and 432 deletions

View File

@@ -0,0 +1,175 @@
--
UPDATE `gossip_menu_option` SET `MenuID` = 202 WHERE `MenuID` = 201;
UPDATE `smart_scripts` SET `action_param1` = 0, `action_param3` = 1 WHERE `entryorguid` = 3669 AND `source_type` = 0 AND `id` = 0;
UPDATE `smart_scripts` SET `action_param1` = 1, `action_param3` = 1 WHERE `entryorguid` = 3670 AND `source_type` = 0 AND `id` = 0;
UPDATE `smart_scripts` SET `action_param1` = 2, `action_param3` = 1 WHERE `entryorguid` = 3671 AND `source_type` = 0 AND `id` = 0;
UPDATE `smart_scripts` SET `action_param1` = 3, `action_param3` = 1 WHERE `entryorguid` = 3673 AND `source_type` = 0 AND `id` = 0;
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;
UPDATE `creature_template` SET `flags_extra` = `flags_extra` |512 WHERE `entry` IN (3678,3679);
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_data` WHERE `id` = 29426;
DELETE FROM `waypoint_data` WHERE `id` IN (367800,367801,367802,367803,367804,367900);
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
(367800,1,-113.91917,142.769,-80.914154,NULL,0,0,0,100,0),
(367800,2,-111.23017,153.39638,-80.598915,NULL,0,0,0,100,0),
(367800,3,-110.97073,165.60736,-79.444725,NULL,0,0,0,100,0),
(367800,4,-109.30049,181.25143,-79.76007,NULL,0,0,0,100,0),
(367800,5,-110.1942,190.9626,-80.42993,NULL,0,0,0,100,0),
(367800,6,-109.58964,199.15425,-81.23881,NULL,0,0,0,100,0),
(367800,7,-110.56909,206.86935,-82.88934,NULL,0,0,0,100,0),
(367800,8,-110.30787,216.23227,-85.9362,NULL,0,0,0,100,0),
(367800,9,-108.06385,227.87166,-89.926414,NULL,0,0,0,100,0),
(367800,10,-104.28827,234.40804,-91.64163,NULL,0,0,0,100,0),
(367801,1,-99.53033,230.78362,-91.13202,NULL,0,0,0,100,0),
(367801,2,-97.78033,229.78362,-90.88202,NULL,0,0,0,100,0),
(367801,3,-95.03033,229.03362,-90.38202,NULL,0,0,0,100,0),
(367801,4,-93.78033,228.78362,-90.38202,NULL,0,0,0,100,0),
(367801,5,-91.78033,228.28362,-90.38202,NULL,0,0,0,100,0),
(367801,6,-90.78033,228.28362,-91.13202,NULL,0,0,0,100,0),
(367801,7,-87.28033,227.78362,-92.38202,NULL,0,0,0,100,0),
(367801,8,-85.272385,227.1592,-93.12241,NULL,0,0,0,100,0),
(367801,9,-81.619774,223.63588,-93.58602,NULL,0,0,0,100,0),
(367801,10,-71.02429,212.48766,-93.52011,NULL,0,0,0,100,0),
(367801,11,-66.8499,209.88943,-93.30499,NULL,0,0,0,100,0),
(367801,12,-61.41215,207.00401,-93.55031,NULL,0,0,0,100,0),
(367801,13,-49.681805,204.15556,-95.96281,NULL,0,0,0,100,0),
(367801,14,-41.188667,204.99422,-96.51606,NULL,0,0,0,100,0),
(367801,15,-35.381386,212.98494,-96.097084,NULL,0,0,0,100,0),
(367801,16,-33.46709,223.27979,-95.68127,NULL,0,0,0,100,0),
(367801,17,-31.874804,231.84636,-94.49322,NULL,0,0,0,100,0),
(367801,18,-33.1077,240.3214,-93.5856,NULL,0,0,0,100,0),
(367801,19,-38.079693,250.99289,-93.11742,NULL,0,0,0,100,0),
(367801,20,-43.072884,259.32315,-92.84188,NULL,0,0,0,100,0),
(367801,21,-54.713943,273.85025,-92.84426,NULL,0,0,0,100,0),
(367802,1,-49.880116,287.8062,-92.24503,NULL,0,0,0,100,0),
(367802,2,-47.99677,295.32455,-90.81826,NULL,0,0,0,100,0),
(367802,3,-38.468487,306.85004,-89.96177,NULL,0,0,0,100,0),
(367802,4,-34.199474,309.35944,-89.57565,NULL,0,0,0,100,0),
(367802,5,-23.514927,310.80438,-88.513176,NULL,0,0,0,100,0),
(367802,6,-9.611309,305.38797,-88.19709,NULL,0,0,0,100,0),
(367802,7,-3.915017,301.293,-86.814804,NULL,0,0,0,100,0),
(367802,8,-0.235204,294.51816,-85.46129,NULL,0,0,0,100,0),
(367802,9,3.204272,288.31448,-85.4905,NULL,0,0,0,100,0),
(367802,10,10.753059,278.38467,-85.8368,NULL,0,0,0,100,0),
(367802,11,16.977774,273.39676,-86.23834,NULL,0,0,0,100,0),
(367802,12,25.977861,264.6067,-86.788,NULL,0,0,0,100,0),
(367802,13,29.228964,257.175,-87.57598,NULL,0,0,0,100,0),
(367802,14,30.13821,248.86757,-87.36985,NULL,0,0,0,100,0),
(367802,15,38.86757,240.09755,-87.588615,NULL,0,0,0,100,0),
(367802,16,43.998184,234.17651,-87.98252,NULL,0,0,0,100,0),
(367802,17,48.403416,229.11066,-88.36456,NULL,0,0,0,100,0),
(367802,18,54.5601,210.85043,-89.80927,NULL,0,0,0,100,0),
(367803,1,67.69076,205.52835,-92.56347,NULL,0,0,0,100,0),
(367803,2,71.46944,206.84753,-93.108925,NULL,0,0,0,100,0),
(367803,3,77.15617,209.72255,-93.07799,NULL,0,0,0,100,0),
(367803,4,80.431854,214.86958,-93.177925,NULL,0,0,0,100,0),
(367803,5,83.29396,220.0915,-93.69437,NULL,0,0,0,100,0),
(367803,6,86.2444,225.64459,-94.54216,NULL,0,0,0,100,0),
(367803,7,89.99905,229.58038,-95.01256,NULL,0,0,0,100,0),
(367803,8,94.13328,232.7041,-95.36724,NULL,0,0,0,100,0),
(367803,9,99.00888,233.9866,-95.57549,NULL,0,0,0,100,0),
(367803,10,104.59536,233.409,-95.82651,NULL,0,0,0,100,0),
(367803,11,109.07845,232.6175,-96.046,NULL,0,0,0,100,0),
(367803,12,112.8708,233.57512,-96.32112,NULL,0,0,0,100,0),
(367803,13,114.51453,235.30222,-96.160706,NULL,0,0,0,100,0),
(367803,14,114.94154,237.7185,-96.02783,NULL,0,0,0,100,0),
(367804,1,119.04473,234.3336,-94.031525,NULL,0,1,0,100,0),
(367804,2,123.39298,232.1507,-93.80932,NULL,0,1,0,100,0),
(367804,3,129.23982,232.90259,-94.39268,NULL,0,1,0,100,0),
(367804,4,133.76927,236.9294,-95.39268,NULL,0,1,0,100,0),
(367804,5,136.03003,244.8155,-95.80936,NULL,0,1,0,100,0),
(367804,6,134.06624,253.92725,-95.1149,NULL,0,1,0,100,0),
(367804,7,123.16401,266.276,-93.587135,NULL,0,1,0,100,0),
(367804,8,113.3055,265.7754,-91.4482,NULL,0,1,0,100,0),
(367804,9,95.87152,250.9106,-87.55935,NULL,0,1,0,100,0),
(367804,10,87.43284,232.42879,-85.761505,NULL,0,1,0,100,0),
(367804,11,83.19081,218.43571,-84.08354,NULL,0,1,0,100,0),
(367804,12,70.24749,206.56226,-85.1376,NULL,0,1,0,100,0),
(367804,13,47.183872,206.66559,-83.493935,NULL,0,1,0,100,0),
(367804,14,34.54772,204.78317,-82.05306,NULL,0,1,0,100,0),
(367804,15,7.085161,202.25589,-77.79443,NULL,0,1,0,100,0),
(367804,16,-42.047256,203.44832,-83.76682,NULL,0,1,0,100,0),
(367804,17,-65.46242,208.19424,-83.76682,NULL,0,1,0,100,0),
(367804,18,-84.21845,225.56584,-83.76682,NULL,0,1,0,100,0),
(367900,1,117.57947,245.2589,-92.93683,NULL,0,1,0,100,0),
(367900,2,122.07437,244.77504,-91.96459,NULL,0,1,0,100,0),
(367900,3,126.5081,244.80745,-91.52022,NULL,0,1,0,100,0),
(367900,4,130.2855,244.1119,-91.49244,NULL,0,1,0,100,0),
(367900,5,131.33621,246.79683,-90.96464,NULL,0,1,0,100,0),
(367900,6,131.5437,250.70665,-90.85357,NULL,0,1,0,100,0),
(367900,7,131.16864,254.23598,-90.909134,NULL,0,1,0,100,0),
(367900,8,129.56184,256.8811,-90.77021,NULL,0,1,0,100,0),
(367900,9,125.7399,260.43616,-90.35347,NULL,0,1,0,100,0),
(367900,10,120.87533,261.45663,-91.15907,NULL,0,1,0,100,0),
(367900,11,116.536,261.01016,-91.46457,NULL,0,1,0,100,0),
(367900,12,107.43984,258.64542,-91.270226,NULL,0,1,0,100,0),
(367900,13,98.73815,250.1042,-90.18684,NULL,0,1,0,100,0),
(367900,14,91.52554,238.34152,-89.32576,NULL,0,1,0,100,0),
(367900,15,88.4579,228.32156,-88.59779,NULL,0,1,0,100,0),
(367900,16,83.84989,220.01965,-86.313835,NULL,0,1,0,100,0),
(367900,17,77.0841,211.77414,-84.73362,NULL,0,1,0,100,0),
(367900,18,67.49621,205.84052,-84.928276,NULL,0,1,0,100,0),
(367900,19,53.191616,205.93796,-84.08481,NULL,0,1,0,100,0),
(367900,20,33.344265,203.22813,-79.139854,NULL,0,1,0,100,0),
(367900,21,5.091723,198.6573,-71.71256,NULL,0,1,0,100,0),
(367900,22,-32.916367,204.26924,-83.12926,NULL,0,1,0,100,0),
(367900,23,-62.042313,206.22604,-83.12926,NULL,0,1,0,100,0);

View File

@@ -15,21 +15,18 @@
* 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 "Log.h"
#include "Map.h"
#include "wailing_caverns.h"
#define MAX_ENCOUNTER 9
static constexpr ObjectData creatureData[] =
{
{ NPC_DISCIPLE, DATA_DISCIPLE },
{ NPC_NARALEX, DATA_NARALEX },
{ 0, 0 } // END
};
class instance_wailing_caverns : public InstanceMapScript
{
@@ -46,100 +43,37 @@ public:
instance_wailing_caverns_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
{
SetHeaders(DataHeader);
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
yelled = false;
SetBossNumber(EncounterCount);
LoadObjectData(creatureData, nullptr);
}
uint32 m_auiEncounter[MAX_ENCOUNTER];
bool yelled;
ObjectGuid NaralexGUID;
void OnCreatureCreate(Creature* creature) override
bool SetBossState(uint32 type, EncounterState state) override
{
if (creature->GetEntry() == DATA_NARALEX)
NaralexGUID = creature->GetGUID();
}
if (!InstanceScript::SetBossState(type, state))
return false;
void SetData(uint32 type, uint32 data) override
{
switch (type)
{
case TYPE_LORD_COBRAHN: m_auiEncounter[0] = data;break;
case TYPE_LORD_PYTHAS: m_auiEncounter[1] = data;break;
case TYPE_LADY_ANACONDRA: m_auiEncounter[2] = data;break;
case TYPE_LORD_SERPENTIS: m_auiEncounter[3] = data;break;
case TYPE_NARALEX_EVENT: m_auiEncounter[4] = data;break;
case TYPE_NARALEX_PART1: m_auiEncounter[5] = data;break;
case TYPE_NARALEX_PART2: m_auiEncounter[6] = data;break;
case TYPE_NARALEX_PART3: m_auiEncounter[7] = data;break;
case TYPE_MUTANUS_THE_DEVOURER: m_auiEncounter[8] = data;break;
case TYPE_NARALEX_YELLED: yelled = true; 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;
}
if (data == DONE)SaveToDB();
return true;
}
uint32 GetData(uint32 type) const override
{
switch (type)
{
case TYPE_LORD_COBRAHN: return m_auiEncounter[0];
case TYPE_LORD_PYTHAS: return m_auiEncounter[1];
case TYPE_LADY_ANACONDRA: return m_auiEncounter[2];
case TYPE_LORD_SERPENTIS: return m_auiEncounter[3];
case TYPE_NARALEX_EVENT: return m_auiEncounter[4];
case TYPE_NARALEX_PART1: return m_auiEncounter[5];
case TYPE_NARALEX_PART2: return m_auiEncounter[6];
case TYPE_NARALEX_PART3: return m_auiEncounter[7];
case TYPE_MUTANUS_THE_DEVOURER: return m_auiEncounter[8];
case TYPE_NARALEX_YELLED: return yelled;
}
return 0;
}
ObjectGuid GetGuidData(uint32 data) const override
{
if (data == DATA_NARALEX)return NaralexGUID;
return ObjectGuid::Empty;
}
std::string GetSaveData() override
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2] << ' '
<< m_auiEncounter[3] << ' ' << m_auiEncounter[4] << ' ' << m_auiEncounter[5] << ' '
<< m_auiEncounter[6] << ' ' << m_auiEncounter[7] << ' ' << m_auiEncounter[8];
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
void Load(char const* in) override
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
std::istringstream loadStream(in);
loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3]
>> m_auiEncounter[4] >> m_auiEncounter[5] >> m_auiEncounter[6] >> m_auiEncounter[7] >> m_auiEncounter[8];
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] != DONE)
m_auiEncounter[i] = NOT_STARTED;
OUT_LOAD_INST_DATA_COMPLETE;
}
};
};
void AddSC_instance_wailing_caverns()

View File

@@ -15,366 +15,377 @@
* 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_i(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;
}
}
DoMeleeAttackIfReady();
}
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);
}

View File

@@ -23,20 +23,29 @@
#define WCScriptName "instance_wailing_caverns"
#define DataHeader "WC"
constexpr uint32 EncounterCount = 5;
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_NARALEX = 3679,
DATA_DISCIPLE,
DATA_NARALEX
};
enum WCCreatureIds
{
NPC_DISCIPLE = 3678,
NPC_NARALEX = 3679
};
enum WCActions
{
ACTION_ALL_DONE = 0
};
template <class AI, class T>
@@ -45,4 +54,6 @@ inline AI* GetWailingCavernsAI(T* obj)
return GetInstanceAI<AI>(obj, WCScriptName);
}
#define RegisterWailingCavernsCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetWailingCavernsAI)
#endif