Scripts/NeltharionsLair: Implement Rokmora encounter (#31162)

This commit is contained in:
Aqua Deus
2026-01-31 22:21:03 +01:00
committed by GitHub
parent 29be2d4388
commit 930d86abd0
5 changed files with 896 additions and 0 deletions
@@ -0,0 +1,137 @@
SET @ATSPAWN := 276;
SET @ATPROP := 171;
SET @ATID := 180;
-- Creature
DELETE FROM `creature_template_addon` WHERE `entry`=97720;
INSERT INTO `creature_template_addon` (`entry`, `PathId`, `mount`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvpFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES
(97720, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 3, ''); -- 97720 (Blightshard Skitter)
UPDATE `creature_template` SET `faction`=16, `speed_run`=1.428571462631225585, `BaseAttackTime`=2000, `unit_flags2`=0x820, `unit_flags3`=0x80000 WHERE `entry`=97720; -- Blightshard Skitter
UPDATE `creature_template` SET `unit_flags`=0x8140, `ScriptName` = 'boss_rokmora' WHERE `entry`=91003;
UPDATE `creature_template` SET `ScriptName` = 'npc_rokmora_navarrogg_intro' WHERE `entry` = 100700;
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` IN (105300, 97720);
-- Difficulty
UPDATE `creature_template_difficulty` SET `LevelScalingDeltaMin`=2, `LevelScalingDeltaMax`=2, `ContentTuningID`=629, `StaticFlags1`=0x10000000, `VerifiedBuild`=61967 WHERE (`Entry`=100700 AND `DifficultyID`=0); -- 100700 (Navarrogg) - CanSwim
UPDATE `creature_template_difficulty` SET `ContentTuningID`=629, `StaticFlags1`=0x10000000, `VerifiedBuild`=61967 WHERE (`Entry`=97720 AND `DifficultyID`=23); -- 97720 (Blightshard Skitter) - CanSwim
-- Areatrigger
DELETE FROM `areatrigger` WHERE `SpawnId`=@ATSPAWN;
INSERT INTO `areatrigger` (`SpawnId`, `AreaTriggerCreatePropertiesId`, `IsCustom`, `MapId`, `SpawnDifficulties`, `PosX`, `PosY`, `PosZ`, `Orientation`, `PhaseUseFlags`, `PhaseId`, `PhaseGroup`, `ScriptName`, `Comment`, `VerifiedBuild`) VALUES
(@ATSPAWN, @ATPROP, 1, 1458, '23,2,8,1', 2921.3066, 1394.1822, -2.4048, 5.180378, 0, 0, 0, 'at_rokmora_intro', 'Neltharion\'s Lair - Rokmora Intro', 0);
DELETE FROM `areatrigger_create_properties` WHERE `Id`=@ATPROP AND `IsCustom`=1;
INSERT INTO `areatrigger_create_properties` (`Id`, `IsCustom`, `AreaTriggerId`, `IsAreatriggerCustom`, `Flags`, `MoveCurveId`, `ScaleCurveId`, `MorphCurveId`, `FacingCurveId`, `AnimId`, `AnimKitId`, `DecalPropertiesId`, `SpellForVisuals`, `TimeToTargetScale`, `Speed`, `Shape`, `ShapeData0`, `ShapeData1`, `ShapeData2`, `ShapeData3`, `ShapeData4`, `ShapeData5`, `ShapeData6`, `ShapeData7`, `ScriptName`, `VerifiedBuild`) VALUES
(@ATPROP, 1, @ATID, 1, 0, 0, 0, 0, 0, -1, 0, 0, NULL, 0, 0, 0, 20, 20, 0, 0, 0, 0, 0, 0, '', 0);
DELETE FROM `areatrigger_template` WHERE `Id`=@ATID AND `IsCustom`=1;
INSERT INTO `areatrigger_template` (`Id`, `IsCustom`, `Flags`, `ActionSetId`, `ActionSetFlags`, `VerifiedBuild`) VALUES
(@ATID, 1, 1, 0, 0, 0);
DELETE FROM `areatrigger_create_properties` WHERE (`IsCustom`=0 AND `Id` IN (4953,7415));
INSERT INTO `areatrigger_create_properties` (`Id`, `IsCustom`, `AreaTriggerId`, `IsAreatriggerCustom`, `Flags`, `MoveCurveId`, `ScaleCurveId`, `MorphCurveId`, `FacingCurveId`, `AnimId`, `AnimKitId`, `DecalPropertiesId`, `SpellForVisuals`, `TimeToTargetScale`, `Speed`, `Shape`, `ShapeData0`, `ShapeData1`, `ShapeData2`, `ShapeData3`, `ShapeData4`, `ShapeData5`, `ShapeData6`, `ShapeData7`, `ScriptName`, `VerifiedBuild`) VALUES
(4953, 0, 9669, 0, 0, 0, 0, 0, 0, -1, 0, 426, NULL, 300000, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 'at_rokmora_choking_dust', 61967), -- Spell: 192799 (Choking Dust)
(7415, 0, 11860, 0, 2, 0, 1958, 0, 0, -1, 0, 64, NULL, 10000, 0, 0, 45, 45, 0, 0, 0, 0, 0, 0, 'at_rokmora_crystalline_ground', 61967); -- Spell: 216470 (Crystalline Ground)
-- Instance
DELETE FROM `instance_template` WHERE `map`=1458;
INSERT INTO `instance_template` (`map`, `parent`, `script`) VALUES
(1458, 0, 'instance_neltharions_lair');
-- Conversation
DELETE FROM `conversation_actors` WHERE (`Idx`=0 AND `ConversationId` IN (1885, 822, 823, 824, 825) OR (`Idx`=1 AND `ConversationId` IN (1885)));
INSERT INTO `conversation_actors` (`ConversationId`, `ConversationActorId`, `ConversationActorGuid`, `Idx`, `CreatureId`, `CreatureDisplayInfoId`, `NoActorObject`, `ActivePlayerObject`, `VerifiedBuild`) VALUES
(822, 50446, 6004276, 0, 0, 0, 0, 0, 61967), -- Full: 0x20197CB64058DEC0006D9F00000266A8 Creature/0 R1631/S28063 Map: 1458 (Neltharion's Lair) Entry: 91003 (Rokmora) Low: 157352
(823, 50446, 6004276, 0, 0, 0, 0, 0, 61967), -- Full: 0x20197CB64058DEC0006D9F00000266A8 Creature/0 R1631/S28063 Map: 1458 (Neltharion's Lair) Entry: 91003 (Rokmora) Low: 157352
(824, 50446, 6004276, 0, 0, 0, 0, 0, 61967), -- Full: 0x20197CB64058DEC0006D9F00000266A8 Creature/0 R1631/S28063 Map: 1458 (Neltharion's Lair) Entry: 91003 (Rokmora) Low: 157352
(825, 50446, 6004276, 0, 0, 0, 0, 0, 61967), -- Full: 0x20197CB64058DEC0006D9F00000266A8 Creature/0 R1631/S28063 Map: 1458 (Neltharion's Lair) Entry: 91003 (Rokmora) Low: 157352
(1885, 52526, 6004308, 0, 105300, 0, 0, 0, 61967), -- Full: 0x20197CB64066D500006D9F00000266A8 Creature/0 R1631/S28063 Map: 1458 (Neltharion's Lair) Entry: 105300 (Ularogg Cragshaper) Low: 157352
(1885, 52530, 0, 1, 100700, 0, 0, 0, 61967); -- Full: 0x20197CB640625700006D9F00000266FB Creature/0 R1631/S28063 Map: 1458 (Neltharion's Lair) Entry: 100700 (Navarrogg) Low: 157435
DELETE FROM `conversation_template` WHERE `Id` IN (822, 823, 824, 825, 1885);
INSERT INTO `conversation_template` (`Id`, `FirstLineId`, `TextureKitId`, `Flags`, `ScriptName`, `VerifiedBuild`) VALUES
(822, 2010, 0, 0, '', 61967),
(823, 2011, 0, 0, '', 61967),
(824, 2012, 0, 0, '', 61967),
(825, 2013, 0, 0, '', 61967),
(1885, 3990, 0, 0, 'conversation_rokmora_intro', 61967);
DELETE FROM `conversation_line_template` WHERE `Id` IN (3992, 3991, 3990, 2013, 2012, 2011, 2010);
INSERT INTO `conversation_line_template` (`Id`, `UiCameraID`, `ActorIdx`, `Flags`, `ChatType`, `VerifiedBuild`) VALUES
(2010, 0, 0, 0, 1, 61967),
(2011, 0, 0, 0, 1, 61967),
(2012, 0, 0, 0, 1, 61967),
(2013, 0, 0, 0, 1, 61967),
(3992, 0, 0, 0, 1, 61967),
(3991, 0, 1, 0, 1, 61967),
(3990, 0, 0, 0, 1, 61967);
-- Texts
DELETE FROM `creature_text` WHERE `CreatureID` = 91003;
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(91003, 0, 0, 'Rok SMASH!', 14, 0, 100, 0, 0, 54551, 102714, 0, 'Rokmora'),
(91003, 1, 0, 'Rokmora creates |cFFFF0000|Hspell:215898|h[Crystaline Ground]|h|r! Don\'t move!', 41, 0, 100, 0, 0, 0, 114681, 0, 'Rokmora'),
(91003, 2, 0, 'Rokmora rears back for |cFFFF0000|Hspell:188169|h[Razor Shards]|h|r!', 41, 0, 100, 0, 0, 0, 108748, 0, 'Rokmora'),
(91003, 3, 0, 'Rok... no... break', 14, 0, 100, 0, 0, 54549, 102713, 0, 'Rokmora');
-- Conditions
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (209390, 200247);
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ConditionStringValue1`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(13, 1, 209390, 0, 0, 51, 0, 5, 91003, 0, '', 0, 0, 0, '', 'Spell \'Boss 01 Intro Ularogg Cast\' can only hit Rokmora'),
(13, 1, 200247, 0, 0, 51, 0, 5, 97720, 0, '', 0, 0, 0, '', 'Spell \'Shatter\' can only hit \'Blightshard Skitter\'');
-- SAI
DELETE FROM `smart_scripts` WHERE `entryorguid`=105300 AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(105300, 0, 0, 0, '', 63, 0, 100, 0, 0, 0, 0, 0, 0, '', 85, 209390, 2, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Ularogg - On Just Created - Cast Self: Boss 01 Intro Ularogg Cast'),
(105300, 0, 1, 0, '', 40, 0, 100, 0, 5, 10530000, 0, 0, 0, '', 41, 1, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Ularogg - On waypoint 5 reached - Despawn');
DELETE FROM `smart_scripts` WHERE `entryorguid`=97720 AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(97720, 0, 0, 0, '', 6, 0, 100, 0, 0, 0, 0, 0, 0, '', 85, 192799, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Blightshard Skitter - On Just Died - Cast \'Choking Dust\''),
(97720, 0, 1, 0, '2,8,23', 6, 0, 100, 0, 0, 0, 0, 0, 0, '', 85, 215929, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Blightshard Skitter (Difficulties Heroic, Mythic and M+) - On Just Died - Cast \'Rupturing Skitter\'');
-- Spells
DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_rokmora_crystalline_ground_periodic', 'spell_rokmora_emerge', 'spell_rokmora_razor_shards', 'spell_rokmora_shatter', 'spell_rokmora_update_interactions');
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(215898, 'spell_rokmora_crystalline_ground_periodic'),
(209394, 'spell_rokmora_emerge'),
(188169, 'spell_rokmora_razor_shards'),
(188114, 'spell_rokmora_shatter'),
(134730, 'spell_rokmora_update_interactions');
-- Waypoints
SET @ENTRY := 105300;
SET @PATHOFFSET := 0;
SET @PATH := @ENTRY * 100 + @PATHOFFSET;
DELETE FROM `waypoint_path` WHERE `PathId`= @PATH;
INSERT INTO `waypoint_path` (`PathId`, `MoveType`, `Flags`, `Comment`) VALUES
(@PATH, 1, 0, 'Neltharion\'s Lair - Ularogg Rokmora Intro Path');
DELETE FROM `waypoint_path_node` WHERE `PathId`= @PATH;
INSERT INTO `waypoint_path_node` (`PathId`, `NodeId`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `Delay`) VALUES
(@PATH, 0, 2884.442, 1397.453, -2.405085, NULL, 0),
(@PATH, 1, 2871.429, 1382.59, -2.403809, NULL, 0),
(@PATH, 2, 2864.82, 1372.012, -2.044964, NULL, 0),
(@PATH, 3, 2847.353, 1358.851, -0.1555594, NULL, 0),
(@PATH, 4, 2828.669, 1352.583, 0.9565357, NULL, 0),
(@PATH, 5, 2816.361, 1353.323, 4.334983, NULL, 0);
SET @ENTRY := 100700;
SET @PATHOFFSET := 0;
SET @PATH := @ENTRY * 100 + @PATHOFFSET;
DELETE FROM `waypoint_path` WHERE `PathId`= @PATH;
INSERT INTO `waypoint_path` (`PathId`, `MoveType`, `Flags`, `Comment`) VALUES
(@PATH, 1, 0, 'Neltharion\'s Lair - Navarrogg Rokmora Intro Path');
DELETE FROM `waypoint_path_node` WHERE `PathId`= @PATH;
INSERT INTO `waypoint_path_node` (`PathId`, `NodeId`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `Delay`) VALUES
(@PATH, 0, 2899.39, 1406.309, -2.405086, NULL, 0),
(@PATH, 1, 2886.757, 1399.142, -2.405085, NULL, 0),
(@PATH, 2, 2876.358, 1391.255, -2.405085, NULL, 0),
(@PATH, 3, 2865.902, 1373.759, -2.163703, NULL, 0),
(@PATH, 4, 2858.577, 1366.91, -1.52154, NULL, 0),
(@PATH, 5, 2840.839, 1355.285, -0.3443635, NULL, 0),
(@PATH, 6, 2830.136, 1352.953, 0.7276564, NULL, 0),
(@PATH, 7, 2822.574, 1353.08, 2.647024, NULL, 0);
@@ -0,0 +1,583 @@
/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "AreaTrigger.h"
#include "AreaTriggerAI.h"
#include "Conversation.h"
#include "ConversationAI.h"
#include "Creature.h"
#include "InstanceScript.h"
#include "Map.h"
#include "MotionMaster.h"
#include "PathGenerator.h"
#include "Player.h"
#include "ScriptedCreature.h"
#include "ScriptMgr.h"
#include "SpellAuras.h"
#include "SpellAuraEffects.h"
#include "SpellScript.h"
#include "TemporarySummon.h"
#include "neltharions_lair.h"
enum RokmoraSpells
{
// Intro Spells
SPELL_JUMP_TO_GROUND_COSMETIC = 184483,
SPELL_BOSS_INTRO_CONVERSATION = 209374,
SPELL_BOSS_INTRO_EMERGE = 209394,
SPELL_UPDATE_INTERACTIONS = 134730,
SPELL_ULAROGG_COSMETIC = 209390,
// Combat
SPELL_CHOKING_DUST_DAMAGE = 192800,
SPELL_CRYSTALLINE_GROUND = 198024,
SPELL_CRYSTALLINE_GROUND_AREATRIGGER = 216470,
SPELL_CRYSTALLINE_GROUND_DAMAGE = 198028,
SPELL_CRYSTALLINE_GROUND_PERIODIC = 215898,
SPELL_CRYSTALLINE_GROUND_VISUAL = 216488,
// SPELL_CRYSTALLINE_GROUND_UNK = 470381 unknown purpose
SPELL_GAIN_ENERGY = 193245,
SPELL_RAZOR_SHARDS = 188169,
SPELL_RAZOR_SHARDS_VISUAL = 188207,
SPELL_RAZOR_SHARDS_VISUAL_2 = 197920,
SPELL_RUPTURING_SKITTER = 215929,
SPELL_SHATTER = 188114,
SPELL_SHATTER_KILL_SKITTERS = 200247,
SPELL_ROKMORA_COMBAT_CONVO_1 = 198122, // Rok shatter!
SPELL_ROKMORA_COMBAT_CONVO_2 = 198125, // Rok stronger! (unused?)
SPELL_ROKMORA_COMBAT_CONVO_3 = 198135, // Tiny piddle, big puddle.
SPELL_ROKMORA_COMBAT_CONVO_4 = 198136 // Nothing beat Rok!
};
enum RokmoraEvents
{
EVENT_SHATTER = 1,
EVENT_RAZOR_SHARDS,
EVENT_CRYSTALLINE_GROUND,
EVENT_CHECK_ENERGY,
EVENT_ROKMORA_INTRO_MOVE
};
enum RokmoraTexts
{
SAY_AGGRO = 0,
SAY_CRYSTALLINE_GROUND_WARNING = 1,
SAY_RAZOR_SHARDS_WARNING = 2,
SAY_DIED = 3
};
enum RokmoraConversation
{
POINT_NAVAROGG_JUMP = 0,
POINT_NAVAROGG_INTRO = 1,
CONVO_ACTOR_NAVARROGG = 52530,
CONVO_ULAROGG_INTRO_LINE_03 = 3992,
CONVO_ACTOR_ID_ULAROGG = 0,
CONVO_ACTOR_ID_NAVARROGG = 1,
PATH_ULAROGG = 10530000,
PATH_NAVARROGG = 10070000,
WAYPOINT_DESPAWN = 7
};
enum RokmoraMisc
{
NPC_NAVARROGG = 100700,
NPC_ULAROGG = 105300,
NPC_SKITTER = 97720
};
constexpr Position NavarroggIntroPosition = { 2959.8716f, 1390.5312f, 53.52835f, 2.721162f };
constexpr Position NavarroggIntroPosition2 = { 2917.3196f, 1402.2882f, -2.405084f };
constexpr Position NavarroggJumpIntroPosition = { 2930.9895f, 1395.7848f, -2.641485f, 2.721162f };
// 91003 - Rokmora
struct boss_rokmora : public BossAI
{
boss_rokmora(Creature* creature) : BossAI(creature, DATA_ROKMORA) { }
void JustAppeared() override
{
if (instance->GetData(DATA_ROKMORA_INTRO_STATE) == DONE)
me->SetImmuneToPC(false);
}
void JustDied(Unit* /*killer*/) override
{
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
_JustDied();
Talk(SAY_DIED);
}
void KilledUnit(Unit* victim) override
{
if (victim->GetEntry() == NPC_SKITTER)
{
uint32 spellId = RAND(SPELL_ROKMORA_COMBAT_CONVO_3, SPELL_ROKMORA_COMBAT_CONVO_4);
DoCastSelf(spellId);
}
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
summons.DespawnAll();
_EnterEvadeMode();
_DespawnAtEvade();
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
DoCastSelf(SPELL_GAIN_ENERGY);
me->SetMaxPower(POWER_ENERGY, 100); // power is set to 0 in Creature::UpdateMaxPower
events.ScheduleEvent(EVENT_RAZOR_SHARDS, 29100ms);
events.ScheduleEvent(EVENT_CHECK_ENERGY, 500ms);
if (IsHeroicOrHigher()) // Casted once
events.ScheduleEvent(EVENT_CRYSTALLINE_GROUND, 3400ms);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_RAZOR_SHARDS:
{
Talk(SAY_RAZOR_SHARDS_WARNING);
DoCastVictim(SPELL_RAZOR_SHARDS);
events.Repeat(29200ms);
break;
}
case EVENT_CRYSTALLINE_GROUND:
{
Talk(SAY_CRYSTALLINE_GROUND_WARNING);
DoCastSelf(SPELL_CRYSTALLINE_GROUND);
break;
}
case EVENT_CHECK_ENERGY:
{
if (me->GetPower(POWER_ENERGY) >= 100)
{
DoCastSelf(SPELL_ROKMORA_COMBAT_CONVO_1);
DoCastSelf(SPELL_SHATTER);
}
events.Repeat(500ms);
break;
}
default:
break;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
}
}
};
// 215898 - Crystalline Ground
class spell_rokmora_crystalline_ground_periodic : public AuraScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_CRYSTALLINE_GROUND_DAMAGE, SPELL_CRYSTALLINE_GROUND_VISUAL });
}
void HandleEffectPeriodic(AuraEffect const* aurEff) const
{
if (Unit* caster = GetCaster())
{
Unit* target = GetTarget();
target->CastSpell(target, SPELL_CRYSTALLINE_GROUND_VISUAL, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
if (target->isMoving())
caster->CastSpell(target, SPELL_CRYSTALLINE_GROUND_DAMAGE, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
.TriggeringAura = aurEff
});
}
}
void Register() override
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_rokmora_crystalline_ground_periodic::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
// 188114 - Shatter
class spell_rokmora_shatter : public SpellScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_CRYSTALLINE_GROUND_AREATRIGGER, SPELL_SHATTER_KILL_SKITTERS });
}
void HandleShatter() const
{
Unit* caster = GetCaster();
CastSpellExtraArgs args;
args.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR;
caster->CastSpell(caster, SPELL_SHATTER_KILL_SKITTERS, args);
if (caster->GetMap()->IsHeroicOrHigher())
caster->CastSpell(caster->GetPosition(), SPELL_CRYSTALLINE_GROUND_AREATRIGGER, args);
caster->SetPower(POWER_ENERGY, 0);
}
void Register() override
{
AfterCast += SpellCastFn(spell_rokmora_shatter::HandleShatter);
}
};
// 188169 - Razor Shards
class spell_rokmora_razor_shards : public SpellScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_RAZOR_SHARDS_VISUAL, SPELL_RAZOR_SHARDS_VISUAL_2 });
}
Position GetRandomRazorShardPosition(Unit* caster) const
{
Position pos(*caster);
float randomAngle = frand(float(M_PI) / -7.0f, float(M_PI) / 7.0f);
float randomDist = frand(2.0f, 40.0f);
float angleToOrigin = caster->GetAbsoluteAngle(_targetOrigin);
caster->MovePosition(pos, randomDist, randomAngle - caster->GetOrientation() + angleToOrigin);
return pos;
}
void OnPrecast() override
{
Unit* target = GetExplTargetUnit();
_targetOrigin = target->GetPosition();
}
void HandleCast() const
{
Unit* caster = GetCaster();
for (uint8 i = 0; i < 20; ++i)
{
caster->CastSpell(GetRandomRazorShardPosition(caster), SPELL_RAZOR_SHARDS_VISUAL, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
.TriggeringSpell = GetSpell()
});
}
for (uint8 i = 0; i < 7; ++i)
caster->CastSpell(GetRandomRazorShardPosition(caster), SPELL_RAZOR_SHARDS_VISUAL_2, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
}
void Register() override
{
AfterCast += SpellCastFn(spell_rokmora_razor_shards::HandleCast);
}
private:
Position _targetOrigin;
};
// 192799 - Choking Dust
// ID - 4953
struct at_rokmora_choking_dust : AreaTriggerAI
{
using AreaTriggerAI::AreaTriggerAI;
void OnUnitEnter(Unit* unit) override
{
if (!unit->IsPlayer())
return;
Unit* caster = at->GetCaster();
if (!caster)
return;
caster->CastSpell(unit, SPELL_CHOKING_DUST_DAMAGE, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
}
void OnUnitExit(Unit* unit, AreaTriggerExitReason /*reason*/) override
{
unit->RemoveAurasDueToSpell(SPELL_CHOKING_DUST_DAMAGE);
}
};
// 198024 - Crystalline Ground and 216470 - Crystalline Ground
// ID - 7415
struct at_rokmora_crystalline_ground : AreaTriggerAI
{
using AreaTriggerAI::AreaTriggerAI;
void OnUnitEnter(Unit* unit) override
{
if (!unit->IsPlayer())
return;
unit->CastSpell(unit, SPELL_CRYSTALLINE_GROUND_PERIODIC, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
}
void OnUnitExit(Unit* unit, AreaTriggerExitReason /*reason*/) override
{
unit->RemoveAurasDueToSpell(SPELL_CRYSTALLINE_GROUND_PERIODIC);
}
};
// Id - XXX
struct at_rokmora_intro : AreaTriggerAI
{
at_rokmora_intro(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { }
void OnUnitEnter(Unit* unit) override
{
Player* player = unit->ToPlayer();
if (!player || player->IsGameMaster())
return;
if (TempSummon* navarrogg = unit->SummonCreature(NPC_NAVARROGG, NavarroggIntroPosition))
navarrogg->SetScriptStringId("RokmoraIntro");
at->Remove();
}
};
// 100700 - Navarrogg
struct npc_rokmora_navarrogg_intro : public ScriptedAI
{
npc_rokmora_navarrogg_intro(Creature* creature) : ScriptedAI(creature) { }
void JustAppeared() override
{
if (me->HasStringId("RokmoraIntro"))
TriggerRokmoraIntro();
}
void WaypointReached(uint32 waypointId, uint32 pathId) override
{
if (pathId == PATH_NAVARROGG && waypointId == WAYPOINT_DESPAWN)
me->DespawnOrUnsummon(1s);
}
void TriggerRokmoraIntro()
{
Seconds delay = 1s;
_scheduler.Schedule(delay, [this](TaskContext)
{
DoCastSelf(SPELL_JUMP_TO_GROUND_COSMETIC);
me->GetMotionMaster()->MoveJump(POINT_NAVAROGG_JUMP, NavarroggJumpIntroPosition, 50.0f, 50.0f);
});
delay += 2s;
_scheduler.Schedule(delay, [this](TaskContext)
{
me->RemoveAurasDueToSpell(SPELL_JUMP_TO_GROUND_COSMETIC);
});
delay += 1s;
_scheduler.Schedule(delay, [this](TaskContext)
{
if (Creature* ularogg = me->FindNearestCreature(NPC_ULAROGG, 50.0f))
{
ularogg->InterruptSpell(CURRENT_CHANNELED_SPELL);
ularogg->SetFacingTo(5.480333f);
}
InstanceScript* instance = me->GetInstanceScript();
if (!instance)
return;
Creature* rokmora = instance->GetCreature(DATA_ROKMORA);
if (!rokmora)
return;
rokmora->AI()->DoCastSelf(SPELL_BOSS_INTRO_EMERGE);
me->GetMotionMaster()->MovePoint(POINT_NAVAROGG_INTRO, NavarroggIntroPosition2);
});
delay += 1s;
_scheduler.Schedule(delay, [this](TaskContext)
{
if (Creature* ularogg = me->FindNearestCreature(NPC_ULAROGG, 50.0f))
ularogg->CastSpell(ularogg->GetPosition(), SPELL_BOSS_INTRO_CONVERSATION);
});
}
void UpdateAI(uint32 diff) override
{
_scheduler.Update(diff);
}
private:
TaskScheduler _scheduler;
};
// 209374 - Boss 01 Intro Convo
// Id - 1885
class conversation_rokmora_intro : public ConversationAI
{
public:
using ConversationAI::ConversationAI;
void OnCreate(Unit* creator) override
{
Creature* navarrogg = creator->FindNearestCreatureWithOptions(50.0f, { .CreatureId = NPC_NAVARROGG, .StringId = "RokmoraIntro" });
if (!navarrogg)
return;
conversation->AddActor(CONVO_ACTOR_NAVARROGG, CONVO_ACTOR_ID_NAVARROGG, navarrogg->GetGUID());
}
void OnStart() override
{
if (Milliseconds const* ularoggMoveStartTime = conversation->GetLineStartTime(DEFAULT_LOCALE, CONVO_ULAROGG_INTRO_LINE_03))
_events.ScheduleEvent(EVENT_ROKMORA_INTRO_MOVE, *ularoggMoveStartTime + 3s);
}
void OnUpdate(uint32 diff) override
{
_events.Update(diff);
switch (_events.ExecuteEvent())
{
case EVENT_ROKMORA_INTRO_MOVE:
{
Creature* ularogg = conversation->GetActorCreature(CONVO_ACTOR_ID_ULAROGG);
Creature* navarrogg = conversation->GetActorCreature(CONVO_ACTOR_ID_NAVARROGG);
if (!ularogg || !navarrogg)
break;
ularogg->GetMotionMaster()->MovePath(PATH_ULAROGG, false);
navarrogg->GetMotionMaster()->MovePath(PATH_NAVARROGG, false);
break;
}
default:
break;
}
}
private:
EventMap _events;
};
// 209394 - Boss 01 Intro Emerge
class spell_rokmora_emerge : public SpellScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_UPDATE_INTERACTIONS });
}
void HandleShatter() const
{
Unit* caster = GetCaster();
InstanceScript* instance = caster->GetInstanceScript();
if (!instance)
return;
caster->CastSpell(caster, SPELL_UPDATE_INTERACTIONS, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
instance->SetData(DATA_ROKMORA_INTRO_STATE, DONE);
}
void Register() override
{
AfterCast += SpellCastFn(spell_rokmora_emerge::HandleShatter);
}
};
class spell_rokmora_emerge_aura : public AuraScript
{
void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
{
GetCaster()->AddUnitState(UNIT_STATE_ROOT);
}
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
{
GetCaster()->ClearUnitState(UNIT_STATE_ROOT);
}
void Register() override
{
OnEffectApply += AuraEffectApplyFn(spell_rokmora_emerge_aura::OnApply, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL);
OnEffectRemove += AuraEffectRemoveFn(spell_rokmora_emerge_aura::OnRemove, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL);
}
};
// 134730 - Update Interactions
class spell_rokmora_update_interactions : public SpellScript
{
void HandleScript(SpellEffIndex /*effIndex*/) const
{
Creature* caster = GetCaster()->ToCreature();
if (!caster)
return;
caster->SetImmuneToPC(false);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_rokmora_update_interactions::HandleScript, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
}
};
void AddSC_boss_rokmora()
{
RegisterNeltharionsLairCreatureAI(boss_rokmora);
RegisterSpellScript(spell_rokmora_crystalline_ground_periodic);
RegisterSpellScript(spell_rokmora_shatter);
RegisterSpellScript(spell_rokmora_razor_shards);
RegisterAreaTriggerAI(at_rokmora_choking_dust);
RegisterAreaTriggerAI(at_rokmora_crystalline_ground);
// Intro
RegisterAreaTriggerAI(at_rokmora_intro);
RegisterNeltharionsLairCreatureAI(npc_rokmora_navarrogg_intro);
RegisterConversationAI(conversation_rokmora_intro);
RegisterSpellAndAuraScriptPair(spell_rokmora_emerge, spell_rokmora_emerge_aura);
RegisterSpellScript(spell_rokmora_update_interactions);
}
@@ -0,0 +1,107 @@
/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "AreaBoundary.h"
#include "InstanceScript.h"
#include "ScriptMgr.h"
#include "neltharions_lair.h"
BossBoundaryData const boundaries =
{
{ DATA_ROKMORA, new RectangleBoundary(2855.4377f, 2953.1074f, 1360.5552f, 1438.9974f) }
};
ObjectData const creatureData[] =
{
{ BOSS_ROKMORA, DATA_ROKMORA },
{ BOSS_ULAROGG_CRAGSHAPER, DATA_ULAROGG_CRAGSHAPER },
{ BOSS_NARAXAS, DATA_NARAXAS },
{ BOSS_DARGRUL_THE_UNDERKING, DATA_DARGRUL_THE_UNDERKING },
{ 0, 0 } // END
};
DungeonEncounterData const encounters[] =
{
{ DATA_ROKMORA, {{ 1790 }} },
{ DATA_ULAROGG_CRAGSHAPER, {{ 1791 }} },
{ DATA_NARAXAS, {{ 1792 }} },
{ DATA_DARGRUL_THE_UNDERKING, {{ 1793 }} },
};
static DoorData const doorData[] =
{
{ GO_MYSTIC_BARRIER, DATA_ROKMORA, EncounterDoorBehavior::OpenWhenDone },
{ 0, 0, EncounterDoorBehavior::OpenWhenNotInProgress }
};
class instance_neltharions_lair : public InstanceMapScript
{
public:
instance_neltharions_lair() : InstanceMapScript(NLScriptName, 1458) { }
struct instance_neltharions_lair_InstanceMapScript: public InstanceScript
{
instance_neltharions_lair_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
{
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadObjectData(creatureData, nullptr);
LoadDoorData(doorData);
LoadBossBoundaries(boundaries);
LoadDungeonEncounterData(encounters);
_rokmoraIntroState = NOT_STARTED;
}
uint32 GetData(uint32 dataId) const override
{
switch (dataId)
{
case DATA_ROKMORA_INTRO_STATE:
return _rokmoraIntroState;
default:
break;
}
return 0;
}
void SetData(uint32 dataId, uint32 value) override
{
switch (dataId)
{
case DATA_ROKMORA_INTRO_STATE:
_rokmoraIntroState = value;
break;
default:
break;
}
}
private:
uint8 _rokmoraIntroState;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override
{
return new instance_neltharions_lair_InstanceMapScript(map);
}
};
void AddSC_instance_neltharions_lair()
{
new instance_neltharions_lair();
}
@@ -0,0 +1,61 @@
/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef DEF_NELTHARIONS_LAIR_H_
#define DEF_NELTHARIONS_LAIR_H_
#include "CreatureAIImpl.h"
#define DataHeader "NeltharionsLair"
#define NLScriptName "instance_neltharions_lair"
constexpr uint32 EncounterCount = 4;
enum NLDataTypes : uint8
{
// Encounters
DATA_ROKMORA = 0,
DATA_ULAROGG_CRAGSHAPER,
DATA_NARAXAS,
DATA_DARGRUL_THE_UNDERKING,
DATA_ROKMORA_INTRO_STATE
};
enum NLCreatureIds
{
// Bosses
BOSS_ROKMORA = 91003,
BOSS_ULAROGG_CRAGSHAPER = 91004,
BOSS_NARAXAS = 91005,
BOSS_DARGRUL_THE_UNDERKING = 91007
};
enum NLGameObjects
{
GO_MYSTIC_BARRIER = 248871
};
template <class AI, class T>
inline AI* GetNeltharionsLairAI(T* obj)
{
return GetInstanceAI<AI>(obj, NLScriptName);
}
#define RegisterNeltharionsLairCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetNeltharionsLairAI)
#endif
@@ -32,6 +32,10 @@ void AddSC_instance_trial_of_valor();
void AddSC_boss_amalgam_of_souls();
void AddSC_instance_black_rook_hold();
// Neltharion's Lair
void AddSC_boss_rokmora();
void AddSC_instance_neltharions_lair();
// Orderhalls
void AddSC_orderhall_warrior();
void AddSC_orderhall_rogue();
@@ -55,6 +59,10 @@ void AddBrokenIslesScripts()
AddSC_boss_amalgam_of_souls();
AddSC_instance_black_rook_hold();
// Neltharion's Lair
AddSC_boss_rokmora();
AddSC_instance_neltharions_lair();
// Orderhalls
AddSC_orderhall_warrior();
AddSC_orderhall_rogue();