Scripts/Icecrown Citadel: Added missing faction specific part of intro scene at Light's Hammer

This commit is contained in:
Shauren
2011-03-11 19:35:22 +01:00
parent 190ef1c2ef
commit 9b2d62b72d
5 changed files with 228 additions and 57 deletions
@@ -206,7 +206,8 @@ enum MovePoints
POINT_CHARGE = 3781302,
POINT_CHOKE = 3781303,
POINT_CORPSE = 3781304,
POINT_FINAL = 3781305
POINT_FINAL = 3781305,
POINT_EXIT = 5, // waypoint id
};
static const Position deathbringerPos = {-496.3542f, 2211.33f, 541.1138f, 0.0f};
@@ -638,38 +639,46 @@ class npc_high_overlord_saurfang_icc : public CreatureScript
void MovementInform(uint32 type, uint32 id)
{
if (type != POINT_MOTION_TYPE)
return;
switch (id)
if (type == POINT_MOTION_TYPE)
{
case POINT_FIRST_STEP:
me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
Talk(SAY_INTRO_HORDE_3);
events.ScheduleEvent(EVENT_INTRO_HORDE_5, 15500, 0, PHASE_INTRO_H);
events.ScheduleEvent(EVENT_INTRO_HORDE_6, 29500, 0, PHASE_INTRO_H);
events.ScheduleEvent(EVENT_INTRO_HORDE_7, 43800, 0, PHASE_INTRO_H);
events.ScheduleEvent(EVENT_INTRO_HORDE_8, 47000, 0, PHASE_INTRO_H);
if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, deathbringerSaurfangGUID))
deathbringer->AI()->DoAction(ACTION_CONTINUE_INTRO);
break;
case POINT_CORPSE:
if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, deathbringerSaurfangGUID))
{
deathbringer->CastSpell(me, SPELL_RIDE_VEHICLE, true); // for the packet logs.
deathbringer->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
deathbringer->setDeathState(ALIVE);
}
events.ScheduleEvent(EVENT_OUTRO_HORDE_5, 1000); // move
events.ScheduleEvent(EVENT_OUTRO_HORDE_6, 4000); // say
break;
case POINT_FINAL:
if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, deathbringerSaurfangGUID))
deathbringer->DespawnOrUnsummon();
me->DespawnOrUnsummon();
break;
default:
break;
switch (id)
{
case POINT_FIRST_STEP:
me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
Talk(SAY_INTRO_HORDE_3);
events.ScheduleEvent(EVENT_INTRO_HORDE_5, 15500, 0, PHASE_INTRO_H);
events.ScheduleEvent(EVENT_INTRO_HORDE_6, 29500, 0, PHASE_INTRO_H);
events.ScheduleEvent(EVENT_INTRO_HORDE_7, 43800, 0, PHASE_INTRO_H);
events.ScheduleEvent(EVENT_INTRO_HORDE_8, 47000, 0, PHASE_INTRO_H);
if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, deathbringerSaurfangGUID))
deathbringer->AI()->DoAction(ACTION_CONTINUE_INTRO);
break;
case POINT_CORPSE:
if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, deathbringerSaurfangGUID))
{
deathbringer->CastSpell(me, SPELL_RIDE_VEHICLE, true); // for the packet logs.
deathbringer->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
deathbringer->setDeathState(ALIVE);
}
events.ScheduleEvent(EVENT_OUTRO_HORDE_5, 1000); // move
events.ScheduleEvent(EVENT_OUTRO_HORDE_6, 4000); // say
break;
case POINT_FINAL:
if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, deathbringerSaurfangGUID))
deathbringer->DespawnOrUnsummon();
me->DespawnOrUnsummon();
break;
default:
break;
}
}
else if (type == WAYPOINT_MOTION_TYPE && id == POINT_EXIT)
{
std::list<Creature*> guards;
GetCreatureListWithEntryInGrid(guards, me, NPC_KOR_KRON_GENERAL, 50.0f);
for (std::list<Creature*>::iterator itr = guards.begin(); itr != guards.end(); ++itr)
(*itr)->DespawnOrUnsummon();
me->DespawnOrUnsummon();
}
}
@@ -842,14 +851,22 @@ class npc_muradin_bronzebeard_icc : public CreatureScript
void MovementInform(uint32 type, uint32 id)
{
if (type != POINT_MOTION_TYPE || id != POINT_FIRST_STEP)
return;
me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
Talk(SAY_INTRO_ALLIANCE_4);
events.ScheduleEvent(EVENT_INTRO_ALLIANCE_5, 5000, 0, PHASE_INTRO_A);
if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, deathbringerSaurfangGUID))
deathbringer->AI()->DoAction(ACTION_CONTINUE_INTRO);
if (type == POINT_MOTION_TYPE && id == POINT_FIRST_STEP)
{
me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
Talk(SAY_INTRO_ALLIANCE_4);
events.ScheduleEvent(EVENT_INTRO_ALLIANCE_5, 5000, 0, PHASE_INTRO_A);
if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, deathbringerSaurfangGUID))
deathbringer->AI()->DoAction(ACTION_CONTINUE_INTRO);
}
else if (type == WAYPOINT_MOTION_TYPE && id == POINT_EXIT)
{
std::list<Creature*> guards;
GetCreatureListWithEntryInGrid(guards, me, NPC_ALLIANCE_COMMANDER, 50.0f);
for (std::list<Creature*>::iterator itr = guards.begin(); itr != guards.end(); ++itr)
(*itr)->DespawnOrUnsummon();
me->DespawnOrUnsummon();
}
}
void UpdateAI(const uint32 diff)
@@ -36,6 +36,8 @@ enum Texts
SAY_TIRION_INTRO_2 = 1,
SAY_TIRION_INTRO_3 = 2,
SAY_TIRION_INTRO_4 = 3,
SAY_TIRION_INTRO_H_5 = 4,
SAY_TIRION_INTRO_A_5 = 5,
// The Lich King (at Light's Hammer)
SAY_LK_INTRO_1 = 0,
@@ -47,6 +49,17 @@ enum Texts
// Highlord Bolvar Fordragon (at Light's Hammer)
SAY_BOLVAR_INTRO_1 = 0,
// High Overlord Saurfang (at Light's Hammer)
SAY_SAURFANG_INTRO_1 = 15,
SAY_SAURFANG_INTRO_2 = 16,
SAY_SAURFANG_INTRO_3 = 17,
SAY_SAURFANG_INTRO_4 = 18,
// Muradin Bronzebeard (at Light's Hammer)
SAY_MURADIN_INTRO_1 = 13,
SAY_MURADIN_INTRO_2 = 14,
SAY_MURADIN_INTRO_3 = 15,
// Rotting Frost Giant
EMOTE_DEATH_PLAGUE_WARNING = 0,
};
@@ -74,25 +87,40 @@ enum Events
// Highlord Tirion Fordring (at Light's Hammer)
// The Lich King (at Light's Hammer)
// Highlord Bolvar Fordragon (at Light's Hammer)
EVENT_TIRION_INTRO_2 = 1, // EMOTE
// High Overlord Saurfang (at Light's Hammer)
// Muradin Bronzebeard (at Light's Hammer)
EVENT_TIRION_INTRO_2 = 1,
EVENT_TIRION_INTRO_3 = 2,
EVENT_TIRION_INTRO_4 = 3, // EMOTE
EVENT_TIRION_INTRO_4 = 3,
EVENT_TIRION_INTRO_5 = 4,
EVENT_LK_INTRO_1 = 5, // TIRION EMOTE
EVENT_LK_INTRO_1 = 5,
EVENT_TIRION_INTRO_6 = 6,
EVENT_LK_INTRO_2 = 7,
EVENT_LK_INTRO_3 = 8,
EVENT_LK_INTRO_4 = 9,
EVENT_BOLVAR_INTRO_1 = 10,
EVENT_LK_INTRO_5 = 11,
EVENT_SAURFANG_INTRO_1 = 12,
EVENT_TIRION_INTRO_H_7 = 13,
EVENT_SAURFANG_INTRO_2 = 14,
EVENT_SAURFANG_INTRO_3 = 15,
EVENT_SAURFANG_INTRO_4 = 16,
EVENT_SAURFANG_RUN = 17,
EVENT_MURADIN_INTRO_1 = 18,
EVENT_MURADIN_INTRO_2 = 19,
EVENT_MURADIN_INTRO_3 = 20,
EVENT_TIRION_INTRO_A_7 = 21,
EVENT_MURADIN_INTRO_4 = 22,
EVENT_MURADIN_INTRO_5 = 23,
EVENT_MURADIN_RUN = 24,
// Rotting Frost Giant
EVENT_DEATH_PLAGUE = 12,
EVENT_STOMP = 13,
EVENT_ARCTIC_BREATH = 14,
EVENT_DEATH_PLAGUE = 25,
EVENT_STOMP = 26,
EVENT_ARCTIC_BREATH = 27,
// Frost Freeze Trap
EVENT_ACTIVATE_TRAP = 15,
EVENT_ACTIVATE_TRAP = 28,
};
enum DataTypesICC
@@ -108,7 +136,7 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript
struct npc_highlord_tirion_fordringAI : public ScriptedAI
{
npc_highlord_tirion_fordringAI(Creature* creature) : ScriptedAI(creature)
npc_highlord_tirion_fordringAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript())
{
}
@@ -117,6 +145,7 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript
events.Reset();
_theLichKing = 0;
_bolvarFordragon = 0;
_factionNPC = 0;
_damnedKills = 0;
}
@@ -124,6 +153,9 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript
// of The Damned SAI
void SetData(uint32 type, uint32 data)
{
if (!instance)
return;
if (type == DATA_DAMNED_KILLS && data == 1)
{
if (++_damnedKills == 2)
@@ -132,15 +164,20 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript
{
if (Creature* bolvarFordragon = me->FindNearestCreature(NPC_HIGHLORD_BOLVAR_FORDRAGON_LH, 150.0f))
{
me->setActive(true);
_theLichKing = theLichKing->GetGUID();
theLichKing->setActive(true);
_bolvarFordragon = bolvarFordragon->GetGUID();
bolvarFordragon->setActive(true);
if (Creature* factionNPC = me->FindNearestCreature(instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE ? NPC_SE_HIGH_OVERLORD_SAURFANG : NPC_SE_MURADIN_BRONZEBEARD, 50.0f))
{
me->setActive(true);
_theLichKing = theLichKing->GetGUID();
theLichKing->setActive(true);
_bolvarFordragon = bolvarFordragon->GetGUID();
bolvarFordragon->setActive(true);
_factionNPC = factionNPC->GetGUID();
factionNPC->setActive(true);
}
}
}
if (!_bolvarFordragon || !_theLichKing)
if (!_bolvarFordragon || !_theLichKing || !_factionNPC)
return;
Talk(SAY_TIRION_INTRO_1);
@@ -155,6 +192,26 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript
events.ScheduleEvent(EVENT_LK_INTRO_4, 86000);
events.ScheduleEvent(EVENT_BOLVAR_INTRO_1, 100000);
events.ScheduleEvent(EVENT_LK_INTRO_5, 108000);
if (instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
{
events.ScheduleEvent(EVENT_SAURFANG_INTRO_1, 120000);
events.ScheduleEvent(EVENT_TIRION_INTRO_H_7, 129000);
events.ScheduleEvent(EVENT_SAURFANG_INTRO_2, 139000);
events.ScheduleEvent(EVENT_SAURFANG_INTRO_3, 150000);
events.ScheduleEvent(EVENT_SAURFANG_INTRO_4, 162000);
events.ScheduleEvent(EVENT_SAURFANG_RUN, 170000);
}
else
{
events.ScheduleEvent(EVENT_MURADIN_INTRO_1, 120000);
events.ScheduleEvent(EVENT_MURADIN_INTRO_2, 124000);
events.ScheduleEvent(EVENT_MURADIN_INTRO_3, 127000);
events.ScheduleEvent(EVENT_TIRION_INTRO_A_7, 136000);
events.ScheduleEvent(EVENT_MURADIN_INTRO_4, 144000);
events.ScheduleEvent(EVENT_MURADIN_INTRO_5, 151000);
events.ScheduleEvent(EVENT_MURADIN_RUN, 157000);
}
}
}
}
@@ -214,10 +271,57 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript
{
theLichKing->AI()->Talk(SAY_LK_INTRO_5);
theLichKing->setActive(false);
me->setActive(false);
_damnedKills = 3;
}
break;
case EVENT_SAURFANG_INTRO_1:
if (Creature* saurfang = ObjectAccessor::GetCreature(*me, _factionNPC))
saurfang->AI()->Talk(SAY_SAURFANG_INTRO_1);
break;
case EVENT_TIRION_INTRO_H_7:
Talk(SAY_TIRION_INTRO_H_5);
break;
case EVENT_SAURFANG_INTRO_2:
if (Creature* saurfang = ObjectAccessor::GetCreature(*me, _factionNPC))
saurfang->AI()->Talk(SAY_SAURFANG_INTRO_2);
break;
case EVENT_SAURFANG_INTRO_3:
if (Creature* saurfang = ObjectAccessor::GetCreature(*me, _factionNPC))
saurfang->AI()->Talk(SAY_SAURFANG_INTRO_3);
break;
case EVENT_SAURFANG_INTRO_4:
if (Creature* saurfang = ObjectAccessor::GetCreature(*me, _factionNPC))
saurfang->AI()->Talk(SAY_SAURFANG_INTRO_4);
break;
case EVENT_MURADIN_RUN:
case EVENT_SAURFANG_RUN:
if (Creature* factionNPC = ObjectAccessor::GetCreature(*me, _factionNPC))
factionNPC->GetMotionMaster()->MovePath(factionNPC->GetDBTableGUIDLow()*10, false);
me->setActive(false);
_damnedKills = 3;
break;
case EVENT_MURADIN_INTRO_1:
if (Creature* muradin = ObjectAccessor::GetCreature(*me, _factionNPC))
muradin->AI()->Talk(SAY_MURADIN_INTRO_1);
break;
case EVENT_MURADIN_INTRO_2:
if (Creature* muradin = ObjectAccessor::GetCreature(*me, _factionNPC))
muradin->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
break;
case EVENT_MURADIN_INTRO_3:
if (Creature* muradin = ObjectAccessor::GetCreature(*me, _factionNPC))
muradin->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
break;
case EVENT_TIRION_INTRO_A_7:
Talk(SAY_TIRION_INTRO_A_5);
break;
case EVENT_MURADIN_INTRO_4:
if (Creature* muradin = ObjectAccessor::GetCreature(*me, _factionNPC))
muradin->AI()->Talk(SAY_MURADIN_INTRO_2);
break;
case EVENT_MURADIN_INTRO_5:
if (Creature* muradin = ObjectAccessor::GetCreature(*me, _factionNPC))
muradin->AI()->Talk(SAY_MURADIN_INTRO_3);
break;
default:
break;
}
@@ -226,8 +330,10 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript
private:
EventMap events;
InstanceScript* const instance;
uint64 _theLichKing;
uint64 _bolvarFordragon;
uint64 _factionNPC;
uint16 _damnedKills;
};
@@ -73,6 +73,7 @@ enum DataTypes
DATA_SPINESTALKER = 23,
DATA_RIMEFANG = 24,
DATA_COLDFLAME_JETS = 25,
DATA_TEAM_IN_INSTANCE = 26,
};
#define MAX_ENCOUNTER 12
@@ -164,7 +164,7 @@ class instance_icecrown_citadel : public InstanceMapScript
break;
case NPC_SE_HIGH_OVERLORD_SAURFANG:
if (teamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_SE_MURADIN_BRONZEBEARD, ALLIANCE);
creature->UpdateEntry(NPC_SE_MURADIN_BRONZEBEARD, ALLIANCE, creature->GetCreatureData());
case NPC_SE_MURADIN_BRONZEBEARD:
saurfangEventNPC = creature->GetGUID();
creature->LastUsedScriptID = creature->GetScriptId();
@@ -394,6 +394,8 @@ class instance_icecrown_citadel : public InstanceMapScript
return rimefangTrash;
case DATA_COLDFLAME_JETS:
return coldflameJetsState;
case DATA_TEAM_IN_INSTANCE:
return teamInInstance;
default:
break;
}