mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Scripts/Wailing Caverns: Rewrite Naralex event (#31445)
This commit is contained in:
175
sql/updates/world/3.3.5/2025_12_28_00_world.sql
Normal file
175
sql/updates/world/3.3.5/2025_12_28_00_world.sql
Normal 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);
|
||||
@@ -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()
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user