fix(Scripts/Naxxramas): refactored instance script (#21539)

This commit is contained in:
Razor2142
2025-02-25 19:40:42 +01:00
committed by GitHub
parent 9f99e89bc3
commit a2eaa57394
18 changed files with 1053 additions and 1756 deletions

View File

@@ -0,0 +1,8 @@
-- update Mr. Bigglesworth script name
UPDATE `creature_template` SET `ScriptName` = 'npc_mr_bigglesworth' WHERE (`entry` = 16998);
-- update Living Poison script name
UPDATE `creature_template` SET `ScriptName` = 'npc_living_poison' WHERE (`entry` = 16027);
-- update Naxxramas Trigger script name
UPDATE `creature_template` SET `ScriptName` = 'npc_naxxramas_trigger' WHERE (`entry` = 16082);

View File

@@ -118,7 +118,7 @@ public:
Talk(SAY_SLAY); Talk(SAY_SLAY);
victim->CastSpell(victim, SPELL_SUMMON_CORPSE_SCRABS_5, true, nullptr, nullptr, me->GetGUID()); 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 void JustEngagedWith(Unit* who) override

View File

@@ -83,8 +83,6 @@ public:
BossAI::Reset(); BossAI::Reset();
summons.DespawnAll(); summons.DespawnAll();
SummonHelpers(); SummonHelpers();
if (GameObject* go = me->GetMap()->GetGameObject(instance->GetGuidData(DATA_FAERLINA_WEB)))
go->SetGoState(GO_STATE_ACTIVE);
} }
void JustEngagedWith(Unit* who) override void JustEngagedWith(Unit* who) override
@@ -114,9 +112,6 @@ public:
else else
context.Repeat(30s); context.Repeat(30s);
}); });
if (GameObject* go = me->GetMap()->GetGameObject(instance->GetGuidData(DATA_FAERLINA_WEB)))
go->SetGoState(GO_STATE_READY);
} }
void MoveInLineOfSight(Unit* who) override void MoveInLineOfSight(Unit* who) override
@@ -137,15 +132,13 @@ public:
if (!urand(0, 3)) if (!urand(0, 3))
Talk(SAY_SLAY); Talk(SAY_SLAY);
instance->SetData(DATA_IMMORTAL_FAIL, 0); instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
} }
void JustDied(Unit* killer) override void JustDied(Unit* killer) override
{ {
BossAI::JustDied(killer); BossAI::JustDied(killer);
Talk(SAY_DEATH); 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 void SpellHit(Unit* caster, SpellInfo const* spell) override

View File

@@ -131,7 +131,6 @@ public:
{ {
explicit boss_four_horsemenAI(Creature* c) : BossAI(c, BOSS_HORSEMAN) explicit boss_four_horsemenAI(Creature* c) : BossAI(c, BOSS_HORSEMAN)
{ {
pInstance = me->GetInstanceScript();
switch (me->GetEntry()) switch (me->GetEntry())
{ {
case NPC_SIR_ZELIEK: case NPC_SIR_ZELIEK:
@@ -150,7 +149,6 @@ public:
} }
EventMap events; EventMap events;
InstanceScript* pInstance;
uint8 currentWaypoint{}; uint8 currentWaypoint{};
uint8 movementPhase{}; uint8 movementPhase{};
uint8 horsemanId; uint8 horsemanId;
@@ -203,16 +201,6 @@ public:
{ {
events.RescheduleEvent(EVENT_SECONDARY_SPELL, 15s); 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 void MovementInform(uint32 type, uint32 id) override
@@ -262,36 +250,19 @@ public:
return; return;
Talk(SAY_SLAY); Talk(SAY_SLAY);
if (pInstance) instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
{
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
}
} }
void JustDied(Unit* killer) override void JustDied(Unit* killer) override
{ {
BossAI::JustDied(killer); 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); 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 void JustEngagedWith(Unit* who) override
@@ -305,13 +276,6 @@ public:
me->SetSpeed(MOVE_RUN, me->GetSpeedRate(MOVE_RUN), true); me->SetSpeed(MOVE_RUN, me->GetSpeedRate(MOVE_RUN), true);
MoveToCorner(); MoveToCorner();
} }
if (pInstance)
{
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_HORSEMEN_GATE)))
{
go->SetGoState(GO_STATE_READY);
}
}
} }
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override

View File

