From ee19cded9d016b74266e2f59bab98ab93f0f271f Mon Sep 17 00:00:00 2001 From: Ovah Date: Mon, 27 Nov 2017 12:40:21 +0000 Subject: [PATCH] Fixed Shaman Masteries --- .../world/4.3.4/2017_11_25_00_world.sql | 7 ++ src/server/game/Entities/Unit/Unit.cpp | 11 ++++ .../game/Spells/Auras/SpellAuraDefines.h | 2 +- .../game/Spells/Auras/SpellAuraEffects.cpp | 2 +- src/server/scripts/Spells/spell_shaman.cpp | 65 +++++++++++++++++++ 5 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 sql/updates/world/4.3.4/2017_11_25_00_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_25_00_world.sql b/sql/updates/world/4.3.4/2017_11_25_00_world.sql new file mode 100644 index 00000000000..4d3994fa1ec --- /dev/null +++ b/sql/updates/world/4.3.4/2017_11_25_00_world.sql @@ -0,0 +1,7 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`= 'spell_sha_elemental_overload'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(77222, 'spell_sha_elemental_overload'); + +DELETE FROM `spell_proc` WHERE `SpellID`= 77222; +INSERT INTO `spell_proc` (`SpellID`, `SpellFamilyName`, `SpellFamilyMask0`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`, `AttributesMask`) VALUES +(77222, 11, 0, 0x00010000, 1, 2, 0, 0x0000020); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 0e265cbcc4c..0b46936e7ea 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -7375,6 +7375,17 @@ float Unit::SpellHealingPctDone(Unit* victim, SpellInfo const* spellProto) const } } + AuraEffectList const& mHealingFromTargetHealthPct = owner->GetAuraEffectsByType(SPELL_AURA_MOD_HEALING_FROM_TARGET_HEALTH); + for (AuraEffectList::const_iterator i = mHealingFromTargetHealthPct.begin(); i != mHealingFromTargetHealthPct.end(); ++i) + { + if ((*i)->IsAffectingSpell(spellProto)) + { + uint32 masteryBonus = (*i)->GetAmount(); + float healthPct = 100.0f - victim->GetHealthPct(); + AddPct(DoneTotalMod, CalculatePct(masteryBonus, healthPct)); + } + } + return DoneTotalMod; } diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index 847e6484a72..527f9a43d7e 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -413,7 +413,7 @@ enum AuraType SPELL_AURA_351 = 351, SPELL_AURA_352 = 352, SPELL_AURA_MOD_CAMOUFLAGE = 353, // NYI - SPELL_AURA_354 = 354, // Restoration Shaman mastery - mod healing based on target's health (less = more healing) + SPELL_AURA_MOD_HEALING_FROM_TARGET_HEALTH = 354, // Restoration Shaman mastery - mod healing based on target's health (less = more healing) SPELL_AURA_355 = 355, SPELL_AURA_356 = 356, // Arcane Mage mastery - mod damage based on current mana SPELL_AURA_ENABLE_BOSS1_UNIT_FRAME = 357, diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 369679684a1..076ed25c55c 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -412,7 +412,7 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNULL, //351 SPELL_AURA_351 &AuraEffect::HandleNULL, //352 SPELL_AURA_352 &AuraEffect::HandleNULL, //353 SPELL_AURA_MOD_CAMOUFLAGE - &AuraEffect::HandleNULL, //354 SPELL_AURA_354 + &AuraEffect::HandleNoImmediateEffect, //354 SPELL_AURA_MOD_HEALING_FROM_TARGET_HEALTH implemented in Unit::SpellHealingPctDone &AuraEffect::HandleUnused, //355 unused (4.3.4) &AuraEffect::HandleNULL, //356 SPELL_AURA_356 &AuraEffect::HandleNULL, //357 SPELL_AURA_ENABLE_BOSS1_UNIT_FRAME diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 4ca75e1405f..a57e7c80b70 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -34,6 +34,8 @@ enum ShamanSpells SPELL_SHAMAN_ANCESTRAL_AWAKENING = 52759, SPELL_SHAMAN_ANCESTRAL_AWAKENING_PROC = 52752, SPELL_SHAMAN_BIND_SIGHT = 6277, + SPELL_SHAMAN_CHAIN_LIGHTNING = 421, + SPELL_SHAMAN_CHAIN_LIGHTNING_TRIGGERED = 45297, SPELL_SHAMAN_EARTH_SHIELD_HEAL = 379, SPELL_SHAMAN_ELEMENTAL_MASTERY = 16166, SPELL_SHAMAN_EXHAUSTION = 57723, @@ -46,9 +48,12 @@ enum ShamanSpells SPELL_SHAMAN_GLYPH_OF_MANA_TIDE = 55441, SPELL_SHAMAN_GLYPH_OF_THUNDERSTORM = 62132, SPELL_SHAMAN_LAVA_BURST = 51505, + SPELL_SHAMAN_LAVA_BURST_TRIGGERED = 77451, SPELL_SHAMAN_LAVA_FLOWS_R1 = 51480, SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1 = 65264, SPELL_SHAMAN_LAVA_SURGE = 77762, + SPELL_SHAMAN_LIGHTNING_BOLT = 403, + SPELL_SHAMAN_LIGHTNING_BOLT_TRIGGERED = 45284, SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD = 23552, SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD_DAMAGE = 27635, SPELL_SHAMAN_ITEM_MANA_SURGE = 23571, @@ -1272,6 +1277,65 @@ public: } }; +// 77222 - Elemental Overload +class spell_sha_elemental_overload : public SpellScriptLoader +{ +public: + spell_sha_elemental_overload() : SpellScriptLoader("spell_sha_elemental_overload") { } + + class spell_sha_elemental_overload_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_elemental_overload_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_SHAMAN_LIGHTNING_BOLT, SPELL_SHAMAN_LIGHTNING_BOLT_TRIGGERED, + SPELL_SHAMAN_CHAIN_LIGHTNING, SPELL_SHAMAN_CHAIN_LIGHTNING_TRIGGERED, + SPELL_SHAMAN_LAVA_BURST, SPELL_SHAMAN_LAVA_BURST_TRIGGERED }); + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + return roll_chance_i(GetEffect(EFFECT_0)->GetAmount()); + } + + void HandleEffectProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + if (Unit* target = eventInfo.GetProcTarget()) + { + if (Unit* caster = GetCaster()) + { + switch (eventInfo.GetProcSpell()->GetSpellInfo()->Id) + { + case SPELL_SHAMAN_LIGHTNING_BOLT: + caster->CastSpell(target, SPELL_SHAMAN_LIGHTNING_BOLT_TRIGGERED, true); + break; + case SPELL_SHAMAN_CHAIN_LIGHTNING: + caster->CastSpell(target, SPELL_SHAMAN_CHAIN_LIGHTNING_TRIGGERED, true); + break; + case SPELL_SHAMAN_LAVA_BURST: + caster->CastSpell(target, SPELL_SHAMAN_LAVA_BURST_TRIGGERED, true); + break; + default: + break; + } + } + } + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_sha_elemental_overload_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_sha_elemental_overload_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_sha_elemental_overload_AuraScript(); + } +}; + void AddSC_shaman_spell_scripts() { new spell_sha_ancestral_awakening(); @@ -1281,6 +1345,7 @@ void AddSC_shaman_spell_scripts() new spell_sha_earth_shield(); new spell_sha_earthbind_totem(); new spell_sha_earthen_power(); + new spell_sha_elemental_overload(); new spell_sha_feedback(); new spell_sha_fire_nova(); new spell_sha_flame_shock();