Core/Scripts: minor fixes in boss_the_lich_king (#19311)

Closes #4427
Closes #7091
This commit is contained in:
Gustavo
2017-03-24 08:59:04 -03:00
committed by Keader
parent b74cc80859
commit 2792046dc7
4 changed files with 218 additions and 131 deletions

View File

@@ -0,0 +1,14 @@
-- Correct speed for Wicked Spirits and Spirit Bombs
UPDATE `creature_template` SET `speed_walk`=1.2, `speed_run`=0.428571 WHERE `entry` IN(39189,39190,39287,39288,39289);
UPDATE `creature_template` SET `InhabitType`=4, `HoverHeight`=4 WHERE `entry` IN(36609,39120,39121,39122);
DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_the_lich_king_harvest_souls_teleport';
INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
(73655,'spell_the_lich_king_harvest_souls_teleport');
DELETE FROM `spell_custom_attr` WHERE `entry` IN(69409,73797,73798,73799);
INSERT INTO `spell_custom_attr` (`entry`,`attributes`) VALUES
(69409,32768),
(73797,32768),
(73798,32768),
(73799,32768);

View File

@@ -3584,7 +3584,7 @@ void SpellMgr::LoadSpellInfoCorrections()
spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_10_YARDS); // 10yd
break;
case 74282: // Shadow Trap (searcher)
spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_3_YARDS); // 3yd
spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_5_YARDS); // 5yd
break;
case 72595: // Restore Soul
case 73650: // Restore Soul
@@ -3623,11 +3623,13 @@ void SpellMgr::LoadSpellInfoCorrections()
spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_50000_YARDS); // 50000yd
break;
case 71809: // Jump
spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(3); // 20yd
spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_25_YARDS); // 25yd
spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(5); // 40yd
spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_10_YARDS); // 10yd
spellInfo->Effects[EFFECT_0].MiscValue = 190;
break;
case 72405: // Broken Frostmourne
spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd
spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_20_YARDS); // 20yd
spellInfo->AttributesEx |= SPELL_ATTR1_NO_THREAT;
break;
// ENDOF ICECROWN CITADEL SPELLS
//

View File

@@ -192,77 +192,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
@@ -315,6 +318,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
};
@@ -329,12 +333,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
@@ -515,17 +521,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->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
@@ -540,9 +536,10 @@ class boss_the_lich_king : public CreatureScript
me->VisitNearbyGridObject(333.0f, worker);
// 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
@@ -554,6 +551,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
@@ -566,6 +565,7 @@ class boss_the_lich_king : public CreatureScript
}
me->setActive(true);
me->SetCombatPulseDelay(5);
DoZoneInCombat();
events.SetPhase(PHASE_ONE);
@@ -608,7 +608,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);
@@ -617,10 +617,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);
@@ -682,6 +682,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;
}
@@ -691,6 +692,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;
}
@@ -702,7 +704,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);
@@ -754,8 +756,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;
@@ -809,8 +811,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);
}
}
@@ -836,13 +838,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);
@@ -851,14 +854,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);
@@ -934,10 +937,11 @@ class boss_the_lich_king : public CreatureScript
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
me->SetReactState(REACT_AGGRESSIVE);
events.SetPhase(PHASE_ONE);
DoZoneInCombat();
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:
@@ -993,24 +997,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:
@@ -1019,7 +1028,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;
@@ -1035,6 +1044,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))
@@ -1050,18 +1078,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:
@@ -1090,7 +1106,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);
@@ -1161,7 +1177,6 @@ class npc_tirion_fordring_tft : public CreatureScript
_events.Reset();
if (_instance->GetBossState(DATA_THE_LICH_KING) == DONE)
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
me->LoadEquipment(1);
}
void MovementInform(uint32 type, uint32 id) override
@@ -1205,7 +1220,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
@@ -1373,7 +1388,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);
@@ -1383,6 +1400,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
@@ -1400,7 +1430,7 @@ class npc_raging_spirit : public CreatureScript
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
if (!_events.IsInPhase(PHASE_FROSTMOURNE) && !UpdateVictim())
return;
_events.Update(diff);
@@ -1416,6 +1446,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;
}
@@ -1470,19 +1508,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
@@ -1498,7 +1535,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))
@@ -1561,6 +1601,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;
}
@@ -1623,6 +1670,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
@@ -2117,7 +2165,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)
@@ -2140,6 +2188,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 += SpellHitFn(spell_the_lich_king_necrotic_plague_SpellScript::CheckAura);
OnHit += SpellHitFn(spell_the_lich_king_necrotic_plague_SpellScript::AddMissingStack);
}
@@ -2374,13 +2423,6 @@ class spell_the_lich_king_raging_spirit : public SpellScriptLoader
{
PrepareSpellScript(spell_the_lich_king_raging_spirit_SpellScript);
bool Validate(SpellInfo const* /*spell*/) override
{
if (!sSpellMgr->GetSpellInfo(SPELL_LIFE_SIPHON_HEAL))
return false;
return true;
}
void HandleScript(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
@@ -2539,7 +2581,7 @@ class spell_the_lich_king_valkyr_target_search : public SpellScriptLoader
private:
bool Validate(SpellInfo const* /*spell*/) override
{
if (!sSpellMgr->GetSpellInfo(SPELL_ICE_BURST))
if (!sSpellMgr->GetSpellInfo(SPELL_CHARGE))
return false;
return true;
}
@@ -3192,6 +3234,34 @@ class spell_the_lich_king_play_movie : 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:
@@ -3262,6 +3332,7 @@ void AddSC_boss_the_lich_king()
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_play_movie();
new spell_the_lich_king_harvest_souls_teleport();
new achievement_been_waiting_long_time();
new achievement_neck_deep_in_vile();
}

View File

@@ -317,6 +317,7 @@ enum CreaturesIds
NPC_WORLD_TRIGGER_INFINITE_AOI = 36171,
NPC_SPIRIT_BOMB = 39189,
NPC_FROSTMOURNE_TRIGGER = 38584,
NPC_SHADOW_TRAP = 39137,
// Generic
NPC_INVISIBLE_STALKER = 30298
@@ -520,8 +521,7 @@ enum WorldStatesICC
enum AreaIds
{
AREA_ICECROWN_CITADEL = 4812,
AREA_THE_FROZEN_THRONE = 4859
AREA_ICECROWN_CITADEL = 4812
};
class spell_trigger_spell_from_caster : public SpellScriptLoader