@@ -79,13 +79,10 @@ public:
struct boss_gluthAI : public BossAI struct boss_gluthAI : public BossAI
{ {
explicit boss_gluthAI(Creature* c) : BossAI(c, BOSS_GLUTH), summons(me) explicit boss_gluthAI(Creature* c) : BossAI(c, BOSS_GLUTH), summons(me)
{ {}
pInstance = me->GetInstanceScript();
}
EventMap events; EventMap events;
SummonList summons; SummonList summons;
InstanceScript* pInstance;
void Reset() override void Reset() override
{ {
@@ -138,13 +135,10 @@ public:
void KilledUnit(Unit* who) override void KilledUnit(Unit* who) override
{ {
if (me->IsAlive() && who->GetEntry() == NPC_ZOMBIE_CHOW) if (me->IsAlive() && who->GetEntry() == NPC_ZOMBIE_CHOW)
{
me->ModifyHealth(int32(me->GetMaxHealth() * 0.05f)); me->ModifyHealth(int32(me->GetMaxHealth() * 0.05f));
}
if (who->IsPlayer() && pInstance) if (who->IsPlayer())
{ instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
}
} }
void JustDied(Unit* killer) override void JustDied(Unit* killer) override

View File

@@ -201,12 +201,10 @@ public:
struct boss_gothikAI : public BossAI struct boss_gothikAI : public BossAI
{ {
explicit boss_gothikAI(Creature* c) : BossAI(c, BOSS_GOTHIK), summons(me) explicit boss_gothikAI(Creature* c) : BossAI(c, BOSS_GOTHIK), summons(me)
{ {}
pInstance = me->GetInstanceScript();
}
EventMap events; EventMap events;
SummonList summons; SummonList summons;
InstanceScript* pInstance;
bool secondPhase{}; bool secondPhase{};
bool gateOpened{}; bool gateOpened{};
uint8 waveCount{}; uint8 waveCount{};
@@ -233,21 +231,6 @@ public:
gateOpened = false; gateOpened = false;
waveCount = 0; waveCount = 0;
me->NearTeleportTo(2642.139f, -3386.959f, 285.492f, 6.265f); 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 void JustEngagedWith(Unit* who) override
@@ -261,17 +244,6 @@ public:
me->SetUnitFlag(UNIT_FLAG_DISABLE_MOVE); me->SetUnitFlag(UNIT_FLAG_DISABLE_MOVE);
events.ScheduleEvent(EVENT_SUMMON_ADDS, 30s); events.ScheduleEvent(EVENT_SUMMON_ADDS, 30s);
events.ScheduleEvent(EVENT_CHECK_PLAYERS, 2min); 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 void JustSummoned(Creature* summon) override
@@ -327,10 +299,7 @@ public:
return; return;
Talk(SAY_KILL); Talk(SAY_KILL);
if (pInstance) instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
{
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
}
} }
void JustDied(Unit* killer) override void JustDied(Unit* killer) override
@@ -338,21 +307,6 @@ public:
BossAI::JustDied(killer); BossAI::JustDied(killer);
Talk(SAY_DEATH); Talk(SAY_DEATH);
summons.DespawnAll(); 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) void SummonHelpers(uint32 entry)
@@ -472,12 +426,11 @@ public:
events.Repeat(20s); events.Repeat(20s);
break; break;
case EVENT_CHECK_HEALTH: 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); go->SetGoState(GO_STATE_ACTIVE);
}
events.CancelEvent(EVENT_TELEPORT); events.CancelEvent(EVENT_TELEPORT);
break; break;
} }
@@ -509,10 +462,9 @@ public:
case EVENT_CHECK_PLAYERS: case EVENT_CHECK_PLAYERS:
if (!CheckGroupSplitted()) 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); go->SetGoState(GO_STATE_ACTIVE);
}
gateOpened = true; gateOpened = true;
Talk(EMOTE_GATE_OPENED); Talk(EMOTE_GATE_OPENED);
} }
@@ -597,10 +549,8 @@ public:
void KilledUnit(Unit* who) override void KilledUnit(Unit* who) override
{ {
if (who->IsPlayer() && me->GetInstanceScript()) if (who->IsPlayer())
{ me->GetInstanceScript()->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
me->GetInstanceScript()->SetData(DATA_IMMORTAL_FAIL, 0);
}
} }
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
@@ -767,17 +717,14 @@ public:
// dead side summons are "owned" by gothik // dead side summons are "owned" by gothik
void JustSummoned(Creature* summon) override 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); gothik->AI()->JustSummoned(summon);
}
} }
void SummonedCreatureDespawn(Creature* summon) override 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); gothik->AI()->SummonedCreatureDespawn(summon);
}
} }
}; };
}; };

View File

