Dark flame cleft part 1
This commit is contained in:
@@ -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_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:
|
||||
// void Add${NameOfDirectory}Scripts()
|
||||
void AddWarWithinScripts()
|
||||
@@ -86,4 +93,11 @@ void AddWarWithinScripts()
|
||||
AddSC_boss_The_Coaglamation();
|
||||
AddSC_boss_izo_the_grand_splicer();
|
||||
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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user