diff options
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() |