aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp68
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp80
2 files changed, 90 insertions, 58 deletions
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp
index f5842181358..2ca55ee570b 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp
@@ -49,6 +49,11 @@ enum Misc
ACHIEV_MAKE_QUICK_WERK_OF_HIM_STARTING_EVENT = 10286
};
+enum HatefulThreatAmounts
+{
+ HATEFUL_THREAT_AMT = 1000,
+};
+
class boss_patchwerk : public CreatureScript
{
public:
@@ -92,8 +97,8 @@ public:
_EnterCombat();
Enraged = false;
Talk(SAY_AGGRO);
- events.ScheduleEvent(EVENT_HATEFUL, 1000);
- events.ScheduleEvent(EVENT_BERSERK, 360000);
+ events.ScheduleEvent(EVENT_HATEFUL, 1 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_BERSERK, 6 * MINUTE * IN_MILLISECONDS);
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_MAKE_QUICK_WERK_OF_HIM_STARTING_EVENT);
}
@@ -111,37 +116,68 @@ public:
{
case EVENT_HATEFUL:
{
- //Cast Hateful strike on the player with the highest
- //amount of HP within melee distance
- uint32 MostHP = 0;
- Unit* pMostHPTarget = NULL;
+ // 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
+ float MostThreat = 0.0f;
+ Unit* secondThreatTarget = NULL;
+ Unit* thirdThreatTarget = NULL;
+
std::list<HostileReference*>::const_iterator i = me->getThreatManager().getThreatList().begin();
for (; i != me->getThreatManager().getThreatList().end(); ++i)
- {
+ { // find second highest
Unit* target = (*i)->getTarget();
- if (target->IsAlive() && target != me->GetVictim() && target->GetHealth() > MostHP && me->IsWithinMeleeRange(target))
+ if (target->IsAlive() && target != me->GetVictim() && (*i)->getThreat() >= MostThreat && me->IsWithinMeleeRange(target))
+ {
+ MostThreat = (*i)->getThreat();
+ secondThreatTarget = target;
+ }
+ }
+
+ if (secondThreatTarget && Is25ManRaid())
+ { // find third highest
+ MostThreat = 0.0f;
+ i = me->getThreatManager().getThreatList().begin();
+ for (; i != me->getThreatManager().getThreatList().end(); ++i)
{
- MostHP = target->GetHealth();
- pMostHPTarget = target;
+ Unit* target = (*i)->getTarget();
+ if (target->IsAlive() && target != me->GetVictim() && target != secondThreatTarget && (*i)->getThreat() >= MostThreat && me->IsWithinMeleeRange(target))
+ {
+ MostThreat = (*i)->getThreat();
+ thirdThreatTarget = target;
+ }
}
}
- if (!pMostHPTarget)
- pMostHPTarget = me->GetVictim();
+ Unit* pHatefulTarget = NULL;
+ if (!thirdThreatTarget)
+ pHatefulTarget = secondThreatTarget;
+ else if (secondThreatTarget)
+ pHatefulTarget = (secondThreatTarget->GetHealth() < thirdThreatTarget->GetHealth()) ? thirdThreatTarget : secondThreatTarget;
+
+ if (!pHatefulTarget)
+ pHatefulTarget = me->GetVictim();
+
+ DoCast(pHatefulTarget, SPELL_HATEFUL_STRIKE, true);
- DoCast(pMostHPTarget, SPELL_HATEFUL_STRIKE, true);
+ // add threat to highest threat targets
+ if (me->GetVictim() && me->IsWithinMeleeRange(me->GetVictim()))
+ me->getThreatManager().addThreat(me->GetVictim(), HATEFUL_THREAT_AMT);
+ if (secondThreatTarget)
+ me->getThreatManager().addThreat(secondThreatTarget, HATEFUL_THREAT_AMT);
+ if (thirdThreatTarget)
+ me->getThreatManager().addThreat(thirdThreatTarget, HATEFUL_THREAT_AMT); // this will only ever be used in 25m
- events.ScheduleEvent(EVENT_HATEFUL, 1000);
+ events.ScheduleEvent(EVENT_HATEFUL, 1 * IN_MILLISECONDS);
break;
}
case EVENT_BERSERK:
DoCast(me, SPELL_BERSERK, true);
Talk(EMOTE_BERSERK);
- events.ScheduleEvent(EVENT_SLIME, 2000);
+ events.ScheduleEvent(EVENT_SLIME, 2 * IN_MILLISECONDS);
break;
case EVENT_SLIME:
DoCastVictim(SPELL_SLIME_BOLT, true);
- events.ScheduleEvent(EVENT_SLIME, 2000);
+ events.ScheduleEvent(EVENT_SLIME, 2 * IN_MILLISECONDS);
break;
}
}
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
index ee482c23d1b..02a7aa570e5 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
@@ -43,6 +43,7 @@ enum Spells
SPELL_BERSERK = 26662,
SPELL_DIES = 29357,
SPELL_CHILL = 28547,
+ SPELL_CHECK_RESISTS = 60539,
};
enum Phases
@@ -67,7 +68,8 @@ enum Events
EVENT_EXPLOSION,
EVENT_LAND,
EVENT_GROUND,
- EVENT_BIRTH
+ EVENT_BIRTH,
+ EVENT_CHECK_RESISTS
};
enum Misc
@@ -90,10 +92,9 @@ class boss_sapphiron : public CreatureScript
struct boss_sapphironAI : public BossAI
{
boss_sapphironAI(Creature* creature) :
- BossAI(creature, BOSS_SAPPHIRON), _map(me->GetMap())
+ BossAI(creature, BOSS_SAPPHIRON), _iceboltCount(0), _map(me->GetMap())
{
Initialize();
- _iceboltCount = 0;
}
void Initialize()
@@ -101,7 +102,6 @@ class boss_sapphiron : public CreatureScript
_phase = PHASE_NULL;
_canTheHundredClub = true;
- _checkFrostResistTimer = 5 * IN_MILLISECONDS;
}
void InitializeAI() override
@@ -123,7 +123,16 @@ class boss_sapphiron : public CreatureScript
_Reset();
if (_phase == PHASE_FLIGHT)
+ {
ClearIceBlock();
+ me->SetReactState(REACT_AGGRESSIVE);
+ if (me->IsHovering())
+ {
+ me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
+ me->SetHover(false);
+ }
+ me->SetDisableGravity(false);
+ }
Initialize();
}
@@ -134,22 +143,30 @@ class boss_sapphiron : public CreatureScript
me->CastSpell(me, SPELL_FROST_AURA, true);
+ DoCast(me, SPELL_CHECK_RESISTS);
+ events.ScheduleEvent(EVENT_CHECK_RESISTS, 30 * IN_MILLISECONDS);
events.ScheduleEvent(EVENT_BERSERK, 15 * MINUTE * IN_MILLISECONDS);
EnterPhaseGround();
-
- CheckPlayersFrostResist();
}
void SpellHitTarget(Unit* target, SpellInfo const* spell) override
{
- if (spell->Id == SPELL_ICEBOLT)
+ switch(spell->Id)
{
- IceBlockMap::iterator itr = _iceblocks.find(target->GetGUID());
- if (itr != _iceblocks.end() && !itr->second)
+ case SPELL_ICEBOLT:
{
- if (GameObject* iceblock = me->SummonGameObject(GO_ICEBLOCK, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, 0, 0, 0, 0, 25))
- itr->second = iceblock->GetGUID();
+ IceBlockMap::iterator itr = _iceblocks.find(target->GetGUID());
+ if (itr != _iceblocks.end() && !itr->second)
+ {
+ if (GameObject* iceblock = me->SummonGameObject(GO_ICEBLOCK, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, 0, 0, 0, 0, 25))
+ itr->second = iceblock->GetGUID();
+ }
+ break;
}
+ case SPELL_CHECK_RESISTS:
+ if (target && target->GetResistance(SPELL_SCHOOL_FROST) > MAX_FROST_RESISTANCE)
+ _canTheHundredClub = false;
+ break;
}
}
@@ -157,8 +174,6 @@ class boss_sapphiron : public CreatureScript
{
_JustDied();
me->CastSpell(me, SPELL_DIES, true);
-
- CheckPlayersFrostResist();
}
void MovementInform(uint32 /*type*/, uint32 id) override
@@ -176,22 +191,6 @@ class boss_sapphiron : public CreatureScript
}
}
- void CheckPlayersFrostResist()
- {
- if (_canTheHundredClub && _map && _map->IsRaid())
- {
- Map::PlayerList const &players = _map->GetPlayers();
- for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
- {
- if (itr->GetSource()->GetResistance(SPELL_SCHOOL_FROST) > MAX_FROST_RESISTANCE)
- {
- _canTheHundredClub = false;
- break;
- }
- }
- }
- }
-
void EnterPhaseGround()
{
_phase = PHASE_GROUND;
@@ -235,23 +234,16 @@ class boss_sapphiron : public CreatureScript
if ((_phase != PHASE_BIRTH && !UpdateVictim()) || !CheckInRoom())
return;
- if (_canTheHundredClub)
- {
- if (_checkFrostResistTimer <= diff)
- {
- CheckPlayersFrostResist();
- _checkFrostResistTimer = 5 * IN_MILLISECONDS;
- }
- else
- _checkFrostResistTimer -= diff;
- }
-
if (_phase == PHASE_GROUND)
{
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
+ case EVENT_CHECK_RESISTS:
+ DoCast(me, SPELL_CHECK_RESISTS);
+ events.ScheduleEvent(EVENT_CHECK_RESISTS, 30 * IN_MILLISECONDS);
+ return;
case EVENT_BERSERK:
Talk(EMOTE_ENRAGE);
DoCast(me, SPELL_BERSERK);
@@ -270,7 +262,6 @@ class boss_sapphiron : public CreatureScript
return;
case EVENT_BLIZZARD:
{
- //DoCastAOE(SPELL_SUMMON_BLIZZARD);
if (Creature* summon = DoSummon(NPC_BLIZZARD, me, 0.0f, urand(25, 30) * IN_MILLISECONDS, TEMPSUMMON_TIMED_DESPAWN))
summon->GetMotionMaster()->MoveRandom(40);
events.ScheduleEvent(EVENT_BLIZZARD, RAID_MODE(20, 7) * IN_MILLISECONDS, 0, PHASE_GROUND);
@@ -300,9 +291,14 @@ class boss_sapphiron : public CreatureScript
{
switch (eventId)
{
+ case EVENT_CHECK_RESISTS:
+ DoCast(me, SPELL_CHECK_RESISTS);
+ events.ScheduleEvent(EVENT_CHECK_RESISTS, 30 * IN_MILLISECONDS);
+ return;
case EVENT_LIFTOFF:
Talk(EMOTE_AIR_PHASE);
me->SetDisableGravity(true);
+ me->SetHover(true);
events.ScheduleEvent(EVENT_ICEBOLT, 1500);
_iceboltCount = RAID_MODE(2, 3);
return;
@@ -346,6 +342,7 @@ class boss_sapphiron : public CreatureScript
case EVENT_LAND:
me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
Talk(EMOTE_GROUND_PHASE);
+ me->SetHover(false);
me->SetDisableGravity(false);
events.ScheduleEvent(EVENT_GROUND, 1500);
return;
@@ -406,7 +403,6 @@ class boss_sapphiron : public CreatureScript
uint32 _iceboltCount;
IceBlockMap _iceblocks;
bool _canTheHundredClub;
- uint32 _checkFrostResistTimer;
Map* _map;
};