@@ -70,13 +70,10 @@ public:
struct boss_grobbulusAI : public BossAI struct boss_grobbulusAI : public BossAI
{ {
explicit boss_grobbulusAI(Creature* c) : BossAI(c, BOSS_GROBBULUS), summons(me) explicit boss_grobbulusAI(Creature* c) : BossAI(c, BOSS_GROBBULUS), summons(me)
{ {}
pInstance = me->GetInstanceScript();
}
EventMap events; EventMap events;
SummonList summons; SummonList summons;
InstanceScript* pInstance;
uint32 dropSludgeTimer{}; uint32 dropSludgeTimer{};
void Reset() override void Reset() override
@@ -138,10 +135,8 @@ public:
void KilledUnit(Unit* who) override void KilledUnit(Unit* who) override
{ {
if (who->IsPlayer() && pInstance) if (who->IsPlayer())
{ instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
}
} }
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
@@ -217,10 +212,8 @@ public:
void KilledUnit(Unit* who) override void KilledUnit(Unit* who) override
{ {
if (who->IsPlayer() && me->GetInstanceScript()) if (who->IsPlayer())
{ me->GetInstanceScript()->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
me->GetInstanceScript()->SetData(DATA_IMMORTAL_FAIL, 0);
}
} }
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override

View File

@@ -69,11 +69,8 @@ public:
struct boss_heiganAI : public BossAI struct boss_heiganAI : public BossAI
{ {
explicit boss_heiganAI(Creature* c) : BossAI(c, BOSS_HEIGAN) explicit boss_heiganAI(Creature* c) : BossAI(c, BOSS_HEIGAN)
{ {}
pInstance = me->GetInstanceScript();
}
InstanceScript* pInstance;
EventMap events; EventMap events;
uint8 currentPhase{}; uint8 currentPhase{};
uint8 currentSection{}; uint8 currentSection{};
@@ -86,13 +83,6 @@ public:
currentPhase = 0; currentPhase = 0;
currentSection = 3; currentSection = 3;
moveRight = true; 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 void KilledUnit(Unit* who) override
@@ -101,10 +91,7 @@ public:
return; return;
Talk(SAY_SLAY); Talk(SAY_SLAY);
if (pInstance) instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
{
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
}
} }
void JustDied(Unit* killer) override void JustDied(Unit* killer) override
@@ -118,13 +105,6 @@ public:
BossAI::JustEngagedWith(who); BossAI::JustEngagedWith(who);
me->SetInCombatWithZone(); me->SetInCombatWithZone();
Talk(SAY_AGGRO); 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); StartFightPhase(PHASE_SLOW_DANCE);
} }
@@ -206,41 +186,38 @@ public:
} }
break; break;
case EVENT_ERUPT_SECTION: case EVENT_ERUPT_SECTION:
if (pInstance) {
{ instance->SetData(DATA_HEIGAN_ERUPTION, currentSection);
pInstance->SetData(DATA_HEIGAN_ERUPTION, currentSection); if (currentSection == 3)
if (currentSection == 3) moveRight = false;
{ else if (currentSection == 0)
moveRight = false; moveRight = true;
}
else if (currentSection == 0) moveRight ? currentSection++ : currentSection--;
{
moveRight = true;
}
moveRight ? currentSection++ : currentSection--;
}
if (currentPhase == PHASE_SLOW_DANCE) if (currentPhase == PHASE_SLOW_DANCE)
{
Talk(SAY_TAUNT); Talk(SAY_TAUNT);
}
events.Repeat(currentPhase == PHASE_SLOW_DANCE ? 10s : 4s); events.Repeat(currentPhase == PHASE_SLOW_DANCE ? 10s : 4s);
break; break;
}
case EVENT_SAFETY_DANCE: case EVENT_SAFETY_DANCE:
{
Map::PlayerList const& pList = me->GetMap()->GetPlayers();
for (auto const& itr : pList)
{ {
Map::PlayerList const& pList = me->GetMap()->GetPlayers(); if (IsInRoom(itr.GetSource()) && !itr.GetSource()->IsAlive())
for (auto const& itr : pList)
{ {
if (IsInRoom(itr.GetSource()) && !itr.GetSource()->IsAlive()) instance->SetData(DATA_DANCE_FAIL, 0);
{ instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
pInstance->SetData(DATA_DANCE_FAIL, 0); return;
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
return;
}
} }
events.Repeat(5s);
return;
} }
events.Repeat(5s);
return;
}
} }
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };

View File

@@ -145,15 +145,10 @@ public:
struct boss_kelthuzadAI : public BossAI struct boss_kelthuzadAI : public BossAI
{ {
explicit boss_kelthuzadAI(Creature* c) : BossAI(c, BOSS_KELTHUZAD), summons(me) explicit boss_kelthuzadAI(Creature* c) : BossAI(c, BOSS_KELTHUZAD), summons(me)
{ {}
pInstance = me->GetInstanceScript();
_justSpawned = true;
}
EventMap events; EventMap events;
SummonList summons; SummonList summons;
InstanceScript* pInstance;
bool _justSpawned;
float NormalizeOrientation(float o) float NormalizeOrientation(float o)
{ {
@@ -224,35 +219,23 @@ public:
summons.DespawnAll(); summons.DespawnAll();
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE); me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE);
me->SetReactState(REACT_AGGRESSIVE); 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->SetPhaseMask(1, true);
go->SetGoState(GO_STATE_READY); go->SetGoState(GO_STATE_READY);
} }
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_GATE)))
{ if (GameObject* go = instance->GetGameObject(DATA_KELTHUZAD_PORTAL_1))
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)))
{
go->SetGoState(GO_STATE_READY); 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); 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); 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); go->SetGoState(GO_STATE_READY);
}
} }
void EnterEvadeMode(EvadeReason why) override void EnterEvadeMode(EvadeReason why) override
@@ -267,10 +250,7 @@ public:
return; return;
Talk(SAY_SLAY); Talk(SAY_SLAY);
if (pInstance) instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
{
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
}
} }
void JustDied(Unit* killer) override void JustDied(Unit* killer) override
@@ -282,13 +262,6 @@ public:
guardian->AI()->Talk(EMOTE_GUARDIAN_FLEE); guardian->AI()->Talk(EMOTE_GUARDIAN_FLEE);
} }
Talk(SAY_DEATH); 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 void MoveInLineOfSight(Unit* who) override
@@ -312,17 +285,11 @@ public:
events.ScheduleEvent(EVENT_SUMMON_SOUL_WEAVER, 12s); events.ScheduleEvent(EVENT_SUMMON_SOUL_WEAVER, 12s);
events.ScheduleEvent(EVENT_PHASE_2, 228s); events.ScheduleEvent(EVENT_PHASE_2, 228s);
events.ScheduleEvent(EVENT_ENRAGE, 15min); 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);
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);
} }
} }
@@ -354,14 +321,11 @@ public:
switch (events.ExecuteEvent()) switch (events.ExecuteEvent())
{ {
case EVENT_FLOOR_CHANGE: 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);
events.ScheduleEvent(EVENT_FLOOR_CHANGE, 15s); go->SetPhaseMask(2, true);
go->SetGoState(GO_STATE_READY);
go->SetPhaseMask(2, true);
}
} }
break; break;
case EVENT_SPAWN_POOL: case EVENT_SPAWN_POOL:
@@ -465,39 +429,32 @@ public:
Talk(SAY_REQUEST_AID); Talk(SAY_REQUEST_AID);
events.DelayEvents(5500ms); events.DelayEvents(5500ms);
events.ScheduleEvent(EVENT_P3_LICH_KING_SAY, 5s); 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); 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); 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); 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); go->SetGoState(GO_STATE_ACTIVE);
}
break; break;
} }
events.Repeat(1s); events.Repeat(1s);
break; break;
case EVENT_P3_LICH_KING_SAY: case EVENT_P3_LICH_KING_SAY:
if (pInstance) {
{ if (Creature* cr = instance->GetCreature(DATA_LICH_KING_BOSS))
if (Creature* cr = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_LICH_KING_BOSS))) cr->AI()->Talk(SAY_ANSWER_REQUEST);
{
cr->AI()->Talk(SAY_ANSWER_REQUEST);
}
}
for (uint8 i = 0 ; i < RAID_MODE(2, 4); ++i) for (uint8 i = 0 ; i < RAID_MODE(2, 4); ++i)
{
events.ScheduleEvent(EVENT_SUMMON_GUARDIAN_OF_ICECROWN, 10000 + (i * 5000)); events.ScheduleEvent(EVENT_SUMMON_GUARDIAN_OF_ICECROWN, 10000 + (i * 5000));
}
break; break;
}
case EVENT_SUMMON_GUARDIAN_OF_ICECROWN: case EVENT_SUMMON_GUARDIAN_OF_ICECROWN:
if (Creature* cr = me->SummonCreature(NPC_GUARDIAN_OF_ICECROWN, SpawnPool[RAND(0, 1, 3, 4)])) if (Creature* cr = me->SummonCreature(NPC_GUARDIAN_OF_ICECROWN, SpawnPool[RAND(0, 1, 3, 4)]))
{ {
@@ -573,10 +530,8 @@ public:
void JustDied(Unit* /*killer*/) override 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); me->GetInstanceScript()->SetData(DATA_ABOMINATION_KILLED, 0);
}
} }
void AttackStart(Unit* who) override void AttackStart(Unit* who) override
@@ -618,10 +573,8 @@ public:
void KilledUnit(Unit* who) override void KilledUnit(Unit* who) override
{ {
if (who->IsPlayer() && me->GetInstanceScript()) if (who->IsPlayer())
{ me->GetInstanceScript()->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
me->GetInstanceScript()->SetData(DATA_IMMORTAL_FAIL, 0);
}
} }
void JustReachedHome() override void JustReachedHome() override

