diff options
author | offl <11556157+offl@users.noreply.github.com> | 2021-04-13 10:31:18 +0300 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-03-08 16:31:51 +0100 |
commit | 4dce06da7e49258960db28568ce7fc02ef4bb453 (patch) | |
tree | 7f8d5ff9f32eeea8a3f919ba43dd1dd1bfb0b2c2 /src | |
parent | d125316d5a819617a55f312edac34150265f708b (diff) |
Scripts/Naxxramas: Update Patchwerk to new model (#26388)
Co-authored-by: offl <offl@users.noreply.github.com>
(cherry picked from commit 6f0bc11bcef90b850edb13292a20165dbbbea87a)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp | 202 |
1 files changed, 95 insertions, 107 deletions
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp index 8d46edff20e..82ff29bac1b 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp @@ -34,7 +34,7 @@ enum Yells SAY_SLAY = 1, SAY_DEATH = 2, EMOTE_BERSERK = 3, - EMOTE_ENRAGE = 4 + EMOTE_FRENZY = 4 }; enum Events @@ -55,139 +55,127 @@ enum HatefulThreatAmounts HATEFUL_THREAT_AMT = 1000, }; -class boss_patchwerk : public CreatureScript +struct boss_patchwerk : public BossAI { -public: - boss_patchwerk() : CreatureScript("boss_patchwerk") { } - - CreatureAI* GetAI(Creature* creature) const override + boss_patchwerk(Creature* creature) : BossAI(creature, BOSS_PATCHWERK) { - return GetNaxxramasAI<boss_patchwerkAI>(creature); + Enraged = false; } - struct boss_patchwerkAI : public BossAI + bool Enraged; + + void Reset() override { - boss_patchwerkAI(Creature* creature) : BossAI(creature, BOSS_PATCHWERK) - { - Enraged = false; - } + _Reset(); - bool Enraged; + instance->DoStopCriteriaTimer(CriteriaStartEvent::SendEvent, ACHIEV_MAKE_QUICK_WERK_OF_HIM_STARTING_EVENT); + } - void Reset() override - { - _Reset(); + void KilledUnit(Unit* /*Victim*/) override + { + if (!(rand32() % 5)) + Talk(SAY_SLAY); + } - instance->DoStopCriteriaTimer(CriteriaStartEvent::SendEvent, ACHIEV_MAKE_QUICK_WERK_OF_HIM_STARTING_EVENT); - } + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + Talk(SAY_DEATH); + } - void KilledUnit(Unit* /*Victim*/) override - { - if (!(rand32() % 5)) - Talk(SAY_SLAY); - } + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + Enraged = false; + Talk(SAY_AGGRO); + events.ScheduleEvent(EVENT_HATEFUL, 1s); + events.ScheduleEvent(EVENT_BERSERK, 6min); - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - Talk(SAY_DEATH); - } + instance->DoStartCriteriaTimer(CriteriaStartEvent::SendEvent, ACHIEV_MAKE_QUICK_WERK_OF_HIM_STARTING_EVENT); + } - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - Enraged = false; - Talk(SAY_AGGRO); - events.ScheduleEvent(EVENT_HATEFUL, 1s); - events.ScheduleEvent(EVENT_BERSERK, 6min); + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - instance->DoStartCriteriaTimer(CriteriaStartEvent::SendEvent, ACHIEV_MAKE_QUICK_WERK_OF_HIM_STARTING_EVENT); - } + events.Update(diff); - void UpdateAI(uint32 diff) override + while (uint32 eventId = events.ExecuteEvent()) { - if (!UpdateVictim()) - return; - - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) + switch (eventId) { - switch (eventId) + case EVENT_HATEFUL: { - case EVENT_HATEFUL: + // Hateful Strike targets the highest non-MT threat in melee range on 10man + // and the higher HP target out of the two highest non-MT threats in melee range on 25man + ThreatReference* secondThreat = nullptr; + ThreatReference* thirdThreat = nullptr; + + ThreatManager& mgr = me->GetThreatManager(); + Unit* currentVictim = mgr.GetCurrentVictim(); + auto list = mgr.GetModifiableThreatList(); + auto it = list.begin(), end = list.end(); + if (it == end) { - // Hateful Strike targets the highest non-MT threat in melee range on 10man - // and the higher HP target out of the two highest non-MT threats in melee range on 25man - ThreatReference* secondThreat = nullptr; - ThreatReference* thirdThreat = nullptr; - - ThreatManager& mgr = me->GetThreatManager(); - Unit* currentVictim = mgr.GetCurrentVictim(); - auto list = mgr.GetModifiableThreatList(); - auto it = list.begin(), end = list.end(); - if (it == end) - { - EnterEvadeMode(EVADE_REASON_NO_HOSTILES); - return; - } + EnterEvadeMode(EVADE_REASON_NO_HOSTILES); + return; + } + if ((*it)->GetVictim() != currentVictim) + secondThreat = *it; + if ((!secondThreat || Is25ManRaid()) && (++it != end && (*it)->IsAvailable())) + { if ((*it)->GetVictim() != currentVictim) - secondThreat = *it; - if ((!secondThreat || Is25ManRaid()) && (++it != end && (*it)->IsAvailable())) - { - if ((*it)->GetVictim() != currentVictim) - (secondThreat ? thirdThreat : secondThreat) = *it; - if (!thirdThreat && Is25ManRaid() && (++it != end && (*it)->IsAvailable())) - thirdThreat = *it; - } - - Unit* pHatefulTarget = nullptr; - if (!secondThreat) - pHatefulTarget = currentVictim; - else if (!thirdThreat) - pHatefulTarget = secondThreat->GetVictim(); - else - pHatefulTarget = (secondThreat->GetVictim()->GetHealth() < thirdThreat->GetVictim()->GetHealth()) ? thirdThreat->GetVictim() : secondThreat->GetVictim(); - - // add threat to highest threat targets - AddThreat(currentVictim, HATEFUL_THREAT_AMT); - if (secondThreat) - secondThreat->AddThreat(HATEFUL_THREAT_AMT); - if (thirdThreat) - thirdThreat->AddThreat(HATEFUL_THREAT_AMT); - - DoCast(pHatefulTarget, SPELL_HATEFUL_STRIKE, true); - - events.Repeat(Seconds(1)); - break; + (secondThreat ? thirdThreat : secondThreat) = *it; + if (!thirdThreat && Is25ManRaid() && (++it != end && (*it)->IsAvailable())) + thirdThreat = *it; } - case EVENT_BERSERK: - DoCast(me, SPELL_BERSERK, true); - Talk(EMOTE_BERSERK); - events.ScheduleEvent(EVENT_SLIME, 2s); - break; - case EVENT_SLIME: - DoCastAOE(SPELL_SLIME_BOLT, true); - events.Repeat(Seconds(2)); - break; - } - } - if (!Enraged && HealthBelowPct(5)) - { - DoCast(me, SPELL_FRENZY, true); - Talk(EMOTE_ENRAGE); - Enraged = true; + Unit* pHatefulTarget = nullptr; + if (!secondThreat) + pHatefulTarget = currentVictim; + else if (!thirdThreat) + pHatefulTarget = secondThreat->GetVictim(); + else + pHatefulTarget = (secondThreat->GetVictim()->GetHealth() < thirdThreat->GetVictim()->GetHealth()) ? thirdThreat->GetVictim() : secondThreat->GetVictim(); + + // add threat to highest threat targets + AddThreat(currentVictim, HATEFUL_THREAT_AMT); + if (secondThreat) + secondThreat->AddThreat(HATEFUL_THREAT_AMT); + if (thirdThreat) + thirdThreat->AddThreat(HATEFUL_THREAT_AMT); + + DoCast(pHatefulTarget, SPELL_HATEFUL_STRIKE, true); + + events.Repeat(Seconds(1)); + break; + } + case EVENT_BERSERK: + DoCast(me, SPELL_BERSERK, true); + Talk(EMOTE_BERSERK); + events.ScheduleEvent(EVENT_SLIME, 2s); + break; + case EVENT_SLIME: + DoCastAOE(SPELL_SLIME_BOLT, true); + events.Repeat(Seconds(2)); + break; } + } - DoMeleeAttackIfReady(); + if (!Enraged && HealthBelowPct(5)) + { + DoCast(me, SPELL_FRENZY, true); + Talk(EMOTE_FRENZY); + Enraged = true; } - }; + DoMeleeAttackIfReady(); + } }; void AddSC_boss_patchwerk() { - new boss_patchwerk(); + RegisterNaxxramasCreatureAI(boss_patchwerk); } |