diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Spells/SpellMgr.cpp | 3 | ||||
-rw-r--r-- | src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp | 53 |
2 files changed, 45 insertions, 11 deletions
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 17d02beb1e2..a2d266dcf9f 100755 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3417,6 +3417,9 @@ void SpellMgr::LoadDbcDataCorrections() spellInfo->rangeIndex = 3; // 20yd spellInfo->EffectRadiusIndex[0] = 20; // 25yd break; + case 72405: // Broken Frostmourne + spellInfo->EffectRadiusIndex[1] = 22; // 200yd + break; default: break; } 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 2bcfe88b349..85ab188f336 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -499,6 +499,16 @@ class boss_the_lich_king : public CreatureScript { _JustDied(); DoCastAOE(SPELL_PLAY_MOVIE, false); + me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); + me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, 0x03); + float x, y, z; + me->GetPosition(x, y, z); + // use larger distance for vmap height search than in most other cases + float ground_Z = me->GetMap()->GetHeight(x, y, z, true, MAX_FALL_DISTANCE); + if (fabs(ground_Z - z) < 0.1f) + return; + + me->GetMotionMaster()->MoveFall(ground_Z); } void EnterCombat(Unit* target) @@ -722,16 +732,7 @@ class boss_the_lich_king : public CreatureScript summons.Summon(summon); if (events.GetPhaseMask() & PHASE_MASK_FROSTMOURNE) { - Position offset; - me->GetPositionOffsetTo(*summon, offset); - offset.m_positionZ += 5.0f; - Position dest = TerenasSpawnHeroic; - dest.RelocateOffset(offset); - summon->NearTeleportTo(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ(), dest.GetOrientation()); - summon->UpdateEntry(NPC_WICKED_SPIRIT); - summon->SetSpeed(MOVE_FLIGHT, 0.5f); - summon->CastSpell(summon, SPELL_VILE_SPIRIT_MOVE_SEARCH, true); - summon->CastSpell((Unit*)NULL, SPELL_VILE_SPIRIT_DAMAGE_SEARCH, true); + TeleportSpirit(summon); return; } @@ -1028,6 +1029,13 @@ class boss_the_lich_king : public CreatureScript spawner->CastSpell(spawner, SPELL_SUMMON_SPIRIT_BOMB_1, true); // summons bombs randomly spawner->CastSpell(spawner, SPELL_SUMMON_SPIRIT_BOMB_2, true); // summons bombs on players } + + for (SummonList::iterator i = summons.begin(); i != summons.end(); ++i) + { + Creature* summon = ObjectAccessor::GetCreature(*me, *i); + if (summon && summon->GetEntry() == NPC_VILE_SPIRIT) + TeleportSpirit(summon); + } } break; case EVENT_OUTRO_TALK_1: @@ -1099,6 +1107,21 @@ class boss_the_lich_king : public CreatureScript private: + void TeleportSpirit(Creature* summon) + { + float dist = me->GetObjectSize() + (15.0f - me->GetObjectSize()) * float(rand_norm()); + float angle = float(rand_norm()) * float(2.0f * M_PI); + Position dest = TerenasSpawnHeroic; + me->MovePosition(dest, dist, angle); + dest.m_positionZ += 15.0f; + summon->UpdateEntry(NPC_WICKED_SPIRIT); + summon->SetReactState(REACT_PASSIVE); + summon->NearTeleportTo(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ(), dest.GetOrientation()); + summon->SetSpeed(MOVE_FLIGHT, 0.5f); + summon->m_Events.KillAllEvents(true); + summon->m_Events.AddEvent(new VileSpiritActivateEvent(summon), summon->m_Events.CalculateTime(1000)); + } + void SendMusicToPlayers(uint32 musicId) const { WorldPacket data(SMSG_PLAY_MUSIC, 4); @@ -1160,6 +1183,8 @@ class npc_tirion_fordring_tft : public CreatureScript void Reset() { _events.Reset(); + if (_instance->GetBossState(DATA_THE_LICH_KING) == DONE) + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); } void MovementInform(uint32 type, uint32 id) @@ -1220,6 +1245,10 @@ class npc_tirion_fordring_tft : public CreatureScript void JustReachedHome() { me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); + + if (_instance->GetBossState(DATA_THE_LICH_KING) == DONE) + return; + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); } @@ -2787,7 +2816,9 @@ class spell_the_lich_king_vile_spirit_damage_target_search : public SpellScriptL // this spell has SPELL_AURA_BLOCK_SPELL_FAMILY so every next cast of this // searcher spell will be blocked - GetCaster()->GetAI()->SetData(DATA_VILE, 1); + if (TempSummon* summon = GetCaster()->ToTempSummon()) + if (Unit* summoner = summon->GetSummoner()) + summoner->GetAI()->SetData(DATA_VILE, 1); GetCaster()->CastSpell((Unit*)NULL, SPELL_SPIRIT_BURST, true); GetCaster()->ToCreature()->DespawnOrUnsummon(3000); GetCaster()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); |