diff options
author | Keader <keader.android@gmail.com> | 2016-12-22 17:40:24 -0300 |
---|---|---|
committer | Keader <keader.android@gmail.com> | 2016-12-22 17:40:24 -0300 |
commit | dbd567799f47cea46cdf4f1fb3dc61960fd283ab (patch) | |
tree | c16c02caa9ca23cc293af81033554dbd6fadd57f /src | |
parent | ffbc016d441ac3330a03aef127edf4a9f90176ab (diff) |
Core/Scripts: Fixed Suppresser behavior in Valithria Dreamwalker encounter
Closes #18530
* Fixed range issue
* Fixed weave spawn when Summon Timmer Suppresser(70912) is casted
* Fixed spawn count
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 1 | ||||
-rw-r--r-- | src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp | 63 |
2 files changed, 44 insertions, 20 deletions
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 27c16455e3a..02ff0382f98 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3293,6 +3293,7 @@ void SpellMgr::LoadSpellInfoCorrections() case 70936: // Summon Suppressor (needs target selection script) spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY); spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(); + spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(157); // 90yd break; case 72706: // Achievement Check (Valithria Dreamwalker) case 71357: // Order Whelp diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp index b07de3457bd..676f478904c 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp @@ -140,11 +140,12 @@ enum Events EVENT_EXPLODE = 18, }; -enum Actions +enum Misc { - ACTION_ENTER_COMBAT = 1, - MISSED_PORTALS = 2, - ACTION_DEATH = 3, + ACTION_ENTER_COMBAT = 1, + MISSED_PORTALS = 2, + ACTION_DEATH = 3, + DATA_SUPPRESSERS_COUNT = 4 }; Position const ValithriaSpawnPos = {4210.813f, 2484.443f, 364.9558f, 0.01745329f}; @@ -181,7 +182,7 @@ class DelayedCastEvent : public BasicEvent bool Execute(uint64 /*time*/, uint32 /*diff*/) override { - _trigger->CastSpell(_trigger, _spellId, false, NULL, NULL, _originalCaster); + _trigger->CastSpell(_trigger, _spellId, false, nullptr, nullptr, _originalCaster); if (_despawnTime) _trigger->DespawnOrUnsummon(_despawnTime); return true; @@ -624,6 +625,14 @@ class npc_the_lich_king_controller : public CreatureScript me->setActive(true); } + uint32 GetData(uint32 data) const override + { + if (data == DATA_SUPPRESSERS_COUNT) + return RAID_MODE<uint32>(4, 6, 4, 6); + else + return 0; + } + void JustSummoned(Creature* summon) override { // must not be in dream phase @@ -1091,7 +1100,7 @@ class npc_dream_cloud : public CreatureScript { case EVENT_CHECK_PLAYER: { - Player* player = NULL; + Player* player = nullptr; Trinity::AnyPlayerInObjectRangeCheck check(me, 5.0f); Trinity::PlayerSearcher<Trinity::AnyPlayerInObjectRangeCheck> searcher(me, player, check); me->VisitNearbyWorldObject(7.5f, searcher); @@ -1101,7 +1110,7 @@ class npc_dream_cloud : public CreatureScript case EVENT_EXPLODE: me->GetMotionMaster()->MoveIdle(); // must use originalCaster the same for all clouds to allow stacking - me->CastSpell(me, EMERALD_VIGOR, false, NULL, NULL, _instance->GetGuidData(DATA_VALITHRIA_DREAMWALKER)); + me->CastSpell(me, EMERALD_VIGOR, false, nullptr, nullptr, _instance->GetGuidData(DATA_VALITHRIA_DREAMWALKER)); me->DespawnOrUnsummon(100); break; default: @@ -1229,7 +1238,7 @@ class spell_dreamwalker_summoner : public SpellScriptLoader if (!GetHitUnit()) return; - GetHitUnit()->CastSpell(GetCaster(), GetSpellInfo()->Effects[effIndex].TriggerSpell, true, NULL, NULL, GetCaster()->GetInstanceScript()->GetGuidData(DATA_VALITHRIA_LICH_KING)); + GetHitUnit()->CastSpell(GetCaster(), GetSpellInfo()->Effects[effIndex].TriggerSpell, true, nullptr, nullptr, GetCaster()->GetInstanceScript()->GetGuidData(DATA_VALITHRIA_LICH_KING)); } void Register() override @@ -1254,29 +1263,43 @@ class spell_dreamwalker_summon_suppresser : public SpellScriptLoader { PrepareAuraScript(spell_dreamwalker_summon_suppresser_AuraScript); + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SUMMON_SUPPRESSER)) + return false; + return true; + } + void PeriodicTick(AuraEffect const* /*aurEff*/) { PreventDefaultAction(); - Unit* caster = GetCaster(); - if (!caster) + HandleSummon(GetCaster()); + } + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + HandleSummon(GetCaster()); + } + + void HandleSummon(Unit* caster) + { + if (!caster || !caster->IsAIEnabled) return; std::list<Creature*> summoners; - GetCreatureListWithEntryInGrid(summoners, caster, NPC_WORLD_TRIGGER, 100.0f); - summoners.remove_if(Trinity::UnitAuraCheck(true, SPELL_RECENTLY_SPAWNED)); - Trinity::Containers::RandomResizeList(summoners, 2); + GetCreatureListWithEntryInGrid(summoners, caster, NPC_WORLD_TRIGGER, 90.0f); if (summoners.empty()) return; - for (uint32 i = 0; i < 3; ++i) - caster->CastSpell(summoners.front(), SPELL_SUMMON_SUPPRESSER, true); - for (uint32 i = 0; i < 3; ++i) - caster->CastSpell(summoners.back(), SPELL_SUMMON_SUPPRESSER, true); + uint8 suppresserNumber = caster->GetAI()->GetData(DATA_SUPPRESSERS_COUNT); + for (uint8 i = 0; i < suppresserNumber; ++i) + caster->CastSpell(Trinity::Containers::SelectRandomContainerElement(summoners), SPELL_SUMMON_SUPPRESSER, true); } void Register() override { OnEffectPeriodic += AuraEffectPeriodicFn(spell_dreamwalker_summon_suppresser_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + AfterEffectApply += AuraEffectApplyFn(spell_dreamwalker_summon_suppresser_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); } }; @@ -1308,7 +1331,7 @@ class spell_dreamwalker_summon_suppresser_effect : public SpellScriptLoader if (!GetHitUnit()) return; - GetHitUnit()->CastSpell(GetCaster(), GetSpellInfo()->Effects[effIndex].TriggerSpell, true, NULL, NULL, GetCaster()->GetInstanceScript()->GetGuidData(DATA_VALITHRIA_LICH_KING)); + GetHitUnit()->CastSpell(GetCaster(), GetSpellInfo()->Effects[effIndex].TriggerSpell, true, nullptr, nullptr, GetCaster()->GetInstanceScript()->GetGuidData(DATA_VALITHRIA_LICH_KING)); } void Register() override @@ -1404,7 +1427,7 @@ class spell_dreamwalker_nightmare_cloud : public SpellScriptLoader bool Load() override { _instance = GetOwner()->GetInstanceScript(); - return _instance != NULL; + return _instance != nullptr; } void PeriodicTick(AuraEffect const* /*aurEff*/) @@ -1444,7 +1467,7 @@ class spell_dreamwalker_twisted_nightmares : public SpellScriptLoader // return; if (InstanceScript* instance = GetHitUnit()->GetInstanceScript()) - GetHitUnit()->CastSpell((Unit*)NULL, GetSpellInfo()->Effects[effIndex].TriggerSpell, true, NULL, NULL, instance->GetGuidData(DATA_VALITHRIA_DREAMWALKER)); + GetHitUnit()->CastSpell((Unit*)nullptr, GetSpellInfo()->Effects[effIndex].TriggerSpell, true, nullptr, nullptr, instance->GetGuidData(DATA_VALITHRIA_DREAMWALKER)); } void Register() override |