Scripts/Molten Core: Update scripts (#31244)

* Many changes to improve several encounters

Credit for a lot of things goes to CMaNGOS
Garr fully based on CMaNGOS version

(cherry picked from commit 2979b12f8f1c6c82a69089c2c9123a1787b36773)
This commit is contained in:
offl
2026-06-27 00:27:57 +02:00
committed by Shauren
parent 884de05a5c
commit db72f7dae0
9 changed files with 531 additions and 363 deletions
@@ -0,0 +1,31 @@
-- Magmadar
DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_magmadar_lava_bomb';
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(19411, 'spell_magmadar_lava_bomb'),
(20474, 'spell_magmadar_lava_bomb');
DELETE FROM `creature_text` WHERE `CreatureID` = 11982 AND `GroupID` = 1;
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(11982,1,0,"%s becomes exhausted!",16,0,100,0,0,0,8252,0,"magmadar EMOTE_EXHAUSTED");
UPDATE `creature_text` SET `BroadcastTextId` = 7797 WHERE `CreatureID` = 11982 AND `GroupID` = 0;
-- Golemagg
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` = 20553;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
(13,7,20553,0,0,31,0,3,11672,0,0,0,0,"","Group 0: Spell 'Golemagg's Trust' (Effect 0, 1, 2) targets creature 'Core Rager'");
-- Garr
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` IN (20482,19515,23487);
INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
(13,3,20482,0,0,31,0,3,12099,0,0,0,0,"","Group 0: Spell 'Firesworn Eruption Trigger' (Effect 0, 1) targets creature 'Firesworn'"),
(13,1,19515,0,0,31,0,3,12057,0,0,0,0,"","Group 0: Spell 'Frenzy' (Effect 0) targets creature 'Garr'"),
(13,1,23487,0,0,31,0,3,12099,0,0,0,0,"","Group 0: Spell 'Separation Anxiety' (Effect 0) targets creature 'Firesworn'");
DELETE FROM `creature_text` WHERE `CreatureID` = 12057;
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(12057,0,0,"%s forces one of his Firesworn minions to erupt!",16,0,100,0,0,0,8254,0,"Garr EMOTE_MASSIVE_ERUPTION");
DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_garr_separation_anxiety';
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(23487, 'spell_garr_separation_anxiety');
@@ -15,52 +15,69 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* ScriptData
SDName: Boss_Baron_Geddon
SD%Complete: 100
SDComment:
SDCategory: Molten Core
EndScriptData */
#include "ScriptMgr.h"
#include "molten_core.h"
#include "ScriptedCreature.h"
#include "SpellAuraEffects.h"
#include "SpellInfo.h"
#include "SpellScript.h"
enum Emotes
enum GeddonTexts
{
EMOTE_SERVICE = 0
};
enum Spells
enum GeddonSpells
{
SPELL_INFERNO = 19695,
SPELL_INFERNO_DMG = 19698,
SPELL_IGNITE_MANA = 19659,
SPELL_LIVING_BOMB = 20475,
SPELL_ARMAGEDDON = 20478,
SPELL_INFERNO_DMG = 19698
};
enum Events
enum GeddonEvents
{
EVENT_INFERNO = 1,
EVENT_IGNITE_MANA = 2,
EVENT_LIVING_BOMB = 3,
EVENT_IGNITE_MANA,
EVENT_LIVING_BOMB,
EVENT_ARMAGEDDON
};
// 12056 - Baron Geddon
struct boss_baron_geddon : public BossAI
{
boss_baron_geddon(Creature* creature) : BossAI(creature, BOSS_BARON_GEDDON)
boss_baron_geddon(Creature* creature) : BossAI(creature, BOSS_BARON_GEDDON), _performedArmageddon(false) { }
void Reset() override
{
_Reset();
_performedArmageddon = false;
}
void JustEngagedWith(Unit* victim) override
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(victim);
events.ScheduleEvent(EVENT_INFERNO, 45s);
events.ScheduleEvent(EVENT_IGNITE_MANA, 30s);
events.ScheduleEvent(EVENT_LIVING_BOMB, 35s);
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_INFERNO, 15s, 20s);
events.ScheduleEvent(EVENT_IGNITE_MANA, 5s, 20s);
events.ScheduleEvent(EVENT_LIVING_BOMB, 15s, 35s);
}
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
{
if (!_performedArmageddon && me->HealthBelowPctDamaged(2, damage))
{
_performedArmageddon = true;
events.ScheduleEvent(EVENT_ARMAGEDDON, 0s);
}
}
void OnSpellCast(SpellInfo const* spell) override
{
if (spell->Id == SPELL_ARMAGEDDON)
Talk(EMOTE_SERVICE);
}
void UpdateAI(uint32 diff) override
@@ -70,15 +87,6 @@ struct boss_baron_geddon : public BossAI
events.Update(diff);
// If we are <2% hp cast Armageddon
if (!HealthAbovePct(2))
{
me->InterruptNonMeleeSpells(true);
DoCast(me, SPELL_ARMAGEDDON);
Talk(EMOTE_SERVICE);
return;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
@@ -87,18 +95,20 @@ struct boss_baron_geddon : public BossAI
switch (eventId)
{
case EVENT_INFERNO:
DoCast(me, SPELL_INFERNO);
events.ScheduleEvent(EVENT_INFERNO, 45s);
DoCastSelf(SPELL_INFERNO);
events.Repeat(20s, 35s);
break;
case EVENT_IGNITE_MANA:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true, -SPELL_IGNITE_MANA))
DoCast(target, SPELL_IGNITE_MANA);
events.ScheduleEvent(EVENT_IGNITE_MANA, 30s);
DoCastSelf(SPELL_IGNITE_MANA);
events.Repeat(25s, 40s);
break;
case EVENT_LIVING_BOMB:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
DoCast(target, SPELL_LIVING_BOMB);
events.ScheduleEvent(EVENT_LIVING_BOMB, 35s);
events.Repeat(10s, 20s);
break;
case EVENT_ARMAGEDDON:
DoCastSelf(SPELL_ARMAGEDDON);
break;
default:
break;
@@ -108,11 +118,19 @@ struct boss_baron_geddon : public BossAI
return;
}
}
private:
bool _performedArmageddon;
};
// 19695 - Inferno
class spell_baron_geddon_inferno : public AuraScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_INFERNO_DMG });
}
void OnPeriodic(AuraEffect const* aurEff)
{
PreventDefaultAction();
@@ -15,45 +15,73 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* ScriptData
SDName: Boss_Garr
SD%Complete: 50
SDComment: Adds NYI
SDCategory: Molten Core
EndScriptData */
#include "ScriptMgr.h"
#include "molten_core.h"
#include "ScriptedCreature.h"
#include "SpellAuraEffects.h"
#include "SpellInfo.h"
#include "SpellScript.h"
enum Spells
enum GarrTexts
{
EMOTE_MASSIVE_ERUPTION = 0
};
enum GarrSpells
{
// Garr
SPELL_ANTIMAGIC_PULSE = 19492,
SPELL_MAGMA_SHACKLES = 19496,
SPELL_ENRAGE = 19516,
SPELL_SEPARATION_ANXIETY = 23492,
SPELL_ANTIMAGIC_PULSE = 19492,
SPELL_MAGMA_SHACKLES = 19496,
SPELL_ERUPTION_TRIGGER = 20482,
// Adds
SPELL_ERUPTION = 19497,
SPELL_IMMOLATE = 15732,
SPELL_FRENZY = 19516,
SPELL_SEPARATION_ANXIETY = 23487,
// Firesworn
SPELL_THRASH = 8876,
SPELL_IMMOLATE = 15733,
SPELL_ERUPTION = 19497,
SPELL_FRENZY_TRIGGER = 19515,
SPELL_MASSIVE_ERUPTION = 20483,
// Scripts
SPELL_SEPARATION_ANXIETY_EFFECT = 23492
};
enum Events
enum GarrEvents
{
EVENT_ANTIMAGIC_PULSE = 1,
EVENT_MAGMA_SHACKLES = 2,
EVENT_ANTIMAGIC_PULSE = 1,
EVENT_MAGMA_SHACKLES,
EVENT_MASSIVE_ERUPTION
};
// 12057 - Garr
struct boss_garr : public BossAI
{
boss_garr(Creature* creature) : BossAI(creature, BOSS_GARR) { }
void JustEngagedWith(Unit* victim) override
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(victim);
events.ScheduleEvent(EVENT_ANTIMAGIC_PULSE, 25s);
events.ScheduleEvent(EVENT_MAGMA_SHACKLES, 15s);
BossAI::JustEngagedWith(who);
DoCastSelf(SPELL_SEPARATION_ANXIETY);
events.ScheduleEvent(EVENT_ANTIMAGIC_PULSE, 10s, 15s);
events.ScheduleEvent(EVENT_MAGMA_SHACKLES, 5s, 10s);
events.ScheduleEvent(EVENT_MASSIVE_ERUPTION, 6min);
}
void OnSpellCast(SpellInfo const* spell) override
{
if (spell->Id == SPELL_ERUPTION_TRIGGER)
Talk(EMOTE_MASSIVE_ERUPTION);
}
void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
{
if (spellInfo->Id == SPELL_FRENZY_TRIGGER)
DoCastSelf(SPELL_FRENZY);
}
void UpdateAI(uint32 diff) override
@@ -70,16 +98,20 @@ struct boss_garr : public BossAI
{
switch (eventId)
{
case EVENT_ANTIMAGIC_PULSE:
DoCast(me, SPELL_ANTIMAGIC_PULSE);
events.ScheduleEvent(EVENT_ANTIMAGIC_PULSE, 10s, 15s);
break;
case EVENT_MAGMA_SHACKLES:
DoCast(me, SPELL_MAGMA_SHACKLES);
events.ScheduleEvent(EVENT_MAGMA_SHACKLES, 8s, 12s);
break;
default:
break;
case EVENT_ANTIMAGIC_PULSE:
DoCastSelf(SPELL_ANTIMAGIC_PULSE);
events.Repeat(15s, 20s);
break;
case EVENT_MAGMA_SHACKLES:
DoCastSelf(SPELL_MAGMA_SHACKLES);
events.Repeat(10s, 15s);
break;
case EVENT_MASSIVE_ERUPTION:
DoCastSelf(SPELL_ERUPTION_TRIGGER);
events.Repeat(20s);
break;
default:
break;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
@@ -88,70 +120,71 @@ struct boss_garr : public BossAI
}
};
// 12099 - Firesworn
struct npc_firesworn : public ScriptedAI
{
npc_firesworn(Creature* creature) : ScriptedAI(creature) { }
void ScheduleTasks()
void InitializeAI() override
{
// Timers for this are probably wrong
_scheduler.Schedule(4s, [this](TaskContext& context)
{
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
DoCast(target, SPELL_IMMOLATE);
context.Repeat(5s, 10s);
});
// Separation Anxiety - Periodically check if Garr is nearby
// ...and enrage if he is not.
_scheduler.Schedule(3s, [this](TaskContext& context)
{
if (!me->FindNearestCreature(NPC_GARR, 20.0f))
DoCastSelf(SPELL_SEPARATION_ANXIETY);
else if (me->HasAura(SPELL_SEPARATION_ANXIETY))
me->RemoveAurasDueToSpell(SPELL_SEPARATION_ANXIETY);
context.Repeat();
});
me->SetCorpseDelay(5, true);
ScriptedAI::InitializeAI();
}
void Reset() override
{
_scheduler.CancelAll();
DoCastSelf(SPELL_THRASH);
DoCastSelf(SPELL_IMMOLATE);
}
void JustEngagedWith(Unit* /*who*/) override
void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
{
ScheduleTasks();
if (spellInfo->Id == SPELL_ERUPTION_TRIGGER)
DoCastSelf(SPELL_MASSIVE_ERUPTION);
}
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
void JustDied(Unit* killer) override
{
uint32 const health10pct = me->CountPctFromMaxHealth(10);
uint32 health = me->GetHealth();
if (int32(health) - int32(damage) < int32(health10pct))
{
damage = 0;
DoCastVictim(SPELL_ERUPTION);
me->DespawnOrUnsummon();
}
}
if (killer != me)
DoCastSelf(SPELL_ERUPTION, true);
void UpdateAI(uint32 diff) override
DoCastSelf(SPELL_FRENZY_TRIGGER, true);
}
};
// 23487 - Separation Anxiety
class spell_garr_separation_anxiety : public AuraScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
if (!UpdateVictim())
return;
_scheduler.Update(diff);
return ValidateSpellInfo({ SPELL_SEPARATION_ANXIETY_EFFECT });
}
private:
TaskScheduler _scheduler;
void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude)
{
isPeriodic = true;
amplitude = 5 * IN_MILLISECONDS;
}
void HandleDummyTick(AuraEffect const* aurEff)
{
Unit* target = GetTarget();
if (Unit* caster = GetCaster())
if (caster->IsAlive() && !caster->IsWithinDistInMap(target, aurEff->GetSpellEffectInfo().CalcRadius(caster, SpellTargetIndex::TargetA).Max))
target->CastSpell(target, SPELL_SEPARATION_ANXIETY_EFFECT, true);
}
void Register() override
{
DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_garr_separation_anxiety::CalcPeriodic, EFFECT_0, SPELL_AURA_DUMMY);
OnEffectPeriodic += AuraEffectPeriodicFn(spell_garr_separation_anxiety::HandleDummyTick, EFFECT_0, SPELL_AURA_DUMMY);
}
};
void AddSC_boss_garr()
{
RegisterMoltenCoreCreatureAI(boss_garr);
RegisterMoltenCoreCreatureAI(npc_firesworn);
RegisterSpellScript(spell_garr_separation_anxiety);
}
@@ -15,43 +15,39 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* ScriptData
SDName: Boss_Gehennas
SD%Complete: 90
SDComment: Adds MC NYI
SDCategory: Molten Core
EndScriptData */
#include "ScriptMgr.h"
#include "molten_core.h"
#include "ScriptedCreature.h"
enum Spells
enum GehennasSpells
{
SPELL_GEHENNAS_CURSE = 19716,
SPELL_RAIN_OF_FIRE = 19717,
SPELL_SHADOW_BOLT = 19728,
SPELL_GEHENNAS_CURSE = 19716,
SPELL_RAIN_OF_FIRE = 19717,
SPELL_SHADOW_BOLT_VICTIM = 19728,
SPELL_SHADOW_BOLT_RANDOM = 19729
};
enum Events
enum GehennasEvents
{
EVENT_GEHENNAS_CURSE = 1,
EVENT_RAIN_OF_FIRE = 2,
EVENT_SHADOW_BOLT = 3,
EVENT_GEHENNAS_CURSE = 1,
EVENT_RAIN_OF_FIRE,
EVENT_SHADOW_BOLT_VICTIM,
EVENT_SHADOW_BOLT_RANDOM
};
// 12259 - Gehennas
struct boss_gehennas : public BossAI
{
boss_gehennas(Creature* creature) : BossAI(creature, BOSS_GEHENNAS)
{
}
boss_gehennas(Creature* creature) : BossAI(creature, BOSS_GEHENNAS) { }
void JustEngagedWith(Unit* victim) override
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(victim);
events.ScheduleEvent(EVENT_GEHENNAS_CURSE, 12s);
events.ScheduleEvent(EVENT_RAIN_OF_FIRE, 10s);
events.ScheduleEvent(EVENT_SHADOW_BOLT, 6s);
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_GEHENNAS_CURSE, 5s, 10s);
events.ScheduleEvent(EVENT_RAIN_OF_FIRE, 5s, 10s);
events.ScheduleEvent(EVENT_SHADOW_BOLT_VICTIM, 3s, 6s);
events.ScheduleEvent(EVENT_SHADOW_BOLT_RANDOM, 3s, 6s);
}
void UpdateAI(uint32 diff) override
@@ -69,18 +65,22 @@ struct boss_gehennas : public BossAI
switch (eventId)
{
case EVENT_GEHENNAS_CURSE:
DoCastVictim(SPELL_GEHENNAS_CURSE);
events.ScheduleEvent(EVENT_GEHENNAS_CURSE, 22s, 30s);
DoCastSelf(SPELL_GEHENNAS_CURSE);
events.Repeat(25s, 30s);
break;
case EVENT_RAIN_OF_FIRE:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
DoCast(target, SPELL_RAIN_OF_FIRE);
events.ScheduleEvent(EVENT_RAIN_OF_FIRE, 4s, 12s);
events.Repeat(6s, 12s);
break;
case EVENT_SHADOW_BOLT:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1))
DoCast(target, SPELL_SHADOW_BOLT);
events.ScheduleEvent(EVENT_SHADOW_BOLT, 7s);
case EVENT_SHADOW_BOLT_VICTIM:
DoCastVictim(SPELL_SHADOW_BOLT_VICTIM);
events.Repeat(3s, 6s);
break;
case EVENT_SHADOW_BOLT_RANDOM:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
DoCast(target, SPELL_SHADOW_BOLT_RANDOM);
events.Repeat(3s, 6s);
break;
default:
break;
@@ -15,66 +15,83 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* ScriptData
SDName: Boss_Golemagg
SD%Complete: 90
SDComment: Timers need to be confirmed, Golemagg's Trust need to be checked
SDCategory: Molten Core
EndScriptData */
#include "ScriptMgr.h"
#include "InstanceScript.h"
#include "molten_core.h"
#include "ObjectAccessor.h"
#include "ScriptedCreature.h"
#include "SpellInfo.h"
enum Texts
enum GolemaggTexts
{
EMOTE_LOWHP = 0,
EMOTE_LOW_HEALTH = 0
};
enum Spells
enum GolemaggSpells
{
// Golemagg
SPELL_MAGMASPLASH = 13879,
SPELL_DOUBLE_ATTACK = 18943,
SPELL_GOLEMAGGS_TRUST = 20556,
SPELL_MAGMA_SPLASH = 13879,
SPELL_PYROBLAST = 20228,
SPELL_EARTHQUAKE = 19798,
SPELL_ENRAGE = 19953,
SPELL_GOLEMAGG_TRUST = 20553,
// Core Rager
SPELL_MANGLE = 19820
SPELL_THRASH = 12787,
SPELL_MANGLE = 19820,
SPELL_FULL_HEAL = 17683,
SPELL_QUIET_SUICIDE = 3617
};
enum Events
enum GolemaggEvents
{
EVENT_PYROBLAST = 1,
EVENT_EARTHQUAKE = 2,
EVENT_PYROBLAST = 1,
EVENT_EARTHQUAKE
};
enum GolemaggMisc
{
NPC_CORE_RAGER = 11672,
ACTION_QUIET_SUICIDE = 0
};
// 11988 - Golemagg the Incinerator
struct boss_golemagg : public BossAI
{
boss_golemagg(Creature* creature) : BossAI(creature, BOSS_GOLEMAGG_THE_INCINERATOR) { }
boss_golemagg(Creature* creature) : BossAI(creature, BOSS_GOLEMAGG_THE_INCINERATOR), _isPerformingEarthquake(false) { }
void Reset() override
{
BossAI::Reset();
DoCast(me, SPELL_MAGMASPLASH, true);
_Reset();
_isPerformingEarthquake = false;
DoCastSelf(SPELL_DOUBLE_ATTACK);
DoCastSelf(SPELL_GOLEMAGGS_TRUST);
DoCastSelf(SPELL_MAGMA_SPLASH);
}
void JustEngagedWith(Unit* victim) override
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(victim);
events.ScheduleEvent(EVENT_PYROBLAST, 7s);
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_PYROBLAST, 5s, 10s);
}
void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
{
if (!HealthBelowPct(10) || me->HasAura(SPELL_ENRAGE))
return;
if (!_isPerformingEarthquake && me->HealthBelowPctDamaged(10, damage))
{
_isPerformingEarthquake = true;
events.ScheduleEvent(EVENT_EARTHQUAKE, 3s);
}
}
DoCast(me, SPELL_ENRAGE, true);
events.ScheduleEvent(EVENT_EARTHQUAKE, 3s);
void JustDied(Unit* /*killer*/) override
{
_JustDied();
std::vector<Creature*> ragers;
GetCreatureListWithEntryInGrid(ragers, me, NPC_CORE_RAGER, 250.0f);
for (Creature* rager : ragers)
rager->AI()->DoAction(ACTION_QUIET_SUICIDE);
}
void UpdateAI(uint32 diff) override
@@ -94,11 +111,11 @@ struct boss_golemagg : public BossAI
case EVENT_PYROBLAST:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
DoCast(target, SPELL_PYROBLAST);
events.ScheduleEvent(EVENT_PYROBLAST, 7s);
events.Repeat(3s, 13s);
break;
case EVENT_EARTHQUAKE:
DoCastVictim(SPELL_EARTHQUAKE);
events.ScheduleEvent(EVENT_EARTHQUAKE, 3s);
DoCastSelf(SPELL_EARTHQUAKE);
events.Repeat(3s);
break;
default:
break;
@@ -108,42 +125,51 @@ struct boss_golemagg : public BossAI
return;
}
}
private:
bool _isPerformingEarthquake;
};
// 11672 - Core Rager
struct npc_core_rager : public ScriptedAI
{
npc_core_rager(Creature* creature) : ScriptedAI(creature)
{
_instance = creature->GetInstanceScript();
}
npc_core_rager(Creature* creature) : ScriptedAI(creature) { }
void Reset() override
{
_scheduler.CancelAll();
DoCastSelf(SPELL_THRASH);
}
void JustEngagedWith(Unit* /*who*/) override
{
_scheduler.Schedule(7s, [this](TaskContext& task) // These times are probably wrong
_scheduler.Schedule(5s, 15s, [this](TaskContext& task)
{
DoCastVictim(SPELL_MANGLE);
task.Repeat(10s);
task.Repeat(10s, 20s);
});
}
void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
void DoAction(int32 action) override
{
if (HealthAbovePct(50) || !_instance)
return;
if (action == ACTION_QUIET_SUICIDE)
DoCastSelf(SPELL_QUIET_SUICIDE);
}
if (Creature* pGolemagg = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(BOSS_GOLEMAGG_THE_INCINERATOR)))
void OnSpellCast(SpellInfo const* spell) override
{
if (spell->Id == SPELL_FULL_HEAL)
Talk(EMOTE_LOW_HEALTH);
}
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
{
if (me->HealthBelowPctDamaged(50, damage))
{
if (pGolemagg->IsAlive())
_scheduler.Schedule(0s, [this](TaskContext /*task*/)
{
me->AddAura(SPELL_GOLEMAGG_TRUST, me);
Talk(EMOTE_LOWHP);
me->SetFullHealth();
}
DoCastSelf(SPELL_FULL_HEAL);
});
}
}
@@ -156,7 +182,6 @@ struct npc_core_rager : public ScriptedAI
}
private:
InstanceScript* _instance;
TaskScheduler _scheduler;
};
@@ -15,43 +15,36 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* ScriptData
SDName: Boss_Lucifron
SD%Complete: 100
SDComment:
SDCategory: Molten Core
EndScriptData */
#include "ScriptMgr.h"
#include "molten_core.h"
#include "ScriptedCreature.h"
enum Spells
enum LucifronSpells
{
SPELL_IMPENDING_DOOM = 19702,
SPELL_LUCIFRON_CURSE = 19703,
SPELL_SHADOW_SHOCK = 20603,
SPELL_SHADOW_SHOCK = 19460
};
enum Events
enum LucifronEvents
{
EVENT_IMPENDING_DOOM = 1,
EVENT_LUCIFRON_CURSE = 2,
EVENT_SHADOW_SHOCK = 3,
EVENT_LUCIFRON_CURSE,
EVENT_SHADOW_SHOCK
};
// 12118 - Lucifron
struct boss_lucifron : public BossAI
{
boss_lucifron(Creature* creature) : BossAI(creature, BOSS_LUCIFRON)
{
}
boss_lucifron(Creature* creature) : BossAI(creature, BOSS_LUCIFRON) { }
void JustEngagedWith(Unit* victim) override
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(victim);
events.ScheduleEvent(EVENT_IMPENDING_DOOM, 10s);
events.ScheduleEvent(EVENT_LUCIFRON_CURSE, 20s);
events.ScheduleEvent(EVENT_SHADOW_SHOCK, 6s);
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_IMPENDING_DOOM, 5s, 10s);
events.ScheduleEvent(EVENT_LUCIFRON_CURSE, 10s, 15s);
events.ScheduleEvent(EVENT_SHADOW_SHOCK, 3s, 6s);
}
void UpdateAI(uint32 diff) override
@@ -69,16 +62,16 @@ struct boss_lucifron : public BossAI
switch (eventId)
{
case EVENT_IMPENDING_DOOM:
DoCastVictim(SPELL_IMPENDING_DOOM);
events.ScheduleEvent(EVENT_IMPENDING_DOOM, 20s);
DoCastSelf(SPELL_IMPENDING_DOOM);
events.Repeat(20s, 25s);
break;
case EVENT_LUCIFRON_CURSE:
DoCastVictim(SPELL_LUCIFRON_CURSE);
events.ScheduleEvent(EVENT_LUCIFRON_CURSE, 15s);
DoCastSelf(SPELL_LUCIFRON_CURSE);
events.Repeat(20s, 25s);
break;
case EVENT_SHADOW_SHOCK:
DoCastVictim(SPELL_SHADOW_SHOCK);
events.ScheduleEvent(EVENT_SHADOW_SHOCK, 6s);
events.Repeat(3s, 6s);
break;
default:
break;
@@ -15,55 +15,88 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* ScriptData
SDName: Boss_Magmadar
SD%Complete: 75
SDComment: Conflag on ground nyi
SDCategory: Molten Core
EndScriptData */
/*
* Lava Bomb requires additional research. Both spells can target mana-users. Doesn't look like they're used randomly. Only one spell is used every 12-15 seconds.
Looks like the spell boss uses depends on HP PCT but exact PCT is unknown. That should be double-checked
*/
#include "ScriptMgr.h"
#include "molten_core.h"
#include "ScriptedCreature.h"
#include "SpellInfo.h"
#include "SpellScript.h"
enum Texts
enum MagmadarTexts
{
EMOTE_FRENZY = 0
EMOTE_FRENZY = 0,
EMOTE_EXHAUSTED = 1
};
enum Spells
enum MagmadarSpells
{
SPELL_FRENZY = 19451,
SPELL_MAGMA_SPIT = 19449,
SPELL_PANIC = 19408,
SPELL_LAVA_BOMB = 19428,
SPELL_MAGMA_SPIT = 19449,
SPELL_FRENZY = 19451,
SPELL_PANIC = 19408,
SPELL_LAVA_BOMB_1 = 19411,
SPELL_LAVA_BOMB_2 = 20474,
SPELL_SUMMON_LAVA_BOMB_1 = 20494,
SPELL_SUMMON_LAVA_BOMB_2 = 20495
};
enum Events
enum MagmadarEvents
{
EVENT_FRENZY = 1,
EVENT_PANIC = 2,
EVENT_LAVA_BOMB = 3,
EVENT_FRENZY = 1,
EVENT_PANIC,
EVENT_LAVA_BOMB_1,
EVENT_LAVA_BOMB_2,
EVENT_EXHAUSTED
};
// 11982 - Magmadar
struct boss_magmadar : public BossAI
{
boss_magmadar(Creature* creature) : BossAI(creature, BOSS_MAGMADAR)
{
}
boss_magmadar(Creature* creature) : BossAI(creature, BOSS_MAGMADAR), _lavaBombSwitched(false), _isExhausted(false) { }
void Reset() override
{
BossAI::Reset();
DoCast(me, SPELL_MAGMA_SPIT, true);
_Reset();
_lavaBombSwitched = false;
_isExhausted = false;
DoCastSelf(SPELL_MAGMA_SPIT);
}
void JustEngagedWith(Unit* victim) override
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(victim);
events.ScheduleEvent(EVENT_FRENZY, 30s);
events.ScheduleEvent(EVENT_PANIC, 20s);
events.ScheduleEvent(EVENT_LAVA_BOMB, 12s);
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_FRENZY, 5s, 10s);
events.ScheduleEvent(EVENT_PANIC, 5s, 10s);
events.ScheduleEvent(EVENT_LAVA_BOMB_1, 10s, 15s);
}
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
{
if (!_lavaBombSwitched && me->HealthBelowPctDamaged(60, damage))
{
_lavaBombSwitched = true;
events.CancelEvent(EVENT_LAVA_BOMB_1);
events.ScheduleEvent(EVENT_LAVA_BOMB_2, 10s, 15s);
}
if (!_isExhausted && me->HealthBelowPctDamaged(2, damage))
{
_isExhausted = true;
events.ScheduleEvent(EVENT_EXHAUSTED, 0s);
}
}
void OnSpellCast(SpellInfo const* spell) override
{
if (spell->Id == SPELL_FRENZY)
Talk(EMOTE_FRENZY);
}
void UpdateAI(uint32 diff) override
@@ -81,18 +114,26 @@ struct boss_magmadar : public BossAI
switch (eventId)
{
case EVENT_FRENZY:
Talk(EMOTE_FRENZY);
DoCast(me, SPELL_FRENZY);
events.ScheduleEvent(EVENT_FRENZY, 15s);
DoCastSelf(SPELL_FRENZY);
events.Repeat(15s, 20s);
break;
case EVENT_PANIC:
DoCastVictim(SPELL_PANIC);
events.ScheduleEvent(EVENT_PANIC, 35s);
DoCastSelf(SPELL_PANIC);
events.Repeat(30s, 35s);
break;
case EVENT_LAVA_BOMB:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true, -SPELL_LAVA_BOMB))
DoCast(target, SPELL_LAVA_BOMB);
events.ScheduleEvent(EVENT_LAVA_BOMB, 12s);
case EVENT_LAVA_BOMB_1:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
DoCast(target, SPELL_LAVA_BOMB_1);
events.Repeat(12s, 15s);
break;
case EVENT_LAVA_BOMB_2:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
DoCast(target, SPELL_LAVA_BOMB_2);
events.Repeat(12s, 15s);
break;
case EVENT_EXHAUSTED:
Talk(EMOTE_EXHAUSTED);
break;
default:
break;
@@ -102,9 +143,43 @@ struct boss_magmadar : public BossAI
return;
}
}
private:
bool _lavaBombSwitched;
bool _isExhausted;
};
// 19411, 20474 - Lava Bomb
class spell_magmadar_lava_bomb : public SpellScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_SUMMON_LAVA_BOMB_1, SPELL_SUMMON_LAVA_BOMB_2 });
}
void HandleDummy(SpellEffIndex /*effIndex*/)
{
switch (GetSpellInfo()->Id)
{
case SPELL_LAVA_BOMB_1:
GetHitUnit()->CastSpell(GetHitUnit(), SPELL_SUMMON_LAVA_BOMB_1, true);
break;
case SPELL_LAVA_BOMB_2:
GetHitUnit()->CastSpell(GetHitUnit(), SPELL_SUMMON_LAVA_BOMB_2, true);
break;
default:
break;
}
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_magmadar_lava_bomb::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
void AddSC_boss_magmadar()
{
RegisterMoltenCoreCreatureAI(boss_magmadar);
RegisterSpellScript(spell_magmadar_lava_bomb);
}
@@ -19,40 +19,52 @@
#include "Containers.h"
#include "molten_core.h"
#include "ScriptedCreature.h"
#include "SpellInfo.h"
#include "SpellScript.h"
enum Spells
enum ShazzrahSpells
{
SPELL_ARCANE_EXPLOSION = 19712,
SPELL_SHAZZRAH_CURSE = 19713,
SPELL_MAGIC_GROUNDING = 19714,
SPELL_COUNTERSPELL = 19715,
SPELL_SHAZZRAH_GATE_DUMMY = 23138, // Teleports to and attacks a random target.
SPELL_SHAZZRAH_GATE = 23139,
SPELL_SHAZZRAH_GATE = 23138,
SPELL_SHAZZRAH_GATE_TELE = 23139
};
enum Events
enum ShazzrahEvents
{
EVENT_ARCANE_EXPLOSION = 1,
EVENT_ARCANE_EXPLOSION_TRIGGERED = 2,
EVENT_SHAZZRAH_CURSE = 3,
EVENT_MAGIC_GROUNDING = 4,
EVENT_COUNTERSPELL = 5,
EVENT_SHAZZRAH_GATE = 6,
EVENT_ARCANE_EXPLOSION = 1,
EVENT_SHAZZRAH_CURSE,
EVENT_MAGIC_GROUNDING,
EVENT_COUNTERSPELL,
EVENT_SHAZZRAH_GATE
};
// 12264 - Shazzrah
struct boss_shazzrah : public BossAI
{
boss_shazzrah(Creature* creature) : BossAI(creature, BOSS_SHAZZRAH) { }
void JustEngagedWith(Unit* target) override
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(target);
events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 6s);
events.ScheduleEvent(EVENT_SHAZZRAH_CURSE, 10s);
events.ScheduleEvent(EVENT_MAGIC_GROUNDING, 24s);
events.ScheduleEvent(EVENT_COUNTERSPELL, 15s);
events.ScheduleEvent(EVENT_SHAZZRAH_GATE, 45s);
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 2s, 4s);
events.ScheduleEvent(EVENT_SHAZZRAH_CURSE, 5s, 10s);
events.ScheduleEvent(EVENT_MAGIC_GROUNDING, 6s);
events.ScheduleEvent(EVENT_COUNTERSPELL, 10s, 15s);
events.ScheduleEvent(EVENT_SHAZZRAH_GATE, 30s);
}
void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
{
if (spellInfo->Id == SPELL_SHAZZRAH_GATE_TELE)
{
ResetThreatList();
events.RescheduleEvent(EVENT_ARCANE_EXPLOSION, 500ms);
}
}
void UpdateAI(uint32 diff) override
@@ -70,32 +82,24 @@ struct boss_shazzrah : public BossAI
switch (eventId)
{
case EVENT_ARCANE_EXPLOSION:
DoCastVictim(SPELL_ARCANE_EXPLOSION);
events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 4s, 7s);
break;
// Triggered subsequent to using "Gate of Shazzrah".
case EVENT_ARCANE_EXPLOSION_TRIGGERED:
DoCastVictim(SPELL_ARCANE_EXPLOSION);
DoCastSelf(SPELL_ARCANE_EXPLOSION);
events.Repeat(4s, 6s);
break;
case EVENT_SHAZZRAH_CURSE:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true, -SPELL_SHAZZRAH_CURSE))
DoCast(target, SPELL_SHAZZRAH_CURSE);
events.ScheduleEvent(EVENT_SHAZZRAH_CURSE, 25s, 30s);
DoCastSelf(SPELL_SHAZZRAH_CURSE);
events.Repeat(20s, 30s);
break;
case EVENT_MAGIC_GROUNDING:
DoCast(me, SPELL_MAGIC_GROUNDING);
events.ScheduleEvent(EVENT_MAGIC_GROUNDING, 35s);
DoCastSelf(SPELL_MAGIC_GROUNDING);
events.Repeat(20s, 25s);
break;
case EVENT_COUNTERSPELL:
DoCastVictim(SPELL_COUNTERSPELL);
events.ScheduleEvent(EVENT_COUNTERSPELL, 16s, 20s);
DoCastSelf(SPELL_COUNTERSPELL);
events.Repeat(15s, 20s);
break;
case EVENT_SHAZZRAH_GATE:
ResetThreatList();
DoCastAOE(SPELL_SHAZZRAH_GATE_DUMMY);
events.ScheduleEvent(EVENT_ARCANE_EXPLOSION_TRIGGERED, 2s);
events.RescheduleEvent(EVENT_ARCANE_EXPLOSION, 3s, 6s);
events.ScheduleEvent(EVENT_SHAZZRAH_GATE, 45s);
DoCastSelf(SPELL_SHAZZRAH_GATE);
events.Repeat(40s, 45s);
break;
default:
break;
@@ -112,7 +116,7 @@ class spell_shazzrah_gate_dummy : public SpellScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_SHAZZRAH_GATE });
return ValidateSpellInfo({ SPELL_SHAZZRAH_GATE_TELE });
}
void FilterTargets(std::list<WorldObject*>& targets)
@@ -127,12 +131,7 @@ class spell_shazzrah_gate_dummy : public SpellScript
void HandleScript(SpellEffIndex /*effIndex*/)
{
if (Unit* target = GetHitUnit())
{
target->CastSpell(GetCaster(), SPELL_SHAZZRAH_GATE, true);
if (Creature* creature = GetCaster()->ToCreature())
creature->AI()->AttackStart(target); // Attack the target which caster will teleport to.
}
GetHitUnit()->CastSpell(GetCaster(), SPELL_SHAZZRAH_GATE_TELE, true);
}
void Register() override
@@ -15,60 +15,57 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* ScriptData
SDName: Boss_Sulfuron_Harbringer
SD%Complete: 80
SDComment: Adds NYI
SDCategory: Molten Core
EndScriptData */
#include "ScriptMgr.h"
#include "Containers.h"
#include "molten_core.h"
#include "ScriptedCreature.h"
enum Spells
enum SulfuronSpells
{
// Sulfuron Harbringer
SPELL_DARK_STRIKE = 19777,
SPELL_DEMORALIZING_SHOUT = 19778,
SPELL_INSPIRE = 19779,
SPELL_KNOCKDOWN = 19780,
SPELL_FLAMESPEAR = 19781,
SPELL_HAND_OF_RAGNAROS = 19780,
SPELL_FLAME_SPEAR = 19781,
SPELL_THROW = 19785,
// Adds
SPELL_HEAL = 19775,
SPELL_SHADOWWORDPAIN = 19776,
SPELL_IMMOLATE = 20294,
// Flamewaker Priest
SPELL_DARK_MENDING = 19775,
SPELL_SHADOW_WORD_PAIN = 19776,
SPELL_DARK_STRIKE = 19777,
SPELL_IMMOLATE = 20294
};
enum Events
enum SulfuronEvents
{
EVENT_DARK_STRIKE = 1,
EVENT_DEMORALIZING_SHOUT = 2,
EVENT_INSPIRE = 3,
EVENT_KNOCKDOWN = 4,
EVENT_FLAMESPEAR = 5,
// Sulfuron Harbringer
EVENT_DEMORALIZING_SHOUT = 1,
EVENT_INSPIRE,
EVENT_HAND_OF_RAGNAROS,
EVENT_FLAME_SPEAR,
EVENT_THROW,
EVENT_HEAL = 6,
EVENT_SHADOW_WORD_PAIN = 7,
EVENT_IMMOLATE = 8,
// Flamewaker Priest
EVENT_DARK_MENDING,
EVENT_SHADOW_WORD_PAIN,
EVENT_DARK_STRIKE,
EVENT_IMMOLATE
};
// 12098 - Sulfuron Harbinger
struct boss_sulfuron : public BossAI
{
boss_sulfuron(Creature* creature) : BossAI(creature, BOSS_SULFURON_HARBINGER)
{
}
boss_sulfuron(Creature* creature) : BossAI(creature, BOSS_SULFURON_HARBINGER) { }
void JustEngagedWith(Unit* victim) override
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(victim);
events.ScheduleEvent(EVENT_DARK_STRIKE, 10s);
events.ScheduleEvent(EVENT_DEMORALIZING_SHOUT, 15s);
events.ScheduleEvent(EVENT_INSPIRE, 13s);
events.ScheduleEvent(EVENT_KNOCKDOWN, 6s);
events.ScheduleEvent(EVENT_FLAMESPEAR, 2s);
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_DEMORALIZING_SHOUT, 10s, 15s);
events.ScheduleEvent(EVENT_INSPIRE, 5s, 10s);
events.ScheduleEvent(EVENT_HAND_OF_RAGNAROS, 5s, 10s);
events.ScheduleEvent(EVENT_FLAME_SPEAR, 5s, 15s);
events.ScheduleEvent(EVENT_THROW, 0s);
}
void UpdateAI(uint32 diff) override
@@ -85,13 +82,9 @@ struct boss_sulfuron : public BossAI
{
switch (eventId)
{
case EVENT_DARK_STRIKE:
DoCast(me, SPELL_DARK_STRIKE);
events.ScheduleEvent(EVENT_DARK_STRIKE, 15s, 18s);
break;
case EVENT_DEMORALIZING_SHOUT:
DoCastVictim(SPELL_DEMORALIZING_SHOUT);
events.ScheduleEvent(EVENT_DEMORALIZING_SHOUT, 15s, 20s);
DoCastSelf(SPELL_DEMORALIZING_SHOUT);
events.Repeat(25s, 35s);
break;
case EVENT_INSPIRE:
{
@@ -99,18 +92,21 @@ struct boss_sulfuron : public BossAI
if (!healers.empty())
DoCast(Trinity::Containers::SelectRandomContainerElement(healers), SPELL_INSPIRE);
DoCast(me, SPELL_INSPIRE);
events.ScheduleEvent(EVENT_INSPIRE, 20s, 26s);
events.Repeat(15s, 20s);
break;
}
case EVENT_KNOCKDOWN:
DoCastVictim(SPELL_KNOCKDOWN);
events.ScheduleEvent(EVENT_KNOCKDOWN, 12s, 15s);
case EVENT_HAND_OF_RAGNAROS:
DoCastSelf(SPELL_HAND_OF_RAGNAROS);
events.Repeat(10s, 25s);
break;
case EVENT_FLAMESPEAR:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
DoCast(target, SPELL_FLAMESPEAR);
events.ScheduleEvent(EVENT_FLAMESPEAR, 12s, 16s);
case EVENT_FLAME_SPEAR:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
DoCast(target, SPELL_FLAME_SPEAR);
events.Repeat(10s, 20s);
break;
case EVENT_THROW:
DoCastVictim(SPELL_THROW);
events.Repeat(2s);
break;
default:
break;
@@ -122,28 +118,22 @@ struct boss_sulfuron : public BossAI
}
};
// 11662 - Flamewaker Priest
struct npc_flamewaker_priest : public ScriptedAI
{
npc_flamewaker_priest(Creature* creature) : ScriptedAI(creature)
{
}
npc_flamewaker_priest(Creature* creature) : ScriptedAI(creature) { }
void Reset() override
{
events.Reset();
_events.Reset();
}
void JustDied(Unit* /*killer*/) override
void JustEngagedWith(Unit* /*who*/) override
{
events.Reset();
}
void JustEngagedWith(Unit* victim) override
{
ScriptedAI::JustEngagedWith(victim);
events.ScheduleEvent(EVENT_HEAL, 15s, 30s);
events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 2s);
events.ScheduleEvent(EVENT_IMMOLATE, 8s);
_events.ScheduleEvent(EVENT_DARK_MENDING, 15s, 20s);
_events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 4s, 6s);
_events.ScheduleEvent(EVENT_DARK_STRIKE, 3s, 6s);
_events.ScheduleEvent(EVENT_IMMOLATE, 3s, 6s);
}
void UpdateAI(uint32 diff) override
@@ -151,29 +141,33 @@ struct npc_flamewaker_priest : public ScriptedAI
if (!UpdateVictim())
return;
events.Update(diff);
_events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_HEAL:
if (Unit* target = DoSelectLowestHpFriendly(60.0f, 1))
DoCast(target, SPELL_HEAL);
events.ScheduleEvent(EVENT_HEAL, 15s, 20s);
case EVENT_DARK_MENDING:
if (Unit* target = DoSelectLowestHpFriendly(60.0f))
DoCast(target, SPELL_DARK_MENDING);
_events.Repeat(15s, 20s);
break;
case EVENT_SHADOW_WORD_PAIN:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true, -SPELL_SHADOWWORDPAIN))
DoCast(target, SPELL_SHADOWWORDPAIN);
events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 18s, 26s);
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true, -SPELL_SHADOW_WORD_PAIN))
DoCast(target, SPELL_SHADOW_WORD_PAIN);
_events.Repeat(3s, 10s);
break;
case EVENT_DARK_STRIKE:
DoCastVictim(SPELL_DARK_STRIKE);
_events.Repeat(5s, 7s);
break;
case EVENT_IMMOLATE:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true, -SPELL_IMMOLATE))
DoCast(target, SPELL_IMMOLATE);
events.ScheduleEvent(EVENT_IMMOLATE, 15s, 25s);
_events.Repeat(4s, 8s);
break;
default:
break;
@@ -185,7 +179,7 @@ struct npc_flamewaker_priest : public ScriptedAI
}
private:
EventMap events;
EventMap _events;
};
void AddSC_boss_sulfuron()