aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/3.3.5/2025_09_18_00_world.sql31
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp87
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp185
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp61
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp124
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp44
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp148
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp83
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp145
9 files changed, 540 insertions, 368 deletions
diff --git a/sql/updates/world/3.3.5/2025_09_18_00_world.sql b/sql/updates/world/3.3.5/2025_09_18_00_world.sql
new file mode 100644
index 00000000000..edca882d181
--- /dev/null
+++ b/sql/updates/world/3.3.5/2025_09_18_00_world.sql
@@ -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');
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp
index 86f26ac6025..bbb240c4f27 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp
@@ -15,53 +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"
-#include "ObjectMgr.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* who) override
{
+ BossAI::JustEngagedWith(who);
+
+ events.ScheduleEvent(EVENT_INFERNO, 15s, 20s);
+ events.ScheduleEvent(EVENT_IGNITE_MANA, 5s, 20s);
+ events.ScheduleEvent(EVENT_LIVING_BOMB, 15s, 35s);
}
- void JustEngagedWith(Unit* victim) override
+ void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
{
- BossAI::JustEngagedWith(victim);
- events.ScheduleEvent(EVENT_INFERNO, 45s);
- events.ScheduleEvent(EVENT_IGNITE_MANA, 30s);
- events.ScheduleEvent(EVENT_LIVING_BOMB, 35s);
+ 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
@@ -71,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;
@@ -88,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;
@@ -111,6 +120,9 @@ struct boss_baron_geddon : public BossAI
DoMeleeAttackIfReady();
}
+
+private:
+ bool _performedArmageddon;
};
// 19695 - Inferno
@@ -118,6 +130,11 @@ class spell_baron_geddon_inferno : public AuraScript
{
PrepareAuraScript(spell_baron_geddon_inferno);
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_INFERNO_DMG });
+ }
+
void OnPeriodic(AuraEffect const* aurEff)
{
PreventDefaultAction();
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp
index 5ccc3bd65a2..bc5cdd23180 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp
@@ -15,46 +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 "ObjectMgr.h"
#include "ScriptedCreature.h"
+#include "SpellAuraEffects.h"
+#include "SpellInfo.h"
+#include "SpellScript.h"
+
+enum GarrTexts
+{
+ EMOTE_MASSIVE_ERUPTION = 0
+};
-enum Spells
+enum GarrSpells
{
// Garr
- SPELL_ANTIMAGIC_PULSE = 19492,
- SPELL_MAGMA_SHACKLES = 19496,
- SPELL_ENRAGE = 19516,
- SPELL_SEPARATION_ANXIETY = 23492,
-
- // Adds
- SPELL_ERUPTION = 19497,
- SPELL_IMMOLATE = 15732,
+ SPELL_ANTIMAGIC_PULSE = 19492,
+ SPELL_MAGMA_SHACKLES = 19496,
+ SPELL_ERUPTION_TRIGGER = 20482,
+
+ 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
@@ -71,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))
@@ -91,71 +122,81 @@ 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);
+
+ DoCastSelf(SPELL_FRENZY_TRIGGER, true);
}
- void UpdateAI(uint32 diff) override
+ void UpdateAI(uint32 /*diff*/) override
{
if (!UpdateVictim())
return;
- _scheduler.Update(diff,
- std::bind(&ScriptedAI::DoMeleeAttackIfReady, this));
+ DoMeleeAttackIfReady();
+ }
+};
+
+// 23487 - Separation Anxiety
+class spell_garr_separation_anxiety : public AuraScript
+{
+ PrepareAuraScript(spell_garr_separation_anxiety);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_SEPARATION_ANXIETY_EFFECT });
+ }
+
+ 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()))
+ target->CastSpell(target, SPELL_SEPARATION_ANXIETY_EFFECT, true);
}
-private:
- TaskScheduler _scheduler;
+ 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);
}
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp
index f5236cb2003..c9dcd73e586 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp
@@ -15,44 +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 "ObjectMgr.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
@@ -70,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_VICTIM:
+ DoCastVictim(SPELL_SHADOW_BOLT_VICTIM);
+ events.Repeat(3s, 6s);
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_RANDOM:
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
+ DoCast(target, SPELL_SHADOW_BOLT_RANDOM);
+ events.Repeat(3s, 6s);
break;
default:
break;
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp
index bfa04032f12..0eefc2a6456 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp
@@ -15,67 +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 "ObjectMgr.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 GolemaggEvents
+{
+ EVENT_PYROBLAST = 1,
+ EVENT_EARTHQUAKE
};
-enum Events
+enum GolemaggMisc
{
- EVENT_PYROBLAST = 1,
- EVENT_EARTHQUAKE = 2,
+ 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* who) override
+ {
+ BossAI::JustEngagedWith(who);
+
+ events.ScheduleEvent(EVENT_PYROBLAST, 5s, 10s);
}
- void JustEngagedWith(Unit* victim) override
+ void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
{
- BossAI::JustEngagedWith(victim);
- events.ScheduleEvent(EVENT_PYROBLAST, 7s);
+ if (!_isPerformingEarthquake && me->HealthBelowPctDamaged(10, damage))
+ {
+ _isPerformingEarthquake = true;
+ events.ScheduleEvent(EVENT_EARTHQUAKE, 3s);
+ }
}
- void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
+ void JustDied(Unit* /*killer*/) override
{
- if (!HealthBelowPct(10) || me->HasAura(SPELL_ENRAGE))
- return;
+ _JustDied();
- DoCast(me, SPELL_ENRAGE, true);
- events.ScheduleEvent(EVENT_EARTHQUAKE, 3s);
+ 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
@@ -95,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;
@@ -111,42 +127,51 @@ struct boss_golemagg : public BossAI
DoMeleeAttackIfReady();
}
+
+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);
+ });
}
}
@@ -162,7 +187,6 @@ struct npc_core_rager : public ScriptedAI
}
private:
- InstanceScript* _instance;
TaskScheduler _scheduler;
};
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp
index c33d9e697c5..9b3b7c428f5 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp
@@ -15,44 +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 "ObjectMgr.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
@@ -70,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;
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp
index 604a04b675e..f166f8528d9 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp
@@ -15,56 +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 "ObjectMgr.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
{
+ _Reset();
+ _lavaBombSwitched = false;
+ _isExhausted = false;
+ DoCastSelf(SPELL_MAGMA_SPIT);
}
- void Reset() override
+ void JustEngagedWith(Unit* who) override
+ {
+ 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
{
- BossAI::Reset();
- DoCast(me, SPELL_MAGMA_SPIT, true);
+ 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 JustEngagedWith(Unit* victim) override
+ void OnSpellCast(SpellInfo const* spell) override
{
- BossAI::JustEngagedWith(victim);
- events.ScheduleEvent(EVENT_FRENZY, 30s);
- events.ScheduleEvent(EVENT_PANIC, 20s);
- events.ScheduleEvent(EVENT_LAVA_BOMB, 12s);
+ if (spell->Id == SPELL_FRENZY)
+ Talk(EMOTE_FRENZY);
}
void UpdateAI(uint32 diff) override
@@ -82,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_1:
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
+ DoCast(target, SPELL_LAVA_BOMB_1);
+ events.Repeat(12s, 15s);
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_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;
@@ -105,9 +145,45 @@ struct boss_magmadar : public BossAI
DoMeleeAttackIfReady();
}
+
+private:
+ bool _lavaBombSwitched;
+ bool _isExhausted;
+};
+
+// 19411, 20474 - Lava Bomb
+class spell_magmadar_lava_bomb : public SpellScript
+{
+ PrepareSpellScript(spell_magmadar_lava_bomb);
+
+ 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);
}
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp
index 78946546c00..2e9f36f0320 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp
@@ -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(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
{
- 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);
+ 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;
@@ -116,7 +120,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)
@@ -131,12 +135,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
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp
index 8dbcdde8d57..12413f59680 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp
@@ -15,61 +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 "ObjectMgr.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,
-
- EVENT_HEAL = 6,
- EVENT_SHADOW_WORD_PAIN = 7,
- EVENT_IMMOLATE = 8,
+ // Sulfuron Harbringer
+ EVENT_DEMORALIZING_SHOUT = 1,
+ EVENT_INSPIRE,
+ EVENT_HAND_OF_RAGNAROS,
+ EVENT_FLAME_SPEAR,
+ EVENT_THROW,
+
+ // 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
@@ -86,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:
{
@@ -100,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_FLAME_SPEAR:
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
+ DoCast(target, SPELL_FLAME_SPEAR);
+ events.Repeat(10s, 20s);
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_THROW:
+ DoCastVictim(SPELL_THROW);
+ events.Repeat(2s);
break;
default:
break;
@@ -125,28 +120,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();
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- events.Reset();
+ _events.Reset();
}
- void JustEngagedWith(Unit* victim) override
+ void JustEngagedWith(Unit* /*who*/) 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
@@ -154,29 +143,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;
@@ -190,7 +183,7 @@ struct npc_flamewaker_priest : public ScriptedAI
}
private:
- EventMap events;
+ EventMap _events;
};
void AddSC_boss_sulfuron()