aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp202
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);
}