aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Spells/SpellMgr.cpp8
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp316
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h4
3 files changed, 201 insertions, 127 deletions
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index fbd5235cdfa..3c15a374d1b 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -3418,14 +3418,16 @@ void SpellMgr::LoadSpellInfoCorrections()
// Jump
ApplySpellFix({ 71809 }, [](SpellInfo* spellInfo)
{
- spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(3); // 20yd
- const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_25_YARDS); // 25yd
+ spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(5); // 40yd
+ const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_10_YARDS); // 10yd
+ const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->MiscValue = 190;
});
// Broken Frostmourne
ApplySpellFix({ 72405 }, [](SpellInfo* spellInfo)
{
- const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd
+ const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_20_YARDS); // 20yd
+ spellInfo->AttributesEx |= SPELL_ATTR1_NO_THREAT;
});
// ENDOF ICECROWN CITADEL SPELLS
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
index e525c2efa45..94bf769b771 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
@@ -197,77 +197,80 @@ enum Events
{
// The Lich King
// intro events
- EVENT_INTRO_MOVE_1 = 1,
- EVENT_INTRO_MOVE_2 = 2,
- EVENT_INTRO_MOVE_3 = 3,
- EVENT_INTRO_TALK_1 = 4,
- EVENT_EMOTE_CAST_SHOUT = 5,
- EVENT_INTRO_EMOTE_1 = 6,
- EVENT_INTRO_CHARGE = 7,
- EVENT_INTRO_CAST_FREEZE = 8,
- EVENT_FINISH_INTRO = 9,
+ EVENT_INTRO_MOVE_1 = 1,
+ EVENT_INTRO_MOVE_2,
+ EVENT_INTRO_MOVE_3,
+ EVENT_INTRO_TALK_1,
+ EVENT_EMOTE_CAST_SHOUT,
+ EVENT_INTRO_EMOTE_1,
+ EVENT_INTRO_CHARGE,
+ EVENT_INTRO_CAST_FREEZE,
+ EVENT_FINISH_INTRO,
// combat events
- EVENT_SUMMON_SHAMBLING_HORROR = 10,
- EVENT_SUMMON_DRUDGE_GHOUL = 11,
- EVENT_INFEST = 12,
- EVENT_NECROTIC_PLAGUE = 13,
- EVENT_SHADOW_TRAP = 14, // heroic only
- EVENT_SOUL_REAPER = 15,
- EVENT_DEFILE = 16,
- EVENT_HARVEST_SOUL = 17, // normal mode only
- EVENT_PAIN_AND_SUFFERING = 18,
- EVENT_SUMMON_ICE_SPHERE = 19,
- EVENT_SUMMON_RAGING_SPIRIT = 20,
- EVENT_QUAKE = 21,
- EVENT_SUMMON_VALKYR = 22,
- EVENT_GRAB_PLAYER = 23,
- EVENT_MOVE_TO_DROP_POS = 24,
- EVENT_LIFE_SIPHON = 25, // heroic only
- EVENT_START_ATTACK = 26,
- EVENT_QUAKE_2 = 27,
- EVENT_VILE_SPIRITS = 28,
- EVENT_HARVEST_SOULS = 29, // heroic only
- EVENT_BERSERK = 30,
- EVENT_SOUL_RIP = 31,
- EVENT_DESTROY_SOUL = 32,
- EVENT_FROSTMOURNE_TALK_1 = 33,
- EVENT_FROSTMOURNE_TALK_2 = 34,
- EVENT_FROSTMOURNE_TALK_3 = 35,
- EVENT_TELEPORT_BACK = 36,
- EVENT_FROSTMOURNE_HEROIC = 37,
- EVENT_OUTRO_TALK_1 = 38,
- EVENT_OUTRO_TALK_2 = 39,
- EVENT_OUTRO_EMOTE_TALK = 40,
- EVENT_OUTRO_TALK_3 = 41,
- EVENT_OUTRO_MOVE_CENTER = 42,
- EVENT_OUTRO_TALK_4 = 43,
- EVENT_OUTRO_RAISE_DEAD = 44,
- EVENT_OUTRO_TALK_5 = 45,
- EVENT_OUTRO_BLESS = 46,
- EVENT_OUTRO_REMOVE_ICE = 47,
- EVENT_OUTRO_MOVE_1 = 48,
- EVENT_OUTRO_JUMP = 49,
- EVENT_OUTRO_TALK_6 = 50,
- EVENT_OUTRO_KNOCK_BACK = 51,
- EVENT_OUTRO_SOUL_BARRAGE = 52,
- EVENT_OUTRO_SUMMON_TERENAS = 53,
- EVENT_OUTRO_TERENAS_TALK_1 = 54,
- EVENT_OUTRO_TERENAS_TALK_2 = 55,
- EVENT_OUTRO_TALK_7 = 56,
- EVENT_OUTRO_TALK_8 = 57,
+ EVENT_SUMMON_SHAMBLING_HORROR,
+ EVENT_SUMMON_DRUDGE_GHOUL,
+ EVENT_INFEST,
+ EVENT_NECROTIC_PLAGUE,
+ EVENT_SHADOW_TRAP, // heroic only
+ EVENT_SOUL_REAPER,
+ EVENT_DEFILE,
+ EVENT_HARVEST_SOUL, // normal mode only
+ EVENT_PAIN_AND_SUFFERING,
+ EVENT_SUMMON_ICE_SPHERE,
+ EVENT_SUMMON_RAGING_SPIRIT,
+ EVENT_QUAKE,
+ EVENT_SUMMON_VALKYR,
+ EVENT_GRAB_PLAYER,
+ EVENT_MOVE_TO_DROP_POS,
+ EVENT_LIFE_SIPHON, // heroic only
+ EVENT_MOVE_TO_CENTER, // heroic only
+ EVENT_START_ATTACK,
+ EVENT_SUMMON_RAGING_SPIRIT_2,
+ EVENT_QUAKE_2,
+ EVENT_VILE_SPIRITS,
+ EVENT_HARVEST_SOULS, // heroic only
+ EVENT_BERSERK,
+ EVENT_SOUL_RIP,
+ EVENT_DESTROY_SOUL,
+ EVENT_FROSTMOURNE_TALK_1,
+ EVENT_FROSTMOURNE_TALK_2,
+ EVENT_FROSTMOURNE_TALK_3,
+ EVENT_TELEPORT_BACK,
+ EVENT_FROSTMOURNE_HEROIC,
+ EVENT_OUTRO_TALK_1,
+ EVENT_OUTRO_TALK_2,
+ EVENT_OUTRO_EMOTE_TALK,
+ EVENT_OUTRO_TALK_3,
+ EVENT_OUTRO_MOVE_CENTER,
+ EVENT_OUTRO_TALK_4,
+ EVENT_OUTRO_RAISE_DEAD,
+ EVENT_OUTRO_TALK_5,
+ EVENT_OUTRO_BLESS,
+ EVENT_OUTRO_REMOVE_ICE,
+ EVENT_OUTRO_MOVE_1,
+ EVENT_OUTRO_JUMP,
+ EVENT_OUTRO_TALK_6,
+ EVENT_OUTRO_KNOCK_BACK,
+ EVENT_OUTRO_SOUL_BARRAGE,
+ EVENT_OUTRO_SUMMON_TERENAS,
+ EVENT_OUTRO_TERENAS_TALK_1,
+ EVENT_OUTRO_TERENAS_TALK_2,
+ EVENT_OUTRO_TALK_7,
+ EVENT_OUTRO_TALK_8,
// Shambling Horror
- EVENT_SHOCKWAVE = 58,
- EVENT_ENRAGE = 59,
+ EVENT_SHOCKWAVE,
+ EVENT_ENRAGE,
// Raging Spirit
- EVENT_SOUL_SHRIEK = 60,
+ EVENT_SOUL_SHRIEK,
+ EVENT_SET_AGRESSIVE,
// Strangulate Vehicle (Harvest Soul)
- EVENT_TELEPORT = 61,
- EVENT_MOVE_TO_LICH_KING = 62,
- EVENT_DESPAWN_SELF = 63,
+ EVENT_TELEPORT,
+ EVENT_MOVE_TO_LICH_KING,
+ EVENT_DESPAWN_SELF,
};
enum EventGroups
@@ -320,6 +323,7 @@ enum MovePoints
POINT_OUTRO_JUMP = 11,
POINT_LK_OUTRO_2 = 12,
POINT_GROUND = 13,
+ POINT_SIPHON = 14,
POINT_CHARGE = 1003, // globally used number for charge spell effects
};
@@ -334,12 +338,14 @@ enum EncounterActions
ACTION_SUMMON_TERENAS = 6,
ACTION_FINISH_OUTRO = 7,
ACTION_TELEPORT_BACK = 8,
+ ACTION_DISABLE_RAGING = 9
};
enum MiscData
{
LIGHT_SNOWSTORM = 2490,
LIGHT_SOULSTORM = 2508,
+ LIGHT_FOG = 2509,
MUSIC_FROZEN_THRONE = 17457,
MUSIC_SPECIAL = 17458, // Summon Shambling Horror, Remorseless Winter, Quake, Summon Val'kyr Periodic, Harvest Soul, Vile Spirits
@@ -499,17 +505,7 @@ class boss_the_lich_king : public CreatureScript
_vileSpiritExplosions = 0;
}
- void InitializeAI() override
- {
- SetupEncounter();
- }
-
- void JustRespawned() override
- {
- SetupEncounter();
- }
-
- void SetupEncounter()
+ void Reset() override
{
_Reset();
me->AddUnitFlag(UNIT_FLAG_IMMUNE_TO_PC);
@@ -524,9 +520,10 @@ class boss_the_lich_king : public CreatureScript
Cell::VisitGridObjects(me, worker, 333.0f);
// Reset any light override
- me->GetMap()->SetZoneOverrideLight(AREA_THE_FROZEN_THRONE, 0, 5000);
+ me->GetMap()->SetZoneOverrideLight(AREA_ICECROWN_CITADEL, 0, 5000);
- me->SummonCreature(NPC_HIGHLORD_TIRION_FORDRING_LK, TirionSpawn, TEMPSUMMON_MANUAL_DESPAWN);
+ if (!ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HIGHLORD_TIRION_FORDRING)))
+ me->SummonCreature(NPC_HIGHLORD_TIRION_FORDRING_LK, TirionSpawn, TEMPSUMMON_MANUAL_DESPAWN);
}
void JustDied(Unit* /*killer*/) override
@@ -538,6 +535,8 @@ class boss_the_lich_king : public CreatureScript
me->GetMotionMaster()->MoveFall();
if (Creature* frostmourne = me->FindNearestCreature(NPC_FROSTMOURNE_TRIGGER, 50.0f))
frostmourne->DespawnOrUnsummon();
+ me->GetMap()->SetZoneOverrideLight(AREA_ICECROWN_CITADEL, LIGHT_FOG, 5000);
+ me->GetMap()->SetZoneWeather(AREA_ICECROWN_CITADEL, WEATHER_STATE_FOG, 0.0f);
}
void EnterCombat(Unit* target) override
@@ -550,6 +549,7 @@ class boss_the_lich_king : public CreatureScript
}
me->setActive(true);
+ me->SetCombatPulseDelay(5);
DoZoneInCombat();
events.SetPhase(PHASE_ONE);
@@ -592,7 +592,7 @@ class boss_the_lich_king : public CreatureScript
case ACTION_START_ENCOUNTER:
instance->SetBossState(DATA_THE_LICH_KING, IN_PROGRESS);
Talk(SAY_LK_INTRO_1);
- me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_FROZEN_THRONE);
+ me->GetMap()->SetZoneMusic(AREA_ICECROWN_CITADEL, MUSIC_FROZEN_THRONE);
// schedule talks
me->SetStandState(UNIT_STAND_STATE_STAND);
events.ScheduleEvent(EVENT_INTRO_MOVE_1, 4000);
@@ -601,10 +601,10 @@ class boss_the_lich_king : public CreatureScript
events.ScheduleEvent(EVENT_START_ATTACK, 5000);
break;
case ACTION_PLAY_MUSIC:
- me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_FINAL);
+ me->GetMap()->SetZoneMusic(AREA_ICECROWN_CITADEL, MUSIC_FINAL);
break;
case ACTION_RESTORE_LIGHT:
- me->GetMap()->SetZoneOverrideLight(AREA_THE_FROZEN_THRONE, 0, 5000);
+ me->GetMap()->SetZoneOverrideLight(AREA_ICECROWN_CITADEL, 0, 5000);
break;
case ACTION_BREAK_FROSTMOURNE:
me->CastSpell((Unit*)NULL, SPELL_SUMMON_BROKEN_FROSTMOURNE, TRIGGERED_IGNORE_CAST_IN_PROGRESS);
@@ -666,6 +666,7 @@ class boss_the_lich_king : public CreatureScript
events.SetPhase(PHASE_TRANSITION);
me->SetReactState(REACT_PASSIVE);
me->AttackStop();
+ me->InterruptNonMeleeSpells(true);
me->GetMotionMaster()->MovePoint(POINT_CENTER_1, CenterPosition);
return;
}
@@ -675,6 +676,7 @@ class boss_the_lich_king : public CreatureScript
events.SetPhase(PHASE_TRANSITION);
me->SetReactState(REACT_PASSIVE);
me->AttackStop();
+ me->InterruptNonMeleeSpells(true);
me->GetMotionMaster()->MovePoint(POINT_CENTER_2, CenterPosition);
return;
}
@@ -686,7 +688,7 @@ class boss_the_lich_king : public CreatureScript
events.Reset();
events.SetPhase(PHASE_OUTRO);
summons.DespawnAll();
- me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_FURY_OF_FROSTMOURNE);
+ me->GetMap()->SetZoneMusic(AREA_ICECROWN_CITADEL, MUSIC_FURY_OF_FROSTMOURNE);
me->InterruptNonMeleeSpells(true);
me->CastSpell((Unit*)NULL, SPELL_FURY_OF_FROSTMOURNE, TRIGGERED_NONE);
me->SetWalk(true);
@@ -738,8 +740,8 @@ class boss_the_lich_king : public CreatureScript
{
summon->CastSpell((Unit*)NULL, SPELL_BROKEN_FROSTMOURNE, true);
- me->GetMap()->SetZoneOverrideLight(AREA_THE_FROZEN_THRONE, LIGHT_SOULSTORM, 10000);
- me->GetMap()->SetZoneWeather(AREA_THE_FROZEN_THRONE, WEATHER_STATE_BLACKSNOW, 0.5f);
+ me->GetMap()->SetZoneOverrideLight(AREA_ICECROWN_CITADEL, LIGHT_SOULSTORM, 10000);
+ me->GetMap()->SetZoneWeather(AREA_ICECROWN_CITADEL, WEATHER_STATE_BLACKSNOW, 0.5f);
events.ScheduleEvent(EVENT_OUTRO_SOUL_BARRAGE, 5000, 0, PHASE_OUTRO);
return;
@@ -793,8 +795,8 @@ class boss_the_lich_king : public CreatureScript
{
if (spell->Id == REMORSELESS_WINTER_1 || spell->Id == REMORSELESS_WINTER_2)
{
- me->GetMap()->SetZoneOverrideLight(AREA_THE_FROZEN_THRONE, LIGHT_SNOWSTORM, 5000);
- me->GetMap()->SetZoneWeather(AREA_THE_FROZEN_THRONE, WEATHER_STATE_LIGHT_SNOW, 0.5f);
+ me->GetMap()->SetZoneOverrideLight(AREA_ICECROWN_CITADEL, LIGHT_SNOWSTORM, 5000);
+ me->GetMap()->SetZoneWeather(AREA_ICECROWN_CITADEL, WEATHER_STATE_LIGHT_SNOW, 0.5f);
}
}
@@ -820,13 +822,14 @@ class boss_the_lich_king : public CreatureScript
case POINT_CENTER_1:
me->SetFacingTo(0.0f, true);
Talk(SAY_LK_REMORSELESS_WINTER);
- me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL);
+ me->GetMap()->SetZoneMusic(AREA_ICECROWN_CITADEL, MUSIC_SPECIAL);
DoCast(me, SPELL_REMORSELESS_WINTER_1);
+ summons.DespawnEntry(NPC_SHADOW_TRAP);
events.DelayEvents(62500, EVENT_GROUP_BERSERK); // delay berserk timer, its not ticking during phase transitions
events.ScheduleEvent(EVENT_QUAKE, 62500, 0, PHASE_TRANSITION);
events.ScheduleEvent(EVENT_PAIN_AND_SUFFERING, 4000, 0, PHASE_TRANSITION);
events.ScheduleEvent(EVENT_SUMMON_ICE_SPHERE, 8000, 0, PHASE_TRANSITION);
- events.ScheduleEvent(EVENT_SUMMON_RAGING_SPIRIT, 3000, 0, PHASE_TRANSITION);
+ events.ScheduleEvent(EVENT_SUMMON_RAGING_SPIRIT, 6000, 0, PHASE_TRANSITION);
events.ScheduleEvent(EVENT_SUMMON_VALKYR, 78000, 0, PHASE_TWO);
events.ScheduleEvent(EVENT_INFEST, 70000, 0, PHASE_TWO);
events.ScheduleEvent(EVENT_DEFILE, 97000, 0, PHASE_TWO);
@@ -835,14 +838,14 @@ class boss_the_lich_king : public CreatureScript
case POINT_CENTER_2:
me->SetFacingTo(0.0f, true);
Talk(SAY_LK_REMORSELESS_WINTER);
- me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL);
+ me->GetMap()->SetZoneMusic(AREA_ICECROWN_CITADEL, MUSIC_SPECIAL);
DoCast(me, SPELL_REMORSELESS_WINTER_2);
summons.DespawnEntry(NPC_VALKYR_SHADOWGUARD);
events.DelayEvents(62500, EVENT_GROUP_BERSERK); // delay berserk timer, its not ticking during phase transitions
events.ScheduleEvent(EVENT_QUAKE_2, 62500, 0, PHASE_TRANSITION);
events.ScheduleEvent(EVENT_PAIN_AND_SUFFERING, 6000, 0, PHASE_TRANSITION);
events.ScheduleEvent(EVENT_SUMMON_ICE_SPHERE, 8000, 0, PHASE_TRANSITION);
- events.ScheduleEvent(EVENT_SUMMON_RAGING_SPIRIT, 5000, 0, PHASE_TRANSITION);
+ events.ScheduleEvent(EVENT_SUMMON_RAGING_SPIRIT_2, 5000, 0, PHASE_TRANSITION);
events.ScheduleEvent(EVENT_DEFILE, 95500, 0, PHASE_THREE);
events.ScheduleEvent(EVENT_SOUL_REAPER, 99500, 0, PHASE_THREE);
events.ScheduleEvent(EVENT_VILE_SPIRITS, 79500, EVENT_GROUP_VILE_SPIRITS, PHASE_THREE);
@@ -921,7 +924,7 @@ class boss_the_lich_king : public CreatureScript
break;
case EVENT_SUMMON_SHAMBLING_HORROR:
DoCast(me, SPELL_SUMMON_SHAMBLING_HORROR);
- me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL);
+ me->GetMap()->SetZoneMusic(AREA_ICECROWN_CITADEL, MUSIC_SPECIAL);
events.ScheduleEvent(EVENT_SUMMON_SHAMBLING_HORROR, 60000, 0, PHASE_ONE);
break;
case EVENT_SUMMON_DRUDGE_GHOUL:
@@ -977,24 +980,29 @@ class boss_the_lich_king : public CreatureScript
me->CastSpell(target, SPELL_RAGING_SPIRIT, TRIGGERED_NONE);
events.ScheduleEvent(EVENT_SUMMON_RAGING_SPIRIT, urand(22000, 23000), 0, PHASE_TRANSITION);
break;
+ case EVENT_SUMMON_RAGING_SPIRIT_2:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
+ me->CastSpell(target, SPELL_RAGING_SPIRIT, TRIGGERED_NONE);
+ events.ScheduleEvent(EVENT_SUMMON_RAGING_SPIRIT, 18000, 0, PHASE_TRANSITION);
+ break;
case EVENT_QUAKE:
events.SetPhase(PHASE_TWO);
me->ClearUnitState(UNIT_STATE_CASTING); // clear state to ensure check in DoCastAOE passes
DoCastAOE(SPELL_QUAKE);
- me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL);
+ me->GetMap()->SetZoneMusic(AREA_ICECROWN_CITADEL, MUSIC_SPECIAL);
Talk(SAY_LK_QUAKE);
break;
case EVENT_QUAKE_2:
events.SetPhase(PHASE_THREE);
me->ClearUnitState(UNIT_STATE_CASTING); // clear state to ensure check in DoCastAOE passes
DoCastAOE(SPELL_QUAKE);
- me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL);
+ me->GetMap()->SetZoneMusic(AREA_ICECROWN_CITADEL, MUSIC_SPECIAL);
Talk(SAY_LK_QUAKE);
break;
case EVENT_SUMMON_VALKYR:
- me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL);
+ me->GetMap()->SetZoneMusic(AREA_ICECROWN_CITADEL, MUSIC_SPECIAL);
Talk(SAY_LK_SUMMON_VALKYR);
- DoCastAOE(SUMMON_VALKYR);
+ DoCastAOE(SUMMON_VALKYR, true);
events.ScheduleEvent(EVENT_SUMMON_VALKYR, urand(45000, 50000), 0, PHASE_TWO);
break;
case EVENT_START_ATTACK:
@@ -1003,7 +1011,7 @@ class boss_the_lich_king : public CreatureScript
events.SetPhase(PHASE_THREE);
break;
case EVENT_VILE_SPIRITS:
- me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL);
+ me->GetMap()->SetZoneMusic(AREA_ICECROWN_CITADEL, MUSIC_SPECIAL);
DoCastAOE(SPELL_VILE_SPIRITS);
events.ScheduleEvent(EVENT_VILE_SPIRITS, urand(35000, 40000), EVENT_GROUP_VILE_SPIRITS, PHASE_THREE);
break;
@@ -1019,6 +1027,25 @@ class boss_the_lich_king : public CreatureScript
events.RescheduleEvent(EVENT_SOUL_REAPER, urand(57000, 62000), 0, PHASE_THREE);
events.ScheduleEvent(EVENT_START_ATTACK, 49000);
events.ScheduleEvent(EVENT_FROSTMOURNE_HEROIC, 6500);
+ for (ObjectGuid guid : summons)
+ {
+ if (Creature* summon = ObjectAccessor::GetCreature(*me, guid))
+ {
+ if (summon->GetEntry() == NPC_VILE_SPIRIT)
+ {
+ summon->m_Events.KillAllEvents(true);
+ summon->m_Events.AddEvent(new VileSpiritActivateEvent(summon), summon->m_Events.CalculateTime(56500));
+ summon->SetReactState(REACT_PASSIVE);
+ summon->CombatStop(true);
+ summon->RemoveAurasDueToSpell(SPELL_VILE_SPIRIT_MOVE_SEARCH);
+ summon->RemoveAurasDueToSpell(SPELL_VILE_SPIRIT_DAMAGE_SEARCH);
+ summon->GetMotionMaster()->MoveTargetedHome();
+ summon->GetMotionMaster()->MoveRandom(10.0f);
+ }
+ else if (summon->GetEntry() == NPC_RAGING_SPIRIT)
+ summon->AI()->DoAction(ACTION_DISABLE_RAGING);
+ }
+ }
break;
case EVENT_FROSTMOURNE_HEROIC:
if (TempSummon* terenas = me->GetMap()->SummonCreature(NPC_TERENAS_MENETHIL_FROSTMOURNE_H, TerenasSpawnHeroic, NULL, 50000))
@@ -1034,18 +1061,6 @@ class boss_the_lich_king : public CreatureScript
spawner->CastSpell(spawner, SPELL_SUMMON_SPIRIT_BOMB_2, true); // summons bombs on players
spawner->m_Events.AddEvent(new TriggerWickedSpirit(spawner), spawner->m_Events.CalculateTime(3000));
}
-
- for (SummonList::iterator i = summons.begin(); i != summons.end(); ++i)
- {
- Creature* summon = ObjectAccessor::GetCreature(*me, *i);
- if (summon && summon->GetEntry() == NPC_VILE_SPIRIT)
- {
- summon->m_Events.KillAllEvents(true);
- summon->m_Events.AddEvent(new VileSpiritActivateEvent(summon), summon->m_Events.CalculateTime(50000));
- summon->GetMotionMaster()->MoveRandom(10.0f);
- summon->SetReactState(REACT_PASSIVE);
- }
- }
}
break;
case EVENT_OUTRO_TALK_1:
@@ -1074,7 +1089,7 @@ class boss_the_lich_king : public CreatureScript
case EVENT_OUTRO_RAISE_DEAD:
DoCastAOE(SPELL_RAISE_DEAD);
me->ClearUnitState(UNIT_STATE_CASTING);
- me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_FINAL);
+ me->GetMap()->SetZoneMusic(AREA_ICECROWN_CITADEL, MUSIC_FINAL);
break;
case EVENT_OUTRO_TALK_5:
Talk(SAY_LK_OUTRO_5);
@@ -1189,7 +1204,7 @@ class npc_tirion_fordring_tft : public CreatureScript
if (spell->Id == SPELL_ICE_LOCK)
me->SetFacingTo(3.085098f);
else if (spell->Id == SPELL_BROKEN_FROSTMOURNE_KNOCK)
- SetEquipmentSlots(true); // remove glow on ashbringer
+ me->LoadEquipment(1); // remove glow on ashbringer
}
void sGossipSelect(Player* /*player*/, uint32 menuId, uint32 gossipListId) override
@@ -1357,7 +1372,9 @@ class npc_raging_spirit : public CreatureScript
void Reset() override
{
+ me->SetReactState(REACT_PASSIVE);
_events.Reset();
+ _events.ScheduleEvent(EVENT_SET_AGRESSIVE, 2000);
_events.ScheduleEvent(EVENT_SOUL_SHRIEK, urand(12000, 15000));
DoCast(me, SPELL_PLAGUE_AVOIDANCE, true);
DoCast(me, SPELL_RAGING_SPIRIT_VISUAL, true);
@@ -1367,6 +1384,19 @@ class npc_raging_spirit : public CreatureScript
DoCast(me, SPELL_BOSS_HITTIN_YA, true);
}
+ void DoAction(int32 action) override
+ {
+ if (action == ACTION_DISABLE_RAGING)
+ {
+ _events.Reset();
+ _events.SetPhase(PHASE_FROSTMOURNE);
+ _events.ScheduleEvent(EVENT_SET_AGRESSIVE, 52000);
+ me->SetReactState(REACT_PASSIVE);
+ me->AttackStop();
+ me->InterruptNonMeleeSpells(true);
+ }
+ }
+
void IsSummonedBy(Unit* /*summoner*/) override
{
// player is the spellcaster so register summon manually
@@ -1384,7 +1414,7 @@ class npc_raging_spirit : public CreatureScript
void UpdateAI(uint32 diff) override
{
- if (!UpdateVictim())
+ if (!_events.IsInPhase(PHASE_FROSTMOURNE) && !UpdateVictim())
return;
_events.Update(diff);
@@ -1400,6 +1430,14 @@ class npc_raging_spirit : public CreatureScript
DoCastAOE(SPELL_SOUL_SHRIEK);
_events.ScheduleEvent(EVENT_SOUL_SHRIEK, urand(12000, 15000));
break;
+ case EVENT_SET_AGRESSIVE:
+ me->SetReactState(REACT_AGGRESSIVE);
+ if (_events.IsInPhase(PHASE_FROSTMOURNE))
+ {
+ _events.SetPhase(PHASE_THREE);
+ _events.ScheduleEvent(EVENT_SOUL_SHRIEK, urand(12000, 15000));
+ }
+ break;
default:
break;
}
@@ -1454,19 +1492,18 @@ class npc_valkyr_shadowguard : public CreatureScript
if (me->HealthBelowPctDamaged(50, damage))
{
- _events.Reset();
DoCastAOE(SPELL_EJECT_ALL_PASSENGERS);
- me->GetMotionMaster()->MoveTargetedHome();
- me->ClearUnitState(UNIT_STATE_EVADE);
+ ScheduleHeroicEvents();
}
}
- void JustReachedHome() override
+ void ScheduleHeroicEvents()
{
- // schedule siphon life event (heroic only)
DoZoneInCombat();
_events.Reset();
+ _events.ScheduleEvent(EVENT_MOVE_TO_CENTER, 1);
_events.ScheduleEvent(EVENT_LIFE_SIPHON, 2000);
+ me->ClearUnitState(UNIT_STATE_EVADE);
}
void AttackStart(Unit* /*target*/) override
@@ -1482,7 +1519,10 @@ class npc_valkyr_shadowguard : public CreatureScript
{
case POINT_DROP_PLAYER:
DoCastAOE(SPELL_EJECT_ALL_PASSENGERS);
- me->DespawnOrUnsummon(1000);
+ if (IsHeroic())
+ ScheduleHeroicEvents();
+ else
+ me->DespawnOrUnsummon(1000);
break;
case POINT_CHARGE:
if (Player* target = ObjectAccessor::GetPlayer(*me, _grabbedPlayer))
@@ -1545,6 +1585,13 @@ class npc_valkyr_shadowguard : public CreatureScript
DoCast(target, SPELL_LIFE_SIPHON);
_events.ScheduleEvent(EVENT_LIFE_SIPHON, 2500);
break;
+ case EVENT_MOVE_TO_CENTER:
+ {
+ Position pos = me->GetRandomPoint(CenterPosition, 4.0f);
+ pos.m_positionZ = me->GetHomePosition().m_positionZ;
+ me->GetMotionMaster()->MovePoint(POINT_SIPHON, pos);
+ break;
+ }
default:
break;
}
@@ -1607,6 +1654,7 @@ class npc_strangulate_vehicle : public CreatureScript
if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_THE_LICH_KING)))
lichKing->AI()->SummonedCreatureDespawn(me);
+ me->DespawnOrUnsummon();
}
void UpdateAI(uint32 diff) override
@@ -2099,7 +2147,7 @@ class spell_the_lich_king_necrotic_plague_jump : public SpellScriptLoader
}
private:
- void SelectTarget(std::list<Unit*>& targets)
+ void SelectTarget(std::list<WorldObject*>& targets)
{
targets.sort(Trinity::ObjectDistanceOrderPred(GetCaster()));
if (targets.size() < 2)
@@ -2125,6 +2173,7 @@ class spell_the_lich_king_necrotic_plague_jump : public SpellScriptLoader
void Register() override
{
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_necrotic_plague_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY);
BeforeHit += BeforeSpellHitFn(spell_the_lich_king_necrotic_plague_SpellScript::CheckAura);
OnHit += SpellHitFn(spell_the_lich_king_necrotic_plague_SpellScript::AddMissingStack);
}
@@ -2357,12 +2406,6 @@ class spell_the_lich_king_raging_spirit : public SpellScriptLoader
{
PrepareSpellScript(spell_the_lich_king_raging_spirit_SpellScript);
- bool Validate(SpellInfo const* spell) override
- {
- SpellEffectInfo const* effect0 = spell->GetEffect(EFFECT_0);
- return effect0 && ValidateSpellInfo({ uint32(effect0->CalcValue()) });
- }
-
void HandleScript(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
@@ -3134,6 +3177,34 @@ class spell_the_lich_king_jump_remove_aura : public SpellScriptLoader
}
};
+class spell_the_lich_king_harvest_souls_teleport : public SpellScriptLoader
+{
+public:
+ spell_the_lich_king_harvest_souls_teleport() : SpellScriptLoader("spell_the_lich_king_harvest_souls_teleport") { }
+
+ class spell_the_lich_king_harvest_souls_teleport_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_the_lich_king_harvest_souls_teleport_SpellScript);
+
+ void RelocateTransportOffset(SpellEffIndex /*effIndex*/)
+ {
+ float randCoordX = frand(-18.0f, 18.0f);
+ float randCoordY = frand(-18.0f, 18.0f);
+ GetHitDest()->RelocateOffset({ randCoordX, randCoordY, 0.0f, 0.0f });
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_the_lich_king_harvest_souls_teleport_SpellScript::RelocateTransportOffset, EFFECT_1, SPELL_EFFECT_TELEPORT_UNITS);
+ }
+ };
+
+ SpellScript* GetSpellScript() const override
+ {
+ return new spell_the_lich_king_harvest_souls_teleport_SpellScript();
+ }
+};
+
class achievement_been_waiting_long_time : public AchievementCriteriaScript
{
public:
@@ -3203,6 +3274,7 @@ void AddSC_boss_the_lich_king()
new spell_the_lich_king_jump();
new spell_the_lich_king_jump_remove_aura();
new spell_trigger_spell_from_caster("spell_the_lich_king_mass_resurrection", SPELL_MASS_RESURRECTION_REAL);
+ new spell_the_lich_king_harvest_souls_teleport();
new achievement_been_waiting_long_time();
new achievement_neck_deep_in_vile();
}
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
index 1f9d88ea885..8fff8922983 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
@@ -321,6 +321,7 @@ enum ICCreaturesIds
NPC_WORLD_TRIGGER_INFINITE_AOI = 36171,
NPC_SPIRIT_BOMB = 39189,
NPC_FROSTMOURNE_TRIGGER = 38584,
+ NPC_SHADOW_TRAP = 39137,
// Generic
NPC_INVISIBLE_STALKER = 30298
@@ -524,8 +525,7 @@ enum ICWorldStatesICC
enum ICAreaIds
{
- AREA_ICECROWN_CITADEL = 4812,
- AREA_THE_FROZEN_THRONE = 4859
+ AREA_ICECROWN_CITADEL = 4812
};
class spell_trigger_spell_from_caster : public SpellScriptLoader