/* * Copyright (C) 2012-2017 CypherCore * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ using Framework.Constants; using Game.Entities; using Game.Scripting; using Game.Spells; using System; using System.Collections.Generic; using System.Linq; namespace Scripts.Spells.Druid { struct SpellIds { public const uint BalanceT10Bonus = 70718; public const uint BalanceT10BonusProc = 70721; public const uint BlessingOfTheClaw = 28750; public const uint BlessingOfTheRemulos = 40445; public const uint BlessingOfTheElune = 40446; public const uint BlessingOfTheCenarius = 40452; public const uint Exhilarate = 28742; public const uint FeralChargeBear = 16979; public const uint FeralChargeCat = 49376; public const uint FormsTrinketBear = 37340; public const uint FormsTrinketCat = 37341; public const uint FormsTrinketMoonkin = 37343; public const uint FormsTrinketNone = 37344; public const uint FormsTrinketTree = 37342; public const uint IdolOfFeralShadows = 34241; public const uint IdolOfWorship = 60774; public const uint Infusion = 37238; public const uint Languish = 71023; public const uint LifebloomEnergize = 64372; public const uint LifebloomFinalHeal = 33778; public const uint LivingSeedHeal = 48503; public const uint LivingSeedProc = 48504; public const uint MoonfireDamage = 164812; public const uint RejuvenationT10Proc = 70691; public const uint SavageRoar = 62071; public const uint StampedeBearRank1 = 81016; public const uint StampedeCatRank1 = 81021; public const uint StampedeCatState = 109881; public const uint SunfireDamage = 164815; public const uint SurvivalInstincts = 50322; } [Script] // 1850 - Dash public class spell_dru_dash : AuraScript { void CalculateAmount(AuraEffect aurEff, ref int amount, ref bool canBeRecalculated) { // do not set speed if not in cat form if (GetUnitOwner().GetShapeshiftForm() != ShapeShiftForm.CatForm) amount = 0; } public override void Register() { DoEffectCalcAmount.Add(new EffectCalcAmountHandler(CalculateAmount, 0, AuraType.ModIncreaseSpeed)); } } [Script] // 33943 - Flight Form class spell_dru_flight_form : SpellScript { SpellCastResult CheckCast() { Unit caster = GetCaster(); if (caster.IsInDisallowedMountForm()) return SpellCastResult.NotShapeshift; return SpellCastResult.SpellCastOk; } public override void Register() { OnCheckCast.Add(new CheckCastHandler(CheckCast)); } } [Script] // 37336 - Druid Forms Trinket class spell_dru_forms_trinket : AuraScript { public override bool Validate(SpellInfo spellInfo) { return ValidateSpellInfo(SpellIds.FormsTrinketBear, SpellIds.FormsTrinketCat, SpellIds.FormsTrinketMoonkin, SpellIds.FormsTrinketNone, SpellIds.FormsTrinketTree); } bool CheckProc(ProcEventInfo eventInfo) { Unit target = eventInfo.GetActor(); switch (target.GetShapeshiftForm()) { case ShapeShiftForm.BearForm: case ShapeShiftForm.DireBearForm: case ShapeShiftForm.CatForm: case ShapeShiftForm.MoonkinForm: case ShapeShiftForm.None: case ShapeShiftForm.TreeOfLife: return true; default: break; } return false; } void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo) { PreventDefaultAction(); Unit target = eventInfo.GetActor(); uint triggerspell = 0; switch (target.GetShapeshiftForm()) { case ShapeShiftForm.BearForm: case ShapeShiftForm.DireBearForm: triggerspell = SpellIds.FormsTrinketBear; break; case ShapeShiftForm.CatForm: triggerspell = SpellIds.FormsTrinketCat; break; case ShapeShiftForm.MoonkinForm: triggerspell = SpellIds.FormsTrinketMoonkin; break; case ShapeShiftForm.None: triggerspell = SpellIds.FormsTrinketNone; break; case ShapeShiftForm.TreeOfLife: triggerspell = SpellIds.FormsTrinketTree; break; default: return; } target.CastSpell(target, triggerspell, true, null, aurEff); } public override void Register() { DoCheckProc.Add(new CheckProcHandler(CheckProc)); OnEffectProc.Add(new EffectProcHandler(HandleProc, 0, AuraType.ProcTriggerSpell)); } } // 34246 - Idol of the Emerald Queen [Script] // 60779 - Idol of Lush Moss class spell_dru_idol_lifebloom : AuraScript { void HandleEffectCalcSpellMod(AuraEffect aurEff, ref SpellModifier spellMod) { if (spellMod == null) { spellMod = new SpellModifier(GetAura()); spellMod.op = SpellModOp.Dot; spellMod.type = SpellModType.Flat; spellMod.spellId = GetId(); spellMod.mask = GetSpellInfo().GetEffect(aurEff.GetEffIndex()).SpellClassMask; } spellMod.value = aurEff.GetAmount() / 7; } public override void Register() { DoEffectCalcSpellMod.Add(new EffectCalcSpellModHandler(HandleEffectCalcSpellMod, 0, AuraType.Dummy)); } } // 29166 - Innervate [Script] class spell_dru_innervate : AuraScript { void CalculateAmount(AuraEffect aurEff, ref int amount, ref bool canBeRecalculated) { Unit caster = GetCaster(); if (caster) amount = MathFunctions.CalculatePct(caster.GetCreatePowers(PowerType.Mana), amount) / aurEff.GetTotalTicks(); else amount = 0; } public override void Register() { DoEffectCalcAmount.Add(new EffectCalcAmountHandler(CalculateAmount, 0, AuraType.PeriodicEnergize)); } } // 33763 - Lifebloom [Script] class spell_dru_lifebloom : AuraScript { public override bool Validate(SpellInfo spell) { return ValidateSpellInfo(SpellIds.LifebloomFinalHeal, SpellIds.LifebloomEnergize); } void AfterRemove(AuraEffect aurEff, AuraEffectHandleModes mode) { // Final heal only on duration end if (GetTargetApplication().GetRemoveMode() != AuraRemoveMode.Expire) return; // final heal uint stack = GetStackAmount(); uint healAmount = (uint)aurEff.GetAmount(); Unit caster = GetCaster(); if (caster != null) { healAmount = caster.SpellHealingBonusDone(GetTarget(), GetSpellInfo(), healAmount, DamageEffectType.Heal, aurEff.GetSpellEffectInfo(), stack); healAmount = GetTarget().SpellHealingBonusTaken(caster, GetSpellInfo(), healAmount, DamageEffectType.Heal, aurEff.GetSpellEffectInfo(), stack); GetTarget().CastCustomSpell(GetTarget(), SpellIds.LifebloomFinalHeal, (int)healAmount, 0, 0, true, null, aurEff, GetCasterGUID()); // restore mana var costs = GetSpellInfo().CalcPowerCost(caster, GetSpellInfo().GetSchoolMask()); var m = costs.Find(cost => cost.Power == PowerType.Mana); if (m != null) { int returnMana = m.Amount * (int)stack / 2; caster.CastCustomSpell(caster, SpellIds.LifebloomEnergize, returnMana, 0, 0, true, null, aurEff, GetCasterGUID()); } return; } GetTarget().CastCustomSpell(GetTarget(), SpellIds.LifebloomFinalHeal, (int)healAmount, 0, 0, true, null, aurEff, GetCasterGUID()); } void HandleDispel(DispelInfo dispelInfo) { Unit target = GetUnitOwner(); if (target != null) { AuraEffect aurEff = GetEffect(1); if (aurEff != null) { // final heal uint healAmount = (uint)aurEff.GetAmount(); Unit caster = GetCaster(); if (caster != null) { healAmount = caster.SpellHealingBonusDone(target, GetSpellInfo(), healAmount, DamageEffectType.Heal, aurEff.GetSpellEffectInfo(), dispelInfo.GetRemovedCharges()); healAmount = target.SpellHealingBonusTaken(caster, GetSpellInfo(), healAmount, DamageEffectType.Heal, aurEff.GetSpellEffectInfo(), dispelInfo.GetRemovedCharges()); target.CastCustomSpell(target, SpellIds.LifebloomFinalHeal, (int)healAmount, 0, 0, true, null, null, GetCasterGUID()); // restore mana var costs = GetSpellInfo().CalcPowerCost(caster, GetSpellInfo().GetSchoolMask()); var m = costs.Find(cost => cost.Power == PowerType.Mana); if (m != null) { int returnMana = m.Amount * dispelInfo.GetRemovedCharges() / 2; caster.CastCustomSpell(caster, SpellIds.LifebloomEnergize, returnMana, 0, 0, true, null, null, GetCasterGUID()); } return; } target.CastCustomSpell(target, SpellIds.LifebloomFinalHeal, (int)healAmount, 0, 0, true, null, null, GetCasterGUID()); } } } public override void Register() { AfterEffectRemove.Add(new EffectApplyHandler(AfterRemove, 1, AuraType.Dummy, AuraEffectHandleModes.Real)); AfterDispel.Add(new AuraDispelHandler(HandleDispel)); } } // 48496 - Living Seed [Script] class spell_dru_living_seed : AuraScript { public override bool Validate(SpellInfo spellInfo) { return ValidateSpellInfo(SpellIds.LivingSeedProc); } void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo) { PreventDefaultAction(); int amount = (int)MathFunctions.CalculatePct(eventInfo.GetHealInfo().GetHeal(), aurEff.GetAmount()); GetTarget().CastCustomSpell(SpellIds.LivingSeedProc, SpellValueMod.BasePoint0, amount, eventInfo.GetProcTarget(), true, null, aurEff); } public override void Register() { OnEffectProc.Add(new EffectProcHandler(HandleProc, 0, AuraType.Dummy)); } } // 48504 - Living Seed (Proc) [Script] class spell_dru_living_seed_proc : AuraScript { public override bool Validate(SpellInfo spellInfo) { return ValidateSpellInfo(SpellIds.LivingSeedHeal); } void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo) { PreventDefaultAction(); GetTarget().CastCustomSpell(SpellIds.LivingSeedHeal, SpellValueMod.BasePoint0, aurEff.GetAmount(), GetTarget(), true, null, aurEff); } public override void Register() { OnEffectProc.Add(new EffectProcHandler(HandleProc, 0, AuraType.Dummy)); } } [Script] // 8921 - Moonfire class spell_dru_moonfire : SpellScript { void HandleOnHit(uint effIndex) { GetCaster().CastSpell(GetHitUnit(), SpellIds.MoonfireDamage, true); } public override void Register() { OnEffectHitTarget.Add(new EffectHandler(HandleOnHit, 0, SpellEffectName.Dummy)); } } // 16972 - Predatory Strikes [Script] class spell_dru_predatory_strikes : AuraScript { void UpdateAmount(AuraEffect aurEff, AuraEffectHandleModes mode) { Player target = GetTarget().ToPlayer(); if (target != null) target.UpdateAttackPowerAndDamage(); } public override void Register() { AfterEffectApply.Add(new EffectApplyHandler(UpdateAmount, SpellConst.EffectAll, AuraType.Dummy, AuraEffectHandleModes.ChangeAmountMask)); AfterEffectRemove.Add(new EffectApplyHandler(UpdateAmount, SpellConst.EffectAll, AuraType.Dummy, AuraEffectHandleModes.ChangeAmountMask)); } } // 1079 - Rip [Script] class spell_dru_rip : AuraScript { public override bool Load() { Unit caster = GetCaster(); return caster != null && caster.IsTypeId(TypeId.Player); } void CalculateAmount(AuraEffect aurEff, ref int amount, ref bool canBeRecalculated) { canBeRecalculated = false; Unit caster = GetCaster(); if (caster != null) { // 0.01 * $AP * cp byte cp = caster.ToPlayer().GetComboPoints(); // Idol of Feral Shadows. Can't be handled as SpellMod due its dependency from CPs AuraEffect idol = caster.GetAuraEffect(SpellIds.IdolOfFeralShadows, 0); if (idol != null) amount += cp * idol.GetAmount(); // Idol of Worship. Can't be handled as SpellMod due its dependency from CPs else if ((idol = caster.GetAuraEffect(SpellIds.IdolOfWorship, 0)) != null) amount += cp * idol.GetAmount(); amount += (int)MathFunctions.CalculatePct(caster.GetTotalAttackPowerValue(WeaponAttackType.BaseAttack), cp); } } public override void Register() { DoEffectCalcAmount.Add(new EffectCalcAmountHandler(CalculateAmount, 0, AuraType.PeriodicDamage)); } } [Script] // 16864 - Omen of Clarity class spell_dru_omen_of_clarity : AuraScript { public override bool Validate(SpellInfo spellInfo) { return ValidateSpellInfo(SpellIds.BalanceT10Bonus, SpellIds.BalanceT10BonusProc); } void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo) { Unit target = GetTarget(); if (target.HasAura(SpellIds.BalanceT10Bonus)) target.CastSpell((Unit)null, SpellIds.BalanceT10BonusProc, true, null); } public override void Register() { OnEffectProc.Add(new EffectProcHandler(HandleProc, 0, AuraType.ProcTriggerSpell)); } } // 52610 - Savage Roar [Script] class spell_dru_savage_roar : SpellScript { SpellCastResult CheckCast() { Unit caster = GetCaster(); if (caster.GetShapeshiftForm() != ShapeShiftForm.CatForm) return SpellCastResult.OnlyShapeshift; return SpellCastResult.SpellCastOk; } public override void Register() { OnCheckCast.Add(new CheckCastHandler(CheckCast)); } } [Script] class spell_dru_savage_roar_AuraScript : AuraScript { public override bool Validate(SpellInfo spellInfo) { return ValidateSpellInfo(SpellIds.SavageRoar); } void AfterApply(AuraEffect aurEff, AuraEffectHandleModes mode) { Unit target = GetTarget(); target.CastSpell(target, SpellIds.SavageRoar, true, null, aurEff, GetCasterGUID()); } void AfterRemove(AuraEffect aurEff, AuraEffectHandleModes mode) { GetTarget().RemoveAurasDueToSpell(SpellIds.SavageRoar); } public override void Register() { AfterEffectApply.Add(new EffectApplyHandler(AfterApply, 1, AuraType.Dummy, AuraEffectHandleModes.Real)); AfterEffectRemove.Add(new EffectApplyHandler(AfterRemove, 1, AuraType.Dummy, AuraEffectHandleModes.Real)); } } [Script] // 78892 - Stampede class spell_dru_stampede : AuraScript { public override bool Validate(SpellInfo spellInfo) { return ValidateSpellInfo(SpellIds.StampedeBearRank1, SpellIds.StampedeCatRank1, SpellIds.StampedeCatState, SpellIds.FeralChargeCat, SpellIds.FeralChargeBear); } void HandleEffectCatProc(AuraEffect aurEff, ProcEventInfo eventInfo) { PreventDefaultAction(); if (GetTarget().GetShapeshiftForm() != ShapeShiftForm.CatForm || eventInfo.GetDamageInfo().GetSpellInfo().Id != SpellIds.FeralChargeCat) return; GetTarget().CastSpell(GetTarget(), Global.SpellMgr.GetSpellWithRank(SpellIds.StampedeCatRank1, GetSpellInfo().GetRank()), true, null, aurEff); GetTarget().CastSpell(GetTarget(), SpellIds.StampedeCatState, true, null, aurEff); } void HandleEffectBearProc(AuraEffect aurEff, ProcEventInfo eventInfo) { PreventDefaultAction(); if (GetTarget().GetShapeshiftForm() != ShapeShiftForm.BearForm || eventInfo.GetDamageInfo().GetSpellInfo().Id != SpellIds.FeralChargeBear) return; GetTarget().CastSpell(GetTarget(), Global.SpellMgr.GetSpellWithRank(SpellIds.StampedeBearRank1, GetSpellInfo().GetRank()), true, null, aurEff); } public override void Register() { OnEffectProc.Add(new EffectProcHandler(HandleEffectCatProc, 0, AuraType.Dummy)); OnEffectProc.Add(new EffectProcHandler(HandleEffectBearProc, 1, AuraType.Dummy)); } } // 50286 - Starfall (Dummy) [Script] class spell_dru_starfall_dummy : SpellScript { void FilterTargets(List targets) { targets.Resize(2); } void HandleDummy(uint effIndex) { Unit caster = GetCaster(); // Shapeshifting into an animal form or mounting cancels the effect if (caster.GetCreatureType() == CreatureType.Beast || caster.IsMounted()) { SpellInfo spellInfo = GetTriggeringSpell(); if (spellInfo != null) caster.RemoveAurasDueToSpell(spellInfo.Id); return; } // Any effect which causes you to lose control of your character will supress the starfall effect. if (caster.HasUnitState(UnitState.Controlled)) return; caster.CastSpell(GetHitUnit(), (uint)GetEffectValue(), true); } public override void Register() { OnObjectAreaTargetSelect.Add(new ObjectAreaTargetSelectHandler(FilterTargets, 0, Targets.UnitSrcAreaEnemy)); OnEffectHitTarget.Add(new EffectHandler(HandleDummy, 0, SpellEffectName.Dummy)); } } [Script] // 93402 - Sunfire class spell_dru_sunfire : SpellScript { void HandleOnHit(uint effIndex) { GetCaster().CastSpell(GetHitUnit(), SpellIds.SunfireDamage, true); } public override void Register() { OnEffectHitTarget.Add(new EffectHandler(HandleOnHit, 0, SpellEffectName.Dummy)); } } // 61336 - Survival Instincts [Script] class spell_dru_survival_instincts : SpellScript { SpellCastResult CheckCast() { Unit caster = GetCaster(); if (!caster.IsInFeralForm()) return SpellCastResult.OnlyShapeshift; return SpellCastResult.SpellCastOk; } public override void Register() { OnCheckCast.Add(new CheckCastHandler(CheckCast)); } } [Script] class spell_dru_survival_instincts_AuraScript : AuraScript { public override bool Validate(SpellInfo spell) { return ValidateSpellInfo(SpellIds.SurvivalInstincts); } void AfterApply(AuraEffect aurEff, AuraEffectHandleModes mode) { Unit target = GetTarget(); int bp0 = (int)target.CountPctFromMaxHealth(aurEff.GetAmount()); target.CastCustomSpell(target, SpellIds.SurvivalInstincts, bp0, 0, 0, true); } void AfterRemove(AuraEffect aurEff, AuraEffectHandleModes mode) { GetTarget().RemoveAurasDueToSpell(SpellIds.SurvivalInstincts); } public override void Register() { AfterEffectApply.Add(new EffectApplyHandler(AfterApply, 0, AuraType.Dummy, AuraEffectHandleModes.ChangeAmountMask)); AfterEffectRemove.Add(new EffectApplyHandler(AfterRemove, 0, AuraType.Dummy, AuraEffectHandleModes.ChangeAmountMask)); } } // 40121 - Swift Flight Form (Passive) [Script] class spell_dru_swift_flight_passive : AuraScript { public override bool Load() { return GetCaster().IsTypeId(TypeId.Player); } void CalculateAmount(AuraEffect aurEff, ref int amount, ref bool canBeRecalculated) { Player caster = GetCaster().ToPlayer(); if (caster != null) if (caster.GetSkillValue(SkillType.Riding) >= 375) amount = 310; } public override void Register() { DoEffectCalcAmount.Add(new EffectCalcAmountHandler(CalculateAmount, 1, AuraType.ModIncreaseVehicleFlightSpeed)); } } [Script] // 28744 - Regrowth class spell_dru_t3_6p_bonus : AuraScript { public override bool Validate(SpellInfo spellInfo) { return ValidateSpellInfo(SpellIds.BlessingOfTheClaw); } void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo) { PreventDefaultAction(); eventInfo.GetActor().CastSpell(eventInfo.GetProcTarget(), SpellIds.BlessingOfTheClaw, true); } public override void Register() { OnEffectProc.Add(new EffectProcHandler(HandleProc, 0, AuraType.OverrideClassScripts)); } } [Script] // 28719 - Healing Touch class spell_dru_t3_8p_bonus : AuraScript { public override bool Validate(SpellInfo spellInfo) { return ValidateSpellInfo(SpellIds.Exhilarate); } void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo) { PreventDefaultAction(); Spell spell = eventInfo.GetProcSpell(); if (spell == null) return; Unit caster = eventInfo.GetActor(); var costs = spell.GetPowerCost(); var m = costs.First(cost => { return cost.Power == PowerType.Mana; }); if (m == null) return; int amount = MathFunctions.CalculatePct(m.Amount, aurEff.GetAmount()); caster.CastCustomSpell(SpellIds.Exhilarate, SpellValueMod.BasePoint0, amount, (Unit)null, true); } public override void Register() { OnEffectProc.Add(new EffectProcHandler(HandleProc, 0, AuraType.Dummy)); } } // 37288 - Mana Restore [Script] // 37295 - Mana Restore class spell_dru_t4_2p_bonus : AuraScript { public override bool Validate(SpellInfo spellInfo) { return ValidateSpellInfo(SpellIds.Infusion); } void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo) { PreventDefaultAction(); eventInfo.GetActor().CastSpell((Unit)null, SpellIds.Infusion, true); } public override void Register() { OnEffectProc.Add(new EffectProcHandler(HandleProc, 0, AuraType.Dummy)); } } [Script] // 40442 - Druid Tier 6 Trinket class spell_dru_item_t6_trinket : AuraScript { public override bool Validate(SpellInfo spellInfo) { return ValidateSpellInfo(SpellIds.BlessingOfTheRemulos, SpellIds.BlessingOfTheElune, SpellIds.BlessingOfTheCenarius); } void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo) { PreventDefaultAction(); SpellInfo spellInfo = eventInfo.GetSpellInfo(); if (spellInfo == null) return; uint spellId; int chance; // Starfire if (spellInfo.SpellFamilyFlags[0].HasAnyFlag(0x00000004u)) { spellId = SpellIds.BlessingOfTheRemulos; chance = 25; } // Rejuvenation else if (spellInfo.SpellFamilyFlags[0].HasAnyFlag(0x00000010u)) { spellId = SpellIds.BlessingOfTheElune; chance = 25; } // Mangle (Bear) and Mangle (Cat) else if (spellInfo.SpellFamilyFlags[1].HasAnyFlag(0x00000440u)) { spellId = SpellIds.BlessingOfTheCenarius; chance = 40; } else return; if (RandomHelper.randChance(chance)) eventInfo.GetActor().CastSpell((Unit)null, spellId, true); } public override void Register() { OnEffectProc.Add(new EffectProcHandler(HandleProc, 0, AuraType.Dummy)); } } [Script] // 70723 - Item - Druid T10 Balance 4P Bonus class spell_dru_t10_balance_4p_bonus : AuraScript { public override bool Validate(SpellInfo spellInfo) { return ValidateSpellInfo(SpellIds.Languish); } void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo) { PreventDefaultAction(); DamageInfo damageInfo = eventInfo.GetDamageInfo(); if (damageInfo == null || damageInfo.GetDamage() == 0) return; Unit caster = eventInfo.GetActor(); Unit target = eventInfo.GetProcTarget(); SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(SpellIds.Languish); int amount = (int)MathFunctions.CalculatePct(damageInfo.GetDamage(), aurEff.GetAmount()); amount /= (int)spellInfo.GetMaxTicks(Difficulty.None); // Add remaining ticks to damage done amount += (int)target.GetRemainingPeriodicAmount(caster.GetGUID(), SpellIds.Languish, AuraType.PeriodicDamage); caster.CastCustomSpell(SpellIds.Languish, SpellValueMod.BasePoint0, amount, target, true); } public override void Register() { OnEffectProc.Add(new EffectProcHandler(HandleProc, 0, AuraType.Dummy)); } } // 70691 - Item T10 Restoration 4P Bonus [Script] class spell_dru_t10_restoration_4p_bonus : SpellScript { public override bool Load() { return GetCaster().IsTypeId(TypeId.Player); } void FilterTargets(List targets) { if (GetCaster().ToPlayer().GetGroup() == null) { targets.Clear(); targets.Add(GetCaster()); } else { targets.Remove(GetExplTargetUnit()); List tempTargets = new List(); foreach (var obj in targets) if (obj.IsTypeId(TypeId.Player) && GetCaster().IsInRaidWith(obj.ToUnit())) tempTargets.Add(obj.ToUnit()); if (tempTargets.Empty()) { targets.Clear(); FinishCast(SpellCastResult.DontReport); return; } Unit target = tempTargets.SelectRandom(); targets.Clear(); targets.Add(target); } } public override void Register() { OnObjectAreaTargetSelect.Add(new ObjectAreaTargetSelectHandler(FilterTargets, 0, Targets.UnitDestAreaAlly)); } } [Script] // 70664 - Druid T10 Restoration 4P Bonus (Rejuvenation) class spell_dru_t10_restoration_4p_bonus_dummy : AuraScript { public override bool Validate(SpellInfo spellInfo) { return ValidateSpellInfo(SpellIds.RejuvenationT10Proc); } bool CheckProc(ProcEventInfo eventInfo) { SpellInfo spellInfo = eventInfo.GetSpellInfo(); if (spellInfo == null || spellInfo.Id == SpellIds.RejuvenationT10Proc) return false; HealInfo healInfo = eventInfo.GetHealInfo(); if (healInfo == null || healInfo.GetHeal() == 0) return false; Player caster = eventInfo.GetActor().ToPlayer(); if (!caster) return false; return caster.GetGroup() || caster != eventInfo.GetProcTarget(); } void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo) { PreventDefaultAction(); int amount = (int)eventInfo.GetHealInfo().GetHeal(); eventInfo.GetActor().CastCustomSpell(SpellIds.RejuvenationT10Proc, SpellValueMod.BasePoint0, amount, (Unit)null, true); } public override void Register() { DoCheckProc.Add(new CheckProcHandler(CheckProc)); OnEffectProc.Add(new EffectProcHandler(HandleProc, 0, AuraType.Dummy)); } } [Script] // 48438 - Wild Growth class spell_dru_wild_growth : SpellScript { public override bool Validate(SpellInfo spellInfo) { SpellEffectInfo effect2 = spellInfo.GetEffect(2); if (effect2 == null || effect2.IsEffect() || effect2.CalcValue() <= 0) return false; return true; } void FilterTargets(List targets) { targets.RemoveAll(obj => { Unit target = obj.ToUnit(); if (target) return !GetCaster().IsInRaidWith(target); return true; }); int maxTargets = GetSpellInfo().GetEffect(2).CalcValue(GetCaster()); if (targets.Count > maxTargets) { targets.Sort(new HealthPctOrderPred()); targets.RemoveRange(maxTargets, targets.Count - maxTargets); } _targets = targets; } void SetTargets(List targets) { targets.Clear(); targets.AddRange(_targets); } public override void Register() { OnObjectAreaTargetSelect.Add(new ObjectAreaTargetSelectHandler(FilterTargets, 0, Targets.UnitDestAreaAlly)); OnObjectAreaTargetSelect.Add(new ObjectAreaTargetSelectHandler(SetTargets, 1, Targets.UnitDestAreaAlly)); } List _targets; } }