diff options
-rw-r--r-- | sql/updates/world/master/2017_06_17_00_world.sql | 4 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.h | 7 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_priest.cpp | 137 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_rogue.cpp | 9 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_shaman.cpp | 6 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_warlock.cpp | 12 |
7 files changed, 154 insertions, 23 deletions
diff --git a/sql/updates/world/master/2017_06_17_00_world.sql b/sql/updates/world/master/2017_06_17_00_world.sql new file mode 100644 index 00000000000..374a258923b --- /dev/null +++ b/sql/updates/world/master/2017_06_17_00_world.sql @@ -0,0 +1,4 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_pri_atonement','spell_pri_atonement_triggered'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(81749,'spell_pri_atonement'), +(194384,'spell_pri_atonement_triggered'); diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index f5a6a0bf6e6..b333f6ac940 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -364,7 +364,7 @@ AuraScript* Aura::GetScriptByName(std::string const& scriptName) const for (auto itr = m_loadedScripts.begin(); itr != m_loadedScripts.end(); ++itr) if ((*itr)->_GetScriptName()->compare(scriptName) == 0) return *itr; - return NULL; + return nullptr; } SpellEffectInfo const* Aura::GetSpellEffectInfo(uint32 index) const diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h index dc7b5c946f7..1fdfb726610 100644 --- a/src/server/game/Spells/Auras/SpellAuras.h +++ b/src/server/game/Spells/Auras/SpellAuras.h @@ -285,7 +285,11 @@ class TC_GAME_API Aura bool CallScriptEffectProcHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp, ProcEventInfo& eventInfo); void CallScriptAfterEffectProcHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp, ProcEventInfo& eventInfo); - AuraScript* GetScriptByName(std::string const& scriptName) const; + template<class Script> + Script* GetScript(std::string const& scriptName) const + { + return dynamic_cast<Script*>(GetScriptByName(scriptName)); + } std::vector<AuraScript*> m_loadedScripts; @@ -295,6 +299,7 @@ class TC_GAME_API Aura SpellEffectInfo const* GetSpellEffectInfo(uint32 index) const; private: + AuraScript* GetScriptByName(std::string const& scriptName) const; void _DeleteRemovedApplications(); protected: diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index 67cd65dcdee..bb7584ed7b1 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -32,10 +32,13 @@ enum PriestSpells { SPELL_PRIEST_ABSOLUTION = 33167, - SPELL_PRIEST_ANGELIC_FEATHER_TRIGGER = 121536, - SPELL_PRIEST_ANGELIC_FEATHER_AURA = 121557, SPELL_PRIEST_ANGELIC_FEATHER_AREATRIGGER = 158624, + SPELL_PRIEST_ANGELIC_FEATHER_AURA = 121557, + SPELL_PRIEST_ANGELIC_FEATHER_TRIGGER = 121536, SPELL_PRIEST_ARMOR_OF_FAITH = 28810, + SPELL_PRIEST_ATONEMENT = 81749, + SPELL_PRIEST_ATONEMENT_HEAL = 81751, + SPELL_PRIEST_ATONEMENT_TRIGGERED = 194384, SPELL_PRIEST_BLESSED_HEALING = 70772, SPELL_PRIEST_BODY_AND_SOUL = 64129, SPELL_PRIEST_BODY_AND_SOUL_DISPEL = 64136, @@ -68,15 +71,15 @@ enum PriestSpells SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED = 33619, SPELL_PRIEST_RENEWED_HOPE = 197469, SPELL_PRIEST_RENEWED_HOPE_EFFECT = 197470, - SPELL_PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH = 107903, SPELL_PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH = 107904, - SPELL_PRIEST_SHIELD_DISCIPLINE_PASSIVE = 197045, + SPELL_PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH = 107903, SPELL_PRIEST_SHIELD_DISCIPLINE_ENERGIZE = 47755, + SPELL_PRIEST_SHIELD_DISCIPLINE_PASSIVE = 197045, SPELL_PRIEST_STRENGTH_OF_SOUL = 197535, SPELL_PRIEST_STRENGTH_OF_SOUL_EFFECT = 197548, + SPELL_PRIEST_T9_HEALING_2P = 67201, SPELL_PRIEST_THE_PENITENT_AURA = 200347, SPELL_PRIEST_TWIN_DISCIPLINES_RANK_1 = 47586, - SPELL_PRIEST_T9_HEALING_2P = 67201, SPELL_PRIEST_VAMPIRIC_EMBRACE_HEAL = 15290, SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL = 64085, SPELL_PRIEST_VOID_SHIELD = 199144, @@ -164,6 +167,120 @@ class spell_pri_aq_3p_bonus : public SpellScriptLoader } }; +// 81749 - Atonement +class spell_pri_atonement : public SpellScriptLoader +{ +public: + static char constexpr ScriptName[] = "spell_pri_atonement"; + + spell_pri_atonement() : SpellScriptLoader(ScriptName) { } + + class spell_pri_atonement_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pri_atonement_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_PRIEST_ATONEMENT_HEAL }); + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + return eventInfo.GetDamageInfo() != nullptr; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + int32 heal = CalculatePct(damageInfo->GetDamage(), aurEff->GetAmount()); + _appliedAtonements.erase(std::remove_if(_appliedAtonements.begin(), _appliedAtonements.end(), [this, heal](ObjectGuid const& targetGuid) + { + if (Unit* target = ObjectAccessor::GetUnit(*GetTarget(), targetGuid)) + { + if (target->GetExactDist(GetTarget()) < GetSpellInfo()->GetEffect(EFFECT_1)->CalcValue()) + GetTarget()->CastCustomSpell(SPELL_PRIEST_ATONEMENT_HEAL, SPELLVALUE_BASE_POINT0, heal, target, true); + + return false; + } + return true; + }), _appliedAtonements.end()); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_pri_atonement_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_pri_atonement_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + + std::vector<ObjectGuid> _appliedAtonements; + + public: + void AddAtonementTarget(ObjectGuid const& target) + { + _appliedAtonements.push_back(target); + } + + void RemoveAtonementTarget(ObjectGuid const& target) + { + _appliedAtonements.erase(std::remove(_appliedAtonements.begin(), _appliedAtonements.end(), target), _appliedAtonements.end()); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pri_atonement_AuraScript(); + } +}; + +// 194384 - Atonement +class spell_pri_atonement_triggered : public SpellScriptLoader +{ +public: + spell_pri_atonement_triggered() : SpellScriptLoader("spell_pri_atonement_triggered") { } + + class spell_pri_atonement_triggered_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pri_atonement_triggered_AuraScript); + + using AtonementScript = spell_pri_atonement::spell_pri_atonement_AuraScript; + + bool Validate(SpellInfo const* spellInfo) override + { + return ValidateSpellInfo({ SPELL_PRIEST_ATONEMENT }); + } + + void HandleOnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + RegisterHelper<&AtonementScript::AddAtonementTarget>(); + } + + void HandleOnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + RegisterHelper<&AtonementScript::RemoveAtonementTarget>(); + } + + template<void(AtonementScript::*func)(ObjectGuid const&)> + void RegisterHelper() + { + if (Unit* caster = GetCaster()) + if (Aura* atonement = caster->GetAura(SPELL_PRIEST_ATONEMENT)) + if (AtonementScript* script = atonement->GetScript<AtonementScript>(spell_pri_atonement::ScriptName)) + (script->*func)(GetTarget()->GetGUID()); + } + + void Register() override + { + OnEffectApply += AuraEffectApplyFn(spell_pri_atonement_triggered_AuraScript::HandleOnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_pri_atonement_triggered_AuraScript::HandleOnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pri_atonement_triggered_AuraScript(); + } +}; + // 64129 - Body and Soul class spell_pri_body_and_soul : public SpellScriptLoader { @@ -976,7 +1093,7 @@ public: } } - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + void HandleOnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { Unit* caster = GetCaster(); Unit* target = GetTarget(); @@ -991,6 +1108,8 @@ public: caster->CastSpell(target, SPELL_PRIEST_RENEWED_HOPE_EFFECT, true); if (caster->HasAura(SPELL_PRIEST_VOID_SHIELD) && caster == target) caster->CastSpell(target, SPELL_PRIEST_VOID_SHIELD_EFFECT, true); + if (caster->HasAura(SPELL_PRIEST_ATONEMENT)) + caster->CastSpell(target, SPELL_PRIEST_ATONEMENT_TRIGGERED, true); } void HandleOnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) @@ -1004,8 +1123,8 @@ public: void Register() override { DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_power_word_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - OnEffectApply += AuraEffectApplyFn(spell_pri_power_word_shield_AuraScript::OnApply, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_pri_power_word_shield_AuraScript::HandleOnRemove, EFFECT_0, AuraType::SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL); + AfterEffectApply += AuraEffectApplyFn(spell_pri_power_word_shield_AuraScript::HandleOnApply, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + AfterEffectRemove += AuraEffectRemoveFn(spell_pri_power_word_shield_AuraScript::HandleOnRemove, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL); } }; @@ -1434,6 +1553,8 @@ void AddSC_priest_spell_scripts() { new spell_pri_aq_3p_bonus(); new spell_pri_body_and_soul(); + new spell_pri_atonement(); + new spell_pri_atonement_triggered(); new spell_pri_circle_of_healing(); new spell_pri_dispel_magic(); new spell_pri_divine_aegis(); diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp index 731af46ec9b..7a8cb627fbe 100644 --- a/src/server/scripts/Spells/spell_rogue.cpp +++ b/src/server/scripts/Spells/spell_rogue.cpp @@ -325,11 +325,12 @@ class spell_rog_deadly_poison : public SpellScriptLoader }; // 51690 - Killing Spree -#define KillingSpreeScriptName "spell_rog_killing_spree" class spell_rog_killing_spree : public SpellScriptLoader { public: - spell_rog_killing_spree() : SpellScriptLoader(KillingSpreeScriptName) { } + static char constexpr ScriptName[] = "spell_rog_killing_spree"; + + spell_rog_killing_spree() : SpellScriptLoader(ScriptName) { } class spell_rog_killing_spree_SpellScript : public SpellScript { @@ -344,10 +345,8 @@ class spell_rog_killing_spree : public SpellScriptLoader void HandleDummy(SpellEffIndex /*effIndex*/) { if (Aura* aura = GetCaster()->GetAura(SPELL_ROGUE_KILLING_SPREE)) - { - if (spell_rog_killing_spree_AuraScript* script = dynamic_cast<spell_rog_killing_spree_AuraScript*>(aura->GetScriptByName(KillingSpreeScriptName))) + if (spell_rog_killing_spree_AuraScript* script = aura->GetScript<spell_rog_killing_spree_AuraScript>(ScriptName)) script->AddTarget(GetHitUnit()); - } } void Register() override diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 86c88b23970..c2c43bf18de 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -294,7 +294,9 @@ class spell_sha_earth_shield : public SpellScriptLoader class spell_sha_earthen_rage_passive : public SpellScriptLoader { public: - spell_sha_earthen_rage_passive() : SpellScriptLoader("spell_sha_earthen_rage_passive") { } + static char constexpr ScriptName[] = "spell_sha_earthen_rage_passive"; + + spell_sha_earthen_rage_passive() : SpellScriptLoader(ScriptName) { } class spell_sha_earthen_rage_passive_AuraScript : public AuraScript { @@ -353,7 +355,7 @@ public: PreventDefaultAction(); if (Aura const* aura = GetCaster()->GetAura(SPELL_SHAMAN_EARTHEN_RAGE_PASSIVE)) - if (earthen_rage_script_t const* earthen_rage_script = dynamic_cast<earthen_rage_script_t const*>(aura->GetScriptByName("spell_sha_earthen_rage_passive"))) + if (earthen_rage_script_t const* earthen_rage_script = aura->GetScript<earthen_rage_script_t>(spell_sha_earthen_rage_passive::ScriptName)) if (Unit* procTarget = ObjectAccessor::GetUnit(*GetCaster(), earthen_rage_script->GetProcTargetGuid())) GetTarget()->CastSpell(procTarget, SPELL_SHAMAN_EARTHEN_RAGE_DAMAGE, true); } diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index a788f04ad25..8f4c6416014 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -1133,13 +1133,13 @@ class spell_warl_soul_swap : public SpellScriptLoader } }; -#define SoulSwapOverrideScriptName "spell_warl_soul_swap_override" - // 86211 - Soul Swap Override - Also acts as a dot container class spell_warl_soul_swap_override : public SpellScriptLoader { public: - spell_warl_soul_swap_override() : SpellScriptLoader(SoulSwapOverrideScriptName) { } + static char constexpr ScriptName[] = "spell_warl_soul_swap_override"; + + spell_warl_soul_swap_override() : SpellScriptLoader(ScriptName) { } class spell_warl_soul_swap_override_AuraScript : public AuraScript { @@ -1187,7 +1187,7 @@ class spell_warl_soul_swap_dot_marker : public SpellScriptLoader Unit::AuraApplicationMap const& appliedAuras = swapVictim->GetAppliedAuras(); SoulSwapOverrideAuraScript* swapSpellScript = nullptr; if (Aura* swapOverrideAura = warlock->GetAura(SPELL_WARLOCK_SOUL_SWAP_OVERRIDE)) - swapSpellScript = dynamic_cast<SoulSwapOverrideAuraScript*>(swapOverrideAura->GetScriptByName(SoulSwapOverrideScriptName)); + swapSpellScript = swapOverrideAura->GetScript<SoulSwapOverrideAuraScript>(spell_warl_soul_swap_override::ScriptName); if (!swapSpellScript) return; @@ -1237,7 +1237,7 @@ public: Unit* currentTarget = GetExplTargetUnit(); Unit* swapTarget = nullptr; if (Aura const* swapOverride = GetCaster()->GetAura(SPELL_WARLOCK_SOUL_SWAP_OVERRIDE)) - if (SoulSwapOverrideAuraScript* swapScript = dynamic_cast<SoulSwapOverrideAuraScript*>(swapOverride->GetScriptByName(SoulSwapOverrideScriptName))) + if (SoulSwapOverrideAuraScript* swapScript = swapOverride->GetScript<SoulSwapOverrideAuraScript>(spell_warl_soul_swap_override::ScriptName)) swapTarget = swapScript->GetOriginalSwapSource(); // Soul Swap Exhale can't be cast on the same target than Soul Swap @@ -1256,7 +1256,7 @@ public: Unit* swapSource = nullptr; if (Aura const* swapOverride = GetCaster()->GetAura(SPELL_WARLOCK_SOUL_SWAP_OVERRIDE)) { - SoulSwapOverrideAuraScript* swapScript = dynamic_cast<SoulSwapOverrideAuraScript*>(swapOverride->GetScriptByName(SoulSwapOverrideScriptName)); + SoulSwapOverrideAuraScript* swapScript = swapOverride->GetScript<SoulSwapOverrideAuraScript>(spell_warl_soul_swap_override::ScriptName); if (!swapScript) return; dotList = swapScript->GetDotList(); |