diff options
| -rw-r--r-- | src/server/scripts/Spells/spell_shaman.cpp | 43 |
1 files changed, 25 insertions, 18 deletions
diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 9fc64958471..a9101e16c46 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -57,6 +57,7 @@ enum ShamanSpells SPELL_SHAMAN_MANA_SPRING_TOTEM_ENERGIZE = 52032, SPELL_SHAMAN_MANA_TIDE_TOTEM = 39609, SPELL_SHAMAN_NATURE_GUARDIAN = 31616, + SPELL_SHAMAN_NATURE_GUARDIAN_THREAT = 39301, // Serverside SPELL_SHAMAN_SATED = 57724, SPELL_SHAMAN_STORM_EARTH_AND_FIRE = 51483, SPELL_SHAMAN_TOTEM_EARTHBIND_EARTHGRAB = 64695, @@ -1638,36 +1639,42 @@ public: bool Validate(SpellInfo const* /*spellInfo*/) override { - return ValidateSpellInfo({ SPELL_SHAMAN_NATURE_GUARDIAN }); + return ValidateSpellInfo( + { + SPELL_SHAMAN_NATURE_GUARDIAN, + SPELL_SHAMAN_NATURE_GUARDIAN_THREAT + }); } - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + bool CheckProc(ProcEventInfo& eventInfo) { - PreventDefaultAction(); DamageInfo* damageInfo = eventInfo.GetDamageInfo(); if (!damageInfo || !damageInfo->GetDamage()) - return; - - int32 healthpct = aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue(); // %s2 - the 30% threshold for health + return false; + int32 healthpct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(); if (Unit* target = eventInfo.GetActionTarget()) - { if (target->HealthBelowPctDamaged(healthpct, damageInfo->GetDamage())) - { - CastSpellExtraArgs args(aurEff); - args.AddSpellBP0(CalculatePct(target->GetMaxHealth(), aurEff->GetAmount())); - target->CastSpell(target, SPELL_SHAMAN_NATURE_GUARDIAN, args); - - // Threat reduction is around 10% confirmed in retail and from wiki - Unit* attacker = eventInfo.GetActor(); - if (attacker->IsAlive()) - attacker->GetThreatManager().ModifyThreatByPercent(target, -10); - } - } + return true; + + return false; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* target = eventInfo.GetActionTarget(); + CastSpellExtraArgs args(aurEff); + args.AddSpellBP0(CalculatePct(target->GetMaxHealth(), aurEff->GetAmount())); + target->CastSpell(target, SPELL_SHAMAN_NATURE_GUARDIAN, args); + if (Unit* attacker = eventInfo.GetActor()) + target->CastSpell(attacker, SPELL_SHAMAN_NATURE_GUARDIAN_THREAT, true); } void Register() override { + DoCheckProc += AuraCheckProcFn(spell_sha_nature_guardian_AuraScript::CheckProc); OnEffectProc += AuraEffectProcFn(spell_sha_nature_guardian_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); } }; |
