diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp index 6c5162bb5..9336da65e 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp @@ -78,7 +78,6 @@ enum Events EVENT_HAND_OF_RAGNAROS, EVENT_MIGHT_OF_RAGNAROS, EVENT_LAVA_BURST, - EVENT_MAGMA_BLAST_MELEE_CHECK, EVENT_MAGMA_BLAST, EVENT_SUBMERGE, EVENT_LAVA_BURST_TRIGGER, @@ -122,6 +121,7 @@ public: boss_ragnarosAI(Creature* creature) : BossAI(creature, DATA_RAGNAROS), _isIntroDone(false), _hasYelledMagmaBurst(false), + _processingMagmaBurst(false), _hasSubmergedOnce(false), _isKnockbackEmoteAllowed(true) { @@ -143,6 +143,7 @@ public: } _hasYelledMagmaBurst = false; + _processingMagmaBurst = false; _hasSubmergedOnce = false; _isKnockbackEmoteAllowed = true; me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); @@ -231,6 +232,28 @@ public: } } + void EnterEvadeMode() override + { + if (!me->getThreatMgr().getThreatList().empty()) + { + if (!_processingMagmaBurst) + { + // Boss try to evade, but still got some targets on threat list - it means that none of these targets are in melee range - cast magma blast + _processingMagmaBurst = true; + events.ScheduleEvent(EVENT_MAGMA_BLAST, 4000, PHASE_EMERGED, PHASE_EMERGED); + } + } + else + { + BossAI::EnterEvadeMode(); + } + } + + bool CanAIAttack(Unit const* victim) const override + { + return me->IsWithinMeleeRange(victim); + } + void UpdateAI(uint32 diff) override { if (!extraEvents.Empty()) @@ -297,7 +320,10 @@ public: if (!UpdateVictim()) { - return; + if (!_processingMagmaBurst) + { + return; + } } events.Update(diff); @@ -340,38 +366,10 @@ public: DoCastAOE(SPELL_LAVA_BURST); break; } - case EVENT_MAGMA_BLAST_MELEE_CHECK: - { - if (Unit* target = ObjectAccessor::GetUnit(*me, me->GetTarget())) - { - if (!target->IsAlive()) - { - me->SetTarget(ObjectGuid::Empty); - } - } - - if (!IsVictimWithinMeleeRange()) - { - if (Unit* target = SelectTarget(SelectTargetMethod::MaxThreat, 0, [&](Unit* u) { return u && u->IsPlayer() && me->IsWithinMeleeRange(u); })) - { - me->AttackerStateUpdate(target); - me->SetTarget(target->GetGUID()); - events.RepeatEvent(500); - } - else - { - events.ScheduleEvent(EVENT_MAGMA_BLAST, 4000, PHASE_EMERGED, PHASE_EMERGED); - } - } - else - { - _hasYelledMagmaBurst = false; - events.RepeatEvent(500); - } - break; - } case EVENT_MAGMA_BLAST: { + _processingMagmaBurst = false; + if (!IsVictimWithinMeleeRange()) { DoCastRandomTarget(SPELL_MAGMA_BLAST); @@ -383,7 +381,6 @@ public: } } - events.RescheduleEvent(EVENT_MAGMA_BLAST_MELEE_CHECK, 500, PHASE_EMERGED, PHASE_EMERGED); break; } case EVENT_MIGHT_OF_RAGNAROS: @@ -444,6 +441,7 @@ public: EventMap extraEvents; bool _isIntroDone; bool _hasYelledMagmaBurst; + bool _processingMagmaBurst; bool _hasSubmergedOnce; bool _isKnockbackEmoteAllowed; // Prevents possible text overlap @@ -480,7 +478,6 @@ public: events.RescheduleEvent(EVENT_WRATH_OF_RAGNAROS, 30000, PHASE_EMERGED, PHASE_EMERGED); events.RescheduleEvent(EVENT_HAND_OF_RAGNAROS, 25000, PHASE_EMERGED, PHASE_EMERGED); events.RescheduleEvent(EVENT_LAVA_BURST, 10000, PHASE_EMERGED, PHASE_EMERGED); - events.RescheduleEvent(EVENT_MAGMA_BLAST_MELEE_CHECK, 10000, PHASE_EMERGED, PHASE_EMERGED); events.RescheduleEvent(EVENT_SUBMERGE, 180000, PHASE_EMERGED, PHASE_EMERGED); events.RescheduleEvent(EVENT_MIGHT_OF_RAGNAROS, 11000, PHASE_EMERGED, PHASE_EMERGED); }