diff --git a/sql/updates/world/custom/custom_2019_12_05_00_world.sql b/sql/updates/world/custom/custom_2019_12_05_00_world.sql new file mode 100644 index 00000000000..5096d94c97b --- /dev/null +++ b/sql/updates/world/custom/custom_2019_12_05_00_world.sql @@ -0,0 +1,11 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName` IN +('spell_dru_blood_in_the_water', +'spell_dru_blood_in_the_water_script'); + +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(-80318, 'spell_dru_blood_in_the_water'), +(80863, 'spell_dru_blood_in_the_water_script'); + +DELETE FROM `spell_proc` WHERE `SpellId`= -80318; +INSERT INTO `spell_proc` (`SpellId`, `SpellFamilyName`, `SpellFamilyMask0`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`, `Chance`) VALUES +(-80318, 7, 0x00800000, 0x00000010, 1, 2, 0, 100); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index bef6b56bf48..dd1e2a37502 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -5610,6 +5610,12 @@ void SpellMgr::LoadSpellInfoCorrections() { spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_DONE_BONUS; }); + + // Blood in the Water (Rank 1) + ApplySpellFix({ 80318 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].ApplyAuraName = SPELL_AURA_DUMMY; + }); // Last Word ApplySpellFix({ diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index 7d1ea8a2d2f..db1c697382e 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -33,6 +33,7 @@ enum DruidSpells { + SPELL_DRUID_BLOOD_IN_THE_WATER_SCRIPT = 80863, SPELL_DRUID_WRATH = 5176, SPELL_DRUID_STARFIRE = 2912, SPELL_DRUID_STARSURGE = 78674, @@ -89,6 +90,7 @@ enum DruidSpells SPELL_DRUID_NATURES_BOUNTY = 96206, SPELL_DRUID_NATURES_GRACE = 16880, SPELL_DRUID_PULVERIZE_TRIGGERED = 80951, + SPELL_DRUID_RIP = 1079, SPELL_DRUID_SURVIVAL_INSTINCTS = 50322, SPELL_DRUID_SAVAGE_ROAR = 62071, SPELL_DRUID_STAMPEDE_BAER_RANK_1 = 81016, @@ -102,6 +104,7 @@ enum DruidSpells SPELL_DRUID_TREE_OF_LIFE_PASSIVE_1 = 5420, SPELL_DRUID_TREE_OF_LIFE_PASSIVE_2 = 81097, SPELL_DRUID_TREE_OF_LIFE_PASSIVE_3 = 81098, + SPELL_DRUID_T13_FERAL_2P_BONUS = 105725, SPELL_DRUID_WILD_MUSHROOM = 88747, SPELL_DRUID_WILD_MUSHROOM_DAMAGE = 78777, SPELL_DRUID_WILD_MUSHROOM_SUICIDE = 92853, @@ -1879,9 +1882,75 @@ class spell_dru_feral_swiftness_clear : public SpellScript } }; +// -80318 - Blood in the Water +class spell_dru_blood_in_the_water : public AuraScript +{ + PrepareAuraScript(spell_dru_blood_in_the_water); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_DRUID_BLOOD_IN_THE_WATER_SCRIPT, + SPELL_DRUID_T13_FERAL_2P_BONUS + }); + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + if (!eventInfo.GetDamageInfo() || !eventInfo.GetDamageInfo()->GetVictim()) + return false; + + float healthPct = 25.f; + + // T13 Bonus + if (GetTarget()->HasAura(SPELL_DRUID_T13_FERAL_2P_BONUS)) + healthPct = sSpellMgr->AssertSpellInfo(SPELL_DRUID_T13_FERAL_2P_BONUS)->Effects[EFFECT_1].BasePoints; + + return eventInfo.GetDamageInfo()->GetVictim()->GetHealthPct() <= healthPct && roll_chance_i(50 * GetSpellInfo()->GetRank()); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_DRUID_BLOOD_IN_THE_WATER_SCRIPT, true, nullptr, aurEff); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_dru_blood_in_the_water::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_dru_blood_in_the_water::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } +}; + +// 80863 - Blood in the Water +class spell_dru_blood_in_the_water_script : public SpellScript +{ + PrepareSpellScript(spell_dru_blood_in_the_water_script); + + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_DRUID_RIP }); + } + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Unit* caster = GetCaster()) + if (Aura* aura = GetHitUnit()->GetAura(SPELL_DRUID_RIP, caster->GetGUID())) + aura->RefreshDuration(); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_dru_blood_in_the_water_script::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + void AddSC_druid_spell_scripts() { RegisterAuraScript(spell_dru_berserk); + RegisterAuraScript(spell_dru_blood_in_the_water); + RegisterSpellScript(spell_dru_blood_in_the_water_script); RegisterSpellAndAuraScriptPair(spell_dru_dash, spell_dru_dash_AuraScript); RegisterAuraScript(spell_dru_eclipse); RegisterSpellScript(spell_dru_eclipse_energize);