From 2b9232dddc73a692b1c70c892787a40bde2097fd Mon Sep 17 00:00:00 2001 From: Warpten Date: Mon, 17 Sep 2012 18:17:23 +0200 Subject: [PATCH] Core/Spells: Fixed King of the Jungle. Closes #7098 --- ...2012_09_17_01_world_spell_script_names.sql | 5 + src/server/game/Entities/Unit/Unit.cpp | 24 - src/server/scripts/Spells/spell_druid.cpp | 629 ++++++++++-------- 3 files changed, 349 insertions(+), 309 deletions(-) create mode 100644 sql/updates/world/2012_09_17_01_world_spell_script_names.sql diff --git a/sql/updates/world/2012_09_17_01_world_spell_script_names.sql b/sql/updates/world/2012_09_17_01_world_spell_script_names.sql new file mode 100644 index 0000000000..255c76e6b7 --- /dev/null +++ b/sql/updates/world/2012_09_17_01_world_spell_script_names.sql @@ -0,0 +1,5 @@ +DELETE FROM `spell_proc_event` WHERE `entry` IN (48492,48494,48495); +DELETE FROM `spell_script_names` WHERE `spell_id` IN(-5217, -5229); +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(-5217, "spell_dru_tiger_s_fury"), +(-5229, "spell_dru_enrage"); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 7dc1afa973..98921f22be 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -6448,30 +6448,6 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere basepoints0 = CalculatePctN(int32(damage), triggerAmount); break; } - // King of the Jungle - else if (dummySpell->SpellIconID == 2850) - { - // Effect 0 - mod damage while having Enrage - if (effIndex == 0) - { - if (!(procSpell->SpellFamilyFlags[0] & 0x00080000) || procSpell->SpellIconID != 961) - return false; - triggered_spell_id = 51185; - basepoints0 = triggerAmount; - target = this; - break; - } - // Effect 1 - Tiger's Fury restore energy - else if (effIndex == 1) - { - if (!(procSpell->SpellFamilyFlags[2] & 0x00000800) || procSpell->SpellIconID != 1181) - return false; - triggered_spell_id = 51178; - basepoints0 = triggerAmount; - target = this; - break; - } - } break; } case SPELLFAMILY_ROGUE: diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index b213f3df62..32a92da5e3 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -34,6 +34,36 @@ enum DruidSpells DRUID_SURVIVAL_INSTINCTS = 50322, DRUID_SAVAGE_ROAR = 62071, SPELL_DRUID_ITEM_T8_BALANCE_RELIC = 64950, + SPELL_KING_OF_THE_JUNGLE = 48492, + SPELL_TIGER_S_FURY_ENERGIZE = 51178, + SPELL_ENRAGE_MOD_DAMAGE = 51185, +}; + +class spell_dru_enrage : public SpellScriptLoader +{ + public: + spell_dru_enrage() : SpellScriptLoader("spell_dru_enrage") { } + + class spell_dru_enrage_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dru_enrage_SpellScript); + + void OnHit() + { + if (AuraEffect const* aurEff = GetHitUnit()->GetAuraEffectOfRankedSpell(SPELL_KING_OF_THE_JUNGLE, EFFECT_0)) + GetHitUnit()->CastCustomSpell(SPELL_ENRAGE_MOD_DAMAGE, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetHitUnit(), true); + } + + void Register() + { + AfterHit += SpellHitFn(spell_dru_enrage_SpellScript::OnHit); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dru_enrage_SpellScript(); + } }; // 54846 Glyph of Starfire @@ -88,6 +118,115 @@ class spell_dru_glyph_of_starfire : public SpellScriptLoader } }; +class spell_dru_insect_swarm : public SpellScriptLoader +{ + public: + spell_dru_insect_swarm() : SpellScriptLoader("spell_dru_insect_swarm") { } + + class spell_dru_insect_swarm_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_insect_swarm_AuraScript); + + void CalculateAmount(AuraEffect const* aurEff, int32 & amount, bool & /*canBeRecalculated*/) + { + if (Unit* caster = GetCaster()) + if (AuraEffect const* relicAurEff = caster->GetAuraEffect(SPELL_DRUID_ITEM_T8_BALANCE_RELIC, EFFECT_0)) + amount += relicAurEff->GetAmount() / aurEff->GetTotalTicks(); + } + + void Register() + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_insect_swarm_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_insect_swarm_AuraScript(); + } +}; + +class spell_dru_lifebloom : public SpellScriptLoader +{ + public: + spell_dru_lifebloom() : SpellScriptLoader("spell_dru_lifebloom") { } + + class spell_dru_lifebloom_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_lifebloom_AuraScript); + + bool Validate(SpellInfo const* /*spell*/) + { + if (!sSpellMgr->GetSpellInfo(DRUID_LIFEBLOOM_FINAL_HEAL)) + return false; + if (!sSpellMgr->GetSpellInfo(DRUID_LIFEBLOOM_ENERGIZE)) + return false; + return true; + } + + void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + // Final heal only on duration end + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) + return; + + // final heal + int32 stack = GetStackAmount(); + int32 healAmount = aurEff->GetAmount(); + if (Unit* caster = GetCaster()) + { + healAmount = caster->SpellHealingBonusDone(GetTarget(), GetSpellInfo(), healAmount, HEAL, stack); + healAmount = GetTarget()->SpellHealingBonusTaken(caster, GetSpellInfo(), healAmount, HEAL, stack); + + GetTarget()->CastCustomSpell(GetTarget(), DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, aurEff, GetCasterGUID()); + + // restore mana + int32 returnMana = CalculatePctU(caster->GetCreateMana(), GetSpellInfo()->ManaCostPercentage) * stack / 2; + caster->CastCustomSpell(caster, DRUID_LIFEBLOOM_ENERGIZE, &returnMana, NULL, NULL, true, NULL, aurEff, GetCasterGUID()); + return; + } + + GetTarget()->CastCustomSpell(GetTarget(), DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, aurEff, GetCasterGUID()); + } + + void HandleDispel(DispelInfo* dispelInfo) + { + if (Unit* target = GetUnitOwner()) + { + if (AuraEffect const* aurEff = GetEffect(EFFECT_1)) + { + // final heal + int32 healAmount = aurEff->GetAmount(); + if (Unit* caster = GetCaster()) + { + healAmount = caster->SpellHealingBonusDone(target, GetSpellInfo(), healAmount, HEAL, dispelInfo->GetRemovedCharges()); + healAmount = target->SpellHealingBonusTaken(caster, GetSpellInfo(), healAmount, HEAL, dispelInfo->GetRemovedCharges()); + target->CastCustomSpell(target, DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, NULL, GetCasterGUID()); + + // restore mana + int32 returnMana = CalculatePctU(caster->GetCreateMana(), GetSpellInfo()->ManaCostPercentage) * dispelInfo->GetRemovedCharges() / 2; + caster->CastCustomSpell(caster, DRUID_LIFEBLOOM_ENERGIZE, &returnMana, NULL, NULL, true, NULL, NULL, GetCasterGUID()); + return; + } + + target->CastCustomSpell(target, DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, NULL, GetCasterGUID()); + } + } + } + + void Register() + { + AfterEffectRemove += AuraEffectRemoveFn(spell_dru_lifebloom_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterDispel += AuraDispelFn(spell_dru_lifebloom_AuraScript::HandleDispel); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_lifebloom_AuraScript(); + } +}; + // 69366 - Moonkin Form passive class spell_dru_moonkin_form_passive : public SpellScriptLoader { @@ -132,6 +271,34 @@ class spell_dru_moonkin_form_passive : public SpellScriptLoader } }; +class spell_dru_predatory_strikes : public SpellScriptLoader +{ + public: + spell_dru_predatory_strikes() : SpellScriptLoader("spell_dru_predatory_strikes") { } + + class spell_dru_predatory_strikes_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_predatory_strikes_AuraScript); + + void UpdateAmount(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Player* target = GetTarget()->ToPlayer()) + target->UpdateAttackPowerAndDamage(); + } + + void Register() + { + AfterEffectApply += AuraEffectApplyFn(spell_dru_predatory_strikes_AuraScript::UpdateAmount, EFFECT_ALL, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); + AfterEffectRemove += AuraEffectRemoveFn(spell_dru_predatory_strikes_AuraScript::UpdateAmount, EFFECT_ALL, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_dru_predatory_strikes_AuraScript(); + } +}; + // 33851 - Primal Tenacity class spell_dru_primal_tenacity : public SpellScriptLoader { @@ -219,274 +386,6 @@ class spell_dru_savage_defense : public SpellScriptLoader } }; -class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader -{ - public: - spell_dru_t10_restoration_4p_bonus() : SpellScriptLoader("spell_dru_t10_restoration_4p_bonus") { } - - class spell_dru_t10_restoration_4p_bonus_SpellScript : public SpellScript - { - PrepareSpellScript(spell_dru_t10_restoration_4p_bonus_SpellScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void FilterTargets(std::list& targets) - { - if (!GetCaster()->ToPlayer()->GetGroup()) - { - targets.clear(); - targets.push_back(GetCaster()); - } - else - { - targets.remove(GetExplTargetUnit()); - std::list tempTargets; - for (std::list::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) - if ((*itr)->GetTypeId() == TYPEID_PLAYER && GetCaster()->IsInRaidWith((*itr)->ToUnit())) - tempTargets.push_back((*itr)->ToUnit()); - - if (tempTargets.empty()) - { - targets.clear(); - FinishCast(SPELL_FAILED_DONT_REPORT); - return; - } - - Unit* target = Trinity::Containers::SelectRandomContainerElement(tempTargets); - targets.clear(); - targets.push_back(target); - } - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_t10_restoration_4p_bonus_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dru_t10_restoration_4p_bonus_SpellScript(); - } -}; - -class spell_dru_starfall_aoe : public SpellScriptLoader -{ - public: - spell_dru_starfall_aoe() : SpellScriptLoader("spell_dru_starfall_aoe") { } - - class spell_dru_starfall_aoe_SpellScript : public SpellScript - { - PrepareSpellScript(spell_dru_starfall_aoe_SpellScript); - - void FilterTargets(std::list& targets) - { - targets.remove(GetExplTargetUnit()); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_starfall_aoe_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dru_starfall_aoe_SpellScript(); - } -}; - -// 40121 - Swift Flight Form (Passive) -class spell_dru_swift_flight_passive : public SpellScriptLoader -{ - public: - spell_dru_swift_flight_passive() : SpellScriptLoader("spell_dru_swift_flight_passive") { } - - class spell_dru_swift_flight_passive_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_swift_flight_passive_AuraScript); - - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - if (Player* caster = GetCaster()->ToPlayer()) - if (caster->Has310Flyer(false)) - amount = 310; - } - - void Register() - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_swift_flight_passive_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_swift_flight_passive_AuraScript(); - } -}; - -class spell_dru_starfall_dummy : public SpellScriptLoader -{ - public: - spell_dru_starfall_dummy() : SpellScriptLoader("spell_dru_starfall_dummy") { } - - class spell_dru_starfall_dummy_SpellScript : public SpellScript - { - PrepareSpellScript(spell_dru_starfall_dummy_SpellScript); - - void FilterTargets(std::list& targets) - { - Trinity::Containers::RandomResizeList(targets, 2); - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - // Shapeshifting into an animal form or mounting cancels the effect - if (caster->GetCreatureType() == CREATURE_TYPE_BEAST || caster->IsMounted()) - { - if (SpellInfo const* spellInfo = GetTriggeringSpell()) - caster->RemoveAurasDueToSpell(spellInfo->Id); - return; - } - - // Any effect which causes you to lose control of your character will supress the starfall effect. - if (caster->HasUnitState(UNIT_STATE_CONTROLLED)) - return; - - caster->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true); - } - - void Register() - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_starfall_dummy_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnEffectHitTarget += SpellEffectFn(spell_dru_starfall_dummy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_dru_starfall_dummy_SpellScript(); - } -}; - -class spell_dru_lifebloom : public SpellScriptLoader -{ - public: - spell_dru_lifebloom() : SpellScriptLoader("spell_dru_lifebloom") { } - - class spell_dru_lifebloom_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_lifebloom_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) - { - if (!sSpellMgr->GetSpellInfo(DRUID_LIFEBLOOM_FINAL_HEAL)) - return false; - if (!sSpellMgr->GetSpellInfo(DRUID_LIFEBLOOM_ENERGIZE)) - return false; - return true; - } - - void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - // Final heal only on duration end - if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) - return; - - // final heal - int32 stack = GetStackAmount(); - int32 healAmount = aurEff->GetAmount(); - if (Unit* caster = GetCaster()) - { - healAmount = caster->SpellHealingBonusDone(GetTarget(), GetSpellInfo(), healAmount, HEAL, stack); - healAmount = GetTarget()->SpellHealingBonusTaken(caster, GetSpellInfo(), healAmount, HEAL, stack); - - GetTarget()->CastCustomSpell(GetTarget(), DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, aurEff, GetCasterGUID()); - - // restore mana - int32 returnMana = CalculatePctU(caster->GetCreateMana(), GetSpellInfo()->ManaCostPercentage) * stack / 2; - caster->CastCustomSpell(caster, DRUID_LIFEBLOOM_ENERGIZE, &returnMana, NULL, NULL, true, NULL, aurEff, GetCasterGUID()); - return; - } - - GetTarget()->CastCustomSpell(GetTarget(), DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, aurEff, GetCasterGUID()); - } - - void HandleDispel(DispelInfo* dispelInfo) - { - if (Unit* target = GetUnitOwner()) - { - if (AuraEffect const* aurEff = GetEffect(EFFECT_1)) - { - // final heal - int32 healAmount = aurEff->GetAmount(); - if (Unit* caster = GetCaster()) - { - healAmount = caster->SpellHealingBonusDone(target, GetSpellInfo(), healAmount, HEAL, dispelInfo->GetRemovedCharges()); - healAmount = target->SpellHealingBonusTaken(caster, GetSpellInfo(), healAmount, HEAL, dispelInfo->GetRemovedCharges()); - target->CastCustomSpell(target, DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, NULL, GetCasterGUID()); - - // restore mana - int32 returnMana = CalculatePctU(caster->GetCreateMana(), GetSpellInfo()->ManaCostPercentage) * dispelInfo->GetRemovedCharges() / 2; - caster->CastCustomSpell(caster, DRUID_LIFEBLOOM_ENERGIZE, &returnMana, NULL, NULL, true, NULL, NULL, GetCasterGUID()); - return; - } - - target->CastCustomSpell(target, DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, NULL, GetCasterGUID()); - } - } - } - - void Register() - { - AfterEffectRemove += AuraEffectRemoveFn(spell_dru_lifebloom_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterDispel += AuraDispelFn(spell_dru_lifebloom_AuraScript::HandleDispel); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_lifebloom_AuraScript(); - } -}; - -class spell_dru_predatory_strikes : public SpellScriptLoader -{ - public: - spell_dru_predatory_strikes() : SpellScriptLoader("spell_dru_predatory_strikes") { } - - class spell_dru_predatory_strikes_AuraScript : public AuraScript - { - PrepareAuraScript(spell_dru_predatory_strikes_AuraScript); - - void UpdateAmount(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Player* target = GetTarget()->ToPlayer()) - target->UpdateAttackPowerAndDamage(); - } - - void Register() - { - AfterEffectApply += AuraEffectApplyFn(spell_dru_predatory_strikes_AuraScript::UpdateAmount, EFFECT_ALL, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); - AfterEffectRemove += AuraEffectRemoveFn(spell_dru_predatory_strikes_AuraScript::UpdateAmount, EFFECT_ALL, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK); - } - }; - - AuraScript* GetAuraScript() const - { - return new spell_dru_predatory_strikes_AuraScript(); - } -}; - class spell_dru_savage_roar : public SpellScriptLoader { public: @@ -551,6 +450,77 @@ class spell_dru_savage_roar : public SpellScriptLoader } }; +class spell_dru_starfall_aoe : public SpellScriptLoader +{ + public: + spell_dru_starfall_aoe() : SpellScriptLoader("spell_dru_starfall_aoe") { } + + class spell_dru_starfall_aoe_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dru_starfall_aoe_SpellScript); + + void FilterTargets(std::list& targets) + { + targets.remove(GetExplTargetUnit()); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_starfall_aoe_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dru_starfall_aoe_SpellScript(); + } +}; + +class spell_dru_starfall_dummy : public SpellScriptLoader +{ + public: + spell_dru_starfall_dummy() : SpellScriptLoader("spell_dru_starfall_dummy") { } + + class spell_dru_starfall_dummy_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dru_starfall_dummy_SpellScript); + + void FilterTargets(std::list& targets) + { + Trinity::Containers::RandomResizeList(targets, 2); + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + // Shapeshifting into an animal form or mounting cancels the effect + if (caster->GetCreatureType() == CREATURE_TYPE_BEAST || caster->IsMounted()) + { + if (SpellInfo const* spellInfo = GetTriggeringSpell()) + caster->RemoveAurasDueToSpell(spellInfo->Id); + return; + } + + // Any effect which causes you to lose control of your character will supress the starfall effect. + if (caster->HasUnitState(UNIT_STATE_CONTROLLED)) + return; + + caster->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true); + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_starfall_dummy_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_dru_starfall_dummy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dru_starfall_dummy_SpellScript(); + } +}; + class spell_dru_survival_instincts : public SpellScriptLoader { public: @@ -616,47 +586,136 @@ class spell_dru_survival_instincts : public SpellScriptLoader } }; -class spell_dru_insect_swarm : public SpellScriptLoader +// 40121 - Swift Flight Form (Passive) +class spell_dru_swift_flight_passive : public SpellScriptLoader { public: - spell_dru_insect_swarm() : SpellScriptLoader("spell_dru_insect_swarm") { } + spell_dru_swift_flight_passive() : SpellScriptLoader("spell_dru_swift_flight_passive") { } - class spell_dru_insect_swarm_AuraScript : public AuraScript + class spell_dru_swift_flight_passive_AuraScript : public AuraScript { - PrepareAuraScript(spell_dru_insect_swarm_AuraScript); + PrepareAuraScript(spell_dru_swift_flight_passive_AuraScript); - void CalculateAmount(AuraEffect const* aurEff, int32 & amount, bool & /*canBeRecalculated*/) + bool Load() { - if (Unit* caster = GetCaster()) - if (AuraEffect const* relicAurEff = caster->GetAuraEffect(SPELL_DRUID_ITEM_T8_BALANCE_RELIC, EFFECT_0)) - amount += relicAurEff->GetAmount() / aurEff->GetTotalTicks(); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) + { + if (Player* caster = GetCaster()->ToPlayer()) + if (caster->Has310Flyer(false)) + amount = 310; } void Register() { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_insect_swarm_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_swift_flight_passive_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED); } }; AuraScript* GetAuraScript() const { - return new spell_dru_insect_swarm_AuraScript(); + return new spell_dru_swift_flight_passive_AuraScript(); + } +}; + +class spell_dru_tiger_s_fury : public SpellScriptLoader +{ + public: + spell_dru_tiger_s_fury() : SpellScriptLoader("spell_dru_tiger_s_fury") { } + + class spell_dru_tiger_s_fury_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dru_tiger_s_fury_SpellScript); + + void OnHit() + { + if (AuraEffect const* aurEff = GetHitUnit()->GetAuraEffectOfRankedSpell(SPELL_KING_OF_THE_JUNGLE, EFFECT_1)) + GetHitUnit()->CastCustomSpell(SPELL_TIGER_S_FURY_ENERGIZE, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetHitUnit(), true); + } + + void Register() + { + AfterHit += SpellHitFn(spell_dru_tiger_s_fury_SpellScript::OnHit); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dru_tiger_s_fury_SpellScript(); + } +}; + +class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader +{ + public: + spell_dru_t10_restoration_4p_bonus() : SpellScriptLoader("spell_dru_t10_restoration_4p_bonus") { } + + class spell_dru_t10_restoration_4p_bonus_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dru_t10_restoration_4p_bonus_SpellScript); + + bool Load() + { + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } + + void FilterTargets(std::list& targets) + { + if (!GetCaster()->ToPlayer()->GetGroup()) + { + targets.clear(); + targets.push_back(GetCaster()); + } + else + { + targets.remove(GetExplTargetUnit()); + std::list tempTargets; + for (std::list::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) + if ((*itr)->GetTypeId() == TYPEID_PLAYER && GetCaster()->IsInRaidWith((*itr)->ToUnit())) + tempTargets.push_back((*itr)->ToUnit()); + + if (tempTargets.empty()) + { + targets.clear(); + FinishCast(SPELL_FAILED_DONT_REPORT); + return; + } + + Unit* target = Trinity::Containers::SelectRandomContainerElement(tempTargets); + targets.clear(); + targets.push_back(target); + } + } + + void Register() + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_t10_restoration_4p_bonus_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dru_t10_restoration_4p_bonus_SpellScript(); } }; void AddSC_druid_spell_scripts() { + new spell_dru_enrage(); new spell_dru_glyph_of_starfire(); + new spell_dru_insect_swarm(); + new spell_dru_lifebloom(); new spell_dru_moonkin_form_passive(); + new spell_dru_predatory_strikes(); new spell_dru_primal_tenacity(); new spell_dru_savage_defense(); - new spell_dru_t10_restoration_4p_bonus(); - new spell_dru_starfall_aoe(); - new spell_dru_swift_flight_passive(); - new spell_dru_starfall_dummy(); - new spell_dru_lifebloom(); - new spell_dru_predatory_strikes(); new spell_dru_savage_roar(); + new spell_dru_starfall_aoe(); + new spell_dru_starfall_dummy(); new spell_dru_survival_instincts(); - new spell_dru_insect_swarm(); + new spell_dru_swift_flight_passive(); + new spell_dru_tiger_s_fury(); + new spell_dru_t10_restoration_4p_bonus(); }