Dark flame cleft part 1

This commit is contained in:
luis
2026-09-23 21:34:45 -03:00
parent 5cbecf8e2d
commit 6b8b9336a5
7 changed files with 991 additions and 0 deletions
@@ -0,0 +1,152 @@
/*
* Copyright WowCommunity Project
*
*/
#include "Player.h"
#include "ScriptedCreature.h"
#include "ScriptMgr.h"
#include "darkflame_cleft.h"
#include "SpellMgr.h"
enum BlazikonSpells
{
SPELL_DOUSING_BREATH = 425394, // extinguish candles, tank group hit
SPELL_WICKLIGHTER_BARRAGE = 421817, // cone fire barrage at non-tanks
SPELL_WICKLIGHTER_DMG = 421638, // barrage impact
SPELL_INCITE_FLAMES = 424212, // burning patches below lit candles
SPELL_ENKINDLING_INFERNO = 423099, // cone at each candle -> ignite
SPELL_INFERNO_IGNITE = 1218308,
SPELL_HEAT = 463300, // ambient engage aura
SPELL_PLAYER_DETECTION = 458456, // engage trigger
};
enum BlazikonEvents
{
EVENT_DOUSING_BREATH = 1,
EVENT_WICKLIGHTER_BARRAGE,
EVENT_INCITE_FLAMES,
EVENT_ENKINDLING_INFERNO,
};
// 208743 - Blazikon
// Energy loop: Dousing Breath extinguishes candles, Wicklighter Barrage relights them,
// Incite Flames spawns burning ground, Enkindling Inferno detonates on candle count.
struct boss_blazikon : public BossAI
{
boss_blazikon(Creature* creature) : BossAI(creature, DATA_BLAZIKON) { }
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
DoCastSelf(SPELL_HEAT, true);
DoCastSelf(SPELL_PLAYER_DETECTION, true);
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
events.ScheduleEvent(EVENT_DOUSING_BREATH, 3s);
events.ScheduleEvent(EVENT_WICKLIGHTER_BARRAGE, 9s);
events.ScheduleEvent(EVENT_INCITE_FLAMES, 21s);
events.ScheduleEvent(EVENT_ENKINDLING_INFERNO, 30s);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
_EnterEvadeMode();
_DespawnAtEvade();
}
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_DOUSING_BREATH:
DoCastSelf(SPELL_DOUSING_BREATH);
events.DelayEvents(4500ms);
events.Repeat(32s);
break;
case EVENT_WICKLIGHTER_BARRAGE:
CastWicklighterBarrage();
events.Repeat(32s);
break;
case EVENT_INCITE_FLAMES:
{
// Burning patches under lit candles: cast on up to four players.
std::list<Player*> targets;
me->GetPlayerListInGrid(targets, 60.0f);
uint8 casted = 0;
for (Player* player : targets)
{
if (!player->IsAlive() || player->IsGameMaster())
continue;
me->CastSpell(player, SPELL_INCITE_FLAMES, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR
});
if (++casted >= 4)
break;
}
events.Repeat(32s);
break;
}
case EVENT_ENKINDLING_INFERNO:
DoCastSelf(SPELL_ENKINDLING_INFERNO);
DoCastSelf(SPELL_INFERNO_IGNITE, true);
events.Repeat(32s);
break;
default:
break;
}
}
}
private:
void CastWicklighterBarrage()
{
DoCastSelf(SPELL_WICKLIGHTER_BARRAGE);
// Impact on a handful of non-tank players.
std::list<Player*> targets;
me->GetPlayerListInGrid(targets, 60.0f);
uint8 casted = 0;
for (Player* player : targets)
{
if (!player->IsAlive() || player->IsGameMaster())
continue;
if (me->GetVictim() == player)
continue;
me->CastSpell(player, SPELL_WICKLIGHTER_DMG, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR
});
if (++casted >= 3)
break;
}
}
};
void AddSC_boss_blazikon()
{
RegisterDarkflameCleftCreatureAI(boss_blazikon);
}
@@ -0,0 +1,184 @@
/*
* Copyright WowCommunity Project
*
*/
#include "Player.h"
#include "ScriptedCreature.h"
#include "ScriptMgr.h"
#include "SpellAuras.h"
#include "darkflame_cleft.h"
enum OlWaxbeardSpells
{
SPELL_ROCK_BUSTER = 421665, // tank debuff +25% physical taken
SPELL_LURING_CANDLEFLAME = 421816, // candle + laborers fixate
SPELL_LURING_CANDLEFLAME_2 = 421664,
SPELL_RECKLESS_CHARGE = 425501, // charge furthest player + cave-in
SPELL_RECKLESS_CHARGE_2 = 422152,
SPELL_KOL_TO_ARMS = 445629, // summon menial laborers
};
enum OlWaxbeardEvents
{
EVENT_ROCK_BUSTER = 1,
EVENT_LURING_CANDLEFLAME,
EVENT_LURING_CANDLEFLAME_2,
EVENT_RECKLESS_CHARGE,
EVENT_KOL_TO_ARMS,
};
enum OlWaxbeardMisc
{
MAX_MENIAL_LABORERS = 3,
};
// 210149 - Ol' Waxbeard
// Cart-track encounter: candles lure Menial Laborers that stack Crude Weapons,
// Reckless Charge clears them and drops cave-ins on the party.
struct boss_ol_waxbeard : public BossAI
{
boss_ol_waxbeard(Creature* creature) : BossAI(creature, DATA_OL_WAXBEARD) { }
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
events.ScheduleEvent(EVENT_ROCK_BUSTER, 14s);
events.ScheduleEvent(EVENT_LURING_CANDLEFLAME, 6s);
events.ScheduleEvent(EVENT_LURING_CANDLEFLAME_2, 10s);
events.ScheduleEvent(EVENT_RECKLESS_CHARGE, 10s);
events.ScheduleEvent(EVENT_KOL_TO_ARMS, 3s);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
_EnterEvadeMode();
_DespawnAtEvade();
}
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_ROCK_BUSTER:
DoCastVictim(SPELL_ROCK_BUSTER);
events.Repeat(40s);
break;
case EVENT_LURING_CANDLEFLAME:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
DoCast(target, SPELL_LURING_CANDLEFLAME);
events.Repeat(39s);
break;
case EVENT_LURING_CANDLEFLAME_2:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
DoCast(target, SPELL_LURING_CANDLEFLAME_2);
events.Repeat(39s);
break;
case EVENT_RECKLESS_CHARGE:
RecklessCharge();
events.Repeat(19s);
break;
case EVENT_KOL_TO_ARMS:
DoCastSelf(SPELL_KOL_TO_ARMS, true);
SummonMenialLaborers();
events.Repeat(30s);
break;
default:
break;
}
}
}
private:
// Charge the furthest player; laborers caught in the path are destroyed.
void RecklessCharge()
{
Unit* target = SelectTarget(SelectTargetMethod::MaxDistance, 0, 100.0f, true);
if (!target)
target = me->GetVictim();
if (!target)
return;
me->StopMoving();
DoCast(me, SPELL_RECKLESS_CHARGE);
me->SetFacingToObject(target);
me->GetMotionMaster()->MoveCharge(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 20.0f, 0);
}
void SummonMenialLaborers()
{
for (uint8 i = 0; i < MAX_MENIAL_LABORERS; ++i)
{
Position pos = me->GetRandomNearPosition(12.0f);
if (Creature* laborer = me->SummonCreature(NPC_MENIAL_LABORER, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30s))
laborer->AI()->AttackStart(me->GetVictim());
}
}
};
// 210148 - Menial Laborer: stacks Crude Weapons bleed and fixates the candle carrier.
struct npc_menial_laborer : public ScriptedAI
{
enum
{
SPELL_CRUDE_WEAPONS = 422682,
SPELL_FIXATE = 428993,
};
npc_menial_laborer(Creature* creature) : ScriptedAI(creature) { }
void ScheduleTasks() override
{
events.ScheduleEvent(1, 4s);
events.ScheduleEvent(2, 5s);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case 1:
DoCastVictim(SPELL_CRUDE_WEAPONS);
events.Repeat(8s);
break;
case 2:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true))
{
me->GetMotionMaster()->MoveChase(target);
DoCast(target, SPELL_FIXATE);
}
events.Repeat(10s);
break;
default:
break;
}
}
};
void AddSC_boss_ol_waxbeard()
{
RegisterDarkflameCleftCreatureAI(boss_ol_waxbeard);
RegisterDarkflameCleftCreatureAI(npc_menial_laborer);
}
@@ -0,0 +1,235 @@
/*
* Copyright WowCommunity Project
*
*/
#include "Player.h"
#include "ScriptedCreature.h"
#include "ScriptMgr.h"
#include "darkflame_cleft.h"
enum CandleKingSpells
{
SPELL_DARKFLAME_AURA = 425956, // persistent escalating raid damage
SPELL_DARKLIGHT = 426127, // stacking darkness debuff
SPELL_DARKLIGHT_2 = 426152,
SPELL_EERIE_MOLDS = 420659, // summon wax statues
SPELL_PARANOID_MIND = 426145, // interruptible fear
SPELL_DARKFLAME_PICKAXE = 421277, // line at random player, shatters statues
SPELL_THROW_DARKFLAME = 420696, // marks players, 5yd shadow + absorb
SPELL_THROW_DARKFLAME_2 = 421250,
SPELL_MOLTEN_WAX = 420959, // melted statue pool
SPELL_WAX_STATUE_PULSE = 420919, // statue AoE fire pulse
};
enum CandleKingEvents
{
EVENT_DARKLIGHT = 1,
EVENT_EERIE_MOLDS,
EVENT_PARANOID_MIND,
EVENT_DARKFLAME_PICKAXE,
EVENT_THROW_DARKFLAME,
};
enum CandleKingMisc
{
STATUES_PER_MOLDS = 4,
};
// 208745 - The Candle King
// Darkflame arena ramps raid damage, Darklight stacks darkness, Eerie Molds summons
// Wax Statues that pulse AoE and are cleared by Darkflame Pickaxe / Throw Darkflame.
struct boss_the_candle_king : public BossAI
{
boss_the_candle_king(Creature* creature) : BossAI(creature, DATA_THE_CANDLE_KING) { }
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
DoCastSelf(SPELL_DARKFLAME_AURA, true);
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
events.ScheduleEvent(EVENT_DARKLIGHT, 1s);
events.ScheduleEvent(EVENT_EERIE_MOLDS, 6s);
events.ScheduleEvent(EVENT_PARANOID_MIND, 11s);
events.ScheduleEvent(EVENT_DARKFLAME_PICKAXE, 14s);
events.ScheduleEvent(EVENT_THROW_DARKFLAME, 21s);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
_EnterEvadeMode();
_DespawnAtEvade();
DespawnStatues();
}
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_DARKLIGHT:
{
DoCastSelf(SPELL_DARKLIGHT, true);
DoCastSelf(SPELL_DARKLIGHT_2, true);
events.Repeat(2s);
break;
}
case EVENT_EERIE_MOLDS:
DoCastSelf(SPELL_EERIE_MOLDS);
SummonWaxStatues();
events.Repeat(32s);
break;
case EVENT_PARANOID_MIND:
DoCastSelf(SPELL_PARANOID_MIND);
events.Repeat(20s);
break;
case EVENT_DARKFLAME_PICKAXE:
{
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 60.0f, true))
{
DoCast(target, SPELL_DARKFLAME_PICKAXE);
ShatterStatues(target);
}
events.Repeat(23s);
break;
}
case EVENT_THROW_DARKFLAME:
CastThrowDarkflame();
events.Repeat(25s);
break;
default:
break;
}
}
}
private:
void SummonWaxStatues()
{
for (uint8 i = 0; i < STATUES_PER_MOLDS; ++i)
{
Position pos = me->GetRandomNearPosition(20.0f);
me->SummonCreature(NPC_WAX_STATUE, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30s);
}
}
// A pickaxe hit shatters any statue standing in the line toward the target.
void ShatterStatues(Unit* target)
{
float sx = me->GetPositionX();
float sy = me->GetPositionY();
float tx = target->GetPositionX();
float ty = target->GetPositionY();
float dx = tx - sx;
float dy = ty - sy;
float lenSq = dx * dx + dy * dy;
if (lenSq < 1.0f)
return;
std::list<Creature*> statues;
me->GetCreatureListWithEntryInGrid(statues, NPC_WAX_STATUE, 60.0f);
for (Creature* statue : statues)
{
if (!statue->IsAlive())
continue;
// Perpendicular distance from the statue to the boss->target line.
float px = statue->GetPositionX() - sx;
float py = statue->GetPositionY() - sy;
float t = (px * dx + py * dy) / lenSq;
if (t < 0.0f || t > 1.0f)
continue;
float perpX = px - t * dx;
float perpY = py - t * dy;
if (std::sqrt(perpX * perpX + perpY * perpY) < 3.0f)
statue->KillSelf();
}
}
void CastThrowDarkflame()
{
std::list<Player*> targets;
me->GetPlayerListInGrid(targets, 60.0f);
uint8 casted = 0;
for (Player* player : targets)
{
if (!player->IsAlive() || player->IsGameMaster())
continue;
me->CastSpell(player, SPELL_THROW_DARKFLAME, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR
});
me->CastSpell(player, SPELL_THROW_DARKFLAME_2, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR
});
if (++casted >= 3)
break;
}
}
void DespawnStatues()
{
std::list<Creature*> statues;
me->GetCreatureListWithEntryInGrid(statues, NPC_WAX_STATUE, 100.0f);
for (Creature* statue : statues)
statue->DespawnOrUnsummon(1ms);
}
};
// 209603 - Wax Statue: pulses fire AoE while alive and melts into a wax pool.
struct npc_wax_statue : public ScriptedAI
{
npc_wax_statue(Creature* creature) : ScriptedAI(creature) { }
void ScheduleTasks() override
{
events.ScheduleEvent(1, 1s);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case 1:
DoCastSelf(SPELL_WAX_STATUE_PULSE, true);
events.Repeat(2s);
break;
default:
break;
}
}
void JustDied(Unit* /*killer*/) override
{
DoCastSelf(SPELL_MOLTEN_WAX, true);
}
};
void AddSC_boss_the_candle_king()
{
RegisterDarkflameCleftCreatureAI(boss_the_candle_king);
RegisterDarkflameCleftCreatureAI(npc_wax_statue);
}
@@ -0,0 +1,271 @@
/*
* Copyright WowCommunity Project
*
*/
#include "Player.h"
#include "ScriptedCreature.h"
#include "ScriptMgr.h"
#include "darkflame_cleft.h"
enum TheDarknessSpells
{
SPELL_SMOTHERING_SHADOWS = 422806, // no light source = -99% dmg/heal
SPELL_CANDLELIGHT = 426866, // light protection aura
SPELL_SHADOWBLAST = 427011, // 10yd shadow at random player
SPELL_SHADOWBLAST_ALT = 427014,
SPELL_UMBRAL_SLASH = 427025, // line at the candle
SPELL_UMBRAL_SLASH_ALT = 427022,
SPELL_CALL_DARKSPAWN = 427157, // summon darkspawn channel
SPELL_THE_DARKNESS = 427155, // engage aura
SPELL_FLAME_SCARRED = 424074, // darkness debuff
SPELL_WAXBEARER = 426879, // summon fleeing candlebearers
SPELL_SMOTHER_OVERLORD = 427156,
SPELL_SURGING_HEAT = 461460, // Massive Candle pulse
};
enum TheDarknessEvents
{
EVENT_CANDLELIGHT = 1,
EVENT_SHADOWBLAST,
EVENT_UMBRAL_SLASH,
EVENT_CALL_DARKSPAWN,
EVENT_WAXBEARER,
};
enum TheDarknessMisc
{
DARKSPAWNS_PER_CALL = 3,
};
// 208747 - The Darkness
// Light-managed fight: staying out of the candlelight gives Smothering Shadows,
// Shadowblast puts 10yd shadow at players, Umbral Slash lines at the candle,
// Call Darkspawn brings add blobs that drain the light.
struct boss_the_darkness : public BossAI
{
boss_the_darkness(Creature* creature) : BossAI(creature, DATA_THE_DARKNESS) { }
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
DoCastSelf(SPELL_THE_DARKNESS, true);
DoCastSelf(SPELL_FLAME_SCARRED, true);
DoCastSelf(SPELL_SMOTHER_OVERLORD, true);
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
events.ScheduleEvent(EVENT_CANDLELIGHT, 2s);
events.ScheduleEvent(EVENT_SHADOWBLAST, 6s);
events.ScheduleEvent(EVENT_WAXBEARER, 13s);
events.ScheduleEvent(EVENT_UMBRAL_SLASH, 18s);
events.ScheduleEvent(EVENT_CALL_DARKSPAWN, 30s);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
_EnterEvadeMode();
_DespawnAtEvade();
}
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_CANDLELIGHT:
DoCastSelf(SPELL_CANDLELIGHT, true);
events.Repeat(2s);
break;
case EVENT_SHADOWBLAST:
{
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
{
DoCast(target, SPELL_SHADOWBLAST);
me->CastSpell(target, SPELL_SHADOWBLAST_ALT, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR
});
}
events.Repeat(12s);
break;
}
case EVENT_UMBRAL_SLASH:
{
DoCastSelf(SPELL_UMBRAL_SLASH);
DoCastSelf(SPELL_UMBRAL_SLASH_ALT, true);
events.Repeat(20s);
break;
}
case EVENT_CALL_DARKSPAWN:
{
DoCastSelf(SPELL_CALL_DARKSPAWN);
SummonDarkspawns();
events.Repeat(33s);
break;
}
case EVENT_WAXBEARER:
{
DoCastSelf(SPELL_WAXBEARER, true);
SummonCandlebearers();
events.Repeat(31s);
break;
}
default:
break;
}
}
}
private:
void SummonDarkspawns()
{
for (uint8 i = 0; i < DARKSPAWNS_PER_CALL; ++i)
{
Position pos = me->GetRandomNearPosition(12.0f);
uint32 entry = urand(0, 1) ? NPC_WRIGGLING_DARKSPAWN : NPC_DARKNESS_SPAWN;
me->SummonCreature(entry, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30s);
}
}
void SummonCandlebearers()
{
for (uint8 i = 0; i < 2; ++i)
{
Position pos = me->GetRandomNearPosition(15.0f);
me->SummonCreature(NPC_FLEEING_CANDLEBEARER, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30s);
}
}
};
// 212823 - Darkness Spawn: small shadow blob, drains light from the candle.
struct npc_darkness_spawn : public ScriptedAI
{
enum
{
SPELL_EATER_OF_LIGHT = 426887,
SPELL_MURDER = 426895,
};
npc_darkness_spawn(Creature* creature) : ScriptedAI(creature) { }
void ScheduleTasks() override
{
events.ScheduleEvent(1, 3s);
events.ScheduleEvent(2, 6s);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case 1:
DoCastSelf(SPELL_EATER_OF_LIGHT, true);
events.Repeat(12s);
break;
case 2:
DoCastVictim(SPELL_MURDER);
events.Repeat(12s);
break;
default:
break;
}
}
};
// 213008 - Wriggling Darkspawn: drains candle light over time.
struct npc_wriggling_darkspawn : public ScriptedAI
{
enum
{
SPELL_DRAIN_LIGHT = 427176,
SPELL_VOID_FORM = 427168,
};
npc_wriggling_darkspawn(Creature* creature) : ScriptedAI(creature) { }
void ScheduleTasks() override
{
DoCastSelf(SPELL_VOID_FORM, true);
events.ScheduleEvent(1, 2s);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case 1:
DoCastSelf(SPELL_DRAIN_LIGHT);
events.Repeat(12s);
break;
default:
break;
}
}
};
// 212821 - Fleeing Candlebearer: carries a candle to restore light.
struct npc_fleeing_candlebearer : public ScriptedAI
{
enum
{
SPELL_HOLDING_A_CANDLE = 426892,
};
npc_fleeing_candlebearer(Creature* creature) : ScriptedAI(creature) { }
void ScheduleTasks() override
{
DoCastSelf(SPELL_HOLDING_A_CANDLE, true);
}
};
// 212777 - Massive Candle: room candle, pulses heat.
struct npc_massive_candle : public ScriptedAI
{
npc_massive_candle(Creature* creature) : ScriptedAI(creature) { }
void ScheduleTasks() override
{
events.ScheduleEvent(1, 2s);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case 1:
DoCastSelf(SPELL_SURGING_HEAT, true);
events.Repeat(8s);
break;
default:
break;
}
}
};
void AddSC_boss_the_darkness()
{
RegisterDarkflameCleftCreatureAI(boss_the_darkness);
RegisterDarkflameCleftCreatureAI(npc_darkness_spawn);
RegisterDarkflameCleftCreatureAI(npc_wriggling_darkspawn);
RegisterDarkflameCleftCreatureAI(npc_fleeing_candlebearer);
RegisterDarkflameCleftCreatureAI(npc_massive_candle);
}
@@ -0,0 +1,51 @@
/*
* Copyright WowCommunity Project
*
*/
#ifndef DEF_DARKFLAME_CLEFT_H_
#define DEF_DARKFLAME_CLEFT_H_
#include "CreatureAIImpl.h"
#define DarkflameCleftScriptName "instance_darkflame_cleft"
#define DataHeader "DarkflameCleft"
uint32 const EncounterCount = 4;
enum DarkflameCleftDataTypes
{
// Encounters
DATA_OL_WAXBEARD = 0,
DATA_BLAZIKON = 1,
DATA_THE_CANDLE_KING = 2,
DATA_THE_DARKNESS = 3,
};
enum DarkflameCleftCreatureIds
{
// Bosses
BOSS_OL_WAXBEARD = 210149,
BOSS_BLAZIKON = 208743,
BOSS_THE_CANDLE_KING = 208745,
BOSS_THE_DARKNESS = 208747,
// Npcs
NPC_MENIAL_LABORER = 210148,
NPC_WAX_STATUE = 209603,
NPC_DARKNESS_SPAWN = 212823,
NPC_WRIGGLING_DARKSPAWN = 213008,
NPC_FLEEING_CANDLEBEARER = 212821,
NPC_MASSIVE_CANDLE = 212777,
NPC_TRAINING_DUMMY = 213574,
};
template <class AI, class T>
inline AI* GetDarkflameCleftAI(T* obj)
{
return GetInstanceAI<AI>(obj, DarkflameCleftScriptName);
}
#define RegisterDarkflameCleftCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetDarkflameCleftAI)
#endif
@@ -0,0 +1,84 @@
/*
* Copyright WowCommunity Project
*
*/
#include "InstanceScript.h"
#include "ScriptMgr.h"
#include "darkflame_cleft.h"
#include "Map.h"
static constexpr ObjectData creatureData[] =
{
{ BOSS_OL_WAXBEARD, DATA_OL_WAXBEARD },
{ BOSS_BLAZIKON, DATA_BLAZIKON },
{ BOSS_THE_CANDLE_KING, DATA_THE_CANDLE_KING },
{ BOSS_THE_DARKNESS, DATA_THE_DARKNESS },
{ 0, 0 } // END
};
static constexpr DungeonEncounterData const encounters[] =
{
{ DATA_OL_WAXBEARD, {{ 2829 }} },
{ DATA_BLAZIKON, {{ 2826 }} },
{ DATA_THE_CANDLE_KING, {{ 2787 }} },
{ DATA_THE_DARKNESS, {{ 2788 }} }
};
class instance_darkflame_cleft : public InstanceMapScript
{
public:
instance_darkflame_cleft() : InstanceMapScript(DarkflameCleftScriptName, 2651) { }
struct instance_darkflame_cleft_InstanceMapScript : public InstanceScript
{
instance_darkflame_cleft_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
{
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadObjectData(creatureData, {});
LoadDungeonEncounterData(encounters);
}
void OnPlayerEnter(Player* player) override
{
if (!player->GetGroup() || !player->GetGroup()->GetLeaderGUID())
return;
ObjectGuid leaderguid = player->GetGroup()->GetLeaderGUID();
if (!leaderguid)
return;
if (Player* leader = ObjectAccessor::GetPlayer(*player, leaderguid))
{
if (leader->GetTeam() == HORDE)
faction_group = HORDE;
else if (leader->GetTeam() == ALLIANCE)
faction_group = ALLIANCE;
else
faction_group = HORDE;
}
player->GetGroup()->AddFollowerModeBots(player);
}
void OnPlayerExit(Player* player)
{
player->GetGroup()->DespawnFollowerModeBots(player);
}
private:
bool faction_group = HORDE;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override
{
return new instance_darkflame_cleft_InstanceMapScript(map);
}
};
void AddSC_instance_darkflame_cleft()
{
new instance_darkflame_cleft();
}
@@ -46,6 +46,13 @@ void AddSC_boss_The_Coaglamation();
void AddSC_boss_izo_the_grand_splicer(); void AddSC_boss_izo_the_grand_splicer();
void AddSC_city_of_threads_trash(); void AddSC_city_of_threads_trash();
//Darkflame Cleft
void AddSC_instance_darkflame_cleft();
void AddSC_boss_ol_waxbeard();
void AddSC_boss_blazikon();
void AddSC_boss_the_candle_king();
void AddSC_boss_the_darkness();
// The name of this function should match: // The name of this function should match:
// void Add${NameOfDirectory}Scripts() // void Add${NameOfDirectory}Scripts()
void AddWarWithinScripts() void AddWarWithinScripts()
@@ -86,4 +93,11 @@ void AddWarWithinScripts()
AddSC_boss_The_Coaglamation(); AddSC_boss_The_Coaglamation();
AddSC_boss_izo_the_grand_splicer(); AddSC_boss_izo_the_grand_splicer();
AddSC_city_of_threads_trash(); AddSC_city_of_threads_trash();
//Darkflame Cleft
AddSC_instance_darkflame_cleft();
AddSC_boss_ol_waxbeard();
AddSC_boss_blazikon();
AddSC_boss_the_candle_king();
AddSC_boss_the_darkness();
} }