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