aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2017_06_17_00_world.sql4
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp2
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.h7
-rw-r--r--src/server/scripts/Spells/spell_priest.cpp137
-rw-r--r--src/server/scripts/Spells/spell_rogue.cpp9
-rw-r--r--src/server/scripts/Spells/spell_shaman.cpp6
-rw-r--r--src/server/scripts/Spells/spell_warlock.cpp12
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();