mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-20 01:15:35 +01:00
Scripts/Naxxramas:
* Implement dialogue after Sapphiron dies. * Spawn missing triggers at Kel'Thuzad's room. * Implement a couple of missing texts and emotes to Kel'Thuzad's fight.
This commit is contained in:
@@ -30,24 +30,23 @@ EndScriptData */
|
||||
#include "naxxramas.h"
|
||||
#include "Player.h"
|
||||
|
||||
enum Yells
|
||||
enum Texts
|
||||
{
|
||||
//when shappiron dies. dialog between kel and lich king (in this order)
|
||||
SAY_SAPP_DIALOG1 = 0, //not used
|
||||
SAY_SAPP_DIALOG2_LICH = 1, //not used
|
||||
SAY_SAPP_DIALOG3 = 2, //not used
|
||||
SAY_SAPP_DIALOG4_LICH = 3, //not used
|
||||
SAY_SAPP_DIALOG5 = 4, //not used
|
||||
|
||||
SAY_AGGRO = 7,
|
||||
SAY_SLAY = 8,
|
||||
SAY_DEATH = 9,
|
||||
SAY_CHAIN = 10,
|
||||
SAY_FROST_BLAST = 11,
|
||||
SAY_REQUEST_AID = 12, //start of phase 3
|
||||
SAY_ANSWER_REQUEST = 13, //lich king answer
|
||||
EMOTE_PHASE_TWO = 13,
|
||||
SAY_SUMMON_MINIONS = 14, //start of phase 1
|
||||
SAY_SPECIAL = 15
|
||||
SAY_SPECIAL = 15,
|
||||
|
||||
// The Lich King
|
||||
SAY_ANSWER_REQUEST = 3,
|
||||
|
||||
// Old World Trigger
|
||||
SAY_GUARDIAN_SPAWNED = 0
|
||||
};
|
||||
|
||||
enum Events
|
||||
@@ -68,7 +67,10 @@ enum Events
|
||||
EVENT_TRIGGER,
|
||||
|
||||
EVENT_PHASE,
|
||||
EVENT_MORTAL_WOUND
|
||||
EVENT_MORTAL_WOUND,
|
||||
|
||||
EVENT_ANSWER_REQUEST,
|
||||
EVENT_SUMMON_GUARDIANS
|
||||
};
|
||||
|
||||
enum Spells
|
||||
@@ -121,6 +123,13 @@ enum Spells
|
||||
SPELL_MORTAL_WOUND = 28467
|
||||
};
|
||||
|
||||
enum Phases
|
||||
{
|
||||
PHASE_ONE = 1, // Players move in the circle and Kel'Thuzad spawns his minions.
|
||||
PHASE_TWO = 2, // Starts on a timer.
|
||||
PHASE_THREE = 3 // At 45% health.
|
||||
};
|
||||
|
||||
enum Creatures
|
||||
{
|
||||
NPC_WASTE = 16427, // Soldiers of the Frozen Wastes
|
||||
@@ -268,15 +277,11 @@ public:
|
||||
void Initialize()
|
||||
{
|
||||
nGuardiansOfIcecrownCount = 0;
|
||||
uiGuardiansOfIcecrownTimer = 5000; // 5 seconds for summoning each Guardian of Icecrown in phase 3
|
||||
|
||||
Phase = 0;
|
||||
nAbomination = 0;
|
||||
nWeaver = 0;
|
||||
}
|
||||
|
||||
uint32 Phase;
|
||||
uint32 uiGuardiansOfIcecrownTimer;
|
||||
uint32 uiFaction;
|
||||
|
||||
uint8 nGuardiansOfIcecrownCount;
|
||||
@@ -343,7 +348,6 @@ public:
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
me->setFaction(uiFaction);
|
||||
|
||||
_EnterCombat();
|
||||
for (uint8 i = 0; i <= 3; ++i)
|
||||
{
|
||||
@@ -352,10 +356,10 @@ public:
|
||||
}
|
||||
DoCast(me, SPELL_KELTHUZAD_CHANNEL, false);
|
||||
Talk(SAY_SUMMON_MINIONS);
|
||||
Phase = 1;
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->SetFloatValue(UNIT_FIELD_COMBATREACH, 4);
|
||||
me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 4);
|
||||
events.SetPhase(PHASE_ONE);
|
||||
events.ScheduleEvent(EVENT_TRIGGER, 5000);
|
||||
events.ScheduleEvent(EVENT_WASTE, 15000);
|
||||
events.ScheduleEvent(EVENT_ABOMIN, 30000);
|
||||
@@ -363,6 +367,23 @@ public:
|
||||
events.ScheduleEvent(EVENT_PHASE, 228000);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& damage) override
|
||||
{
|
||||
if (events.IsInPhase(PHASE_TWO) && me->HealthBelowPctDamaged(45, damage))
|
||||
{
|
||||
Talk(SAY_REQUEST_AID);
|
||||
events.SetPhase(PHASE_THREE);
|
||||
events.ScheduleEvent(EVENT_ANSWER_REQUEST, 4000);
|
||||
|
||||
for (uint8 i = 0; i <= 3; ++i)
|
||||
{
|
||||
if (GameObject* portal = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_KELTHUZAD_PORTAL01 + i)))
|
||||
if (portal->getLootState() == GO_READY)
|
||||
portal->UseDoorOrButton();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
@@ -370,7 +391,7 @@ public:
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (Phase == 1)
|
||||
if (events.IsInPhase(PHASE_ONE))
|
||||
{
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
@@ -403,6 +424,7 @@ public:
|
||||
case EVENT_PHASE:
|
||||
events.Reset();
|
||||
Talk(SAY_AGGRO);
|
||||
Talk(EMOTE_PHASE_TWO);
|
||||
spawns.DespawnAll();
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->CastStop();
|
||||
@@ -415,7 +437,7 @@ public:
|
||||
events.ScheduleEvent(EVENT_BLAST, urand(60000, 120000));
|
||||
if (GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL)
|
||||
events.ScheduleEvent(EVENT_CHAIN, urand(30000, 60000));
|
||||
Phase = 2;
|
||||
events.SetPhase(PHASE_TWO);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -424,38 +446,6 @@ public:
|
||||
}
|
||||
else
|
||||
{
|
||||
//start phase 3 when we are 45% health
|
||||
if (Phase != 3)
|
||||
{
|
||||
if (HealthBelowPct(45))
|
||||
{
|
||||
Phase = 3;
|
||||
Talk(SAY_REQUEST_AID);
|
||||
//here Lich King should respond to KelThuzad but I don't know which Creature to make talk
|
||||
//so for now just make Kelthuzad says it.
|
||||
Talk(SAY_ANSWER_REQUEST);
|
||||
|
||||
for (uint8 i = 0; i <= 3; ++i)
|
||||
{
|
||||
if (GameObject* portal = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_KELTHUZAD_PORTAL01 + i)))
|
||||
if (portal->getLootState() == GO_READY)
|
||||
portal->UseDoorOrButton();
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (nGuardiansOfIcecrownCount < RAID_MODE(2, 4))
|
||||
{
|
||||
if (uiGuardiansOfIcecrownTimer <= diff)
|
||||
{
|
||||
/// @todo Add missing text
|
||||
if (Creature* guardian = DoSummon(NPC_ICECROWN, Pos[RAND(2, 5, 8, 11)]))
|
||||
guardian->SetFloatValue(UNIT_FIELD_COMBATREACH, 2);
|
||||
++nGuardiansOfIcecrownCount;
|
||||
uiGuardiansOfIcecrownTimer = 5000;
|
||||
}
|
||||
else uiGuardiansOfIcecrownTimer -= diff;
|
||||
}
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
@@ -607,6 +597,18 @@ public:
|
||||
Talk(SAY_FROST_BLAST);
|
||||
events.Repeat(30000, 90000);
|
||||
break;
|
||||
case EVENT_ANSWER_REQUEST:
|
||||
if (Creature* lichKing = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_LICH_KING)))
|
||||
lichKing->AI()->Talk(SAY_ANSWER_REQUEST);
|
||||
events.ScheduleEvent(EVENT_SUMMON_GUARDIANS, 5000);
|
||||
break;
|
||||
case EVENT_SUMMON_GUARDIANS:
|
||||
if (Creature* guardian = DoSummon(NPC_ICECROWN, Pos[RAND(2, 5, 8, 11)]))
|
||||
guardian->SetFloatValue(UNIT_FIELD_COMBATREACH, 2);
|
||||
++nGuardiansOfIcecrownCount;
|
||||
if (nGuardiansOfIcecrownCount < RAID_MODE(2, 4))
|
||||
events.ScheduleEvent(EVENT_SUMMON_GUARDIANS, 5000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -157,6 +157,9 @@ class instance_naxxramas : public InstanceMapScript
|
||||
case NPC_KEL_THUZAD:
|
||||
KelthuzadGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_LICH_KING:
|
||||
LichKingGUID = creature->GetGUID();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -202,6 +205,9 @@ class instance_naxxramas : public InstanceMapScript
|
||||
case GO_KELTHUZAD_TRIGGER:
|
||||
KelthuzadTriggerGUID = go->GetGUID();
|
||||
break;
|
||||
case GO_ROOM_KELTHUZAD:
|
||||
KelthuzadDoorGUID = go->GetGUID();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -337,6 +343,8 @@ class instance_naxxramas : public InstanceMapScript
|
||||
return PortalsGUID[3];
|
||||
case DATA_KELTHUZAD_TRIGGER:
|
||||
return KelthuzadTriggerGUID;
|
||||
case DATA_LICH_KING:
|
||||
return LichKingGUID;
|
||||
}
|
||||
|
||||
return ObjectGuid::Empty;
|
||||
@@ -370,6 +378,10 @@ class instance_naxxramas : public InstanceMapScript
|
||||
events.ScheduleEvent(EVENT_KELTHUZAD_WING_TAUNT, 6000);
|
||||
}
|
||||
break;
|
||||
case BOSS_SAPPHIRON:
|
||||
if (state == DONE)
|
||||
events.ScheduleEvent(EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD, 6000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -431,6 +443,37 @@ class instance_naxxramas : public InstanceMapScript
|
||||
kelthuzad->AI()->Talk(CurrentWingTaunt);
|
||||
++CurrentWingTaunt;
|
||||
break;
|
||||
case EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD:
|
||||
if (Creature* kelthuzad = instance->GetCreature(KelthuzadGUID))
|
||||
kelthuzad->AI()->Talk(SAY_DIALOGUE_SAPPHIRON_KELTHUZAD);
|
||||
HandleGameObject(KelthuzadDoorGUID, false);
|
||||
events.ScheduleEvent(EVENT_DIALOGUE_SAPPHIRON_LICHKING, 6000);
|
||||
break;
|
||||
case EVENT_DIALOGUE_SAPPHIRON_LICHKING:
|
||||
if (Creature* lichKing = instance->GetCreature(LichKingGUID))
|
||||
lichKing->AI()->Talk(SAY_DIALOGUE_SAPPHIRON_LICH_KING);
|
||||
events.ScheduleEvent(EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD2, 16000);
|
||||
break;
|
||||
case EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD2:
|
||||
if (Creature* kelthuzad = instance->GetCreature(KelthuzadGUID))
|
||||
kelthuzad->AI()->Talk(SAY_DIALOGUE_SAPPHIRON_KELTHUZAD2);
|
||||
events.ScheduleEvent(EVENT_DIALOGUE_SAPPHIRON_LICHKING2, 9000);
|
||||
break;
|
||||
case EVENT_DIALOGUE_SAPPHIRON_LICHKING2:
|
||||
if (Creature* lichKing = instance->GetCreature(LichKingGUID))
|
||||
lichKing->AI()->Talk(SAY_DIALOGUE_SAPPHIRON_LICH_KING2);
|
||||
events.ScheduleEvent(EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD3, 12000);
|
||||
break;
|
||||
case EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD3:
|
||||
if (Creature* kelthuzad = instance->GetCreature(KelthuzadGUID))
|
||||
kelthuzad->AI()->Talk(SAY_DIALOGUE_SAPPHIRON_KELTHUZAD3);
|
||||
events.ScheduleEvent(EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD4, 6000);
|
||||
break;
|
||||
case EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD4:
|
||||
if (Creature* kelthuzad = instance->GetCreature(KelthuzadGUID))
|
||||
kelthuzad->AI()->Talk(SAY_DIALOGUE_SAPPHIRON_KELTHUZAD4);
|
||||
HandleGameObject(KelthuzadDoorGUID, true);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -538,6 +581,8 @@ class instance_naxxramas : public InstanceMapScript
|
||||
ObjectGuid KelthuzadGUID;
|
||||
ObjectGuid KelthuzadTriggerGUID;
|
||||
ObjectGuid PortalsGUID[4];
|
||||
ObjectGuid KelthuzadDoorGUID;
|
||||
ObjectGuid LichKingGUID;
|
||||
uint8 AbominationCount;
|
||||
uint8 CurrentWingTaunt;
|
||||
|
||||
|
||||
@@ -71,6 +71,7 @@ enum Data64
|
||||
DATA_KELTHUZAD_PORTAL03,
|
||||
DATA_KELTHUZAD_PORTAL04,
|
||||
DATA_KELTHUZAD_TRIGGER,
|
||||
DATA_LICH_KING
|
||||
};
|
||||
|
||||
enum CreaturesIds
|
||||
@@ -90,7 +91,9 @@ enum CreaturesIds
|
||||
NPC_NAXXRAMAS_FOLLOWER = 16505,
|
||||
NPC_FOLLOWER_WORSHIPPER = 16506,
|
||||
NPC_DK_UNDERSTUDY = 16803,
|
||||
NPC_BIGGLESWORTH = 16998
|
||||
NPC_BIGGLESWORTH = 16998,
|
||||
NPC_LICH_KING = 16980,
|
||||
NPC_OLD_WORLD_TRIGGER = 15384
|
||||
};
|
||||
|
||||
enum GameObjectsIds
|
||||
@@ -156,18 +159,35 @@ enum InstanceEvents
|
||||
EVENT_DIALOGUE_GOTHIK_RIVENDARE2,
|
||||
|
||||
// Dialogue that happens after each wing.
|
||||
EVENT_KELTHUZAD_WING_TAUNT
|
||||
EVENT_KELTHUZAD_WING_TAUNT,
|
||||
|
||||
// Dialogue that happens after Sapphiron's death.
|
||||
EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD,
|
||||
EVENT_DIALOGUE_SAPPHIRON_LICHKING,
|
||||
EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD2,
|
||||
EVENT_DIALOGUE_SAPPHIRON_LICHKING2,
|
||||
EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD3,
|
||||
EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD4
|
||||
};
|
||||
|
||||
enum InstanceTexts
|
||||
{
|
||||
// The Four Horsemen
|
||||
SAY_DIALOGUE_GOTHIK_HORSEMAN = 5,
|
||||
SAY_DIALOGUE_GOTHIK_HORSEMAN2 = 6,
|
||||
SAY_DIALOGUE_GOTHIK_HORSEMAN = 5,
|
||||
SAY_DIALOGUE_GOTHIK_HORSEMAN2 = 6,
|
||||
|
||||
// Kel'Thuzad
|
||||
SAY_KELTHUZAD_CAT_DIED = 5,
|
||||
SAY_KELTHUZAD_FIRST_WING_TAUNT = 16
|
||||
SAY_DIALOGUE_SAPPHIRON_KELTHUZAD = 0,
|
||||
SAY_DIALOGUE_SAPPHIRON_KELTHUZAD2 = 2,
|
||||
SAY_DIALOGUE_SAPPHIRON_KELTHUZAD3 = 4,
|
||||
SAY_DIALOGUE_SAPPHIRON_KELTHUZAD4 = 20,
|
||||
|
||||
SAY_KELTHUZAD_CAT_DIED = 5,
|
||||
SAY_KELTHUZAD_FIRST_WING_TAUNT = 16,
|
||||
|
||||
// Lich King
|
||||
SAY_DIALOGUE_SAPPHIRON_LICH_KING = 1,
|
||||
SAY_DIALOGUE_SAPPHIRON_LICH_KING2 = 2
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user