diff --git a/sql/updates/world/custom/custom_2019_05_05_00_world.sql b/sql/updates/world/custom/custom_2019_05_05_00_world.sql new file mode 100644 index 0000000000..2971614d0e --- /dev/null +++ b/sql/updates/world/custom/custom_2019_05_05_00_world.sql @@ -0,0 +1,11 @@ +DELETE FROM `spell_proc` WHERE `SpellId`= -14523; +INSERT INTO `spell_proc` (`SpellId`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`, `AttributesMask`, `Cooldown`, `Charges`, `Chance`) VALUES +(-14523, 6, 0x00000080 | 0x00100000, 0, 0, 0x00010000, 1, 2, 0, 0, 0, 0, 0); + +DELETE FROM `spell_script_names` WHERE `ScriptName` IN +('spell_pri_atonement', +'spell_pri_atonement_heal'); + +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(-14523, 'spell_pri_atonement'), +(81751, 'spell_pri_atonement_heal'); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 566d81bfe6..bb77397849 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -5201,11 +5201,21 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->Effects[EFFECT_1].BasePoints = 7; }); + // Whack! ApplySpellFix({ 102022 }, [](SpellInfo* spellInfo) { spellInfo->AttributesCu |= SPELL_ATTR0_CU_CONE_LINE; }); + // Atonement + ApplySpellFix({ + 81751, + 94472 + }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx2 |= SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS; + }); + for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) { SpellInfo* spellInfo = mSpellInfoMap[i]; diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index 3d4303c868..f385487859 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -34,6 +34,8 @@ enum PriestSpells SPELL_PRIEST_ARCHANGEL_DUMMY = 94709, SPELL_PRIEST_ARCHANGEL_TRIGGERED = 81700, SPELL_PRIEST_ARCHANGEL_ENERGIZE = 87152, + SPELL_PRIEST_ATONEMENT_TRIGGERED_LARGE = 81751, + SPELL_PRIEST_ATONEMENT_TRIGGERED_DEFAULT = 94472, SPELL_PRIEST_BODY_AND_SOUL_DISPEL = 64136, SPELL_PRIEST_BODY_AND_SOUL_SPEED = 65081, SPELL_PRIEST_CHAKRA_SERENITY = 81208, @@ -1521,9 +1523,75 @@ class spell_pri_strength_of_soul_script : public SpellScript } }; +// -14523 - Atonement +class spell_pri_atonement : public AuraScript +{ + PrepareAuraScript(spell_pri_atonement); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_PRIEST_ATONEMENT_TRIGGERED_LARGE, + SPELL_PRIEST_ATONEMENT_TRIGGERED_DEFAULT + }); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = GetTarget(); + DamageInfo* damage = eventInfo.GetDamageInfo(); + if (!damage) + return; + + Unit* target = damage->GetVictim(); + int32 bp = CalculatePct(damage->GetDamage(), aurEff->GetAmount()); + + if (target->GetCombatReach() >= 15.0f) + { + CustomSpellValues values; + values.AddSpellMod(SPELLVALUE_BASE_POINT0, bp); + values.AddSpellMod(SPELLVALUE_RADIUS_MOD, int32(target->GetCombatReach() + 15.0f) * 100); + caster->CastCustomSpell(SPELL_PRIEST_ATONEMENT_TRIGGERED_LARGE, values, target, TRIGGERED_FULL_MASK, nullptr, aurEff); + } + else + caster->CastCustomSpell(SPELL_PRIEST_ATONEMENT_TRIGGERED_DEFAULT, SPELLVALUE_BASE_POINT0, bp, target, true, nullptr, aurEff); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pri_atonement::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } +}; + +// Atonement (Healing) +class spell_pri_atonement_heal : public SpellScript +{ + PrepareSpellScript(spell_pri_atonement_heal); + + void FilterTargets(std::list& targets) + { + targets.remove_if(RaidCheck(GetCaster())); + + if (targets.size() > 1) + { + targets.sort(Trinity::HealthPctOrderPred()); + targets.resize(1); + } + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_atonement_heal::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY); + } +}; + void AddSC_priest_spell_scripts() { RegisterSpellScript(spell_pri_archangel); + RegisterAuraScript(spell_pri_atonement); + RegisterSpellScript(spell_pri_atonement_heal); RegisterAuraScript(spell_pri_body_and_soul); RegisterAuraScript(spell_pri_chakra); RegisterAuraScript(spell_pri_chakra_sanctuary);