View File

@@ -62,11 +62,9 @@ public:
{ {
explicit boss_loathebAI(Creature* c) : BossAI(c, BOSS_LOATHEB), summons(me) explicit boss_loathebAI(Creature* c) : BossAI(c, BOSS_LOATHEB), summons(me)
{ {
pInstance = me->GetInstanceScript();
me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
} }
InstanceScript* pInstance;
uint8 doomCounter; uint8 doomCounter;
EventMap events; EventMap events;
SummonList summons; SummonList summons;
@@ -77,14 +75,6 @@ public:
events.Reset(); events.Reset();
summons.DespawnAll(); summons.DespawnAll();
doomCounter = 0; 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 void JustSummoned(Creature* cr) override
@@ -95,18 +85,13 @@ public:
void SummonedCreatureDies(Creature* /*cr*/, Unit*) override void SummonedCreatureDies(Creature* /*cr*/, Unit*) override
{ {
if (pInstance) instance->SetData(DATA_SPORE_KILLED, 0);
{
pInstance->SetData(DATA_SPORE_KILLED, 0);
}
} }
void KilledUnit(Unit* who) override void KilledUnit(Unit* who) override
{ {
if (who->IsPlayer() && pInstance) if (who->IsPlayer())
{ instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
}
} }
void JustEngagedWith(Unit* who) override void JustEngagedWith(Unit* who) override
@@ -118,24 +103,12 @@ public:
events.ScheduleEvent(EVENT_INEVITABLE_DOOM, 2min); events.ScheduleEvent(EVENT_INEVITABLE_DOOM, 2min);
events.ScheduleEvent(EVENT_SUMMON_SPORE, 15s); events.ScheduleEvent(EVENT_SUMMON_SPORE, 15s);
events.ScheduleEvent(EVENT_BERSERK, 12min); 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 void JustDied(Unit* killer) override
{ {
BossAI::JustDied(killer); BossAI::JustDied(killer);
summons.DespawnAll(); summons.DespawnAll();
if (pInstance)
{
pInstance->SetData(BOSS_LOATHEB, DONE);
}
} }
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override

View File

@@ -106,11 +106,8 @@ public:
struct boss_maexxnaAI : public BossAI struct boss_maexxnaAI : public BossAI
{ {
explicit boss_maexxnaAI(Creature* c) : BossAI(c, BOSS_MAEXXNA), summons(me) explicit boss_maexxnaAI(Creature* c) : BossAI(c, BOSS_MAEXXNA), summons(me)
{ {}
pInstance = me->GetInstanceScript();
}
InstanceScript* pInstance;
EventMap events; EventMap events;
SummonList summons; SummonList summons;
@@ -131,10 +128,6 @@ public:
BossAI::Reset(); BossAI::Reset();
events.Reset(); events.Reset();
summons.DespawnAll(); 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 void JustEngagedWith(Unit* who) override
@@ -147,13 +140,6 @@ public:
events.ScheduleEvent(EVENT_NECROTIC_POISON, 5s); events.ScheduleEvent(EVENT_NECROTIC_POISON, 5s);
events.ScheduleEvent(EVENT_HEALTH_CHECK, 1s); events.ScheduleEvent(EVENT_HEALTH_CHECK, 1s);
events.ScheduleEvent(EVENT_SUMMON_SPIDERLINGS, 30s); 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 void JustSummoned(Creature* cr) override
@@ -171,10 +157,8 @@ public:
void KilledUnit(Unit* who) override void KilledUnit(Unit* who) override
{ {
if (who->IsPlayer() && pInstance) if (who->IsPlayer())
{ instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
}
} }
void JustDied(Unit* killer) override void JustDied(Unit* killer) override

View File

@@ -89,11 +89,8 @@ public:
struct boss_nothAI : public BossAI struct boss_nothAI : public BossAI
{ {
explicit boss_nothAI(Creature* c) : BossAI(c, BOSS_NOTH), summons(me) explicit boss_nothAI(Creature* c) : BossAI(c, BOSS_NOTH), summons(me)
{ {}
pInstance = me->GetInstanceScript();
}
InstanceScript* pInstance;
uint8 timesInBalcony; uint8 timesInBalcony;
EventMap events; EventMap events;
SummonList summons; SummonList summons;
@@ -151,13 +148,6 @@ public:
me->SetControlled(false, UNIT_STATE_ROOT); me->SetControlled(false, UNIT_STATE_ROOT);
me->SetReactState(REACT_AGGRESSIVE); me->SetReactState(REACT_AGGRESSIVE);
timesInBalcony = 0; 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 void EnterEvadeMode(EvadeReason why) override
@@ -171,13 +161,6 @@ public:
BossAI::JustEngagedWith(who); BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO); Talk(SAY_AGGRO);
StartGroundPhase(); 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 void JustSummoned(Creature* summon) override
@@ -195,13 +178,6 @@ public:
} }
BossAI::JustDied(killer); BossAI::JustDied(killer);
Talk(SAY_DEATH); 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 void KilledUnit(Unit* who) override
@@ -210,10 +186,7 @@ public:
return; return;
Talk(SAY_SLAY); Talk(SAY_SLAY);
if (pInstance) instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
{
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
}
} }
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override

View File

@@ -63,12 +63,9 @@ public:
struct boss_patchwerkAI : public BossAI struct boss_patchwerkAI : public BossAI
{ {
explicit boss_patchwerkAI(Creature* c) : BossAI(c, BOSS_PATCHWERK) explicit boss_patchwerkAI(Creature* c) : BossAI(c, BOSS_PATCHWERK)
{ {}
pInstance = me->GetInstanceScript();
}
EventMap events; EventMap events;
InstanceScript* pInstance;
void Reset() override void Reset() override
{ {
@@ -82,13 +79,9 @@ public:
return; return;
if (!urand(0, 3)) if (!urand(0, 3))
{
Talk(SAY_SLAY); Talk(SAY_SLAY);
}
if (pInstance) instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
{
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
}
} }
void JustDied(Unit* killer) override void JustDied(Unit* killer) override
@@ -105,10 +98,7 @@ public:
events.ScheduleEvent(EVENT_HATEFUL_STRIKE, 1500ms); events.ScheduleEvent(EVENT_HATEFUL_STRIKE, 1500ms);
events.ScheduleEvent(EVENT_BERSERK, 6min); events.ScheduleEvent(EVENT_BERSERK, 6min);
events.ScheduleEvent(EVENT_HEALTH_CHECK, 1s); events.ScheduleEvent(EVENT_HEALTH_CHECK, 1s);
if (pInstance) instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
{
pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
}
} }
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override

View File

@@ -82,13 +82,10 @@ public:
struct boss_razuviousAI : public BossAI struct boss_razuviousAI : public BossAI
{ {
explicit boss_razuviousAI(Creature* c) : BossAI(c, BOSS_RAZUVIOUS), summons(me) explicit boss_razuviousAI(Creature* c) : BossAI(c, BOSS_RAZUVIOUS), summons(me)
{ {}
pInstance = me->GetInstanceScript();
}
EventMap events; EventMap events;
SummonList summons; SummonList summons;
InstanceScript* pInstance;
void SpawnHelpers() void SpawnHelpers()
{ {
@@ -210,13 +207,10 @@ public:
void KilledUnit(Unit* who) override void KilledUnit(Unit* who) override
{ {
if (roll_chance_i(30)) if (roll_chance_i(30))
{
Talk(SAY_SLAY); Talk(SAY_SLAY);
}
if (who->IsPlayer() && pInstance) if (who->IsPlayer())
{ instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
}
} }
void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask) override void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask) override
@@ -331,17 +325,16 @@ public:
switch (action) switch (action)
{ {
case ACTION_FACE_ME: case ACTION_FACE_ME:
{
scheduler.CancelGroup(GROUP_OOC_RP); scheduler.CancelGroup(GROUP_OOC_RP);
me->SetSheath(SHEATH_STATE_UNARMED); me->SetSheath(SHEATH_STATE_UNARMED);
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE);
if (InstanceScript* instance = me->GetInstanceScript())
{ if (Creature* creature = me->GetInstanceScript()->GetCreature(DATA_RAZUVIOUS_BOSS))
if (Creature* creature = instance->GetCreature(DATA_RAZUVIOUS)) me->SetFacingToObject(creature);
{
me->SetFacingToObject(creature);
}
}
break; break;
}
case ACTION_TALK: case ACTION_TALK:
Talk(SAY_DEATH_KNIGHT_UNDERSTUDY); Talk(SAY_DEATH_KNIGHT_UNDERSTUDY);
break; break;
@@ -360,22 +353,18 @@ public:
void KilledUnit(Unit* who) override void KilledUnit(Unit* who) override
{ {
if (who->IsPlayer() && me->GetInstanceScript()) if (who->IsPlayer())
{ me->GetInstanceScript()->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
me->GetInstanceScript()->SetData(DATA_IMMORTAL_FAIL, 0);
}
} }
void JustEngagedWith(Unit* who) override void JustEngagedWith(Unit* who) override
{ {
scheduler.CancelGroup(GROUP_OOC_RP); 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);
}
} }
} }

