aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNyeriah <sarah.trysan@live.com>2014-12-17 14:56:42 -0200
committerNyeriah <sarah.trysan@live.com>2014-12-17 14:56:42 -0200
commit037418a116b28ca3dedc52dac70e1d0e8a058ca9 (patch)
tree314ef7db3d43b5a354b1dcf1a10123a452970fb2 /src
parent88b197b2ef48526ff6c39d79bd8d9dca2ecd8d4f (diff)
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. (cherry picked from commit dd942db85fbd5e42fcd60fa4620c51093cc7ebfe)
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp104
-rw-r--r--src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp45
-rw-r--r--src/server/scripts/Northrend/Naxxramas/naxxramas.h32
3 files changed, 124 insertions, 57 deletions
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp
index 917fca5b0ba..5b0852e5261 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp
@@ -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;
}
diff --git a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
index 7a0930dc2f3..929faf72698 100644
--- a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
@@ -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;
diff --git a/src/server/scripts/Northrend/Naxxramas/naxxramas.h b/src/server/scripts/Northrend/Naxxramas/naxxramas.h
index a1c8a1c79d4..eb77980f3ba 100644
--- a/src/server/scripts/Northrend/Naxxramas/naxxramas.h
+++ b/src/server/scripts/Northrend/Naxxramas/naxxramas.h
@@ -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
};
/*