Scripts/RagefireChasm: Implement Adarogg encounter (#29962)

Closes #29948
This commit is contained in:
Aqua Deus
2024-05-12 01:53:22 +02:00
committed by GitHub
parent 24577f34ec
commit 73ceb33f69
5 changed files with 394 additions and 12 deletions

View File

@@ -0,0 +1,55 @@
-- Creature
UPDATE `creature_template` SET `ScriptName`='boss_adarogg' WHERE `entry`=61408;
UPDATE `creature` SET `StringId`='npc_corrupted_houndmaster_1' WHERE `guid`=4000039;
UPDATE `creature` SET `StringId`='npc_corrupted_houndmaster_2' WHERE `guid`=4000052;
-- Spells
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (120064, 119405, 119298, 120113);
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ConditionStringValue1`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(13, 1, 120064, 0, 0, 51, 0, 5, 61659, 0, '', 0, 0, 0, '', 'Spell \'Eat Trog\' can only hit \'Slain Trogg\''),
(13, 1, 120064, 0, 1, 51, 0, 5, 61669, 0, '', 0, 0, 0, '', 'Spell \'Eat Trog\' can only hit \'Oggleflint\''),
(13, 1, 119405, 0, 0, 51, 0, 5, 61409, 0, '', 0, 0, 0, '', 'Spell \'Inferno Charge\' can only hit \'Demonic Leap\''),
(13, 1, 119298, 0, 0, 51, 0, 5, 61409, 0, '', 0, 0, 0, '', 'Spell \'Inferno Charge\' can only hit \'Demonic Leap\''),
(13, 1, 120113, 0, 0, 51, 0, 5, 61666, 0, '', 0, 0, 0, '', 'Spell \'Adjules Chow Time\' can only hit \'Corrupted Houndmaster\''),
(13, 2, 120113, 0, 0, 51, 0, 5, 61666, 0, '', 0, 0, 0, '', 'Spell \'Adjules Chow Time\' can only hit \'Corrupted Houndmaster\'');
-- Serverside spells
DELETE FROM `serverside_spell` WHERE `Id` IN (119297, 119298) AND `DifficultyID`=0;
INSERT INTO `serverside_spell` (`Id`, `DifficultyID`, `CategoryId`, `Dispel`, `Mechanic`, `Attributes`, `AttributesEx`, `AttributesEx2`, `AttributesEx3`, `AttributesEx4`, `AttributesEx5`, `AttributesEx6`, `AttributesEx7`, `AttributesEx8`, `AttributesEx9`, `AttributesEx10`, `AttributesEx11`, `AttributesEx12`, `AttributesEx13`, `AttributesEx14`, `Stances`, `StancesNot`, `Targets`, `TargetCreatureType`, `RequiresSpellFocus`, `FacingCasterFlags`, `CasterAuraState`, `TargetAuraState`, `ExcludeCasterAuraState`, `ExcludeTargetAuraState`, `CasterAuraSpell`, `TargetAuraSpell`, `ExcludeCasterAuraSpell`, `ExcludeTargetAuraSpell`, `CasterAuraType`, `TargetAuraType`, `ExcludeCasterAuraType`, `ExcludeTargetAuraType`, `CastingTimeIndex`, `RecoveryTime`, `CategoryRecoveryTime`, `StartRecoveryCategory`, `StartRecoveryTime`, `InterruptFlags`, `AuraInterruptFlags1`, `AuraInterruptFlags2`, `ChannelInterruptFlags1`, `ChannelInterruptFlags2`, `ProcFlags`, `ProcFlags2`, `ProcChance`, `ProcCharges`, `ProcCooldown`, `ProcBasePPM`, `MaxLevel`, `BaseLevel`, `SpellLevel`, `DurationIndex`, `RangeIndex`, `Speed`, `LaunchDelay`, `StackAmount`, `EquippedItemClass`, `EquippedItemSubClassMask`, `EquippedItemInventoryTypeMask`, `ContentTuningId`, `SpellName`, `ConeAngle`, `ConeWidth`, `MaxTargetLevel`, `MaxAffectedTargets`, `SpellFamilyName`, `SpellFamilyFlags1`, `SpellFamilyFlags2`, `SpellFamilyFlags3`, `SpellFamilyFlags4`, `DmgClass`, `PreventionType`, `AreaGroupId`, `SchoolMask`, `ChargeCategoryId`) VALUES
(119297, 0, 0, 0, 0, 256, 0, 0, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 5, 0, 0, 0, -1, 0, 0, 0, 'Inferno Charge', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0),
(119298, 0, 0, 0, 0, 256, 0, 0, 0, 0, 0, 0, 0, 134217728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 25, 0, 0, -1, 0, 0, 0, 'Inferno Charge', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0);
DELETE FROM `serverside_spell_effect` WHERE `SpellID` IN (119297, 119298) AND `EffectIndex`=0 AND `DifficultyID`=0;
INSERT INTO `serverside_spell_effect` (`SpellID`, `EffectIndex`, `DifficultyID`, `Effect`, `EffectAura`, `EffectAmplitude`, `EffectAttributes`, `EffectAuraPeriod`, `EffectBonusCoefficient`, `EffectChainAmplitude`, `EffectChainTargets`, `EffectItemType`, `EffectMechanic`, `EffectPointsPerResource`, `EffectPosFacing`, `EffectRealPointsPerLevel`, `EffectTriggerSpell`, `BonusCoefficientFromAP`, `PvpMultiplier`, `Coefficient`, `Variance`, `ResourceCoefficient`, `GroupSizeBasePointsCoefficient`, `EffectBasePoints`, `EffectMiscValue1`, `EffectMiscValue2`, `EffectRadiusIndex1`, `EffectRadiusIndex2`, `EffectSpellClassMask1`, `EffectSpellClassMask2`, `EffectSpellClassMask3`, `EffectSpellClassMask4`, `ImplicitTarget1`, `ImplicitTarget2`) VALUES
(119297, 0, 0, 28, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61409, 491, 0, 0, 0, 0, 0, 0, 53, 0),
(119298, 0, 0, 96, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 119299, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0);
-- Texts
DELETE FROM `creature_text` WHERE `CreatureID`=61666;
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(61666, 0, 0, 'He\'s cornered!', 14, 0, 100, 0, 0, 0, 61203, 0, 'Corrupted Houndmaster to Player'),
(61666, 1, 0, 'We\'ve got him now!', 14, 0, 100, 0, 0, 0, 61204, 0, 'Corrupted Houndmaster to Player');
-- Areatrigger
DELETE FROM `areatrigger_scripts` WHERE `entry`=7904;
INSERT INTO `areatrigger_scripts` (`entry`, `ScriptName`) VALUES
(7904, 'at_adarogg_intro');
-- Waypoint
SET @ENTRY := 61408;
SET @PATH := @ENTRY * 100;
DELETE FROM `waypoint_path` WHERE `PathId` BETWEEN @PATH+0 AND @PATH+2;
INSERT INTO `waypoint_path` (`PathId`, `MoveType`, `Flags`, `Comment`) VALUES
(@PATH+0, 0, 0, 'Adarogg - Intro - Oggleflint from start'),
(@PATH+1, 0, 0, 'Adarogg - Intro - Slain Trogg'),
(@PATH+2, 0, 0, 'Adarogg - Intro - Oggleflint from Slain Trogg');
DELETE FROM `waypoint_path_node` WHERE `PathId` BETWEEN @PATH+0 AND @PATH+2;
INSERT INTO `waypoint_path_node` (`PathId`, `NodeId`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `Delay`) VALUES
(@PATH+0, 0, -277.3586, -36.89559, -60.6918, NULL, 0),
(@PATH+1, 0, -278.8507, -54.90896, -60.57021, NULL, 0),
(@PATH+1, 1, -285.0681, -66.49124, -60.46365, NULL, 0),
(@PATH+1, 2, -286.4794, -74.89896, -60.55044, NULL, 0),
(@PATH+2, 0, -278.9581, -43.25373, -60.82312, NULL, 0),
(@PATH+2, 1, -277.3586, -36.89559, -60.6918, NULL, 0);

View File

@@ -0,0 +1,247 @@
/*
* 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 "InstanceScript.h"
#include "MotionMaster.h"
#include "Player.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "TaskScheduler.h"
#include "ragefire_chasm.h"
enum AdaroggSpells
{
// Intro
SPELL_ADJULES_CHOW_TIME = 120113,
SPELL_EAT_TROGG = 120064,
// Combat
SPELL_INFERNO_CHARGE_CAST = 119405,
SPELL_INFERNO_CHARGE_SUMMON = 119297, // Serverside
SPELL_FIRE_BREATH = 119420
};
enum AdaroggTexts
{
SAY_INFERNO_CHARGE = 0,
// Intro
SAY_HOUNDMASTER_INTRO_0 = 0,
SAY_HOUNDMASTER_INTRO_1 = 1
};
enum AdaroggEvents
{
EVENT_INFERNO_CHARGE = 1,
EVENT_FIRE_BREATH = 2
};
enum AdaroggActions
{
ACTION_KILL_HOUNDMASTERS = 1
};
enum AdaroggPaths
{
PATH_INTRO = 6140800,
PATH_INTRO2 = 6140801,
PATH_INTRO3 = 6140802,
};
constexpr Position AdaroggIntroPoints[2] =
{
{ -282.31488f, -53.24906f, -60.802902f },
{ -281.1894f, -54.73433f, -60.34256f }
};
// Areatrigger - 7904
class at_adarogg_intro : public OnlyOnceAreaTriggerScript
{
public:
at_adarogg_intro() : OnlyOnceAreaTriggerScript("at_adarogg_intro") { }
bool TryHandleOnce(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
{
if (player->IsGameMaster())
return false;
InstanceScript* instance = player->GetInstanceScript();
if (!instance)
return false;
Creature* adarogg = instance->GetCreature(BOSS_ADAROGG);
if (!adarogg)
return false;
adarogg->AI()->DoAction(ACTION_KILL_HOUNDMASTERS);
return true;
}
};
// 61408 - Adarogg
struct boss_adarogg : public BossAI
{
boss_adarogg(Creature* creature) : BossAI(creature, BOSS_ADAROGG), _eatCounter(0) { }
void Reset() override
{
_Reset();
scheduler.ClearValidator();
_eatCounter = 0;
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
scheduler.CancelAll();
events.ScheduleEvent(EVENT_INFERNO_CHARGE, 10s);
events.ScheduleEvent(EVENT_FIRE_BREATH, 20s);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
}
void DoAction(int32 action) override
{
if (action != ACTION_KILL_HOUNDMASTERS)
return;
Creature* corruptedHoundmaster1 = me->FindNearestCreatureWithOptions(70.0f, { .StringId = "npc_corrupted_houndmaster_1" });
if (!corruptedHoundmaster1)
return;
Creature* corruptedHoundmaster2 = me->FindNearestCreatureWithOptions(70.0f, { .StringId = "npc_corrupted_houndmaster_2" });
if (!corruptedHoundmaster2)
return;
corruptedHoundmaster1->AI()->Talk(SAY_HOUNDMASTER_INTRO_0);
corruptedHoundmaster2->AI()->Talk(SAY_HOUNDMASTER_INTRO_1);
scheduler.Schedule(2s, [this](TaskContext task)
{
DoCast(SPELL_ADJULES_CHOW_TIME);
me->GetMotionMaster()->MovePoint(0, AdaroggIntroPoints[0]);
task.Schedule(1s, [this](TaskContext task)
{
DoCast(SPELL_ADJULES_CHOW_TIME);
me->GetMotionMaster()->MovePoint(0, AdaroggIntroPoints[1]);
task.Schedule(1s + 200ms, [this](TaskContext /*task*/)
{
DoCast(SPELL_ADJULES_CHOW_TIME);
me->GetMotionMaster()->MovePath(PATH_INTRO, false);
});
});
});
}
void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
{
switch (pathId)
{
case PATH_INTRO:
scheduler.Schedule(6148ms, [this](TaskContext /*task*/)
{
me->GetMotionMaster()->MovePath(PATH_INTRO2, false);
});
break;
case PATH_INTRO2:
scheduler.Schedule(6996ms, [this](TaskContext /*task*/)
{
me->GetMotionMaster()->MovePath(PATH_INTRO3, false);
});
break;
case PATH_INTRO3:
scheduler.Schedule(6148ms, [this](TaskContext /*task*/)
{
me->GetMotionMaster()->MovePath(PATH_INTRO2, false);
});
break;
default:
return;
}
_eatCounter = 0;
scheduler.Schedule(1s, [this](TaskContext task)
{
if (_eatCounter >= 2)
return;
DoCast(SPELL_EAT_TROGG);
_eatCounter++;
task.Repeat(2s, 3s);
});
}
void UpdateAI(uint32 diff) override
{
scheduler.Update(diff);
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_INFERNO_CHARGE:
{
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, NonTankTargetSelector(me)))
{
Talk(SAY_INFERNO_CHARGE, target);
DoCast(target, SPELL_INFERNO_CHARGE_SUMMON);
DoCast(target, SPELL_INFERNO_CHARGE_CAST);
}
events.Repeat(15s, 20s);
break;
}
case EVENT_FIRE_BREATH:
{
DoCastVictim(SPELL_FIRE_BREATH);
events.Repeat(15s, 20s);
break;
}
default:
break;
}
}
}
private:
uint8 _eatCounter;
};
void AddSC_boss_adarogg()
{
new at_adarogg_intro();
RegisterRagefireChasmCreatureAI(boss_adarogg);
}

View File

@@ -15,30 +15,54 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
This placeholder for the instance is needed for dungeon finding to be able
to give credit after the boss defined in lastEncounterDungeon is killed.
Without it, the party doing random dungeon won't get satchel of spoils and
gets instead the deserter debuff.
*/
#include "AreaBoundary.h"
#include "ScriptMgr.h"
#include "InstanceScript.h"
#include "ragefire_chasm.h"
BossBoundaryData const boundaries =
{
{ BOSS_SLAGMAW, new RectangleBoundary(-298.2f, -257.1f, 94.4f, 172.4f) }
};
ObjectData const creatureData[] =
{
{ NPC_ADAROGG, BOSS_ADAROGG },
{ NPC_DARK_SHAMAN_KORANTHAL, BOSS_DARK_SHAMAN_KORANTHAL },
{ NPC_SLAGMAW, BOSS_SLAGMAW },
{ NPC_LAVA_GUARD_GORDOTH, BOSS_LAVA_GUARD_GORDOTH },
{ 0, 0 } // END
};
DungeonEncounterData const encounters[] =
{
{ BOSS_ADAROGG, {{ 1443 }} },
{ BOSS_DARK_SHAMAN_KORANTHAL, {{ 1444 }} },
{ BOSS_SLAGMAW, {{ 1445 }} },
{ BOSS_LAVA_GUARD_GORDOTH, {{ 1446 }} }
};
class instance_ragefire_chasm : public InstanceMapScript
{
public:
instance_ragefire_chasm() : InstanceMapScript("instance_ragefire_chasm", 389) { }
struct instance_ragefire_chasm_InstanceMapScript : public InstanceScript
{
instance_ragefire_chasm_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
{
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadObjectData(creatureData, nullptr);
LoadBossBoundaries(boundaries);
LoadDungeonEncounterData(encounters);
}
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override
{
return new instance_ragefire_chasm_InstanceMapScript(map);
}
struct instance_ragefire_chasm_InstanceMapScript : public InstanceScript
{
instance_ragefire_chasm_InstanceMapScript(InstanceMap* map) : InstanceScript(map) { }
};
};
void AddSC_instance_ragefire_chasm()

View File

@@ -0,0 +1,54 @@
/*
* 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 _Ragefire_Chasm_h__
#define _Ragefire_Chasm_h__
#include "CreatureAIImpl.h"
constexpr char const* DataHeader = "RFC";
constexpr char const* RfCScriptName = "instance_ragefire_chasm";
constexpr uint32 const EncounterCount = 4;
enum RFCDataTypes
{
// Encounters
BOSS_ADAROGG = 0,
BOSS_DARK_SHAMAN_KORANTHAL = 1,
BOSS_SLAGMAW = 2,
BOSS_LAVA_GUARD_GORDOTH = 3
};
enum RFCCreatureIds
{
// Bosses
NPC_ADAROGG = 61408,
NPC_DARK_SHAMAN_KORANTHAL = 61412,
NPC_SLAGMAW = 61463,
NPC_LAVA_GUARD_GORDOTH = 61528
};
template <class AI, class T>
inline AI* GetRagefireChasmAI(T* obj)
{
return GetInstanceAI<AI>(obj, RfCScriptName);
}
#define RegisterRagefireChasmCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetRagefireChasmAI)
#endif // _Ragefire_Chasm_h__

View File

@@ -63,6 +63,7 @@ void AddSC_instance_dire_maul();
// Dragon Soul
void AddSC_instance_dragon_soul();
// Ragefire Chasm
void AddSC_boss_adarogg();
void AddSC_instance_ragefire_chasm();
// Maraudon
void AddSC_boss_celebras_the_cursed();
@@ -204,6 +205,7 @@ void AddKalimdorScripts()
// Dragon Soul
AddSC_instance_dragon_soul();
// Ragefire Chasm
AddSC_boss_adarogg();
AddSC_instance_ragefire_chasm();
//Maraudon
AddSC_boss_celebras_the_cursed();