View File

@@ -92,12 +92,9 @@ public:
struct boss_sapphironAI : public BossAI struct boss_sapphironAI : public BossAI
{ {
explicit boss_sapphironAI(Creature* c) : BossAI(c, BOSS_SAPPHIRON) explicit boss_sapphironAI(Creature* c) : BossAI(c, BOSS_SAPPHIRON)
{ {}
pInstance = me->GetInstanceScript();
}
EventMap events; EventMap events;
InstanceScript* pInstance;
uint8 iceboltCount{}; uint8 iceboltCount{};
uint32 spawnTimer{}; uint32 spawnTimer{};
GuidList blockList; GuidList blockList;
@@ -221,10 +218,8 @@ public:
void KilledUnit(Unit* who) override void KilledUnit(Unit* who) override
{ {
if (who->IsPlayer() && pInstance) if (who->IsPlayer())
{ instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
}
} }
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
@@ -402,9 +397,9 @@ public:
Map::PlayerList const& pList = me->GetMap()->GetPlayers(); Map::PlayerList const& pList = me->GetMap()->GetPlayers();
for (auto const& itr : pList) 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; return;
} }
} }

View File

@@ -123,11 +123,8 @@ public:
struct boss_thaddiusAI : public BossAI struct boss_thaddiusAI : public BossAI
{ {
explicit boss_thaddiusAI(Creature* c) : BossAI(c, BOSS_THADDIUS), summons(me), ballLightningEnabled(false) explicit boss_thaddiusAI(Creature* c) : BossAI(c, BOSS_THADDIUS), summons(me), ballLightningEnabled(false)
{ {}
pInstance = me->GetInstanceScript();
}
InstanceScript* pInstance;
EventMap events; EventMap events;
SummonList summons; SummonList summons;
uint32 summonTimer{}; uint32 summonTimer{};
@@ -184,28 +181,15 @@ public:
} }
if (GameObject* go = me->FindNearestGameObject(GO_TESLA_COIL_LEFT, 100.0f)) if (GameObject* go = me->FindNearestGameObject(GO_TESLA_COIL_LEFT, 100.0f))
{
go->SetGoState(GO_STATE_ACTIVE); 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); if (GameObject* go = me->FindNearestGameObject(GO_TESLA_COIL_RIGHT, 100.0f))
pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POSITIVE_CHARGE_STACK); go->SetGoState(GO_STATE_ACTIVE);
pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_NEGATIVE_POLARITY);
pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_NEGATIVE_CHARGE_STACK); 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 void KilledUnit(Unit* who) override
@@ -214,27 +198,17 @@ public:
return; return;
Talk(SAY_SLAY); Talk(SAY_SLAY);
if (pInstance) instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
{
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
}
} }
void JustDied(Unit* killer) override void JustDied(Unit* killer) override
{ {
BossAI::JustDied(killer); BossAI::JustDied(killer);
Talk(SAY_DEATH); Talk(SAY_DEATH);
if (pInstance) instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POSITIVE_POLARITY);
{ instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POSITIVE_CHARGE_STACK);
pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POSITIVE_POLARITY); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_NEGATIVE_POLARITY);
pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POSITIVE_CHARGE_STACK); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_NEGATIVE_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);
}
}
} }
void JustSummoned(Creature* cr) override void JustSummoned(Creature* cr) override
@@ -384,11 +358,9 @@ public:
{ {
explicit boss_thaddius_summonAI(Creature* c) : ScriptedAI(c) explicit boss_thaddius_summonAI(Creature* c) : ScriptedAI(c)
{ {
pInstance = me->GetInstanceScript();
overload = false; overload = false;
} }
InstanceScript* pInstance;
EventMap events; EventMap events;
uint32 pullTimer{}; uint32 pullTimer{};
uint32 visualTimer{}; uint32 visualTimer{};
@@ -439,17 +411,11 @@ public:
{ {
events.ScheduleEvent(EVENT_MINION_MAGNETIC_PULL, 20s); 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))) cr->AI()->AttackStart(pWho);
{ cr->AddThreat(pWho, 10.0f);
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);
}
} }
} }
@@ -479,13 +445,9 @@ public:
{ {
Talk(me->GetEntry() == NPC_STALAGG ? SAY_STAL_DEATH : SAY_FEUG_DEATH); Talk(me->GetEntry() == NPC_STALAGG ? SAY_STAL_DEATH : SAY_FEUG_DEATH);
Talk(me->GetEntry() == NPC_STALAGG ? EMOTE_STAL_DEATH : EMOTE_FEUG_DEATH); Talk(me->GetEntry() == NPC_STALAGG ? EMOTE_STAL_DEATH : EMOTE_FEUG_DEATH);
if (pInstance)
{ if (Creature* cr = me->GetInstanceScript()->GetCreature(DATA_THADDIUS_BOSS))
if (Creature* cr = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_THADDIUS_BOSS))) cr->AI()->DoAction(ACTION_SUMMON_DIED);
{
cr->AI()->DoAction(ACTION_SUMMON_DIED);
}
}
} }
void KilledUnit(Unit* who) override void KilledUnit(Unit* who) override
@@ -493,14 +455,10 @@ public:
if (!who->IsPlayer()) if (!who->IsPlayer())
return; return;
if (pInstance)
{
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
}
if (!urand(0, 2)) if (!urand(0, 2))
{
Talk(me->GetEntry() == NPC_STALAGG ? SAY_STAL_SLAY : SAY_FEUG_SLAY); Talk(me->GetEntry() == NPC_STALAGG ? SAY_STAL_SLAY : SAY_FEUG_SLAY);
}
me->GetInstanceScript()->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
} }
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
@@ -547,31 +505,30 @@ public:
events.Repeat(3s); events.Repeat(3s);
break; break;
case EVENT_MINION_MAGNETIC_PULL: case EVENT_MINION_MAGNETIC_PULL:
{
events.Repeat(20s); 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 threatFeugen = feugen->GetThreatMgr().GetThreat(feugen->GetVictim());
float threatStalagg = me->GetThreatMgr().GetThreat(me->GetVictim()); float threatStalagg = me->GetThreatMgr().GetThreat(me->GetVictim());
Unit* tankFeugen = feugen->GetVictim(); Unit* tankFeugen = feugen->GetVictim();
Unit* tankStalagg = me->GetVictim(); Unit* tankStalagg = me->GetVictim();
feugen->GetThreatMgr().ModifyThreatByPercent(tankFeugen, -100); feugen->GetThreatMgr().ModifyThreatByPercent(tankFeugen, -100);
feugen->AddThreat(tankStalagg, threatFeugen); feugen->AddThreat(tankStalagg, threatFeugen);
feugen->CastSpell(tankStalagg, SPELL_MAGNETIC_PULL, true); feugen->CastSpell(tankStalagg, SPELL_MAGNETIC_PULL, true);
feugen->AI()->DoAction(ACTION_MAGNETIC_PULL); feugen->AI()->DoAction(ACTION_MAGNETIC_PULL);
me->GetThreatMgr().ModifyThreatByPercent(tankStalagg, -100); me->GetThreatMgr().ModifyThreatByPercent(tankStalagg, -100);
me->AddThreat(tankFeugen, threatStalagg); me->AddThreat(tankFeugen, threatStalagg);
me->CastSpell(tankFeugen, SPELL_MAGNETIC_PULL, true); me->CastSpell(tankFeugen, SPELL_MAGNETIC_PULL, true);
DoAction(ACTION_MAGNETIC_PULL); DoAction(ACTION_MAGNETIC_PULL);
}
} }
break; break;
}
case EVENT_MINION_CHECK_DISTANCE: case EVENT_MINION_CHECK_DISTANCE:
if (Creature* cr = ObjectAccessor::GetCreature(*me, myCoil)) if (Creature* cr = ObjectAccessor::GetCreature(*me, myCoil))
{ {
@@ -652,9 +609,9 @@ class spell_thaddius_pos_neg_charge : public SpellScript
{ {
SetHitDamage(0); 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);
} }
} }
@@ -736,15 +693,13 @@ public:
bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) override bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) override
{ {
InstanceScript* instance = player->GetInstanceScript(); 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; 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); thaddius->AI()->Talk(SAY_GREET);
}
instance->SetData(DATA_HAD_THADDIUS_GREET, 1);
instance->SetData(DATA_THADDIUS_INTRO, 1);
return true; return true;
} }
}; };

