Scripts/Icecrown Citadel

* The Lich King
This commit is contained in:
Shauren
2011-10-05 20:48:34 +02:00
parent 34678d8d39
commit 2ff1c28c4c
10 changed files with 3848 additions and 36 deletions
@@ -52,8 +52,7 @@ void SummonList::DespawnEntry(uint32 entry)
else if (summon->GetEntry() == entry)
{
erase(i++);
summon->setDeathState(JUST_DIED);
summon->RemoveCorpse();
summon->DespawnOrUnsummon();
}
else
++i;
@@ -70,13 +69,7 @@ void SummonList::DespawnAll()
else
{
erase(begin());
if (TempSummon* summ = summon->ToTempSummon())
{
summon->DestroyForNearbyPlayers();
summ->UnSummon();
}
else
summon->DisappearAndDie();
summon->DespawnOrUnsummon();
}
}
}
@@ -479,6 +479,7 @@ void AddSC_boss_blood_prince_council();
void AddSC_boss_blood_queen_lana_thel();
void AddSC_boss_valithria_dreamwalker();
void AddSC_boss_sindragosa();
void AddSC_boss_the_lich_king();
void AddSC_icecrown_citadel_teleport();
void AddSC_instance_icecrown_citadel();
void AddSC_icecrown_citadel();
@@ -1181,6 +1182,7 @@ void AddNorthrendScripts()
AddSC_boss_blood_queen_lana_thel();
AddSC_boss_valithria_dreamwalker();
AddSC_boss_sindragosa();
AddSC_boss_the_lich_king();
AddSC_icecrown_citadel_teleport();
AddSC_instance_icecrown_citadel();
AddSC_icecrown_citadel();
+89
View File
@@ -2803,6 +2803,10 @@ void SpellMgr::LoadSpellCustomAttr()
case 43140: // Flame Breath
case 43215: // Flame Breath
case 70461: // Coldflame Trap
case 72133: // Pain and Suffering
case 73788: // Pain and Suffering
case 73789: // Pain and Suffering
case 73790: // Pain and Suffering
spellInfo->AttributesCu |= SPELL_ATTR0_CU_CONE_LINE;
break;
case 24340: // Meteor
@@ -3327,6 +3331,91 @@ void SpellMgr::LoadDbcDataCorrections()
spellInfo->EffectImplicitTargetB[0] = TARGET_UNIT_TARGET_ANY;
spellInfo->Effect[1] = 0;
break;
case 71614: // Ice Lock
spellInfo->Mechanic = MECHANIC_STUN;
break;
case 72762: // Defile
spellInfo->DurationIndex = 559; // 53 seconds
break;
case 72743: // Defile
spellInfo->DurationIndex = 22; // 45 seconds
break;
case 72754: // Defile
case 73708: // Defile
case 73709: // Defile
case 73710: // Defile
spellInfo->EffectRadiusIndex[0] = 22; // 200yd
spellInfo->EffectRadiusIndex[1] = 22; // 200yd
break;
case 69030: // Val'kyr Target Search
spellInfo->EffectRadiusIndex[0] = 22; // 200yd
spellInfo->EffectRadiusIndex[1] = 22; // 200yd
break;
case 69198: // Raging Spirit Visual
spellInfo->rangeIndex = 13; // 50000yd
break;
case 73654: // Harvest Souls
case 74295: // Harvest Souls
case 74296: // Harvest Souls
case 74297: // Harvest Souls
spellInfo->EffectRadiusIndex[0] = 28; // 50000yd
spellInfo->EffectRadiusIndex[1] = 28; // 50000yd
spellInfo->EffectRadiusIndex[2] = 28; // 50000yd
break;
case 73655: // Harvest Soul
spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_DONE_BONUS;
break;
case 73540: // Summon Shadow Trap
spellInfo->DurationIndex = 23; // 90 seconds
break;
case 73530: // Shadow Trap (visual)
spellInfo->DurationIndex = 28; // 5 seconds
break;
case 73529: // Shadow Trap
spellInfo->EffectRadiusIndex[1] = 13; // 10yd
break;
case 74282: // Shadow Trap (searcher)
spellInfo->EffectRadiusIndex[0] = 15; // 3yd
break;
case 72595: // Restore Soul
case 73650: // Restore Soul
spellInfo->EffectRadiusIndex[0] = 22; // 200yd
break;
case 74086: // Destroy Soul
spellInfo->EffectRadiusIndex[0] = 22; // 200yd
break;
case 74302: // Summon Spirit Bomb
case 74342: // Summon Spirit Bomb
spellInfo->EffectRadiusIndex[0] = 22; // 200yd
spellInfo->MaxAffectedTargets = 1;
break;
case 74341: // Summon Spirit Bomb
case 74343: // Summon Spirit Bomb
spellInfo->EffectRadiusIndex[0] = 22; // 200yd
spellInfo->MaxAffectedTargets = 3;
break;
case 73579: // Summon Spirit Bomb
spellInfo->EffectRadiusIndex[0] = 20; // 25yd
break;
case 72350: // Fury of Frostmourne
spellInfo->EffectRadiusIndex[0] = 28; // 50000yd
spellInfo->EffectRadiusIndex[1] = 28; // 50000yd
break;
case 75127: // Kill Frostmourne Players
case 72351: // Fury of Frostmourne
case 72429: // Mass Resurrection
case 73159: // Play Movie
case 73582: // Trigger Vile Spirit (Inside, Heroic)
spellInfo->EffectRadiusIndex[0] = 28; // 50000yd
break;
case 72376: // Raise Dead
spellInfo->MaxAffectedTargets = 3;
spellInfo->EffectRadiusIndex[0] = 28; // 50000yd
break;
case 71809: // Jump
spellInfo->rangeIndex = 3; // 20yd
spellInfo->EffectRadiusIndex[0] = 20; // 25yd
break;
default:
break;
}
@@ -173,6 +173,7 @@ set(scripts_STAT_SRCS
Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp
Northrend/IcecrownCitadel/boss_sindragosa.cpp
Northrend/IcecrownCitadel/boss_the_lich_king.cpp
Northrend/zuldrak.cpp
Northrend/icecrown.cpp
Northrend/Gundrak/boss_slad_ran.cpp
File diff suppressed because it is too large Load Diff
@@ -28,22 +28,30 @@ uint32 const EncounterCount = 13;
uint32 const WeeklyNPCs = 9;
uint32 const MaxHeroicAttempts = 50;
// Defined in boss_valithria_dreamwalker.cpp
extern Position const ValithriaSpawnPos;
// Defined in boss_sindragosa.cpp
extern Position const SindragosaSpawnPos;
// Defined in boss_the_lich_king.cpp
extern Position const TerenasSpawn;
extern Position const TerenasSpawnHeroic;
extern Position const SpiritWardenSpawn;
// Shared spells used by more than one script
enum SharedSpells
{
SPELL_BERSERK = 26662,
SPELL_BERSERK2 = 47008,
SPELL_BERSERK = 26662,
SPELL_BERSERK2 = 47008,
// Deathbound Ward
SPELL_STONEFORM = 70733,
SPELL_STONEFORM = 70733,
// Residue Rendezvous
SPELL_ORANGE_BLIGHT_RESIDUE = 72144,
SPELL_GREEN_BLIGHT_RESIDUE = 72145,
SPELL_ORANGE_BLIGHT_RESIDUE = 72144,
SPELL_GREEN_BLIGHT_RESIDUE = 72145,
// The Lich King
SPELL_FROSTMOURNE_TELEPORT_VISUAL = 73078,
};
enum TeleporterSpells
@@ -99,6 +107,9 @@ enum DataTypes
DATA_CAPTAIN_RUPERT = 34,
DATA_VALITHRIA_TRIGGER = 35,
DATA_VALITHRIA_LICH_KING = 36,
DATA_HIGHLORD_TIRION_FORDRING = 37,
DATA_ARTHAS_PLATFORM = 38,
DATA_TERENAS_MENETHIL = 39,
};
enum CreaturesIds
@@ -247,7 +258,23 @@ enum CreaturesIds
// The Lich King
NPC_THE_LICH_KING = 36597,
NPC_HIGHLORD_TIRION_FORDRING_LK = 38995,
NPC_TERENAS_MENETHIL_FROSTMOURNE = 36823,
NPC_SPIRIT_WARDEN = 36824,
NPC_TERENAS_MENETHIL_FROSTMOURNE_H = 39217,
NPC_SHAMBLING_HORROR = 37698,
NPC_DRUDGE_GHOUL = 37695,
NPC_ICE_SPHERE = 36633,
NPC_RAGING_SPIRIT = 36701,
NPC_DEFILE = 38757,
NPC_VALKYR_SHADOWGUARD = 36609,
NPC_VILE_SPIRIT = 37799,
NPC_WICKED_SPIRIT = 39190,
NPC_STRANGULATE_VEHICLE = 36598,
NPC_WORLD_TRIGGER = 22515,
NPC_WORLD_TRIGGER_INFINITE_AOI = 36171,
NPC_SPIRIT_BOMB = 39189,
NPC_FROSTMOURNE_TRIGGER = 38584,
};
enum GameObjectsIds
@@ -312,6 +339,20 @@ enum GameObjectsIds
GO_ICE_WALL = 202396,
GO_ICE_BLOCK = 201722,
GO_SIGIL_OF_THE_FROSTWING = 202181,
// The Lich King
GO_ARTHAS_PLATFORM = 202161,
GO_ARTHAS_PRECIPICE = 202078,
GO_DOODAD_ICECROWN_THRONEFROSTYWIND01 = 202188,
GO_DOODAD_ICECROWN_THRONEFROSTYEDGE01 = 202189,
GO_DOODAD_ICESHARD_STANDING02 = 202141,
GO_DOODAD_ICESHARD_STANDING01 = 202142,
GO_DOODAD_ICESHARD_STANDING03 = 202143,
GO_DOODAD_ICESHARD_STANDING04 = 202144,
GO_DOODAD_ICECROWN_SNOWEDGEWARNING01 = 202190,
GO_FROZEN_LAVAMAN = 202436,
GO_LAVAMAN_PILLARS_CHAINED = 202437,
GO_LAVAMAN_PILLARS_UNCHAINED = 202438,
};
enum AchievementCriteriaIds
@@ -351,9 +392,6 @@ enum AchievementCriteriaIds
enum SharedActions
{
// Coldflame Traps
ACTION_STOP_TRAPS = -377440,
// Festergut
ACTION_FESTERGUT_COMBAT = -366260,
ACTION_FESTERGUT_GAS = -366261,
@@ -374,6 +412,10 @@ enum SharedActions
// Sindragosa
ACTION_START_FROSTWYRM = -368530,
ACTION_TRIGGER_ASPHYXIATION = -368531,
// The Lich King
ACTION_RESTORE_LIGHT = -72262,
ACTION_FROSTMOURNE_INTRO = -36823,
};
enum WeekliesICC
@@ -399,6 +441,11 @@ enum WorldStatesICC
WORLDSTATE_ATTEMPTS_MAX = 4942,
};
enum AreaIds
{
AREA_THE_FROZEN_THRONE = 4859,
};
class spell_trigger_spell_from_caster : public SpellScriptLoader
{
public:
@@ -23,6 +23,20 @@
#include "PoolMgr.h"
#include "icecrown_citadel.h"
enum EventIds
{
EVENT_QUAKE = 23437,
EVENT_SECOND_REMORSELESS_WINTER = 23507,
EVENT_TELEPORT_TO_FROSMOURNE = 23617,
};
enum TimedEvents
{
EVENT_UPDATE_EXECUTION_TIME = 1,
EVENT_QUAKE_SHATTER = 2,
EVENT_REBUILD_PLATFORM = 3,
};
DoorData const doorData[] =
{
{GO_LORD_MARROWGAR_S_ENTRANCE, DATA_LORD_MARROWGAR, DOOR_TYPE_ROOM, BOUNDARY_N },
@@ -116,6 +130,13 @@ class instance_icecrown_citadel : public InstanceMapScript
SpinestalkerGUID = 0;
RimefangGUID = 0;
TheLichKingGUID = 0;
HighlordTirionFordringGUID = 0;
TerenasMenethilGUID = 0;
ArthasPlatformGUID = 0;
ArthasPrecipiceGUID = 0;
FrozenThroneEdgeGUID = 0;
FrozenThroneWindGUID = 0;
FrozenThroneWarningGUID = 0;
FrostwyrmCount = 0;
SpinestalkerTrashCount = 0;
RimefangTrashCount = 0;
@@ -125,7 +146,6 @@ class instance_icecrown_citadel : public InstanceMapScript
IsOrbWhispererEligible = true;
ColdflameJetsState = NOT_STARTED;
BloodQuickeningState = NOT_STARTED;
BloodQuickeningTimer = 0;
BloodQuickeningMinutes = 0;
}
@@ -269,6 +289,13 @@ class instance_icecrown_citadel : public InstanceMapScript
case NPC_THE_LICH_KING:
TheLichKingGUID = creature->GetGUID();
break;
case NPC_HIGHLORD_TIRION_FORDRING_LK:
HighlordTirionFordringGUID = creature->GetGUID();
break;
case NPC_TERENAS_MENETHIL_FROSTMOURNE:
case NPC_TERENAS_MENETHIL_FROSTMOURNE_H:
TerenasMenethilGUID = creature->GetGUID();
break;
default:
break;
}
@@ -424,6 +451,40 @@ class instance_icecrown_citadel : public InstanceMapScript
case GO_DRINK_ME:
PutricideTableGUID = go->GetGUID();
break;
case GO_ARTHAS_PLATFORM:
// this enables movement at The Frozen Throne, when printed this value is 0.000000f
// however, when represented as integer client will accept only this value
go->SetUInt32Value(GAMEOBJECT_PARENTROTATION, 5535469);
ArthasPlatformGUID = go->GetGUID();
break;
case GO_ARTHAS_PRECIPICE:
go->SetUInt32Value(GAMEOBJECT_PARENTROTATION, 4178312);
ArthasPrecipiceGUID = go->GetGUID();
break;
case GO_DOODAD_ICECROWN_THRONEFROSTYEDGE01:
FrozenThroneEdgeGUID = go->GetGUID();
break;
case GO_DOODAD_ICECROWN_THRONEFROSTYWIND01:
FrozenThroneWindGUID = go->GetGUID();
break;
case GO_DOODAD_ICECROWN_SNOWEDGEWARNING01:
FrozenThroneWarningGUID = go->GetGUID();
break;
case GO_FROZEN_LAVAMAN:
FrozenBolvarGUID = go->GetGUID();
if (GetBossState(DATA_THE_LICH_KING) == DONE)
go->SetRespawnTime(7 * DAY);
break;
case GO_LAVAMAN_PILLARS_CHAINED:
PillarsChainedGUID = go->GetGUID();
if (GetBossState(DATA_THE_LICH_KING) == DONE)
go->SetRespawnTime(7 * DAY);
break;
case GO_LAVAMAN_PILLARS_UNCHAINED:
PillarsUnchainedGUID = go->GetGUID();
if (GetBossState(DATA_THE_LICH_KING) == DONE)
go->SetRespawnTime(7 * DAY);
break;
default:
break;
}
@@ -541,6 +602,12 @@ class instance_icecrown_citadel : public InstanceMapScript
return RimefangGUID;
case DATA_THE_LICH_KING:
return TheLichKingGUID;
case DATA_HIGHLORD_TIRION_FORDRING:
return HighlordTirionFordringGUID;
case DATA_ARTHAS_PLATFORM:
return ArthasPlatformGUID;
case DATA_TERENAS_MENETHIL:
return TerenasMenethilGUID;
default:
break;
}
@@ -661,6 +728,14 @@ class instance_icecrown_citadel : public InstanceMapScript
}
break;
case DATA_THE_LICH_KING:
{
// set the platform as active object to dramatically increase visibility range
// note: "active" gameobjects do not block grid unloading
if (GameObject* precipice = instance->GetGameObject(ArthasPrecipiceGUID))
precipice->setActive(state == IN_PROGRESS);
if (GameObject* platform = instance->GetGameObject(ArthasPlatformGUID))
platform->setActive(state == IN_PROGRESS);
if (instance->IsHeroic())
{
if (state == FAIL && HeroicAttempts)
@@ -672,7 +747,18 @@ class instance_icecrown_citadel : public InstanceMapScript
theLichKing->DespawnOrUnsummon();
}
}
if (state == DONE)
{
if (GameObject* bolvar = instance->GetGameObject(FrozenBolvarGUID))
bolvar->SetRespawnTime(7 * DAY);
if (GameObject* pillars = instance->GetGameObject(PillarsChainedGUID))
pillars->SetRespawnTime(7 * DAY);
if (GameObject* pillars = instance->GetGameObject(PillarsUnchainedGUID))
pillars->SetRespawnTime(7 * DAY);
}
break;
}
default:
break;
}
@@ -798,13 +884,13 @@ class instance_icecrown_citadel : public InstanceMapScript
switch (data)
{
case IN_PROGRESS:
BloodQuickeningTimer = 60000;
Events.ScheduleEvent(EVENT_UPDATE_EXECUTION_TIME, 60000);
BloodQuickeningMinutes = 30;
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 1);
DoUpdateWorldState(WORLDSTATE_EXECUTION_TIME, BloodQuickeningMinutes);
break;
case DONE:
BloodQuickeningTimer = 0;
Events.CancelEvent(EVENT_UPDATE_EXECUTION_TIME);
BloodQuickeningMinutes = 0;
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0);
break;
@@ -1050,32 +1136,103 @@ class instance_icecrown_citadel : public InstanceMapScript
void Update(uint32 diff)
{
if (BloodQuickeningState == IN_PROGRESS)
if (BloodQuickeningState != IN_PROGRESS && GetBossState(DATA_THE_LICH_KING) != IN_PROGRESS)
return;
Events.Update(diff);
while (uint32 eventId = Events.ExecuteEvent())
{
if (BloodQuickeningTimer <= diff)
switch (eventId)
{
--BloodQuickeningMinutes;
BloodQuickeningTimer = 60000;
if (BloodQuickeningMinutes)
case EVENT_UPDATE_EXECUTION_TIME:
{
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 1);
DoUpdateWorldState(WORLDSTATE_EXECUTION_TIME, BloodQuickeningMinutes);
--BloodQuickeningMinutes;
if (BloodQuickeningMinutes)
{
Events.ScheduleEvent(EVENT_UPDATE_EXECUTION_TIME, 60000);
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 1);
DoUpdateWorldState(WORLDSTATE_EXECUTION_TIME, BloodQuickeningMinutes);
}
else
{
BloodQuickeningState = DONE;
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0);
if (Creature* bq = instance->GetCreature(BloodQueenLanaThelGUID))
bq->AI()->DoAction(ACTION_KILL_MINCHAR);
}
SaveToDB();
break;
}
else
case EVENT_QUAKE_SHATTER:
{
BloodQuickeningState = DONE;
DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0);
if (Creature* bq = instance->GetCreature(BloodQueenLanaThelGUID))
bq->AI()->DoAction(ACTION_KILL_MINCHAR);
if (GameObject* platform = instance->GetGameObject(ArthasPlatformGUID))
platform->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED);
if (GameObject* edge = instance->GetGameObject(FrozenThroneEdgeGUID))
edge->SetGoState(GO_STATE_ACTIVE);
if (GameObject* wind = instance->GetGameObject(FrozenThroneWindGUID))
wind->SetGoState(GO_STATE_READY);
if (GameObject* warning = instance->GetGameObject(FrozenThroneWarningGUID))
warning->SetGoState(GO_STATE_READY);
if (Creature* theLichKing = instance->GetCreature(TheLichKingGUID))
theLichKing->AI()->DoAction(ACTION_RESTORE_LIGHT);
break;
}
SaveToDB();
case EVENT_REBUILD_PLATFORM:
if (GameObject* platform = instance->GetGameObject(ArthasPlatformGUID))
platform->SetDestructibleState(GO_DESTRUCTIBLE_REBUILDING);
if (GameObject* edge = instance->GetGameObject(FrozenThroneEdgeGUID))
edge->SetGoState(GO_STATE_READY);
if (GameObject* wind = instance->GetGameObject(FrozenThroneWindGUID))
wind->SetGoState(GO_STATE_ACTIVE);
break;
default:
break;
}
else
BloodQuickeningTimer -= diff;
}
}
void ProcessEvent(WorldObject* /*source*/, uint32 eventId)
{
switch (eventId)
{
case EVENT_QUAKE:
if (GameObject* warning = instance->GetGameObject(FrozenThroneWarningGUID))
warning->SetGoState(GO_STATE_ACTIVE);
Events.ScheduleEvent(EVENT_QUAKE_SHATTER, 5000);
break;
case EVENT_SECOND_REMORSELESS_WINTER:
if (GameObject* platform = instance->GetGameObject(ArthasPlatformGUID))
{
platform->SetDestructibleState(GO_DESTRUCTIBLE_DESTROYED);
Events.ScheduleEvent(EVENT_REBUILD_PLATFORM, 1500);
}
break;
case EVENT_TELEPORT_TO_FROSMOURNE: // Harvest Soul (normal mode)
if (Creature* terenas = instance->SummonCreature(NPC_TERENAS_MENETHIL_FROSTMOURNE, TerenasSpawn, NULL, 63000))
{
terenas->AI()->DoAction(ACTION_FROSTMOURNE_INTRO);
std::list<Creature*> triggers;
GetCreatureListWithEntryInGrid(triggers, terenas, NPC_WORLD_TRIGGER_INFINITE_AOI, 100.0f);
if (!triggers.empty())
{
triggers.sort(Trinity::ObjectDistanceOrderPred(terenas, false));
Unit* visual = triggers.front();
visual->CastSpell(visual, SPELL_FROSTMOURNE_TELEPORT_VISUAL, true);
}
if (Creature* warden = instance->SummonCreature(NPC_SPIRIT_WARDEN, SpiritWardenSpawn, NULL, 63000))
{
terenas->AI()->AttackStart(warden);
warden->AddThreat(terenas, 300000.0f);
}
}
break;
}
}
protected:
EventMap Events;
uint64 LadyDeathwisperElevatorGUID;
uint64 DeathbringerSaurfangGUID;
uint64 DeathbringerSaurfangDoorGUID;
@@ -1105,8 +1262,17 @@ class instance_icecrown_citadel : public InstanceMapScript
uint64 SpinestalkerGUID;
uint64 RimefangGUID;
uint64 TheLichKingGUID;
uint64 HighlordTirionFordringGUID;
uint64 TerenasMenethilGUID;
uint64 ArthasPlatformGUID;
uint64 ArthasPrecipiceGUID;
uint64 FrozenThroneEdgeGUID;
uint64 FrozenThroneWindGUID;
uint64 FrozenThroneWarningGUID;
uint64 FrozenBolvarGUID;
uint64 PillarsChainedGUID;
uint64 PillarsUnchainedGUID;
uint32 TeamInInstance;
uint32 BloodQuickeningTimer;
uint32 ColdflameJetsState;
uint32 FrostwyrmCount;
uint32 SpinestalkerTrashCount;