diff options
| author | Ovahlord <dreadkiller@gmx.de> | 2024-03-13 12:25:37 +0100 |
|---|---|---|
| committer | Ovahlord <dreadkiller@gmx.de> | 2024-03-13 12:25:37 +0100 |
| commit | 51daca7cbfab07a8e0e044f70e24d2aa0e31a750 (patch) | |
| tree | 973b2abb9b7afaa447387884613c2e347ed66e2b /src/server/scripts/Spells | |
| parent | 4c5ed71edd7f849b2507203f6b9d832fa75b4464 (diff) | |
Scripts: dropped most post Cataclysm PvE scripts
Diffstat (limited to 'src/server/scripts/Spells')
| -rw-r--r-- | src/server/scripts/Spells/spell_azerite.cpp | 646 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_dh.cpp | 514 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_evoker.cpp | 214 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_monk.cpp | 553 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_script_loader.cpp | 8 |
5 files changed, 0 insertions, 1935 deletions
diff --git a/src/server/scripts/Spells/spell_azerite.cpp b/src/server/scripts/Spells/spell_azerite.cpp deleted file mode 100644 index 760bcaa515a..00000000000 --- a/src/server/scripts/Spells/spell_azerite.cpp +++ /dev/null @@ -1,646 +0,0 @@ -/* - * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "ScriptMgr.h" -#include "AzeritePackets.h" -#include "Containers.h" -#include "Player.h" -#include "Spell.h" -#include "SpellAuraEffects.h" -#include "SpellInfo.h" -#include "SpellMgr.h" -#include "SpellScript.h" - -class spell_azerite_gen_aura_calc_from_2nd_effect_triggered_spell : public AuraScript -{ - bool Validate(SpellInfo const* spellInfo) override - { - return ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } }) && ValidateSpellInfo({ spellInfo->GetEffect(EFFECT_1).TriggerSpell }); - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) - { - if (Unit* caster = GetCaster()) - { - amount = 0; - canBeRecalculated = false; - for (auto const& [_, aurApp] : Trinity::Containers::MapEqualRange(caster->GetAppliedAuras(), GetEffectInfo(EFFECT_1).TriggerSpell)) - if (aurApp->HasEffect(EFFECT_0)) - amount += aurApp->GetBase()->GetEffect(EFFECT_0)->GetAmount(); - } - } - - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_azerite_gen_aura_calc_from_2nd_effect_triggered_spell::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_RATING); - } -}; - -// 270658 - Azerite Fortification -class spell_item_azerite_fortification : public AuraScript -{ - bool CheckProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - Spell const* procSpell = eventInfo.GetProcSpell(); - if (!procSpell) - return false; - - return procSpell->GetSpellInfo()->HasAura(SPELL_AURA_MOD_STUN) - || procSpell->GetSpellInfo()->HasAura(SPELL_AURA_MOD_ROOT) - || procSpell->GetSpellInfo()->HasAura(SPELL_AURA_MOD_ROOT_2) - || procSpell->GetSpellInfo()->HasEffect(SPELL_EFFECT_KNOCK_BACK); - } - - void Register() override - { - DoCheckEffectProc += AuraCheckEffectProcFn(spell_item_azerite_fortification::CheckProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } -}; - -enum StrengthInNumbers -{ - SPELL_STRENGTH_IN_NUMBERS_TRAIT = 271546, - SPELL_STRENGTH_IN_NUMBERS_BUFF = 271550 -}; - -// 271548 - Strength in Numbers -class spell_item_strength_in_numbers : public SpellScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_STRENGTH_IN_NUMBERS_TRAIT, SPELL_STRENGTH_IN_NUMBERS_BUFF }); - } - - void TriggerHealthBuff() - { - if (AuraEffect const* trait = GetCaster()->GetAuraEffect(SPELL_STRENGTH_IN_NUMBERS_TRAIT, EFFECT_0, GetCaster()->GetGUID())) - if (int64 enemies = GetUnitTargetCountForEffect(EFFECT_0)) - GetCaster()->CastSpell(GetCaster(), SPELL_STRENGTH_IN_NUMBERS_BUFF, CastSpellExtraArgs(TRIGGERED_FULL_MASK) - .AddSpellMod(SPELLVALUE_BASE_POINT0, trait->GetAmount()) - .AddSpellMod(SPELLVALUE_AURA_STACK, enemies)); - } - - void Register() override - { - AfterHit += SpellHitFn(spell_item_strength_in_numbers::TriggerHealthBuff); - } -}; - -enum BlessedPortents -{ - SPELL_BLESSED_PORTENTS_TRAIT = 267889, - SPELL_BLESSED_PORTENTS_HEAL = 280052, -}; - -// 271843 - Blessed Portents -class spell_item_blessed_portents : public AuraScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_BLESSED_PORTENTS_TRAIT, SPELL_BLESSED_PORTENTS_HEAL }); - } - - void CheckProc(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& /*absorbAmount*/) - { - if (GetTarget()->HealthBelowPctDamaged(50, dmgInfo.GetDamage())) - { - if (Unit* caster = GetCaster()) - if (AuraEffect const* trait = caster->GetAuraEffect(SPELL_BLESSED_PORTENTS_TRAIT, EFFECT_0, caster->GetGUID())) - caster->CastSpell(GetTarget(), SPELL_BLESSED_PORTENTS_HEAL, CastSpellExtraArgs(TRIGGERED_FULL_MASK) - .AddSpellMod(SPELLVALUE_BASE_POINT0, trait->GetAmount())); - } - else - PreventDefaultAction(); - } - - void Register() override - { - OnEffectAbsorb += AuraEffectAbsorbFn(spell_item_blessed_portents::CheckProc, EFFECT_0); - } -}; - -enum ConcentratedMending -{ - SPELL_CONCENTRATED_MENDING_TRAIT = 267882, -}; - -// 272260 - Concentrated Mending -class spell_item_concentrated_mending : public AuraScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_CONCENTRATED_MENDING_TRAIT }); - } - - void RecalculateHealAmount(AuraEffect* aurEff) - { - if (Unit const* caster = GetCaster()) - if (AuraEffect const* trait = caster->GetAuraEffect(SPELL_CONCENTRATED_MENDING_TRAIT, EFFECT_0, caster->GetGUID())) - aurEff->ChangeAmount(trait->GetAmount() * aurEff->GetTickNumber()); - } - - void Register() override - { - OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_item_concentrated_mending::RecalculateHealAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); - } -}; - -enum BracingChill -{ - SPELL_BRACING_CHILL_TRAIT = 267884, - SPELL_BRACING_CHILL = 272276, - SPELL_BRACING_CHILL_HEAL = 272428, - SPELL_BRACING_CHILL_SEARCH_JUMP_TARGET = 272436, -}; - -// 272276 - Bracing Chill -class spell_item_bracing_chill_proc : public AuraScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_BRACING_CHILL_TRAIT, SPELL_BRACING_CHILL_HEAL, SPELL_BRACING_CHILL_SEARCH_JUMP_TARGET }); - } - - bool CheckHealCaster(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - return GetCasterGUID() == eventInfo.GetActor()->GetGUID(); - } - - void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& procInfo) - { - Unit* caster = procInfo.GetActor(); - if (!caster) - return; - - if (AuraEffect const* trait = caster->GetAuraEffect(SPELL_BRACING_CHILL_TRAIT, EFFECT_0, caster->GetGUID())) - caster->CastSpell(procInfo.GetProcTarget(), SPELL_BRACING_CHILL_HEAL, - CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_BASE_POINT0, trait->GetAmount())); - - if (GetStackAmount() > 1) - caster->CastSpell(nullptr, SPELL_BRACING_CHILL_SEARCH_JUMP_TARGET, - CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_AURA_STACK, GetStackAmount() - 1)); - - Remove(); - } - - void Register() override - { - DoCheckEffectProc += AuraCheckEffectProcFn(spell_item_bracing_chill_proc::CheckHealCaster, EFFECT_0, SPELL_AURA_DUMMY); - AfterEffectProc += AuraEffectProcFn(spell_item_bracing_chill_proc::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } -}; - -// 272436 - Bracing Chill -class spell_item_bracing_chill_search_jump_target : public SpellScript -{ - void FilterTarget(std::list<WorldObject*>& targets) - { - if (targets.empty()) - return; - - std::list<WorldObject*> copy = targets; - Trinity::Containers::RandomResize(copy, [&](WorldObject* target) - { - return target->IsUnit() && !target->ToUnit()->HasAura(SPELL_BRACING_CHILL, GetCaster()->GetGUID()); - }, 1); - - if (!copy.empty()) - { - // found a preferred target, use that - targets.swap(copy); - return; - } - - WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); - targets.clear(); - targets.push_back(target); - } - - void MoveAura(SpellEffIndex /*effIndex*/) - { - GetCaster()->CastSpell(GetHitUnit(), SPELL_BRACING_CHILL, - CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_AURA_STACK, GetSpellValue()->AuraStackAmount)); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_item_bracing_chill_search_jump_target::FilterTarget, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY); - OnEffectHitTarget += SpellEffectFn(spell_item_bracing_chill_search_jump_target::MoveAura, EFFECT_0, SPELL_EFFECT_DUMMY); - } -}; - -// 272837 - Trample the Weak -class spell_item_trample_the_weak : public AuraScript -{ - bool CheckHealthPct(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - return eventInfo.GetActor()->GetHealthPct() > eventInfo.GetActionTarget()->GetHealthPct(); - } - - void Register() override - { - DoCheckEffectProc += AuraCheckEffectProcFn(spell_item_trample_the_weak::CheckHealthPct, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } -}; - -// 272892 - Wracking Brilliance -class spell_item_wracking_brilliance : public AuraScript -{ - enum - { - SPELL_AGONY_SOUL_SHARD_GAIN = 210067 - }; - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_AGONY_SOUL_SHARD_GAIN }); - } - - bool CheckProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); - if (!spellInfo) - return false; - - if (spellInfo->Id != SPELL_AGONY_SOUL_SHARD_GAIN) - return false; - - _canTrigger = !_canTrigger; // every other soul shard gain - return _canTrigger; - } - - void Register() override - { - DoCheckEffectProc += AuraCheckEffectProcFn(spell_item_wracking_brilliance::CheckProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } - - bool _canTrigger = true; -}; - -enum OrbitalPrecision -{ - SPELL_MAGE_FROZEN_ORB = 84714 -}; - -// 275514 - Orbital Precision -class spell_item_orbital_precision : public AuraScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_MAGE_FROZEN_ORB }); - } - - bool CheckFrozenOrbActive(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - return eventInfo.GetActor()->GetAreaTrigger(SPELL_MAGE_FROZEN_ORB) != nullptr; - } - - void Register() override - { - DoCheckEffectProc += AuraCheckEffectProcFn(spell_item_orbital_precision::CheckFrozenOrbActive, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } -}; - -enum BlurOfTalons -{ - SPELL_HUNTER_COORDINATED_ASSAULT = 266779 -}; - -// 277966 - Blur of Talons -class spell_item_blur_of_talons : public AuraScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_HUNTER_COORDINATED_ASSAULT }); - } - - bool CheckCoordinatedAssaultActive(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - return eventInfo.GetActor()->HasAura(SPELL_HUNTER_COORDINATED_ASSAULT, eventInfo.GetActor()->GetGUID()); - } - - void Register() override - { - DoCheckEffectProc += AuraCheckEffectProcFn(spell_item_blur_of_talons::CheckCoordinatedAssaultActive, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } -}; - -// 278519 - Divine Right -class spell_item_divine_right : public AuraScript -{ - bool CheckHealthPct(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - return eventInfo.GetProcTarget()->HasAuraState(AURA_STATE_WOUNDED_20_PERCENT, eventInfo.GetSpellInfo(), eventInfo.GetActor()); - } - - void Register() override - { - DoCheckEffectProc += AuraCheckEffectProcFn(spell_item_divine_right::CheckHealthPct, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } -}; - -// 280409 - Blood Rite -class spell_item_blood_rite : public AuraScript -{ - void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& /*procInfo*/) - { - RefreshDuration(); - } - - void Register() override - { - AfterEffectProc += AuraEffectProcFn(spell_item_blood_rite::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); - } -}; - -// 281843 - Tradewinds -class spell_item_tradewinds : public AuraScript -{ - enum - { - SPELL_TRADEWINDS_ALLY_BUFF = 281844 - }; - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_TRADEWINDS_ALLY_BUFF }); - } - - void HandleRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - if (AuraEffect const* trait = GetTarget()->GetAuraEffect(GetEffectInfo(EFFECT_1).TriggerSpell, EFFECT_1)) - GetTarget()->CastSpell(nullptr, SPELL_TRADEWINDS_ALLY_BUFF, - CastSpellExtraArgs(aurEff).AddSpellMod(SPELLVALUE_BASE_POINT0, trait->GetAmount())); - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_item_tradewinds::HandleRemove, EFFECT_0, SPELL_AURA_MOD_RATING, AURA_EFFECT_HANDLE_REAL); - } -}; - -// 287379 - Bastion of Might -class spell_item_bastion_of_might : public SpellScript -{ - enum - { - SPELL_WARRIOR_IGNORE_PAIN = 190456 - }; - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_WARRIOR_IGNORE_PAIN }); - } - - void TriggerIgnorePain() - { - GetCaster()->CastSpell(GetCaster(), SPELL_WARRIOR_IGNORE_PAIN, GetSpell()); - } - - void Register() override - { - AfterHit += SpellHitFn(spell_item_bastion_of_might::TriggerIgnorePain); - } -}; - -// 287650 - Echoing Blades -class spell_item_echoing_blades : public AuraScript -{ - void PrepareProc(ProcEventInfo& eventInfo) - { - if (eventInfo.GetProcSpell()) - { - if (eventInfo.GetProcSpell()->m_castId != _lastFanOfKnives) - GetEffect(EFFECT_0)->RecalculateAmount(); - - _lastFanOfKnives = eventInfo.GetProcSpell()->m_castId; - } - } - - bool CheckFanOfKnivesCounter(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) - { - return aurEff->GetAmount() > 0; - } - - void ReduceCounter(AuraEffect* aurEff, ProcEventInfo& /*procInfo*/) - { - aurEff->SetAmount(aurEff->GetAmount() - 1); - } - - void Register() override - { - DoPrepareProc += AuraProcFn(spell_item_echoing_blades::PrepareProc); - DoCheckEffectProc += AuraCheckEffectProcFn(spell_item_echoing_blades::CheckFanOfKnivesCounter, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - AfterEffectProc += AuraEffectProcFn(spell_item_echoing_blades::ReduceCounter, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } - - ObjectGuid _lastFanOfKnives; -}; - -// 287653 - Echoing Blades -class spell_item_echoing_blades_damage : public SpellScript -{ - enum - { - SPELL_ECHOING_BLADES_TRAIT = 287649 - }; - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellEffect({ { SPELL_ECHOING_BLADES_TRAIT, EFFECT_2 } }); - } - - void CalculateDamage(Unit const* /*victim*/, int32& damage, int32& /*flatMod*/, float& /*pctMod*/) const - { - if (AuraEffect const* trait = GetCaster()->GetAuraEffect(SPELL_ECHOING_BLADES_TRAIT, EFFECT_2)) - damage = trait->GetAmount() * 2; - } - - void ForceCritical(Unit const* /*victim*/, float& critChance) - { - critChance = 100.0f; - } - - void Register() override - { - CalcDamage += SpellCalcDamageFn(spell_item_echoing_blades_damage::CalculateDamage); - OnCalcCritChance += SpellOnCalcCritChanceFn(spell_item_echoing_blades_damage::ForceCritical); - } -}; - -// 288882 - Hour of Reaping -class spell_item_hour_of_reaping : public AuraScript -{ - enum - { - SPELL_DH_SOUL_BARRIER = 263648 - }; - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DH_SOUL_BARRIER }); - } - - bool CheckProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) - { - return GetStackAmount() == GetAura()->CalcMaxStackAmount(); - } - - void TriggerSoulBarrier(AuraEffect* aurEff, ProcEventInfo& /*procInfo*/) - { - GetTarget()->CastSpell(GetTarget(), SPELL_DH_SOUL_BARRIER, aurEff); - } - - void Register() override - { - DoCheckEffectProc += AuraCheckEffectProcFn(spell_item_hour_of_reaping::CheckProc, EFFECT_0, SPELL_AURA_DUMMY); - AfterEffectProc += AuraEffectProcFn(spell_item_hour_of_reaping::TriggerSoulBarrier, EFFECT_0, SPELL_AURA_DUMMY); - } -}; - -// 304086 - Azerite Fortification -class spell_item_conflict_wearer_on_stun_proc : public AuraScript -{ - bool CheckProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - Spell const* procSpell = eventInfo.GetProcSpell(); - if (!procSpell) - return false; - - return procSpell->GetSpellInfo()->HasAura(SPELL_AURA_MOD_STUN) - || procSpell->GetSpellInfo()->HasAura(SPELL_AURA_MOD_STUN_DISABLE_GRAVITY); - } - - void Register() override - { - DoCheckEffectProc += AuraCheckEffectProcFn(spell_item_conflict_wearer_on_stun_proc::CheckProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } -}; - -// 305723 - Strife (Azerite Essence) -class spell_item_conflict_rank3 : public AuraScript -{ - bool CheckProc(ProcEventInfo& eventInfo) - { - if (eventInfo.GetHitMask() & (PROC_HIT_INTERRUPT | PROC_HIT_DISPEL)) - return true; - - Spell const* procSpell = eventInfo.GetProcSpell(); - if (!procSpell) - return false; - - bool isCrowdControl = procSpell->GetSpellInfo()->HasAura(SPELL_AURA_MOD_CONFUSE) - || procSpell->GetSpellInfo()->HasAura(SPELL_AURA_MOD_FEAR) - || procSpell->GetSpellInfo()->HasAura(SPELL_AURA_MOD_STUN) - || procSpell->GetSpellInfo()->HasAura(SPELL_AURA_MOD_PACIFY) - || procSpell->GetSpellInfo()->HasAura(SPELL_AURA_MOD_ROOT) - || procSpell->GetSpellInfo()->HasAura(SPELL_AURA_MOD_SILENCE) - || procSpell->GetSpellInfo()->HasAura(SPELL_AURA_MOD_PACIFY_SILENCE) - || procSpell->GetSpellInfo()->HasAura(SPELL_AURA_MOD_ROOT_2); - - if (!isCrowdControl) - return false; - - return eventInfo.GetActionTarget()->HasAura([&](Aura const* aura) { return aura->GetCastId() == procSpell->m_castId; }); - } - - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_item_conflict_rank3::CheckProc); - } -}; - -// 277253 - Heart of Azeroth -class spell_item_heart_of_azeroth : public AuraScript -{ - void SetEquippedFlag(AuraEffect const* /*effect*/, AuraEffectHandleModes /*mode*/) - { - SetState(true); - } - - void ClearEquippedFlag(AuraEffect const* /*effect*/, AuraEffectHandleModes /*mode*/) - { - SetState(false); - } - - void SetState(bool equipped) const - { - if (Player* target = GetTarget()->ToPlayer()) - { - target->ApplyAllAzeriteEmpoweredItemMods(equipped); - - WorldPackets::Azerite::PlayerAzeriteItemEquippedStatusChanged statusChanged; - statusChanged.IsHeartEquipped = equipped; - target->SendDirectMessage(statusChanged.Write()); - } - } - - void Register() override - { - OnEffectApply += AuraEffectApplyFn(spell_item_heart_of_azeroth::SetEquippedFlag, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_item_heart_of_azeroth::ClearEquippedFlag, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } -}; - -// 315176 - Grasping Tendrils -class spell_item_corruption_grasping_tendrils : public AuraScript -{ - bool Load() override - { - return GetUnitOwner()->IsPlayer(); - } - - void CalcAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) - { - Player* player = GetUnitOwner()->ToPlayer(); - amount = std::clamp(10.0f + player->GetRatingBonusValue(CR_CORRUPTION) - player->GetRatingBonusValue(CR_CORRUPTION_RESISTANCE), 0.0f, 99.0f); - canBeRecalculated = false; - } - - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_item_corruption_grasping_tendrils::CalcAmount, EFFECT_0, SPELL_AURA_MOD_DECREASE_SPEED); - } -}; - -void AddSC_azerite_item_spell_scripts() -{ - RegisterSpellScript(spell_azerite_gen_aura_calc_from_2nd_effect_triggered_spell); - RegisterSpellScript(spell_item_azerite_fortification); - RegisterSpellScript(spell_item_strength_in_numbers); - RegisterSpellScript(spell_item_blessed_portents); - RegisterSpellScript(spell_item_concentrated_mending); - RegisterSpellScript(spell_item_bracing_chill_proc); - RegisterSpellScript(spell_item_bracing_chill_search_jump_target); - RegisterSpellScript(spell_item_trample_the_weak); - RegisterSpellScript(spell_item_wracking_brilliance); - RegisterSpellScript(spell_item_orbital_precision); - RegisterSpellScript(spell_item_blur_of_talons); - RegisterSpellScript(spell_item_divine_right); - RegisterSpellScript(spell_item_blood_rite); - RegisterSpellScript(spell_item_tradewinds); - RegisterSpellScript(spell_item_bastion_of_might); - RegisterSpellScript(spell_item_echoing_blades); - RegisterSpellScript(spell_item_echoing_blades_damage); - RegisterSpellScript(spell_item_hour_of_reaping); - RegisterSpellScript(spell_item_conflict_wearer_on_stun_proc); - RegisterSpellScript(spell_item_conflict_rank3); - - RegisterSpellScript(spell_item_heart_of_azeroth); - - RegisterSpellScript(spell_item_corruption_grasping_tendrils); -} diff --git a/src/server/scripts/Spells/spell_dh.cpp b/src/server/scripts/Spells/spell_dh.cpp deleted file mode 100644 index 16c6385e8b7..00000000000 --- a/src/server/scripts/Spells/spell_dh.cpp +++ /dev/null @@ -1,514 +0,0 @@ -/* - * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -/* - * Scripts for spells with SPELLFAMILY_DEMONHUNTER and SPELLFAMILY_GENERIC spells used by demon hunter players. - * Ordered alphabetically using scriptname. - * Scriptnames of files in this file should be prefixed with "spell_dh_". - */ - -#include "AreaTrigger.h" -#include "AreaTriggerAI.h" -#include "Player.h" -#include "ScriptMgr.h" -#include "SpellAuraEffects.h" -#include "SpellAuras.h" -#include "SpellHistory.h" -#include "SpellMgr.h" -#include "SpellScript.h" -#include "Unit.h" - -enum DemonHunterSpells -{ - AREATRIGGER_DH_SHATTERED_SOULS_HAVOC = 8352, - AREATRIGGER_DH_SHATTERED_SOULS_HAVOC_DEMON = 11231, - AREATRIGGER_DH_SHATTERED_SOULS_VENGEANCE = 11266, - AREATRIGGER_DH_SHATTERED_SOULS_VENGEANCE_DEMON = 10693, - AREATRIGGER_DH_SOUL_FRAGMENT_HAVOC = 12929, - AREATRIGGER_DH_SOUL_FRAGMENT_VENGEANCE = 10665, - - SPELL_DH_ABYSSAL_STRIKE = 207550, - SPELL_DH_ANNIHILATION = 201427, - SPELL_DH_ANNIHILATION_MH = 227518, - SPELL_DH_ANNIHILATION_OH = 201428, - SPELL_DH_AWAKEN_THE_DEMON_WITHIN_CD = 207128, - SPELL_DH_BLUR = 212800, - SPELL_DH_BLUR_TRIGGER = 198589, - SPELL_DH_BURNING_ALIVE = 207739, - SPELL_DH_BURNING_ALIVE_TARGET_SELECTOR = 207760, - SPELL_DH_CHAOS_NOVA = 179057, - SPELL_DH_CHAOS_STRIKE = 162794, - SPELL_DH_CHAOS_STRIKE_ENERGIZE = 193840, - SPELL_DH_CHAOS_STRIKE_MH = 222031, - SPELL_DH_CHAOS_STRIKE_OH = 199547, - SPELL_DH_CONSUME_SOUL_HAVOC = 228542, - SPELL_DH_CONSUME_SOUL_HAVOC_DEMON = 228556, - SPELL_DH_CONSUME_SOUL_HAVOC_SHATTERED = 228540, - SPELL_DH_CONSUME_SOUL_HEAL = 203794, - SPELL_DH_CONSUME_SOUL_VENGEANCE = 208014, - SPELL_DH_CONSUME_SOUL_VENGEANCE_DEMON = 210050, - SPELL_DH_CONSUME_SOUL_VENGEANCE_SHATTERED = 210047, - SPELL_DH_DARKNESS_ABSORB = 209426, - SPELL_DH_DEMON_BLADES_DMG = 203796, - SPELL_DH_DEMON_SPIKES = 203819, - SPELL_DH_DEMON_SPIKES_TRIGGER = 203720, - SPELL_DH_DEMONIC = 213410, - SPELL_DH_DEMONIC_ORIGINS = 235893, - SPELL_DH_DEMONIC_ORIGINS_BUFF = 235894, - SPELL_DH_DEMONIC_TRAMPLE_DMG = 208645, - SPELL_DH_DEMONIC_TRAMPLE_STUN = 213491, - SPELL_DH_DEMONS_BITE = 162243, - SPELL_DH_EYE_BEAM = 198013, - SPELL_DH_EYE_BEAM_DMG = 198030, - SPELL_DH_EYE_OF_LEOTHERAS_DMG = 206650, - SPELL_DH_FEAST_OF_SOULS = 207697, - SPELL_DH_FEAST_OF_SOULS_PERIODIC_HEAL = 207693, - SPELL_DH_FEED_THE_DEMON = 218612, - SPELL_DH_FEL_BARRAGE = 211053, - SPELL_DH_FEL_BARRAGE_DMG = 211052, - SPELL_DH_FEL_BARRAGE_PROC = 222703, - SPELL_DH_FEL_DEVASTATION = 212084, - SPELL_DH_FEL_DEVASTATION_DMG = 212105, - SPELL_DH_FEL_DEVASTATION_HEAL = 212106, - SPELL_DH_FEL_RUSH = 195072, - SPELL_DH_FEL_RUSH_DMG = 192611, - SPELL_DH_FEL_RUSH_GROUND = 197922, - SPELL_DH_FEL_RUSH_WATER_AIR = 197923, - SPELL_DH_FELBLADE = 232893, - SPELL_DH_FELBLADE_CHARGE = 213241, - SPELL_DH_FELBLADE_DMG = 213243, - SPELL_DH_FELBLADE_PROC = 203557, - SPELL_DH_FELBLADE_PROC_VISUAL = 204497, - SPELL_DH_FELBLADE_PROC1 = 236167, - SPELL_DH_FIERY_BRAND = 204021, - SPELL_DH_FIERY_BRAND_DMG_REDUCTION_DEBUFF = 207744, - SPELL_DH_FIERY_BRAND_DOT = 207771, - SPELL_DH_FIRST_BLOOD = 206416, - SPELL_DH_FLAME_CRASH = 227322, - SPELL_DH_FRAILTY = 224509, - SPELL_DH_GLIDE = 131347, - SPELL_DH_GLIDE_DURATION = 197154, - SPELL_DH_GLIDE_KNOCKBACK = 196353, - SPELL_DH_HAVOC_MASTERY = 185164, - SPELL_DH_ILLIDANS_GRASP = 205630, - SPELL_DH_ILLIDANS_GRASP_DAMAGE = 208618, - SPELL_DH_ILLIDANS_GRASP_JUMP_DEST = 208175, - SPELL_DH_INFERNAL_STRIKE_CAST = 189110, - SPELL_DH_INFERNAL_STRIKE_IMPACT_DAMAGE = 189112, - SPELL_DH_INFERNAL_STRIKE_JUMP = 189111, - SPELL_DH_JAGGED_SPIKES = 205627, - SPELL_DH_JAGGED_SPIKES_DMG = 208790, - SPELL_DH_JAGGED_SPIKES_PROC = 208796, - SPELL_DH_MANA_RIFT_DMG_POWER_BURN = 235904, - SPELL_DH_METAMORPHOSIS = 191428, - SPELL_DH_METAMORPHOSIS_DUMMY = 191427, - SPELL_DH_METAMORPHOSIS_IMPACT_DAMAGE = 200166, - SPELL_DH_METAMORPHOSIS_RESET = 320645, - SPELL_DH_METAMORPHOSIS_TRANSFORM = 162264, - SPELL_DH_METAMORPHOSIS_VENGEANCE_TRANSFORM = 187827, - SPELL_DH_MOMENTUM = 208628, - SPELL_DH_NEMESIS_ABERRATIONS = 208607, - SPELL_DH_NEMESIS_BEASTS = 208608, - SPELL_DH_NEMESIS_CRITTERS = 208609, - SPELL_DH_NEMESIS_DEMONS = 208608, - SPELL_DH_NEMESIS_DRAGONKIN = 208610, - SPELL_DH_NEMESIS_ELEMENTALS = 208611, - SPELL_DH_NEMESIS_GIANTS = 208612, - SPELL_DH_NEMESIS_HUMANOIDS = 208605, - SPELL_DH_NEMESIS_MECHANICALS = 208613, - SPELL_DH_NEMESIS_UNDEAD = 208614, - SPELL_DH_RAIN_FROM_ABOVE = 206803, - SPELL_DH_RAIN_OF_CHAOS = 205628, - SPELL_DH_RAIN_OF_CHAOS_IMPACT = 232538, - SPELL_DH_RAZOR_SPIKES = 210003, - SPELL_DH_SEVER = 235964, - SPELL_DH_SHATTER_SOUL = 209980, - SPELL_DH_SHATTER_SOUL_1 = 209981, - SPELL_DH_SHATTER_SOUL_2 = 210038, - SPELL_DH_SHATTERED_SOUL = 226258, - SPELL_DH_SHATTERED_SOUL_LESSER_SOUL_FRAGMENT_1 = 228533, - SPELL_DH_SHATTERED_SOUL_LESSER_SOUL_FRAGMENT_2 = 237867, - SPELL_DH_SHEAR = 203782, - SPELL_DH_SIGIL_OF_CHAINS_AREA_SELECTOR = 204834, - SPELL_DH_SIGIL_OF_CHAINS_GRIP = 208674, - SPELL_DH_SIGIL_OF_CHAINS_JUMP = 208674, - SPELL_DH_SIGIL_OF_CHAINS_SLOW = 204843, - SPELL_DH_SIGIL_OF_CHAINS_SNARE = 204843, - SPELL_DH_SIGIL_OF_CHAINS_TARGET_SELECT = 204834, - SPELL_DH_SIGIL_OF_CHAINS_VISUAL = 208673, - SPELL_DH_SIGIL_OF_FLAME_AOE = 204598, - SPELL_DH_SIGIL_OF_FLAME_DAMAGE = 204598, - SPELL_DH_SIGIL_OF_FLAME_FLAME_CRASH = 228973, - SPELL_DH_SIGIL_OF_MISERY = 207685, - SPELL_DH_SIGIL_OF_MISERY_AOE = 207685, - SPELL_DH_SIGIL_OF_SILENCE = 204490, - SPELL_DH_SIGIL_OF_SILENCE_AOE = 204490, - SPELL_DH_SOUL_BARRIER = 227225, - SPELL_DH_SOUL_CLEAVE = 228477, - SPELL_DH_SOUL_CLEAVE_DMG = 228478, - SPELL_DH_SOUL_FRAGMENT_COUNTER = 203981, - SPELL_DH_SOUL_FURNACE_DAMAGE_BUFF = 391172, - SPELL_DH_SOUL_RENDING = 204909, - SPELL_DH_SPIRIT_BOMB_DAMAGE = 218677, - SPELL_DH_SPIRIT_BOMB_HEAL = 227255, - SPELL_DH_SPIRIT_BOMB_VISUAL = 218678, - SPELL_DH_THROW_GLAIVE = 185123, - SPELL_DH_UNCONTAINED_FEL = 209261, - SPELL_DH_VENGEFUL_RETREAT = 198813, - SPELL_DH_VENGEFUL_RETREAT_TRIGGER = 198793, -}; - -// 197125 - Chaos Strike -class spell_dh_chaos_strike : public AuraScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DH_CHAOS_STRIKE_ENERGIZE }); - } - - void HandleEffectProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - CastSpellExtraArgs args(TRIGGERED_FULL_MASK); - args.AddSpellMod(SPELLVALUE_BASE_POINT0, aurEff->GetAmount()); - args.SetTriggeringAura(aurEff); - GetTarget()->CastSpell(GetTarget(), SPELL_DH_CHAOS_STRIKE_ENERGIZE, args); - } - - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_dh_chaos_strike::HandleEffectProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } -}; - -// 206416 - First Blood -class spell_dh_first_blood : public AuraScript -{ -public: - ObjectGuid const& GetFirstTarget() const { return _firstTargetGUID; } - void SetFirstTarget(ObjectGuid const& targetGuid) { _firstTargetGUID = targetGuid; } - -private: - void Register() override - { - } - -private: - ObjectGuid _firstTargetGUID; -}; - -// 188499 - Blade Dance -// 210152 - Death Sweep -class spell_dh_blade_dance : public SpellScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DH_FIRST_BLOOD }); - } - - void DecideFirstTarget(std::list<WorldObject*>& targetList) - { - if (targetList.empty()) - return; - - Aura* aura = GetCaster()->GetAura(SPELL_DH_FIRST_BLOOD); - if (!aura) - return; - - ObjectGuid firstTargetGUID = ObjectGuid::Empty; - ObjectGuid selectedTarget = GetCaster()->GetTarget(); - - // Prefer the selected target if he is one of the enemies - if (targetList.size() > 1 && !selectedTarget.IsEmpty()) - { - auto it = std::find_if(targetList.begin(), targetList.end(), [selectedTarget](WorldObject* object) - { - return object->GetGUID() == selectedTarget; - }); - if (it != targetList.end()) - firstTargetGUID = (*it)->GetGUID(); - } - - if (firstTargetGUID.IsEmpty()) - firstTargetGUID = targetList.front()->GetGUID(); - - if (spell_dh_first_blood* script = aura->GetScript<spell_dh_first_blood>()) - script->SetFirstTarget(firstTargetGUID); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dh_blade_dance::DecideFirstTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } -}; - -// 199552 - Blade Dance -// 200685 - Blade Dance -// 210153 - Death Sweep -// 210155 - Death Sweep -class spell_dh_blade_dance_damage : public SpellScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DH_FIRST_BLOOD }); - } - - void HandleHitTarget() - { - int32 damage = GetHitDamage(); - - if (AuraEffect* aurEff = GetCaster()->GetAuraEffect(SPELL_DH_FIRST_BLOOD, EFFECT_0)) - if (spell_dh_first_blood* script = aurEff->GetBase()->GetScript<spell_dh_first_blood>()) - if (GetHitUnit()->GetGUID() == script->GetFirstTarget()) - AddPct(damage, aurEff->GetAmount()); - - SetHitDamage(damage); - } - - void Register() override - { - OnHit += SpellHitFn(spell_dh_blade_dance_damage::HandleHitTarget); - } -}; - -// 204596 - Sigil of Flame -// 207684 - Sigil of Misery -// 202137 - Sigil of Silence -template<uint32 TriggerSpellId> -class areatrigger_dh_generic_sigil : public AreaTriggerEntityScript -{ -public: - areatrigger_dh_generic_sigil(char const* script) : AreaTriggerEntityScript(script) { } - - template<uint32 Trigger> - struct areatrigger_dh_generic_sigilAI : AreaTriggerAI - { - areatrigger_dh_generic_sigilAI(AreaTrigger* at) : AreaTriggerAI(at) { } - - void OnRemove() override - { - if (Unit* caster = at->GetCaster()) - caster->CastSpell(at->GetPosition(), Trigger); - } - }; - - AreaTriggerAI* GetAI(AreaTrigger* at) const override - { - return new areatrigger_dh_generic_sigilAI<TriggerSpellId>(at); - } -}; - -// 208673 - Sigil of Chains -class spell_dh_sigil_of_chains : public SpellScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DH_SIGIL_OF_CHAINS_SLOW, SPELL_DH_SIGIL_OF_CHAINS_GRIP }); - } - - void HandleEffectHitTarget(SpellEffIndex /*effIndex*/) - { - if (WorldLocation const* loc = GetExplTargetDest()) - { - GetCaster()->CastSpell(GetHitUnit(), SPELL_DH_SIGIL_OF_CHAINS_SLOW, true); - GetHitUnit()->CastSpell(loc->GetPosition(), SPELL_DH_SIGIL_OF_CHAINS_GRIP, true); - } - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_dh_sigil_of_chains::HandleEffectHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY); - } -}; - -// 202138 - Sigil of Chains -struct areatrigger_dh_sigil_of_chains : AreaTriggerAI -{ - areatrigger_dh_sigil_of_chains(AreaTrigger* at) : AreaTriggerAI(at) { } - - void OnRemove() override - { - if (Unit* caster = at->GetCaster()) - { - caster->CastSpell(at->GetPosition(), SPELL_DH_SIGIL_OF_CHAINS_VISUAL); - caster->CastSpell(at->GetPosition(), SPELL_DH_SIGIL_OF_CHAINS_TARGET_SELECT); - } - } -}; - -// 131347 - Glide -class spell_dh_glide : public SpellScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DH_GLIDE_KNOCKBACK, SPELL_DH_GLIDE_DURATION, SPELL_DH_VENGEFUL_RETREAT_TRIGGER, SPELL_DH_FEL_RUSH }); - } - - SpellCastResult CheckCast() - { - Unit* caster = GetCaster(); - if (caster->IsMounted() || caster->GetVehicleBase()) - return SPELL_FAILED_DONT_REPORT; - - if (!caster->IsFalling()) - return SPELL_FAILED_NOT_ON_GROUND; - - return SPELL_CAST_OK; - } - - void HandleCast() - { - Player* caster = GetCaster()->ToPlayer(); - if (!caster) - return; - - caster->CastSpell(caster, SPELL_DH_GLIDE_KNOCKBACK, true); - caster->CastSpell(caster, SPELL_DH_GLIDE_DURATION, true); - - caster->GetSpellHistory()->StartCooldown(sSpellMgr->AssertSpellInfo(SPELL_DH_VENGEFUL_RETREAT_TRIGGER, GetCastDifficulty()), 0, nullptr, false, 250ms); - caster->GetSpellHistory()->StartCooldown(sSpellMgr->AssertSpellInfo(SPELL_DH_FEL_RUSH, GetCastDifficulty()), 0, nullptr, false, 250ms); - } - - void Register() override - { - OnCheckCast += SpellCheckCastFn(spell_dh_glide::CheckCast); - BeforeCast += SpellCastFn(spell_dh_glide::HandleCast); - } -}; - -// 131347 - Glide -class spell_dh_glide_AuraScript : public AuraScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DH_GLIDE_DURATION }); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->RemoveAura(SPELL_DH_GLIDE_DURATION); - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_dh_glide_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_FEATHER_FALL, AURA_EFFECT_HANDLE_REAL); - } -}; - -// 197154 - Glide -class spell_dh_glide_timer : public AuraScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DH_GLIDE }); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->RemoveAura(SPELL_DH_GLIDE); - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_dh_glide_timer::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } -}; - -// 391166 - Soul Furnace -class spell_dh_soul_furnace : public AuraScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DH_SOUL_FURNACE_DAMAGE_BUFF }); - } - - void CalculateSpellMod(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetStackAmount() == GetAura()->CalcMaxStackAmount()) - { - GetTarget()->CastSpell(GetTarget(), SPELL_DH_SOUL_FURNACE_DAMAGE_BUFF, true); - Remove(); - } - } - - void Register() override - { - AfterEffectApply += AuraEffectApplyFn(spell_dh_soul_furnace::CalculateSpellMod, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - } -}; - -// 339424 - Soul Furnace -class spell_dh_soul_furnace_conduit : public AuraScript -{ - void CalculateSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod) - { - if (aurEff->GetAmount() == 10) - { - if (!spellMod) - { - spellMod = new SpellModifierByClassMask(GetAura()); - spellMod->op = SpellModOp::HealingAndDamage; - spellMod->type = SPELLMOD_PCT; - spellMod->spellId = GetId(); - static_cast<SpellModifierByClassMask*>(spellMod)->mask = flag128(0x80000000); - static_cast<SpellModifierByClassMask*>(spellMod)->value = GetEffect(EFFECT_1)->GetAmount() + 1; - } - } - } - - void Register() override - { - DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_dh_soul_furnace_conduit::CalculateSpellMod, EFFECT_0, SPELL_AURA_DUMMY); - } -}; - -void AddSC_demon_hunter_spell_scripts() -{ - RegisterSpellScript(spell_dh_chaos_strike); - - new areatrigger_dh_generic_sigil<SPELL_DH_SIGIL_OF_SILENCE_AOE>("areatrigger_dh_sigil_of_silence"); - new areatrigger_dh_generic_sigil<SPELL_DH_SIGIL_OF_MISERY_AOE>("areatrigger_dh_sigil_of_misery"); - new areatrigger_dh_generic_sigil<SPELL_DH_SIGIL_OF_FLAME_AOE>("areatrigger_dh_sigil_of_flame"); - RegisterAreaTriggerAI(areatrigger_dh_sigil_of_chains); - RegisterSpellScript(spell_dh_sigil_of_chains); - - // Havoc - - /* Spells & Auras */ - - /* Auras */ - - RegisterSpellScript(spell_dh_first_blood); - - /* AreaTrigger */ - - /* Spells */ - - RegisterSpellScript(spell_dh_blade_dance); - RegisterSpellScript(spell_dh_blade_dance_damage); - - // Vengeance - RegisterSpellScript(spell_dh_soul_furnace); - - // Vengeance & Havoc - - RegisterSpellAndAuraScriptPair(spell_dh_glide, spell_dh_glide_AuraScript); - RegisterSpellScript(spell_dh_glide_timer); - - // Soulbind conduits - RegisterSpellScript(spell_dh_soul_furnace_conduit); -} diff --git a/src/server/scripts/Spells/spell_evoker.cpp b/src/server/scripts/Spells/spell_evoker.cpp deleted file mode 100644 index 8004f4115e7..00000000000 --- a/src/server/scripts/Spells/spell_evoker.cpp +++ /dev/null @@ -1,214 +0,0 @@ -/* - * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -/* - * Scripts for spells with SPELLFAMILY_EVOKER and SPELLFAMILY_GENERIC spells used by evoker players. - * Ordered alphabetically using scriptname. - * Scriptnames of files in this file should be prefixed with "spell_evo_". - */ - -#include "Containers.h" -#include "Player.h" -#include "ScriptMgr.h" -#include "Spell.h" -#include "SpellAuraEffects.h" -#include "SpellHistory.h" -#include "SpellMgr.h" -#include "SpellScript.h" - -enum EvokerSpells -{ - SPELL_EVOKER_ENERGIZING_FLAME = 400006, - SPELL_EVOKER_GLIDE_KNOCKBACK = 358736, - SPELL_EVOKER_HOVER = 358267, - SPELL_EVOKER_LIVING_FLAME = 361469, - SPELL_EVOKER_LIVING_FLAME_DAMAGE = 361500, - SPELL_EVOKER_LIVING_FLAME_HEAL = 361509, - SPELL_EVOKER_PERMEATING_CHILL_TALENT = 370897, - SPELL_EVOKER_PYRE_DAMAGE = 357212, - SPELL_EVOKER_SOAR_RACIAL = 369536 -}; - -enum EvokerSpellLabels -{ - SPELL_LABEL_EVOKER_BLUE = 1465, -}; - -// 362969 - Azure Strike (blue) -class spell_evo_azure_strike : public SpellScript -{ - void FilterTargets(std::list<WorldObject*>& targets) - { - targets.remove(GetExplTargetUnit()); - Trinity::Containers::RandomResize(targets, GetEffectInfo(EFFECT_0).CalcValue(GetCaster()) - 1); - targets.push_back(GetExplTargetUnit()); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_evo_azure_strike::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENEMY); - } -}; - -// 370455 - Charged Blast -class spell_evo_charged_blast : public AuraScript -{ - bool CheckProc(ProcEventInfo& procInfo) - { - return procInfo.GetSpellInfo() && procInfo.GetSpellInfo()->HasLabel(SPELL_LABEL_EVOKER_BLUE); - } - - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_evo_charged_blast::CheckProc); - } -}; - -// 358733 - Glide (Racial) -class spell_evo_glide : public SpellScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_EVOKER_GLIDE_KNOCKBACK, SPELL_EVOKER_HOVER, SPELL_EVOKER_SOAR_RACIAL }); - } - - SpellCastResult CheckCast() - { - Unit* caster = GetCaster(); - - if (!caster->IsFalling()) - return SPELL_FAILED_NOT_ON_GROUND; - - return SPELL_CAST_OK; - } - - void HandleCast() - { - Player* caster = GetCaster()->ToPlayer(); - if (!caster) - return; - - caster->CastSpell(caster, SPELL_EVOKER_GLIDE_KNOCKBACK, true); - - caster->GetSpellHistory()->StartCooldown(sSpellMgr->AssertSpellInfo(SPELL_EVOKER_HOVER, GetCastDifficulty()), 0, nullptr, false, 250ms); - caster->GetSpellHistory()->StartCooldown(sSpellMgr->AssertSpellInfo(SPELL_EVOKER_SOAR_RACIAL, GetCastDifficulty()), 0, nullptr, false, 250ms); - } - - void Register() override - { - OnCheckCast += SpellCheckCastFn(spell_evo_glide::CheckCast); - OnCast += SpellCastFn(spell_evo_glide::HandleCast); - } -}; - -// 361469 - Living Flame (Red) -class spell_evo_living_flame : public SpellScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo ({ SPELL_EVOKER_LIVING_FLAME_DAMAGE, SPELL_EVOKER_LIVING_FLAME_HEAL, SPELL_EVOKER_ENERGIZING_FLAME }); - } - - void HandleHitTarget(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - Unit* hitUnit = GetHitUnit(); - if (caster->IsFriendlyTo(hitUnit)) - caster->CastSpell(hitUnit, SPELL_EVOKER_LIVING_FLAME_HEAL, true); - else - caster->CastSpell(hitUnit, SPELL_EVOKER_LIVING_FLAME_DAMAGE, true); - } - - void HandleLaunchTarget(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (caster->IsFriendlyTo(GetHitUnit())) - return; - - if (AuraEffect* auraEffect = caster->GetAuraEffect(SPELL_EVOKER_ENERGIZING_FLAME, EFFECT_0)) - { - int32 manaCost = GetSpell()->GetPowerTypeCostAmount(POWER_MANA).value_or(0); - if (manaCost != 0) - GetCaster()->ModifyPower(POWER_MANA, CalculatePct(manaCost, auraEffect->GetAmount())); - } - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_evo_living_flame::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY); - OnEffectLaunchTarget += SpellEffectFn(spell_evo_living_flame::HandleLaunchTarget, EFFECT_0, SPELL_EFFECT_DUMMY); - } -}; - -// 381773 - Permeating Chill -class spell_evo_permeating_chill : public AuraScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_EVOKER_PERMEATING_CHILL_TALENT }); - } - - bool CheckProc(ProcEventInfo& procInfo) - { - SpellInfo const* spellInfo = procInfo.GetSpellInfo(); - if (!spellInfo) - return false; - - if (!spellInfo->HasLabel(SPELL_LABEL_EVOKER_BLUE)) - return false; - - if (!procInfo.GetActor()->HasAura(SPELL_EVOKER_PERMEATING_CHILL_TALENT)) - if (!spellInfo->IsAffected(SPELLFAMILY_EVOKER, { 0x40, 0, 0, 0 })) // disintegrate - return false; - - return true; - } - - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_evo_permeating_chill::CheckProc); - } -}; - -// 393568 - Pyre -class spell_evo_pyre : public SpellScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo ({ SPELL_EVOKER_PYRE_DAMAGE }); - } - - void HandleDamage(SpellEffIndex /*effIndex*/) - { - GetCaster()->CastSpell(GetHitUnit()->GetPosition(), SPELL_EVOKER_PYRE_DAMAGE, true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_evo_pyre::HandleDamage, EFFECT_0, SPELL_EFFECT_DUMMY); - } -}; - -void AddSC_evoker_spell_scripts() -{ - RegisterSpellScript(spell_evo_azure_strike); - RegisterSpellScript(spell_evo_charged_blast); - RegisterSpellScript(spell_evo_glide); - RegisterSpellScript(spell_evo_living_flame); - RegisterSpellScript(spell_evo_permeating_chill); - RegisterSpellScript(spell_evo_pyre); -} diff --git a/src/server/scripts/Spells/spell_monk.cpp b/src/server/scripts/Spells/spell_monk.cpp deleted file mode 100644 index 6e66c820454..00000000000 --- a/src/server/scripts/Spells/spell_monk.cpp +++ /dev/null @@ -1,553 +0,0 @@ -/* - * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -/* - * Scripts for spells with SPELLFAMILY_MONK and SPELLFAMILY_GENERIC spells used by monk players. - * Scriptnames of files in this file should be prefixed with "spell_monk_". - */ - -#include "ScriptMgr.h" -#include "DB2Stores.h" -#include "Player.h" -#include "Spell.h" -#include "SpellAuraEffects.h" -#include "SpellInfo.h" -#include "SpellMgr.h" -#include "SpellScript.h" - -enum MonkSpells -{ - SPELL_MONK_CALMING_COALESCENCE = 388220, - SPELL_MONK_CRACKLING_JADE_LIGHTNING_CHANNEL = 117952, - SPELL_MONK_CRACKLING_JADE_LIGHTNING_CHI_PROC = 123333, - SPELL_MONK_CRACKLING_JADE_LIGHTNING_KNOCKBACK = 117962, - SPELL_MONK_CRACKLING_JADE_LIGHTNING_KNOCKBACK_CD = 117953, - SPELL_MONK_POWER_STRIKE_PROC = 129914, - SPELL_MONK_POWER_STRIKE_ENERGIZE = 121283, - SPELL_MONK_PROVOKE_SINGLE_TARGET = 116189, - SPELL_MONK_PROVOKE_AOE = 118635, - SPELL_MONK_NO_FEATHER_FALL = 79636, - SPELL_MONK_OPEN_PALM_STRIKES_TALENT = 392970, - SPELL_MONK_ROLL_BACKWARD = 109131, - SPELL_MONK_ROLL_FORWARD = 107427, - SPELL_MONK_SOOTHING_MIST = 115175, - SPELL_MONK_STANCE_OF_THE_SPIRITED_CRANE = 154436, - SPELL_MONK_STAGGER_DAMAGE_AURA = 124255, - SPELL_MONK_STAGGER_HEAVY = 124273, - SPELL_MONK_STAGGER_LIGHT = 124275, - SPELL_MONK_STAGGER_MODERATE = 124274, - SPELL_MONK_SURGING_MIST_HEAL = 116995, -}; - -// 117952 - Crackling Jade Lightning -class spell_monk_crackling_jade_lightning : public AuraScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( - { - SPELL_MONK_STANCE_OF_THE_SPIRITED_CRANE, - SPELL_MONK_CRACKLING_JADE_LIGHTNING_CHI_PROC - }); - } - - void OnTick(AuraEffect const* /*aurEff*/) - { - if (Unit* caster = GetCaster()) - if (caster->HasAura(SPELL_MONK_STANCE_OF_THE_SPIRITED_CRANE)) - caster->CastSpell(caster, SPELL_MONK_CRACKLING_JADE_LIGHTNING_CHI_PROC, TRIGGERED_FULL_MASK); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_monk_crackling_jade_lightning::OnTick, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } -}; - -// 117959 - Crackling Jade Lightning -class spell_monk_crackling_jade_lightning_knockback_proc_aura : public AuraScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( - { - SPELL_MONK_CRACKLING_JADE_LIGHTNING_KNOCKBACK, - SPELL_MONK_CRACKLING_JADE_LIGHTNING_KNOCKBACK_CD - }); - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - if (GetTarget()->HasAura(SPELL_MONK_CRACKLING_JADE_LIGHTNING_KNOCKBACK_CD)) - return false; - - if (eventInfo.GetActor()->HasAura(SPELL_MONK_CRACKLING_JADE_LIGHTNING_CHANNEL, GetTarget()->GetGUID())) - return false; - - Spell* currentChanneledSpell = GetTarget()->GetCurrentSpell(CURRENT_CHANNELED_SPELL); - if (!currentChanneledSpell || currentChanneledSpell->GetSpellInfo()->Id != SPELL_MONK_CRACKLING_JADE_LIGHTNING_CHANNEL) - return false; - - return true; - } - - void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo) - { - GetTarget()->CastSpell(eventInfo.GetActor(), SPELL_MONK_CRACKLING_JADE_LIGHTNING_KNOCKBACK, TRIGGERED_FULL_MASK); - GetTarget()->CastSpell(GetTarget(), SPELL_MONK_CRACKLING_JADE_LIGHTNING_KNOCKBACK_CD, TRIGGERED_FULL_MASK); - } - - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_monk_crackling_jade_lightning_knockback_proc_aura::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_monk_crackling_jade_lightning_knockback_proc_aura::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } -}; - -// 116849 - Life Cocoon -class spell_monk_life_cocoon : public SpellScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_MONK_CALMING_COALESCENCE }); - } - - void CalculateAbsorb(SpellEffIndex /*effIndex*/) - { - int32 absorb = GetCaster()->CountPctFromMaxHealth(GetEffectValue()); - if (Player* player = GetCaster()->ToPlayer()) - AddPct(absorb, player->GetRatingBonusValue(CR_VERSATILITY_HEALING_DONE)); - - if (AuraEffect* calmingCoalescence = GetCaster()->GetAuraEffect(SPELL_MONK_CALMING_COALESCENCE, EFFECT_0, GetCaster()->GetGUID())) - { - AddPct(absorb, calmingCoalescence->GetAmount()); - calmingCoalescence->GetBase()->Remove(); - } - - GetSpell()->SetSpellValue(SPELLVALUE_BASE_POINT0, absorb); - } - - void Register() override - { - OnEffectLaunch += SpellEffectFn(spell_monk_life_cocoon::CalculateAbsorb, EFFECT_2, SPELL_EFFECT_DUMMY); - } -}; - -// 392972 - Open Palm Strikes -class spell_monk_open_palm_strikes : public AuraScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellEffect({ { SPELL_MONK_OPEN_PALM_STRIKES_TALENT, EFFECT_1} }); - } - - bool CheckProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*procInfo*/) - { - AuraEffect const* talent = GetTarget()->GetAuraEffect(SPELL_MONK_OPEN_PALM_STRIKES_TALENT, EFFECT_1); - return talent && roll_chance_i(talent->GetAmount()); - } - - void Register() override - { - DoCheckEffectProc += AuraCheckEffectProcFn(spell_monk_open_palm_strikes::CheckProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } -}; - -// 121817 - Power Strike -class spell_monk_power_strike_periodic : public AuraScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_MONK_POWER_STRIKE_PROC }); - } - - void HandlePeriodic(AuraEffect const* /*aurEff*/) - { - GetTarget()->CastSpell(GetTarget(), SPELL_MONK_POWER_STRIKE_PROC, true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_monk_power_strike_periodic::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } -}; - -// 129914 - Power Strike Proc -class spell_monk_power_strike_proc : public AuraScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_MONK_POWER_STRIKE_ENERGIZE }); - } - - void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& /*eventInfo*/) - { - GetTarget()->CastSpell(GetTarget(), SPELL_MONK_POWER_STRIKE_ENERGIZE, true); - } - - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_monk_power_strike_proc::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } -}; - -// 115546 - Provoke -class spell_monk_provoke : public SpellScript -{ - static uint32 const BlackOxStatusEntry = 61146; - - bool Validate(SpellInfo const* spellInfo) override - { - if (!(spellInfo->GetExplicitTargetMask() & TARGET_FLAG_UNIT_MASK)) // ensure GetExplTargetUnit() will return something meaningful during CheckCast - return false; - return ValidateSpellInfo( - { - SPELL_MONK_PROVOKE_SINGLE_TARGET, - SPELL_MONK_PROVOKE_AOE - }); - } - - SpellCastResult CheckExplicitTarget() - { - if (GetExplTargetUnit()->GetEntry() != BlackOxStatusEntry) - { - SpellInfo const* singleTarget = sSpellMgr->AssertSpellInfo(SPELL_MONK_PROVOKE_SINGLE_TARGET, GetCastDifficulty()); - SpellCastResult singleTargetExplicitResult = singleTarget->CheckExplicitTarget(GetCaster(), GetExplTargetUnit()); - if (singleTargetExplicitResult != SPELL_CAST_OK) - return singleTargetExplicitResult; - } - else if (GetExplTargetUnit()->GetOwnerGUID() != GetCaster()->GetGUID()) - return SPELL_FAILED_BAD_TARGETS; - - return SPELL_CAST_OK; - } - - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (GetHitUnit()->GetEntry() != BlackOxStatusEntry) - GetCaster()->CastSpell(GetHitUnit(), SPELL_MONK_PROVOKE_SINGLE_TARGET, true); - else - GetCaster()->CastSpell(GetHitUnit(), SPELL_MONK_PROVOKE_AOE, true); - } - - void Register() override - { - OnCheckCast += SpellCheckCastFn(spell_monk_provoke::CheckExplicitTarget); - OnEffectHitTarget += SpellEffectFn(spell_monk_provoke::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } -}; - -// 109132 - Roll -class spell_monk_roll : public SpellScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_MONK_ROLL_BACKWARD, SPELL_MONK_ROLL_FORWARD, SPELL_MONK_NO_FEATHER_FALL }); - } - - SpellCastResult CheckCast() - { - if (GetCaster()->HasUnitState(UNIT_STATE_ROOT)) - return SPELL_FAILED_ROOTED; - return SPELL_CAST_OK; - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - GetCaster()->CastSpell(GetCaster(), GetCaster()->HasUnitMovementFlag(MOVEMENTFLAG_BACKWARD) ? SPELL_MONK_ROLL_BACKWARD : SPELL_MONK_ROLL_FORWARD, - TRIGGERED_IGNORE_CAST_IN_PROGRESS); - GetCaster()->CastSpell(GetCaster(), SPELL_MONK_NO_FEATHER_FALL, true); - } - - void Register() override - { - OnCheckCast += SpellCheckCastFn(spell_monk_roll::CheckCast); - OnEffectHitTarget += SpellEffectFn(spell_monk_roll::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } -}; - -// 107427 - Roll -// 109131 - Roll (backward) -class spell_monk_roll_aura : public AuraScript -{ - void CalcMovementAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - amount += 100; - } - - void CalcImmunityAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - amount -= 100; - } - - void ChangeRunBackSpeed(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->SetSpeed(MOVE_RUN_BACK, GetTarget()->GetSpeed(MOVE_RUN)); - } - - void RestoreRunBackSpeed(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->UpdateSpeed(MOVE_RUN_BACK); - } - - void Register() override - { - // Values need manual correction - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_monk_roll_aura::CalcMovementAmount, EFFECT_0, SPELL_AURA_MOD_SPEED_NO_CONTROL); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_monk_roll_aura::CalcMovementAmount, EFFECT_2, SPELL_AURA_MOD_MINIMUM_SPEED); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_monk_roll_aura::CalcImmunityAmount, EFFECT_5, SPELL_AURA_MECHANIC_IMMUNITY); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_monk_roll_aura::CalcImmunityAmount, EFFECT_6, SPELL_AURA_MECHANIC_IMMUNITY); - - // This is a special aura that sets backward run speed equal to forward speed - AfterEffectApply += AuraEffectApplyFn(spell_monk_roll_aura::ChangeRunBackSpeed, EFFECT_4, SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectApplyFn(spell_monk_roll_aura::RestoreRunBackSpeed, EFFECT_4, SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED, AURA_EFFECT_HANDLE_REAL); - } -}; - -// Utility for stagger scripts -Aura* FindExistingStaggerEffect(Unit* unit) -{ - if (Aura* auraLight = unit->GetAura(SPELL_MONK_STAGGER_LIGHT)) - return auraLight; - - if (Aura* auraModerate = unit->GetAura(SPELL_MONK_STAGGER_MODERATE)) - return auraModerate; - - if (Aura* auraHeavy = unit->GetAura(SPELL_MONK_STAGGER_HEAVY)) - return auraHeavy; - - return nullptr; -} - -static constexpr SpellEffIndex AuraStaggerEffectTick = EFFECT_0; -static constexpr SpellEffIndex AuraStaggerEffectTotal = EFFECT_1; - -// 115069 - Stagger -class spell_monk_stagger : public AuraScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_MONK_STAGGER_LIGHT, SPELL_MONK_STAGGER_MODERATE, SPELL_MONK_STAGGER_HEAVY }); - } - - void AbsorbNormal(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& /*absorbAmount*/) - { - Absorb(dmgInfo, 1.0f); - } - - void AbsorbMagic(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& /*absorbAmount*/) - { - AuraEffect const* effect = GetEffect(EFFECT_4); - if (!effect) - return; - - Absorb(dmgInfo, float(effect->GetAmount()) / 100.0f); - } - - void Absorb(DamageInfo& dmgInfo, float multiplier) - { - // Prevent default action (which would remove the aura) - PreventDefaultAction(); - - // make sure damage doesn't come from stagger damage spell SPELL_MONK_STAGGER_DAMAGE_AURA - if (SpellInfo const* dmgSpellInfo = dmgInfo.GetSpellInfo()) - if (dmgSpellInfo->Id == SPELL_MONK_STAGGER_DAMAGE_AURA) - return; - - AuraEffect const* effect = GetEffect(AuraStaggerEffectTick); - if (!effect) - return; - - Unit* target = GetTarget(); - float agility = target->GetStat(STAT_AGILITY); - float base = CalculatePct(agility, float(effect->GetAmount())); - float K = sDB2Manager.EvaluateExpectedStat(ExpectedStatType::ArmorConstant, target->GetLevel(), -2, 0, Classes(target->GetClass()), 0); - - float newAmount = (base / (base + K)); - newAmount *= multiplier; - - // Absorb X percentage of the damage - float absorbAmount = float(dmgInfo.GetDamage()) * newAmount; - if (absorbAmount > 0) - { - dmgInfo.AbsorbDamage(absorbAmount); - - // Cast stagger and make it tick on each tick - AddAndRefreshStagger(absorbAmount); - } - } - - void Register() override - { - OnEffectAbsorb += AuraEffectAbsorbFn(spell_monk_stagger::AbsorbNormal, EFFECT_1); - OnEffectAbsorb += AuraEffectAbsorbFn(spell_monk_stagger::AbsorbMagic, EFFECT_2); - } - -private: - void AddAndRefreshStagger(float amount) - { - Unit* target = GetTarget(); - if (Aura* auraStagger = FindExistingStaggerEffect(target)) - { - AuraEffect* effStaggerRemaining = auraStagger->GetEffect(AuraStaggerEffectTotal); - if (!effStaggerRemaining) - return; - - float newAmount = effStaggerRemaining->GetAmount() + amount; - uint32 spellId = GetStaggerSpellId(target, newAmount); - if (spellId == effStaggerRemaining->GetSpellInfo()->Id) - { - auraStagger->RefreshDuration(); - effStaggerRemaining->ChangeAmount(newAmount, false, true /* reapply */); - } - else - { - // amount changed the stagger type so we need to change the stagger amount (e.g. from medium to light) - GetTarget()->RemoveAura(auraStagger); - AddNewStagger(target, spellId, newAmount); - } - } - else - AddNewStagger(target, GetStaggerSpellId(target, amount), amount); - } - - uint32 GetStaggerSpellId(Unit* unit, float amount) - { - const float StaggerHeavy = 0.6f; - const float StaggerModerate = 0.3f; - - float staggerPct = amount / float(unit->GetMaxHealth()); - return (staggerPct >= StaggerHeavy) ? SPELL_MONK_STAGGER_HEAVY : - (staggerPct >= StaggerModerate) ? SPELL_MONK_STAGGER_MODERATE : - SPELL_MONK_STAGGER_LIGHT; - } - - void AddNewStagger(Unit* unit, uint32 staggerSpellId, float staggerAmount) - { - // We only set the total stagger amount. The amount per tick will be set by the stagger spell script - unit->CastSpell(unit, staggerSpellId, CastSpellExtraArgs(SPELLVALUE_BASE_POINT1, staggerAmount).SetTriggerFlags(TRIGGERED_FULL_MASK)); - } -}; - -// 124255 - Stagger - SPELL_MONK_STAGGER_DAMAGE_AURA -class spell_monk_stagger_damage_aura : public AuraScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_MONK_STAGGER_LIGHT, SPELL_MONK_STAGGER_MODERATE, SPELL_MONK_STAGGER_HEAVY }); - } - - void OnPeriodicDamage(AuraEffect const* aurEff) - { - // Update our light/medium/heavy stagger with the correct stagger amount left - if (Aura* auraStagger = FindExistingStaggerEffect(GetTarget())) - { - if (AuraEffect* auraEff = auraStagger->GetEffect(AuraStaggerEffectTotal)) - { - float total = float(auraEff->GetAmount()); - float tickDamage = float(aurEff->GetAmount()); - auraEff->ChangeAmount(total - tickDamage); - } - } - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_monk_stagger_damage_aura::OnPeriodicDamage, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } -}; - -// 124273, 124274, 124275 - Light/Moderate/Heavy Stagger - SPELL_MONK_STAGGER_LIGHT / SPELL_MONK_STAGGER_MODERATE / SPELL_MONK_STAGGER_HEAVY -class spell_monk_stagger_debuff_aura : public AuraScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_MONK_STAGGER_DAMAGE_AURA }) - && ValidateSpellEffect({ { SPELL_MONK_STAGGER_DAMAGE_AURA, EFFECT_0 } }); - } - - bool Load() override - { - _period = float(sSpellMgr->AssertSpellInfo(SPELL_MONK_STAGGER_DAMAGE_AURA, GetCastDifficulty())->GetEffect(EFFECT_0).ApplyAuraPeriod); - return true; - } - - void OnReapply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - // Calculate damage per tick - float total = float(aurEff->GetAmount()); - float perTick = total * _period / float(GetDuration()); // should be same as GetMaxDuration() TODO: verify - - // Set amount on effect for tooltip - AuraEffect* effInfo = GetAura()->GetEffect(AuraStaggerEffectTick); - if (effInfo) - effInfo->ChangeAmount(perTick); - - // Set amount on damage aura (or cast it if needed) - CastOrChangeTickDamage(perTick); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes mode) - { - if (mode != AURA_EFFECT_HANDLE_REAL) - return; - - // Remove damage aura - GetTarget()->RemoveAura(SPELL_MONK_STAGGER_DAMAGE_AURA); - } - - void Register() override - { - AfterEffectApply += AuraEffectRemoveFn(spell_monk_stagger_debuff_aura::OnReapply, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - AfterEffectRemove += AuraEffectRemoveFn(spell_monk_stagger_debuff_aura::OnRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - -private: - float _period = 0.0f; - - void CastOrChangeTickDamage(float tickDamage) - { - Unit* unit = GetTarget(); - Aura* auraDamage = unit->GetAura(SPELL_MONK_STAGGER_DAMAGE_AURA); - if (!auraDamage) - { - unit->CastSpell(unit, SPELL_MONK_STAGGER_DAMAGE_AURA, true); - auraDamage = unit->GetAura(SPELL_MONK_STAGGER_DAMAGE_AURA); - } - - if (auraDamage) - if (AuraEffect* eff = auraDamage->GetEffect(AuraStaggerEffectTick)) - eff->ChangeAmount(tickDamage); - } -}; - -void AddSC_monk_spell_scripts() -{ - RegisterSpellScript(spell_monk_crackling_jade_lightning); - RegisterSpellScript(spell_monk_crackling_jade_lightning_knockback_proc_aura); - RegisterSpellScript(spell_monk_life_cocoon); - RegisterSpellScript(spell_monk_open_palm_strikes); - RegisterSpellScript(spell_monk_power_strike_periodic); - RegisterSpellScript(spell_monk_power_strike_proc); - RegisterSpellScript(spell_monk_provoke); - RegisterSpellScript(spell_monk_roll); - RegisterSpellScript(spell_monk_roll_aura); - RegisterSpellScript(spell_monk_stagger); - RegisterSpellScript(spell_monk_stagger_damage_aura); - RegisterSpellScript(spell_monk_stagger_debuff_aura); -} diff --git a/src/server/scripts/Spells/spell_script_loader.cpp b/src/server/scripts/Spells/spell_script_loader.cpp index 7df1d920846..cbe80bafff2 100644 --- a/src/server/scripts/Spells/spell_script_loader.cpp +++ b/src/server/scripts/Spells/spell_script_loader.cpp @@ -17,13 +17,10 @@ // This is where scripts' loading functions should be declared: void AddSC_deathknight_spell_scripts(); -void AddSC_demon_hunter_spell_scripts(); void AddSC_druid_spell_scripts(); -void AddSC_evoker_spell_scripts(); void AddSC_generic_spell_scripts(); void AddSC_hunter_spell_scripts(); void AddSC_mage_spell_scripts(); -void AddSC_monk_spell_scripts(); void AddSC_paladin_spell_scripts(); void AddSC_priest_spell_scripts(); void AddSC_rogue_spell_scripts(); @@ -32,20 +29,16 @@ void AddSC_warlock_spell_scripts(); void AddSC_warrior_spell_scripts(); void AddSC_quest_spell_scripts(); void AddSC_item_spell_scripts(); -void AddSC_azerite_item_spell_scripts(); // The name of this function should match: // void Add${NameOfDirectory}Scripts() void AddSpellsScripts() { AddSC_deathknight_spell_scripts(); - AddSC_demon_hunter_spell_scripts(); AddSC_druid_spell_scripts(); - AddSC_evoker_spell_scripts(); AddSC_generic_spell_scripts(); AddSC_hunter_spell_scripts(); AddSC_mage_spell_scripts(); - AddSC_monk_spell_scripts(); AddSC_paladin_spell_scripts(); AddSC_priest_spell_scripts(); AddSC_rogue_spell_scripts(); @@ -54,5 +47,4 @@ void AddSpellsScripts() AddSC_warrior_spell_scripts(); AddSC_quest_spell_scripts(); AddSC_item_spell_scripts(); - AddSC_azerite_item_spell_scripts(); } |