File diff suppressed because it is too large Load Diff

View File

@@ -18,68 +18,78 @@
#ifndef DEF_NAXXRAMAS_H #ifndef DEF_NAXXRAMAS_H
#define DEF_NAXXRAMAS_H #define DEF_NAXXRAMAS_H
#include "CreatureAIImpl.h"
#define DataHeader "NAX" #define DataHeader "NAX"
#define NaxxramasScriptName "instance_naxxramas" #define NaxxramasScriptName "instance_naxxramas"
enum Encouters enum NaxxramasEncouter
{ {
BOSS_PATCHWERK = 0, BOSS_PATCHWERK = 0,
BOSS_GROBBULUS = 1, BOSS_GROBBULUS = 1,
BOSS_GLUTH = 2, BOSS_GLUTH = 2,
BOSS_NOTH = 3, BOSS_NOTH = 3,
BOSS_HEIGAN = 4, BOSS_HEIGAN = 4,
BOSS_LOATHEB = 5, BOSS_LOATHEB = 5,
BOSS_ANUB = 6, BOSS_ANUB = 6,
BOSS_FAERLINA = 7, BOSS_FAERLINA = 7,
BOSS_MAEXXNA = 8, BOSS_MAEXXNA = 8,
BOSS_THADDIUS = 9, BOSS_THADDIUS = 9,
BOSS_RAZUVIOUS = 10, BOSS_RAZUVIOUS = 10,
BOSS_GOTHIK = 11, BOSS_GOTHIK = 11,
BOSS_HORSEMAN = 12, BOSS_HORSEMAN = 12,
BOSS_SAPPHIRON = 13, BOSS_SAPPHIRON = 13,
BOSS_KELTHUZAD = 14, BOSS_KELTHUZAD = 14,
MAX_ENCOUNTERS, MAX_ENCOUNTERS
}; };
enum NXData enum NaxxramasData
{ {
DATA_NOTH_ENTRY_GATE = 100, DATA_PATCHWERK_BOSS = 100,
DATA_HEIGAN_ERUPTION = 101, DATA_STALAGG_BOSS = 101,
DATA_HEIGAN_ENTER_GATE = 102, DATA_FEUGEN_BOSS = 102,
DATA_LOATHEB_GATE = 103, DATA_THADDIUS_BOSS = 103,
DATA_FAERLINA_WEB = 105, DATA_RAZUVIOUS_BOSS = 104,
DATA_MAEXXNA_GATE = 106, DATA_GOTHIK_BOSS = 105,
DATA_THADDIUS_BOSS = 107, DATA_BARON_RIVENDARE_BOSS = 106,
DATA_STALAGG_BOSS = 108, DATA_SIR_ZELIEK_BOSS = 107,
DATA_FEUGEN_BOSS = 109, DATA_LADY_BLAUMEUX_BOSS = 108,
DATA_THADDIUS_GATE = 110, DATA_THANE_KORTHAZZ_BOSS = 109,
DATA_RAZUVIOUS = 111, DATA_SAPPHIRON_BOSS = 110,
DATA_GOTHIK_BOSS = 112, DATA_KELTHUZAD_BOSS = 111,
DATA_GOTHIK_ENTER_GATE = 113, DATA_LICH_KING_BOSS = 112,
DATA_GOTHIK_INNER_GATE = 114,
DATA_GOTHIK_EXIT_GATE = 115, DATA_LOATHEB_PORTAL = 200,
DATA_HORSEMEN_GATE = 116, DATA_MAEXXNA_PORTAL = 201,
DATA_LICH_KING_BOSS = 117, DATA_THADDIUS_PORTAL = 202,
DATA_KELTHUZAD_FLOOR = 118, DATA_HORSEMAN_PORTAL = 203,
DATA_ABOMINATION_KILLED = 119, DATA_GOTHIK_INNER_GATE = 204,
DATA_FRENZY_REMOVED = 120, DATA_SAPPHIRON_GATE = 205,
DATA_CHARGES_CROSSED = 121, DATA_KELTHUZAD_GATE = 206,
DATA_SPORE_KILLED = 122, DATA_KELTHUZAD_FLOOR = 207,
DATA_HUNDRED_CLUB = 123, DATA_KELTHUZAD_PORTAL_1 = 208,
DATA_DANCE_FAIL = 124, DATA_KELTHUZAD_PORTAL_2 = 209,
DATA_IMMORTAL_FAIL = 125, DATA_KELTHUZAD_PORTAL_3 = 210,
DATA_KELTHUZAD_GATE = 126, DATA_KELTHUZAD_PORTAL_4 = 211,
DATA_HAD_THADDIUS_GREET = 127,
DATA_KELTHUZAD_PORTAL_1 = 128, DATA_HEIGAN_ERUPTION = 300,
DATA_KELTHUZAD_PORTAL_2 = 129, DATA_DANCE_FAIL = 301,
DATA_KELTHUZAD_PORTAL_3 = 130, DATA_SPORE_KILLED = 302,
DATA_KELTHUZAD_PORTAL_4 = 131 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_PATCHWERK_GATE = 181123,
GO_GLUTH_GATE = 181120, GO_GLUTH_GATE = 181120,
@@ -129,8 +139,25 @@ enum NXGOs
GO_CONS_EYE_RAMP_BOSS = 181232 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 // Thaddius
NPC_THADDIUS = 15928, NPC_THADDIUS = 15928,
NPC_STALAGG = 15929, NPC_STALAGG = 15929,
@@ -139,6 +166,9 @@ enum NXNPCs
// Razuvious // Razuvious
NPC_RAZUVIOUS = 16061, NPC_RAZUVIOUS = 16061,
// Gothik
NPC_GOTHIK = 16060,
// Four horseman // Four horseman
NPC_BARON_RIVENDARE = 30549, NPC_BARON_RIVENDARE = 30549,
NPC_SIR_ZELIEK = 16063, NPC_SIR_ZELIEK = 16063,
@@ -150,30 +180,124 @@ enum NXNPCs
// Kel'Thuzad // Kel'Thuzad
NPC_KELTHUZAD = 15990, NPC_KELTHUZAD = 15990,
NPC_LICH_KING = 16980, 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
}; };
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_ERUPTION = 29371,
SPELL_FROGGER_EXPLODE = 28433, SPELL_EXPLODE = 28433,
SPELL_THE_FOUR_HORSEMAN_CREDIT = 59450,
ACTION_SAPPHIRON_BIRTH = 1, ACTION_SAPPHIRON_BIRTH = 1,
@@ -181,32 +305,19 @@ enum NXMisc
SOUND_SCREAM = 8873 SOUND_SCREAM = 8873
}; };
enum NXSays static constexpr uint32 NaxxramasMapId = 533;
{ static constexpr uint8 HeiganEruptSectionCount = 4;
SAY_SAPP_DIALOG1 = 0, static constexpr uint8 HorsemanCount = 4;
SAY_SAPP_DIALOG2_LICH = 1, static constexpr uint8 AbominationKillCountReq = 18;
SAY_SAPP_DIALOG3 = 2, static constexpr uint8 TheDedicatedFew10PlayerReq = 9;
SAY_SAPP_DIALOG4_LICH = 2, static constexpr uint8 TheDedicatedFew25PlayerReq = 21;
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
};
enum NXEvents template<typename AI, typename T>
{
EVENT_THADDIUS_SCREAMS = 0,
EVENT_KELTHUZAD_WING_TAUNT = 1,
EVENT_FROSTWYRM_WATERFALL_DOOR = 2,
EVENT_HORSEMEN_INTRO = 3
};
template <class AI, class T>
inline AI* GetNaxxramasAI(T* obj) inline AI* GetNaxxramasAI(T* obj)
{ {
return GetInstanceAI<AI>(obj, NaxxramasScriptName); return GetInstanceAI<AI>(obj, NaxxramasScriptName);
} }
#define RegisterNaxxramasCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetNaxxramasAI)
#endif #endif