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

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