Scripts/Icecrown Citadel

* Increased damage done by Lord Marrowgar's Bone storm
* Fixed Decimate targeting for Stinky and Precious
* Fixed Plague Stench targeting for Stinky
* Added missing zombie summoning for Precious
* Fixed Eat Ooze spell targeting of Mutated Abominations
* Fixed Prince Keleseth summons spawning in walls
* Applied TrinityCore code standards
This commit is contained in:
Shauren
2011-05-06 22:10:22 +02:00
parent 3f7926e0d2
commit 3690ce35b7
13 changed files with 1081 additions and 1028 deletions
@@ -0,0 +1,3 @@
DELETE FROM `creature_text` WHERE `entry`=37217;
INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
(37217,0,0, '%s cries out with a loud, baying howl!',3,0,0,0,0,0, 'Precious - EMOTE_PRECIOUS_ZOMBIES');
+5 -2
View File
@@ -4011,7 +4011,7 @@ void SpellMgr::LoadSpellCustomAttr()
break; break;
case 69055: // Saber Lash (Lord Marrowgar) case 69055: // Saber Lash (Lord Marrowgar)
case 70814: // Saber Lash (Lord Marrowgar) case 70814: // Saber Lash (Lord Marrowgar)
spellInfo->EffectRadiusIndex[0] = 8; spellInfo->EffectRadiusIndex[0] = 8; // 5yd
++count; ++count;
break; break;
case 69075: // Bone Storm (Lord Marrowgar) case 69075: // Bone Storm (Lord Marrowgar)
@@ -4021,7 +4021,10 @@ void SpellMgr::LoadSpellCustomAttr()
case 72864: // Death Plague (Rotting Frost Giant) case 72864: // Death Plague (Rotting Frost Giant)
case 72378: // Blood Nova (Deathbringer Saurfang) case 72378: // Blood Nova (Deathbringer Saurfang)
case 73058: // Blood Nova (Deathbringer Saurfang) case 73058: // Blood Nova (Deathbringer Saurfang)
spellInfo->EffectRadiusIndex[0] = 12; case 71160: // Plague Stench (Stinky)
case 71161: // Plague Stench (Stinky)
case 71123: // Decimate (Stinky & Precious)
spellInfo->EffectRadiusIndex[0] = 12; // 100yd
++count; ++count;
break; break;
case 72385: // Boiling Blood (Deathbringer Saurfang) case 72385: // Boiling Blood (Deathbringer Saurfang)
@@ -19,6 +19,7 @@
#include "ScriptMgr.h" #include "ScriptMgr.h"
#include "ScriptedCreature.h" #include "ScriptedCreature.h"
#include "SpellAuraEffects.h" #include "SpellAuraEffects.h"
#include "VMapFactory.h"
#include "icecrown_citadel.h" #include "icecrown_citadel.h"
enum Texts enum Texts
@@ -155,20 +156,21 @@ enum Displays
class StandUpEvent : public BasicEvent class StandUpEvent : public BasicEvent
{ {
public: public:
StandUpEvent(Creature& owner) : BasicEvent(), m_owner(owner) { } StandUpEvent(Creature& owner) : BasicEvent(), _owner(owner) { }
bool Execute(uint64 /*eventTime*/, uint32 /*diff*/) bool Execute(uint64 /*eventTime*/, uint32 /*diff*/)
{ {
m_owner.HandleEmoteCommand(EMOTE_ONESHOT_ROAR); _owner.HandleEmoteCommand(EMOTE_ONESHOT_ROAR);
return true; return true;
} }
private: private:
Creature& m_owner; Creature& _owner;
}; };
static const Position introFinalPos = {4660.490f, 2769.200f, 430.0000f, 0.000000f}; Position const introFinalPos = {4660.490f, 2769.200f, 430.0000f, 0.000000f};
static const Position triggerPos = {4680.231f, 2769.134f, 379.9256f, 3.121708f}; Position const triggerPos = {4680.231f, 2769.134f, 379.9256f, 3.121708f};
static const Position triggerEndPos = {4680.180f, 2769.150f, 365.5000f, 3.121708f}; Position const triggerEndPos = {4680.180f, 2769.150f, 365.5000f, 3.121708f};
class boss_blood_council_controller : public CreatureScript class boss_blood_council_controller : public CreatureScript
{ {
@@ -185,8 +187,8 @@ class boss_blood_council_controller : public CreatureScript
{ {
events.Reset(); events.Reset();
me->SetReactState(REACT_PASSIVE); me->SetReactState(REACT_PASSIVE);
invocationStage = 0; _invocationStage = 0;
resetCounter = 0; _resetCounter = 0;
instance->SetBossState(DATA_BLOOD_PRINCE_COUNCIL, NOT_STARTED); instance->SetBossState(DATA_BLOOD_PRINCE_COUNCIL, NOT_STARTED);
} }
@@ -227,16 +229,16 @@ class boss_blood_council_controller : public CreatureScript
events.ScheduleEvent(EVENT_INVOCATION_OF_BLOOD, 46500); events.ScheduleEvent(EVENT_INVOCATION_OF_BLOOD, 46500);
invocationOrder[0] = InvocationData(instance->GetData64(DATA_PRINCE_VALANAR_GUID), SPELL_INVOCATION_OF_BLOOD_VALANAR, EMOTE_VALANAR_INVOCATION, 71070); _invocationOrder[0] = InvocationData(instance->GetData64(DATA_PRINCE_VALANAR_GUID), SPELL_INVOCATION_OF_BLOOD_VALANAR, EMOTE_VALANAR_INVOCATION, 71070);
if (urand(0, 1)) if (urand(0, 1))
{ {
invocationOrder[1] = InvocationData(instance->GetData64(DATA_PRINCE_TALDARAM_GUID), SPELL_INVOCATION_OF_BLOOD_TALDARAM, EMOTE_TALDARAM_INVOCATION, 71081); _invocationOrder[1] = InvocationData(instance->GetData64(DATA_PRINCE_TALDARAM_GUID), SPELL_INVOCATION_OF_BLOOD_TALDARAM, EMOTE_TALDARAM_INVOCATION, 71081);
invocationOrder[2] = InvocationData(instance->GetData64(DATA_PRINCE_KELESETH_GUID), SPELL_INVOCATION_OF_BLOOD_KELESETH, EMOTE_KELESETH_INVOCATION, 71080); _invocationOrder[2] = InvocationData(instance->GetData64(DATA_PRINCE_KELESETH_GUID), SPELL_INVOCATION_OF_BLOOD_KELESETH, EMOTE_KELESETH_INVOCATION, 71080);
} }
else else
{ {
invocationOrder[1] = InvocationData(instance->GetData64(DATA_PRINCE_KELESETH_GUID), SPELL_INVOCATION_OF_BLOOD_KELESETH, EMOTE_KELESETH_INVOCATION, 71080); _invocationOrder[1] = InvocationData(instance->GetData64(DATA_PRINCE_KELESETH_GUID), SPELL_INVOCATION_OF_BLOOD_KELESETH, EMOTE_KELESETH_INVOCATION, 71080);
invocationOrder[2] = InvocationData(instance->GetData64(DATA_PRINCE_TALDARAM_GUID), SPELL_INVOCATION_OF_BLOOD_TALDARAM, EMOTE_TALDARAM_INVOCATION, 71081); _invocationOrder[2] = InvocationData(instance->GetData64(DATA_PRINCE_TALDARAM_GUID), SPELL_INVOCATION_OF_BLOOD_TALDARAM, EMOTE_TALDARAM_INVOCATION, 71081);
} }
if (IsHeroic()) if (IsHeroic())
@@ -261,14 +263,14 @@ class boss_blood_council_controller : public CreatureScript
void SetData(uint32 /*type*/, uint32 data) void SetData(uint32 /*type*/, uint32 data)
{ {
resetCounter += uint8(data); _resetCounter += uint8(data);
if (resetCounter == 3) if (_resetCounter == 3)
EnterEvadeMode(); EnterEvadeMode();
} }
void JustReachedHome() void JustReachedHome()
{ {
resetCounter = 0; _resetCounter = 0;
if (Creature* keleseth = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_KELESETH_GUID))) if (Creature* keleseth = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_KELESETH_GUID)))
keleseth->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); keleseth->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
@@ -282,13 +284,13 @@ class boss_blood_council_controller : public CreatureScript
void JustDied(Unit* killer) void JustDied(Unit* killer)
{ {
_JustDied(); _JustDied();
// kill the other 2 princes too // kill all prices
for (uint8 i = 0; i < 3; ++i) for (uint8 i = 0; i < 3; ++i)
{ {
if (++invocationStage == 3) if (++_invocationStage == 3)
invocationStage = 0; _invocationStage = 0;
if (Creature* prince = ObjectAccessor::GetCreature(*me, invocationOrder[invocationStage].guid)) if (Creature* prince = ObjectAccessor::GetCreature(*me, _invocationOrder[_invocationStage].guid))
{ {
// make sure looting is allowed // make sure looting is allowed
if (me->IsDamageEnoughForLootingAndReward()) if (me->IsDamageEnoughForLootingAndReward())
@@ -296,10 +298,11 @@ class boss_blood_council_controller : public CreatureScript
killer->Kill(prince); killer->Kill(prince);
} }
} }
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_SHADOW_PRISON_DUMMY); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_SHADOW_PRISON_DUMMY);
} }
void UpdateAI(const uint32 diff) void UpdateAI(uint32 const diff)
{ {
if (!UpdateVictim()) if (!UpdateVictim())
return; return;
@@ -315,25 +318,25 @@ class boss_blood_council_controller : public CreatureScript
{ {
case EVENT_INVOCATION_OF_BLOOD: case EVENT_INVOCATION_OF_BLOOD:
{ {
Creature* oldPrince = ObjectAccessor::GetCreature(*me, invocationOrder[invocationStage].guid); Creature* oldPrince = ObjectAccessor::GetCreature(*me, _invocationOrder[_invocationStage].guid);
if (++invocationStage == 3) if (++_invocationStage == 3)
invocationStage = 0; _invocationStage = 0;
Creature* newPrince = ObjectAccessor::GetCreature(*me, invocationOrder[invocationStage].guid); Creature* newPrince = ObjectAccessor::GetCreature(*me, _invocationOrder[_invocationStage].guid);
if (oldPrince) if (oldPrince)
{ {
oldPrince->AI()->DoAction(ACTION_REMOVE_INVOCATION); oldPrince->AI()->DoAction(ACTION_REMOVE_INVOCATION);
if (newPrince) if (newPrince)
oldPrince->CastSpell(newPrince, invocationOrder[invocationStage].visualSpell, true); oldPrince->CastSpell(newPrince, _invocationOrder[_invocationStage].visualSpell, true);
} }
if (newPrince) if (newPrince)
{ {
newPrince->SetHealth(me->GetHealth()); newPrince->SetHealth(me->GetHealth());
newPrince->AI()->Talk(uint8(invocationOrder[invocationStage].textId)); newPrince->AI()->Talk(uint8(_invocationOrder[_invocationStage].textId));
} }
DoCast(me, invocationOrder[invocationStage].spellId); DoCast(me, _invocationOrder[_invocationStage].spellId);
events.ScheduleEvent(EVENT_INVOCATION_OF_BLOOD, 46500); events.ScheduleEvent(EVENT_INVOCATION_OF_BLOOD, 46500);
break; break;
} }
@@ -360,9 +363,10 @@ class boss_blood_council_controller : public CreatureScript
} }
InvocationData() : guid(0), spellId(0), textId(0), visualSpell(0) { } InvocationData() : guid(0), spellId(0), textId(0), visualSpell(0) { }
} invocationOrder[3]; } _invocationOrder[3];
uint32 invocationStage;
uint32 resetCounter; uint32 _invocationStage;
uint32 _resetCounter;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -380,15 +384,15 @@ class boss_prince_keleseth_icc : public CreatureScript
{ {
boss_prince_kelesethAI(Creature* creature) : BossAI(creature, DATA_BLOOD_PRINCE_COUNCIL) boss_prince_kelesethAI(Creature* creature) : BossAI(creature, DATA_BLOOD_PRINCE_COUNCIL)
{ {
isEmpowered = false; _isEmpowered = false;
spawnHealth = creature->GetMaxHealth(); _spawnHealth = creature->GetMaxHealth();
} }
void InitializeAI() void InitializeAI()
{ {
if (CreatureData const* data = sObjectMgr->GetCreatureData(me->GetDBTableGUIDLow())) if (CreatureData const* data = sObjectMgr->GetCreatureData(me->GetDBTableGUIDLow()))
if (data->curhealth) if (data->curhealth)
spawnHealth = data->curhealth; _spawnHealth = data->curhealth;
if (!me->isDead()) if (!me->isDead())
JustRespawned(); JustRespawned();
@@ -402,18 +406,14 @@ class boss_prince_keleseth_icc : public CreatureScript
summons.DespawnAll(); summons.DespawnAll();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
isEmpowered = false; _isEmpowered = false;
me->SetHealth(spawnHealth); me->SetHealth(_spawnHealth);
instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, uint32(true)); instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, uint32(true));
me->SetReactState(REACT_DEFENSIVE); me->SetReactState(REACT_DEFENSIVE);
if (IsHeroic()) if (IsHeroic())
DoCast(me, SPELL_SHADOW_PRISON); DoCast(me, SPELL_SHADOW_PRISON);
} }
void MoveInLineOfSight(Unit* /*who*/)
{
}
void EnterCombat(Unit* /*who*/) void EnterCombat(Unit* /*who*/)
{ {
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_PRINCES_CONTROL))) if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_PRINCES_CONTROL)))
@@ -433,8 +433,8 @@ class boss_prince_keleseth_icc : public CreatureScript
void JustReachedHome() void JustReachedHome()
{ {
instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, me); instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, me);
me->SetHealth(spawnHealth); me->SetHealth(_spawnHealth);
isEmpowered = false; _isEmpowered = false;
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_PRINCES_CONTROL))) if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_PRINCES_CONTROL)))
{ {
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
@@ -445,7 +445,7 @@ class boss_prince_keleseth_icc : public CreatureScript
void JustRespawned() void JustRespawned()
{ {
DoCast(me, SPELL_FEIGN_DEATH); DoCast(me, SPELL_FEIGN_DEATH);
me->SetHealth(spawnHealth); me->SetHealth(_spawnHealth);
} }
void SpellHit(Unit* /*caster*/, SpellEntry const* spell) void SpellHit(Unit* /*caster*/, SpellEntry const* spell)
@@ -457,13 +457,18 @@ class boss_prince_keleseth_icc : public CreatureScript
void JustSummoned(Creature* summon) void JustSummoned(Creature* summon)
{ {
summons.Summon(summon); summons.Summon(summon);
// prevent spawning outside of room
if (summon->GetExactDist2d(&roomCenter) > 50.0f)
{
Position pos; Position pos;
pos.Relocate(roomCenter); pos.Relocate(RoomCenter);
summon->MovePosition(pos, float(rand_norm()) * 50.0f, summon->GetAngle(&roomCenter)); float maxRange = 50.0f;
summon->MovePosition(pos, float(rand_norm()) * maxRange, summon->GetAngle(&RoomCenter));
// prevent spawning outside of room
while (!VMAP::VMapFactory::createOrGetVMapManager()->isInLineOfSight(me->GetMapId(), me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ()))
{
maxRange -= 5.0f;
summon->MovePosition(pos, float(rand_norm()) * maxRange, summon->GetAngle(&RoomCenter));
} }
summon->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation());
} }
void DamageDealt(Unit* /*target*/, uint32& damage, DamageEffectType damageType) void DamageDealt(Unit* /*target*/, uint32& damage, DamageEffectType damageType)
@@ -477,7 +482,7 @@ class boss_prince_keleseth_icc : public CreatureScript
void DamageTaken(Unit* attacker, uint32& damage) void DamageTaken(Unit* attacker, uint32& damage)
{ {
if (!isEmpowered) if (!_isEmpowered)
{ {
me->AddThreat(attacker, float(damage)); me->AddThreat(attacker, float(damage));
damage = 0; damage = 0;
@@ -490,7 +495,7 @@ class boss_prince_keleseth_icc : public CreatureScript
Talk(SAY_KELESETH_KILL); Talk(SAY_KELESETH_KILL);
} }
void DoAction(const int32 action) void DoAction(int32 const action)
{ {
switch (action) switch (action)
{ {
@@ -505,20 +510,20 @@ class boss_prince_keleseth_icc : public CreatureScript
case ACTION_CAST_INVOCATION: case ACTION_CAST_INVOCATION:
Talk(SAY_KELESETH_INVOCATION); Talk(SAY_KELESETH_INVOCATION);
DoCast(me, SPELL_INVOCATION_VISUAL_ACTIVE, true); DoCast(me, SPELL_INVOCATION_VISUAL_ACTIVE, true);
isEmpowered = true; _isEmpowered = true;
break; break;
case ACTION_REMOVE_INVOCATION: case ACTION_REMOVE_INVOCATION:
me->SetHealth(spawnHealth); me->SetHealth(_spawnHealth);
me->RemoveAurasDueToSpell(SPELL_INVOCATION_VISUAL_ACTIVE); me->RemoveAurasDueToSpell(SPELL_INVOCATION_VISUAL_ACTIVE);
me->RemoveAurasDueToSpell(SPELL_INVOCATION_OF_BLOOD_KELESETH); me->RemoveAurasDueToSpell(SPELL_INVOCATION_OF_BLOOD_KELESETH);
isEmpowered = false; _isEmpowered = false;
break; break;
default: default:
break; break;
} }
} }
void UpdateAI(const uint32 diff) void UpdateAI(uint32 const diff)
{ {
if (!UpdateVictim() || !CheckInRoom()) if (!UpdateVictim() || !CheckInRoom())
return; return;
@@ -542,7 +547,7 @@ class boss_prince_keleseth_icc : public CreatureScript
events.ScheduleEvent(EVENT_SHADOW_RESONANCE, urand(10000, 15000)); events.ScheduleEvent(EVENT_SHADOW_RESONANCE, urand(10000, 15000));
break; break;
case EVENT_SHADOW_LANCE: case EVENT_SHADOW_LANCE:
if (isEmpowered) if (_isEmpowered)
DoCastVictim(SPELL_EMPOWERED_SHADOW_LANCE); DoCastVictim(SPELL_EMPOWERED_SHADOW_LANCE);
else else
DoCastVictim(SPELL_SHADOW_LANCE); DoCastVictim(SPELL_SHADOW_LANCE);
@@ -556,10 +561,11 @@ class boss_prince_keleseth_icc : public CreatureScript
// does not melee // does not melee
} }
static Position const RoomCenter;
private: private:
static const Position roomCenter; uint32 _spawnHealth;
uint32 spawnHealth; bool _isEmpowered;
bool isEmpowered; // bool check faster than map lookup
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -568,7 +574,7 @@ class boss_prince_keleseth_icc : public CreatureScript
} }
}; };
const Position boss_prince_keleseth_icc::boss_prince_kelesethAI::roomCenter = {4658.0f, 2769.26f, 361.2f, 0.0f}; const Position boss_prince_keleseth_icc::boss_prince_kelesethAI::RoomCenter = {4658.0f, 2769.26f, 361.2f, 0.0f};
class boss_prince_taldaram_icc : public CreatureScript class boss_prince_taldaram_icc : public CreatureScript
{ {
@@ -579,15 +585,15 @@ class boss_prince_taldaram_icc : public CreatureScript
{ {
boss_prince_taldaramAI(Creature* creature) : BossAI(creature, DATA_BLOOD_PRINCE_COUNCIL) boss_prince_taldaramAI(Creature* creature) : BossAI(creature, DATA_BLOOD_PRINCE_COUNCIL)
{ {
isEmpowered = false; _isEmpowered = false;
spawnHealth = creature->GetMaxHealth(); _spawnHealth = creature->GetMaxHealth();
} }
void InitializeAI() void InitializeAI()
{ {
if (CreatureData const* data = sObjectMgr->GetCreatureData(me->GetDBTableGUIDLow())) if (CreatureData const* data = sObjectMgr->GetCreatureData(me->GetDBTableGUIDLow()))
if (data->curhealth) if (data->curhealth)
spawnHealth = data->curhealth; _spawnHealth = data->curhealth;
if (!me->isDead()) if (!me->isDead())
JustRespawned(); JustRespawned();
@@ -601,8 +607,8 @@ class boss_prince_taldaram_icc : public CreatureScript
summons.DespawnAll(); summons.DespawnAll();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
isEmpowered = false; _isEmpowered = false;
me->SetHealth(spawnHealth); me->SetHealth(_spawnHealth);
instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, uint32(true)); instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, uint32(true));
me->SetReactState(REACT_DEFENSIVE); me->SetReactState(REACT_DEFENSIVE);
if (IsHeroic()) if (IsHeroic())
@@ -632,8 +638,8 @@ class boss_prince_taldaram_icc : public CreatureScript
void JustReachedHome() void JustReachedHome()
{ {
instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, me); instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, me);
me->SetHealth(spawnHealth); me->SetHealth(_spawnHealth);
isEmpowered = false; _isEmpowered = false;
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_PRINCES_CONTROL))) if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_PRINCES_CONTROL)))
{ {
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
@@ -644,7 +650,7 @@ class boss_prince_taldaram_icc : public CreatureScript
void JustRespawned() void JustRespawned()
{ {
DoCast(me, SPELL_FEIGN_DEATH); DoCast(me, SPELL_FEIGN_DEATH);
me->SetHealth(spawnHealth); me->SetHealth(_spawnHealth);
} }
void SpellHit(Unit* /*caster*/, SpellEntry const* spell) void SpellHit(Unit* /*caster*/, SpellEntry const* spell)
@@ -678,7 +684,7 @@ class boss_prince_taldaram_icc : public CreatureScript
void DamageTaken(Unit* attacker, uint32& damage) void DamageTaken(Unit* attacker, uint32& damage)
{ {
if (!isEmpowered) if (!_isEmpowered)
{ {
me->AddThreat(attacker, float(damage)); me->AddThreat(attacker, float(damage));
damage = 0; damage = 0;
@@ -691,7 +697,7 @@ class boss_prince_taldaram_icc : public CreatureScript
Talk(SAY_TALDARAM_KILL); Talk(SAY_TALDARAM_KILL);
} }
void DoAction(const int32 action) void DoAction(int32 const action)
{ {
switch (action) switch (action)
{ {
@@ -706,20 +712,20 @@ class boss_prince_taldaram_icc : public CreatureScript
case ACTION_CAST_INVOCATION: case ACTION_CAST_INVOCATION:
Talk(SAY_TALDARAM_INVOCATION); Talk(SAY_TALDARAM_INVOCATION);
DoCast(me, SPELL_INVOCATION_VISUAL_ACTIVE, true); DoCast(me, SPELL_INVOCATION_VISUAL_ACTIVE, true);
isEmpowered = true; _isEmpowered = true;
break; break;
case ACTION_REMOVE_INVOCATION: case ACTION_REMOVE_INVOCATION:
me->SetHealth(spawnHealth); me->SetHealth(_spawnHealth);
me->RemoveAurasDueToSpell(SPELL_INVOCATION_VISUAL_ACTIVE); me->RemoveAurasDueToSpell(SPELL_INVOCATION_VISUAL_ACTIVE);
me->RemoveAurasDueToSpell(SPELL_INVOCATION_OF_BLOOD_TALDARAM); me->RemoveAurasDueToSpell(SPELL_INVOCATION_OF_BLOOD_TALDARAM);
isEmpowered = false; _isEmpowered = false;
break; break;
default: default:
break; break;
} }
} }
void UpdateAI(const uint32 diff) void UpdateAI(uint32 const diff)
{ {
if (!UpdateVictim() || !CheckInRoom()) if (!UpdateVictim() || !CheckInRoom())
return; return;
@@ -742,7 +748,7 @@ class boss_prince_taldaram_icc : public CreatureScript
events.ScheduleEvent(EVENT_GLITTERING_SPARKS, urand(15000, 50000)); events.ScheduleEvent(EVENT_GLITTERING_SPARKS, urand(15000, 50000));
break; break;
case EVENT_CONJURE_FLAME: case EVENT_CONJURE_FLAME:
if (isEmpowered) if (_isEmpowered)
{ {
DoCast(me, SPELL_CONJURE_EMPOWERED_FLAME); DoCast(me, SPELL_CONJURE_EMPOWERED_FLAME);
events.ScheduleEvent(EVENT_CONJURE_FLAME, urand(15000, 25000)); events.ScheduleEvent(EVENT_CONJURE_FLAME, urand(15000, 25000));
@@ -763,8 +769,8 @@ class boss_prince_taldaram_icc : public CreatureScript
} }
private: private:
uint32 spawnHealth; uint32 _spawnHealth;
bool isEmpowered; // bool check faster than map lookup bool _isEmpowered;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -782,15 +788,15 @@ class boss_prince_valanar_icc : public CreatureScript
{ {
boss_prince_valanarAI(Creature* creature) : BossAI(creature, DATA_BLOOD_PRINCE_COUNCIL) boss_prince_valanarAI(Creature* creature) : BossAI(creature, DATA_BLOOD_PRINCE_COUNCIL)
{ {
isEmpowered = false; _isEmpowered = false;
spawnHealth = creature->GetMaxHealth(); _spawnHealth = creature->GetMaxHealth();
} }
void InitializeAI() void InitializeAI()
{ {
if (CreatureData const* data = sObjectMgr->GetCreatureData(me->GetDBTableGUIDLow())) if (CreatureData const* data = sObjectMgr->GetCreatureData(me->GetDBTableGUIDLow()))
if (data->curhealth) if (data->curhealth)
spawnHealth = data->curhealth; _spawnHealth = data->curhealth;
if (!me->isDead()) if (!me->isDead())
JustRespawned(); JustRespawned();
@@ -804,7 +810,7 @@ class boss_prince_valanar_icc : public CreatureScript
summons.DespawnAll(); summons.DespawnAll();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
isEmpowered = false; _isEmpowered = false;
me->SetHealth(me->GetMaxHealth()); me->SetHealth(me->GetMaxHealth());
instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, uint32(true)); instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, uint32(true));
me->SetReactState(REACT_DEFENSIVE); me->SetReactState(REACT_DEFENSIVE);
@@ -836,7 +842,7 @@ class boss_prince_valanar_icc : public CreatureScript
{ {
instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, me); instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, me);
me->SetHealth(me->GetMaxHealth()); me->SetHealth(me->GetMaxHealth());
isEmpowered = false; _isEmpowered = false;
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_PRINCES_CONTROL))) if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_PRINCES_CONTROL)))
{ {
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
@@ -847,7 +853,7 @@ class boss_prince_valanar_icc : public CreatureScript
void JustRespawned() void JustRespawned()
{ {
DoCast(me, SPELL_FEIGN_DEATH); DoCast(me, SPELL_FEIGN_DEATH);
me->SetHealth(spawnHealth); me->SetHealth(_spawnHealth);
} }
void JustSummoned(Creature* summon) void JustSummoned(Creature* summon)
@@ -895,7 +901,7 @@ class boss_prince_valanar_icc : public CreatureScript
void DamageTaken(Unit* attacker, uint32& damage) void DamageTaken(Unit* attacker, uint32& damage)
{ {
if (!isEmpowered) if (!_isEmpowered)
{ {
me->AddThreat(attacker, float(damage)); me->AddThreat(attacker, float(damage));
damage = 0; damage = 0;
@@ -908,7 +914,7 @@ class boss_prince_valanar_icc : public CreatureScript
Talk(SAY_VALANAR_KILL); Talk(SAY_VALANAR_KILL);
} }
void DoAction(const int32 action) void DoAction(int32 const action)
{ {
switch (action) switch (action)
{ {
@@ -923,20 +929,20 @@ class boss_prince_valanar_icc : public CreatureScript
case ACTION_CAST_INVOCATION: case ACTION_CAST_INVOCATION:
Talk(SAY_VALANAR_INVOCATION); Talk(SAY_VALANAR_INVOCATION);
DoCast(me, SPELL_INVOCATION_VISUAL_ACTIVE, true); DoCast(me, SPELL_INVOCATION_VISUAL_ACTIVE, true);
isEmpowered = true; _isEmpowered = true;
break; break;
case ACTION_REMOVE_INVOCATION: case ACTION_REMOVE_INVOCATION:
me->SetHealth(spawnHealth); me->SetHealth(_spawnHealth);
me->RemoveAurasDueToSpell(SPELL_INVOCATION_VISUAL_ACTIVE); me->RemoveAurasDueToSpell(SPELL_INVOCATION_VISUAL_ACTIVE);
me->RemoveAurasDueToSpell(SPELL_INVOCATION_OF_BLOOD_VALANAR); me->RemoveAurasDueToSpell(SPELL_INVOCATION_OF_BLOOD_VALANAR);
isEmpowered = false; _isEmpowered = false;
break; break;
default: default:
break; break;
} }
} }
void UpdateAI(const uint32 diff) void UpdateAI(uint32 const diff)
{ {
if (!UpdateVictim() || !CheckInRoom()) if (!UpdateVictim() || !CheckInRoom())
return; return;
@@ -963,7 +969,7 @@ class boss_prince_valanar_icc : public CreatureScript
events.ScheduleEvent(EVENT_KINETIC_BOMB, urand(18000, 24000)); events.ScheduleEvent(EVENT_KINETIC_BOMB, urand(18000, 24000));
break; break;
case EVENT_SHOCK_VORTEX: case EVENT_SHOCK_VORTEX:
if (isEmpowered) if (_isEmpowered)
{ {
DoCast(me, SPELL_EMPOWERED_SHOCK_VORTEX); DoCast(me, SPELL_EMPOWERED_SHOCK_VORTEX);
Talk(EMOTE_VALANAR_SHOCK_VORTEX); Talk(EMOTE_VALANAR_SHOCK_VORTEX);
@@ -985,8 +991,8 @@ class boss_prince_valanar_icc : public CreatureScript
} }
private: private:
uint32 spawnHealth; uint32 _spawnHealth;
bool isEmpowered; // bool check faster than map lookup bool _isEmpowered;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -1004,18 +1010,18 @@ class npc_blood_queen_lana_thel : public CreatureScript
{ {
npc_blood_queen_lana_thelAI(Creature* creature) : ScriptedAI(creature) npc_blood_queen_lana_thelAI(Creature* creature) : ScriptedAI(creature)
{ {
introDone = false; _introDone = false;
instance = creature->GetInstanceScript(); _instance = creature->GetInstanceScript();
} }
void Reset() void Reset()
{ {
events.Reset(); _events.Reset();
me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
if (instance->GetBossState(DATA_BLOOD_PRINCE_COUNCIL) == DONE) if (_instance->GetBossState(DATA_BLOOD_PRINCE_COUNCIL) == DONE)
{ {
me->SetVisible(false); me->SetVisible(false);
introDone = true; _introDone = true;
} }
else else
me->SetVisible(true); me->SetVisible(true);
@@ -1023,16 +1029,16 @@ class npc_blood_queen_lana_thel : public CreatureScript
void MoveInLineOfSight(Unit* who) void MoveInLineOfSight(Unit* who)
{ {
if (introDone) if (_introDone)
return; return;
if (!me->IsWithinDistInMap(who, 35.0f)) if (!me->IsWithinDistInMap(who, 35.0f))
return; return;
introDone = true; _introDone = true;
Talk(SAY_INTRO_1); Talk(SAY_INTRO_1);
events.SetPhase(1); _events.SetPhase(1);
events.ScheduleEvent(EVENT_INTRO_1, 14000); _events.ScheduleEvent(EVENT_INTRO_1, 14000);
// summon a visual trigger // summon a visual trigger
if (Creature* summon = DoSummon(NPC_FLOATING_TRIGGER, triggerPos, 15000, TEMPSUMMON_TIMED_DESPAWN)) if (Creature* summon = DoSummon(NPC_FLOATING_TRIGGER, triggerPos, 15000, TEMPSUMMON_TIMED_DESPAWN))
{ {
@@ -1048,27 +1054,27 @@ class npc_blood_queen_lana_thel : public CreatureScript
me->SetVisible(false); me->SetVisible(false);
} }
void UpdateAI(const uint32 diff) void UpdateAI(uint32 const diff)
{ {
if (!events.GetPhaseMask()) if (!_events.GetPhaseMask())
return; return;
events.Update(diff); _events.Update(diff);
if (events.ExecuteEvent() == EVENT_INTRO_1) if (_events.ExecuteEvent() == EVENT_INTRO_1)
{ {
Talk(SAY_INTRO_2); Talk(SAY_INTRO_2);
me->GetMotionMaster()->MovePoint(POINT_INTRO_DESPAWN, introFinalPos); me->GetMotionMaster()->MovePoint(POINT_INTRO_DESPAWN, introFinalPos);
events.Reset(); _events.Reset();
// remove Feign Death from princes // remove Feign Death from princes
if (Creature* keleseth = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_KELESETH_GUID))) if (Creature* keleseth = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_PRINCE_KELESETH_GUID)))
keleseth->AI()->DoAction(ACTION_STAND_UP); keleseth->AI()->DoAction(ACTION_STAND_UP);
if (Creature* taldaram = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_TALDARAM_GUID))) if (Creature* taldaram = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_PRINCE_TALDARAM_GUID)))
taldaram->AI()->DoAction(ACTION_STAND_UP); taldaram->AI()->DoAction(ACTION_STAND_UP);
if (Creature* valanar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PRINCE_VALANAR_GUID))) if (Creature* valanar = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_PRINCE_VALANAR_GUID)))
{ {
valanar->AI()->DoAction(ACTION_STAND_UP); valanar->AI()->DoAction(ACTION_STAND_UP);
valanar->SetHealth(valanar->GetMaxHealth()); valanar->SetHealth(valanar->GetMaxHealth());
@@ -1077,9 +1083,9 @@ class npc_blood_queen_lana_thel : public CreatureScript
} }
private: private:
EventMap events; EventMap _events;
InstanceScript* instance; InstanceScript* _instance;
bool introDone; bool _introDone;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -1095,9 +1101,9 @@ class npc_ball_of_flame : public CreatureScript
struct npc_ball_of_flameAI : public ScriptedAI struct npc_ball_of_flameAI : public ScriptedAI
{ {
npc_ball_of_flameAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) npc_ball_of_flameAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
{ {
despawnTimer = 0; _despawnTimer = 0;
} }
void Reset() void Reset()
@@ -1112,24 +1118,24 @@ class npc_ball_of_flame : public CreatureScript
void MovementInform(uint32 type, uint32 id) void MovementInform(uint32 type, uint32 id)
{ {
if (type == TARGETED_MOTION_TYPE && id == GUID_LOPART(chaseGUID) && chaseGUID) if (type == TARGETED_MOTION_TYPE && id == GUID_LOPART(_chaseGUID) && _chaseGUID)
{ {
me->RemoveAurasDueToSpell(SPELL_BALL_OF_FLAMES_PERIODIC); me->RemoveAurasDueToSpell(SPELL_BALL_OF_FLAMES_PERIODIC);
DoCast(me, SPELL_FLAMES); DoCast(me, SPELL_FLAMES);
despawnTimer = 1000; _despawnTimer = 1000;
chaseGUID = 0; _chaseGUID = 0;
} }
} }
void SetGUID(const uint64& guid, int32 /*type*/) void SetGUID(uint64 const& guid, int32 /*type*/)
{ {
chaseGUID = guid; _chaseGUID = guid;
} }
void DoAction(const int32 action) void DoAction(int32 const action)
{ {
if (action == ACTION_FLAME_BALL_CHASE) if (action == ACTION_FLAME_BALL_CHASE)
if (Player* target = ObjectAccessor::GetPlayer(*me, chaseGUID)) if (Player* target = ObjectAccessor::GetPlayer(*me, _chaseGUID))
{ {
// need to clear states now because this call is before AuraEffect is fully removed // need to clear states now because this call is before AuraEffect is fully removed
me->ClearUnitState(UNIT_STAT_CASTING | UNIT_STAT_STUNNED); me->ClearUnitState(UNIT_STAT_CASTING | UNIT_STAT_STUNNED);
@@ -1144,27 +1150,27 @@ class npc_ball_of_flame : public CreatureScript
return; return;
if (damage > RAID_MODE<uint32>(23000, 25000, 23000, 25000)) if (damage > RAID_MODE<uint32>(23000, 25000, 23000, 25000))
instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, uint32(false)); _instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, uint32(false));
} }
void UpdateAI(const uint32 diff) void UpdateAI(uint32 const diff)
{ {
if (!despawnTimer) if (!_despawnTimer)
return; return;
if (despawnTimer <= diff) if (_despawnTimer <= diff)
{ {
despawnTimer = 0; _despawnTimer = 0;
DoCast(me, SPELL_FLAME_SPHERE_DEATH_EFFECT); DoCast(me, SPELL_FLAME_SPHERE_DEATH_EFFECT);
} }
else else
despawnTimer -= diff; _despawnTimer -= diff;
} }
private: private:
uint64 chaseGUID; uint64 _chaseGUID;
InstanceScript* instance; InstanceScript* _instance;
uint32 despawnTimer; uint32 _despawnTimer;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -1184,33 +1190,33 @@ class npc_kinetic_bomb : public CreatureScript
void Reset() void Reset()
{ {
events.Reset(); _events.Reset();
me->SetDisplayId(DISPLAY_KINETIC_BOMB); me->SetDisplayId(DISPLAY_KINETIC_BOMB);
me->CastSpell(me, SPELL_UNSTABLE, true); me->CastSpell(me, SPELL_UNSTABLE, true);
me->CastSpell(me, SPELL_KINETIC_BOMB_VISUAL, true); me->CastSpell(me, SPELL_KINETIC_BOMB_VISUAL, true);
me->SetReactState(REACT_PASSIVE); me->SetReactState(REACT_PASSIVE);
me->SetSpeed(MOVE_FLIGHT, IsHeroic() ? 0.3f : 0.15f, true); me->SetSpeed(MOVE_FLIGHT, IsHeroic() ? 0.3f : 0.15f, true);
me->GetPosition(x, y, groundZ); me->GetPosition(_x, _y, _groundZ);
groundZ = me->GetMap()->GetHeight(x, y, groundZ, true, 500.0f); _groundZ = me->GetMap()->GetHeight(_x, _y, _groundZ, true, 500.0f);
} }
void DoAction(const int32 action) void DoAction(int32 const action)
{ {
if (action == SPELL_KINETIC_BOMB_EXPLOSION) if (action == SPELL_KINETIC_BOMB_EXPLOSION)
events.ScheduleEvent(EVENT_BOMB_DESPAWN, 1000); _events.ScheduleEvent(EVENT_BOMB_DESPAWN, 1000);
else if (action == ACTION_KINETIC_BOMB_JUMP) else if (action == ACTION_KINETIC_BOMB_JUMP)
{ {
me->GetMotionMaster()->Clear(); me->GetMotionMaster()->Clear();
me->GetMotionMaster()->MoveJump(x, y, me->GetPositionZ() + 7.0f, 1.0f, 7.0f); me->GetMotionMaster()->MoveJump(_x, _y, me->GetPositionZ() + 7.0f, 1.0f, 7.0f);
events.ScheduleEvent(EVENT_CONTINUE_FALLING, 700); _events.ScheduleEvent(EVENT_CONTINUE_FALLING, 700);
} }
} }
void UpdateAI(const uint32 diff) void UpdateAI(uint32 const diff)
{ {
events.Update(diff); _events.Update(diff);
while (uint32 eventId = events.ExecuteEvent()) while (uint32 eventId = _events.ExecuteEvent())
{ {
switch (eventId) switch (eventId)
{ {
@@ -1219,7 +1225,7 @@ class npc_kinetic_bomb : public CreatureScript
break; break;
case EVENT_CONTINUE_FALLING: case EVENT_CONTINUE_FALLING:
me->GetMotionMaster()->Clear(); me->GetMotionMaster()->Clear();
me->GetMotionMaster()->MovePoint(POINT_KINETIC_BOMB_IMPACT, x, y, groundZ); me->GetMotionMaster()->MovePoint(POINT_KINETIC_BOMB_IMPACT, _x, _y, _groundZ);
break; break;
default: default:
break; break;
@@ -1228,10 +1234,10 @@ class npc_kinetic_bomb : public CreatureScript
} }
private: private:
EventMap events; EventMap _events;
float x; float _x;
float y; float _y;
float groundZ; float _groundZ;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -1249,8 +1255,8 @@ class npc_dark_nucleus : public CreatureScript
{ {
npc_dark_nucleusAI(Creature* creature) : ScriptedAI(creature) npc_dark_nucleusAI(Creature* creature) : ScriptedAI(creature)
{ {
lockedTarget = false; _lockedTarget = false;
targetAuraCheck = 0; _targetAuraCheck = 0;
} }
void Reset() void Reset()
@@ -1261,7 +1267,7 @@ class npc_dark_nucleus : public CreatureScript
void EnterCombat(Unit* who) void EnterCombat(Unit* who)
{ {
targetAuraCheck = 1000; _targetAuraCheck = 1000;
if (me->GetDistance(who) >= 15.0f) if (me->GetDistance(who) >= 15.0f)
{ {
DoStartMovement(who); DoStartMovement(who);
@@ -1285,9 +1291,9 @@ class npc_dark_nucleus : public CreatureScript
if (attacker == me) if (attacker == me)
return; return;
if (!lockedTarget) if (!_lockedTarget)
if (me->getVictim() == attacker) if (me->getVictim() == attacker)
lockedTarget = true; _lockedTarget = true;
} }
void UpdateAI(const uint32 diff) void UpdateAI(const uint32 diff)
@@ -1295,9 +1301,9 @@ class npc_dark_nucleus : public CreatureScript
if (!me->isInCombat()) if (!me->isInCombat())
return; return;
if (targetAuraCheck <= diff) if (_targetAuraCheck <= diff)
{ {
targetAuraCheck = 1000; _targetAuraCheck = 1000;
if (Unit* victim = me->getVictim()) if (Unit* victim = me->getVictim())
if (me->GetDistance(victim) < 15.0f && if (me->GetDistance(victim) < 15.0f &&
!victim->HasAura(SPELL_SHADOW_RESONANCE_RESIST, me->GetGUID())) !victim->HasAura(SPELL_SHADOW_RESONANCE_RESIST, me->GetGUID()))
@@ -1307,19 +1313,19 @@ class npc_dark_nucleus : public CreatureScript
} }
} }
else else
targetAuraCheck -= diff; _targetAuraCheck -= diff;
if (!lockedTarget) if (!_lockedTarget)
{ {
if (Unit* victim = me->SelectVictim()) if (Unit* victim = me->SelectVictim())
{ {
if (me->getVictim() && me->getVictim() != victim) if (me->getVictim() && me->getVictim() != victim)
{ {
me->getVictim()->RemoveAurasDueToSpell(SPELL_SHADOW_RESONANCE_RESIST, me->GetGUID()); me->getVictim()->RemoveAurasDueToSpell(SPELL_SHADOW_RESONANCE_RESIST, me->GetGUID());
lockedTarget = true; _lockedTarget = true;
} }
lockedTarget = true; _lockedTarget = true;
AttackStart(victim); AttackStart(victim);
DoCast(victim, SPELL_SHADOW_RESONANCE_RESIST); DoCast(victim, SPELL_SHADOW_RESONANCE_RESIST);
me->ClearUnitState(UNIT_STAT_CASTING); me->ClearUnitState(UNIT_STAT_CASTING);
@@ -1328,8 +1334,8 @@ class npc_dark_nucleus : public CreatureScript
} }
private: private:
uint32 targetAuraCheck; // no point for EventMap with only one timer uint32 _targetAuraCheck;
bool lockedTarget; bool _lockedTarget;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -71,7 +71,7 @@ enum Shadowmourne
SPELL_THIRST_QUENCHED = 72154, SPELL_THIRST_QUENCHED = 72154,
}; };
static const uint32 vampireAuras[3][MAX_DIFFICULTY] = uint32 const vampireAuras[3][MAX_DIFFICULTY] =
{ {
{70867, 71473, 71532, 71533}, {70867, 71473, 71532, 71533},
{70879, 71525, 71530, 71531}, {70879, 71525, 71530, 71531},
@@ -109,9 +109,9 @@ enum Points
POINT_MINCHAR = 4, POINT_MINCHAR = 4,
}; };
static const Position centerPos = {4595.7090f, 2769.4190f, 400.6368f, 0.000000f}; Position const centerPos = {4595.7090f, 2769.4190f, 400.6368f, 0.000000f};
static const Position airPos = {4595.7090f, 2769.4190f, 422.3893f, 0.000000f}; Position const airPos = {4595.7090f, 2769.4190f, 422.3893f, 0.000000f};
static const Position mincharPos = {4629.3711f, 2782.6089f, 424.6390f, 0.000000f}; Position const mincharPos = {4629.3711f, 2782.6089f, 424.6390f, 0.000000f};
bool IsVampire(Unit const* unit) bool IsVampire(Unit const* unit)
{ {
@@ -144,9 +144,9 @@ class boss_blood_queen_lana_thel : public CreatureScript
events.ScheduleEvent(EVENT_TWILIGHT_BLOODBOLT, urand(20000, 25000), EVENT_GROUP_NORMAL); events.ScheduleEvent(EVENT_TWILIGHT_BLOODBOLT, urand(20000, 25000), EVENT_GROUP_NORMAL);
events.ScheduleEvent(EVENT_AIR_PHASE, 124000 + uint32(Is25ManRaid() ? 3000 : 0)); events.ScheduleEvent(EVENT_AIR_PHASE, 124000 + uint32(Is25ManRaid() ? 3000 : 0));
me->SetSpeed(MOVE_FLIGHT, 0.642857f, true); me->SetSpeed(MOVE_FLIGHT, 0.642857f, true);
offtank = NULL; _offtank = NULL;
vampires.clear(); _vampires.clear();
creditBloodQuickening = false; _creditBloodQuickening = false;
} }
void EnterCombat(Unit* who) void EnterCombat(Unit* who)
@@ -165,7 +165,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
DoCast(me, SPELL_SHROUD_OF_SORROW, true); DoCast(me, SPELL_SHROUD_OF_SORROW, true);
DoCast(me, SPELL_FRENZIED_BLOODTHIRST_VISUAL, true); DoCast(me, SPELL_FRENZIED_BLOODTHIRST_VISUAL, true);
creditBloodQuickening = instance->GetData(DATA_BLOOD_QUICKENING_STATE) == IN_PROGRESS; _creditBloodQuickening = instance->GetData(DATA_BLOOD_QUICKENING_STATE) == IN_PROGRESS;
} }
void JustDied(Unit* killer) void JustDied(Unit* killer)
@@ -182,7 +182,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_DELIRIOUS_SLASH); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_DELIRIOUS_SLASH);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PACT_OF_THE_DARKFALLEN); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PACT_OF_THE_DARKFALLEN);
// Blah, credit the quest // Blah, credit the quest
if (creditBloodQuickening) if (_creditBloodQuickening)
{ {
instance->SetData(DATA_BLOOD_QUICKENING_STATE, DONE); instance->SetData(DATA_BLOOD_QUICKENING_STATE, DONE);
if (Player* plr = killer->ToPlayer()) if (Player* plr = killer->ToPlayer())
@@ -199,13 +199,13 @@ class boss_blood_queen_lana_thel : public CreatureScript
} }
} }
void DoAction(const int32 action) void DoAction(int32 const action)
{ {
if (action != ACTION_KILL_MINCHAR) if (action != ACTION_KILL_MINCHAR)
return; return;
if (instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == IN_PROGRESS) if (instance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == IN_PROGRESS)
killMinchar = true; _killMinchar = true;
else else
{ {
me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
@@ -219,7 +219,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
void EnterEvadeMode() void EnterEvadeMode()
{ {
_EnterEvadeMode(); _EnterEvadeMode();
if (killMinchar) if (_killMinchar)
{ {
me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, 0x01); me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, 0x01);
@@ -250,10 +250,10 @@ class boss_blood_queen_lana_thel : public CreatureScript
Talk(SAY_KILL); Talk(SAY_KILL);
} }
void SetGUID(const uint64& guid, int32 type = 0) void SetGUID(uint64 const& guid, int32 type = 0)
{ {
if (type == GUID_VAMPIRE) if (type == GUID_VAMPIRE)
vampires.insert(guid); _vampires.insert(guid);
} }
void MovementInform(uint32 type, uint32 id) void MovementInform(uint32 type, uint32 id)
@@ -295,7 +295,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
} }
} }
void UpdateAI(const uint32 diff) void UpdateAI(uint32 const diff)
{ {
if (!UpdateVictim() || !CheckInRoom()) if (!UpdateVictim() || !CheckInRoom())
return; return;
@@ -319,7 +319,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
{ {
DoCast(target, SPELL_VAMPIRIC_BITE); DoCast(target, SPELL_VAMPIRIC_BITE);
Talk(SAY_VAMPIRIC_BITE); Talk(SAY_VAMPIRIC_BITE);
vampires.insert(target->GetGUID()); _vampires.insert(target->GetGUID());
} }
break; break;
case EVENT_BLOOD_MIRROR: case EVENT_BLOOD_MIRROR:
@@ -328,17 +328,17 @@ class boss_blood_queen_lana_thel : public CreatureScript
if (me->getVictim()) if (me->getVictim())
{ {
Player* newOfftank = SelectRandomTarget(true); Player* newOfftank = SelectRandomTarget(true);
if (offtank != newOfftank) if (_offtank != newOfftank)
{ {
offtank = newOfftank; _offtank = newOfftank;
if (offtank) if (_offtank)
{ {
offtank->CastSpell(me->getVictim(), SPELL_BLOOD_MIRROR_DAMAGE, true); _offtank->CastSpell(me->getVictim(), SPELL_BLOOD_MIRROR_DAMAGE, true);
me->getVictim()->CastSpell(offtank, SPELL_BLOOD_MIRROR_DUMMY, true); me->getVictim()->CastSpell(_offtank, SPELL_BLOOD_MIRROR_DUMMY, true);
DoCastVictim(SPELL_BLOOD_MIRROR_VISUAL); DoCastVictim(SPELL_BLOOD_MIRROR_VISUAL);
if (Item* shadowsEdge = offtank->GetWeaponForAttack(BASE_ATTACK, true)) if (Item* shadowsEdge = _offtank->GetWeaponForAttack(BASE_ATTACK, true))
if (!offtank->HasAura(SPELL_THIRST_QUENCHED) && shadowsEdge->GetEntry() == ITEM_SHADOW_S_EDGE && !offtank->HasAura(SPELL_GUSHING_WOUND)) if (!_offtank->HasAura(SPELL_THIRST_QUENCHED) && shadowsEdge->GetEntry() == ITEM_SHADOW_S_EDGE && !_offtank->HasAura(SPELL_GUSHING_WOUND))
offtank->CastSpell(offtank, SPELL_GUSHING_WOUND, true); _offtank->CastSpell(_offtank, SPELL_GUSHING_WOUND, true);
} }
} }
@@ -347,8 +347,8 @@ class boss_blood_queen_lana_thel : public CreatureScript
break; break;
} }
case EVENT_DELIRIOUS_SLASH: case EVENT_DELIRIOUS_SLASH:
if (offtank && !me->HasByteFlag(UNIT_FIELD_BYTES_1, 3, 0x03)) if (_offtank && !me->HasByteFlag(UNIT_FIELD_BYTES_1, 3, 0x03))
DoCast(offtank, SPELL_DELIRIOUS_SLASH); DoCast(_offtank, SPELL_DELIRIOUS_SLASH);
events.ScheduleEvent(EVENT_DELIRIOUS_SLASH, urand(20000, 24000), EVENT_GROUP_NORMAL); events.ScheduleEvent(EVENT_DELIRIOUS_SLASH, urand(20000, 24000), EVENT_GROUP_NORMAL);
break; break;
case EVENT_PACT_OF_THE_DARKFALLEN: case EVENT_PACT_OF_THE_DARKFALLEN:
@@ -418,14 +418,14 @@ class boss_blood_queen_lana_thel : public CreatureScript
bool WasVampire(uint64 guid) bool WasVampire(uint64 guid)
{ {
return vampires.count(guid) != 0; return _vampires.count(guid) != 0;
} }
private: private:
// offtank for this encounter is the player standing closest to main tank // offtank for this encounter is the player standing closest to main tank
Player* SelectRandomTarget(bool includeOfftank, std::list<Player*>* targetList = NULL) Player* SelectRandomTarget(bool includeOfftank, std::list<Player*>* targetList = NULL)
{ {
const std::list<HostileReference*> &threatlist = me->getThreatManager().getThreatList(); std::list<HostileReference*> const& threatlist = me->getThreatManager().getThreatList();
std::list<Player*> tempTargets; std::list<Player*> tempTargets;
if (threatlist.empty()) if (threatlist.empty())
@@ -433,7 +433,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
for (std::list<HostileReference*>::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr) for (std::list<HostileReference*>::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr)
if (Unit* refTarget = (*itr)->getTarget()) if (Unit* refTarget = (*itr)->getTarget())
if (refTarget != me->getVictim() && refTarget->GetTypeId() == TYPEID_PLAYER && (includeOfftank ? true : (refTarget != offtank))) if (refTarget != me->getVictim() && refTarget->GetTypeId() == TYPEID_PLAYER && (includeOfftank ? true : (refTarget != _offtank)))
tempTargets.push_back(refTarget->ToPlayer()); tempTargets.push_back(refTarget->ToPlayer());
if (tempTargets.empty()) if (tempTargets.empty())
@@ -456,10 +456,10 @@ class boss_blood_queen_lana_thel : public CreatureScript
return *itr; return *itr;
} }
Player* offtank; std::set<uint64> _vampires;
std::set<uint64> vampires; Player* _offtank;
bool creditBloodQuickening; bool _creditBloodQuickening;
bool killMinchar; bool _killMinchar;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -116,7 +116,7 @@ enum Spells
// Helper to get id of the aura on different modes (HasAura(baseId) wont work) // Helper to get id of the aura on different modes (HasAura(baseId) wont work)
#define BOILING_BLOOD_HELPER RAID_MODE<int32>(72385, 72441, 72442, 72443) #define BOILING_BLOOD_HELPER RAID_MODE<int32>(72385, 72441, 72442, 72443)
enum Events enum EventTypes
{ {
EVENT_INTRO_ALLIANCE_1 = 1, EVENT_INTRO_ALLIANCE_1 = 1,
EVENT_INTRO_ALLIANCE_2 = 2, EVENT_INTRO_ALLIANCE_2 = 2,
@@ -209,10 +209,10 @@ enum MovePoints
POINT_EXIT = 5, // waypoint id POINT_EXIT = 5, // waypoint id
}; };
static const Position deathbringerPos = {-496.3542f, 2211.33f, 541.1138f, 0.0f}; Position const deathbringerPos = {-496.3542f, 2211.33f, 541.1138f, 0.0f};
static const Position firstStepPos = {-541.3177f, 2211.365f, 539.2921f, 0.0f}; Position const firstStepPos = {-541.3177f, 2211.365f, 539.2921f, 0.0f};
static const Position chargePos[6] = Position const chargePos[6] =
{ {
{-509.6505f, 2211.377f, 539.2872f, 0.0f}, // High Overlord Saurfang/Muradin Bronzebeard {-509.6505f, 2211.377f, 539.2872f, 0.0f}, // High Overlord Saurfang/Muradin Bronzebeard
{-508.7480f, 2211.897f, 539.2870f, 0.0f}, // front left {-508.7480f, 2211.897f, 539.2870f, 0.0f}, // front left
@@ -222,7 +222,7 @@ static const Position chargePos[6] =
{-509.0040f, 2211.743f, 539.2870f, 0.0f} // back right {-509.0040f, 2211.743f, 539.2870f, 0.0f} // back right
}; };
static const Position chokePos[6] = Position const chokePos[6] =
{ {
{-514.4834f, 2211.334f, 549.2887f, 0.0f}, // High Overlord Saurfang/Muradin Bronzebeard {-514.4834f, 2211.334f, 549.2887f, 0.0f}, // High Overlord Saurfang/Muradin Bronzebeard
{-510.1081f, 2211.592f, 546.3773f, 0.0f}, // front left {-510.1081f, 2211.592f, 546.3773f, 0.0f}, // front left
@@ -232,7 +232,7 @@ static const Position chokePos[6] =
{-510.7041f, 2211.069f, 546.5298f, 0.0f} // back right {-510.7041f, 2211.069f, 546.5298f, 0.0f} // back right
}; };
static const Position finalPos = {-563.7552f, 2211.328f, 538.7848f, 0.0f}; Position const finalPos = {-563.7552f, 2211.328f, 538.7848f, 0.0f};
class boss_deathbringer_saurfang : public CreatureScript class boss_deathbringer_saurfang : public CreatureScript
{ {
@@ -244,8 +244,8 @@ class boss_deathbringer_saurfang : public CreatureScript
boss_deathbringer_saurfangAI(Creature* creature) : BossAI(creature, DATA_DEATHBRINGER_SAURFANG) boss_deathbringer_saurfangAI(Creature* creature) : BossAI(creature, DATA_DEATHBRINGER_SAURFANG)
{ {
ASSERT(creature->GetVehicleKit()); // we dont actually use it, just check if exists ASSERT(creature->GetVehicleKit()); // we dont actually use it, just check if exists
introDone = false; _introDone = false;
fallenChampionCount = 0; _fallenChampionCastCount = 0;
} }
void Reset() void Reset()
@@ -253,7 +253,7 @@ class boss_deathbringer_saurfang : public CreatureScript
_Reset(); _Reset();
me->SetReactState(REACT_DEFENSIVE); me->SetReactState(REACT_DEFENSIVE);
events.SetPhase(PHASE_COMBAT); events.SetPhase(PHASE_COMBAT);
frenzy = false; _frenzied = false;
me->SetPower(POWER_ENERGY, 0); me->SetPower(POWER_ENERGY, 0);
DoCast(me, SPELL_ZERO_POWER, true); DoCast(me, SPELL_ZERO_POWER, true);
DoCast(me, SPELL_BLOOD_LINK, true); DoCast(me, SPELL_BLOOD_LINK, true);
@@ -280,13 +280,14 @@ class boss_deathbringer_saurfang : public CreatureScript
events.Reset(); events.Reset();
events.SetPhase(PHASE_COMBAT); events.SetPhase(PHASE_COMBAT);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
if (!introDone) if (!_introDone)
{ {
DoCast(me, SPELL_GRIP_OF_AGONY); DoCast(me, SPELL_GRIP_OF_AGONY);
if (Creature* creature = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SAURFANG_EVENT_NPC))) if (Creature* creature = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SAURFANG_EVENT_NPC)))
creature->AI()->DoAction(ACTION_INTERRUPT_INTRO); creature->AI()->DoAction(ACTION_INTERRUPT_INTRO);
} }
introDone = true;
_introDone = true;
Talk(SAY_AGGRO); Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_SUMMON_BLOOD_BEAST, 30000, 0, PHASE_COMBAT); events.ScheduleEvent(EVENT_SUMMON_BLOOD_BEAST, 30000, 0, PHASE_COMBAT);
@@ -295,7 +296,7 @@ class boss_deathbringer_saurfang : public CreatureScript
events.ScheduleEvent(EVENT_BLOOD_NOVA, 17000, 0, PHASE_COMBAT); events.ScheduleEvent(EVENT_BLOOD_NOVA, 17000, 0, PHASE_COMBAT);
events.ScheduleEvent(EVENT_RUNE_OF_BLOOD, 20000, 0, PHASE_COMBAT); events.ScheduleEvent(EVENT_RUNE_OF_BLOOD, 20000, 0, PHASE_COMBAT);
fallenChampionCount = 0; _fallenChampionCastCount = 0;
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MARK_OF_THE_FALLEN_CHAMPION); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MARK_OF_THE_FALLEN_CHAMPION);
instance->SetBossState(DATA_DEATHBRINGER_SAURFANG, IN_PROGRESS); instance->SetBossState(DATA_DEATHBRINGER_SAURFANG, IN_PROGRESS);
} }
@@ -303,7 +304,7 @@ class boss_deathbringer_saurfang : public CreatureScript
void JustDied(Unit* /*killer*/) void JustDied(Unit* /*killer*/)
{ {
_JustDied(); _JustDied();
DoCastAOE(SPELL_ACHIEVEMENT, true); DoCast(me, SPELL_ACHIEVEMENT, true);
Talk(SAY_DEATH); Talk(SAY_DEATH);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MARK_OF_THE_FALLEN_CHAMPION); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MARK_OF_THE_FALLEN_CHAMPION);
@@ -322,7 +323,7 @@ class boss_deathbringer_saurfang : public CreatureScript
void EnterEvadeMode() void EnterEvadeMode()
{ {
ScriptedAI::EnterEvadeMode(); ScriptedAI::EnterEvadeMode();
if (introDone) if (_introDone)
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
} }
@@ -341,9 +342,9 @@ class boss_deathbringer_saurfang : public CreatureScript
void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/)
{ {
if (!frenzy && HealthBelowPct(31)) // AT 30%, not below if (!_frenzied && HealthBelowPct(31)) // AT 30%, not below
{ {
frenzy = true; _frenzied = true;
DoCast(me, SPELL_FRENZY); DoCast(me, SPELL_FRENZY);
Talk(SAY_FRENZY); Talk(SAY_FRENZY);
} }
@@ -360,6 +361,7 @@ class boss_deathbringer_saurfang : public CreatureScript
summon->AI()->DoCast(summon, SPELL_BLOOD_LINK_BEAST, true); summon->AI()->DoCast(summon, SPELL_BLOOD_LINK_BEAST, true);
summon->AI()->DoCast(summon, SPELL_RESISTANT_SKIN, true); summon->AI()->DoCast(summon, SPELL_RESISTANT_SKIN, true);
summons.Summon(summon); summons.Summon(summon);
DoZoneInCombat(summon);
} }
void SummonedCreatureDespawn(Creature* summon) void SummonedCreatureDespawn(Creature* summon)
@@ -394,7 +396,7 @@ class boss_deathbringer_saurfang : public CreatureScript
} }
} }
void UpdateAI(const uint32 diff) void UpdateAI(uint32 const diff)
{ {
if (!UpdateVictim() && !(events.GetPhaseMask() & PHASE_INTRO_MASK)) if (!UpdateVictim() && !(events.GetPhaseMask() & PHASE_INTRO_MASK))
return; return;
@@ -431,7 +433,7 @@ class boss_deathbringer_saurfang : public CreatureScript
break; break;
case EVENT_INTRO_FINISH: case EVENT_INTRO_FINISH:
events.SetPhase(PHASE_COMBAT); events.SetPhase(PHASE_COMBAT);
introDone = true; _introDone = true;
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
break; break;
case EVENT_SUMMON_BLOOD_BEAST: case EVENT_SUMMON_BLOOD_BEAST:
@@ -478,19 +480,20 @@ class boss_deathbringer_saurfang : public CreatureScript
uint32 GetData(uint32 type) uint32 GetData(uint32 type)
{ {
if (type == DATA_MADE_A_MESS) if (type == DATA_MADE_A_MESS)
if (fallenChampionCount < RAID_MODE<uint32>(3, 5, 3, 5)) if (_fallenChampionCastCount < RAID_MODE<uint32>(3, 5, 3, 5))
return 1; return 1;
return 0; return 0;
} }
// intro setup // intro setup
void DoAction(const int32 action) void DoAction(int32 const action)
{ {
switch (action) switch (action)
{ {
case PHASE_INTRO_A: case PHASE_INTRO_A:
case PHASE_INTRO_H: case PHASE_INTRO_H:
{
if (GameObject* teleporter = GameObject::GetGameObject(*me, instance->GetData64(GO_SCOURGE_TRANSPORTER_SAURFANG))) if (GameObject* teleporter = GameObject::GetGameObject(*me, instance->GetData64(GO_SCOURGE_TRANSPORTER_SAURFANG)))
{ {
instance->HandleGameObject(0, false, teleporter); instance->HandleGameObject(0, false, teleporter);
@@ -509,9 +512,12 @@ class boss_deathbringer_saurfang : public CreatureScript
events.ScheduleEvent(EVENT_INTRO_HORDE_2, 5000, 0, PHASE_INTRO_H); events.ScheduleEvent(EVENT_INTRO_HORDE_2, 5000, 0, PHASE_INTRO_H);
break; break;
}
case ACTION_CONTINUE_INTRO: case ACTION_CONTINUE_INTRO:
if (introDone) {
if (_introDone)
return; return;
events.ScheduleEvent(EVENT_INTRO_ALLIANCE_6, 6500+500, 0, PHASE_INTRO_A); events.ScheduleEvent(EVENT_INTRO_ALLIANCE_6, 6500+500, 0, PHASE_INTRO_A);
events.ScheduleEvent(EVENT_INTRO_FINISH, 8000, 0, PHASE_INTRO_A); events.ScheduleEvent(EVENT_INTRO_FINISH, 8000, 0, PHASE_INTRO_A);
@@ -519,25 +525,28 @@ class boss_deathbringer_saurfang : public CreatureScript
events.ScheduleEvent(EVENT_INTRO_HORDE_9, 46700+1000+500, 0, PHASE_INTRO_H); events.ScheduleEvent(EVENT_INTRO_HORDE_9, 46700+1000+500, 0, PHASE_INTRO_H);
events.ScheduleEvent(EVENT_INTRO_FINISH, 46700+1000+8000, 0, PHASE_INTRO_H); events.ScheduleEvent(EVENT_INTRO_FINISH, 46700+1000+8000, 0, PHASE_INTRO_H);
break; break;
}
case ACTION_MARK_OF_THE_FALLEN_CHAMPION: case ACTION_MARK_OF_THE_FALLEN_CHAMPION:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_MARK_OF_THE_FALLEN_CHAMPION))
{ {
++fallenChampionCount; if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -SPELL_MARK_OF_THE_FALLEN_CHAMPION))
{
++_fallenChampionCastCount;
DoCast(target, SPELL_MARK_OF_THE_FALLEN_CHAMPION); DoCast(target, SPELL_MARK_OF_THE_FALLEN_CHAMPION);
me->SetPower(POWER_ENERGY, 0); me->SetPower(POWER_ENERGY, 0);
if (Aura* bloodPower = me->GetAura(SPELL_BLOOD_POWER)) if (Aura* bloodPower = me->GetAura(SPELL_BLOOD_POWER))
bloodPower->RecalculateAmountOfEffects(); bloodPower->RecalculateAmountOfEffects();
} }
break; break;
}
default: default:
break; break;
} }
} }
private: private:
uint32 fallenChampionCount; uint32 _fallenChampionCastCount;
bool introDone; bool _introDone;
bool frenzy; // faster than iterating all auras to find Frenzy bool _frenzied; // faster than iterating all auras to find Frenzy
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -553,40 +562,39 @@ class npc_high_overlord_saurfang_icc : public CreatureScript
struct npc_high_overlord_saurfangAI : public ScriptedAI struct npc_high_overlord_saurfangAI : public ScriptedAI
{ {
npc_high_overlord_saurfangAI(Creature* creature) : ScriptedAI(creature), vehicle(creature->GetVehicleKit()) npc_high_overlord_saurfangAI(Creature* creature) : ScriptedAI(creature)
{ {
ASSERT(vehicle); ASSERT(creature->GetVehicleKit());
instance = me->GetInstanceScript(); _instance = me->GetInstanceScript();
} }
void Reset() void Reset()
{ {
events.Reset(); _events.Reset();
} }
void DoAction(const int32 action) void DoAction(int32 const action)
{ {
switch (action) switch (action)
{ {
case ACTION_START_EVENT: case ACTION_START_EVENT:
{ {
// Prevent crashes // Prevent crashes
if (events.GetPhaseMask() & PHASE_INTRO_MASK) if (_events.GetPhaseMask() & PHASE_INTRO_MASK)
return; return;
GetCreatureListWithEntryInGrid(guardList, me, NPC_SE_KOR_KRON_REAVER, 20.0f); GetCreatureListWithEntryInGrid(_guardList, me, NPC_SE_KOR_KRON_REAVER, 20.0f);
guardList.sort(Trinity::ObjectDistanceOrderPred(me)); _guardList.sort(Trinity::ObjectDistanceOrderPred(me));
uint32 x = 1; uint32 x = 1;
for (std::list<Creature*>::iterator itr = guardList.begin(); itr != guardList.end(); ++x, ++itr) for (std::list<Creature*>::iterator itr = _guardList.begin(); itr != _guardList.end(); ++x, ++itr)
(*itr)->AI()->SetData(0, x); (*itr)->AI()->SetData(0, x);
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
Talk(SAY_INTRO_HORDE_1); Talk(SAY_INTRO_HORDE_1);
events.SetPhase(PHASE_INTRO_H); _events.SetPhase(PHASE_INTRO_H);
events.ScheduleEvent(EVENT_INTRO_HORDE_3, 18500, 0, PHASE_INTRO_H); _events.ScheduleEvent(EVENT_INTRO_HORDE_3, 18500, 0, PHASE_INTRO_H);
deathbringerSaurfangGUID = instance->GetData64(DATA_DEATHBRINGER_SAURFANG); _instance->HandleGameObject(_instance->GetData64(GO_SAURFANG_S_DOOR), true);
instance->HandleGameObject(instance->GetData64(GO_SAURFANG_S_DOOR), true); if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG)))
if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, deathbringerSaurfangGUID))
deathbringer->AI()->DoAction(PHASE_INTRO_H); deathbringer->AI()->DoAction(PHASE_INTRO_H);
break; break;
} }
@@ -594,23 +602,25 @@ class npc_high_overlord_saurfang_icc : public CreatureScript
{ {
me->RemoveAurasDueToSpell(SPELL_GRIP_OF_AGONY); me->RemoveAurasDueToSpell(SPELL_GRIP_OF_AGONY);
Talk(SAY_OUTRO_HORDE_1); Talk(SAY_OUTRO_HORDE_1);
events.ScheduleEvent(EVENT_OUTRO_HORDE_2, 10000); // say _events.ScheduleEvent(EVENT_OUTRO_HORDE_2, 10000); // say
events.ScheduleEvent(EVENT_OUTRO_HORDE_3, 18000); // say _events.ScheduleEvent(EVENT_OUTRO_HORDE_3, 18000); // say
events.ScheduleEvent(EVENT_OUTRO_HORDE_4, 24000); // cast _events.ScheduleEvent(EVENT_OUTRO_HORDE_4, 24000); // cast
events.ScheduleEvent(EVENT_OUTRO_HORDE_5, 30000); // move _events.ScheduleEvent(EVENT_OUTRO_HORDE_5, 30000); // move
me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
me->SendMovementFlagUpdate(); me->SendMovementFlagUpdate();
me->Relocate(me->GetPositionX(), me->GetPositionY(), 539.2917f); me->Relocate(me->GetPositionX(), me->GetPositionY(), 539.2917f);
me->SendMonsterMove(me->GetPositionX(), me->GetPositionY(), 539.2917f, SPLINEFLAG_FALLING, 0, 0.0f); me->SendMonsterMove(me->GetPositionX(), me->GetPositionY(), 539.2917f, SPLINEFLAG_FALLING, 0, 0.0f);
for (std::list<Creature*>::iterator itr = guardList.begin(); itr != guardList.end(); ++itr) for (std::list<Creature*>::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr)
(*itr)->AI()->DoAction(ACTION_DESPAWN); (*itr)->AI()->DoAction(ACTION_DESPAWN);
break; break;
} }
case ACTION_INTERRUPT_INTRO: case ACTION_INTERRUPT_INTRO:
events.Reset(); {
for (std::list<Creature*>::iterator itr = guardList.begin(); itr != guardList.end(); ++itr) _events.Reset();
for (std::list<Creature*>::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr)
(*itr)->AI()->DoAction(ACTION_DESPAWN); (*itr)->AI()->DoAction(ACTION_DESPAWN);
break; break;
}
default: default:
break; break;
} }
@@ -634,25 +644,25 @@ class npc_high_overlord_saurfang_icc : public CreatureScript
case POINT_FIRST_STEP: case POINT_FIRST_STEP:
me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
Talk(SAY_INTRO_HORDE_3); Talk(SAY_INTRO_HORDE_3);
events.ScheduleEvent(EVENT_INTRO_HORDE_5, 15500, 0, PHASE_INTRO_H); _events.ScheduleEvent(EVENT_INTRO_HORDE_5, 15500, 0, PHASE_INTRO_H);
events.ScheduleEvent(EVENT_INTRO_HORDE_6, 29500, 0, PHASE_INTRO_H); _events.ScheduleEvent(EVENT_INTRO_HORDE_6, 29500, 0, PHASE_INTRO_H);
events.ScheduleEvent(EVENT_INTRO_HORDE_7, 43800, 0, PHASE_INTRO_H); _events.ScheduleEvent(EVENT_INTRO_HORDE_7, 43800, 0, PHASE_INTRO_H);
events.ScheduleEvent(EVENT_INTRO_HORDE_8, 47000, 0, PHASE_INTRO_H); _events.ScheduleEvent(EVENT_INTRO_HORDE_8, 47000, 0, PHASE_INTRO_H);
if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, deathbringerSaurfangGUID)) if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG)))
deathbringer->AI()->DoAction(ACTION_CONTINUE_INTRO); deathbringer->AI()->DoAction(ACTION_CONTINUE_INTRO);
break; break;
case POINT_CORPSE: case POINT_CORPSE:
if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, deathbringerSaurfangGUID)) if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG)))
{ {
deathbringer->CastSpell(me, SPELL_RIDE_VEHICLE, true); // for the packet logs. deathbringer->CastSpell(me, SPELL_RIDE_VEHICLE, true); // for the packet logs.
deathbringer->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); deathbringer->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
deathbringer->setDeathState(ALIVE); deathbringer->setDeathState(ALIVE);
} }
events.ScheduleEvent(EVENT_OUTRO_HORDE_5, 1000); // move _events.ScheduleEvent(EVENT_OUTRO_HORDE_5, 1000); // move
events.ScheduleEvent(EVENT_OUTRO_HORDE_6, 4000); // say _events.ScheduleEvent(EVENT_OUTRO_HORDE_6, 4000); // say
break; break;
case POINT_FINAL: case POINT_FINAL:
if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, deathbringerSaurfangGUID)) if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG)))
deathbringer->DespawnOrUnsummon(); deathbringer->DespawnOrUnsummon();
me->DespawnOrUnsummon(); me->DespawnOrUnsummon();
break; break;
@@ -670,10 +680,10 @@ class npc_high_overlord_saurfang_icc : public CreatureScript
} }
} }
void UpdateAI(const uint32 diff) void UpdateAI(uint32 const diff)
{ {
events.Update(diff); _events.Update(diff);
while (uint32 eventId = events.ExecuteEvent()) while (uint32 eventId = _events.ExecuteEvent())
{ {
switch (eventId) switch (eventId)
{ {
@@ -692,12 +702,12 @@ class npc_high_overlord_saurfang_icc : public CreatureScript
break; break;
case EVENT_INTRO_HORDE_8: case EVENT_INTRO_HORDE_8:
Talk(SAY_INTRO_HORDE_8); Talk(SAY_INTRO_HORDE_8);
for (std::list<Creature*>::iterator itr = guardList.begin(); itr != guardList.end(); ++itr) for (std::list<Creature*>::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr)
(*itr)->AI()->DoAction(ACTION_CHARGE); (*itr)->AI()->DoAction(ACTION_CHARGE);
me->GetMotionMaster()->MoveCharge(chargePos[0].GetPositionX(), chargePos[0].GetPositionY(), chargePos[0].GetPositionZ(), 8.5f, POINT_CHARGE); me->GetMotionMaster()->MoveCharge(chargePos[0].GetPositionX(), chargePos[0].GetPositionY(), chargePos[0].GetPositionZ(), 8.5f, POINT_CHARGE);
break; break;
case EVENT_OUTRO_HORDE_2: // say case EVENT_OUTRO_HORDE_2: // say
if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, deathbringerSaurfangGUID)) if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG)))
me->SetFacingToObject(deathbringer); me->SetFacingToObject(deathbringer);
Talk(SAY_OUTRO_HORDE_2); Talk(SAY_OUTRO_HORDE_2);
break; break;
@@ -705,7 +715,7 @@ class npc_high_overlord_saurfang_icc : public CreatureScript
Talk(SAY_OUTRO_HORDE_3); Talk(SAY_OUTRO_HORDE_3);
break; break;
case EVENT_OUTRO_HORDE_4: // move case EVENT_OUTRO_HORDE_4: // move
if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, deathbringerSaurfangGUID)) if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG)))
{ {
float x, y, z; float x, y, z;
deathbringer->GetClosePoint(x, y, z, deathbringer->GetObjectSize()); deathbringer->GetClosePoint(x, y, z, deathbringer->GetObjectSize());
@@ -724,18 +734,13 @@ class npc_high_overlord_saurfang_icc : public CreatureScript
} }
private: private:
EventMap events; EventMap _events;
InstanceScript* instance; InstanceScript* _instance;
Vehicle* vehicle; std::list<Creature*> _guardList;
uint64 deathbringerSaurfangGUID;
std::list<Creature*> guardList;
}; };
bool OnGossipHello(Player* player, Creature* creature) bool OnGossipHello(Player* player, Creature* creature)
{ {
if (creature->GetPositionZ() < 530.0f)
return false;
InstanceScript* instance = creature->GetInstanceScript(); InstanceScript* instance = creature->GetInstanceScript();
if (instance && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE) if (instance && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE)
{ {
@@ -771,37 +776,36 @@ class npc_muradin_bronzebeard_icc : public CreatureScript
{ {
npc_muradin_bronzebeard_iccAI(Creature* creature) : ScriptedAI(creature) npc_muradin_bronzebeard_iccAI(Creature* creature) : ScriptedAI(creature)
{ {
instance = me->GetInstanceScript(); _instance = me->GetInstanceScript();
} }
void Reset() void Reset()
{ {
events.Reset(); _events.Reset();
} }
void DoAction(const int32 action) void DoAction(int32 const action)
{ {
switch (action) switch (action)
{ {
case ACTION_START_EVENT: case ACTION_START_EVENT:
{ {
// Prevent crashes // Prevent crashes
if (events.GetPhaseMask() & PHASE_INTRO_MASK) if (_events.GetPhaseMask() & PHASE_INTRO_MASK)
return; return;
events.SetPhase(PHASE_INTRO_A); _events.SetPhase(PHASE_INTRO_A);
GetCreatureListWithEntryInGrid(guardList, me, NPC_SE_SKYBREAKER_MARINE, 20.0f); GetCreatureListWithEntryInGrid(_guardList, me, NPC_SE_SKYBREAKER_MARINE, 20.0f);
guardList.sort(Trinity::ObjectDistanceOrderPred(me)); _guardList.sort(Trinity::ObjectDistanceOrderPred(me));
uint32 x = 1; uint32 x = 1;
for (std::list<Creature*>::iterator itr = guardList.begin(); itr != guardList.end(); ++x, ++itr) for (std::list<Creature*>::iterator itr = _guardList.begin(); itr != _guardList.end(); ++x, ++itr)
(*itr)->AI()->SetData(0, x); (*itr)->AI()->SetData(0, x);
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
Talk(SAY_INTRO_ALLIANCE_1); Talk(SAY_INTRO_ALLIANCE_1);
events.ScheduleEvent(EVENT_INTRO_ALLIANCE_4, 2500+17500+9500, 0, PHASE_INTRO_A); _events.ScheduleEvent(EVENT_INTRO_ALLIANCE_4, 2500+17500+9500, 0, PHASE_INTRO_A);
deathbringerSaurfangGUID = instance->GetData64(DATA_DEATHBRINGER_SAURFANG); _instance->HandleGameObject(_instance->GetData64(GO_SAURFANG_S_DOOR), true);
instance->HandleGameObject(instance->GetData64(GO_SAURFANG_S_DOOR), true); if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG)))
if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, deathbringerSaurfangGUID))
deathbringer->AI()->DoAction(PHASE_INTRO_A); deathbringer->AI()->DoAction(PHASE_INTRO_A);
break; break;
} }
@@ -813,13 +817,13 @@ class npc_muradin_bronzebeard_icc : public CreatureScript
me->SendMovementFlagUpdate(); me->SendMovementFlagUpdate();
me->Relocate(me->GetPositionX(), me->GetPositionY(), 539.2917f); me->Relocate(me->GetPositionX(), me->GetPositionY(), 539.2917f);
me->SendMonsterMove(me->GetPositionX(), me->GetPositionY(), 539.2917f, SPLINEFLAG_FALLING, 0, 0.0f); me->SendMonsterMove(me->GetPositionX(), me->GetPositionY(), 539.2917f, SPLINEFLAG_FALLING, 0, 0.0f);
for (std::list<Creature*>::iterator itr = guardList.begin(); itr != guardList.end(); ++itr) for (std::list<Creature*>::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr)
(*itr)->AI()->DoAction(ACTION_DESPAWN); (*itr)->AI()->DoAction(ACTION_DESPAWN);
break; break;
} }
case ACTION_INTERRUPT_INTRO: case ACTION_INTERRUPT_INTRO:
events.Reset(); _events.Reset();
for (std::list<Creature*>::iterator itr = guardList.begin(); itr != guardList.end(); ++itr) for (std::list<Creature*>::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr)
(*itr)->AI()->DoAction(ACTION_DESPAWN); (*itr)->AI()->DoAction(ACTION_DESPAWN);
break; break;
} }
@@ -840,8 +844,8 @@ class npc_muradin_bronzebeard_icc : public CreatureScript
{ {
me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
Talk(SAY_INTRO_ALLIANCE_4); Talk(SAY_INTRO_ALLIANCE_4);
events.ScheduleEvent(EVENT_INTRO_ALLIANCE_5, 5000, 0, PHASE_INTRO_A); _events.ScheduleEvent(EVENT_INTRO_ALLIANCE_5, 5000, 0, PHASE_INTRO_A);
if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, deathbringerSaurfangGUID)) if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_DEATHBRINGER_SAURFANG)))
deathbringer->AI()->DoAction(ACTION_CONTINUE_INTRO); deathbringer->AI()->DoAction(ACTION_CONTINUE_INTRO);
} }
else if (type == WAYPOINT_MOTION_TYPE && id == POINT_EXIT) else if (type == WAYPOINT_MOTION_TYPE && id == POINT_EXIT)
@@ -854,10 +858,10 @@ class npc_muradin_bronzebeard_icc : public CreatureScript
} }
} }
void UpdateAI(const uint32 diff) void UpdateAI(uint32 const diff)
{ {
events.Update(diff); _events.Update(diff);
while (uint32 eventId = events.ExecuteEvent()) while (uint32 eventId = _events.ExecuteEvent())
{ {
switch (eventId) switch (eventId)
{ {
@@ -867,7 +871,7 @@ class npc_muradin_bronzebeard_icc : public CreatureScript
break; break;
case EVENT_INTRO_ALLIANCE_5: case EVENT_INTRO_ALLIANCE_5:
Talk(SAY_INTRO_ALLIANCE_5); Talk(SAY_INTRO_ALLIANCE_5);
for (std::list<Creature*>::iterator itr = guardList.begin(); itr != guardList.end(); ++itr) for (std::list<Creature*>::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr)
(*itr)->AI()->DoAction(ACTION_CHARGE); (*itr)->AI()->DoAction(ACTION_CHARGE);
me->GetMotionMaster()->MoveCharge(chargePos[0].GetPositionX(), chargePos[0].GetPositionY(), chargePos[0].GetPositionZ(), 8.5f, POINT_CHARGE); me->GetMotionMaster()->MoveCharge(chargePos[0].GetPositionX(), chargePos[0].GetPositionY(), chargePos[0].GetPositionZ(), 8.5f, POINT_CHARGE);
break; break;
@@ -876,21 +880,17 @@ class npc_muradin_bronzebeard_icc : public CreatureScript
} }
private: private:
EventMap events; EventMap _events;
InstanceScript* instance; InstanceScript* _instance;
uint64 deathbringerSaurfangGUID; std::list<Creature*> _guardList;
std::list<Creature*> guardList;
}; };
bool OnGossipHello(Player* player, Creature* creature) bool OnGossipHello(Player* player, Creature* creature)
{ {
if (creature->GetPositionZ() < 530.0f)
return false;
InstanceScript* instance = creature->GetInstanceScript(); InstanceScript* instance = creature->GetInstanceScript();
if (instance && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE) if (instance && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE)
{ {
player->ADD_GOSSIP_ITEM(0, "Let it begin...", 631, -ACTION_START_EVENT+1); player->ADD_GOSSIP_ITEM(0, "Let it begin...", 631, -ACTION_START_EVENT + 1);
player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID());
} }
@@ -901,7 +901,7 @@ class npc_muradin_bronzebeard_icc : public CreatureScript
{ {
player->PlayerTalkClass->ClearMenus(); player->PlayerTalkClass->ClearMenus();
player->CLOSE_GOSSIP_MENU(); player->CLOSE_GOSSIP_MENU();
if (action == -ACTION_START_EVENT+1) if (action == -ACTION_START_EVENT + 1)
creature->AI()->DoAction(ACTION_START_EVENT); creature->AI()->DoAction(ACTION_START_EVENT);
return true; return true;
@@ -922,13 +922,13 @@ class npc_saurfang_event : public CreatureScript
{ {
npc_saurfang_eventAI(Creature* creature) : ScriptedAI(creature) npc_saurfang_eventAI(Creature* creature) : ScriptedAI(creature)
{ {
npcIndex = 0; _index = 0;
} }
void SetData(uint32 type, uint32 data) void SetData(uint32 type, uint32 data)
{ {
ASSERT(!type && data && data < 6); ASSERT(!type && data && data < 6);
npcIndex = data; _index = data;
} }
void SpellHit(Unit* /*caster*/, SpellEntry const* spell) void SpellHit(Unit* /*caster*/, SpellEntry const* spell)
@@ -936,20 +936,20 @@ class npc_saurfang_event : public CreatureScript
if (spell->Id == SPELL_GRIP_OF_AGONY) if (spell->Id == SPELL_GRIP_OF_AGONY)
{ {
me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
me->GetMotionMaster()->MovePoint(POINT_CHOKE, chokePos[npcIndex]); me->GetMotionMaster()->MovePoint(POINT_CHOKE, chokePos[_index]);
} }
} }
void DoAction(const int32 action) void DoAction(int32 const action)
{ {
if (action == ACTION_CHARGE && npcIndex) if (action == ACTION_CHARGE && _index)
me->GetMotionMaster()->MoveCharge(chargePos[npcIndex].GetPositionX(), chargePos[npcIndex].GetPositionY(), chargePos[npcIndex].GetPositionZ(), 13.0f, POINT_CHARGE); me->GetMotionMaster()->MoveCharge(chargePos[_index].GetPositionX(), chargePos[_index].GetPositionY(), chargePos[_index].GetPositionZ(), 13.0f, POINT_CHARGE);
else if (action == ACTION_DESPAWN) else if (action == ACTION_DESPAWN)
me->DespawnOrUnsummon(); me->DespawnOrUnsummon();
} }
private: private:
uint32 npcIndex; uint32 _index;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -56,8 +56,8 @@ enum Spells
#define PUNGENT_BLIGHT_HELPER RAID_MODE<uint32>(69195, 71219, 73031, 73032) #define PUNGENT_BLIGHT_HELPER RAID_MODE<uint32>(69195, 71219, 73031, 73032)
#define INOCULATED_HELPER RAID_MODE<uint32>(69291, 72101, 72102, 72103) #define INOCULATED_HELPER RAID_MODE<uint32>(69291, 72101, 72102, 72103)
static const uint32 gaseousBlight[3] = {69157, 69162, 69164}; uint32 const gaseousBlight[3] = {69157, 69162, 69164};
static const uint32 gaseousBlightVisual[3] = {69126, 69152, 69154}; uint32 const gaseousBlightVisual[3] = {69126, 69152, 69154};
enum Events enum Events
{ {
@@ -82,24 +82,25 @@ class boss_festergut : public CreatureScript
{ {
boss_festergutAI(Creature* creature) : BossAI(creature, DATA_FESTERGUT) boss_festergutAI(Creature* creature) : BossAI(creature, DATA_FESTERGUT)
{ {
maxInoculatedStack = 0; _maxInoculatedStack = 0;
inhaleCounter = 0; _inhaleCounter = 0;
gasDummyGUID = 0; _gasDummyGUID = 0;
} }
void Reset() void Reset()
{ {
_Reset(); _Reset();
me->SetReactState(REACT_DEFENSIVE);
events.ScheduleEvent(EVENT_BERSERK, 300000); events.ScheduleEvent(EVENT_BERSERK, 300000);
events.ScheduleEvent(EVENT_INHALE_BLIGHT, urand(25000, 30000)); events.ScheduleEvent(EVENT_INHALE_BLIGHT, urand(25000, 30000));
events.ScheduleEvent(EVENT_GAS_SPORE, urand(20000, 25000)); events.ScheduleEvent(EVENT_GAS_SPORE, urand(20000, 25000));
events.ScheduleEvent(EVENT_GASTRIC_BLOAT, urand(12500, 15000)); events.ScheduleEvent(EVENT_GASTRIC_BLOAT, urand(12500, 15000));
maxInoculatedStack = 0; _maxInoculatedStack = 0;
inhaleCounter = 0; _inhaleCounter = 0;
me->RemoveAurasDueToSpell(SPELL_BERSERK2); me->RemoveAurasDueToSpell(SPELL_BERSERK2);
if (Creature* gasDummy = me->FindNearestCreature(NPC_GAS_DUMMY, 100.0f, true)) if (Creature* gasDummy = me->FindNearestCreature(NPC_GAS_DUMMY, 100.0f, true))
{ {
gasDummyGUID = gasDummy->GetGUID(); _gasDummyGUID = gasDummy->GetGUID();
for (uint8 i = 0; i < 3; ++i) for (uint8 i = 0; i < 3; ++i)
{ {
me->RemoveAurasDueToSpell(gaseousBlight[i]); me->RemoveAurasDueToSpell(gaseousBlight[i]);
@@ -120,7 +121,7 @@ class boss_festergut : public CreatureScript
me->setActive(true); me->setActive(true);
Talk(SAY_AGGRO); Talk(SAY_AGGRO);
if (Creature* gasDummy = me->FindNearestCreature(NPC_GAS_DUMMY, 100.0f, true)) if (Creature* gasDummy = me->FindNearestCreature(NPC_GAS_DUMMY, 100.0f, true))
gasDummyGUID = gasDummy->GetGUID(); _gasDummyGUID = gasDummy->GetGUID();
if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE)))
professor->AI()->DoAction(ACTION_FESTERGUT_COMBAT); professor->AI()->DoAction(ACTION_FESTERGUT_COMBAT);
DoZoneInCombat(); DoZoneInCombat();
@@ -133,7 +134,7 @@ class boss_festergut : public CreatureScript
if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE)))
professor->AI()->DoAction(ACTION_FESTERGUT_DEATH); professor->AI()->DoAction(ACTION_FESTERGUT_DEATH);
_RemoveBlight(); RemoveBlight();
} }
void JustReachedHome() void JustReachedHome()
@@ -155,18 +156,13 @@ class boss_festergut : public CreatureScript
Talk(SAY_KILL); Talk(SAY_KILL);
} }
void MoveInLineOfSight(Unit* /*who*/)
{
// don't enter combat
}
void SpellHitTarget(Unit* target, SpellEntry const* spell) void SpellHitTarget(Unit* target, SpellEntry const* spell)
{ {
if (spell->Id == PUNGENT_BLIGHT_HELPER) if (spell->Id == PUNGENT_BLIGHT_HELPER)
target->RemoveAurasDueToSpell(INOCULATED_HELPER); target->RemoveAurasDueToSpell(INOCULATED_HELPER);
} }
void UpdateAI(const uint32 diff) void UpdateAI(uint32 const diff)
{ {
if (!UpdateVictim() || !CheckInRoom()) if (!UpdateVictim() || !CheckInRoom())
return; return;
@@ -182,13 +178,13 @@ class boss_festergut : public CreatureScript
{ {
case EVENT_INHALE_BLIGHT: case EVENT_INHALE_BLIGHT:
{ {
_RemoveBlight(); RemoveBlight();
if (inhaleCounter == 3) if (_inhaleCounter == 3)
{ {
Talk(EMOTE_WARN_PUNGENT_BLIGHT); Talk(EMOTE_WARN_PUNGENT_BLIGHT);
Talk(SAY_PUNGENT_BLIGHT); Talk(SAY_PUNGENT_BLIGHT);
DoCast(me, SPELL_PUNGENT_BLIGHT); DoCast(me, SPELL_PUNGENT_BLIGHT);
inhaleCounter = 0; _inhaleCounter = 0;
if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE)))
professor->AI()->DoAction(ACTION_FESTERGUT_GAS); professor->AI()->DoAction(ACTION_FESTERGUT_GAS);
events.RescheduleEvent(EVENT_GAS_SPORE, urand(20000, 25000)); events.RescheduleEvent(EVENT_GAS_SPORE, urand(20000, 25000));
@@ -197,10 +193,11 @@ class boss_festergut : public CreatureScript
{ {
DoCast(me, SPELL_INHALE_BLIGHT); DoCast(me, SPELL_INHALE_BLIGHT);
// just cast and dont bother with target, conditions will handle it // just cast and dont bother with target, conditions will handle it
++inhaleCounter; ++_inhaleCounter;
if (inhaleCounter < 3) if (_inhaleCounter < 3)
me->CastSpell(me, gaseousBlight[inhaleCounter], true, NULL, NULL, me->GetGUID()); me->CastSpell(me, gaseousBlight[_inhaleCounter], true, NULL, NULL, me->GetGUID());
} }
events.ScheduleEvent(EVENT_INHALE_BLIGHT, urand(33500, 35000)); events.ScheduleEvent(EVENT_INHALE_BLIGHT, urand(33500, 35000));
break; break;
} }
@@ -243,21 +240,21 @@ class boss_festergut : public CreatureScript
void SetData(uint32 type, uint32 data) void SetData(uint32 type, uint32 data)
{ {
if (type == DATA_INOCULATED_STACK && data > maxInoculatedStack) if (type == DATA_INOCULATED_STACK && data > _maxInoculatedStack)
maxInoculatedStack = data; _maxInoculatedStack = data;
} }
uint32 GetData(uint32 type) uint32 GetData(uint32 type)
{ {
if (type == DATA_INOCULATED_STACK) if (type == DATA_INOCULATED_STACK)
return uint32(maxInoculatedStack); return uint32(_maxInoculatedStack);
return 0; return 0;
} }
void _RemoveBlight() void RemoveBlight()
{ {
if (Creature* gasDummy = ObjectAccessor::GetCreature(*me, gasDummyGUID)) if (Creature* gasDummy = ObjectAccessor::GetCreature(*me, _gasDummyGUID))
for (uint8 i = 0; i < 3; ++i) for (uint8 i = 0; i < 3; ++i)
{ {
me->RemoveAurasDueToSpell(gaseousBlight[i]); me->RemoveAurasDueToSpell(gaseousBlight[i]);
@@ -266,9 +263,9 @@ class boss_festergut : public CreatureScript
} }
private: private:
uint64 gasDummyGUID; uint64 _gasDummyGUID;
uint32 maxInoculatedStack; uint32 _maxInoculatedStack;
uint32 inhaleCounter; uint32 _inhaleCounter;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -286,38 +283,38 @@ class npc_stinky_icc : public CreatureScript
{ {
npc_stinky_iccAI(Creature* creature) : ScriptedAI(creature) npc_stinky_iccAI(Creature* creature) : ScriptedAI(creature)
{ {
instance = creature->GetInstanceScript(); _instance = creature->GetInstanceScript();
} }
void Reset() void Reset()
{ {
events.Reset(); _events.Reset();
events.ScheduleEvent(EVENT_DECIMATE, urand(20000, 25000)); _events.ScheduleEvent(EVENT_DECIMATE, urand(20000, 25000));
events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(3000, 7000)); _events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(3000, 7000));
DoCast(me, SPELL_PLAGUE_STENCH); DoCast(me, SPELL_PLAGUE_STENCH);
} }
void UpdateAI(const uint32 diff) void UpdateAI(uint32 const diff)
{ {
if (!UpdateVictim()) if (!UpdateVictim())
return; return;
events.Update(diff); _events.Update(diff);
if (me->HasUnitState(UNIT_STAT_CASTING)) if (me->HasUnitState(UNIT_STAT_CASTING))
return; return;
while (uint32 eventId = events.ExecuteEvent()) while (uint32 eventId = _events.ExecuteEvent())
{ {
switch (eventId) switch (eventId)
{ {
case EVENT_DECIMATE: case EVENT_DECIMATE:
DoCastVictim(SPELL_DECIMATE); DoCastVictim(SPELL_DECIMATE);
events.ScheduleEvent(EVENT_DECIMATE, urand(20000, 25000)); _events.ScheduleEvent(EVENT_DECIMATE, urand(20000, 25000));
break; break;
case EVENT_MORTAL_WOUND: case EVENT_MORTAL_WOUND:
DoCastVictim(SPELL_MORTAL_WOUND); DoCastVictim(SPELL_MORTAL_WOUND);
events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(10000, 12500)); _events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(10000, 12500));
break; break;
default: default:
break; break;
@@ -329,14 +326,14 @@ class npc_stinky_icc : public CreatureScript
void JustDied(Unit* /*who*/) void JustDied(Unit* /*who*/)
{ {
if (Creature* festergut = me->GetCreature(*me, instance->GetData64(DATA_FESTERGUT))) if (Creature* festergut = me->GetCreature(*me, _instance->GetData64(DATA_FESTERGUT)))
if (festergut->isAlive()) if (festergut->isAlive())
festergut->AI()->Talk(SAY_STINKY_DEAD); festergut->AI()->Talk(SAY_STINKY_DEAD);
} }
private: private:
EventMap events; EventMap _events;
InstanceScript* instance; InstanceScript* _instance;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -389,20 +386,21 @@ class spell_festergut_gastric_bloat : public SpellScriptLoader
{ {
PrepareSpellScript(spell_festergut_gastric_bloat_SpellScript); PrepareSpellScript(spell_festergut_gastric_bloat_SpellScript);
bool Validate(SpellEntry const* spell)
{
if (!sSpellStore.LookupEntry(SPELL_GASTRIC_EXPLOSION))
return false;
return true;
}
void HandleScript(SpellEffIndex /*effIndex*/) void HandleScript(SpellEffIndex /*effIndex*/)
{ {
Aura const* aura = GetHitUnit()->GetAura(GetSpellInfo()->Id); Aura const* aura = GetHitUnit()->GetAura(GetSpellInfo()->Id);
if (!(aura && aura->GetStackAmount() == 10)) if (!(aura && aura->GetStackAmount() == 10))
return; return;
SpellEntry const* spellInfo = sSpellStore.LookupEntry(SPELL_GASTRIC_EXPLOSION);
if (!spellInfo)
return;
// Get Gastric Explosion id for our difficulty
spellInfo = sSpellMgr->GetSpellForDifficultyFromSpell(spellInfo, GetCaster());
GetHitUnit()->RemoveAurasDueToSpell(GetSpellInfo()->Id); GetHitUnit()->RemoveAurasDueToSpell(GetSpellInfo()->Id);
GetHitUnit()->CastSpell(GetHitUnit(), spellInfo, true); GetHitUnit()->CastSpell(GetHitUnit(), SPELL_GASTRIC_EXPLOSION, true);
} }
void Register() void Register()
@@ -426,14 +424,22 @@ class spell_festergut_blighted_spores : public SpellScriptLoader
{ {
PrepareAuraScript(spell_festergut_blighted_spores_AuraScript); PrepareAuraScript(spell_festergut_blighted_spores_AuraScript);
bool Validate(SpellEntry const* /*spell*/)
{
if (!sSpellStore.LookupEntry(SPELL_INOCULATED))
return false;
return true;
}
void ExtraEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) void ExtraEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{ {
if (!GetCaster()->IsAIEnabled || GetCaster()->GetTypeId() != TYPEID_UNIT) if (GetCaster()->GetTypeId() != TYPEID_UNIT)
return; return;
uint32 inoculateId = CAST_AI(ScriptedAI, GetCaster()->ToCreature()->AI())->INOCULATED_HELPER; SpellEntry const* inoculated = sSpellStore.LookupEntry(SPELL_INOCULATED);
inoculated = sSpellMgr->GetSpellForDifficultyFromSpell(inoculated, GetCaster());
uint32 currStack = 0; uint32 currStack = 0;
if (Aura const* inoculate = GetTarget()->GetAura(inoculateId)) if (Aura const* inoculate = GetTarget()->GetAura(inoculated->Id))
currStack = inoculate->GetStackAmount(); currStack = inoculate->GetStackAmount();
GetTarget()->CastSpell(GetTarget(), SPELL_INOCULATED, true); GetTarget()->CastSpell(GetTarget(), SPELL_INOCULATED, true);
@@ -104,7 +104,7 @@ enum Spells
SPELL_SUNDER_ARMOR = 65936, SPELL_SUNDER_ARMOR = 65936,
}; };
enum Events enum EventTypes
{ {
// Lady Deathwhisper // Lady Deathwhisper
EVENT_INTRO_2 = 1, EVENT_INTRO_2 = 1,
@@ -180,9 +180,10 @@ enum DeprogrammingData
#define NPC_DARNAVAN_CREDIT RAID_MODE<uint32>(NPC_DARNAVAN_CREDIT_10, NPC_DARNAVAN_CREDIT_25, NPC_DARNAVAN_CREDIT_10, NPC_DARNAVAN_CREDIT_25) #define NPC_DARNAVAN_CREDIT RAID_MODE<uint32>(NPC_DARNAVAN_CREDIT_10, NPC_DARNAVAN_CREDIT_25, NPC_DARNAVAN_CREDIT_10, NPC_DARNAVAN_CREDIT_25)
#define QUEST_DEPROGRAMMING RAID_MODE<uint32>(QUEST_DEPROGRAMMING_10, QUEST_DEPROGRAMMING_25, QUEST_DEPROGRAMMING_10, QUEST_DEPROGRAMMING_25) #define QUEST_DEPROGRAMMING RAID_MODE<uint32>(QUEST_DEPROGRAMMING_10, QUEST_DEPROGRAMMING_25, QUEST_DEPROGRAMMING_10, QUEST_DEPROGRAMMING_25)
static const uint32 addEntries[2] = {NPC_CULT_FANATIC, NPC_CULT_ADHERENT}; uint32 const SummonEntries[2] = {NPC_CULT_FANATIC, NPC_CULT_ADHERENT};
#define GUID_CULTIST 1
static const Position addSpawnPos[7] = Position const SummonPositions[7] =
{ {
{-578.7066f, 2154.167f, 51.01529f, 1.692969f}, // 1 Left Door 1 (Cult Fanatic) {-578.7066f, 2154.167f, 51.01529f, 1.692969f}, // 1 Left Door 1 (Cult Fanatic)
{-598.9028f, 2155.005f, 51.01530f, 1.692969f}, // 2 Left Door 2 (Cult Adherent) {-598.9028f, 2155.005f, 51.01530f, 1.692969f}, // 2 Left Door 2 (Cult Adherent)
@@ -196,15 +197,16 @@ static const Position addSpawnPos[7] =
class DaranavanMoveEvent : public BasicEvent class DaranavanMoveEvent : public BasicEvent
{ {
public: public:
DaranavanMoveEvent(Creature& _darnavan) : darnavan(_darnavan) { } DaranavanMoveEvent(Creature& darnavan) : _darnavan(darnavan) { }
bool Execute(uint64 , uint32 ) bool Execute(uint64 /*time*/, uint32 /*diff*/)
{ {
darnavan.GetMotionMaster()->MovePoint(POINT_DESPAWN, addSpawnPos[6]); _darnavan.GetMotionMaster()->MovePoint(POINT_DESPAWN, SummonPositions[6]);
return true; return true;
} }
Creature& darnavan; private:
Creature& _darnavan;
}; };
class boss_lady_deathwhisper : public CreatureScript class boss_lady_deathwhisper : public CreatureScript
@@ -214,10 +216,9 @@ class boss_lady_deathwhisper : public CreatureScript
struct boss_lady_deathwhisperAI : public BossAI struct boss_lady_deathwhisperAI : public BossAI
{ {
boss_lady_deathwhisperAI(Creature* creature) : BossAI(creature, DATA_LADY_DEATHWHISPER) boss_lady_deathwhisperAI(Creature* creature) : BossAI(creature, DATA_LADY_DEATHWHISPER),
_dominateMindCount(RAID_MODE<uint8>(0, 1, 1, 3)), _introDone(false)
{ {
introDone = false;
dominateMindCount = RAID_MODE<uint8>(0, 1, 1, 3);
} }
void Reset() void Reset()
@@ -226,9 +227,9 @@ class boss_lady_deathwhisper : public CreatureScript
me->SetPower(POWER_MANA, me->GetMaxPower(POWER_MANA)); me->SetPower(POWER_MANA, me->GetMaxPower(POWER_MANA));
me->SetLastManaUse(0xFFFFFFFF); // hacky, but no other way atm to prevent mana regen me->SetLastManaUse(0xFFFFFFFF); // hacky, but no other way atm to prevent mana regen
events.SetPhase(PHASE_ONE); events.SetPhase(PHASE_ONE);
addWaveCounter = 0; _waveCounter = 0;
nextVengefulShadeTarget = 0; _nextVengefulShadeTargetGUID = 0;
darnavanGUID = 0; _darnavanGUID = 0;
DoCast(me, SPELL_SHADOW_CHANNELING); DoCast(me, SPELL_SHADOW_CHANNELING);
me->RemoveAurasDueToSpell(SPELL_BERSERK); me->RemoveAurasDueToSpell(SPELL_BERSERK);
me->RemoveAurasDueToSpell(SPELL_MANA_BARRIER); me->RemoveAurasDueToSpell(SPELL_MANA_BARRIER);
@@ -238,10 +239,10 @@ class boss_lady_deathwhisper : public CreatureScript
void MoveInLineOfSight(Unit* who) void MoveInLineOfSight(Unit* who)
{ {
if (!introDone && me->IsWithinDistInMap(who, 100.0f)) if (!_introDone && me->IsWithinDistInMap(who, 100.0f))
{ {
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
introDone = true; _introDone = true;
Talk(SAY_INTRO_1); Talk(SAY_INTRO_1);
events.SetPhase(PHASE_INTRO); events.SetPhase(PHASE_INTRO);
events.ScheduleEvent(EVENT_INTRO_2, 11000, 0, PHASE_INTRO); events.ScheduleEvent(EVENT_INTRO_2, 11000, 0, PHASE_INTRO);
@@ -309,7 +310,7 @@ class boss_lady_deathwhisper : public CreatureScript
if (livingAddEntries.size() >= 5) if (livingAddEntries.size() >= 5)
instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_FULL_HOUSE, 0, me); instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_FULL_HOUSE, 0, me);
if (Creature* darnavan = ObjectAccessor::GetCreature(*me, darnavanGUID)) if (Creature* darnavan = ObjectAccessor::GetCreature(*me, _darnavanGUID))
{ {
if (darnavan->isAlive()) if (darnavan->isAlive())
{ {
@@ -342,10 +343,10 @@ class boss_lady_deathwhisper : public CreatureScript
instance->SetBossState(DATA_LADY_DEATHWHISPER, FAIL); instance->SetBossState(DATA_LADY_DEATHWHISPER, FAIL);
summons.DespawnAll(); summons.DespawnAll();
if (Creature* darnavan = ObjectAccessor::GetCreature(*me, darnavanGUID)) if (Creature* darnavan = ObjectAccessor::GetCreature(*me, _darnavanGUID))
{ {
darnavan->DespawnOrUnsummon(); darnavan->DespawnOrUnsummon();
darnavanGUID = 0; _darnavanGUID = 0;
} }
} }
@@ -355,15 +356,15 @@ class boss_lady_deathwhisper : public CreatureScript
Talk(SAY_KILL); Talk(SAY_KILL);
} }
void DamageTaken(Unit* /*damageDealer*/, uint32& uiDamage) void DamageTaken(Unit* /*damageDealer*/, uint32& damage)
{ {
// phase transition // phase transition
if (events.GetPhaseMask() & PHASE_ONE_MASK && uiDamage > me->GetPower(POWER_MANA)) if (events.GetPhaseMask() & PHASE_ONE_MASK && damage > me->GetPower(POWER_MANA))
{ {
Talk(SAY_PHASE_2); Talk(SAY_PHASE_2);
Talk(EMOTE_PHASE_2); Talk(EMOTE_PHASE_2);
DoStartMovement(me->getVictim()); DoStartMovement(me->getVictim());
uiDamage -= me->GetPower(POWER_MANA); damage -= me->GetPower(POWER_MANA);
me->SetPower(POWER_MANA, 0); me->SetPower(POWER_MANA, 0);
me->RemoveAurasDueToSpell(SPELL_MANA_BARRIER); me->RemoveAurasDueToSpell(SPELL_MANA_BARRIER);
events.SetPhase(PHASE_TWO); events.SetPhase(PHASE_TWO);
@@ -384,27 +385,27 @@ class boss_lady_deathwhisper : public CreatureScript
void JustSummoned(Creature* summon) void JustSummoned(Creature* summon)
{ {
if (summon->GetEntry() == NPC_DARNAVAN) if (summon->GetEntry() == NPC_DARNAVAN)
darnavanGUID = summon->GetGUID(); _darnavanGUID = summon->GetGUID();
else else
summons.push_back(summon->GetGUID()); summons.Summon(summon);
Unit* target = NULL; Unit* target = NULL;
if (summon->GetEntry() == NPC_VENGEFUL_SHADE) if (summon->GetEntry() == NPC_VENGEFUL_SHADE)
{ {
target = ObjectAccessor::GetUnit(*me, nextVengefulShadeTarget); // Vengeful Shade target = ObjectAccessor::GetUnit(*me, _nextVengefulShadeTargetGUID); // Vengeful Shade
nextVengefulShadeTarget = 0; _nextVengefulShadeTargetGUID = 0;
} }
else else
target = SelectTarget(SELECT_TARGET_RANDOM); // Wave adds target = SelectTarget(SELECT_TARGET_RANDOM); // Wave adds
summon->AI()->AttackStart(target); // CAN be NULL summon->AI()->AttackStart(target); // CAN be NULL
if (summon->GetEntry() == NPC_REANIMATED_FANATIC) if (summon->GetEntry() == NPC_REANIMATED_FANATIC)
summon->AI()->DoCast(summon, SPELL_FANATIC_S_DETERMINATION); summon->CastSpell(summon, SPELL_FANATIC_S_DETERMINATION, true);
else if (summon->GetEntry() == NPC_REANIMATED_ADHERENT) else if (summon->GetEntry() == NPC_REANIMATED_ADHERENT)
summon->AI()->DoCast(summon, SPELL_ADHERENT_S_DETERMINATION); summon->CastSpell(summon, SPELL_ADHERENT_S_DETERMINATION, true);
} }
void UpdateAI(const uint32 diff) void UpdateAI(uint32 const diff)
{ {
if ((!UpdateVictim() && !(events.GetPhaseMask() & PHASE_INTRO_MASK)) || !CheckInRoom()) if ((!UpdateVictim() && !(events.GetPhaseMask() & PHASE_INTRO_MASK)) || !CheckInRoom())
return; return;
@@ -446,7 +447,7 @@ class boss_lady_deathwhisper : public CreatureScript
break; break;
case EVENT_DOMINATE_MIND_H: case EVENT_DOMINATE_MIND_H:
Talk(SAY_DOMINATE_MIND); Talk(SAY_DOMINATE_MIND);
for (uint8 i = 0; i < dominateMindCount; i++) for (uint8 i = 0; i < _dominateMindCount; i++)
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -SPELL_DOMINATE_MIND_H)) if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -SPELL_DOMINATE_MIND_H))
DoCast(target, SPELL_DOMINATE_MIND_H); DoCast(target, SPELL_DOMINATE_MIND_H);
events.ScheduleEvent(EVENT_DOMINATE_MIND_H, urand(40000, 45000)); events.ScheduleEvent(EVENT_DOMINATE_MIND_H, urand(40000, 45000));
@@ -482,7 +483,7 @@ class boss_lady_deathwhisper : public CreatureScript
case EVENT_P2_SUMMON_SHADE: case EVENT_P2_SUMMON_SHADE:
if (Unit* shadeTarget = SelectTarget(SELECT_TARGET_RANDOM, 1)) if (Unit* shadeTarget = SelectTarget(SELECT_TARGET_RANDOM, 1))
{ {
nextVengefulShadeTarget = shadeTarget->GetGUID(); _nextVengefulShadeTargetGUID = shadeTarget->GetGUID();
DoCast(shadeTarget, SPELL_SUMMON_SHADE); DoCast(shadeTarget, SPELL_SUMMON_SHADE);
} }
events.ScheduleEvent(EVENT_P2_SUMMON_SHADE, urand(18000, 23000), 0, PHASE_TWO); events.ScheduleEvent(EVENT_P2_SUMMON_SHADE, urand(18000, 23000), 0, PHASE_TWO);
@@ -508,22 +509,26 @@ class boss_lady_deathwhisper : public CreatureScript
// summoning function for first phase // summoning function for first phase
void SummonWaveP1() void SummonWaveP1()
{ {
uint8 addIndex = addWaveCounter & 1; uint8 addIndex = _waveCounter & 1;
uint8 addIndexOther = uint8(addIndex ^ 1); uint8 addIndexOther = uint8(addIndex ^ 1);
if (addWaveCounter || !sPoolMgr->IsSpawnedObject<Quest>(QUEST_DEPROGRAMMING))
_SummonAdd(addEntries[addIndex], addSpawnPos[addIndex*3]); // Summon first add, replace it with Darnavan if weekly quest is active
if (_waveCounter || !sPoolMgr->IsSpawnedObject<Quest>(QUEST_DEPROGRAMMING))
Summon(SummonEntries[addIndex], SummonPositions[addIndex * 3]);
else else
_SummonAdd(NPC_DARNAVAN, addSpawnPos[addIndex*3]); Summon(NPC_DARNAVAN, SummonPositions[addIndex * 3]);
_SummonAdd(addEntries[addIndexOther], addSpawnPos[addIndex*3+1]);
_SummonAdd(addEntries[addIndex], addSpawnPos[addIndex*3+2]); Summon(SummonEntries[addIndexOther], SummonPositions[addIndex * 3 + 1]);
Summon(SummonEntries[addIndex], SummonPositions[addIndex * 3 + 2]);
if (Is25ManRaid()) if (Is25ManRaid())
{ {
_SummonAdd(addEntries[addIndexOther], addSpawnPos[addIndexOther*3]); Summon(SummonEntries[addIndexOther], SummonPositions[addIndexOther * 3]);
_SummonAdd(addEntries[addIndex], addSpawnPos[addIndexOther*3+1]); Summon(SummonEntries[addIndex], SummonPositions[addIndexOther * 3 + 1]);
_SummonAdd(addEntries[addIndexOther], addSpawnPos[addIndexOther*3+2]); Summon(SummonEntries[addIndexOther], SummonPositions[addIndexOther * 3 + 2]);
_SummonAdd(addEntries[urand(0, 1)], addSpawnPos[6]); Summon(SummonEntries[urand(0, 1)], SummonPositions[6]);
} }
++addWaveCounter;
++_waveCounter;
} }
// summoning function for second phase // summoning function for second phase
@@ -531,37 +536,41 @@ class boss_lady_deathwhisper : public CreatureScript
{ {
if (Is25ManRaid()) if (Is25ManRaid())
{ {
uint8 addIndex = addWaveCounter & 1; uint8 addIndex = _waveCounter & 1;
_SummonAdd(addEntries[addIndex], addSpawnPos[addIndex*3]); Summon(SummonEntries[addIndex], SummonPositions[addIndex * 3]);
_SummonAdd(addEntries[addIndex ^ 1], addSpawnPos[addIndex*3+1]); Summon(SummonEntries[addIndex ^ 1], SummonPositions[addIndex * 3 + 1]);
_SummonAdd(addEntries[addIndex], addSpawnPos[addIndex*3+2]); Summon(SummonEntries[addIndex], SummonPositions[addIndex * 3+ 2]);
} }
else else
_SummonAdd(addEntries[urand(0, 1)], addSpawnPos[6]); Summon(SummonEntries[urand(0, 1)], SummonPositions[6]);
++addWaveCounter;
++_waveCounter;
} }
// helper for summoning wave mobs // helper for summoning wave mobs
void _SummonAdd(uint32 entry, const Position& pos) void Summon(uint32 entry, const Position& pos)
{ {
if (TempSummon* summon = me->SummonCreature(entry, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000)) if (TempSummon* summon = me->SummonCreature(entry, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000))
summon->AI()->DoCast(summon, SPELL_TELEPORT_VISUAL); summon->AI()->DoCast(summon, SPELL_TELEPORT_VISUAL);
} }
void AddToReanimationQueue(Unit* summon) void SetGUID(uint64 const& guid, int32 id/* = 0*/)
{ {
reanimationQueue.push_back(summon->GetGUID()); if (id != GUID_CULTIST)
return;
_reanimationQueue.push_back(guid);
events.ScheduleEvent(EVENT_P1_REANIMATE_CULTIST, 3000, 0, PHASE_ONE); events.ScheduleEvent(EVENT_P1_REANIMATE_CULTIST, 3000, 0, PHASE_ONE);
} }
void ReanimateCultist() void ReanimateCultist()
{ {
if (reanimationQueue.empty()) if (_reanimationQueue.empty())
return; return;
uint64 cultistGUID = reanimationQueue.front(); uint64 cultistGUID = _reanimationQueue.front();
Creature* cultist = ObjectAccessor::GetCreature(*me, cultistGUID); Creature* cultist = ObjectAccessor::GetCreature(*me, cultistGUID);
reanimationQueue.pop_front(); _reanimationQueue.pop_front();
if (!cultist) if (!cultist)
return; return;
@@ -590,19 +599,19 @@ class boss_lady_deathwhisper : public CreatureScript
if (summons.empty()) if (summons.empty())
return; return;
std::list<Creature*> tmpList; std::list<Creature*> temp;
for (SummonList::iterator itr = summons.begin(); itr != summons.end(); ++itr) for (SummonList::iterator itr = summons.begin(); itr != summons.end(); ++itr)
if (Creature* cre = ObjectAccessor::GetCreature(*me, *itr)) if (Creature* cre = ObjectAccessor::GetCreature(*me, *itr))
if (cre->isAlive() && (cre->GetEntry() == NPC_CULT_FANATIC || cre->GetEntry() == NPC_CULT_ADHERENT)) if (cre->isAlive() && (cre->GetEntry() == NPC_CULT_FANATIC || cre->GetEntry() == NPC_CULT_ADHERENT))
tmpList.push_back(cre); temp.push_back(cre);
// noone to empower // noone to empower
if (tmpList.empty()) if (temp.empty())
return; return;
// select random cultist // select random cultist
std::list<Creature*>::iterator cultistItr = tmpList.begin(); std::list<Creature*>::iterator cultistItr = temp.begin();
std::advance(cultistItr, urand(0, tmpList.size()-1)); std::advance(cultistItr, urand(0, temp.size()-1));
Creature* cultist = *cultistItr; Creature* cultist = *cultistItr;
DoCast(cultist, cultist->GetEntry() == NPC_CULT_FANATIC ? SPELL_DARK_TRANSFORMATION_T : SPELL_DARK_EMPOWERMENT_T, true); DoCast(cultist, cultist->GetEntry() == NPC_CULT_FANATIC ? SPELL_DARK_TRANSFORMATION_T : SPELL_DARK_EMPOWERMENT_T, true);
@@ -610,12 +619,12 @@ class boss_lady_deathwhisper : public CreatureScript
} }
private: private:
uint64 nextVengefulShadeTarget; uint64 _nextVengefulShadeTargetGUID;
uint64 darnavanGUID; uint64 _darnavanGUID;
std::deque<uint64> reanimationQueue; std::deque<uint64> _reanimationQueue;
uint32 addWaveCounter; uint32 _waveCounter;
uint8 dominateMindCount; uint8 const _dominateMindCount;
bool introDone; bool _introDone;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -637,12 +646,12 @@ class npc_cult_fanatic : public CreatureScript
void Reset() void Reset()
{ {
events.Reset(); Events.Reset();
events.ScheduleEvent(EVENT_FANATIC_NECROTIC_STRIKE, urand(10000, 12000)); Events.ScheduleEvent(EVENT_FANATIC_NECROTIC_STRIKE, urand(10000, 12000));
events.ScheduleEvent(EVENT_FANATIC_SHADOW_CLEAVE, urand(14000, 16000)); Events.ScheduleEvent(EVENT_FANATIC_SHADOW_CLEAVE, urand(14000, 16000));
events.ScheduleEvent(EVENT_FANATIC_VAMPIRIC_MIGHT, urand(20000, 27000)); Events.ScheduleEvent(EVENT_FANATIC_VAMPIRIC_MIGHT, urand(20000, 27000));
if (me->GetEntry() == NPC_CULT_FANATIC) if (me->GetEntry() == NPC_CULT_FANATIC)
events.ScheduleEvent(EVENT_CULTIST_DARK_MARTYRDOM, urand(18000, 32000)); Events.ScheduleEvent(EVENT_CULTIST_DARK_MARTYRDOM, urand(18000, 32000));
} }
void SpellHit(Unit* /*caster*/, SpellEntry const* spell) void SpellHit(Unit* /*caster*/, SpellEntry const* spell)
@@ -651,41 +660,41 @@ class npc_cult_fanatic : public CreatureScript
me->UpdateEntry(NPC_DEFORMED_FANATIC); me->UpdateEntry(NPC_DEFORMED_FANATIC);
else if (spell->Id == SPELL_DARK_TRANSFORMATION_T) else if (spell->Id == SPELL_DARK_TRANSFORMATION_T)
{ {
events.CancelEvent(EVENT_CULTIST_DARK_MARTYRDOM); Events.CancelEvent(EVENT_CULTIST_DARK_MARTYRDOM);
me->InterruptNonMeleeSpells(true); me->InterruptNonMeleeSpells(true);
DoCast(me, SPELL_DARK_TRANSFORMATION); DoCast(me, SPELL_DARK_TRANSFORMATION);
} }
} }
void UpdateAI(const uint32 diff) void UpdateAI(uint32 const diff)
{ {
if (!UpdateVictim()) if (!UpdateVictim())
return; return;
events.Update(diff); Events.Update(diff);
if (me->HasUnitState(UNIT_STAT_CASTING)) if (me->HasUnitState(UNIT_STAT_CASTING))
return; return;
while (uint32 eventId = events.ExecuteEvent()) while (uint32 eventId = Events.ExecuteEvent())
{ {
switch (eventId) switch (eventId)
{ {
case EVENT_FANATIC_NECROTIC_STRIKE: case EVENT_FANATIC_NECROTIC_STRIKE:
DoCastVictim(SPELL_NECROTIC_STRIKE); DoCastVictim(SPELL_NECROTIC_STRIKE);
events.ScheduleEvent(SPELL_NECROTIC_STRIKE, urand(11000, 13000)); Events.ScheduleEvent(SPELL_NECROTIC_STRIKE, urand(11000, 13000));
break; break;
case EVENT_FANATIC_SHADOW_CLEAVE: case EVENT_FANATIC_SHADOW_CLEAVE:
DoCastVictim(SPELL_SHADOW_CLEAVE); DoCastVictim(SPELL_SHADOW_CLEAVE);
events.ScheduleEvent(EVENT_FANATIC_SHADOW_CLEAVE, urand(9500, 11000)); Events.ScheduleEvent(EVENT_FANATIC_SHADOW_CLEAVE, urand(9500, 11000));
break; break;
case EVENT_FANATIC_VAMPIRIC_MIGHT: case EVENT_FANATIC_VAMPIRIC_MIGHT:
DoCast(me, SPELL_VAMPIRIC_MIGHT); DoCast(me, SPELL_VAMPIRIC_MIGHT);
events.ScheduleEvent(EVENT_FANATIC_VAMPIRIC_MIGHT, urand(20000, 27000)); Events.ScheduleEvent(EVENT_FANATIC_VAMPIRIC_MIGHT, urand(20000, 27000));
break; break;
case EVENT_CULTIST_DARK_MARTYRDOM: case EVENT_CULTIST_DARK_MARTYRDOM:
DoCast(me, SPELL_DARK_MARTYRDOM_FANATIC); DoCast(me, SPELL_DARK_MARTYRDOM_FANATIC);
events.ScheduleEvent(EVENT_CULTIST_DARK_MARTYRDOM, urand(16000, 21000)); Events.ScheduleEvent(EVENT_CULTIST_DARK_MARTYRDOM, urand(16000, 21000));
break; break;
} }
} }
@@ -693,8 +702,8 @@ class npc_cult_fanatic : public CreatureScript
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
private: protected:
EventMap events; EventMap Events;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -714,13 +723,13 @@ class npc_cult_adherent : public CreatureScript
void Reset() void Reset()
{ {
events.Reset(); Events.Reset();
events.ScheduleEvent(EVENT_ADHERENT_FROST_FEVER, urand(10000, 12000)); Events.ScheduleEvent(EVENT_ADHERENT_FROST_FEVER, urand(10000, 12000));
events.ScheduleEvent(EVENT_ADHERENT_DEATHCHILL, urand(14000, 16000)); Events.ScheduleEvent(EVENT_ADHERENT_DEATHCHILL, urand(14000, 16000));
events.ScheduleEvent(EVENT_ADHERENT_CURSE_OF_TORPOR, urand(14000, 16000)); Events.ScheduleEvent(EVENT_ADHERENT_CURSE_OF_TORPOR, urand(14000, 16000));
events.ScheduleEvent(EVENT_ADHERENT_SHORUD_OF_THE_OCCULT, urand(32000, 39000)); Events.ScheduleEvent(EVENT_ADHERENT_SHORUD_OF_THE_OCCULT, urand(32000, 39000));
if (me->GetEntry() == NPC_CULT_ADHERENT) if (me->GetEntry() == NPC_CULT_ADHERENT)
events.ScheduleEvent(EVENT_CULTIST_DARK_MARTYRDOM, urand(18000, 32000)); Events.ScheduleEvent(EVENT_CULTIST_DARK_MARTYRDOM, urand(18000, 32000));
} }
void SpellHit(Unit* /*caster*/, SpellEntry const* spell) void SpellHit(Unit* /*caster*/, SpellEntry const* spell)
@@ -729,49 +738,49 @@ class npc_cult_adherent : public CreatureScript
me->UpdateEntry(NPC_EMPOWERED_ADHERENT); me->UpdateEntry(NPC_EMPOWERED_ADHERENT);
else if (spell->Id == SPELL_DARK_EMPOWERMENT_T) else if (spell->Id == SPELL_DARK_EMPOWERMENT_T)
{ {
events.CancelEvent(EVENT_CULTIST_DARK_MARTYRDOM); Events.CancelEvent(EVENT_CULTIST_DARK_MARTYRDOM);
me->InterruptNonMeleeSpells(true); me->InterruptNonMeleeSpells(true);
DoCast(me, SPELL_DARK_EMPOWERMENT); DoCast(me, SPELL_DARK_EMPOWERMENT);
} }
} }
void UpdateAI(const uint32 diff) void UpdateAI(uint32 const diff)
{ {
if (!UpdateVictim()) if (!UpdateVictim())
return; return;
events.Update(diff); Events.Update(diff);
if (me->HasUnitState(UNIT_STAT_CASTING)) if (me->HasUnitState(UNIT_STAT_CASTING))
return; return;
while (uint32 eventId = events.ExecuteEvent()) while (uint32 eventId = Events.ExecuteEvent())
{ {
switch (eventId) switch (eventId)
{ {
case EVENT_ADHERENT_FROST_FEVER: case EVENT_ADHERENT_FROST_FEVER:
DoCastVictim(SPELL_FROST_FEVER); DoCastVictim(SPELL_FROST_FEVER);
events.ScheduleEvent(EVENT_ADHERENT_FROST_FEVER, urand(9000, 13000)); Events.ScheduleEvent(EVENT_ADHERENT_FROST_FEVER, urand(9000, 13000));
break; break;
case EVENT_ADHERENT_DEATHCHILL: case EVENT_ADHERENT_DEATHCHILL:
if (me->GetEntry() == NPC_EMPOWERED_ADHERENT) if (me->GetEntry() == NPC_EMPOWERED_ADHERENT)
DoCastVictim(SPELL_DEATHCHILL_BLAST); DoCastVictim(SPELL_DEATHCHILL_BLAST);
else else
DoCastVictim(SPELL_DEATHCHILL_BOLT); DoCastVictim(SPELL_DEATHCHILL_BOLT);
events.ScheduleEvent(EVENT_ADHERENT_DEATHCHILL, urand(9000, 13000)); Events.ScheduleEvent(EVENT_ADHERENT_DEATHCHILL, urand(9000, 13000));
break; break;
case EVENT_ADHERENT_CURSE_OF_TORPOR: case EVENT_ADHERENT_CURSE_OF_TORPOR:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
DoCast(target, SPELL_CURSE_OF_TORPOR); DoCast(target, SPELL_CURSE_OF_TORPOR);
events.ScheduleEvent(EVENT_ADHERENT_CURSE_OF_TORPOR, urand(9000, 13000)); Events.ScheduleEvent(EVENT_ADHERENT_CURSE_OF_TORPOR, urand(9000, 13000));
break; break;
case EVENT_ADHERENT_SHORUD_OF_THE_OCCULT: case EVENT_ADHERENT_SHORUD_OF_THE_OCCULT:
DoCast(me, SPELL_SHORUD_OF_THE_OCCULT); DoCast(me, SPELL_SHORUD_OF_THE_OCCULT);
events.ScheduleEvent(EVENT_ADHERENT_SHORUD_OF_THE_OCCULT, urand(27000, 32000)); Events.ScheduleEvent(EVENT_ADHERENT_SHORUD_OF_THE_OCCULT, urand(27000, 32000));
break; break;
case EVENT_CULTIST_DARK_MARTYRDOM: case EVENT_CULTIST_DARK_MARTYRDOM:
DoCast(me, SPELL_DARK_MARTYRDOM_ADHERENT); DoCast(me, SPELL_DARK_MARTYRDOM_ADHERENT);
events.ScheduleEvent(EVENT_CULTIST_DARK_MARTYRDOM, urand(16000, 21000)); Events.ScheduleEvent(EVENT_CULTIST_DARK_MARTYRDOM, urand(16000, 21000));
break; break;
} }
} }
@@ -779,13 +788,13 @@ class npc_cult_adherent : public CreatureScript
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
private: protected:
EventMap events; EventMap Events;
}; };
CreatureAI* GetAI(Creature* pCreature) const CreatureAI* GetAI(Creature* creature) const
{ {
return GetIcecrownCitadelAI<npc_cult_adherentAI>(pCreature); return GetIcecrownCitadelAI<npc_cult_adherentAI>(creature);
} }
}; };
@@ -842,18 +851,18 @@ class npc_darnavan : public CreatureScript
void Reset() void Reset()
{ {
events.Reset(); _events.Reset();
events.ScheduleEvent(EVENT_DARNAVAN_BLADESTORM, 10000); _events.ScheduleEvent(EVENT_DARNAVAN_BLADESTORM, 10000);
events.ScheduleEvent(EVENT_DARNAVAN_INTIMIDATING_SHOUT, urand(20000, 25000)); _events.ScheduleEvent(EVENT_DARNAVAN_INTIMIDATING_SHOUT, urand(20000, 25000));
events.ScheduleEvent(EVENT_DARNAVAN_MORTAL_STRIKE, urand(25000, 30000)); _events.ScheduleEvent(EVENT_DARNAVAN_MORTAL_STRIKE, urand(25000, 30000));
events.ScheduleEvent(EVENT_DARNAVAN_SUNDER_ARMOR, urand(5000, 8000)); _events.ScheduleEvent(EVENT_DARNAVAN_SUNDER_ARMOR, urand(5000, 8000));
canCharge = true; _canCharge = true;
canShatter = true; _canShatter = true;
} }
void JustDied(Unit* killer) void JustDied(Unit* killer)
{ {
events.Reset(); _events.Reset();
if (Player* owner = killer->GetCharmerOrOwnerPlayerOrPlayerItself()) if (Player* owner = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
{ {
if (Group* group = owner->GetGroup()) if (Group* group = owner->GetGroup())
@@ -871,6 +880,7 @@ class npc_darnavan : public CreatureScript
{ {
if (type != POINT_MOTION_TYPE || id != POINT_DESPAWN) if (type != POINT_MOTION_TYPE || id != POINT_DESPAWN)
return; return;
me->DespawnOrUnsummon(); me->DespawnOrUnsummon();
} }
@@ -884,52 +894,52 @@ class npc_darnavan : public CreatureScript
if (!UpdateVictim()) if (!UpdateVictim())
return; return;
events.Update(diff); _events.Update(diff);
if (me->HasUnitState(UNIT_STAT_CASTING)) if (me->HasUnitState(UNIT_STAT_CASTING))
return; return;
if (canShatter && me->getVictim()->IsImmunedToDamage(SPELL_SCHOOL_MASK_NORMAL)) if (_canShatter && me->getVictim()->IsImmunedToDamage(SPELL_SCHOOL_MASK_NORMAL))
{ {
DoCastVictim(SPELL_SHATTERING_THROW); DoCastVictim(SPELL_SHATTERING_THROW);
canShatter = false; _canShatter = false;
events.ScheduleEvent(EVENT_DARNAVAN_SHATTERING_THROW, 30000); _events.ScheduleEvent(EVENT_DARNAVAN_SHATTERING_THROW, 30000);
return; return;
} }
if (canCharge && !me->IsWithinMeleeRange(me->getVictim())) if (_canCharge && !me->IsWithinMeleeRange(me->getVictim()))
{ {
DoCastVictim(SPELL_CHARGE); DoCastVictim(SPELL_CHARGE);
canCharge = false; _canCharge = false;
events.ScheduleEvent(EVENT_DARNAVAN_CHARGE, 20000); _events.ScheduleEvent(EVENT_DARNAVAN_CHARGE, 20000);
return; return;
} }
while (uint32 eventId = events.ExecuteEvent()) while (uint32 eventId = _events.ExecuteEvent())
{ {
switch (eventId) switch (eventId)
{ {
case EVENT_DARNAVAN_BLADESTORM: case EVENT_DARNAVAN_BLADESTORM:
DoCast(SPELL_BLADESTORM); DoCast(SPELL_BLADESTORM);
events.ScheduleEvent(EVENT_DARNAVAN_BLADESTORM, urand(90000, 100000)); _events.ScheduleEvent(EVENT_DARNAVAN_BLADESTORM, urand(90000, 100000));
break; break;
case EVENT_DARNAVAN_CHARGE: case EVENT_DARNAVAN_CHARGE:
canCharge = true; _canCharge = true;
break; break;
case EVENT_DARNAVAN_INTIMIDATING_SHOUT: case EVENT_DARNAVAN_INTIMIDATING_SHOUT:
DoCast(SPELL_INTIMIDATING_SHOUT); DoCast(SPELL_INTIMIDATING_SHOUT);
events.ScheduleEvent(EVENT_DARNAVAN_INTIMIDATING_SHOUT, urand(90000, 120000)); _events.ScheduleEvent(EVENT_DARNAVAN_INTIMIDATING_SHOUT, urand(90000, 120000));
break; break;
case EVENT_DARNAVAN_MORTAL_STRIKE: case EVENT_DARNAVAN_MORTAL_STRIKE:
DoCastVictim(SPELL_MORTAL_STRIKE); DoCastVictim(SPELL_MORTAL_STRIKE);
events.ScheduleEvent(EVENT_DARNAVAN_MORTAL_STRIKE, urand(15000, 30000)); _events.ScheduleEvent(EVENT_DARNAVAN_MORTAL_STRIKE, urand(15000, 30000));
break; break;
case EVENT_DARNAVAN_SHATTERING_THROW: case EVENT_DARNAVAN_SHATTERING_THROW:
canShatter = true; _canShatter = true;
break; break;
case EVENT_DARNAVAN_SUNDER_ARMOR: case EVENT_DARNAVAN_SUNDER_ARMOR:
DoCastVictim(SPELL_SUNDER_ARMOR); DoCastVictim(SPELL_SUNDER_ARMOR);
events.ScheduleEvent(EVENT_DARNAVAN_SUNDER_ARMOR, urand(3000, 7000)); _events.ScheduleEvent(EVENT_DARNAVAN_SUNDER_ARMOR, urand(3000, 7000));
break; break;
} }
} }
@@ -938,9 +948,9 @@ class npc_darnavan : public CreatureScript
} }
private: private:
EventMap events; EventMap _events;
bool canCharge; bool _canCharge;
bool canShatter; bool _canShatter;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -992,8 +1002,7 @@ class spell_cultist_dark_martyrdom : public SpellScriptLoader
{ {
if (GetCaster()->isSummon()) if (GetCaster()->isSummon())
if (Unit* owner = GetCaster()->ToTempSummon()->GetSummoner()) if (Unit* owner = GetCaster()->ToTempSummon()->GetSummoner())
if (owner->GetEntry() == NPC_LADY_DEATHWHISPER) owner->GetAI()->SetGUID(GetCaster()->GetGUID(), GUID_CULTIST);
CAST_AI(DeathwisperAI, owner->ToCreature()->AI())->AddToReanimationQueue(GetCaster());
GetCaster()->Kill(GetCaster()); GetCaster()->Kill(GetCaster());
GetCaster()->SetDisplayId(uint32(GetCaster()->GetEntry() == NPC_CULT_FANATIC ? 38009 : 38010)); GetCaster()->SetDisplayId(uint32(GetCaster()->GetEntry() == NPC_CULT_FANATIC ? 38009 : 38010));
@@ -52,7 +52,7 @@ enum Spells
SPELL_COLDFLAME_SUMMON = 69147, SPELL_COLDFLAME_SUMMON = 69147,
}; };
static const uint32 boneSpikeSummonId[3] = {69062, 72669, 72670}; uint32 const boneSpikeSummonId[3] = {69062, 72669, 72670};
enum Events enum Events
{ {
@@ -86,17 +86,17 @@ class boss_lord_marrowgar : public CreatureScript
{ {
boss_lord_marrowgarAI(Creature* creature) : BossAI(creature, DATA_LORD_MARROWGAR) boss_lord_marrowgarAI(Creature* creature) : BossAI(creature, DATA_LORD_MARROWGAR)
{ {
boneStormDuration = RAID_MODE<uint32>(20000, 30000, 20000, 30000); _boneStormDuration = RAID_MODE<uint32>(20000, 30000, 20000, 30000);
baseSpeed = creature->GetSpeedRate(MOVE_RUN); _baseSpeed = creature->GetSpeedRate(MOVE_RUN);
coldflameLastPos.Relocate(creature); _coldflameLastPos.Relocate(creature);
introDone = false; _introDone = false;
boneSlice = false; _boneSlice = false;
} }
void Reset() void Reset()
{ {
_Reset(); _Reset();
me->SetSpeed(MOVE_RUN, baseSpeed, true); me->SetSpeed(MOVE_RUN, _baseSpeed, true);
me->RemoveAurasDueToSpell(SPELL_BONE_STORM); me->RemoveAurasDueToSpell(SPELL_BONE_STORM);
me->RemoveAurasDueToSpell(SPELL_BERSERK); me->RemoveAurasDueToSpell(SPELL_BERSERK);
events.ScheduleEvent(EVENT_ENABLE_BONE_SLICE, 10000); events.ScheduleEvent(EVENT_ENABLE_BONE_SLICE, 10000);
@@ -137,14 +137,14 @@ class boss_lord_marrowgar : public CreatureScript
void MoveInLineOfSight(Unit* who) void MoveInLineOfSight(Unit* who)
{ {
if (!introDone && me->IsWithinDistInMap(who, 70.0f)) if (!_introDone && me->IsWithinDistInMap(who, 70.0f))
{ {
Talk(SAY_ENTER_ZONE); Talk(SAY_ENTER_ZONE);
introDone = true; _introDone = true;
} }
} }
void UpdateAI(const uint32 diff) void UpdateAI(uint32 const diff)
{ {
if (!UpdateVictim() || !CheckInRoom()) if (!UpdateVictim() || !CheckInRoom())
return; return;
@@ -164,7 +164,7 @@ class boss_lord_marrowgar : public CreatureScript
events.ScheduleEvent(EVENT_BONE_SPIKE_GRAVEYARD, urand(15000, 20000), EVENT_GROUP_SPECIAL); events.ScheduleEvent(EVENT_BONE_SPIKE_GRAVEYARD, urand(15000, 20000), EVENT_GROUP_SPECIAL);
break; break;
case EVENT_COLDFLAME: case EVENT_COLDFLAME:
coldflameLastPos.Relocate(me); _coldflameLastPos.Relocate(me);
if (!me->HasAura(SPELL_BONE_STORM)) if (!me->HasAura(SPELL_BONE_STORM))
me->CastCustomSpell(SPELL_COLDFLAME_NORMAL, SPELLVALUE_MAX_TARGETS, 1, me); me->CastCustomSpell(SPELL_COLDFLAME_NORMAL, SPELLVALUE_MAX_TARGETS, 1, me);
else else
@@ -172,7 +172,7 @@ class boss_lord_marrowgar : public CreatureScript
events.ScheduleEvent(EVENT_COLDFLAME, 5000, EVENT_GROUP_SPECIAL); events.ScheduleEvent(EVENT_COLDFLAME, 5000, EVENT_GROUP_SPECIAL);
break; break;
case EVENT_WARN_BONE_STORM: case EVENT_WARN_BONE_STORM:
boneSlice = false; _boneSlice = false;
Talk(EMOTE_BONE_STORM); Talk(EMOTE_BONE_STORM);
me->FinishSpell(CURRENT_MELEE_SPELL, false); me->FinishSpell(CURRENT_MELEE_SPELL, false);
DoCast(me, SPELL_BONE_STORM); DoCast(me, SPELL_BONE_STORM);
@@ -182,14 +182,14 @@ class boss_lord_marrowgar : public CreatureScript
break; break;
case EVENT_BONE_STORM_BEGIN: case EVENT_BONE_STORM_BEGIN:
if (Aura* pStorm = me->GetAura(SPELL_BONE_STORM)) if (Aura* pStorm = me->GetAura(SPELL_BONE_STORM))
pStorm->SetDuration(int32(boneStormDuration)); pStorm->SetDuration(int32(_boneStormDuration));
me->SetSpeed(MOVE_RUN, baseSpeed*3.0f, true); me->SetSpeed(MOVE_RUN, _baseSpeed*3.0f, true);
Talk(SAY_BONE_STORM); Talk(SAY_BONE_STORM);
events.ScheduleEvent(EVENT_BONE_STORM_END, boneStormDuration+1); events.ScheduleEvent(EVENT_BONE_STORM_END, _boneStormDuration+1);
// no break here // no break here
case EVENT_BONE_STORM_MOVE: case EVENT_BONE_STORM_MOVE:
{ {
events.ScheduleEvent(EVENT_BONE_STORM_MOVE, boneStormDuration/3); events.ScheduleEvent(EVENT_BONE_STORM_MOVE, _boneStormDuration/3);
Unit* unit = SelectTarget(SELECT_TARGET_RANDOM, 1); Unit* unit = SelectTarget(SELECT_TARGET_RANDOM, 1);
if (!unit) if (!unit)
unit = SelectTarget(SELECT_TARGET_RANDOM, 0); unit = SelectTarget(SELECT_TARGET_RANDOM, 0);
@@ -201,14 +201,14 @@ class boss_lord_marrowgar : public CreatureScript
if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE) if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE)
me->GetMotionMaster()->MovementExpired(); me->GetMotionMaster()->MovementExpired();
DoStartMovement(me->getVictim()); DoStartMovement(me->getVictim());
me->SetSpeed(MOVE_RUN, baseSpeed, true); me->SetSpeed(MOVE_RUN, _baseSpeed, true);
events.CancelEvent(EVENT_BONE_STORM_MOVE); events.CancelEvent(EVENT_BONE_STORM_MOVE);
events.ScheduleEvent(EVENT_ENABLE_BONE_SLICE, 10000); events.ScheduleEvent(EVENT_ENABLE_BONE_SLICE, 10000);
if (!IsHeroic()) if (!IsHeroic())
events.RescheduleEvent(EVENT_BONE_SPIKE_GRAVEYARD, urand(15000, 20000), EVENT_GROUP_SPECIAL); events.RescheduleEvent(EVENT_BONE_SPIKE_GRAVEYARD, urand(15000, 20000), EVENT_GROUP_SPECIAL);
break; break;
case EVENT_ENABLE_BONE_SLICE: case EVENT_ENABLE_BONE_SLICE:
boneSlice = true; _boneSlice = true;
break; break;
case EVENT_ENRAGE: case EVENT_ENRAGE:
DoCast(me, SPELL_BERSERK, true); DoCast(me, SPELL_BERSERK, true);
@@ -222,7 +222,7 @@ class boss_lord_marrowgar : public CreatureScript
return; return;
// After 10 seconds since encounter start Bone Slice replaces melee attacks // After 10 seconds since encounter start Bone Slice replaces melee attacks
if (boneSlice && !me->GetCurrentSpell(CURRENT_MELEE_SPELL)) if (_boneSlice && !me->GetCurrentSpell(CURRENT_MELEE_SPELL))
DoCastVictim(SPELL_BONE_SLICE); DoCastVictim(SPELL_BONE_SLICE);
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
@@ -237,17 +237,17 @@ class boss_lord_marrowgar : public CreatureScript
DoStartNoMovement(me->getVictim()); DoStartNoMovement(me->getVictim());
} }
const Position* GetLastColdflamePosition() const Position const* GetLastColdflamePosition() const
{ {
return &coldflameLastPos; return &_coldflameLastPos;
} }
private: private:
Position coldflameLastPos; Position _coldflameLastPos;
uint32 boneStormDuration; uint32 _boneStormDuration;
float baseSpeed; float _baseSpeed;
bool introDone; bool _introDone;
bool boneSlice; bool _boneSlice;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -294,34 +294,36 @@ class npc_coldflame : public CreatureScript
} }
else else
{ {
MarrowgarAI* marrowgarAI = CAST_AI(MarrowgarAI, creOwner->AI()); if (MarrowgarAI* marrowgarAI = CAST_AI(MarrowgarAI, creOwner->AI()))
{
Position const* ownerPos = marrowgarAI->GetLastColdflamePosition(); Position const* ownerPos = marrowgarAI->GetLastColdflamePosition();
float ang = me->GetAngle(ownerPos) - static_cast<float>(M_PI); float ang = me->GetAngle(ownerPos) - static_cast<float>(M_PI);
MapManager::NormalizeOrientation(ang); MapManager::NormalizeOrientation(ang);
me->SetOrientation(ang); me->SetOrientation(ang);
owner->GetNearPosition(pos, 2.5f, 0.0f); owner->GetNearPosition(pos, 2.5f, 0.0f);
} }
me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), me->GetPositionZ(), me->GetOrientation());
events.ScheduleEvent(EVENT_COLDFLAME_TRIGGER, 200);
} }
void UpdateAI(const uint32 diff) me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), me->GetPositionZ(), me->GetOrientation());
{ _events.ScheduleEvent(EVENT_COLDFLAME_TRIGGER, 200);
events.Update(diff); }
if (events.ExecuteEvent() == EVENT_COLDFLAME_TRIGGER) void UpdateAI(uint32 const diff)
{
_events.Update(diff);
if (_events.ExecuteEvent() == EVENT_COLDFLAME_TRIGGER)
{ {
Position newPos; Position newPos;
me->GetNearPosition(newPos, 5.5f, 0.0f); me->GetNearPosition(newPos, 5.5f, 0.0f);
me->NearTeleportTo(newPos.GetPositionX(), newPos.GetPositionY(), me->GetPositionZ(), me->GetOrientation()); me->NearTeleportTo(newPos.GetPositionX(), newPos.GetPositionY(), me->GetPositionZ(), me->GetOrientation());
DoCast(SPELL_COLDFLAME_SUMMON); DoCast(SPELL_COLDFLAME_SUMMON);
events.ScheduleEvent(EVENT_COLDFLAME_TRIGGER, 200); _events.ScheduleEvent(EVENT_COLDFLAME_TRIGGER, 200);
} }
} }
private: private:
EventMap events; EventMap _events;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -337,7 +339,7 @@ class npc_bone_spike : public CreatureScript
struct npc_bone_spikeAI : public Scripted_NoMovementAI struct npc_bone_spikeAI : public Scripted_NoMovementAI
{ {
npc_bone_spikeAI(Creature* creature) : Scripted_NoMovementAI(creature), hasTrappedUnit(false) npc_bone_spikeAI(Creature* creature) : Scripted_NoMovementAI(creature), _hasTrappedUnit(false)
{ {
ASSERT(creature->GetVehicleKit()); ASSERT(creature->GetVehicleKit());
} }
@@ -361,25 +363,25 @@ class npc_bone_spike : public CreatureScript
{ {
DoCast(summoner, SPELL_IMPALED); DoCast(summoner, SPELL_IMPALED);
summoner->CastSpell(me, SPELL_RIDE_VEHICLE, true); summoner->CastSpell(me, SPELL_RIDE_VEHICLE, true);
events.ScheduleEvent(EVENT_FAIL_BONED, 8000); _events.ScheduleEvent(EVENT_FAIL_BONED, 8000);
hasTrappedUnit = true; _hasTrappedUnit = true;
} }
void UpdateAI(const uint32 diff) void UpdateAI(uint32 const diff)
{ {
if (!hasTrappedUnit) if (!_hasTrappedUnit)
return; return;
events.Update(diff); _events.Update(diff);
if (events.ExecuteEvent() == EVENT_FAIL_BONED) if (_events.ExecuteEvent() == EVENT_FAIL_BONED)
if (InstanceScript* instance = me->GetInstanceScript()) if (InstanceScript* instance = me->GetInstanceScript())
instance->SetData(DATA_BONED_ACHIEVEMENT, uint32(false)); instance->SetData(DATA_BONED_ACHIEVEMENT, uint32(false));
} }
private: private:
EventMap events; EventMap _events;
bool hasTrappedUnit; bool _hasTrappedUnit;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -406,7 +408,7 @@ class spell_marrowgar_coldflame : public SpellScriptLoader
count = 4; count = 4;
for (uint8 i = 0; i < count; ++i) for (uint8 i = 0; i < count; ++i)
caster->CastSpell(caster, uint32(GetEffectValue()+i), true); caster->CastSpell(caster, uint32(GetEffectValue() + i), true);
} }
void Register() void Register()
@@ -468,12 +470,14 @@ class spell_marrowgar_bone_spike_graveyard : public SpellScriptLoader
for (uint8 i = 0; i < boneSpikeCount; ++i) for (uint8 i = 0; i < boneSpikeCount; ++i)
{ {
// select any unit but not the tank // select any unit but not the tank
Unit* target = marrowgarAI->SelectTarget(SELECT_TARGET_RANDOM, 1, 100.0f, true, -SPELL_IMPALED); Unit* target = marrowgarAI->SelectTarget(SELECT_TARGET_RANDOM, 1, 150.0f, true, -SPELL_IMPALED);
// try the tank only in first iteration // try the tank only in first iteration
if (!target && !i) if (!target && !i)
target = marrowgarAI->SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, -SPELL_IMPALED); target = marrowgarAI->SelectTarget(SELECT_TARGET_RANDOM, 0, 150.0f, true, -SPELL_IMPALED);
if (!target) if (!target)
return; return;
target->CastCustomSpell(boneSpikeSummonId[i], SPELLVALUE_BASE_POINT0, 0, target, true); target->CastCustomSpell(boneSpikeSummonId[i], SPELLVALUE_BASE_POINT0, 0, target, true);
} }
@@ -504,12 +508,7 @@ class spell_marrowgar_bone_storm : public SpellScriptLoader
void RecalculateDamage(SpellEffIndex /*effIndex*/) void RecalculateDamage(SpellEffIndex /*effIndex*/)
{ {
float distance = GetHitUnit()->GetExactDist2d(GetCaster()); SetHitDamage(int32(GetHitDamage() / sqrtf(logf(GetHitUnit()->GetExactDist2d(GetCaster())))));
if (distance < 5.0f)
return;
float distVar = distance >= 40.0f ? 4 : (10.0f/3.0f);
SetHitDamage(int32(GetHitDamage() * distVar / distance));
} }
void Register() void Register()
@@ -147,11 +147,12 @@ enum Points
POINT_TABLE = 366780, POINT_TABLE = 366780,
}; };
static const Position festergutWatchPos = {4324.820f, 3166.03f, 389.3831f, 3.316126f}; //emote 432 (release gas) Position const festergutWatchPos = {4324.820f, 3166.03f, 389.3831f, 3.316126f}; //emote 432 (release gas)
static const Position rotfaceWatchPos = {4390.371f, 3164.50f, 389.3890f, 5.497787f}; //emote 432 (release ooze) Position const rotfaceWatchPos = {4390.371f, 3164.50f, 389.3890f, 5.497787f}; //emote 432 (release ooze)
static const Position tablePos = {4356.190f, 3262.90f, 389.4820f, 1.483530f}; Position const tablePos = {4356.190f, 3262.90f, 389.4820f, 1.483530f};
static const uint32 oozeFloodSpells[4] = {69782, 69796, 69798, 69801}; // used in Rotface encounter
uint32 const oozeFloodSpells[4] = {69782, 69796, 69798, 69801};
enum PutricideData enum PutricideData
{ {
@@ -171,9 +172,9 @@ class boss_professor_putricide : public CreatureScript
struct boss_professor_putricideAI : public BossAI struct boss_professor_putricideAI : public BossAI
{ {
boss_professor_putricideAI(Creature* creature) : BossAI(creature, DATA_PROFESSOR_PUTRICIDE), boss_professor_putricideAI(Creature* creature) : BossAI(creature, DATA_PROFESSOR_PUTRICIDE),
baseSpeed(creature->GetSpeedRate(MOVE_RUN)), experimentState(EXPERIMENT_STATE_OOZE) _baseSpeed(creature->GetSpeedRate(MOVE_RUN)), _experimentState(EXPERIMENT_STATE_OOZE)
{ {
phase = PHASE_NONE; _phase = PHASE_NONE;
} }
void Reset() void Reset()
@@ -185,7 +186,7 @@ class boss_professor_putricide : public CreatureScript
events.Reset(); events.Reset();
summons.DespawnAll(); summons.DespawnAll();
SetPhase(PHASE_COMBAT_1); SetPhase(PHASE_COMBAT_1);
experimentState = EXPERIMENT_STATE_OOZE; _experimentState = EXPERIMENT_STATE_OOZE;
me->SetReactState(REACT_DEFENSIVE); me->SetReactState(REACT_DEFENSIVE);
me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE) if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE)
@@ -283,7 +284,7 @@ class boss_professor_putricide : public CreatureScript
void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/)
{ {
switch (phase) switch (_phase)
{ {
case PHASE_COMBAT_1: case PHASE_COMBAT_1:
if (HealthAbovePct(80)) if (HealthAbovePct(80))
@@ -310,25 +311,25 @@ class boss_professor_putricide : public CreatureScript
{ {
case POINT_FESTERGUT: case POINT_FESTERGUT:
instance->SetBossState(DATA_FESTERGUT, IN_PROGRESS); // needed here for delayed gate close instance->SetBossState(DATA_FESTERGUT, IN_PROGRESS); // needed here for delayed gate close
me->SetSpeed(MOVE_RUN, baseSpeed, true); me->SetSpeed(MOVE_RUN, _baseSpeed, true);
DoAction(ACTION_FESTERGUT_GAS); DoAction(ACTION_FESTERGUT_GAS);
if (Creature* festergut = Unit::GetCreature(*me, instance->GetData64(DATA_FESTERGUT))) if (Creature* festergut = Unit::GetCreature(*me, instance->GetData64(DATA_FESTERGUT)))
festergut->CastSpell(festergut, SPELL_GASEOUS_BLIGHT_LARGE, false, NULL, NULL, festergut->GetGUID()); festergut->CastSpell(festergut, SPELL_GASEOUS_BLIGHT_LARGE, false, NULL, NULL, festergut->GetGUID());
break; break;
case POINT_ROTFACE: case POINT_ROTFACE:
instance->SetBossState(DATA_ROTFACE, IN_PROGRESS); // needed here for delayed gate close instance->SetBossState(DATA_ROTFACE, IN_PROGRESS); // needed here for delayed gate close
me->SetSpeed(MOVE_RUN, baseSpeed, true); me->SetSpeed(MOVE_RUN, _baseSpeed, true);
DoAction(ACTION_ROTFACE_OOZE); DoAction(ACTION_ROTFACE_OOZE);
events.ScheduleEvent(EVENT_ROTFACE_OOZE_FLOOD, 25000, 0, PHASE_ROTFACE); events.ScheduleEvent(EVENT_ROTFACE_OOZE_FLOOD, 25000, 0, PHASE_ROTFACE);
break; break;
case POINT_TABLE: case POINT_TABLE:
// stop attack // stop attack
me->GetMotionMaster()->MoveIdle(); me->GetMotionMaster()->MoveIdle();
me->SetSpeed(MOVE_RUN, baseSpeed, true); me->SetSpeed(MOVE_RUN, _baseSpeed, true);
if (GameObject* table = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_PUTRICIDE_TABLE))) if (GameObject* table = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_PUTRICIDE_TABLE)))
me->SetFacingToObject(table); me->SetFacingToObject(table);
// operating on new phase already // operating on new phase already
switch (phase) switch (_phase)
{ {
case PHASE_COMBAT_2: case PHASE_COMBAT_2:
{ {
@@ -361,7 +362,7 @@ class boss_professor_putricide : public CreatureScript
{ {
case ACTION_FESTERGUT_COMBAT: case ACTION_FESTERGUT_COMBAT:
SetPhase(PHASE_FESTERGUT); SetPhase(PHASE_FESTERGUT);
me->SetSpeed(MOVE_RUN, baseSpeed*2.0f, true); me->SetSpeed(MOVE_RUN, _baseSpeed*2.0f, true);
me->GetMotionMaster()->MovePoint(POINT_FESTERGUT, festergutWatchPos); me->GetMotionMaster()->MovePoint(POINT_FESTERGUT, festergutWatchPos);
me->SetReactState(REACT_PASSIVE); me->SetReactState(REACT_PASSIVE);
DoZoneInCombat(me); DoZoneInCombat(me);
@@ -378,10 +379,10 @@ class boss_professor_putricide : public CreatureScript
case ACTION_ROTFACE_COMBAT: case ACTION_ROTFACE_COMBAT:
{ {
SetPhase(PHASE_ROTFACE); SetPhase(PHASE_ROTFACE);
me->SetSpeed(MOVE_RUN, baseSpeed*2.0f, true); me->SetSpeed(MOVE_RUN, _baseSpeed*2.0f, true);
me->GetMotionMaster()->MovePoint(POINT_ROTFACE, rotfaceWatchPos); me->GetMotionMaster()->MovePoint(POINT_ROTFACE, rotfaceWatchPos);
me->SetReactState(REACT_PASSIVE); me->SetReactState(REACT_PASSIVE);
oozeFloodStage = 0; _oozeFloodStage = 0;
DoZoneInCombat(me); DoZoneInCombat(me);
if (IsHeroic()) if (IsHeroic())
events.ScheduleEvent(EVENT_ROTFACE_VILE_GAS, urand(15000, 20000), 0, PHASE_ROTFACE); events.ScheduleEvent(EVENT_ROTFACE_VILE_GAS, urand(15000, 20000), 0, PHASE_ROTFACE);
@@ -404,7 +405,7 @@ class boss_professor_putricide : public CreatureScript
{ {
std::list<Creature*>::iterator itr = list.begin(); std::list<Creature*>::iterator itr = list.begin();
std::advance(itr, urand(0, list.size()-1)); std::advance(itr, urand(0, list.size()-1));
oozeFloodDummy[i++] = (*itr)->GetGUID(); _oozeFloodDummyGUIDs[i++] = (*itr)->GetGUID();
list.erase(itr); list.erase(itr);
} }
} }
@@ -412,16 +413,16 @@ class boss_professor_putricide : public CreatureScript
} }
case ACTION_ROTFACE_OOZE: case ACTION_ROTFACE_OOZE:
Talk(SAY_ROTFACE_OOZE_FLOOD); Talk(SAY_ROTFACE_OOZE_FLOOD);
if (Creature* dummy = Unit::GetCreature(*me, oozeFloodDummy[oozeFloodStage])) if (Creature* dummy = Unit::GetCreature(*me, _oozeFloodDummyGUIDs[_oozeFloodStage]))
dummy->CastSpell(dummy, oozeFloodSpells[oozeFloodStage], true, NULL, NULL, me->GetGUID()); // cast from self for LoS (with prof's GUID for logs) dummy->CastSpell(dummy, oozeFloodSpells[_oozeFloodStage], true, NULL, NULL, me->GetGUID()); // cast from self for LoS (with prof's GUID for logs)
if (++oozeFloodStage == 4) if (++_oozeFloodStage == 4)
oozeFloodStage = 0; _oozeFloodStage = 0;
break; break;
case ACTION_ROTFACE_DEATH: case ACTION_ROTFACE_DEATH:
events.ScheduleEvent(EVENT_ROTFACE_DIES, 4500, 0, PHASE_ROTFACE); events.ScheduleEvent(EVENT_ROTFACE_DIES, 4500, 0, PHASE_ROTFACE);
break; break;
case ACTION_CHANGE_PHASE: case ACTION_CHANGE_PHASE:
me->SetSpeed(MOVE_RUN, baseSpeed*2.0f, true); me->SetSpeed(MOVE_RUN, _baseSpeed*2.0f, true);
events.DelayEvents(30000); events.DelayEvents(30000);
me->AttackStop(); me->AttackStop();
if (!IsHeroic()) if (!IsHeroic())
@@ -460,7 +461,7 @@ class boss_professor_putricide : public CreatureScript
} }
me->GetMotionMaster()->MovePoint(POINT_TABLE, tablePos); me->GetMotionMaster()->MovePoint(POINT_TABLE, tablePos);
} }
switch (phase) switch (_phase)
{ {
case PHASE_COMBAT_1: case PHASE_COMBAT_1:
SetPhase(PHASE_COMBAT_2); SetPhase(PHASE_COMBAT_2);
@@ -490,12 +491,12 @@ class boss_professor_putricide : public CreatureScript
case DATA_EXPERIMENT_STAGE: case DATA_EXPERIMENT_STAGE:
{ {
// ALSO MODIFIES! // ALSO MODIFIES!
uint32 ret = uint32(experimentState); uint32 ret = uint32(_experimentState);
experimentState ^= true; _experimentState ^= true;
return ret; return ret;
} }
case DATA_PHASE: case DATA_PHASE:
return phase; return _phase;
case DATA_ABOMINATION: case DATA_ABOMINATION:
summons.RemoveNotExisting(); summons.RemoveNotExisting();
return summons.HasEntry(NPC_MUTATED_ABOMINATION_10) || summons.HasEntry(NPC_MUTATED_ABOMINATION_25); return summons.HasEntry(NPC_MUTATED_ABOMINATION_10) || summons.HasEntry(NPC_MUTATED_ABOMINATION_25);
@@ -612,7 +613,7 @@ class boss_professor_putricide : public CreatureScript
break; break;
case EVENT_PHASE_TRANSITION: case EVENT_PHASE_TRANSITION:
{ {
switch (phase) switch (_phase)
{ {
case PHASE_COMBAT_2: case PHASE_COMBAT_2:
if (Creature* face = me->FindNearestCreature(NPC_TEAR_GAS_TARGET_STALKER, 50.0f)) if (Creature* face = me->FindNearestCreature(NPC_TEAR_GAS_TARGET_STALKER, 50.0f))
@@ -643,15 +644,15 @@ class boss_professor_putricide : public CreatureScript
private: private:
void SetPhase(Phases newPhase) void SetPhase(Phases newPhase)
{ {
phase = newPhase; _phase = newPhase;
events.SetPhase(newPhase); events.SetPhase(newPhase);
} }
uint64 oozeFloodDummy[4]; uint64 _oozeFloodDummyGUIDs[4];
Phases phase; // external of EventMap because event phase gets reset on evade Phases _phase; // external of EventMap because event phase gets reset on evade
float const baseSpeed; float const _baseSpeed;
uint8 oozeFloodStage; uint8 _oozeFloodStage;
bool experimentState; bool _experimentState;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -669,13 +670,13 @@ class npc_volatile_ooze : public CreatureScript
{ {
npc_volatile_oozeAI(Creature* creature) : ScriptedAI(creature) npc_volatile_oozeAI(Creature* creature) : ScriptedAI(creature)
{ {
newTargetSelectTimer = 0; _newTargetSelectTimer = 0;
} }
void SpellHitTarget(Unit* /*target*/, SpellEntry const* spell) void SpellHitTarget(Unit* /*target*/, SpellEntry const* spell)
{ {
if (!newTargetSelectTimer && sSpellMgr->GetSpellDifficultyId(spell->Id) == sSpellMgr->GetSpellDifficultyId(SPELL_OOZE_ERUPTION)) if (!_newTargetSelectTimer && sSpellMgr->GetSpellDifficultyId(spell->Id) == sSpellMgr->GetSpellDifficultyId(SPELL_OOZE_ERUPTION))
newTargetSelectTimer = 1000; _newTargetSelectTimer = 1000;
} }
void UpdateAI(uint32 const diff) void UpdateAI(uint32 const diff)
@@ -683,21 +684,21 @@ class npc_volatile_ooze : public CreatureScript
if (!UpdateVictim()) if (!UpdateVictim())
return; return;
if (!newTargetSelectTimer) if (!_newTargetSelectTimer)
return; return;
if (newTargetSelectTimer <= diff) if (_newTargetSelectTimer <= diff)
{ {
newTargetSelectTimer = 0; _newTargetSelectTimer = 0;
me->CastSpell(me, SPELL_VOLATILE_OOZE_ADHESIVE, false); me->CastSpell(me, SPELL_VOLATILE_OOZE_ADHESIVE, false);
} }
else else
newTargetSelectTimer -= diff; _newTargetSelectTimer -= diff;
} }
private: private:
// no need to use EventMap for just one event // no need to use EventMap for just one event
uint32 newTargetSelectTimer; uint32 _newTargetSelectTimer;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -757,10 +758,10 @@ class spell_putricide_gaseous_bloat : public SpellScriptLoader
} }
}; };
class BeamProtectionPred class BeamProtectionCheck
{ {
public: public:
explicit BeamProtectionPred(uint32 excludeAura) : _excludeAura(excludeAura) { } explicit BeamProtectionCheck(uint32 excludeAura) : _excludeAura(excludeAura) { }
bool operator()(Unit* unit) bool operator()(Unit* unit)
{ {
@@ -799,7 +800,7 @@ class spell_putricide_ooze_channel : public SpellScriptLoader
void SelectTarget(std::list<Unit*>& targetList) void SelectTarget(std::list<Unit*>& targetList)
{ {
targetList.remove_if(BeamProtectionPred(GetSpellInfo()->excludeTargetAuraSpell)); targetList.remove_if(BeamProtectionCheck(GetSpellInfo()->excludeTargetAuraSpell));
if (targetList.empty()) if (targetList.empty())
{ {
FinishCast(SPELL_FAILED_NO_VALID_TARGETS); FinishCast(SPELL_FAILED_NO_VALID_TARGETS);
@@ -856,15 +857,13 @@ class spell_putricide_expunged_gas : public SpellScriptLoader
bool Load() bool Load()
{ {
return GetCaster()->GetTypeId() == TYPEID_UNIT; return GetCaster()->GetTypeId() == TYPEID_UNIT && GetCaster()->GetInstanceScript();
} }
void CalcDamage(SpellEffIndex /*effIndex*/) void CalcDamage(SpellEffIndex /*effIndex*/)
{ {
// checked in script loading, cant be NULL here
InstanceScript* instance = GetCaster()->GetInstanceScript(); InstanceScript* instance = GetCaster()->GetInstanceScript();
if (!instance)
return;
Creature* professor = Unit::GetCreature(*GetCaster(), instance->GetData64(DATA_PROFESSOR_PUTRICIDE)); Creature* professor = Unit::GetCreature(*GetCaster(), instance->GetData64(DATA_PROFESSOR_PUTRICIDE));
if (!professor) if (!professor)
return; return;
@@ -920,7 +919,7 @@ class spell_putricide_slime_puddle : public SpellScriptLoader
radiusMod += size->GetStackAmount(); radiusMod += size->GetStackAmount();
uint32 triggerSpellId = GetSpellProto()->EffectTriggerSpell[aurEff->GetEffIndex()]; uint32 triggerSpellId = GetSpellProto()->EffectTriggerSpell[aurEff->GetEffIndex()];
caster->CastCustomSpell(triggerSpellId, SPELLVALUE_RADIUS_MOD, radiusMod*100, caster, true); caster->CastCustomSpell(triggerSpellId, SPELLVALUE_RADIUS_MOD, radiusMod * 100, caster, true);
} }
} }
@@ -1154,10 +1153,23 @@ class spell_putricide_eat_ooze : public SpellScriptLoader
{ {
PrepareSpellScript(spell_putricide_eat_ooze_SpellScript); PrepareSpellScript(spell_putricide_eat_ooze_SpellScript);
void SelectTarget(std::list<Unit*>& targets)
{
if (targets.empty())
return;
targets.sort(Trinity::ObjectDistanceOrderPred(GetCaster()));
Unit* target = targets.front();
targets.clear();
targets.push_back(target);
}
void HandleScript(SpellEffIndex /*effIndex*/) void HandleScript(SpellEffIndex /*effIndex*/)
{ {
if (Creature* target = GetCaster()->FindNearestCreature(NPC_GROWING_OOZE_PUDDLE, 15.0f)) Creature* target = GetHitCreature();
{ if (!target)
return;
if (Aura* grow = target->GetAura(uint32(GetEffectValue()))) if (Aura* grow = target->GetAura(uint32(GetEffectValue())))
{ {
if (grow->GetStackAmount() < 4) if (grow->GetStackAmount() < 4)
@@ -1170,11 +1182,11 @@ class spell_putricide_eat_ooze : public SpellScriptLoader
grow->ModStackAmount(-4); grow->ModStackAmount(-4);
} }
} }
}
void Register() void Register()
{ {
OnEffect += SpellEffectFn(spell_putricide_eat_ooze_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); OnEffect += SpellEffectFn(spell_putricide_eat_ooze_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
OnUnitTargetSelect += SpellUnitTargetFn(spell_putricide_eat_ooze_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_AREA_ENTRY_DST);
} }
}; };
@@ -35,6 +35,8 @@ enum Texts
SAY_KILL = 6, SAY_KILL = 6,
SAY_BERSERK = 7, SAY_BERSERK = 7,
SAY_DEATH = 8, SAY_DEATH = 8,
EMOTE_PRECIOUS_ZOMBIES = 0,
}; };
enum Spells enum Spells
@@ -59,20 +61,24 @@ enum Spells
// Precious // Precious
SPELL_MORTAL_WOUND = 71127, SPELL_MORTAL_WOUND = 71127,
SPELL_DECIMATE = 71123, SPELL_DECIMATE = 71123,
SPELL_AWAKEN_PLAGUED_ZOMBIES = 71159,
}; };
#define MUTATED_INFECTION RAID_MODE<int32>(69674, 71224, 73022, 73023) #define MUTATED_INFECTION RAID_MODE<int32>(69674, 71224, 73022, 73023)
enum Events enum Events
{ {
// Rotface
EVENT_SLIME_SPRAY = 1, EVENT_SLIME_SPRAY = 1,
EVENT_HASTEN_INFECTIONS = 2, EVENT_HASTEN_INFECTIONS = 2,
EVENT_MUTATED_INFECTION = 3, EVENT_MUTATED_INFECTION = 3,
// Precious
EVENT_DECIMATE = 4, EVENT_DECIMATE = 4,
EVENT_MORTAL_WOUND = 5, EVENT_MORTAL_WOUND = 5,
EVENT_SUMMON_ZOMBIES = 6,
EVENT_STICKY_OOZE = 6, EVENT_STICKY_OOZE = 7,
}; };
class boss_rotface : public CreatureScript class boss_rotface : public CreatureScript
@@ -363,14 +369,15 @@ class npc_precious_icc : public CreatureScript
{ {
npc_precious_iccAI(Creature* creature) : ScriptedAI(creature) npc_precious_iccAI(Creature* creature) : ScriptedAI(creature)
{ {
instance = creature->GetInstanceScript(); _instance = creature->GetInstanceScript();
} }
void Reset() void Reset()
{ {
events.Reset(); _events.Reset();
events.ScheduleEvent(EVENT_DECIMATE, urand(20000, 25000)); _events.ScheduleEvent(EVENT_DECIMATE, urand(20000, 25000));
events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(3000, 7000)); _events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(3000, 7000));
_events.ScheduleEvent(EVENT_SUMMON_ZOMBIES, urand(20000, 22000));
} }
void UpdateAI(const uint32 diff) void UpdateAI(const uint32 diff)
@@ -378,22 +385,28 @@ class npc_precious_icc : public CreatureScript
if (!UpdateVictim()) if (!UpdateVictim())
return; return;
events.Update(diff); _events.Update(diff);
if (me->HasUnitState(UNIT_STAT_CASTING)) if (me->HasUnitState(UNIT_STAT_CASTING))
return; return;
while (uint32 eventId = events.ExecuteEvent()) while (uint32 eventId = _events.ExecuteEvent())
{ {
switch (eventId) switch (eventId)
{ {
case EVENT_DECIMATE: case EVENT_DECIMATE:
DoCastVictim(SPELL_DECIMATE); DoCastVictim(SPELL_DECIMATE);
events.ScheduleEvent(EVENT_DECIMATE, urand(20000, 25000)); _events.ScheduleEvent(EVENT_DECIMATE, urand(20000, 25000));
break; break;
case EVENT_MORTAL_WOUND: case EVENT_MORTAL_WOUND:
DoCastVictim(SPELL_MORTAL_WOUND); DoCastVictim(SPELL_MORTAL_WOUND);
events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(10000, 12500)); _events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(10000, 12500));
break;
case EVENT_SUMMON_ZOMBIES:
Talk(EMOTE_PRECIOUS_ZOMBIES);
for (uint32 i = 0; i < 11; ++i)
DoCast(me, SPELL_AWAKEN_PLAGUED_ZOMBIES, false);
_events.ScheduleEvent(EVENT_SUMMON_ZOMBIES, urand(20000, 22000));
break; break;
default: default:
break; break;
@@ -405,14 +418,14 @@ class npc_precious_icc : public CreatureScript
void JustDied(Unit* /*who*/) void JustDied(Unit* /*who*/)
{ {
if (Creature* rotface = Unit::GetCreature(*me, instance->GetData64(DATA_ROTFACE))) if (Creature* rotface = Unit::GetCreature(*me, _instance->GetData64(DATA_ROTFACE)))
if (rotface->isAlive()) if (rotface->isAlive())
rotface->AI()->Talk(SAY_PRECIOUS_DIES); rotface->AI()->Talk(SAY_PRECIOUS_DIES);
} }
private: private:
EventMap events; EventMap _events;
InstanceScript* instance; InstanceScript* _instance;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -435,10 +448,10 @@ class spell_rotface_ooze_flood : public SpellScriptLoader
if (!GetHitUnit()) if (!GetHitUnit())
return; return;
std::list<Creature*> list; std::list<Creature*> triggers;
GetHitUnit()->GetCreatureListWithEntryInGrid(list, GetHitUnit()->GetEntry(), 12.5f); GetHitUnit()->GetCreatureListWithEntryInGrid(triggers, GetHitUnit()->GetEntry(), 12.5f);
list.sort(Trinity::ObjectDistanceOrderPred(GetHitUnit())); triggers.sort(Trinity::ObjectDistanceOrderPred(GetHitUnit()));
GetHitUnit()->CastSpell(list.back(), uint32(GetEffectValue()), false, NULL, NULL, GetOriginalCaster() ? GetOriginalCaster()->GetGUID() : 0); GetHitUnit()->CastSpell(triggers.back(), uint32(GetEffectValue()), false, NULL, NULL, GetOriginalCaster() ? GetOriginalCaster()->GetGUID() : 0);
} }
void FilterTargets(std::list<Unit*>& targetList) void FilterTargets(std::list<Unit*>& targetList)
@@ -153,16 +153,17 @@ Position const SindragosaAirPos = {4475.990f, 2484.430f, 247.9340f, 3.141593f
class FrostwyrmLandEvent : public BasicEvent class FrostwyrmLandEvent : public BasicEvent
{ {
public: public:
FrostwyrmLandEvent(Creature& _owner, Position const& _dest) : owner(_owner), dest(_dest) { } FrostwyrmLandEvent(Creature& owner, Position const& dest) : _owner(owner), _dest(dest) { }
bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/)
{ {
owner.GetMotionMaster()->MovePoint(POINT_FROSTWYRM_LAND, dest); _owner.GetMotionMaster()->MovePoint(POINT_FROSTWYRM_LAND, _dest);
return true; return true;
} }
Creature& owner; private:
Position const& dest; Creature& _owner;
Position const& _dest;
}; };
class boss_sindragosa : public CreatureScript class boss_sindragosa : public CreatureScript
@@ -188,8 +189,8 @@ class boss_sindragosa : public CreatureScript
events.ScheduleEvent(EVENT_UNCHAINED_MAGIC, urand(9000, 14000), EVENT_GROUP_LAND_PHASE); events.ScheduleEvent(EVENT_UNCHAINED_MAGIC, urand(9000, 14000), EVENT_GROUP_LAND_PHASE);
events.ScheduleEvent(EVENT_ICY_GRIP, 33500, EVENT_GROUP_LAND_PHASE); events.ScheduleEvent(EVENT_ICY_GRIP, 33500, EVENT_GROUP_LAND_PHASE);
events.ScheduleEvent(EVENT_AIR_PHASE, 50000); events.ScheduleEvent(EVENT_AIR_PHASE, 50000);
mysticBuffetStack = 0; _mysticBuffetStack = 0;
isThirdPhase = false; _isThirdPhase = false;
if (instance->GetData(DATA_SINDRAGOSA_FROSTWYRMS) != 255) if (instance->GetData(DATA_SINDRAGOSA_FROSTWYRMS) != 255)
{ {
@@ -254,7 +255,7 @@ class boss_sindragosa : public CreatureScript
uint32 GetData(uint32 type) uint32 GetData(uint32 type)
{ {
if (type == DATA_MYSTIC_BUFFET_STACK) if (type == DATA_MYSTIC_BUFFET_STACK)
return mysticBuffetStack; return _mysticBuffetStack;
return 0xFFFFFFFF; return 0xFFFFFFFF;
} }
@@ -297,14 +298,14 @@ class boss_sindragosa : public CreatureScript
void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/)
{ {
if (!isThirdPhase && !HealthAbovePct(35)) if (!_isThirdPhase && !HealthAbovePct(35))
{ {
Talk(SAY_PHASE_2); Talk(SAY_PHASE_2);
events.CancelEvent(EVENT_AIR_PHASE); events.CancelEvent(EVENT_AIR_PHASE);
events.ScheduleEvent(EVENT_ICE_TOMB, urand(7000, 10000)); events.ScheduleEvent(EVENT_ICE_TOMB, urand(7000, 10000));
events.RescheduleEvent(EVENT_ICY_GRIP, urand(35000, 40000)); events.RescheduleEvent(EVENT_ICY_GRIP, urand(35000, 40000));
DoCast(me, SPELL_MYSTIC_BUFFET, true); DoCast(me, SPELL_MYSTIC_BUFFET, true);
isThirdPhase = true; _isThirdPhase = true;
} }
} }
@@ -325,12 +326,12 @@ class boss_sindragosa : public CreatureScript
if (SpellEntry const* buffet = sSpellMgr->GetSpellForDifficultyFromSpell(sSpellStore.LookupEntry(70127), me)) if (SpellEntry const* buffet = sSpellMgr->GetSpellForDifficultyFromSpell(sSpellStore.LookupEntry(70127), me))
if (buffet->Id == spell->Id) if (buffet->Id == spell->Id)
if (Aura const* mysticBuffet = target->GetAura(spell->Id)) if (Aura const* mysticBuffet = target->GetAura(spell->Id))
mysticBuffetStack = std::max<uint8>(mysticBuffetStack, mysticBuffet->GetStackAmount()); _mysticBuffetStack = std::max<uint8>(_mysticBuffetStack, mysticBuffet->GetStackAmount());
// Frost Infusion // Frost Infusion
if (Player* player = target->ToPlayer()) if (Player* player = target->ToPlayer())
{ {
if (SpellEntry const* breath = sSpellMgr->GetSpellForDifficultyFromSpell(sSpellStore.LookupEntry(isThirdPhase ? SPELL_FROST_BREATH_P2 : SPELL_FROST_BREATH_P1), me)) if (SpellEntry const* breath = sSpellMgr->GetSpellForDifficultyFromSpell(sSpellStore.LookupEntry(_isThirdPhase ? SPELL_FROST_BREATH_P2 : SPELL_FROST_BREATH_P1), me))
{ {
if (player->GetQuestStatus(QUEST_FROST_INFUSION) != QUEST_STATUS_REWARDED && breath->Id == spell->Id) if (player->GetQuestStatus(QUEST_FROST_INFUSION) != QUEST_STATUS_REWARDED && breath->Id == spell->Id)
{ {
@@ -391,7 +392,7 @@ class boss_sindragosa : public CreatureScript
events.ScheduleEvent(EVENT_TAIL_SMASH, urand(27000, 32000), EVENT_GROUP_LAND_PHASE); events.ScheduleEvent(EVENT_TAIL_SMASH, urand(27000, 32000), EVENT_GROUP_LAND_PHASE);
break; break;
case EVENT_FROST_BREATH: case EVENT_FROST_BREATH:
DoCastVictim(isThirdPhase ? SPELL_FROST_BREATH_P2 : SPELL_FROST_BREATH_P1); DoCastVictim(_isThirdPhase ? SPELL_FROST_BREATH_P2 : SPELL_FROST_BREATH_P1);
events.ScheduleEvent(EVENT_FROST_BREATH, urand(20000, 25000), EVENT_GROUP_LAND_PHASE); events.ScheduleEvent(EVENT_FROST_BREATH, urand(20000, 25000), EVENT_GROUP_LAND_PHASE);
break; break;
case EVENT_UNCHAINED_MAGIC: case EVENT_UNCHAINED_MAGIC:
@@ -467,8 +468,8 @@ class boss_sindragosa : public CreatureScript
} }
private: private:
uint8 mysticBuffetStack; uint8 _mysticBuffetStack;
bool isThirdPhase; bool _isThirdPhase;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -486,7 +487,7 @@ class npc_ice_tomb : public CreatureScript
{ {
npc_ice_tombAI(Creature* creature) : Scripted_NoMovementAI(creature) npc_ice_tombAI(Creature* creature) : Scripted_NoMovementAI(creature)
{ {
trappedPlayer = 0; _trappedPlayerGUID = 0;
} }
void Reset() void Reset()
@@ -498,15 +499,15 @@ class npc_ice_tomb : public CreatureScript
{ {
if (type == DATA_TRAPPED_PLAYER) if (type == DATA_TRAPPED_PLAYER)
{ {
trappedPlayer = guid; _trappedPlayerGUID = guid;
existenceCheckTimer = 1000; _existenceCheckTimer = 1000;
} }
} }
void DoAction(int32 const action) void DoAction(int32 const action)
{ {
if (action == ACTION_TRIGGER_ASPHYXIATION) if (action == ACTION_TRIGGER_ASPHYXIATION)
if (Player* player = ObjectAccessor::GetPlayer(*me, trappedPlayer)) if (Player* player = ObjectAccessor::GetPlayer(*me, _trappedPlayerGUID))
player->CastSpell(player, SPELL_ASPHYXIATION, true); player->CastSpell(player, SPELL_ASPHYXIATION, true);
} }
@@ -514,9 +515,9 @@ class npc_ice_tomb : public CreatureScript
{ {
me->RemoveAllGameObjects(); me->RemoveAllGameObjects();
if (Player* player = ObjectAccessor::GetPlayer(*me, trappedPlayer)) if (Player* player = ObjectAccessor::GetPlayer(*me, _trappedPlayerGUID))
{ {
trappedPlayer = 0; _trappedPlayerGUID = 0;
player->RemoveAurasDueToSpell(SPELL_ICE_TOMB_DAMAGE); player->RemoveAurasDueToSpell(SPELL_ICE_TOMB_DAMAGE);
player->RemoveAurasDueToSpell(SPELL_ASPHYXIATION); player->RemoveAurasDueToSpell(SPELL_ASPHYXIATION);
} }
@@ -524,12 +525,12 @@ class npc_ice_tomb : public CreatureScript
void UpdateAI(uint32 const diff) void UpdateAI(uint32 const diff)
{ {
if (!trappedPlayer) if (!_trappedPlayerGUID)
return; return;
if (existenceCheckTimer <= diff) if (_existenceCheckTimer <= diff)
{ {
Player* player = ObjectAccessor::GetPlayer(*me, trappedPlayer); Player* player = ObjectAccessor::GetPlayer(*me, _trappedPlayerGUID);
if (!player || player->isDead() || !player->HasAura(SPELL_ICE_TOMB_DAMAGE)) if (!player || player->isDead() || !player->HasAura(SPELL_ICE_TOMB_DAMAGE))
{ {
// Remove object // Remove object
@@ -537,20 +538,20 @@ class npc_ice_tomb : public CreatureScript
me->DespawnOrUnsummon(); me->DespawnOrUnsummon();
return; return;
} }
existenceCheckTimer = 1000; _existenceCheckTimer = 1000;
} }
else else
existenceCheckTimer -= diff; _existenceCheckTimer -= diff;
} }
private: private:
uint64 trappedPlayer; uint64 _trappedPlayerGUID;
uint32 existenceCheckTimer; uint32 _existenceCheckTimer;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
{ {
return new npc_ice_tombAI(creature); return GetIcecrownCitadelAI<npc_ice_tombAI>(creature);
} }
}; };
@@ -561,19 +562,19 @@ class npc_spinestalker : public CreatureScript
struct npc_spinestalkerAI : public ScriptedAI struct npc_spinestalkerAI : public ScriptedAI
{ {
npc_spinestalkerAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) npc_spinestalkerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
{ {
} }
void Reset() void Reset()
{ {
events.Reset(); _events.Reset();
events.ScheduleEvent(EVENT_BELLOWING_ROAR, urand(20000, 25000)); _events.ScheduleEvent(EVENT_BELLOWING_ROAR, urand(20000, 25000));
events.ScheduleEvent(EVENT_CLEAVE_SPINESTALKER, urand(10000, 15000)); _events.ScheduleEvent(EVENT_CLEAVE_SPINESTALKER, urand(10000, 15000));
events.ScheduleEvent(EVENT_TAIL_SWEEP, urand(8000, 12000)); _events.ScheduleEvent(EVENT_TAIL_SWEEP, urand(8000, 12000));
me->SetReactState(REACT_DEFENSIVE); me->SetReactState(REACT_DEFENSIVE);
if (instance->GetData(DATA_SPINESTALKER) != 255) if (_instance->GetData(DATA_SPINESTALKER) != 255)
{ {
me->SetFlying(true); me->SetFlying(true);
me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
@@ -583,20 +584,20 @@ class npc_spinestalker : public CreatureScript
void JustRespawned() void JustRespawned()
{ {
ScriptedAI::JustRespawned(); ScriptedAI::JustRespawned();
instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, 1); // this cannot be in Reset because reset also happens on evade _instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, 1); // this cannot be in Reset because reset also happens on evade
} }
void JustDied(Unit* /*killer*/) void JustDied(Unit* /*killer*/)
{ {
events.Reset(); _events.Reset();
instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, 0); _instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, 0);
} }
void DoAction(int32 const action) void DoAction(int32 const action)
{ {
if (action == ACTION_START_FROSTWYRM) if (action == ACTION_START_FROSTWYRM)
{ {
instance->SetData(DATA_SPINESTALKER, 255); _instance->SetData(DATA_SPINESTALKER, 255);
if (me->isDead()) if (me->isDead())
return; return;
@@ -629,26 +630,26 @@ class npc_spinestalker : public CreatureScript
if (!UpdateVictim()) if (!UpdateVictim())
return; return;
events.Update(diff); _events.Update(diff);
if (me->HasUnitState(UNIT_STAT_CASTING)) if (me->HasUnitState(UNIT_STAT_CASTING))
return; return;
while (uint32 eventId = events.ExecuteEvent()) while (uint32 eventId = _events.ExecuteEvent())
{ {
switch (eventId) switch (eventId)
{ {
case EVENT_BELLOWING_ROAR: case EVENT_BELLOWING_ROAR:
DoCast(me, SPELL_BELLOWING_ROAR); DoCast(me, SPELL_BELLOWING_ROAR);
events.ScheduleEvent(EVENT_BELLOWING_ROAR, urand(25000, 30000)); _events.ScheduleEvent(EVENT_BELLOWING_ROAR, urand(25000, 30000));
break; break;
case EVENT_CLEAVE_SPINESTALKER: case EVENT_CLEAVE_SPINESTALKER:
DoCastVictim(SPELL_CLEAVE_SPINESTALKER); DoCastVictim(SPELL_CLEAVE_SPINESTALKER);
events.ScheduleEvent(EVENT_CLEAVE_SPINESTALKER, urand(10000, 15000)); _events.ScheduleEvent(EVENT_CLEAVE_SPINESTALKER, urand(10000, 15000));
break; break;
case EVENT_TAIL_SWEEP: case EVENT_TAIL_SWEEP:
DoCast(me, SPELL_TAIL_SWEEP); DoCast(me, SPELL_TAIL_SWEEP);
events.ScheduleEvent(EVENT_TAIL_SWEEP, urand(22000, 25000)); _events.ScheduleEvent(EVENT_TAIL_SWEEP, urand(22000, 25000));
break; break;
default: default:
break; break;
@@ -659,8 +660,8 @@ class npc_spinestalker : public CreatureScript
} }
private: private:
EventMap events; EventMap _events;
InstanceScript* instance; InstanceScript* _instance;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -676,19 +677,19 @@ class npc_rimefang : public CreatureScript
struct npc_rimefangAI : public ScriptedAI struct npc_rimefangAI : public ScriptedAI
{ {
npc_rimefangAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) npc_rimefangAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
{ {
} }
void Reset() void Reset()
{ {
events.Reset(); _events.Reset();
events.ScheduleEvent(EVENT_FROST_BREATH_RIMEFANG, urand(12000, 15000)); _events.ScheduleEvent(EVENT_FROST_BREATH_RIMEFANG, urand(12000, 15000));
events.ScheduleEvent(EVENT_ICY_BLAST, urand(30000, 35000)); _events.ScheduleEvent(EVENT_ICY_BLAST, urand(30000, 35000));
me->SetReactState(REACT_DEFENSIVE); me->SetReactState(REACT_DEFENSIVE);
icyBlastCounter = 0; _icyBlastCounter = 0;
if (instance->GetData(DATA_RIMEFANG) != 255) if (_instance->GetData(DATA_RIMEFANG) != 255)
{ {
me->SetFlying(true); me->SetFlying(true);
me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
@@ -698,20 +699,20 @@ class npc_rimefang : public CreatureScript
void JustRespawned() void JustRespawned()
{ {
ScriptedAI::JustRespawned(); ScriptedAI::JustRespawned();
instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, 1); // this cannot be in Reset because reset also happens on evade _instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, 1); // this cannot be in Reset because reset also happens on evade
} }
void JustDied(Unit* /*killer*/) void JustDied(Unit* /*killer*/)
{ {
events.Reset(); _events.Reset();
instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, 0); _instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, 0);
} }
void DoAction(int32 const action) void DoAction(int32 const action)
{ {
if (action == ACTION_START_FROSTWYRM) if (action == ACTION_START_FROSTWYRM)
{ {
instance->SetData(DATA_RIMEFANG, 255); _instance->SetData(DATA_RIMEFANG, 255);
if (me->isDead()) if (me->isDead())
return; return;
@@ -749,40 +750,40 @@ class npc_rimefang : public CreatureScript
if (!UpdateVictim()) if (!UpdateVictim())
return; return;
events.Update(diff); _events.Update(diff);
if (me->HasUnitState(UNIT_STAT_CASTING)) if (me->HasUnitState(UNIT_STAT_CASTING))
return; return;
while (uint32 eventId = events.ExecuteEvent()) while (uint32 eventId = _events.ExecuteEvent())
{ {
switch (eventId) switch (eventId)
{ {
case EVENT_FROST_BREATH_RIMEFANG: case EVENT_FROST_BREATH_RIMEFANG:
DoCast(me, SPELL_FROST_BREATH); DoCast(me, SPELL_FROST_BREATH);
events.ScheduleEvent(EVENT_FROST_BREATH_RIMEFANG, urand(35000, 40000)); _events.ScheduleEvent(EVENT_FROST_BREATH_RIMEFANG, urand(35000, 40000));
break; break;
case EVENT_ICY_BLAST: case EVENT_ICY_BLAST:
{ {
icyBlastCounter = RAID_MODE<uint8>(5, 7, 6, 8); _icyBlastCounter = RAID_MODE<uint8>(5, 7, 6, 8);
me->SetReactState(REACT_PASSIVE); me->SetReactState(REACT_PASSIVE);
me->AttackStop(); me->AttackStop();
me->SetFlying(true); me->SetFlying(true);
me->GetMotionMaster()->MovePoint(POINT_FROSTWYRM_FLY_IN, RimefangFlyPos); me->GetMotionMaster()->MovePoint(POINT_FROSTWYRM_FLY_IN, RimefangFlyPos);
float moveTime = me->GetExactDist(&RimefangFlyPos)/(me->GetSpeed(MOVE_FLIGHT)*0.001f); float moveTime = me->GetExactDist(&RimefangFlyPos)/(me->GetSpeed(MOVE_FLIGHT)*0.001f);
events.ScheduleEvent(EVENT_ICY_BLAST, uint64(moveTime) + urand(60000, 70000)); _events.ScheduleEvent(EVENT_ICY_BLAST, uint64(moveTime) + urand(60000, 70000));
events.ScheduleEvent(EVENT_ICY_BLAST_CAST, uint64(moveTime) + 250); _events.ScheduleEvent(EVENT_ICY_BLAST_CAST, uint64(moveTime) + 250);
break; break;
} }
case EVENT_ICY_BLAST_CAST: case EVENT_ICY_BLAST_CAST:
if (--icyBlastCounter) if (--_icyBlastCounter)
{ {
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
{ {
me->SetFacingToObject(target); me->SetFacingToObject(target);
DoCast(target, SPELL_ICY_BLAST); DoCast(target, SPELL_ICY_BLAST);
} }
events.ScheduleEvent(EVENT_ICY_BLAST_CAST, 3000); _events.ScheduleEvent(EVENT_ICY_BLAST_CAST, 3000);
} }
else if (Unit *victim = me->SelectVictim()) else if (Unit *victim = me->SelectVictim())
{ {
@@ -800,9 +801,9 @@ class npc_rimefang : public CreatureScript
} }
private: private:
EventMap events; EventMap _events;
InstanceScript* instance; InstanceScript* _instance;
uint8 icyBlastCounter; uint8 _icyBlastCounter;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -820,15 +821,15 @@ class npc_sindragosa_trash : public CreatureScript
{ {
npc_sindragosa_trashAI(Creature* creature) : ScriptedAI(creature) npc_sindragosa_trashAI(Creature* creature) : ScriptedAI(creature)
{ {
frostwyrmId = (creature->GetHomePosition().GetPositionY() < 2484.35f) ? DATA_RIMEFANG : DATA_SPINESTALKER; _frostwyrmId = (creature->GetHomePosition().GetPositionY() < 2484.35f) ? DATA_RIMEFANG : DATA_SPINESTALKER;
instance = creature->GetInstanceScript(); _instance = creature->GetInstanceScript();
} }
void InitializeAI() void InitializeAI()
{ {
// Increase add count // Increase add count
if (!me->isDead() && instance) if (!me->isDead())
instance->SetData(frostwyrmId, 1); // this cannot be in Reset because reset also happens on evade _instance->SetData(_frostwyrmId, 1); // this cannot be in Reset because reset also happens on evade
} }
void Reset() void Reset()
@@ -836,11 +837,11 @@ class npc_sindragosa_trash : public CreatureScript
// This is shared AI for handler and whelps // This is shared AI for handler and whelps
if (me->GetEntry() == NPC_FROSTWARDEN_HANDLER) if (me->GetEntry() == NPC_FROSTWARDEN_HANDLER)
{ {
events.ScheduleEvent(EVENT_FROSTWARDEN_ORDER_WHELP, 3000); _events.ScheduleEvent(EVENT_FROSTWARDEN_ORDER_WHELP, 3000);
events.ScheduleEvent(EVENT_CONCUSSIVE_SHOCK, urand(8000, 10000)); _events.ScheduleEvent(EVENT_CONCUSSIVE_SHOCK, urand(8000, 10000));
} }
isTaunted = false; _isTaunted = false;
} }
void JustRespawned() void JustRespawned()
@@ -848,29 +849,27 @@ class npc_sindragosa_trash : public CreatureScript
ScriptedAI::JustRespawned(); ScriptedAI::JustRespawned();
// Increase add count // Increase add count
if (instance) _instance->SetData(_frostwyrmId, 1); // this cannot be in Reset because reset also happens on evade
instance->SetData(frostwyrmId, 1); // this cannot be in Reset because reset also happens on evade
} }
void JustDied(Unit* /*killer*/) void JustDied(Unit* /*killer*/)
{ {
// Decrease add count // Decrease add count
if (instance) _instance->SetData(_frostwyrmId, 0);
instance->SetData(frostwyrmId, 0);
} }
void SetData(uint32 type, uint32 data) void SetData(uint32 type, uint32 data)
{ {
if (type == DATA_WHELP_MARKER) if (type == DATA_WHELP_MARKER)
isTaunted = data != 0; _isTaunted = data != 0;
} }
uint32 GetData(uint32 type) uint32 GetData(uint32 type)
{ {
if (type == DATA_FROSTWYRM_OWNER) if (type == DATA_FROSTWYRM_OWNER)
return frostwyrmId; return _frostwyrmId;
else if (type == DATA_WHELP_MARKER) else if (type == DATA_WHELP_MARKER)
return uint32(isTaunted); return uint32(_isTaunted);
return 0; return 0;
} }
@@ -879,22 +878,22 @@ class npc_sindragosa_trash : public CreatureScript
if (!UpdateVictim()) if (!UpdateVictim())
return; return;
events.Update(diff); _events.Update(diff);
if (me->HasUnitState(UNIT_STAT_CASTING)) if (me->HasUnitState(UNIT_STAT_CASTING))
return; return;
while (uint32 eventId = events.ExecuteEvent()) while (uint32 eventId = _events.ExecuteEvent())
{ {
switch (eventId) switch (eventId)
{ {
case EVENT_FROSTWARDEN_ORDER_WHELP: case EVENT_FROSTWARDEN_ORDER_WHELP:
DoCast(me, SPELL_ORDER_WHELP); DoCast(me, SPELL_ORDER_WHELP);
events.ScheduleEvent(EVENT_FROSTWARDEN_ORDER_WHELP, 3000); _events.ScheduleEvent(EVENT_FROSTWARDEN_ORDER_WHELP, 3000);
break; break;
case EVENT_CONCUSSIVE_SHOCK: case EVENT_CONCUSSIVE_SHOCK:
DoCast(me, SPELL_CONCUSSIVE_SHOCK); DoCast(me, SPELL_CONCUSSIVE_SHOCK);
events.ScheduleEvent(EVENT_CONCUSSIVE_SHOCK, urand(10000, 13000)); _events.ScheduleEvent(EVENT_CONCUSSIVE_SHOCK, urand(10000, 13000));
break; break;
default: default:
break; break;
@@ -905,15 +904,15 @@ class npc_sindragosa_trash : public CreatureScript
} }
private: private:
EventMap events; EventMap _events;
InstanceScript* instance; InstanceScript* _instance;
uint32 frostwyrmId; uint32 _frostwyrmId;
bool isTaunted; // Frostwing Whelp only bool _isTaunted; // Frostwing Whelp only
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
{ {
return new npc_sindragosa_trashAI(creature); return GetIcecrownCitadelAI<npc_sindragosa_trashAI>(creature);
} }
}; };
@@ -928,13 +927,13 @@ class spell_sindragosa_s_fury : public SpellScriptLoader
bool Load() bool Load()
{ {
targetCount = 0; _targetCount = 0;
return true; return true;
} }
void CountTargets(std::list<Unit*>& unitList) void CountTargets(std::list<Unit*>& unitList)
{ {
targetCount = unitList.size(); _targetCount = unitList.size();
} }
void HandleDummy(SpellEffIndex effIndex) void HandleDummy(SpellEffIndex effIndex)
@@ -948,7 +947,7 @@ class spell_sindragosa_s_fury : public SpellScriptLoader
uint32 minResistFactor = uint32((resistance / (resistance + 510.0f))* 10.0f) * 2; uint32 minResistFactor = uint32((resistance / (resistance + 510.0f))* 10.0f) * 2;
uint32 randomResist = urand(0, (9 - minResistFactor) * 100)/100 + minResistFactor; uint32 randomResist = urand(0, (9 - minResistFactor) * 100)/100 + minResistFactor;
uint32 damage = (uint32(GetEffectValue()/targetCount) * randomResist) / 10; uint32 damage = (uint32(GetEffectValue()/_targetCount) * randomResist) / 10;
SpellNonMeleeDamage damageInfo(GetCaster(), GetHitUnit(), GetSpellInfo()->Id, GetSpellInfo()->SchoolMask); SpellNonMeleeDamage damageInfo(GetCaster(), GetHitUnit(), GetSpellInfo()->Id, GetSpellInfo()->SchoolMask);
damageInfo.damage = damage; damageInfo.damage = damage;
@@ -962,7 +961,7 @@ class spell_sindragosa_s_fury : public SpellScriptLoader
OnUnitTargetSelect += SpellUnitTargetFn(spell_sindragosa_s_fury_SpellScript::CountTargets, EFFECT_1, TARGET_UNIT_AREA_ENTRY_DST); OnUnitTargetSelect += SpellUnitTargetFn(spell_sindragosa_s_fury_SpellScript::CountTargets, EFFECT_1, TARGET_UNIT_AREA_ENTRY_DST);
} }
uint32 targetCount; uint32 _targetCount;
}; };
SpellScript* GetSpellScript() const SpellScript* GetSpellScript() const
@@ -1149,22 +1148,23 @@ class spell_sindragosa_ice_tomb : public SpellScriptLoader
class FrostBombTargetSelector class FrostBombTargetSelector
{ {
public: public:
FrostBombTargetSelector(Unit* _caster, std::list<Creature*> const& _collisionList) : caster(_caster), collisionList(_collisionList) { } FrostBombTargetSelector(Unit* caster, std::list<Creature*> const& collisionList) : _caster(caster), _collisionList(collisionList) { }
bool operator()(Unit* unit) bool operator()(Unit* unit)
{ {
if (unit->HasAura(SPELL_ICE_TOMB_DAMAGE)) if (unit->HasAura(SPELL_ICE_TOMB_DAMAGE))
return true; return true;
for (std::list<Creature*>::const_iterator itr = collisionList.begin(); itr != collisionList.end(); ++itr) for (std::list<Creature*>::const_iterator itr = _collisionList.begin(); itr != _collisionList.end(); ++itr)
if ((*itr)->IsInBetween(caster, unit)) if ((*itr)->IsInBetween(_caster, unit))
return true; return true;
return false; return false;
} }
Unit* caster; private:
std::list<Creature*> const& collisionList; Unit* _caster;
std::list<Creature*> const& _collisionList;
}; };
class spell_sindragosa_collision_filter : public SpellScriptLoader class spell_sindragosa_collision_filter : public SpellScriptLoader
@@ -1275,17 +1275,17 @@ class spell_rimefang_icy_blast : public SpellScriptLoader
class OrderWhelpTargetSelector class OrderWhelpTargetSelector
{ {
public: public:
explicit OrderWhelpTargetSelector(Creature* _owner) : owner(_owner) { } explicit OrderWhelpTargetSelector(Creature* owner) : _owner(owner) { }
bool operator()(Creature* creature) bool operator()(Creature* creature)
{ {
if (!creature->AI()->GetData(DATA_WHELP_MARKER) && creature->AI()->GetData(DATA_FROSTWYRM_OWNER) == owner->AI()->GetData(DATA_FROSTWYRM_OWNER)) if (!creature->AI()->GetData(DATA_WHELP_MARKER) && creature->AI()->GetData(DATA_FROSTWYRM_OWNER) == _owner->AI()->GetData(DATA_FROSTWYRM_OWNER))
return false; return false;
return true; return true;
} }
private: private:
Creature* owner; Creature* _owner;
}; };
class spell_frostwarden_handler_order_whelp : public SpellScriptLoader class spell_frostwarden_handler_order_whelp : public SpellScriptLoader
@@ -81,7 +81,7 @@ enum Spells
SPELL_HARVEST_BLIGHT_SPECIMEN25 = 72162, SPELL_HARVEST_BLIGHT_SPECIMEN25 = 72162,
}; };
enum Events enum EventTypes
{ {
// Highlord Tirion Fordring (at Light's Hammer) // Highlord Tirion Fordring (at Light's Hammer)
// The Lich King (at Light's Hammer) // The Lich King (at Light's Hammer)
@@ -120,6 +120,7 @@ enum Events
// Frost Freeze Trap // Frost Freeze Trap
EVENT_ACTIVATE_TRAP = 28, EVENT_ACTIVATE_TRAP = 28,
}; };
enum DataTypesICC enum DataTypesICC
@@ -135,13 +136,13 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript
struct npc_highlord_tirion_fordringAI : public ScriptedAI struct npc_highlord_tirion_fordringAI : public ScriptedAI
{ {
npc_highlord_tirion_fordringAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) npc_highlord_tirion_fordringAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
{ {
} }
void Reset() void Reset()
{ {
events.Reset(); _events.Reset();
_theLichKing = 0; _theLichKing = 0;
_bolvarFordragon = 0; _bolvarFordragon = 0;
_factionNPC = 0; _factionNPC = 0;
@@ -160,7 +161,7 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript
{ {
if (Creature* bolvarFordragon = me->FindNearestCreature(NPC_HIGHLORD_BOLVAR_FORDRAGON_LH, 150.0f)) if (Creature* bolvarFordragon = me->FindNearestCreature(NPC_HIGHLORD_BOLVAR_FORDRAGON_LH, 150.0f))
{ {
if (Creature* factionNPC = me->FindNearestCreature(instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE ? NPC_SE_HIGH_OVERLORD_SAURFANG : NPC_SE_MURADIN_BRONZEBEARD, 50.0f)) if (Creature* factionNPC = me->FindNearestCreature(_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE ? NPC_SE_HIGH_OVERLORD_SAURFANG : NPC_SE_MURADIN_BRONZEBEARD, 50.0f))
{ {
me->setActive(true); me->setActive(true);
_theLichKing = theLichKing->GetGUID(); _theLichKing = theLichKing->GetGUID();
@@ -177,36 +178,36 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript
return; return;
Talk(SAY_TIRION_INTRO_1); Talk(SAY_TIRION_INTRO_1);
events.ScheduleEvent(EVENT_TIRION_INTRO_2, 4000); _events.ScheduleEvent(EVENT_TIRION_INTRO_2, 4000);
events.ScheduleEvent(EVENT_TIRION_INTRO_3, 14000); _events.ScheduleEvent(EVENT_TIRION_INTRO_3, 14000);
events.ScheduleEvent(EVENT_TIRION_INTRO_4, 18000); _events.ScheduleEvent(EVENT_TIRION_INTRO_4, 18000);
events.ScheduleEvent(EVENT_TIRION_INTRO_5, 31000); _events.ScheduleEvent(EVENT_TIRION_INTRO_5, 31000);
events.ScheduleEvent(EVENT_LK_INTRO_1, 35000); _events.ScheduleEvent(EVENT_LK_INTRO_1, 35000);
events.ScheduleEvent(EVENT_TIRION_INTRO_6, 51000); _events.ScheduleEvent(EVENT_TIRION_INTRO_6, 51000);
events.ScheduleEvent(EVENT_LK_INTRO_2, 58000); _events.ScheduleEvent(EVENT_LK_INTRO_2, 58000);
events.ScheduleEvent(EVENT_LK_INTRO_3, 74000); _events.ScheduleEvent(EVENT_LK_INTRO_3, 74000);
events.ScheduleEvent(EVENT_LK_INTRO_4, 86000); _events.ScheduleEvent(EVENT_LK_INTRO_4, 86000);
events.ScheduleEvent(EVENT_BOLVAR_INTRO_1, 100000); _events.ScheduleEvent(EVENT_BOLVAR_INTRO_1, 100000);
events.ScheduleEvent(EVENT_LK_INTRO_5, 108000); _events.ScheduleEvent(EVENT_LK_INTRO_5, 108000);
if (instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE) if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
{ {
events.ScheduleEvent(EVENT_SAURFANG_INTRO_1, 120000); _events.ScheduleEvent(EVENT_SAURFANG_INTRO_1, 120000);
events.ScheduleEvent(EVENT_TIRION_INTRO_H_7, 129000); _events.ScheduleEvent(EVENT_TIRION_INTRO_H_7, 129000);
events.ScheduleEvent(EVENT_SAURFANG_INTRO_2, 139000); _events.ScheduleEvent(EVENT_SAURFANG_INTRO_2, 139000);
events.ScheduleEvent(EVENT_SAURFANG_INTRO_3, 150000); _events.ScheduleEvent(EVENT_SAURFANG_INTRO_3, 150000);
events.ScheduleEvent(EVENT_SAURFANG_INTRO_4, 162000); _events.ScheduleEvent(EVENT_SAURFANG_INTRO_4, 162000);
events.ScheduleEvent(EVENT_SAURFANG_RUN, 170000); _events.ScheduleEvent(EVENT_SAURFANG_RUN, 170000);
} }
else else
{ {
events.ScheduleEvent(EVENT_MURADIN_INTRO_1, 120000); _events.ScheduleEvent(EVENT_MURADIN_INTRO_1, 120000);
events.ScheduleEvent(EVENT_MURADIN_INTRO_2, 124000); _events.ScheduleEvent(EVENT_MURADIN_INTRO_2, 124000);
events.ScheduleEvent(EVENT_MURADIN_INTRO_3, 127000); _events.ScheduleEvent(EVENT_MURADIN_INTRO_3, 127000);
events.ScheduleEvent(EVENT_TIRION_INTRO_A_7, 136000); _events.ScheduleEvent(EVENT_TIRION_INTRO_A_7, 136000);
events.ScheduleEvent(EVENT_MURADIN_INTRO_4, 144000); _events.ScheduleEvent(EVENT_MURADIN_INTRO_4, 144000);
events.ScheduleEvent(EVENT_MURADIN_INTRO_5, 151000); _events.ScheduleEvent(EVENT_MURADIN_INTRO_5, 151000);
events.ScheduleEvent(EVENT_MURADIN_RUN, 157000); _events.ScheduleEvent(EVENT_MURADIN_RUN, 157000);
} }
} }
} }
@@ -217,9 +218,9 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript
if (_damnedKills != 2) if (_damnedKills != 2)
return; return;
events.Update(diff); _events.Update(diff);
while (uint32 eventId = events.ExecuteEvent()) while (uint32 eventId = _events.ExecuteEvent())
{ {
switch (eventId) switch (eventId)
{ {
@@ -325,8 +326,8 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript
} }
private: private:
EventMap events; EventMap _events;
InstanceScript* const instance; InstanceScript* const _instance;
uint64 _theLichKing; uint64 _theLichKing;
uint64 _bolvarFordragon; uint64 _bolvarFordragon;
uint64 _factionNPC; uint64 _factionNPC;
@@ -352,15 +353,15 @@ class npc_rotting_frost_giant : public CreatureScript
void Reset() void Reset()
{ {
events.Reset(); _events.Reset();
events.ScheduleEvent(EVENT_DEATH_PLAGUE, 15000); _events.ScheduleEvent(EVENT_DEATH_PLAGUE, 15000);
events.ScheduleEvent(EVENT_STOMP, urand(5000, 8000)); _events.ScheduleEvent(EVENT_STOMP, urand(5000, 8000));
events.ScheduleEvent(EVENT_ARCTIC_BREATH, urand(10000, 15000)); _events.ScheduleEvent(EVENT_ARCTIC_BREATH, urand(10000, 15000));
} }
void JustDied(Unit* /*killer*/) void JustDied(Unit* /*killer*/)
{ {
events.Reset(); _events.Reset();
} }
void UpdateAI(uint32 const diff) void UpdateAI(uint32 const diff)
@@ -368,12 +369,12 @@ class npc_rotting_frost_giant : public CreatureScript
if (!UpdateVictim()) if (!UpdateVictim())
return; return;
events.Update(diff); _events.Update(diff);
if (me->HasUnitState(UNIT_STAT_CASTING)) if (me->HasUnitState(UNIT_STAT_CASTING))
return; return;
while (uint32 eventId = events.ExecuteEvent()) while (uint32 eventId = _events.ExecuteEvent())
{ {
switch (eventId) switch (eventId)
{ {
@@ -383,15 +384,15 @@ class npc_rotting_frost_giant : public CreatureScript
Talk(EMOTE_DEATH_PLAGUE_WARNING, target->GetGUID()); Talk(EMOTE_DEATH_PLAGUE_WARNING, target->GetGUID());
DoCast(target, SPELL_DEATH_PLAGUE); DoCast(target, SPELL_DEATH_PLAGUE);
} }
events.ScheduleEvent(EVENT_DEATH_PLAGUE, 15000); _events.ScheduleEvent(EVENT_DEATH_PLAGUE, 15000);
break; break;
case EVENT_STOMP: case EVENT_STOMP:
DoCastVictim(SPELL_STOMP); DoCastVictim(SPELL_STOMP);
events.ScheduleEvent(EVENT_STOMP, urand(15000, 18000)); _events.ScheduleEvent(EVENT_STOMP, urand(15000, 18000));
break; break;
case EVENT_ARCTIC_BREATH: case EVENT_ARCTIC_BREATH:
DoCastVictim(SPELL_ARCTIC_BREATH); DoCastVictim(SPELL_ARCTIC_BREATH);
events.ScheduleEvent(EVENT_ARCTIC_BREATH, urand(26000, 33000)); _events.ScheduleEvent(EVENT_ARCTIC_BREATH, urand(26000, 33000));
break; break;
default: default:
break; break;
@@ -402,7 +403,7 @@ class npc_rotting_frost_giant : public CreatureScript
} }
private: private:
EventMap events; EventMap _events;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -428,11 +429,11 @@ class npc_frost_freeze_trap : public CreatureScript
{ {
case 1000: case 1000:
case 11000: case 11000:
events.ScheduleEvent(EVENT_ACTIVATE_TRAP, uint32(action)); _events.ScheduleEvent(EVENT_ACTIVATE_TRAP, uint32(action));
break; break;
case ACTION_STOP_TRAPS: case ACTION_STOP_TRAPS:
me->RemoveAurasDueToSpell(SPELL_COLDFLAME_JETS); me->RemoveAurasDueToSpell(SPELL_COLDFLAME_JETS);
events.CancelEvent(EVENT_ACTIVATE_TRAP); _events.CancelEvent(EVENT_ACTIVATE_TRAP);
break; break;
default: default:
break; break;
@@ -441,17 +442,17 @@ class npc_frost_freeze_trap : public CreatureScript
void UpdateAI(uint32 const diff) void UpdateAI(uint32 const diff)
{ {
events.Update(diff); _events.Update(diff);
if (events.ExecuteEvent() == EVENT_ACTIVATE_TRAP) if (_events.ExecuteEvent() == EVENT_ACTIVATE_TRAP)
{ {
DoCast(me, SPELL_COLDFLAME_JETS); DoCast(me, SPELL_COLDFLAME_JETS);
events.ScheduleEvent(EVENT_ACTIVATE_TRAP, 22000); _events.ScheduleEvent(EVENT_ACTIVATE_TRAP, 22000);
} }
} }
private: private:
EventMap events; EventMap _events;
}; };
CreatureAI* GetAI(Creature* creature) const CreatureAI* GetAI(Creature* creature) const
@@ -477,11 +478,11 @@ class npc_alchemist_adrianna : public CreatureScript
class DeathPlagueTargetSelector class DeathPlagueTargetSelector
{ {
public: public:
DeathPlagueTargetSelector(Unit* _caster) : caster(_caster) {} explicit DeathPlagueTargetSelector(Unit* caster) : _caster(caster) {}
bool operator()(Unit* unit) bool operator()(Unit* unit)
{ {
if (unit == caster) if (unit == _caster)
return true; return true;
if (unit->GetTypeId() != TYPEID_PLAYER) if (unit->GetTypeId() != TYPEID_PLAYER)
@@ -493,7 +494,8 @@ class DeathPlagueTargetSelector
return false; return false;
} }
Unit* caster; private:
Unit* _caster;
}; };
class spell_frost_giant_death_plague : public SpellScriptLoader class spell_frost_giant_death_plague : public SpellScriptLoader
@@ -507,7 +509,7 @@ class spell_frost_giant_death_plague : public SpellScriptLoader
bool Load() bool Load()
{ {
failed = false; _failed = false;
return true; return true;
} }
@@ -515,7 +517,7 @@ class spell_frost_giant_death_plague : public SpellScriptLoader
void CountTargets(std::list<Unit*>& unitList) void CountTargets(std::list<Unit*>& unitList)
{ {
unitList.remove(GetCaster()); unitList.remove(GetCaster());
failed = unitList.empty(); _failed = unitList.empty();
} }
// Second effect // Second effect
@@ -540,7 +542,7 @@ class spell_frost_giant_death_plague : public SpellScriptLoader
PreventHitDefaultEffect(effIndex); PreventHitDefaultEffect(effIndex);
if (GetHitUnit() != GetCaster()) if (GetHitUnit() != GetCaster())
GetCaster()->CastSpell(GetHitUnit(), SPELL_DEATH_PLAGUE_AURA, true); GetCaster()->CastSpell(GetHitUnit(), SPELL_DEATH_PLAGUE_AURA, true);
else if (failed) else if (_failed)
GetCaster()->CastSpell(GetCaster(), SPELL_DEATH_PLAGUE_KILL, true); GetCaster()->CastSpell(GetCaster(), SPELL_DEATH_PLAGUE_KILL, true);
} }
@@ -551,7 +553,7 @@ class spell_frost_giant_death_plague : public SpellScriptLoader
OnEffect += SpellEffectFn(spell_frost_giant_death_plague_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); OnEffect += SpellEffectFn(spell_frost_giant_death_plague_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
} }
bool failed; bool _failed;
}; };
SpellScript* GetSpellScript() const SpellScript* GetSpellScript() const
@@ -80,159 +80,159 @@ class instance_icecrown_citadel : public InstanceMapScript
{ {
SetBossNumber(EncounterCount); SetBossNumber(EncounterCount);
LoadDoorData(doorData); LoadDoorData(doorData);
teamInInstance = 0; TeamInInstance = 0;
heroicAttempts = MaxHeroicAttempts; HeroicAttempts = MaxHeroicAttempts;
ladyDeathwisperElevator = 0; LadyDeathwisperElevatorGUID = 0;
deathbringerSaurfang = 0; DeathbringerSaurfangGUID = 0;
saurfangDoor = 0; DeathbringerSaurfangDoorGUID = 0;
saurfangEventNPC = 0; DeathbringerSaurfangEventGUID = 0;
deathbringersCache = 0; DeathbringersCacheGUID = 0;
saurfangTeleport = 0; SaurfangTeleportGUID = 0;
plagueSigil = 0; PlagueSigilGUID = 0;
bloodwingSigil = 0; BloodwingSigilGUID = 0;
frostwingSigil = 0; FrostwingSigilGUID = 0;
memset(putricidePipes, 0, 2*sizeof(uint64)); memset(PutricidePipeGUIDs, 0, 2*sizeof(uint64));
memset(putricideGates, 0, 2*sizeof(uint64)); memset(PutricideGateGUIDs, 0, 2*sizeof(uint64));
putricideCollision = 0; PutricideCollisionGUID = 0;
festergut = 0; FestergutGUID = 0;
rotface = 0; RotfaceGUID = 0;
professorPutricide = 0; ProfessorPutricideGUID = 0;
putricideTable = 0; PutricideTableGUID = 0;
memset(bloodCouncil, 0, 3*sizeof(uint64)); memset(BloodCouncilGUIDs, 0, 3*sizeof(uint64));
bloodCouncilController = 0; BloodCouncilControllerGUID = 0;
bloodQueenLanaThel = 0; BloodQueenLanaThelGUID = 0;
sindragosa = 0; SindragosaGUID = 0;
spinestalker = 0; SpinestalkerGUID = 0;
rimefang = 0; RimefangGUID = 0;
frostwyrms = 0; FrostwyrmCount = 0;
spinestalkerTrash = 0; SpinestalkerTrashCount = 0;
rimefangTrash = 0; RimefangTrashCount = 0;
isBonedEligible = true; IsBonedEligible = true;
isOozeDanceEligible = true; IsOozeDanceEligible = true;
isNauseaEligible = true; IsNauseaEligible = true;
isOrbWhispererEligible = true; IsOrbWhispererEligible = true;
coldflameJetsState = NOT_STARTED; ColdflameJetsState = NOT_STARTED;
bloodQuickeningState = NOT_STARTED; BloodQuickeningState = NOT_STARTED;
bloodQuickeningTimer = 0; BloodQuickeningTimer = 0;
bloodQuickeningMinutes = 0; BloodQuickeningMinutes = 0;
} }
void FillInitialWorldStates(WorldPacket& data) void FillInitialWorldStates(WorldPacket& data)
{ {
data << uint32(WORLDSTATE_SHOW_TIMER) << uint32(bloodQuickeningState == IN_PROGRESS); data << uint32(WORLDSTATE_SHOW_TIMER) << uint32(BloodQuickeningState == IN_PROGRESS);
data << uint32(WORLDSTATE_EXECUTION_TIME) << uint32(bloodQuickeningMinutes); data << uint32(WORLDSTATE_EXECUTION_TIME) << uint32(BloodQuickeningMinutes);
data << uint32(WORLDSTATE_SHOW_ATTEMPTS) << uint32(instance->IsHeroic()); data << uint32(WORLDSTATE_SHOW_ATTEMPTS) << uint32(instance->IsHeroic());
data << uint32(WORLDSTATE_ATTEMPTS_REMAINING) << uint32(heroicAttempts); data << uint32(WORLDSTATE_ATTEMPTS_REMAINING) << uint32(HeroicAttempts);
data << uint32(WORLDSTATE_ATTEMPTS_MAX) << uint32(MaxHeroicAttempts); data << uint32(WORLDSTATE_ATTEMPTS_MAX) << uint32(MaxHeroicAttempts);
} }
void OnPlayerEnter(Player* player) void OnPlayerEnter(Player* player)
{ {
if (!teamInInstance) if (!TeamInInstance)
teamInInstance = player->GetTeam(); TeamInInstance = player->GetTeam();
} }
void OnCreatureCreate(Creature* creature) void OnCreatureCreate(Creature* creature)
{ {
if (!teamInInstance) if (!TeamInInstance)
{ {
Map::PlayerList const &players = instance->GetPlayers(); Map::PlayerList const &players = instance->GetPlayers();
if (!players.isEmpty()) if (!players.isEmpty())
if (Player* player = players.begin()->getSource()) if (Player* player = players.begin()->getSource())
teamInInstance = player->GetTeam(); TeamInInstance = player->GetTeam();
} }
switch (creature->GetEntry()) switch (creature->GetEntry())
{ {
case NPC_KOR_KRON_GENERAL: case NPC_KOR_KRON_GENERAL:
if (teamInInstance == ALLIANCE) if (TeamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_ALLIANCE_COMMANDER, ALLIANCE); creature->UpdateEntry(NPC_ALLIANCE_COMMANDER, ALLIANCE);
break; break;
case NPC_KOR_KRON_LIEUTENANT: case NPC_KOR_KRON_LIEUTENANT:
if (teamInInstance == ALLIANCE) if (TeamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_SKYBREAKER_LIEUTENANT, ALLIANCE); creature->UpdateEntry(NPC_SKYBREAKER_LIEUTENANT, ALLIANCE);
break; break;
case NPC_TORTUNOK: case NPC_TORTUNOK:
if (teamInInstance == ALLIANCE) if (TeamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_ALANA_MOONSTRIKE, ALLIANCE); creature->UpdateEntry(NPC_ALANA_MOONSTRIKE, ALLIANCE);
break; break;
case NPC_GERARDO_THE_SUAVE: case NPC_GERARDO_THE_SUAVE:
if (teamInInstance == ALLIANCE) if (TeamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_TALAN_MOONSTRIKE, ALLIANCE); creature->UpdateEntry(NPC_TALAN_MOONSTRIKE, ALLIANCE);
break; break;
case NPC_UVLUS_BANEFIRE: case NPC_UVLUS_BANEFIRE:
if (teamInInstance == ALLIANCE) if (TeamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_MALFUS_GRIMFROST, ALLIANCE); creature->UpdateEntry(NPC_MALFUS_GRIMFROST, ALLIANCE);
break; break;
case NPC_IKFIRUS_THE_VILE: case NPC_IKFIRUS_THE_VILE:
if (teamInInstance == ALLIANCE) if (TeamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_YILI, ALLIANCE); creature->UpdateEntry(NPC_YILI, ALLIANCE);
break; break;
case NPC_VOL_GUK: case NPC_VOL_GUK:
if (teamInInstance == ALLIANCE) if (TeamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_JEDEBIA, ALLIANCE); creature->UpdateEntry(NPC_JEDEBIA, ALLIANCE);
break; break;
case NPC_HARAGG_THE_UNSEEN: case NPC_HARAGG_THE_UNSEEN:
if (teamInInstance == ALLIANCE) if (TeamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_NIBY_THE_ALMIGHTY, ALLIANCE); creature->UpdateEntry(NPC_NIBY_THE_ALMIGHTY, ALLIANCE);
break; break;
case NPC_GARROSH_HELLSCREAM: case NPC_GARROSH_HELLSCREAM:
if (teamInInstance == ALLIANCE) if (TeamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_KING_VARIAN_WRYNN, ALLIANCE); creature->UpdateEntry(NPC_KING_VARIAN_WRYNN, ALLIANCE);
break; break;
case NPC_DEATHBRINGER_SAURFANG: case NPC_DEATHBRINGER_SAURFANG:
deathbringerSaurfang = creature->GetGUID(); DeathbringerSaurfangGUID = creature->GetGUID();
break; break;
case NPC_SE_HIGH_OVERLORD_SAURFANG: case NPC_SE_HIGH_OVERLORD_SAURFANG:
if (teamInInstance == ALLIANCE) if (TeamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_SE_MURADIN_BRONZEBEARD, ALLIANCE, creature->GetCreatureData()); creature->UpdateEntry(NPC_SE_MURADIN_BRONZEBEARD, ALLIANCE, creature->GetCreatureData());
case NPC_SE_MURADIN_BRONZEBEARD: case NPC_SE_MURADIN_BRONZEBEARD:
saurfangEventNPC = creature->GetGUID(); DeathbringerSaurfangEventGUID = creature->GetGUID();
creature->LastUsedScriptID = creature->GetScriptId(); creature->LastUsedScriptID = creature->GetScriptId();
break; break;
case NPC_SE_KOR_KRON_REAVER: case NPC_SE_KOR_KRON_REAVER:
if (teamInInstance == ALLIANCE) if (TeamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_SE_SKYBREAKER_MARINE, ALLIANCE); creature->UpdateEntry(NPC_SE_SKYBREAKER_MARINE, ALLIANCE);
break; break;
case NPC_FROST_FREEZE_TRAP: case NPC_FROST_FREEZE_TRAP:
coldflameJets.insert(creature->GetGUID()); ColdflameJetGUIDs.insert(creature->GetGUID());
break; break;
case NPC_FESTERGUT: case NPC_FESTERGUT:
festergut = creature->GetGUID(); FestergutGUID = creature->GetGUID();
break; break;
case NPC_ROTFACE: case NPC_ROTFACE:
rotface = creature->GetGUID(); RotfaceGUID = creature->GetGUID();
break; break;
case NPC_PROFESSOR_PUTRICIDE: case NPC_PROFESSOR_PUTRICIDE:
professorPutricide = creature->GetGUID(); ProfessorPutricideGUID = creature->GetGUID();
break; break;
case NPC_PRINCE_KELESETH: case NPC_PRINCE_KELESETH:
bloodCouncil[0] = creature->GetGUID(); BloodCouncilGUIDs[0] = creature->GetGUID();
break; break;
case NPC_PRINCE_TALDARAM: case NPC_PRINCE_TALDARAM:
bloodCouncil[1] = creature->GetGUID(); BloodCouncilGUIDs[1] = creature->GetGUID();
break; break;
case NPC_PRINCE_VALANAR: case NPC_PRINCE_VALANAR:
bloodCouncil[2] = creature->GetGUID(); BloodCouncilGUIDs[2] = creature->GetGUID();
break; break;
case NPC_BLOOD_ORB_CONTROLLER: case NPC_BLOOD_ORB_CONTROLLER:
bloodCouncilController = creature->GetGUID(); BloodCouncilControllerGUID = creature->GetGUID();
break; break;
case NPC_BLOOD_QUEEN_LANA_THEL: case NPC_BLOOD_QUEEN_LANA_THEL:
bloodQueenLanaThel = creature->GetGUID(); BloodQueenLanaThelGUID = creature->GetGUID();
break; break;
case NPC_SINDRAGOSA: case NPC_SINDRAGOSA:
sindragosa = creature->GetGUID(); SindragosaGUID = creature->GetGUID();
break; break;
case NPC_SPINESTALKER: case NPC_SPINESTALKER:
spinestalker = creature->GetGUID(); SpinestalkerGUID = creature->GetGUID();
if (!creature->isDead()) if (!creature->isDead())
++frostwyrms; ++FrostwyrmCount;
break; break;
case NPC_RIMEFANG: case NPC_RIMEFANG:
rimefang = creature->GetGUID(); RimefangGUID = creature->GetGUID();
if (!creature->isDead()) if (!creature->isDead())
++frostwyrms; ++FrostwyrmCount;
break; break;
default: default:
break; break;
@@ -275,7 +275,7 @@ class instance_icecrown_citadel : public InstanceMapScript
void OnCreatureRemove(Creature* creature) void OnCreatureRemove(Creature* creature)
{ {
if (creature->GetEntry() == NPC_FROST_FREEZE_TRAP) if (creature->GetEntry() == NPC_FROST_FREEZE_TRAP)
coldflameJets.erase(creature->GetGUID()); ColdflameJetGUIDs.erase(creature->GetGUID());
} }
void OnGameObjectCreate(GameObject* go) void OnGameObjectCreate(GameObject* go)
@@ -303,7 +303,7 @@ class instance_icecrown_citadel : public InstanceMapScript
AddDoor(go, true); AddDoor(go, true);
break; break;
case GO_LADY_DEATHWHISPER_ELEVATOR: case GO_LADY_DEATHWHISPER_ELEVATOR:
ladyDeathwisperElevator = go->GetGUID(); LadyDeathwisperElevatorGUID = go->GetGUID();
if (GetBossState(DATA_LADY_DEATHWHISPER) == DONE) if (GetBossState(DATA_LADY_DEATHWHISPER) == DONE)
{ {
go->SetUInt32Value(GAMEOBJECT_LEVEL, 0); go->SetUInt32Value(GAMEOBJECT_LEVEL, 0);
@@ -311,64 +311,64 @@ class instance_icecrown_citadel : public InstanceMapScript
} }
break; break;
case GO_SAURFANG_S_DOOR: case GO_SAURFANG_S_DOOR:
saurfangDoor = go->GetGUID(); DeathbringerSaurfangDoorGUID = go->GetGUID();
AddDoor(go, true); AddDoor(go, true);
break; break;
case GO_DEATHBRINGER_S_CACHE_10N: case GO_DEATHBRINGER_S_CACHE_10N:
case GO_DEATHBRINGER_S_CACHE_25N: case GO_DEATHBRINGER_S_CACHE_25N:
case GO_DEATHBRINGER_S_CACHE_10H: case GO_DEATHBRINGER_S_CACHE_10H:
case GO_DEATHBRINGER_S_CACHE_25H: case GO_DEATHBRINGER_S_CACHE_25H:
deathbringersCache = go->GetGUID(); DeathbringersCacheGUID = go->GetGUID();
break; break;
case GO_SCOURGE_TRANSPORTER_SAURFANG: case GO_SCOURGE_TRANSPORTER_SAURFANG:
saurfangTeleport = go->GetGUID(); SaurfangTeleportGUID = go->GetGUID();
break; break;
case GO_PLAGUE_SIGIL: case GO_PLAGUE_SIGIL:
plagueSigil = go->GetGUID(); PlagueSigilGUID = go->GetGUID();
if (GetBossState(DATA_PROFESSOR_PUTRICIDE) == DONE) if (GetBossState(DATA_PROFESSOR_PUTRICIDE) == DONE)
HandleGameObject(plagueSigil, false, go); HandleGameObject(PlagueSigilGUID, false, go);
break; break;
case GO_BLOODWING_SIGIL: case GO_BLOODWING_SIGIL:
bloodwingSigil = go->GetGUID(); BloodwingSigilGUID = go->GetGUID();
if (GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == DONE) if (GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == DONE)
HandleGameObject(bloodwingSigil, false, go); HandleGameObject(BloodwingSigilGUID, false, go);
break; break;
case GO_SIGIL_OF_THE_FROSTWING: case GO_SIGIL_OF_THE_FROSTWING:
frostwingSigil = go->GetGUID(); FrostwingSigilGUID = go->GetGUID();
if (GetBossState(DATA_SINDRAGOSA) == DONE) if (GetBossState(DATA_SINDRAGOSA) == DONE)
HandleGameObject(frostwingSigil, false, go); HandleGameObject(FrostwingSigilGUID, false, go);
break; break;
case GO_SCIENTIST_AIRLOCK_DOOR_COLLISION: case GO_SCIENTIST_AIRLOCK_DOOR_COLLISION:
putricideCollision = go->GetGUID(); PutricideCollisionGUID = go->GetGUID();
if (GetBossState(DATA_FESTERGUT) == DONE && GetBossState(DATA_ROTFACE) == DONE) if (GetBossState(DATA_FESTERGUT) == DONE && GetBossState(DATA_ROTFACE) == DONE)
HandleGameObject(putricideCollision, true, go); HandleGameObject(PutricideCollisionGUID, true, go);
break; break;
case GO_SCIENTIST_AIRLOCK_DOOR_ORANGE: case GO_SCIENTIST_AIRLOCK_DOOR_ORANGE:
putricideGates[0] = go->GetGUID(); PutricideGateGUIDs[0] = go->GetGUID();
if (GetBossState(DATA_FESTERGUT) == DONE && GetBossState(DATA_ROTFACE) == DONE) if (GetBossState(DATA_FESTERGUT) == DONE && GetBossState(DATA_ROTFACE) == DONE)
go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
else if (GetBossState(DATA_FESTERGUT) == DONE) else if (GetBossState(DATA_FESTERGUT) == DONE)
HandleGameObject(putricideGates[1], false, go); HandleGameObject(PutricideGateGUIDs[1], false, go);
break; break;
case GO_SCIENTIST_AIRLOCK_DOOR_GREEN: case GO_SCIENTIST_AIRLOCK_DOOR_GREEN:
putricideGates[1] = go->GetGUID(); PutricideGateGUIDs[1] = go->GetGUID();
if (GetBossState(DATA_ROTFACE) == DONE && GetBossState(DATA_FESTERGUT) == DONE) if (GetBossState(DATA_ROTFACE) == DONE && GetBossState(DATA_FESTERGUT) == DONE)
go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
else if (GetBossState(DATA_ROTFACE) == DONE) else if (GetBossState(DATA_ROTFACE) == DONE)
HandleGameObject(putricideGates[1], false, go); HandleGameObject(PutricideGateGUIDs[1], false, go);
break; break;
case GO_DOODAD_ICECROWN_ORANGETUBES02: case GO_DOODAD_ICECROWN_ORANGETUBES02:
putricidePipes[0] = go->GetGUID(); PutricidePipeGUIDs[0] = go->GetGUID();
if (GetBossState(DATA_FESTERGUT) == DONE) if (GetBossState(DATA_FESTERGUT) == DONE)
HandleGameObject(putricidePipes[0], true, go); HandleGameObject(PutricidePipeGUIDs[0], true, go);
break; break;
case GO_DOODAD_ICECROWN_GREENTUBES02: case GO_DOODAD_ICECROWN_GREENTUBES02:
putricidePipes[1] = go->GetGUID(); PutricidePipeGUIDs[1] = go->GetGUID();
if (GetBossState(DATA_ROTFACE) == DONE) if (GetBossState(DATA_ROTFACE) == DONE)
HandleGameObject(putricidePipes[1], true, go); HandleGameObject(PutricidePipeGUIDs[1], true, go);
break; break;
case GO_DRINK_ME: case GO_DRINK_ME:
putricideTable = go->GetGUID(); PutricideTableGUID = go->GetGUID();
break; break;
default: default:
break; break;
@@ -410,19 +410,19 @@ class instance_icecrown_citadel : public InstanceMapScript
switch (type) switch (type)
{ {
case DATA_SINDRAGOSA_FROSTWYRMS: case DATA_SINDRAGOSA_FROSTWYRMS:
return frostwyrms; return FrostwyrmCount;
case DATA_SPINESTALKER: case DATA_SPINESTALKER:
return spinestalkerTrash; return SpinestalkerTrashCount;
case DATA_RIMEFANG: case DATA_RIMEFANG:
return rimefangTrash; return RimefangTrashCount;
case DATA_COLDFLAME_JETS: case DATA_COLDFLAME_JETS:
return coldflameJetsState; return ColdflameJetsState;
case DATA_TEAM_IN_INSTANCE: case DATA_TEAM_IN_INSTANCE:
return teamInInstance; return TeamInInstance;
case DATA_BLOOD_QUICKENING_STATE: case DATA_BLOOD_QUICKENING_STATE:
return bloodQuickeningState; return BloodQuickeningState;
case DATA_HEROIC_ATTEMPTS: case DATA_HEROIC_ATTEMPTS:
return heroicAttempts; return HeroicAttempts;
default: default:
break; break;
} }
@@ -435,37 +435,37 @@ class instance_icecrown_citadel : public InstanceMapScript
switch (type) switch (type)
{ {
case DATA_DEATHBRINGER_SAURFANG: case DATA_DEATHBRINGER_SAURFANG:
return deathbringerSaurfang; return DeathbringerSaurfangGUID;
case DATA_SAURFANG_EVENT_NPC: case DATA_SAURFANG_EVENT_NPC:
return saurfangEventNPC; return DeathbringerSaurfangEventGUID;
case GO_SAURFANG_S_DOOR: case GO_SAURFANG_S_DOOR:
return saurfangDoor; return DeathbringerSaurfangDoorGUID;
case GO_SCOURGE_TRANSPORTER_SAURFANG: case GO_SCOURGE_TRANSPORTER_SAURFANG:
return saurfangTeleport; return SaurfangTeleportGUID;
case DATA_FESTERGUT: case DATA_FESTERGUT:
return festergut; return FestergutGUID;
case DATA_ROTFACE: case DATA_ROTFACE:
return rotface; return RotfaceGUID;
case DATA_PROFESSOR_PUTRICIDE: case DATA_PROFESSOR_PUTRICIDE:
return professorPutricide; return ProfessorPutricideGUID;
case DATA_PUTRICIDE_TABLE: case DATA_PUTRICIDE_TABLE:
return putricideTable; return PutricideTableGUID;
case DATA_PRINCE_KELESETH_GUID: case DATA_PRINCE_KELESETH_GUID:
return bloodCouncil[0]; return BloodCouncilGUIDs[0];
case DATA_PRINCE_TALDARAM_GUID: case DATA_PRINCE_TALDARAM_GUID:
return bloodCouncil[1]; return BloodCouncilGUIDs[1];
case DATA_PRINCE_VALANAR_GUID: case DATA_PRINCE_VALANAR_GUID:
return bloodCouncil[2]; return BloodCouncilGUIDs[2];
case DATA_BLOOD_PRINCES_CONTROL: case DATA_BLOOD_PRINCES_CONTROL:
return bloodCouncilController; return BloodCouncilControllerGUID;
case DATA_BLOOD_QUEEN_LANA_THEL: case DATA_BLOOD_QUEEN_LANA_THEL:
return bloodQueenLanaThel; return BloodQueenLanaThelGUID;
case DATA_SINDRAGOSA: case DATA_SINDRAGOSA:
return sindragosa; return SindragosaGUID;
case DATA_SPINESTALKER: case DATA_SPINESTALKER:
return spinestalker; return SpinestalkerGUID;
case DATA_RIMEFANG: case DATA_RIMEFANG:
return rimefang; return RimefangGUID;
default: default:
break; break;
} }
@@ -484,7 +484,7 @@ class instance_icecrown_citadel : public InstanceMapScript
SetBossState(DATA_GUNSHIP_EVENT, state); // TEMP HACK UNTIL GUNSHIP SCRIPTED SetBossState(DATA_GUNSHIP_EVENT, state); // TEMP HACK UNTIL GUNSHIP SCRIPTED
if (state == DONE) if (state == DONE)
{ {
if (GameObject* elevator = instance->GetGameObject(ladyDeathwisperElevator)) if (GameObject* elevator = instance->GetGameObject(LadyDeathwisperElevatorGUID))
{ {
elevator->SetUInt32Value(GAMEOBJECT_LEVEL, 0); elevator->SetUInt32Value(GAMEOBJECT_LEVEL, 0);
elevator->SetGoState(GO_STATE_READY); elevator->SetGoState(GO_STATE_READY);
@@ -495,11 +495,11 @@ class instance_icecrown_citadel : public InstanceMapScript
switch (state) switch (state)
{ {
case DONE: case DONE:
DoRespawnGameObject(deathbringersCache, 7*DAY); DoRespawnGameObject(DeathbringersCacheGUID, 7*DAY);
case NOT_STARTED: case NOT_STARTED:
if (GameObject* teleporter = instance->GetGameObject(saurfangTeleport)) if (GameObject* teleporter = instance->GetGameObject(SaurfangTeleportGUID))
{ {
HandleGameObject(saurfangTeleport, true, teleporter); HandleGameObject(SaurfangTeleportGUID, true, teleporter);
teleporter->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); teleporter->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
} }
break; break;
@@ -512,15 +512,15 @@ class instance_icecrown_citadel : public InstanceMapScript
{ {
if (GetBossState(DATA_ROTFACE) == DONE) if (GetBossState(DATA_ROTFACE) == DONE)
{ {
HandleGameObject(putricideCollision, true); HandleGameObject(PutricideCollisionGUID, true);
if (GameObject* go = instance->GetGameObject(putricideGates[0])) if (GameObject* go = instance->GetGameObject(PutricideGateGUIDs[0]))
go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
if (GameObject* go = instance->GetGameObject(putricideGates[1])) if (GameObject* go = instance->GetGameObject(PutricideGateGUIDs[1]))
go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
} }
else else
HandleGameObject(putricideGates[0], false); HandleGameObject(PutricideGateGUIDs[0], false);
HandleGameObject(putricidePipes[0], true); HandleGameObject(PutricidePipeGUIDs[0], true);
} }
break; break;
case DATA_ROTFACE: case DATA_ROTFACE:
@@ -528,41 +528,41 @@ class instance_icecrown_citadel : public InstanceMapScript
{ {
if (GetBossState(DATA_FESTERGUT) == DONE) if (GetBossState(DATA_FESTERGUT) == DONE)
{ {
HandleGameObject(putricideCollision, true); HandleGameObject(PutricideCollisionGUID, true);
if (GameObject* go = instance->GetGameObject(putricideGates[0])) if (GameObject* go = instance->GetGameObject(PutricideGateGUIDs[0]))
go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
if (GameObject* go = instance->GetGameObject(putricideGates[1])) if (GameObject* go = instance->GetGameObject(PutricideGateGUIDs[1]))
go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); go->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
} }
else else
HandleGameObject(putricideGates[1], false); HandleGameObject(PutricideGateGUIDs[1], false);
HandleGameObject(putricidePipes[1], true); HandleGameObject(PutricidePipeGUIDs[1], true);
} }
break; break;
case DATA_PROFESSOR_PUTRICIDE: case DATA_PROFESSOR_PUTRICIDE:
HandleGameObject(plagueSigil, state != DONE); HandleGameObject(PlagueSigilGUID, state != DONE);
if (instance->IsHeroic()) if (instance->IsHeroic())
{ {
if (state == FAIL && heroicAttempts) if (state == FAIL && HeroicAttempts)
{ {
--heroicAttempts; --HeroicAttempts;
DoUpdateWorldState(WORLDSTATE_ATTEMPTS_REMAINING, heroicAttempts); DoUpdateWorldState(WORLDSTATE_ATTEMPTS_REMAINING, HeroicAttempts);
if (!heroicAttempts) if (!HeroicAttempts)
if (Creature* putricide = instance->GetCreature(professorPutricide)) if (Creature* putricide = instance->GetCreature(ProfessorPutricideGUID))
putricide->DespawnOrUnsummon(); putricide->DespawnOrUnsummon();
} }
} }
break; break;
case DATA_BLOOD_QUEEN_LANA_THEL: case DATA_BLOOD_QUEEN_LANA_THEL:
HandleGameObject(bloodwingSigil, state != DONE); HandleGameObject(BloodwingSigilGUID, state != DONE);
if (instance->IsHeroic()) if (instance->IsHeroic())
{ {
if (state == FAIL && heroicAttempts) if (state == FAIL && HeroicAttempts)
{ {
--heroicAttempts; --HeroicAttempts;
DoUpdateWorldState(WORLDSTATE_ATTEMPTS_REMAINING, heroicAttempts); DoUpdateWorldState(WORLDSTATE_ATTEMPTS_REMAINING, HeroicAttempts);
if (!heroicAttempts) if (!HeroicAttempts)
if (Creature* bq = instance->GetCreature(bloodQueenLanaThel)) if (Creature* bq = instance->GetCreature(BloodQueenLanaThelGUID))
bq->DespawnOrUnsummon(); bq->DespawnOrUnsummon();
} }
} }
@@ -570,15 +570,15 @@ class instance_icecrown_citadel : public InstanceMapScript
case DATA_VALITHRIA_DREAMWALKER: case DATA_VALITHRIA_DREAMWALKER:
break; break;
case DATA_SINDRAGOSA: case DATA_SINDRAGOSA:
HandleGameObject(frostwingSigil, state != DONE); HandleGameObject(FrostwingSigilGUID, state != DONE);
if (instance->IsHeroic()) if (instance->IsHeroic())
{ {
if (state == FAIL && heroicAttempts) if (state == FAIL && HeroicAttempts)
{ {
--heroicAttempts; --HeroicAttempts;
DoUpdateWorldState(WORLDSTATE_ATTEMPTS_REMAINING, heroicAttempts); DoUpdateWorldState(WORLDSTATE_ATTEMPTS_REMAINING, HeroicAttempts);
if (!heroicAttempts) if (!HeroicAttempts)
if (Creature* sindra = instance->GetCreature(sindragosa)) if (Creature* sindra = instance->GetCreature(SindragosaGUID))
sindra->DespawnOrUnsummon(); sindra->DespawnOrUnsummon();
} }
} }
@@ -597,23 +597,23 @@ class instance_icecrown_citadel : public InstanceMapScript
switch (type) switch (type)
{ {
case DATA_BONED_ACHIEVEMENT: case DATA_BONED_ACHIEVEMENT:
isBonedEligible = data ? true : false; IsBonedEligible = data ? true : false;
break; break;
case DATA_OOZE_DANCE_ACHIEVEMENT: case DATA_OOZE_DANCE_ACHIEVEMENT:
isOozeDanceEligible = data ? true : false; IsOozeDanceEligible = data ? true : false;
break; break;
case DATA_NAUSEA_ACHIEVEMENT: case DATA_NAUSEA_ACHIEVEMENT:
isNauseaEligible = data ? true : false; IsNauseaEligible = data ? true : false;
break; break;
case DATA_ORB_WHISPERER_ACHIEVEMENT: case DATA_ORB_WHISPERER_ACHIEVEMENT:
isOrbWhispererEligible = data ? true : false; IsOrbWhispererEligible = data ? true : false;
break; break;
case DATA_SINDRAGOSA_FROSTWYRMS: case DATA_SINDRAGOSA_FROSTWYRMS:
{ {
if (frostwyrms == 255) if (FrostwyrmCount == 255)
return; return;
if (instance->IsHeroic() && !heroicAttempts) if (instance->IsHeroic() && !HeroicAttempts)
return; return;
if (GetBossState(DATA_SINDRAGOSA) != DONE) if (GetBossState(DATA_SINDRAGOSA) != DONE)
@@ -622,10 +622,10 @@ class instance_icecrown_citadel : public InstanceMapScript
switch (data) switch (data)
{ {
case 0: case 0:
if (frostwyrms) if (FrostwyrmCount)
{ {
--frostwyrms; --FrostwyrmCount;
if (!frostwyrms) if (!FrostwyrmCount)
{ {
instance->LoadGrid(SindragosaSpawnPos.GetPositionX(), SindragosaSpawnPos.GetPositionY()); instance->LoadGrid(SindragosaSpawnPos.GetPositionX(), SindragosaSpawnPos.GetPositionY());
if (Creature* boss = instance->SummonCreature(NPC_SINDRAGOSA, SindragosaSpawnPos)) if (Creature* boss = instance->SummonCreature(NPC_SINDRAGOSA, SindragosaSpawnPos))
@@ -634,70 +634,70 @@ class instance_icecrown_citadel : public InstanceMapScript
} }
break; break;
case 1: case 1:
++frostwyrms; ++FrostwyrmCount;
break; break;
default: default:
frostwyrms = data; FrostwyrmCount = data;
break; break;
} }
break; break;
} }
case DATA_SPINESTALKER: case DATA_SPINESTALKER:
{ {
if (spinestalkerTrash == 255) if (SpinestalkerTrashCount == 255)
return; return;
switch (data) switch (data)
{ {
case 0: case 0:
if (spinestalkerTrash) if (SpinestalkerTrashCount)
{ {
--spinestalkerTrash; --SpinestalkerTrashCount;
if (!spinestalkerTrash) if (!SpinestalkerTrashCount)
if (Creature* spinestalk = instance->GetCreature(spinestalker)) if (Creature* spinestalk = instance->GetCreature(SpinestalkerGUID))
spinestalk->AI()->DoAction(ACTION_START_FROSTWYRM); spinestalk->AI()->DoAction(ACTION_START_FROSTWYRM);
} }
break; break;
case 1: case 1:
++spinestalkerTrash; ++SpinestalkerTrashCount;
break; break;
default: default:
spinestalkerTrash = data; SpinestalkerTrashCount = data;
break; break;
} }
break; break;
} }
case DATA_RIMEFANG: case DATA_RIMEFANG:
{ {
if (rimefangTrash == 255) if (RimefangTrashCount == 255)
return; return;
switch (data) switch (data)
{ {
case 0: case 0:
if (rimefangTrash) if (RimefangTrashCount)
{ {
--rimefangTrash; --RimefangTrashCount;
if (!rimefangTrash) if (!RimefangTrashCount)
if (Creature* rime = instance->GetCreature(rimefang)) if (Creature* rime = instance->GetCreature(RimefangGUID))
rime->AI()->DoAction(ACTION_START_FROSTWYRM); rime->AI()->DoAction(ACTION_START_FROSTWYRM);
} }
break; break;
case 1: case 1:
++rimefangTrash; ++RimefangTrashCount;
break; break;
default: default:
rimefangTrash = data; RimefangTrashCount = data;
break; break;
} }
break; break;
} }
case DATA_COLDFLAME_JETS: case DATA_COLDFLAME_JETS:
coldflameJetsState = data; ColdflameJetsState = data;
if (coldflameJetsState == DONE) if (ColdflameJetsState == DONE)
{ {
SaveToDB(); SaveToDB();
for (std::set<uint64>::iterator itr = coldflameJets.begin(); itr != coldflameJets.end(); ++itr) for (std::set<uint64>::iterator itr = ColdflameJetGUIDs.begin(); itr != ColdflameJetGUIDs.end(); ++itr)
if (Creature* trap = instance->GetCreature(*itr)) if (Creature* trap = instance->GetCreature(*itr))
trap->AI()->DoAction(ACTION_STOP_TRAPS); trap->AI()->DoAction(ACTION_STOP_TRAPS);
} }
@@ -705,7 +705,7 @@ class instance_icecrown_citadel : public InstanceMapScript
case DATA_BLOOD_QUICKENING_STATE: case DATA_BLOOD_QUICKENING_STATE:
{ {
// skip if nothing changes // skip if nothing changes
if (bloodQuickeningState == data) if (BloodQuickeningState == data)
break; break;
// 5 is the index of Blood Quickening // 5 is the index of Blood Quickening
@@ -715,21 +715,21 @@ class instance_icecrown_citadel : public InstanceMapScript
switch (data) switch (data)
{ {
case IN_PROGRESS: case IN_PROGRESS:
bloodQuickeningTimer = 60000; BloodQuickeningTimer = 60000;
bloodQuickeningMinutes = 30; BloodQuickeningMinutes = 30;
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 1); DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 1);
DoUpdateWorldState(WORLDSTATE_EXECUTION_TIME, bloodQuickeningMinutes); DoUpdateWorldState(WORLDSTATE_EXECUTION_TIME, BloodQuickeningMinutes);
break; break;
case DONE: case DONE:
bloodQuickeningTimer = 0; BloodQuickeningTimer = 0;
bloodQuickeningMinutes = 0; BloodQuickeningMinutes = 0;
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0); DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0);
break; break;
default: default:
break; break;
} }
bloodQuickeningState = data; BloodQuickeningState = data;
SaveToDB(); SaveToDB();
break; break;
} }
@@ -746,22 +746,22 @@ class instance_icecrown_citadel : public InstanceMapScript
case CRITERIA_BONED_25N: case CRITERIA_BONED_25N:
case CRITERIA_BONED_10H: case CRITERIA_BONED_10H:
case CRITERIA_BONED_25H: case CRITERIA_BONED_25H:
return isBonedEligible; return IsBonedEligible;
case CRITERIA_DANCES_WITH_OOZES_10N: case CRITERIA_DANCES_WITH_OOZES_10N:
case CRITERIA_DANCES_WITH_OOZES_25N: case CRITERIA_DANCES_WITH_OOZES_25N:
case CRITERIA_DANCES_WITH_OOZES_10H: case CRITERIA_DANCES_WITH_OOZES_10H:
case CRITERIA_DANCES_WITH_OOZES_25H: case CRITERIA_DANCES_WITH_OOZES_25H:
return isOozeDanceEligible; return IsOozeDanceEligible;
case CRITERIA_NAUSEA_10N: case CRITERIA_NAUSEA_10N:
case CRITERIA_NAUSEA_25N: case CRITERIA_NAUSEA_25N:
case CRITERIA_NAUSEA_10H: case CRITERIA_NAUSEA_10H:
case CRITERIA_NAUSEA_25H: case CRITERIA_NAUSEA_25H:
return isNauseaEligible; return IsNauseaEligible;
case CRITERIA_ORB_WHISPERER_10N: case CRITERIA_ORB_WHISPERER_10N:
case CRITERIA_ORB_WHISPERER_25N: case CRITERIA_ORB_WHISPERER_25N:
case CRITERIA_ORB_WHISPERER_10H: case CRITERIA_ORB_WHISPERER_10H:
case CRITERIA_ORB_WHISPERER_25H: case CRITERIA_ORB_WHISPERER_25H:
return isOrbWhispererEligible; return IsOrbWhispererEligible;
// Only one criteria for both modes, need to do it like this // Only one criteria for both modes, need to do it like this
case CRITERIA_KILL_LANA_THEL_10M: case CRITERIA_KILL_LANA_THEL_10M:
case CRITERIA_ONCE_BITTEN_TWICE_SHY_10N: case CRITERIA_ONCE_BITTEN_TWICE_SHY_10N:
@@ -916,8 +916,8 @@ class instance_icecrown_citadel : public InstanceMapScript
OUT_SAVE_INST_DATA; OUT_SAVE_INST_DATA;
std::ostringstream saveStream; std::ostringstream saveStream;
saveStream << "I C " << GetBossSaveData() << coldflameJetsState saveStream << "I C " << GetBossSaveData() << ColdflameJetsState
<< " " << bloodQuickeningState << " " << bloodQuickeningMinutes; << " " << BloodQuickeningState << " " << BloodQuickeningMinutes;
OUT_SAVE_INST_DATA_COMPLETE; OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str(); return saveStream.str();
@@ -951,11 +951,11 @@ class instance_icecrown_citadel : public InstanceMapScript
uint32 temp = 0; uint32 temp = 0;
loadStream >> temp; loadStream >> temp;
coldflameJetsState = temp ? DONE : NOT_STARTED; ColdflameJetsState = temp ? DONE : NOT_STARTED;
temp = 0; temp = 0;
loadStream >> temp; loadStream >> temp;
bloodQuickeningState = temp ? DONE : NOT_STARTED; // DONE means finished (not success/fail) BloodQuickeningState = temp ? DONE : NOT_STARTED; // DONE means finished (not success/fail)
loadStream >> bloodQuickeningMinutes; loadStream >> BloodQuickeningMinutes;
} }
else else
OUT_LOAD_INST_DATA_FAIL; OUT_LOAD_INST_DATA_FAIL;
@@ -965,68 +965,68 @@ class instance_icecrown_citadel : public InstanceMapScript
void Update(uint32 diff) void Update(uint32 diff)
{ {
if (bloodQuickeningState == IN_PROGRESS) if (BloodQuickeningState == IN_PROGRESS)
{ {
if (bloodQuickeningTimer <= diff) if (BloodQuickeningTimer <= diff)
{ {
--bloodQuickeningMinutes; --BloodQuickeningMinutes;
bloodQuickeningTimer = 60000; BloodQuickeningTimer = 60000;
if (bloodQuickeningMinutes) if (BloodQuickeningMinutes)
{ {
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 1); DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 1);
DoUpdateWorldState(WORLDSTATE_EXECUTION_TIME, bloodQuickeningMinutes); DoUpdateWorldState(WORLDSTATE_EXECUTION_TIME, BloodQuickeningMinutes);
} }
else else
{ {
bloodQuickeningState = DONE; BloodQuickeningState = DONE;
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0); DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0);
if (Creature* bq = instance->GetCreature(bloodQueenLanaThel)) if (Creature* bq = instance->GetCreature(BloodQueenLanaThelGUID))
bq->AI()->DoAction(ACTION_KILL_MINCHAR); bq->AI()->DoAction(ACTION_KILL_MINCHAR);
} }
SaveToDB(); SaveToDB();
} }
else else
bloodQuickeningTimer -= diff; BloodQuickeningTimer -= diff;
} }
} }
private: protected:
std::set<uint64> coldflameJets; std::set<uint64> ColdflameJetGUIDs;
uint64 ladyDeathwisperElevator; uint64 LadyDeathwisperElevatorGUID;
uint64 deathbringerSaurfang; uint64 DeathbringerSaurfangGUID;
uint64 saurfangDoor; uint64 DeathbringerSaurfangDoorGUID;
uint64 saurfangEventNPC; // Muradin Bronzebeard or High Overlord Saurfang uint64 DeathbringerSaurfangEventGUID; // Muradin Bronzebeard or High Overlord Saurfang
uint64 deathbringersCache; uint64 DeathbringersCacheGUID;
uint64 saurfangTeleport; uint64 SaurfangTeleportGUID;
uint64 plagueSigil; uint64 PlagueSigilGUID;
uint64 bloodwingSigil; uint64 BloodwingSigilGUID;
uint64 frostwingSigil; uint64 FrostwingSigilGUID;
uint64 putricidePipes[2]; uint64 PutricidePipeGUIDs[2];
uint64 putricideGates[2]; uint64 PutricideGateGUIDs[2];
uint64 putricideCollision; uint64 PutricideCollisionGUID;
uint64 festergut; uint64 FestergutGUID;
uint64 rotface; uint64 RotfaceGUID;
uint64 professorPutricide; uint64 ProfessorPutricideGUID;
uint64 putricideTable; uint64 PutricideTableGUID;
uint64 bloodCouncil[3]; uint64 BloodCouncilGUIDs[3];
uint64 bloodCouncilController; uint64 BloodCouncilControllerGUID;
uint64 bloodQueenLanaThel; uint64 BloodQueenLanaThelGUID;
uint64 sindragosa; uint64 SindragosaGUID;
uint64 spinestalker; uint64 SpinestalkerGUID;
uint64 rimefang; uint64 RimefangGUID;
uint32 teamInInstance; uint32 TeamInInstance;
uint32 bloodQuickeningTimer; uint32 BloodQuickeningTimer;
uint32 coldflameJetsState; uint32 ColdflameJetsState;
uint32 frostwyrms; uint32 FrostwyrmCount;
uint32 spinestalkerTrash; uint32 SpinestalkerTrashCount;
uint32 rimefangTrash; uint32 RimefangTrashCount;
uint32 bloodQuickeningState; uint32 BloodQuickeningState;
uint16 heroicAttempts; uint16 HeroicAttempts;
uint16 bloodQuickeningMinutes; uint16 BloodQuickeningMinutes;
bool isBonedEligible; bool IsBonedEligible;
bool isOozeDanceEligible; bool IsOozeDanceEligible;
bool isNauseaEligible; bool IsNauseaEligible;
bool isOrbWhispererEligible; bool IsOrbWhispererEligible;
}; };
InstanceScript* GetInstanceScript(InstanceMap* map) const InstanceScript* GetInstanceScript(InstanceMap* map) const