Merge branch 'master' into Playerbot
This commit is contained in:
@@ -22,6 +22,7 @@
|
||||
#include "SpellInfo.h"
|
||||
#include "SpellScript.h"
|
||||
#include "SpellScriptLoader.h"
|
||||
#include "SpellAuraEffects.h"
|
||||
#include "sunwell_plateau.h"
|
||||
|
||||
enum Quotes
|
||||
@@ -83,7 +84,10 @@ struct boss_sacrolash : public BossAI
|
||||
_isSisterDead = false;
|
||||
BossAI::Reset();
|
||||
me->SetLootMode(0);
|
||||
me->m_Events.KillAllEvents(false);
|
||||
|
||||
if (Creature* alythess = instance->GetCreature(DATA_ALYTHESS))
|
||||
if (!alythess->IsAlive())
|
||||
alythess->Respawn(true);
|
||||
}
|
||||
|
||||
void DoAction(int32 param) override
|
||||
@@ -105,18 +109,6 @@ struct boss_sacrolash : public BossAI
|
||||
}
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason why) override
|
||||
{
|
||||
BossAI::EnterEvadeMode(why);
|
||||
if (Creature* alythess = instance->GetCreature(DATA_ALYTHESS))
|
||||
{
|
||||
if (!alythess->IsAlive())
|
||||
alythess->Respawn(true);
|
||||
else if (!alythess->IsInEvadeMode())
|
||||
alythess->AI()->EnterEvadeMode(why);
|
||||
}
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
@@ -124,10 +116,7 @@ struct boss_sacrolash : public BossAI
|
||||
if (alythess->IsAlive() && !alythess->IsInCombat())
|
||||
alythess->AI()->AttackStart(who);
|
||||
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
Talk(YELL_BERSERK);
|
||||
DoCastSelf(SPELL_ENRAGE, true);
|
||||
}, 6min);
|
||||
ScheduleEnrageTimer(SPELL_ENRAGE, 6min, YELL_BERSERK);
|
||||
|
||||
ScheduleTimedEvent(10s, [&] {
|
||||
DoCastSelf(SPELL_SHADOW_BLADES);
|
||||
@@ -195,7 +184,10 @@ struct boss_alythess : public BossAI
|
||||
_isSisterDead = false;
|
||||
BossAI::Reset();
|
||||
me->SetLootMode(0);
|
||||
me->m_Events.KillAllEvents(false);
|
||||
|
||||
if (Creature* sacrolash = instance->GetCreature(DATA_SACROLASH))
|
||||
if (!sacrolash->IsAlive())
|
||||
sacrolash->Respawn(true);
|
||||
}
|
||||
|
||||
void DoAction(int32 param) override
|
||||
@@ -217,18 +209,6 @@ struct boss_alythess : public BossAI
|
||||
}
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason why) override
|
||||
{
|
||||
BossAI::EnterEvadeMode(why);
|
||||
if (Creature* sacrolash = instance->GetCreature(DATA_SACROLASH))
|
||||
{
|
||||
if (!sacrolash->IsAlive())
|
||||
sacrolash->Respawn(true);
|
||||
else if (!sacrolash->IsInEvadeMode())
|
||||
sacrolash->AI()->EnterEvadeMode(why);
|
||||
}
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
@@ -236,10 +216,7 @@ struct boss_alythess : public BossAI
|
||||
if (sacrolash->IsAlive() && !sacrolash->IsInCombat())
|
||||
sacrolash->AI()->AttackStart(who);
|
||||
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
Talk(YELL_BERSERK);
|
||||
DoCastSelf(SPELL_ENRAGE, true);
|
||||
}, 6min);
|
||||
ScheduleEnrageTimer(SPELL_ENRAGE, 6min, YELL_BERSERK);
|
||||
|
||||
ScheduleTimedEvent(1s, [&] {
|
||||
DoCastVictim(SPELL_BLAZE);
|
||||
@@ -389,8 +366,15 @@ public:
|
||||
return ValidateSpellInfo({ _touchSpell });
|
||||
}
|
||||
|
||||
void OnPeriodic(AuraEffect const* /*aurEff*/)
|
||||
void OnPeriodic(AuraEffect const* aurEff)
|
||||
{
|
||||
if (aurEff->GetId() == SPELL_FLAME_SEAR)
|
||||
{
|
||||
uint32 tick = aurEff->GetTickNumber();
|
||||
if (tick % 2 != 0 || tick > 10)
|
||||
return;
|
||||
}
|
||||
|
||||
if (Unit* owner = GetOwner()->ToUnit())
|
||||
owner->CastSpell(owner, _touchSpell, true);
|
||||
}
|
||||
|
||||
@@ -66,12 +66,14 @@ enum Misc
|
||||
// Misc
|
||||
ACTION_START_EVENT = 1,
|
||||
POINT_GROUND = 1,
|
||||
POINT_AIR = 2,
|
||||
POINT_AIR_BREATH_START1 = 3,
|
||||
POINT_AIR_BREATH_END1 = 4,
|
||||
POINT_AIR_BREATH_START2 = 5,
|
||||
POINT_AIR_BREATH_END2 = 6,
|
||||
POINT_MISC = 7,
|
||||
POINT_TAKEOFF = 2,
|
||||
POINT_AIR = 3,
|
||||
POINT_AIR_UP = 4,
|
||||
POINT_LANE = 5,
|
||||
POINT_AIR_BREATH_START1 = 6,
|
||||
POINT_AIR_BREATH_END = 7,
|
||||
POINT_AIR_BREATH_START2 = 8,
|
||||
POINT_MISC = 9,
|
||||
|
||||
POINT_KALECGOS = 1,
|
||||
|
||||
@@ -79,9 +81,28 @@ enum Misc
|
||||
GROUP_BREATH = 1,
|
||||
|
||||
NPC_FOG_TRIGGER = 23472,
|
||||
NPC_KALECGOS_FELMYST = 24844 // Same as Magister's Terrace
|
||||
NPC_KALECGOS_FELMYST = 24844, // Same as Magister's Terrace
|
||||
NPC_WORLD_TRIGGER_RIGHT = 25358
|
||||
};
|
||||
|
||||
const Position LeftSideLanes[3] =
|
||||
{
|
||||
{ 1494.745f, 704.0001f, 50.084652f, 4.7472f }, // top
|
||||
{ 1469.923f, 703.23914f, 50.08592f, 4.7472f }, // middle
|
||||
{ 1446.5154f, 701.5184f, 50.085438f, 4.7472f } // bottom
|
||||
};
|
||||
|
||||
const Position RightSideLanes[3] =
|
||||
{
|
||||
{ 1492.82f, 515.668f, 50.0833f, 1.4486f }, // top
|
||||
{ 1466.7322f, 515.5953f, 50.571518f, 1.4486f }, // middle
|
||||
{ 1441.64f, 520.52f, 50.0833f, 1.4486f } // bottom
|
||||
};
|
||||
|
||||
const Position RightSide = { 1458.5555f, 502.1995f, 59.899513f, 1.605702f };
|
||||
const Position LeftSide = { 1469.0642f, 729.5854f, 59.823853f, 4.6774f };
|
||||
const Position LandingPos = { 1476.77f, 665.094f, 20.6423f };
|
||||
|
||||
class CorruptTriggers : public BasicEvent
|
||||
{
|
||||
public:
|
||||
@@ -103,7 +124,7 @@ private:
|
||||
|
||||
struct boss_felmyst : public BossAI
|
||||
{
|
||||
boss_felmyst(Creature* creature) : BossAI(creature, DATA_FELMYST) { }
|
||||
boss_felmyst(Creature* creature) : BossAI(creature, DATA_FELMYST), _currentLane(0), _strafeCount(0) { }
|
||||
|
||||
void InitializeAI() override
|
||||
{
|
||||
@@ -127,25 +148,24 @@ struct boss_felmyst : public BossAI
|
||||
void Reset() override
|
||||
{
|
||||
BossAI::Reset();
|
||||
me->m_Events.KillAllEvents(false);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_FOG_OF_CORRUPTION_CHARM);
|
||||
_currentLane = 0;
|
||||
_strafeCount = 0;
|
||||
me->SetCombatMovement(false);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
me->CastSpell(me, SPELL_NOXIOUS_FUMES, true);
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
Talk(YELL_BERSERK);
|
||||
DoCastSelf(SPELL_BERSERK, true);
|
||||
}, 10min);
|
||||
|
||||
ScheduleEnrageTimer(SPELL_BERSERK, 10min, YELL_BERSERK);
|
||||
|
||||
me->GetMotionMaster()->Clear();
|
||||
|
||||
Position landPos = who->GetPosition();
|
||||
me->m_Events.AddEventAtOffset([&, landPos] {
|
||||
me->GetMotionMaster()->MovePoint(POINT_GROUND, landPos, false, true);
|
||||
}, 2s);
|
||||
me->GetMotionMaster()->MoveLand(POINT_GROUND, landPos);
|
||||
}, 1s);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim) override
|
||||
@@ -166,150 +186,139 @@ struct boss_felmyst : public BossAI
|
||||
kalec->GetMotionMaster()->MovePoint(POINT_KALECGOS, 1474.2347f, 624.0703f, 29.32589f, false, true);
|
||||
}
|
||||
|
||||
void ScheduleGroundAbilities()
|
||||
{
|
||||
ScheduleTimedEvent(7500ms, [&] {
|
||||
DoCastVictim(SPELL_CLEAVE);
|
||||
}, 7500ms);
|
||||
|
||||
ScheduleTimedEvent(12s, [&] {
|
||||
DoCastVictim(SPELL_CORROSION);
|
||||
}, 20s);
|
||||
|
||||
ScheduleTimedEvent(18s, [&] {
|
||||
Talk(YELL_BREATH);
|
||||
DoCastSelf(SPELL_GAS_NOVA);
|
||||
}, 20s);
|
||||
|
||||
ScheduleTimedEvent(25s, [&] {
|
||||
DoCastRandomTarget(SPELL_ENCAPSULATE_CHANNEL, 0, 50.0f);
|
||||
}, 25s);
|
||||
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
Talk(YELL_TAKEOFF);
|
||||
scheduler.CancelAll();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetTarget();
|
||||
me->AttackStop();
|
||||
me->SetCombatMovement(false);
|
||||
me->GetMotionMaster()->Clear();
|
||||
me->GetMotionMaster()->MoveIdle();
|
||||
me->SetCanFly(true);
|
||||
me->SetDisableGravity(true);
|
||||
me->SendMovementFlagUpdate();
|
||||
SetInvincibility(true);
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
|
||||
me->GetMotionMaster()->MovePoint(POINT_TAKEOFF, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 20.0f);
|
||||
}, 1min);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 point) override
|
||||
{
|
||||
if (type != POINT_MOTION_TYPE)
|
||||
if (type != EFFECT_MOTION_TYPE && type != POINT_MOTION_TYPE)
|
||||
return;
|
||||
|
||||
if (point == POINT_GROUND)
|
||||
switch (point)
|
||||
{
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
|
||||
me->SetCanFly(false);
|
||||
me->SetDisableGravity(false);
|
||||
me->SendMovementFlagUpdate();
|
||||
SetInvincibility(false);
|
||||
case POINT_GROUND:
|
||||
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
if (!me->HasAura(SPELL_NOXIOUS_FUMES))
|
||||
DoCastSelf(SPELL_NOXIOUS_FUMES, true);
|
||||
|
||||
if (me->GetVictim())
|
||||
me->SetTarget(me->GetVictim()->GetGUID());
|
||||
|
||||
me->ResumeChasingVictim();
|
||||
}, 2s);
|
||||
|
||||
ScheduleTimedEvent(7500ms, [&] {
|
||||
DoCastVictim(SPELL_CLEAVE);
|
||||
}, 7500ms);
|
||||
|
||||
ScheduleTimedEvent(12s, [&] {
|
||||
DoCastVictim(SPELL_CORROSION);
|
||||
}, 20s);
|
||||
|
||||
ScheduleTimedEvent(18s, [&] {
|
||||
DoCastSelf(SPELL_GAS_NOVA);
|
||||
}, 20s);
|
||||
|
||||
ScheduleTimedEvent(25s, [&] {
|
||||
DoCastRandomTarget(SPELL_ENCAPSULATE_CHANNEL, 0, 50.0f);
|
||||
}, 25s);
|
||||
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
scheduler.CancelAll();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->StopMoving();
|
||||
me->GetMotionMaster()->Clear();
|
||||
me->GetMotionMaster()->MoveIdle();
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
|
||||
me->SetCanFly(false);
|
||||
me->SetDisableGravity(false);
|
||||
me->SendMovementFlagUpdate();
|
||||
SetInvincibility(false);
|
||||
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
ScheduleFlightSequence();
|
||||
}, 1s);
|
||||
}, 1min);
|
||||
}
|
||||
else if (point == POINT_AIR_BREATH_START1)
|
||||
{
|
||||
me->SetTarget();
|
||||
me->SetFacingTo(4.71f);
|
||||
ScheduleFlightAbilities(point);
|
||||
}
|
||||
else if (point == POINT_AIR_BREATH_END1)
|
||||
{
|
||||
me->RemoveAurasDueToSpell(SPELL_FELMYST_SPEED_BURST);
|
||||
me->SetFacingTo(1.57f);
|
||||
if (!scheduler.IsGroupScheduled(GROUP_BREATH))
|
||||
{
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
|
||||
if (me->GetVictim())
|
||||
me->SetTarget(me->GetVictim()->GetGUID());
|
||||
|
||||
me->ResumeChasingVictim();
|
||||
me->SetCombatMovement(true);
|
||||
}, 5s);
|
||||
|
||||
ScheduleGroundAbilities();
|
||||
break;
|
||||
case POINT_TAKEOFF:
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
Position pos = { 1447.0f + urand(0, 2) * 25.0f, 515.0f, 50.0f, 1.57f };
|
||||
me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_START2, pos, false, true);
|
||||
me->CastCustomSpell(SPELL_SUMMON_DEMONIC_VAPOR, SPELLVALUE_MAX_TARGETS, 1, me, true);
|
||||
}, 5s);
|
||||
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
me->CastCustomSpell(SPELL_SUMMON_DEMONIC_VAPOR, SPELLVALUE_MAX_TARGETS, 1, me, true);
|
||||
}, 17s);
|
||||
|
||||
scheduler.Schedule(27s, GROUP_BREATH, [this](TaskContext)
|
||||
{
|
||||
me->GetMotionMaster()->MovePoint(POINT_AIR_UP, RightSide);
|
||||
});
|
||||
break;
|
||||
case POINT_AIR_UP:
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
if (_strafeCount >= 3)
|
||||
{
|
||||
_strafeCount = 0;
|
||||
me->GetMotionMaster()->MoveLand(POINT_GROUND, LandingPos);
|
||||
return;
|
||||
}
|
||||
|
||||
++_strafeCount;
|
||||
_currentLane = urand(0, 2);
|
||||
if (me->FindNearestCreature(NPC_WORLD_TRIGGER_RIGHT, 30.0f))
|
||||
me->GetMotionMaster()->MovePoint(POINT_LANE, RightSideLanes[_currentLane], false);
|
||||
else
|
||||
me->GetMotionMaster()->MovePoint(POINT_LANE, LeftSideLanes[_currentLane], false);
|
||||
}, 2s);
|
||||
}
|
||||
break;
|
||||
case POINT_LANE:
|
||||
Talk(EMOTE_BREATH);
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(0));
|
||||
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(500));
|
||||
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(1000));
|
||||
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(1500));
|
||||
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(2000));
|
||||
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(2500));
|
||||
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(3000));
|
||||
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(3500));
|
||||
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(4000));
|
||||
}, 5s);
|
||||
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
DoCastSelf(SPELL_FELMYST_SPEED_BURST, true);
|
||||
|
||||
if (me->FindNearestCreature(NPC_WORLD_TRIGGER_RIGHT, 30.0f))
|
||||
me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_END, LeftSideLanes[_currentLane], false);
|
||||
else
|
||||
me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_END, RightSideLanes[_currentLane], false);
|
||||
}, 5s);
|
||||
break;
|
||||
case POINT_AIR_BREATH_END:
|
||||
me->RemoveAurasDueToSpell(SPELL_FELMYST_SPEED_BURST);
|
||||
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
if (me->FindNearestCreature(NPC_WORLD_TRIGGER_RIGHT, 30.0f))
|
||||
me->GetMotionMaster()->MovePoint(POINT_AIR_UP, RightSide, false);
|
||||
else
|
||||
me->GetMotionMaster()->MovePoint(POINT_AIR_UP, LeftSide, false);
|
||||
}, 2s);
|
||||
break;
|
||||
}
|
||||
else if (point == POINT_AIR_BREATH_START2)
|
||||
{
|
||||
me->SetTarget();
|
||||
me->SetFacingTo(1.57f);
|
||||
ScheduleFlightAbilities(point);
|
||||
}
|
||||
else if (point == POINT_AIR_BREATH_END2)
|
||||
{
|
||||
me->RemoveAurasDueToSpell(SPELL_FELMYST_SPEED_BURST);
|
||||
me->SetFacingTo(4.71f);
|
||||
}
|
||||
}
|
||||
|
||||
void ScheduleFlightSequence()
|
||||
{
|
||||
Talk(YELL_TAKEOFF);
|
||||
me->SetTarget();
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
|
||||
me->SetDisableGravity(true);
|
||||
me->SendMovementFlagUpdate();
|
||||
SetInvincibility(true);
|
||||
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
me->GetMotionMaster()->MovePoint(POINT_AIR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 15.0f, false, true);
|
||||
}, 2s);
|
||||
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
me->CastCustomSpell(SPELL_SUMMON_DEMONIC_VAPOR, SPELLVALUE_MAX_TARGETS, 1, me, true);
|
||||
}, 8s);
|
||||
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
me->CastCustomSpell(SPELL_SUMMON_DEMONIC_VAPOR, SPELLVALUE_MAX_TARGETS, 1, me, true);
|
||||
}, 21s);
|
||||
|
||||
scheduler.Schedule(35s, GROUP_BREATH, [this](TaskContext)
|
||||
{
|
||||
Position pos = { 1447.0f + urand(0, 2) * 25.0f, 705.0f, 50.0f, 4.71f };
|
||||
me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_START1, pos, false, true);
|
||||
});
|
||||
|
||||
scheduler.Schedule(72s, GROUP_BREATH, [this](TaskContext)
|
||||
{
|
||||
Position pos = { 1447.0f + urand(0, 2) * 25.0f, 705.0f, 50.0f, 4.71f };
|
||||
me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_START1, pos, false, true);
|
||||
});
|
||||
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
me->GetMotionMaster()->MovePoint(POINT_GROUND, 1500.0f, 552.8f, 26.52f, false, true);
|
||||
}, 86s);
|
||||
}
|
||||
|
||||
void ScheduleFlightAbilities(uint8 point)
|
||||
{
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
Talk(EMOTE_BREATH);
|
||||
}, 2s);
|
||||
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
Talk(YELL_BREATH);
|
||||
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(0));
|
||||
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(500));
|
||||
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(1000));
|
||||
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(1500));
|
||||
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(2000));
|
||||
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(2500));
|
||||
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(3000));
|
||||
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(3500));
|
||||
me->m_Events.AddEvent(new CorruptTriggers(me), me->m_Events.CalculateTime(4000));
|
||||
}, 5s);
|
||||
|
||||
me->m_Events.AddEventAtOffset([this, point] {
|
||||
DoCastSelf(SPELL_FELMYST_SPEED_BURST, true);
|
||||
if (point == POINT_AIR_BREATH_START1)
|
||||
me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_END1, me->GetPositionX(), me->GetPositionY() - 200.0f, me->GetPositionZ() + 5.0f, false, true);
|
||||
else if (point == POINT_AIR_BREATH_START2)
|
||||
me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_END2, me->GetPositionX(), me->GetPositionY() + 200.0f, me->GetPositionZ() + 5.0f, false, true);
|
||||
}, 5s);
|
||||
}
|
||||
|
||||
void StartIntro()
|
||||
@@ -343,6 +352,10 @@ struct boss_felmyst : public BossAI
|
||||
if (!me->HasUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY))
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
uint8 _currentLane = 0;
|
||||
uint8 _strafeCount = 0;
|
||||
};
|
||||
|
||||
struct npc_demonic_vapor : public NullCreatureAI
|
||||
|
||||
@@ -174,6 +174,7 @@ struct npc_deathstalker_fearleia : public ScriptedAI
|
||||
{
|
||||
_playerGUID.Clear();
|
||||
_summons.DespawnAll();
|
||||
me->SetNpcFlag(UNIT_NPC_FLAG_QUESTGIVER);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -183,6 +184,7 @@ struct npc_deathstalker_fearleia : public ScriptedAI
|
||||
{
|
||||
_questInProgress = true;
|
||||
_playerGUID = player->GetGUID();
|
||||
me->RemoveNpcFlag(UNIT_NPC_FLAG_QUESTGIVER);
|
||||
}
|
||||
|
||||
Talk(NPCSAY_INIT, player);
|
||||
@@ -204,7 +206,6 @@ struct npc_deathstalker_fearleia : public ScriptedAI
|
||||
SummonCreatureWithRandomTarget(2065, 0);
|
||||
break;
|
||||
case 4:
|
||||
SummonCreatureWithRandomTarget(2066, 1);
|
||||
SummonCreatureWithRandomTarget(2066, 1);
|
||||
SummonCreatureWithRandomTarget(2067, 0);
|
||||
SummonCreatureWithRandomTarget(2068, 2);
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#include "naxxramas.h"
|
||||
|
||||
namespace Anubrekhan {
|
||||
|
||||
|
||||
enum Says
|
||||
{
|
||||
SAY_AGGRO = 0,
|
||||
@@ -107,7 +107,7 @@ public:
|
||||
|
||||
Talk(SAY_SLAY);
|
||||
victim->CastSpell(victim, SPELL_SUMMON_CORPSE_SCRABS_5, true, nullptr, nullptr, me->GetGUID());
|
||||
instance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
|
||||
@@ -71,8 +71,6 @@ public:
|
||||
BossAI::Reset();
|
||||
summons.DespawnAll();
|
||||
SummonHelpers();
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(instance->GetGuidData(DATA_FAERLINA_WEB)))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
@@ -102,9 +100,6 @@ public:
|
||||
else
|
||||
context.Repeat(30s);
|
||||
});
|
||||
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(instance->GetGuidData(DATA_FAERLINA_WEB)))
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
@@ -125,15 +120,13 @@ public:
|
||||
if (!urand(0, 3))
|
||||
Talk(SAY_SLAY);
|
||||
|
||||
instance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
Talk(SAY_DEATH);
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(instance->GetGuidData(DATA_FAERLINA_WEB)))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
|
||||
void SpellHit(Unit* caster, SpellInfo const* spell) override
|
||||
|
||||
@@ -120,7 +120,6 @@ public:
|
||||
{
|
||||
explicit boss_four_horsemenAI(Creature* c) : BossAI(c, BOSS_HORSEMAN)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
switch (me->GetEntry())
|
||||
{
|
||||
case NPC_SIR_ZELIEK:
|
||||
@@ -139,7 +138,6 @@ public:
|
||||
}
|
||||
|
||||
EventMap events;
|
||||
InstanceScript* pInstance;
|
||||
uint8 currentWaypoint{};
|
||||
uint8 movementPhase{};
|
||||
uint8 horsemanId;
|
||||
@@ -192,16 +190,6 @@ public:
|
||||
{
|
||||
events.RescheduleEvent(EVENT_SECONDARY_SPELL, 15s);
|
||||
}
|
||||
if (pInstance)
|
||||
{
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_HORSEMEN_GATE)))
|
||||
{
|
||||
if (pInstance->GetBossState(BOSS_GOTHIK) == DONE)
|
||||
{
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id) override
|
||||
@@ -251,36 +239,19 @@ public:
|
||||
return;
|
||||
|
||||
Talk(SAY_SLAY);
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
if (pInstance)
|
||||
{
|
||||
if (pInstance->GetBossState(BOSS_HORSEMAN) == DONE)
|
||||
{
|
||||
if (!me->GetMap()->GetPlayers().IsEmpty())
|
||||
{
|
||||
if (Player* player = me->GetMap()->GetPlayers().getFirst()->GetSource())
|
||||
{
|
||||
if (GameObject* chest = player->SummonGameObject(RAID_MODE(GO_HORSEMEN_CHEST_10, GO_HORSEMEN_CHEST_25), 2514.8f, -2944.9f, 245.55f, 5.51f, 0, 0, 0, 0, 0))
|
||||
{
|
||||
chest->SetLootRecipient(me);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_HORSEMEN_GATE)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
}
|
||||
}
|
||||
Talk(SAY_DEATH);
|
||||
|
||||
if (instance->GetBossState(BOSS_HORSEMAN) == DONE)
|
||||
if (!me->GetMap()->GetPlayers().IsEmpty())
|
||||
if (Player* player = me->GetMap()->GetPlayers().getFirst()->GetSource())
|
||||
if (GameObject* chest = player->SummonGameObject(RAID_MODE(GO_HORSEMEN_CHEST_10, GO_HORSEMEN_CHEST_25), 2514.8f, -2944.9f, 245.55f, 5.51f, 0, 0, 0, 0, 0))
|
||||
chest->SetLootRecipient(me);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
@@ -294,13 +265,6 @@ public:
|
||||
me->SetSpeed(MOVE_RUN, me->GetSpeedRate(MOVE_RUN), true);
|
||||
MoveToCorner();
|
||||
}
|
||||
if (pInstance)
|
||||
{
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_HORSEMEN_GATE)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
|
||||
@@ -67,13 +67,10 @@ public:
|
||||
struct boss_gluthAI : public BossAI
|
||||
{
|
||||
explicit boss_gluthAI(Creature* c) : BossAI(c, BOSS_GLUTH), summons(me)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
{}
|
||||
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
InstanceScript* pInstance;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
@@ -126,13 +123,10 @@ public:
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (me->IsAlive() && who->GetEntry() == NPC_ZOMBIE_CHOW)
|
||||
{
|
||||
me->ModifyHealth(int32(me->GetMaxHealth() * 0.05f));
|
||||
}
|
||||
if (who->IsPlayer() && pInstance)
|
||||
{
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
|
||||
if (who->IsPlayer())
|
||||
instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
|
||||
@@ -189,12 +189,10 @@ public:
|
||||
struct boss_gothikAI : public BossAI
|
||||
{
|
||||
explicit boss_gothikAI(Creature* c) : BossAI(c, BOSS_GOTHIK), summons(me)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
{}
|
||||
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
InstanceScript* pInstance;
|
||||
bool secondPhase{};
|
||||
bool gateOpened{};
|
||||
uint8 waveCount{};
|
||||
@@ -221,21 +219,6 @@ public:
|
||||
gateOpened = false;
|
||||
waveCount = 0;
|
||||
me->NearTeleportTo(2642.139f, -3386.959f, 285.492f, 6.265f);
|
||||
if (pInstance)
|
||||
{
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_GOTHIK_ENTER_GATE)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_GOTHIK_INNER_GATE)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_GOTHIK_EXIT_GATE)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
@@ -249,17 +232,6 @@ public:
|
||||
me->SetUnitFlag(UNIT_FLAG_DISABLE_MOVE);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ADDS, 30s);
|
||||
events.ScheduleEvent(EVENT_CHECK_PLAYERS, 2min);
|
||||
if (pInstance)
|
||||
{
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_GOTHIK_ENTER_GATE)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_GOTHIK_INNER_GATE)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon) override
|
||||
@@ -315,10 +287,7 @@ public:
|
||||
return;
|
||||
|
||||
Talk(SAY_KILL);
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
@@ -326,21 +295,6 @@ public:
|
||||
BossAI::JustDied(killer);
|
||||
Talk(SAY_DEATH);
|
||||
summons.DespawnAll();
|
||||
if (pInstance)
|
||||
{
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_GOTHIK_ENTER_GATE)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_GOTHIK_INNER_GATE)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_GOTHIK_EXIT_GATE)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SummonHelpers(uint32 entry)
|
||||
@@ -460,12 +414,11 @@ public:
|
||||
events.Repeat(20s);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH:
|
||||
if (me->HealthBelowPct(30) && pInstance)
|
||||
if (me->HealthBelowPct(30))
|
||||
{
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_GOTHIK_INNER_GATE)))
|
||||
{
|
||||
if (GameObject* go = instance->GetGameObject(DATA_GOTHIK_INNER_GATE))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
|
||||
events.CancelEvent(EVENT_TELEPORT);
|
||||
break;
|
||||
}
|
||||
@@ -497,10 +450,9 @@ public:
|
||||
case EVENT_CHECK_PLAYERS:
|
||||
if (!CheckGroupSplitted())
|
||||
{
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_GOTHIK_INNER_GATE)))
|
||||
{
|
||||
if (GameObject* go = instance->GetGameObject(DATA_GOTHIK_INNER_GATE))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
|
||||
gateOpened = true;
|
||||
Talk(EMOTE_GATE_OPENED);
|
||||
}
|
||||
@@ -585,10 +537,8 @@ public:
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (who->IsPlayer() && me->GetInstanceScript())
|
||||
{
|
||||
me->GetInstanceScript()->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
if (who->IsPlayer())
|
||||
me->GetInstanceScript()->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -755,17 +705,14 @@ public:
|
||||
// dead side summons are "owned" by gothik
|
||||
void JustSummoned(Creature* summon) override
|
||||
{
|
||||
if (Creature* gothik = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(DATA_GOTHIK_BOSS)))
|
||||
{
|
||||
if (Creature* gothik = me->GetInstanceScript()->GetCreature(DATA_GOTHIK_BOSS))
|
||||
gothik->AI()->JustSummoned(summon);
|
||||
}
|
||||
}
|
||||
|
||||
void SummonedCreatureDespawn(Creature* summon) override
|
||||
{
|
||||
if (Creature* gothik = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(DATA_GOTHIK_BOSS)))
|
||||
{
|
||||
if (Creature* gothik = me->GetInstanceScript()->GetCreature(DATA_GOTHIK_BOSS))
|
||||
gothik->AI()->SummonedCreatureDespawn(summon);
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
@@ -58,13 +58,10 @@ public:
|
||||
struct boss_grobbulusAI : public BossAI
|
||||
{
|
||||
explicit boss_grobbulusAI(Creature* c) : BossAI(c, BOSS_GROBBULUS), summons(me)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
{}
|
||||
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
InstanceScript* pInstance;
|
||||
uint32 dropSludgeTimer{};
|
||||
|
||||
void Reset() override
|
||||
@@ -126,10 +123,8 @@ public:
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (who->IsPlayer() && pInstance)
|
||||
{
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
if (who->IsPlayer())
|
||||
instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -205,10 +200,8 @@ public:
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (who->IsPlayer() && me->GetInstanceScript())
|
||||
{
|
||||
me->GetInstanceScript()->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
if (who->IsPlayer())
|
||||
me->GetInstanceScript()->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
|
||||
@@ -58,11 +58,8 @@ public:
|
||||
struct boss_heiganAI : public BossAI
|
||||
{
|
||||
explicit boss_heiganAI(Creature* c) : BossAI(c, BOSS_HEIGAN)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
{}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
EventMap events;
|
||||
uint8 currentPhase{};
|
||||
uint8 currentSection{};
|
||||
@@ -75,13 +72,6 @@ public:
|
||||
currentPhase = 0;
|
||||
currentSection = 3;
|
||||
moveRight = true;
|
||||
if (pInstance)
|
||||
{
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_HEIGAN_ENTER_GATE)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
@@ -90,10 +80,7 @@ public:
|
||||
return;
|
||||
|
||||
Talk(SAY_SLAY);
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
@@ -107,13 +94,6 @@ public:
|
||||
BossAI::JustEngagedWith(who);
|
||||
me->SetInCombatWithZone();
|
||||
Talk(SAY_AGGRO);
|
||||
if (pInstance)
|
||||
{
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_HEIGAN_ENTER_GATE)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
}
|
||||
StartFightPhase(PHASE_SLOW_DANCE);
|
||||
}
|
||||
|
||||
@@ -195,41 +175,38 @@ public:
|
||||
}
|
||||
break;
|
||||
case EVENT_ERUPT_SECTION:
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(DATA_HEIGAN_ERUPTION, currentSection);
|
||||
if (currentSection == 3)
|
||||
{
|
||||
moveRight = false;
|
||||
}
|
||||
else if (currentSection == 0)
|
||||
{
|
||||
moveRight = true;
|
||||
}
|
||||
moveRight ? currentSection++ : currentSection--;
|
||||
}
|
||||
{
|
||||
instance->SetData(DATA_HEIGAN_ERUPTION, currentSection);
|
||||
if (currentSection == 3)
|
||||
moveRight = false;
|
||||
else if (currentSection == 0)
|
||||
moveRight = true;
|
||||
|
||||
moveRight ? currentSection++ : currentSection--;
|
||||
|
||||
if (currentPhase == PHASE_SLOW_DANCE)
|
||||
{
|
||||
Talk(SAY_TAUNT);
|
||||
}
|
||||
|
||||
events.Repeat(currentPhase == PHASE_SLOW_DANCE ? 10s : 4s);
|
||||
break;
|
||||
}
|
||||
case EVENT_SAFETY_DANCE:
|
||||
{
|
||||
Map::PlayerList const& pList = me->GetMap()->GetPlayers();
|
||||
for (auto const& itr : pList)
|
||||
{
|
||||
Map::PlayerList const& pList = me->GetMap()->GetPlayers();
|
||||
for (auto const& itr : pList)
|
||||
if (IsInRoom(itr.GetSource()) && !itr.GetSource()->IsAlive())
|
||||
{
|
||||
if (IsInRoom(itr.GetSource()) && !itr.GetSource()->IsAlive())
|
||||
{
|
||||
pInstance->SetData(DATA_DANCE_FAIL, 0);
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
return;
|
||||
}
|
||||
instance->SetData(DATA_DANCE_FAIL, 0);
|
||||
instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
|
||||
return;
|
||||
}
|
||||
events.Repeat(5s);
|
||||
return;
|
||||
}
|
||||
events.Repeat(5s);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -133,15 +133,10 @@ public:
|
||||
struct boss_kelthuzadAI : public BossAI
|
||||
{
|
||||
explicit boss_kelthuzadAI(Creature* c) : BossAI(c, BOSS_KELTHUZAD), summons(me)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
_justSpawned = true;
|
||||
}
|
||||
{}
|
||||
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
InstanceScript* pInstance;
|
||||
bool _justSpawned;
|
||||
|
||||
float NormalizeOrientation(float o)
|
||||
{
|
||||
@@ -212,35 +207,23 @@ public:
|
||||
summons.DespawnAll();
|
||||
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_FLOOR)))
|
||||
if (GameObject* go = instance->GetGameObject(DATA_KELTHUZAD_FLOOR))
|
||||
{
|
||||
go->SetPhaseMask(1, true);
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_GATE)))
|
||||
{
|
||||
if (!_justSpawned) // Don't open the door if we just spawned and are still doing the conversation
|
||||
{
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
}
|
||||
_justSpawned = false;
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_PORTAL_1)))
|
||||
{
|
||||
|
||||
if (GameObject* go = instance->GetGameObject(DATA_KELTHUZAD_PORTAL_1))
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_PORTAL_2)))
|
||||
{
|
||||
|
||||
if (GameObject* go = instance->GetGameObject(DATA_KELTHUZAD_PORTAL_2))
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_PORTAL_3)))
|
||||
{
|
||||
|
||||
if (GameObject* go = instance->GetGameObject(DATA_KELTHUZAD_PORTAL_3))
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_PORTAL_4)))
|
||||
{
|
||||
|
||||
if (GameObject* go = instance->GetGameObject(DATA_KELTHUZAD_PORTAL_4))
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason why) override
|
||||
@@ -255,10 +238,7 @@ public:
|
||||
return;
|
||||
|
||||
Talk(SAY_SLAY);
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
@@ -270,13 +250,6 @@ public:
|
||||
guardian->AI()->Talk(EMOTE_GUARDIAN_FLEE);
|
||||
}
|
||||
Talk(SAY_DEATH);
|
||||
if (pInstance)
|
||||
{
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_GATE)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
@@ -300,17 +273,11 @@ public:
|
||||
events.ScheduleEvent(EVENT_SUMMON_SOUL_WEAVER, 12s);
|
||||
events.ScheduleEvent(EVENT_PHASE_2, 228s);
|
||||
events.ScheduleEvent(EVENT_ENRAGE, 15min);
|
||||
if (pInstance)
|
||||
|
||||
if (GameObject* go = instance->GetGameObject(DATA_KELTHUZAD_FLOOR))
|
||||
{
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_FLOOR)))
|
||||
{
|
||||
events.ScheduleEvent(EVENT_FLOOR_CHANGE, 15s);
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
}
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_GATE)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
events.ScheduleEvent(EVENT_FLOOR_CHANGE, 15s);
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -342,14 +309,11 @@ public:
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_FLOOR_CHANGE:
|
||||
if (pInstance)
|
||||
if (GameObject* go = instance->GetGameObject(DATA_KELTHUZAD_FLOOR))
|
||||
{
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_FLOOR)))
|
||||
{
|
||||
events.ScheduleEvent(EVENT_FLOOR_CHANGE, 15s);
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
go->SetPhaseMask(2, true);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_FLOOR_CHANGE, 15s);
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
go->SetPhaseMask(2, true);
|
||||
}
|
||||
break;
|
||||
case EVENT_SPAWN_POOL:
|
||||
@@ -453,39 +417,32 @@ public:
|
||||
Talk(SAY_REQUEST_AID);
|
||||
events.DelayEvents(5500ms);
|
||||
events.ScheduleEvent(EVENT_P3_LICH_KING_SAY, 5s);
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_PORTAL_1)))
|
||||
{
|
||||
if (GameObject* go = instance->GetGameObject(DATA_KELTHUZAD_PORTAL_1))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_PORTAL_2)))
|
||||
{
|
||||
|
||||
if (GameObject* go = instance->GetGameObject(DATA_KELTHUZAD_PORTAL_2))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_PORTAL_3)))
|
||||
{
|
||||
|
||||
if (GameObject* go = instance->GetGameObject(DATA_KELTHUZAD_PORTAL_3))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_PORTAL_4)))
|
||||
{
|
||||
|
||||
if (GameObject* go = instance->GetGameObject(DATA_KELTHUZAD_PORTAL_4))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
events.Repeat(1s);
|
||||
break;
|
||||
case EVENT_P3_LICH_KING_SAY:
|
||||
if (pInstance)
|
||||
{
|
||||
if (Creature* cr = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_LICH_KING_BOSS)))
|
||||
{
|
||||
cr->AI()->Talk(SAY_ANSWER_REQUEST);
|
||||
}
|
||||
}
|
||||
{
|
||||
if (Creature* cr = instance->GetCreature(DATA_LICH_KING_BOSS))
|
||||
cr->AI()->Talk(SAY_ANSWER_REQUEST);
|
||||
|
||||
for (uint8 i = 0 ; i < RAID_MODE(2, 4); ++i)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_SUMMON_GUARDIAN_OF_ICECROWN, 10000 + (i * 5000));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case EVENT_SUMMON_GUARDIAN_OF_ICECROWN:
|
||||
if (Creature* cr = me->SummonCreature(NPC_GUARDIAN_OF_ICECROWN, SpawnPool[RAND(0, 1, 3, 4)]))
|
||||
{
|
||||
@@ -561,10 +518,8 @@ public:
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
if (me->GetEntry() == NPC_UNSTOPPABLE_ABOMINATION && me->GetInstanceScript())
|
||||
{
|
||||
if (me->GetEntry() == NPC_UNSTOPPABLE_ABOMINATION)
|
||||
me->GetInstanceScript()->SetData(DATA_ABOMINATION_KILLED, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void AttackStart(Unit* who) override
|
||||
@@ -606,10 +561,8 @@ public:
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (who->IsPlayer() && me->GetInstanceScript())
|
||||
{
|
||||
me->GetInstanceScript()->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
if (who->IsPlayer())
|
||||
me->GetInstanceScript()->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
|
||||
}
|
||||
|
||||
void JustReachedHome() override
|
||||
|
||||
@@ -51,11 +51,9 @@ public:
|
||||
{
|
||||
explicit boss_loathebAI(Creature* c) : BossAI(c, BOSS_LOATHEB), summons(me)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
uint8 doomCounter;
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
@@ -66,14 +64,6 @@ public:
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
doomCounter = 0;
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(BOSS_LOATHEB, NOT_STARTED);
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_LOATHEB_GATE)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* cr) override
|
||||
@@ -84,18 +74,13 @@ public:
|
||||
|
||||
void SummonedCreatureDies(Creature* /*cr*/, Unit*) override
|
||||
{
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(DATA_SPORE_KILLED, 0);
|
||||
}
|
||||
instance->SetData(DATA_SPORE_KILLED, 0);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (who->IsPlayer() && pInstance)
|
||||
{
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
if (who->IsPlayer())
|
||||
instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
@@ -107,24 +92,12 @@ public:
|
||||
events.ScheduleEvent(EVENT_INEVITABLE_DOOM, 2min);
|
||||
events.ScheduleEvent(EVENT_SUMMON_SPORE, 15s);
|
||||
events.ScheduleEvent(EVENT_BERSERK, 12min);
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(BOSS_LOATHEB, IN_PROGRESS);
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_LOATHEB_GATE)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
summons.DespawnAll();
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(BOSS_LOATHEB, DONE);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -175,8 +148,8 @@ public:
|
||||
{
|
||||
// Calculate the distance between his home position to the gate
|
||||
if (me->GetExactDist(me->GetHomePosition().GetPositionX(),
|
||||
me->GetHomePosition().GetPositionY(),
|
||||
me->GetHomePosition().GetPositionZ()) > 50.0f)
|
||||
me->GetHomePosition().GetPositionY(),
|
||||
me->GetHomePosition().GetPositionZ()) > 50.0f)
|
||||
{
|
||||
EnterEvadeMode();
|
||||
return false;
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
#include "naxxramas.h"
|
||||
|
||||
namespace Maexxna {
|
||||
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_WEB_SPRAY_10 = 29484,
|
||||
@@ -95,11 +95,8 @@ public:
|
||||
struct boss_maexxnaAI : public BossAI
|
||||
{
|
||||
explicit boss_maexxnaAI(Creature* c) : BossAI(c, BOSS_MAEXXNA), summons(me)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
{}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
|
||||
@@ -120,10 +117,6 @@ public:
|
||||
BossAI::Reset();
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
if (pInstance)
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_MAEXXNA_GATE)))
|
||||
if (pInstance->GetBossState(BOSS_FAERLINA) == DONE)
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
@@ -136,13 +129,6 @@ public:
|
||||
events.ScheduleEvent(EVENT_NECROTIC_POISON, 5s);
|
||||
events.ScheduleEvent(EVENT_HEALTH_CHECK, 1s);
|
||||
events.ScheduleEvent(EVENT_SUMMON_SPIDERLINGS, 30s);
|
||||
if (pInstance)
|
||||
{
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_MAEXXNA_GATE)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* cr) override
|
||||
@@ -160,10 +146,8 @@ public:
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (who->IsPlayer() && pInstance)
|
||||
{
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
if (who->IsPlayer())
|
||||
instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
|
||||
@@ -78,11 +78,8 @@ public:
|
||||
struct boss_nothAI : public BossAI
|
||||
{
|
||||
explicit boss_nothAI(Creature* c) : BossAI(c, BOSS_NOTH), summons(me)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
{}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
uint8 timesInBalcony;
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
@@ -140,13 +137,6 @@ public:
|
||||
me->SetControlled(false, UNIT_STATE_ROOT);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
timesInBalcony = 0;
|
||||
if (pInstance)
|
||||
{
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_NOTH_ENTRY_GATE)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason why) override
|
||||
@@ -160,13 +150,6 @@ public:
|
||||
BossAI::JustEngagedWith(who);
|
||||
Talk(SAY_AGGRO);
|
||||
StartGroundPhase();
|
||||
if (pInstance)
|
||||
{
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_NOTH_ENTRY_GATE)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon) override
|
||||
@@ -184,13 +167,6 @@ public:
|
||||
}
|
||||
BossAI::JustDied(killer);
|
||||
Talk(SAY_DEATH);
|
||||
if (pInstance)
|
||||
{
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_NOTH_ENTRY_GATE)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
@@ -199,10 +175,7 @@ public:
|
||||
return;
|
||||
|
||||
Talk(SAY_SLAY);
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
|
||||
@@ -52,12 +52,9 @@ public:
|
||||
struct boss_patchwerkAI : public BossAI
|
||||
{
|
||||
explicit boss_patchwerkAI(Creature* c) : BossAI(c, BOSS_PATCHWERK)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
{}
|
||||
|
||||
EventMap events;
|
||||
InstanceScript* pInstance;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
@@ -71,13 +68,9 @@ public:
|
||||
return;
|
||||
|
||||
if (!urand(0, 3))
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
|
||||
instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
@@ -94,10 +87,7 @@ public:
|
||||
events.ScheduleEvent(EVENT_HATEFUL_STRIKE, 1500ms);
|
||||
events.ScheduleEvent(EVENT_BERSERK, 6min);
|
||||
events.ScheduleEvent(EVENT_HEALTH_CHECK, 1s);
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
}
|
||||
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
|
||||
@@ -70,13 +70,10 @@ public:
|
||||
struct boss_razuviousAI : public BossAI
|
||||
{
|
||||
explicit boss_razuviousAI(Creature* c) : BossAI(c, BOSS_RAZUVIOUS), summons(me)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
{}
|
||||
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
InstanceScript* pInstance;
|
||||
|
||||
void SpawnHelpers()
|
||||
{
|
||||
@@ -198,13 +195,10 @@ public:
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (roll_chance_i(30))
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
if (who->IsPlayer() && pInstance)
|
||||
{
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
|
||||
if (who->IsPlayer())
|
||||
instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask) override
|
||||
@@ -319,17 +313,16 @@ public:
|
||||
switch (action)
|
||||
{
|
||||
case ACTION_FACE_ME:
|
||||
{
|
||||
scheduler.CancelGroup(GROUP_OOC_RP);
|
||||
me->SetSheath(SHEATH_STATE_UNARMED);
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE);
|
||||
if (InstanceScript* instance = me->GetInstanceScript())
|
||||
{
|
||||
if (Creature* creature = instance->GetCreature(DATA_RAZUVIOUS))
|
||||
{
|
||||
me->SetFacingToObject(creature);
|
||||
}
|
||||
}
|
||||
|
||||
if (Creature* creature = me->GetInstanceScript()->GetCreature(DATA_RAZUVIOUS_BOSS))
|
||||
me->SetFacingToObject(creature);
|
||||
|
||||
break;
|
||||
}
|
||||
case ACTION_TALK:
|
||||
Talk(SAY_DEATH_KNIGHT_UNDERSTUDY);
|
||||
break;
|
||||
@@ -348,22 +341,18 @@ public:
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (who->IsPlayer() && me->GetInstanceScript())
|
||||
{
|
||||
me->GetInstanceScript()->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
if (who->IsPlayer())
|
||||
me->GetInstanceScript()->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
scheduler.CancelGroup(GROUP_OOC_RP);
|
||||
if (InstanceScript* instance = me->GetInstanceScript())
|
||||
|
||||
if (Creature* creature = me->GetInstanceScript()->GetCreature(DATA_RAZUVIOUS_BOSS))
|
||||
{
|
||||
if (Creature* creature = instance->GetCreature(DATA_RAZUVIOUS))
|
||||
{
|
||||
creature->SetInCombatWithZone();
|
||||
creature->AI()->AttackStart(who);
|
||||
}
|
||||
creature->SetInCombatWithZone();
|
||||
creature->AI()->AttackStart(who);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -80,12 +80,9 @@ public:
|
||||
struct boss_sapphironAI : public BossAI
|
||||
{
|
||||
explicit boss_sapphironAI(Creature* c) : BossAI(c, BOSS_SAPPHIRON)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
{}
|
||||
|
||||
EventMap events;
|
||||
InstanceScript* pInstance;
|
||||
uint8 iceboltCount{};
|
||||
uint32 spawnTimer{};
|
||||
GuidList blockList;
|
||||
@@ -209,10 +206,8 @@ public:
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (who->IsPlayer() && pInstance)
|
||||
{
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
if (who->IsPlayer())
|
||||
instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -390,9 +385,9 @@ public:
|
||||
Map::PlayerList const& pList = me->GetMap()->GetPlayers();
|
||||
for (auto const& itr : pList)
|
||||
{
|
||||
if (itr.GetSource()->GetResistance(SPELL_SCHOOL_FROST) > 100 && pInstance)
|
||||
if (itr.GetSource()->GetResistance(SPELL_SCHOOL_FROST) > 100)
|
||||
{
|
||||
pInstance->SetData(DATA_HUNDRED_CLUB, 0);
|
||||
instance->SetData(DATA_HUNDRED_CLUB, 0);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,11 +110,8 @@ public:
|
||||
struct boss_thaddiusAI : public BossAI
|
||||
{
|
||||
explicit boss_thaddiusAI(Creature* c) : BossAI(c, BOSS_THADDIUS), summons(me), ballLightningEnabled(false)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
{}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
uint32 summonTimer{};
|
||||
@@ -171,28 +168,15 @@ public:
|
||||
}
|
||||
|
||||
if (GameObject* go = me->FindNearestGameObject(GO_TESLA_COIL_LEFT, 100.0f))
|
||||
{
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
if (GameObject* go = me->FindNearestGameObject(GO_TESLA_COIL_RIGHT, 100.0f))
|
||||
{
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
if (pInstance)
|
||||
{
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_THADDIUS_GATE)))
|
||||
{
|
||||
if (pInstance->GetBossState(BOSS_GLUTH) == DONE)
|
||||
{
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POSITIVE_POLARITY);
|
||||
pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POSITIVE_CHARGE_STACK);
|
||||
pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_NEGATIVE_POLARITY);
|
||||
pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_NEGATIVE_CHARGE_STACK);
|
||||
if (GameObject* go = me->FindNearestGameObject(GO_TESLA_COIL_RIGHT, 100.0f))
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POSITIVE_POLARITY);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POSITIVE_CHARGE_STACK);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_NEGATIVE_POLARITY);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_NEGATIVE_CHARGE_STACK);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
@@ -201,27 +185,17 @@ public:
|
||||
return;
|
||||
|
||||
Talk(SAY_SLAY);
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
Talk(SAY_DEATH);
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POSITIVE_POLARITY);
|
||||
pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POSITIVE_CHARGE_STACK);
|
||||
pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_NEGATIVE_POLARITY);
|
||||
pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_NEGATIVE_CHARGE_STACK);
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_THADDIUS_GATE)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
}
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POSITIVE_POLARITY);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POSITIVE_CHARGE_STACK);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_NEGATIVE_POLARITY);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_NEGATIVE_CHARGE_STACK);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* cr) override
|
||||
@@ -371,11 +345,9 @@ public:
|
||||
{
|
||||
explicit boss_thaddius_summonAI(Creature* c) : ScriptedAI(c)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
overload = false;
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
EventMap events;
|
||||
uint32 pullTimer{};
|
||||
uint32 visualTimer{};
|
||||
@@ -426,17 +398,11 @@ public:
|
||||
{
|
||||
events.ScheduleEvent(EVENT_MINION_MAGNETIC_PULL, 20s);
|
||||
}
|
||||
if (pInstance)
|
||||
|
||||
if (Creature* cr = me->GetInstanceScript()->GetCreature(DATA_THADDIUS_BOSS))
|
||||
{
|
||||
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_THADDIUS_GATE)))
|
||||
{
|
||||
go->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
if (Creature* cr = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_THADDIUS_BOSS)))
|
||||
{
|
||||
cr->AI()->AttackStart(pWho);
|
||||
cr->AddThreat(pWho, 10.0f);
|
||||
}
|
||||
cr->AI()->AttackStart(pWho);
|
||||
cr->AddThreat(pWho, 10.0f);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -466,13 +432,9 @@ public:
|
||||
{
|
||||
Talk(me->GetEntry() == NPC_STALAGG ? SAY_STAL_DEATH : SAY_FEUG_DEATH);
|
||||
Talk(me->GetEntry() == NPC_STALAGG ? EMOTE_STAL_DEATH : EMOTE_FEUG_DEATH);
|
||||
if (pInstance)
|
||||
{
|
||||
if (Creature* cr = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_THADDIUS_BOSS)))
|
||||
{
|
||||
cr->AI()->DoAction(ACTION_SUMMON_DIED);
|
||||
}
|
||||
}
|
||||
|
||||
if (Creature* cr = me->GetInstanceScript()->GetCreature(DATA_THADDIUS_BOSS))
|
||||
cr->AI()->DoAction(ACTION_SUMMON_DIED);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
@@ -480,14 +442,10 @@ public:
|
||||
if (!who->IsPlayer())
|
||||
return;
|
||||
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
|
||||
}
|
||||
if (!urand(0, 2))
|
||||
{
|
||||
Talk(me->GetEntry() == NPC_STALAGG ? SAY_STAL_SLAY : SAY_FEUG_SLAY);
|
||||
}
|
||||
|
||||
me->GetInstanceScript()->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -534,31 +492,30 @@ public:
|
||||
events.Repeat(3s);
|
||||
break;
|
||||
case EVENT_MINION_MAGNETIC_PULL:
|
||||
{
|
||||
events.Repeat(20s);
|
||||
if (pInstance)
|
||||
if (Creature* feugen = me->GetInstanceScript()->GetCreature(DATA_FEUGEN_BOSS))
|
||||
{
|
||||
if (Creature* feugen = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_FEUGEN_BOSS)))
|
||||
{
|
||||
if (!feugen->IsAlive() || !feugen->GetVictim() || !me->GetVictim())
|
||||
return;
|
||||
if (!feugen->IsAlive() || !feugen->GetVictim() || !me->GetVictim())
|
||||
return;
|
||||
|
||||
float threatFeugen = feugen->GetThreatMgr().GetThreat(feugen->GetVictim());
|
||||
float threatStalagg = me->GetThreatMgr().GetThreat(me->GetVictim());
|
||||
Unit* tankFeugen = feugen->GetVictim();
|
||||
Unit* tankStalagg = me->GetVictim();
|
||||
float threatFeugen = feugen->GetThreatMgr().GetThreat(feugen->GetVictim());
|
||||
float threatStalagg = me->GetThreatMgr().GetThreat(me->GetVictim());
|
||||
Unit* tankFeugen = feugen->GetVictim();
|
||||
Unit* tankStalagg = me->GetVictim();
|
||||
|
||||
feugen->GetThreatMgr().ModifyThreatByPercent(tankFeugen, -100);
|
||||
feugen->AddThreat(tankStalagg, threatFeugen);
|
||||
feugen->CastSpell(tankStalagg, SPELL_MAGNETIC_PULL, true);
|
||||
feugen->AI()->DoAction(ACTION_MAGNETIC_PULL);
|
||||
feugen->GetThreatMgr().ModifyThreatByPercent(tankFeugen, -100);
|
||||
feugen->AddThreat(tankStalagg, threatFeugen);
|
||||
feugen->CastSpell(tankStalagg, SPELL_MAGNETIC_PULL, true);
|
||||
feugen->AI()->DoAction(ACTION_MAGNETIC_PULL);
|
||||
|
||||
me->GetThreatMgr().ModifyThreatByPercent(tankStalagg, -100);
|
||||
me->AddThreat(tankFeugen, threatStalagg);
|
||||
me->CastSpell(tankFeugen, SPELL_MAGNETIC_PULL, true);
|
||||
DoAction(ACTION_MAGNETIC_PULL);
|
||||
}
|
||||
me->GetThreatMgr().ModifyThreatByPercent(tankStalagg, -100);
|
||||
me->AddThreat(tankFeugen, threatStalagg);
|
||||
me->CastSpell(tankFeugen, SPELL_MAGNETIC_PULL, true);
|
||||
DoAction(ACTION_MAGNETIC_PULL);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case EVENT_MINION_CHECK_DISTANCE:
|
||||
if (Creature* cr = ObjectAccessor::GetCreature(*me, myCoil))
|
||||
{
|
||||
@@ -639,9 +596,9 @@ class spell_thaddius_pos_neg_charge : public SpellScript
|
||||
{
|
||||
SetHitDamage(0);
|
||||
}
|
||||
else if (target->GetInstanceScript())
|
||||
else if (InstanceScript* instance = target->GetInstanceScript())
|
||||
{
|
||||
target->GetInstanceScript()->SetData(DATA_CHARGES_CROSSED, 0);
|
||||
instance->SetData(DATA_CHARGES_CROSSED, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -723,15 +680,13 @@ public:
|
||||
bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) override
|
||||
{
|
||||
InstanceScript* instance = player->GetInstanceScript();
|
||||
if (!instance || instance->GetData(DATA_HAD_THADDIUS_GREET) || instance->GetBossState(BOSS_THADDIUS) == DONE)
|
||||
if (!instance || instance->GetData(DATA_THADDIUS_INTRO) || instance->GetBossState(BOSS_THADDIUS) == DONE)
|
||||
return true;
|
||||
|
||||
if (Creature* thaddius = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_THADDIUS_BOSS)))
|
||||
{
|
||||
if (Creature* thaddius = instance->GetCreature(DATA_THADDIUS_BOSS))
|
||||
thaddius->AI()->Talk(SAY_GREET);
|
||||
}
|
||||
instance->SetData(DATA_HAD_THADDIUS_GREET, 1);
|
||||
|
||||
instance->SetData(DATA_THADDIUS_INTRO, 1);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -18,68 +18,78 @@
|
||||
#ifndef DEF_NAXXRAMAS_H
|
||||
#define DEF_NAXXRAMAS_H
|
||||
|
||||
#include "CreatureAIImpl.h"
|
||||
|
||||
#define DataHeader "NAX"
|
||||
|
||||
#define NaxxramasScriptName "instance_naxxramas"
|
||||
|
||||
enum Encouters
|
||||
enum NaxxramasEncouter
|
||||
{
|
||||
BOSS_PATCHWERK = 0,
|
||||
BOSS_GROBBULUS = 1,
|
||||
BOSS_GLUTH = 2,
|
||||
BOSS_NOTH = 3,
|
||||
BOSS_HEIGAN = 4,
|
||||
BOSS_LOATHEB = 5,
|
||||
BOSS_ANUB = 6,
|
||||
BOSS_FAERLINA = 7,
|
||||
BOSS_MAEXXNA = 8,
|
||||
BOSS_THADDIUS = 9,
|
||||
BOSS_RAZUVIOUS = 10,
|
||||
BOSS_GOTHIK = 11,
|
||||
BOSS_HORSEMAN = 12,
|
||||
BOSS_SAPPHIRON = 13,
|
||||
BOSS_KELTHUZAD = 14,
|
||||
MAX_ENCOUNTERS,
|
||||
BOSS_PATCHWERK = 0,
|
||||
BOSS_GROBBULUS = 1,
|
||||
BOSS_GLUTH = 2,
|
||||
BOSS_NOTH = 3,
|
||||
BOSS_HEIGAN = 4,
|
||||
BOSS_LOATHEB = 5,
|
||||
BOSS_ANUB = 6,
|
||||
BOSS_FAERLINA = 7,
|
||||
BOSS_MAEXXNA = 8,
|
||||
BOSS_THADDIUS = 9,
|
||||
BOSS_RAZUVIOUS = 10,
|
||||
BOSS_GOTHIK = 11,
|
||||
BOSS_HORSEMAN = 12,
|
||||
BOSS_SAPPHIRON = 13,
|
||||
BOSS_KELTHUZAD = 14,
|
||||
MAX_ENCOUNTERS
|
||||
};
|
||||
|
||||
enum NXData
|
||||
enum NaxxramasData
|
||||
{
|
||||
DATA_NOTH_ENTRY_GATE = 100,
|
||||
DATA_HEIGAN_ERUPTION = 101,
|
||||
DATA_HEIGAN_ENTER_GATE = 102,
|
||||
DATA_LOATHEB_GATE = 103,
|
||||
DATA_FAERLINA_WEB = 105,
|
||||
DATA_MAEXXNA_GATE = 106,
|
||||
DATA_THADDIUS_BOSS = 107,
|
||||
DATA_STALAGG_BOSS = 108,
|
||||
DATA_FEUGEN_BOSS = 109,
|
||||
DATA_THADDIUS_GATE = 110,
|
||||
DATA_RAZUVIOUS = 111,
|
||||
DATA_GOTHIK_BOSS = 112,
|
||||
DATA_GOTHIK_ENTER_GATE = 113,
|
||||
DATA_GOTHIK_INNER_GATE = 114,
|
||||
DATA_GOTHIK_EXIT_GATE = 115,
|
||||
DATA_HORSEMEN_GATE = 116,
|
||||
DATA_LICH_KING_BOSS = 117,
|
||||
DATA_KELTHUZAD_FLOOR = 118,
|
||||
DATA_ABOMINATION_KILLED = 119,
|
||||
DATA_FRENZY_REMOVED = 120,
|
||||
DATA_CHARGES_CROSSED = 121,
|
||||
DATA_SPORE_KILLED = 122,
|
||||
DATA_HUNDRED_CLUB = 123,
|
||||
DATA_DANCE_FAIL = 124,
|
||||
DATA_IMMORTAL_FAIL = 125,
|
||||
DATA_KELTHUZAD_GATE = 126,
|
||||
DATA_HAD_THADDIUS_GREET = 127,
|
||||
DATA_KELTHUZAD_PORTAL_1 = 128,
|
||||
DATA_KELTHUZAD_PORTAL_2 = 129,
|
||||
DATA_KELTHUZAD_PORTAL_3 = 130,
|
||||
DATA_KELTHUZAD_PORTAL_4 = 131
|
||||
DATA_PATCHWERK_BOSS = 100,
|
||||
DATA_STALAGG_BOSS = 101,
|
||||
DATA_FEUGEN_BOSS = 102,
|
||||
DATA_THADDIUS_BOSS = 103,
|
||||
DATA_RAZUVIOUS_BOSS = 104,
|
||||
DATA_GOTHIK_BOSS = 105,
|
||||
DATA_BARON_RIVENDARE_BOSS = 106,
|
||||
DATA_SIR_ZELIEK_BOSS = 107,
|
||||
DATA_LADY_BLAUMEUX_BOSS = 108,
|
||||
DATA_THANE_KORTHAZZ_BOSS = 109,
|
||||
DATA_SAPPHIRON_BOSS = 110,
|
||||
DATA_KELTHUZAD_BOSS = 111,
|
||||
DATA_LICH_KING_BOSS = 112,
|
||||
|
||||
DATA_LOATHEB_PORTAL = 200,
|
||||
DATA_MAEXXNA_PORTAL = 201,
|
||||
DATA_THADDIUS_PORTAL = 202,
|
||||
DATA_HORSEMAN_PORTAL = 203,
|
||||
DATA_GOTHIK_INNER_GATE = 204,
|
||||
DATA_SAPPHIRON_GATE = 205,
|
||||
DATA_KELTHUZAD_GATE = 206,
|
||||
DATA_KELTHUZAD_FLOOR = 207,
|
||||
DATA_KELTHUZAD_PORTAL_1 = 208,
|
||||
DATA_KELTHUZAD_PORTAL_2 = 209,
|
||||
DATA_KELTHUZAD_PORTAL_3 = 210,
|
||||
DATA_KELTHUZAD_PORTAL_4 = 211,
|
||||
|
||||
DATA_HEIGAN_ERUPTION = 300,
|
||||
DATA_DANCE_FAIL = 301,
|
||||
DATA_SPORE_KILLED = 302,
|
||||
DATA_FRENZY_REMOVED = 303,
|
||||
DATA_THADDIUS_INTRO = 304,
|
||||
DATA_CHARGES_CROSSED = 305,
|
||||
DATA_HUNDRED_CLUB = 306,
|
||||
DATA_ABOMINATION_KILLED = 307,
|
||||
};
|
||||
|
||||
enum NXGOs
|
||||
enum NaxxramasPersistentData
|
||||
{
|
||||
PERSISTENT_DATA_THADDIUS_INTRO = 0,
|
||||
PERSISTENT_DATA_KELTHUZAD_DIALOG = 1,
|
||||
PERSISTENT_DATA_IMMORTAL_FAIL = 2,
|
||||
PERSISTENT_DATA_COUNT
|
||||
};
|
||||
|
||||
enum NaxxramasGameObject
|
||||
{
|
||||
GO_PATCHWERK_GATE = 181123,
|
||||
GO_GLUTH_GATE = 181120,
|
||||
@@ -129,8 +139,25 @@ enum NXGOs
|
||||
GO_CONS_EYE_RAMP_BOSS = 181232
|
||||
};
|
||||
|
||||
enum NXNPCs
|
||||
enum NaxxramasGameObjectsDisplayId
|
||||
{
|
||||
GO_DISPLAY_ID_HEIGAN_ERUPTION1 = 1287,
|
||||
GO_DISPLAY_ID_HEIGAN_ERUPTION2 = 6785
|
||||
};
|
||||
|
||||
enum NaxxramasCreatureId
|
||||
{
|
||||
// Patchwerk
|
||||
NPC_PATCHWERK = 16028,
|
||||
NPC_PATCHWORK_GOLEM = 16017,
|
||||
NPC_BILE_RETCHER = 16018,
|
||||
NPC_MAD_SCIENTIST = 16020,
|
||||
NPC_LIVING_MONSTROSITY = 16021,
|
||||
NPC_SURGICAL_ASSIST = 16022,
|
||||
NPC_SLUDGE_BELCHER = 16029,
|
||||
|
||||
NPC_LIVING_POISON = 16027,
|
||||
|
||||
// Thaddius
|
||||
NPC_THADDIUS = 15928,
|
||||
NPC_STALAGG = 15929,
|
||||
@@ -139,6 +166,9 @@ enum NXNPCs
|
||||
// Razuvious
|
||||
NPC_RAZUVIOUS = 16061,
|
||||
|
||||
// Gothik
|
||||
NPC_GOTHIK = 16060,
|
||||
|
||||
// Four horseman
|
||||
NPC_BARON_RIVENDARE = 30549,
|
||||
NPC_SIR_ZELIEK = 16063,
|
||||
@@ -150,30 +180,124 @@ enum NXNPCs
|
||||
|
||||
// Kel'Thuzad
|
||||
NPC_KELTHUZAD = 15990,
|
||||
NPC_LICH_KING = 16980,
|
||||
|
||||
// Frogger
|
||||
NPC_LIVING_POISON = 16027,
|
||||
NPC_NAXXRAMAS_TRIGGER = 16082,
|
||||
NPC_MR_BIGGLESWORTH = 16998,
|
||||
|
||||
// Patchwerk
|
||||
NPC_PATCHWERK = 16028,
|
||||
NPC_PATCHWORK_GOLEM = 16017,
|
||||
NPC_BILE_RETCHER = 16018,
|
||||
NPC_MAD_SCIENTIST = 16020,
|
||||
NPC_LIVING_MONSTROSITY = 16021,
|
||||
NPC_SURGICAL_ASSIST = 16022,
|
||||
NPC_SLUDGE_BELCHER = 16029,
|
||||
|
||||
// Gothik
|
||||
NPC_GOTHIK = 16060
|
||||
NPC_LICH_KING = 16980
|
||||
};
|
||||
|
||||
enum NXMisc
|
||||
enum NaxxramasAchievemmentCriteria
|
||||
{
|
||||
ACHIEV_CRITERIA_AND_THEY_WOULD_ALL_GO_DOWN_TOGETHER_10_PLAYER = 7600, // And They Would All Go Down Together (10 player)
|
||||
ACHIEV_CRITERIA_AND_THEY_WOULD_ALL_GO_DOWN_TOGETHER_25_PLAYER = 7601, // And They Would All Go Down Together (25 player)
|
||||
|
||||
ACHIEV_CRITERIA_JUST_CANT_GET_ENOUGH_10_PLAYER = 7614, // Just Can't Get Enough (10 player)
|
||||
ACHIEV_CRITERIA_JUST_CANT_GET_ENOUGH_25_PLAYER = 7615, // Just Can't Get Enough (25 player)
|
||||
|
||||
ACHIEV_CRITERIA_MOMMA_SAID_KNOCK_YOU_OUT_10_PLAYER = 7265, // Momma Said Knock You Out (10 player)
|
||||
ACHIEV_CRITERIA_MOMMA_SAID_KNOCK_YOU_OUT_25_PLAYER = 7549, // Momma Said Knock You Out (25 player)
|
||||
|
||||
ACHIEV_CRITERIA_SHOKING_10_PLAYER = 7604, // Shocking! (10 player)
|
||||
ACHIEV_CRITERIA_SHOKING_25_PLAYER = 7605, // Shocking! (25 player)
|
||||
|
||||
ACHIEV_CRITERIA_SPORE_LOSER_10_PLAYER = 7612, // Spore Loser (10 player)
|
||||
ACHIEV_CRITERIA_SPORE_LOSER_25_PLAYER = 7613, // Spore Loser (25 player)
|
||||
|
||||
ACHIEV_CRITERIA_THE_SAFETY_DANCE_10_PLAYER = 7264, // The Safety Dance (10 player)
|
||||
ACHIEV_CRITERIA_THE_SAFETY_DANCE_25_PLAYER = 7548, // The Safety Dance (25 player)
|
||||
|
||||
ACHIEV_CRITERIA_SUBTRACTION_10_PLAYER = 7608, // Subtraction (10 player)
|
||||
ACHIEV_CRITERIA_SUBTRACTION_25_PLAYER = 7609, // Subtraction (25 player)
|
||||
|
||||
ACHIEV_CRITERIA_THE_HUNDRED_CLUB_10_PLAYER = 7567, // The Hundred Club (10 player)
|
||||
ACHIEV_CRITERIA_THE_HUNDRED_CLUB_25_PLAYER = 7568, // The Hundred Club (25 player)
|
||||
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_ANUB_10_PLAYER = 7146, // The Dedicated Few (25 player) - Anub'Rekhan
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_FAERLINA_10_PLAYER = 7147, // The Dedicated Few (25 player) - Grand Widow Faerlina
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_MAEXXNA_10_PLAYER = 7148, // The Dedicated Few (25 player) - Maexxna
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_PATCHWERK_10_PLAYER = 7149, // The Dedicated Few (25 player) - Patchwerk
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_GROBBULUS_10_PLAYER = 7150, // The Dedicated Few (25 player) - Grobbulus
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_GLUTH_10_PLAYER = 7151, // The Dedicated Few (25 player) - Gluth
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_THADDIUS_10_PLAYER = 7152, // The Dedicated Few (25 player) - Thaddius
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_NOTH_10_PLAYER = 7153, // The Dedicated Few (25 player) - Noth the Plaguebringer
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_HEIGAN_10_PLAYER = 7154, // The Dedicated Few (25 player) - Heigan the Unclean
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_LOATHEB_10_PLAYER = 7155, // The Dedicated Few (25 player) - Loatheb
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_RAZUVIOUS_10_PLAYER = 7156, // The Dedicated Few (25 player) - Instructor Razuvious
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_GOTHIK_10_PLAYER = 7157, // The Dedicated Few (25 player) - Gothik the Harvester
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_SAPPHIRON_10_PLAYER = 7158, // The Dedicated Few (25 player) - Sapphiron
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_KELTHUZAD_10_PLAYER = 6802, // The Dedicated Few (25 player) - Kel'Thuzad
|
||||
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_ANUB_25_PLAYER = 7159, // The Dedicated Few (25 player) - Anub'Rekhan
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_FAERLINA_25_PLAYER = 7160, // The Dedicated Few (25 player) - Grand Widow Faerlina
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_MAEXXNA_25_PLAYER = 7161, // The Dedicated Few (25 player) - Maexxna
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_PATCHWERK_25_PLAYER = 7162, // The Dedicated Few (25 player) - Patchwerk
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_GROBBULUS_25_PLAYER = 7163, // The Dedicated Few (25 player) - Grobbulus
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_GLUTH_25_PLAYER = 7164, // The Dedicated Few (25 player) - Gluth
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_THADDIUS_25_PLAYER = 7165, // The Dedicated Few (25 player) - Thaddius
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_NOTH_25_PLAYER = 7166, // The Dedicated Few (25 player) - Noth the Plaguebringer
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_HEIGAN_25_PLAYER = 7167, // The Dedicated Few (25 player) - Heigan the Unclean
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_LOATHEB_25_PLAYER = 7168, // The Dedicated Few (25 player) - Loatheb
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_RAZUVIOUS_25_PLAYER = 7169, // The Dedicated Few (25 player) - Instructor Razuvious
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_GOTHIK_25_PLAYER = 7170, // The Dedicated Few (25 player) - Gothik the Harvester
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_SAPPHIRON_25_PLAYER = 7171, // The Dedicated Few (25 player) - Sapphiron
|
||||
ACHIEV_CRITERIA_THE_DEDICATED_FEW_KELTHUZAD_25_PLAYER = 7172, // The Dedicated Few (25 player) - Kel'Thuzad
|
||||
|
||||
ACHIEV_CRITERIA_THE_UNDYING_KELTHUZAD = 7617, // The Undying - Kel'Thuzad
|
||||
ACHIEV_CRITERIA_THE_UNDYING_THE_FOUR_HORSEMEN = 13237, // The Undying - The Four Horsemen
|
||||
ACHIEV_CRITERIA_THE_UNDYING_MAEXXNA = 13238, // The Undying - Maexxna
|
||||
ACHIEV_CRITERIA_THE_UNDYING_LOATHEB = 13239, // The Undying - Loatheb
|
||||
ACHIEV_CRITERIA_THE_UNDYING_THADDIUS = 13240, // The Undying - Thaddius
|
||||
|
||||
ACHIEV_CRITERIA_THE_IMMORTAL_KELTHUZAD = 7616, // The Immortal - Kel'Thuzad
|
||||
ACHIEV_CRITERIA_THE_IMMORTAL_THE_FOUR_HORSEMEN = 13233, // The Immortal - The Four Horsemen
|
||||
ACHIEV_CRITERIA_THE_IMMORTAL_MAEXXNA = 13234, // The Immortal - Maexxna
|
||||
ACHIEV_CRITERIA_THE_IMMORTAL_LOATHEB = 13235, // The Immortal - Loatheb
|
||||
ACHIEV_CRITERIA_THE_IMMORTAL_THADDIUS = 13236 // The Immortal - Thaddius
|
||||
};
|
||||
|
||||
enum NaxxramasSay
|
||||
{
|
||||
SAY_HORSEMEN_DIALOG1 = 5,
|
||||
SAY_HORSEMEN_DIALOG2 = 6,
|
||||
|
||||
SAY_SAPP_DIALOG1 = 0,
|
||||
SAY_SAPP_DIALOG2_LICH = 1,
|
||||
SAY_SAPP_DIALOG3 = 2,
|
||||
SAY_SAPP_DIALOG4_LICH = 2,
|
||||
SAY_SAPP_DIALOG5 = 4,
|
||||
SAY_SAPP_DIALOG6 = 20,
|
||||
|
||||
SAY_CAT_DIED = 5, // No!!! A curse upon you, interlopers! The armies of the Lich King will hunt you down. You will not escape your fate...
|
||||
SAY_FIRST_WING_TAUNT = 16
|
||||
};
|
||||
|
||||
enum NaxxramasEvent
|
||||
{
|
||||
EVENT_SUMMON_LIVING_POISON = 1,
|
||||
EVENT_THADDIUS_SCREAMS = 2,
|
||||
EVENT_AND_THEY_WOULD_ALL_GO_DOWN_TOGETHER = 3,
|
||||
EVENT_KELTHUZAD_WING_TAUNT = 4,
|
||||
|
||||
EVENT_HORSEMEN_INTRO1 = 5, // Thane Korth'azz: To arms, ye roustabouts! We've got company!
|
||||
EVENT_HORSEMEN_INTRO2 = 6, // Sir Zeliek: Invaders, cease this foolish venture at once! Turn away while you still can!
|
||||
EVENT_HORSEMEN_INTRO3 = 7, // Lady Blaumeux: Come, Zeliek, do not drive them out. Not before we've had our fun!
|
||||
EVENT_HORSEMEN_INTRO4 = 8, // Baron Rivendare: Enough prattling. Let them come. We shall grind their bones to dust.
|
||||
EVENT_HORSEMEN_INTRO5 = 9, // Lady Blaumeux: I do hope they stay alive long enough for me to... introduce myself.
|
||||
EVENT_HORSEMEN_INTRO6 = 10, // Sir Zeliek: Perhaps they will come to their senses... and run away as fast as they can.
|
||||
EVENT_HORSEMEN_INTRO7 = 11, // Thane Korth'azz: I've heard about enough a' yer snivelin'! Shut yer flytrap before I shut it for ye'!
|
||||
EVENT_HORSEMEN_INTRO8 = 12, // Baron Rivendare: Conserve your anger. Harness your rage. You will all have outlets for your frustrations soon enough.
|
||||
|
||||
EVENT_FROSTWYRM_WATERFALL_DOOR = 13,
|
||||
EVENT_KELTHUZAD_LICH_KING_TALK1 = 14,
|
||||
EVENT_KELTHUZAD_LICH_KING_TALK2 = 15,
|
||||
EVENT_KELTHUZAD_LICH_KING_TALK3 = 16,
|
||||
EVENT_KELTHUZAD_LICH_KING_TALK4 = 17,
|
||||
EVENT_KELTHUZAD_LICH_KING_TALK5 = 18,
|
||||
EVENT_KELTHUZAD_LICH_KING_TALK6 = 19
|
||||
};
|
||||
|
||||
enum NaxxramasMisc
|
||||
{
|
||||
SPELL_ERUPTION = 29371,
|
||||
SPELL_FROGGER_EXPLODE = 28433,
|
||||
SPELL_EXPLODE = 28433,
|
||||
SPELL_THE_FOUR_HORSEMAN_CREDIT = 59450,
|
||||
|
||||
ACTION_SAPPHIRON_BIRTH = 1,
|
||||
|
||||
@@ -181,32 +305,19 @@ enum NXMisc
|
||||
SOUND_SCREAM = 8873
|
||||
};
|
||||
|
||||
enum NXSays
|
||||
{
|
||||
SAY_SAPP_DIALOG1 = 0,
|
||||
SAY_SAPP_DIALOG2_LICH = 1,
|
||||
SAY_SAPP_DIALOG3 = 2,
|
||||
SAY_SAPP_DIALOG4_LICH = 2,
|
||||
SAY_SAPP_DIALOG5 = 4,
|
||||
SAY_SAPP_DIALOG6 = 20,
|
||||
SAY_CAT_DIED = 5,
|
||||
SAY_FIRST_WING_TAUNT = 16,
|
||||
SAY_HORSEMEN_DIALOG1 = 5,
|
||||
SAY_HORSEMEN_DIALOG2 = 6
|
||||
};
|
||||
static constexpr uint32 NaxxramasMapId = 533;
|
||||
static constexpr uint8 HeiganEruptSectionCount = 4;
|
||||
static constexpr uint8 HorsemanCount = 4;
|
||||
static constexpr uint8 AbominationKillCountReq = 18;
|
||||
static constexpr uint8 TheDedicatedFew10PlayerReq = 9;
|
||||
static constexpr uint8 TheDedicatedFew25PlayerReq = 21;
|
||||
|
||||
enum NXEvents
|
||||
{
|
||||
EVENT_THADDIUS_SCREAMS = 0,
|
||||
EVENT_KELTHUZAD_WING_TAUNT = 1,
|
||||
EVENT_FROSTWYRM_WATERFALL_DOOR = 2,
|
||||
EVENT_HORSEMEN_INTRO = 3
|
||||
};
|
||||
|
||||
template <class AI, class T>
|
||||
template<typename AI, typename T>
|
||||
inline AI* GetNaxxramasAI(T* obj)
|
||||
{
|
||||
return GetInstanceAI<AI>(obj, NaxxramasScriptName);
|
||||
}
|
||||
|
||||
#define RegisterNaxxramasCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetNaxxramasAI)
|
||||
|
||||
#endif
|
||||
|
||||
@@ -279,7 +279,7 @@ enum eWgQueue
|
||||
NPC_ARCANIST_BRAEDIN = 32169,
|
||||
NPC_MAGISTER_SURDIEL = 32170,
|
||||
|
||||
SPELL_FROST_ARMOR = 31256
|
||||
SPELL_FROST_ARMOR = 12544
|
||||
};
|
||||
|
||||
class npc_wg_queue : public CreatureScript
|
||||
|
||||
@@ -90,7 +90,7 @@ void UpdateCreatureHalaa(ObjectGuid::LowType spawnId, Map* map, float x, float y
|
||||
sObjectMgr->AddCreatureToGrid(spawnId, &data);
|
||||
|
||||
// Spawn if necessary (loaded grids only)
|
||||
if (!map->Instanceable() && !map->IsGridCreated(x, y))
|
||||
if (!map->Instanceable() && map->IsGridLoaded(x, y))
|
||||
{
|
||||
Creature* creature = new Creature();
|
||||
if (!creature->LoadCreatureFromDB(spawnId, map, true, true))
|
||||
|
||||
@@ -508,7 +508,7 @@ class spell_rog_prey_on_the_weak : public AuraScript
|
||||
if (!victim && target->IsPlayer())
|
||||
victim = target->ToPlayer()->GetSelectedUnit();
|
||||
|
||||
if (victim && (target->GetHealthPct() > victim->GetHealthPct()))
|
||||
if (victim && victim->IsAlive() && (target->GetHealthPct() > victim->GetHealthPct()))
|
||||
{
|
||||
if (!target->HasAura(SPELL_ROGUE_PREY_ON_THE_WEAK))
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user