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:
@@ -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');
|
||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user