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:
Nyeriah
2014-12-17 14:49:43 -02:00
parent 629c6d2c02
commit dd942db85f
4 changed files with 147 additions and 57 deletions

View File

@@ -0,0 +1,23 @@
--
UPDATE `creature_text` SET `TextRange` = 3 WHERE `entry` = 15990 AND `groupid` IN (0, 2, 4);
DELETE FROM `creature_text` WHERE `entry` = 15990 AND `groupid` IN (13, 20);
DELETE FROM `creature_text` WHERE `entry` = 16980 AND `groupid` IN (1, 2, 3);
DELETE FROM `creature_text` WHERE `entry` = 15384 AND `groupid` = 0;
INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextID`, `TextRange`, `comment`) VALUES
(15990, 20, 0, 'Come, heroes... By the will of the Lich King, you shall be destroyed.', 14, 0, 100, 0, 0, 0, 12993, 3, 'Kel''Thuzad SAY_DIALOGUE_SAPPHIRON_KELTHUZAD4'),
(15990, 13, 0, 'Kel''Thuzad strikes!', 41, 0, 100, 0, 0, 0, 32803, 0, 'Kel''Thuzad EMOTE_PHASE_TWO'),
(16980, 1, 0, 'Soon we will eradicate the Alliance and Horde. Then the rest of Azeroth will fall before the might of my army.', 14, 0, 100, 0, 0, 14768, 12988, 3, 'The Lich King SAY_DIALOGUE_SAPPHIRON_LICHKING'),
(16980, 2, 0, 'Invaders... here?! DESTROY them, Kel''Thuzad! Naxxramas must not fall!', 14, 0, 100, 0, 0, 14769, 12989, 3, 'The Lich King SAY_DIALOGUE_SAPPHIRON_LICHKING2'),
(16980, 3, 0, 'Very well. Warriors of the frozen wastes, rise up! I command you to fight, kill and die for your master! Let none survive!', 14, 0, 100, 0, 0, 14770, 12994, 3, 'The Lich King SAY_ANSWER_REQUEST'),
(15384, 0, 0, 'A Guardian of Icecrown enters the fight!', 41, 0, 100, 0, 0, 0, 32804, 0, 'OLDWorld Trigger (DO NOT DELETE)');
-- Spawn some missing triggers and the Lich King dummy. Triggers are used to emote when a Guardian of Icecrown is spawned, currently not implemented.
SET @CGUID = 75082;
DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+5;
INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES
(@CGUID+0, 16980, 533, 3, 1, 3762.382, -5115.862, 143.9382, 0.1919862, 7200, 0, 0), -- 16980 (Area: -1)
(@CGUID+1, 15384, 533, 3, 1, 3759.62, -5172.786, 143.8345, 5.148721, 7200, 0, 0), -- 15384 (Area: -1)
(@CGUID+2, 15384, 533, 3, 1, 3716.097, -5106.208, 141.373, 4.939282, 7200, 0, 0), -- 15384 (Area: -1)
(@CGUID+3, 15384, 533, 3, 1, 3777.213, -5066.177, 143.6412, 1.53589, 7200, 0, 0), -- 15384 (Area: -1)
(@CGUID+4, 15384, 533, 3, 1, 3732.598, -5028.03, 144.0342, 5.951573, 7200, 0, 0), -- 15384 (Area: -1)
(@CGUID+5, 15384, 533, 3, 1, 3700.7, -5182.372, 143.9172, 3.525565, 7200, 0, 0); -- 15384 (Area: -1)

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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
};
/*