Core/Spells: Add a helper function to sort spell targets based on custom scripted sorting rules
Port From (https://github.com/TrinityCore/TrinityCore/commit/2e3f3fda3fc533daa4064739b633dbb28f5115d3)
This commit is contained in:
@@ -1127,6 +1127,71 @@ namespace Game.Scripting
|
|||||||
targets.AddRange(tempTargets.Select(pair => pair.Item1));
|
targets.AddRange(tempTargets.Select(pair => pair.Item1));
|
||||||
targets.Resize(maxTargets);
|
targets.Resize(maxTargets);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<PriorityRules> CreatePriorityRules(List<PriorityRules> rules) { return rules; }
|
||||||
|
|
||||||
|
public void SortTargetsWithPriorityRules(List<WorldObject> targets, int maxTargets, List<PriorityRules> rules)
|
||||||
|
{
|
||||||
|
if (targets.Count <= maxTargets)
|
||||||
|
return;
|
||||||
|
|
||||||
|
List<(WorldObject, int)> prioritizedTargets = new();
|
||||||
|
|
||||||
|
// score each target based on how many rules they satisfy.
|
||||||
|
foreach (WorldObject obj in targets)
|
||||||
|
{
|
||||||
|
Unit unit = obj?.ToUnit();
|
||||||
|
if (unit == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int score = 0;
|
||||||
|
|
||||||
|
foreach (PriorityRules rule in rules)
|
||||||
|
{
|
||||||
|
if (rule.condition(unit))
|
||||||
|
score += rule.weight;
|
||||||
|
}
|
||||||
|
|
||||||
|
prioritizedTargets.Add((obj, score));
|
||||||
|
}
|
||||||
|
|
||||||
|
// the higher the value, the higher the priority is.
|
||||||
|
prioritizedTargets.Sort((left, right) => left.Item2.CompareTo(right.Item2));
|
||||||
|
|
||||||
|
int cutOff = Math.Min(maxTargets, prioritizedTargets.Count);
|
||||||
|
|
||||||
|
// if there are ties at the cutoff, shuffle them to avoid selection bias.
|
||||||
|
if (cutOff < prioritizedTargets.Count)
|
||||||
|
{
|
||||||
|
int tieScore = prioritizedTargets[cutOff - 1].Item2;
|
||||||
|
|
||||||
|
bool isTieScore((WorldObject, int) entry) { return entry.Item2 == tieScore; }
|
||||||
|
|
||||||
|
// scan backwards to include tied entries before the cutoff.
|
||||||
|
int tieStart = (cutOff - 1);
|
||||||
|
while (tieStart > 0 && isTieScore(prioritizedTargets[tieStart - 1]))
|
||||||
|
--tieStart;
|
||||||
|
|
||||||
|
// scan forward to include tied entries after the cutoff.
|
||||||
|
int tieEnd = cutOff;
|
||||||
|
while (tieEnd < prioritizedTargets.Count && isTieScore(prioritizedTargets[tieEnd]))
|
||||||
|
++tieEnd;
|
||||||
|
|
||||||
|
// shuffle only the tied range to randomize final selection.
|
||||||
|
prioritizedTargets.RandomShuffle(tieStart, tieStart - tieEnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
targets.Clear();
|
||||||
|
|
||||||
|
for (int i = 0; i < cutOff; ++i)
|
||||||
|
targets.Add(prioritizedTargets[i].Item1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct PriorityRules
|
||||||
|
{
|
||||||
|
public int weight;
|
||||||
|
public Func<Unit, bool> condition;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class AuraScript : SpellScriptBase
|
public class AuraScript : SpellScriptBase
|
||||||
|
|||||||
@@ -340,12 +340,12 @@ class spell_dk_crimson_scourge : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.BloodPlague, SpellIds.CrimsonScourgeBuff, SpellIds.DeathAndDecay);
|
return ValidateSpellInfo(SpellIds.BloodPlague, SpellIds.CrimsonScourgeBuff, SpellIds.DeathAndDecay);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(AuraEffect aurEff, ProcEventInfo procInfo)
|
bool CheckProc(AuraEffect aurEff, ProcEventInfo procInfo)
|
||||||
{
|
{
|
||||||
return procInfo.GetProcTarget().HasAura(SpellIds.BloodPlague, procInfo.GetActor().GetGUID());
|
return procInfo.GetProcTarget().HasAura(SpellIds.BloodPlague, procInfo.GetActor().GetGUID());
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
Unit actor = eventInfo.GetActor();
|
Unit actor = eventInfo.GetActor();
|
||||||
actor.GetSpellHistory().RestoreCharge(Global.SpellMgr.GetSpellInfo(SpellIds.DeathAndDecay, Difficulty.None).ChargeCategoryId);
|
actor.GetSpellHistory().RestoreCharge(Global.SpellMgr.GetSpellInfo(SpellIds.DeathAndDecay, Difficulty.None).ChargeCategoryId);
|
||||||
|
|||||||
@@ -697,7 +697,6 @@ class spell_dru_efflorescence_heal : SpellScript
|
|||||||
{
|
{
|
||||||
void FilterTargets(List<WorldObject> targets)
|
void FilterTargets(List<WorldObject> targets)
|
||||||
{
|
{
|
||||||
// Efflorescence became a smart heal which prioritizes players and their pets in their group before any unit outside their group.
|
|
||||||
SelectRandomInjuredTargets(targets, 3, true, GetCaster());
|
SelectRandomInjuredTargets(targets, 3, true, GetCaster());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1316,7 +1315,7 @@ class spell_dru_luxuriant_soil : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.Rejuvenation);
|
return ValidateSpellInfo(SpellIds.Rejuvenation);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
bool CheckProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
return RandomHelper.randChance(aurEff.GetAmount());
|
return RandomHelper.randChance(aurEff.GetAmount());
|
||||||
}
|
}
|
||||||
@@ -1520,12 +1519,12 @@ class spell_dru_power_of_the_archdruid : AuraScript
|
|||||||
return ValidateSpellEffect((SpellIds.PowerOfTheArchdruid, 0));
|
return ValidateSpellEffect((SpellIds.PowerOfTheArchdruid, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
bool CheckProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
return eventInfo.GetActor().HasAuraEffect(SpellIds.PowerOfTheArchdruid, 0);
|
return eventInfo.GetActor().HasAuraEffect(SpellIds.PowerOfTheArchdruid, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
Unit druid = eventInfo.GetActor();
|
Unit druid = eventInfo.GetActor();
|
||||||
Unit procTarget = eventInfo.GetActionTarget();
|
Unit procTarget = eventInfo.GetActionTarget();
|
||||||
@@ -1700,7 +1699,7 @@ class spell_dru_shooting_stars : AuraScript
|
|||||||
ProcessDoT(aurEff, caster, sunfires);
|
ProcessDoT(aurEff, caster, sunfires);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ProcessDoT(AuraEffect aurEff, Unit caster, List<Unit> targets)
|
void ProcessDoT(AuraEffect aurEff, Unit caster, List<Unit> targets)
|
||||||
{
|
{
|
||||||
if (targets.Empty())
|
if (targets.Empty())
|
||||||
return;
|
return;
|
||||||
@@ -1723,7 +1722,6 @@ class spell_dru_shooting_stars : AuraScript
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public override void Register()
|
public override void Register()
|
||||||
{
|
{
|
||||||
OnEffectPeriodic.Add(new(OnTick, 0, AuraType.PeriodicDummy));
|
OnEffectPeriodic.Add(new(OnTick, 0, AuraType.PeriodicDummy));
|
||||||
@@ -2361,7 +2359,7 @@ class spell_dru_umbral_embrace : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.EclipseLunarAura, SpellIds.EclipseSolarAura);
|
return ValidateSpellInfo(SpellIds.EclipseLunarAura, SpellIds.EclipseSolarAura);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckEclipse(ProcEventInfo eventInfo)
|
bool CheckEclipse(ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
return eventInfo.GetActor().HasAura(SpellIds.EclipseLunarAura) || eventInfo.GetActor().HasAura(SpellIds.EclipseSolarAura);
|
return eventInfo.GetActor().HasAura(SpellIds.EclipseLunarAura) || eventInfo.GetActor().HasAura(SpellIds.EclipseSolarAura);
|
||||||
}
|
}
|
||||||
@@ -2437,7 +2435,7 @@ class spell_dru_ursocs_fury : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.UrsocsFuryShield);
|
return ValidateSpellInfo(SpellIds.UrsocsFuryShield);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
DamageInfo damageInfo = eventInfo.GetDamageInfo();
|
DamageInfo damageInfo = eventInfo.GetDamageInfo();
|
||||||
if (damageInfo == null || damageInfo.GetDamage() == 0)
|
if (damageInfo == null || damageInfo.GetDamage() == 0)
|
||||||
|
|||||||
@@ -141,12 +141,12 @@ class spell_evo_burnout : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.Burnout);
|
return ValidateSpellInfo(SpellIds.Burnout);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
bool CheckProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
return RandomHelper.randChance(aurEff.GetAmount());
|
return RandomHelper.randChance(aurEff.GetAmount());
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
eventInfo.GetActor().CastSpell(eventInfo.GetActor(), SpellIds.Burnout, TriggerCastFlags.IgnoreCastInProgress | TriggerCastFlags.DontReportCastError);
|
eventInfo.GetActor().CastSpell(eventInfo.GetActor(), SpellIds.Burnout, TriggerCastFlags.IgnoreCastInProgress | TriggerCastFlags.DontReportCastError);
|
||||||
}
|
}
|
||||||
@@ -583,7 +583,6 @@ class spell_evo_pyre : SpellScript
|
|||||||
GetCaster().CastSpell(GetHitUnit().GetPosition(), SpellIds.PyreDamage, true);
|
GetCaster().CastSpell(GetHitUnit().GetPosition(), SpellIds.PyreDamage, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public override void Register()
|
public override void Register()
|
||||||
{
|
{
|
||||||
OnEffectHitTarget.Add(new(HandleDamage, 0, SpellEffectName.Dummy));
|
OnEffectHitTarget.Add(new(HandleDamage, 0, SpellEffectName.Dummy));
|
||||||
@@ -607,8 +606,7 @@ class spell_evo_ruby_embers : SpellScript
|
|||||||
return !GetCaster().HasAura(SpellIds.RubyEmbers);
|
return !GetCaster().HasAura(SpellIds.RubyEmbers);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PreventPeriodic(ref WorldObject target)
|
||||||
static void PreventPeriodic(ref WorldObject target)
|
|
||||||
{
|
{
|
||||||
target = null;
|
target = null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -161,7 +161,7 @@ class spell_hun_aspect_of_the_fox : SpellScript
|
|||||||
return !GetCaster().HasAura(SpellIds.AspectOfTheFox);
|
return !GetCaster().HasAura(SpellIds.AspectOfTheFox);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HandleCastWhileWalking(ref WorldObject target)
|
void HandleCastWhileWalking(ref WorldObject target)
|
||||||
{
|
{
|
||||||
target = null;
|
target = null;
|
||||||
}
|
}
|
||||||
@@ -290,7 +290,7 @@ class at_hun_binding_shot(AreaTrigger areaTrigger) : AreaTriggerAI(areaTrigger)
|
|||||||
[Script] // 204089 - Bullseye
|
[Script] // 204089 - Bullseye
|
||||||
class spell_hun_bullseye : AuraScript
|
class spell_hun_bullseye : AuraScript
|
||||||
{
|
{
|
||||||
static bool CheckEffectProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
bool CheckEffectProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
return eventInfo.GetActionTarget().HealthBelowPct(aurEff.GetAmount());
|
return eventInfo.GetActionTarget().HealthBelowPct(aurEff.GetAmount());
|
||||||
}
|
}
|
||||||
@@ -618,12 +618,12 @@ class spell_hun_manhunter : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.GreviousInjury);
|
return ValidateSpellInfo(SpellIds.GreviousInjury);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(ProcEventInfo eventInfo)
|
bool CheckProc(ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
return eventInfo.GetProcTarget().IsPlayer();
|
return eventInfo.GetProcTarget().IsPlayer();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HandleEffectProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
void HandleEffectProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
eventInfo.GetActor().CastSpell(eventInfo.GetActionTarget(), SpellIds.GreviousInjury, new CastSpellExtraArgs()
|
eventInfo.GetActor().CastSpell(eventInfo.GetActionTarget(), SpellIds.GreviousInjury, new CastSpellExtraArgs()
|
||||||
{
|
{
|
||||||
@@ -647,7 +647,7 @@ class spell_hun_master_marksman : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.MasterMarksman);
|
return ValidateSpellInfo(SpellIds.MasterMarksman);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
uint ticks = Global.SpellMgr.GetSpellInfo(SpellIds.MasterMarksman, Difficulty.None).GetMaxTicks();
|
uint ticks = Global.SpellMgr.GetSpellInfo(SpellIds.MasterMarksman, Difficulty.None).GetMaxTicks();
|
||||||
if (ticks == 0)
|
if (ticks == 0)
|
||||||
@@ -1059,7 +1059,7 @@ class spell_hun_scouts_instincts : SpellScript
|
|||||||
return !GetCaster().HasAura(SpellIds.ScoutsInstincts);
|
return !GetCaster().HasAura(SpellIds.ScoutsInstincts);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HandleMinSpeed(ref WorldObject target)
|
void HandleMinSpeed(ref WorldObject target)
|
||||||
{
|
{
|
||||||
target = null;
|
target = null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1143,7 +1143,7 @@ class spell_mage_improved_scorch : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.ImprovedScorch);
|
return ValidateSpellInfo(SpellIds.ImprovedScorch);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
bool CheckProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
return eventInfo.GetProcTarget().HealthBelowPct(aurEff.GetAmount());
|
return eventInfo.GetProcTarget().HealthBelowPct(aurEff.GetAmount());
|
||||||
}
|
}
|
||||||
@@ -1335,7 +1335,7 @@ class spell_mage_molten_fury : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.MoltenFury);
|
return ValidateSpellInfo(SpellIds.MoltenFury);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HandleEffectProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
void HandleEffectProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
if (!eventInfo.GetActionTarget().HealthAbovePct(aurEff.GetAmount()))
|
if (!eventInfo.GetActionTarget().HealthAbovePct(aurEff.GetAmount()))
|
||||||
eventInfo.GetActor().CastSpell(eventInfo.GetActionTarget(), SpellIds.MoltenFury, new CastSpellExtraArgs()
|
eventInfo.GetActor().CastSpell(eventInfo.GetActionTarget(), SpellIds.MoltenFury, new CastSpellExtraArgs()
|
||||||
|
|||||||
@@ -341,7 +341,7 @@ class spell_monk_pressure_points : SpellScript
|
|||||||
return !GetCaster().HasAura(SpellIds.PressurePoints);
|
return !GetCaster().HasAura(SpellIds.PressurePoints);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void PreventDispel(ref WorldObject target)
|
void PreventDispel(ref WorldObject target)
|
||||||
{
|
{
|
||||||
target = null;
|
target = null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ class spell_pal_a_just_reward : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.AJustRewardHeal);
|
return ValidateSpellInfo(SpellIds.AJustRewardHeal);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HandleEffectProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
void HandleEffectProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
eventInfo.GetActor().CastSpell(eventInfo.GetActionTarget(), SpellIds.AJustRewardHeal, new CastSpellExtraArgs()
|
eventInfo.GetActor().CastSpell(eventInfo.GetActionTarget(), SpellIds.AJustRewardHeal, new CastSpellExtraArgs()
|
||||||
{
|
{
|
||||||
@@ -311,7 +311,7 @@ class spell_pal_blade_of_vengeance : SpellScript
|
|||||||
return !GetCaster().HasAura(SpellIds.BladeOfVengeance);
|
return !GetCaster().HasAura(SpellIds.BladeOfVengeance);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void PreventProc(ref WorldObject target)
|
void PreventProc(ref WorldObject target)
|
||||||
{
|
{
|
||||||
target = null;
|
target = null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -358,7 +358,7 @@ class spell_pri_aq_3p_bonus : AuraScript
|
|||||||
[Script] // 81749 - Atonement
|
[Script] // 81749 - Atonement
|
||||||
class spell_pri_atonement : AuraScript
|
class spell_pri_atonement : AuraScript
|
||||||
{
|
{
|
||||||
List<ObjectGuid> _appliedAtonements;
|
List<ObjectGuid> _appliedAtonements = new();
|
||||||
|
|
||||||
public override bool Validate(SpellInfo spellInfo)
|
public override bool Validate(SpellInfo spellInfo)
|
||||||
{
|
{
|
||||||
@@ -366,7 +366,7 @@ class spell_pri_atonement : AuraScript
|
|||||||
&& ValidateSpellEffect((spellInfo.Id, 1), (SpellIds.SinsOfTheMany, 2));
|
&& ValidateSpellEffect((spellInfo.Id, 1), (SpellIds.SinsOfTheMany, 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(ProcEventInfo eventInfo)
|
bool CheckProc(ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
return eventInfo.GetDamageInfo() != null;
|
return eventInfo.GetDamageInfo() != null;
|
||||||
}
|
}
|
||||||
@@ -598,7 +598,7 @@ class spell_pri_atonement_passive : AuraScript
|
|||||||
return ValidateSpellEffect((SpellIds.Atonement, 0));
|
return ValidateSpellEffect((SpellIds.Atonement, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(ProcEventInfo eventInfo)
|
bool CheckProc(ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
return eventInfo.GetDamageInfo() != null;
|
return eventInfo.GetDamageInfo() != null;
|
||||||
}
|
}
|
||||||
@@ -848,7 +848,7 @@ class spell_pri_divine_image : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.DivineImageSummon, SpellIds.DivineImageEmpower, SpellIds.DivineImageEmpowerStack);
|
return ValidateSpellInfo(SpellIds.DivineImageSummon, SpellIds.DivineImageEmpower, SpellIds.DivineImageEmpowerStack);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
Unit target = eventInfo.GetActor();
|
Unit target = eventInfo.GetActor();
|
||||||
if (target == null)
|
if (target == null)
|
||||||
@@ -930,7 +930,7 @@ class spell_pri_divine_image_spell_triggered : AuraScript
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(ProcEventInfo eventInfo)
|
bool CheckProc(ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
return DivineImageHelpers.GetSummon(eventInfo.GetActor()) != null;
|
return DivineImageHelpers.GetSummon(eventInfo.GetActor()) != null;
|
||||||
}
|
}
|
||||||
@@ -1151,7 +1151,7 @@ class spell_pri_epiphany : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.PrayerOfMending, SpellIds.EpiphanyHighlight);
|
return ValidateSpellInfo(SpellIds.PrayerOfMending, SpellIds.EpiphanyHighlight);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
bool CheckProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
return RandomHelper.randChance(aurEff.GetAmount());
|
return RandomHelper.randChance(aurEff.GetAmount());
|
||||||
}
|
}
|
||||||
@@ -1272,7 +1272,7 @@ class spell_pri_guardian_spirit : AuraScript
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void CalculateAmount(AuraEffect aurEff, ref int amount, ref bool canBeRecalculated)
|
void CalculateAmount(AuraEffect aurEff, ref int amount, ref bool canBeRecalculated)
|
||||||
{
|
{
|
||||||
// Set absorbtion amount to unlimited
|
// Set absorbtion amount to unlimited
|
||||||
amount = -1;
|
amount = -1;
|
||||||
@@ -1308,12 +1308,12 @@ class spell_pri_heavens_wrath : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.UltimatePenitence);
|
return ValidateSpellInfo(SpellIds.UltimatePenitence);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(ProcEventInfo eventInfo)
|
bool CheckProc(ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
return !(eventInfo.GetSpellInfo().Id == SpellIds.UltimatePenitenceDamage || eventInfo.GetSpellInfo().Id == SpellIds.UltimatePenitenceHeal);
|
return !(eventInfo.GetSpellInfo().Id == SpellIds.UltimatePenitenceDamage || eventInfo.GetSpellInfo().Id == SpellIds.UltimatePenitenceHeal);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HandleEffectProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
void HandleEffectProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
Unit caster = eventInfo.GetActor();
|
Unit caster = eventInfo.GetActor();
|
||||||
if (caster == null)
|
if (caster == null)
|
||||||
@@ -1373,12 +1373,12 @@ class spell_pri_holy_mending : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.Renew, SpellIds.HolyMendingHeal);
|
return ValidateSpellInfo(SpellIds.Renew, SpellIds.HolyMendingHeal);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(AuraEffect aurEff, ProcEventInfo procInfo)
|
bool CheckProc(AuraEffect aurEff, ProcEventInfo procInfo)
|
||||||
{
|
{
|
||||||
return procInfo.GetProcTarget().HasAura(SpellIds.Renew, procInfo.GetActor().GetGUID());
|
return procInfo.GetProcTarget().HasAura(SpellIds.Renew, procInfo.GetActor().GetGUID());
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
eventInfo.GetActor().CastSpell(eventInfo.GetProcTarget(), SpellIds.HolyMendingHeal, new CastSpellExtraArgs(aurEff));
|
eventInfo.GetActor().CastSpell(eventInfo.GetProcTarget(), SpellIds.HolyMendingHeal, new CastSpellExtraArgs(aurEff));
|
||||||
}
|
}
|
||||||
@@ -1763,7 +1763,7 @@ class spell_pri_painful_punishment : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.ShadowWordPain, SpellIds.PurgeTheWickedPeriodic);
|
return ValidateSpellInfo(SpellIds.ShadowWordPain, SpellIds.PurgeTheWickedPeriodic);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HandleEffectProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
void HandleEffectProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
Unit caster = eventInfo.GetActor();
|
Unit caster = eventInfo.GetActor();
|
||||||
Unit target = eventInfo.GetActionTarget();
|
Unit target = eventInfo.GetActionTarget();
|
||||||
@@ -1916,7 +1916,7 @@ class spell_pri_power_leech_passive : AuraScript
|
|||||||
&& ValidateSpellEffect((SpellIds.PowerLeechShadowfiendInsanity, 0), (SpellIds.PowerLeechShadowfiendMana, 0), (SpellIds.PowerLeechMindbenderInsanity, 0), (SpellIds.PowerLeechMindbenderMana, 0));
|
&& ValidateSpellEffect((SpellIds.PowerLeechShadowfiendInsanity, 0), (SpellIds.PowerLeechShadowfiendMana, 0), (SpellIds.PowerLeechMindbenderInsanity, 0), (SpellIds.PowerLeechMindbenderMana, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(ProcEventInfo eventInfo)
|
bool CheckProc(ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
return eventInfo.GetDamageInfo() != null;
|
return eventInfo.GetDamageInfo() != null;
|
||||||
}
|
}
|
||||||
@@ -2042,6 +2042,8 @@ class spell_pri_power_of_the_dark_side_healing_bonus : SpellScript
|
|||||||
[Script] // 194509 - Power Word: Radiance
|
[Script] // 194509 - Power Word: Radiance
|
||||||
class spell_pri_power_word_radiance : SpellScript
|
class spell_pri_power_word_radiance : SpellScript
|
||||||
{
|
{
|
||||||
|
List<ObjectGuid> _visualTargets = new();
|
||||||
|
|
||||||
public override bool Validate(SpellInfo spellInfo)
|
public override bool Validate(SpellInfo spellInfo)
|
||||||
{
|
{
|
||||||
return ValidateSpellInfo(SpellIds.AtonementEffect);
|
return ValidateSpellInfo(SpellIds.AtonementEffect);
|
||||||
@@ -2049,26 +2051,13 @@ class spell_pri_power_word_radiance : SpellScript
|
|||||||
|
|
||||||
void FilterTargets(List<WorldObject> targets)
|
void FilterTargets(List<WorldObject> targets)
|
||||||
{
|
{
|
||||||
|
Unit caster = GetCaster();
|
||||||
Unit explTarget = GetExplTargetUnit();
|
Unit explTarget = GetExplTargetUnit();
|
||||||
|
|
||||||
// we must add one since explicit target is always chosen.
|
// we must add one since explicit target is always chosen.
|
||||||
uint maxTargets = (uint)GetEffectInfo(2).CalcValue(GetCaster()) + 1;
|
int maxTargets = GetEffectInfo(2).CalcValue(GetCaster()) + 1;
|
||||||
|
|
||||||
if (targets.Count > maxTargets)
|
SortTargetsWithPriorityRules(targets, maxTargets, GetRadianceRules(caster, explTarget));
|
||||||
{
|
|
||||||
// priority is: a) no Atonement b) injured c) anything else (excluding explicit target which is always added).
|
|
||||||
targets.Sort((lhs, rhs) =>
|
|
||||||
{
|
|
||||||
if (lhs == explTarget) // explTarget > anything: always true
|
|
||||||
return 1;
|
|
||||||
if (rhs == explTarget) // anything > explTarget: always false
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return MakeSortTuple(lhs).Equals(MakeSortTuple(rhs)) ? 1 : -1;
|
|
||||||
});
|
|
||||||
|
|
||||||
targets.Resize(maxTargets);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (WorldObject target in targets)
|
foreach (WorldObject target in targets)
|
||||||
{
|
{
|
||||||
@@ -2089,33 +2078,23 @@ class spell_pri_power_word_radiance : SpellScript
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<PriorityRules> GetRadianceRules(Unit caster, Unit explTarget)
|
||||||
|
{
|
||||||
|
return new List<PriorityRules>()
|
||||||
|
{
|
||||||
|
new PriorityRules() { weight = 1, condition = target => target.IsInRaidWith(caster) },
|
||||||
|
new PriorityRules() { weight = 2, condition = target => target.IsPlayer() || (target.IsCreature() && target.ToCreature().IsTreatedAsRaidUnit()) },
|
||||||
|
new PriorityRules() { weight = 4, condition = target => !target.IsFullHealth() },
|
||||||
|
new PriorityRules() { weight = 8, condition = target => !target.HasAura(SpellIds.AtonementEffect, caster.GetGUID()) },
|
||||||
|
new PriorityRules() { weight = 16, condition = target => target == explTarget }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
public override void Register()
|
public override void Register()
|
||||||
{
|
{
|
||||||
OnObjectAreaTargetSelect.Add(new(FilterTargets, 1, Targets.UnitDestAreaAlly));
|
OnObjectAreaTargetSelect.Add(new(FilterTargets, 1, Targets.UnitDestAreaAlly));
|
||||||
OnEffectHitTarget.Add(new(HandleEffectHitTarget, 0, SpellEffectName.Dummy));
|
OnEffectHitTarget.Add(new(HandleEffectHitTarget, 0, SpellEffectName.Dummy));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
(bool, bool) MakeSortTuple(WorldObject obj)
|
|
||||||
{
|
|
||||||
return (IsUnitWithNoAtonement(obj), IsUnitInjured(obj));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns true if obj is a unit but has no atonement
|
|
||||||
bool IsUnitWithNoAtonement(WorldObject obj)
|
|
||||||
{
|
|
||||||
Unit unit = obj.ToUnit();
|
|
||||||
return unit != null && !unit.HasAura(SpellIds.AtonementEffect, GetCaster().GetGUID());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns true if obj is a unit and is injured
|
|
||||||
static bool IsUnitInjured(WorldObject obj)
|
|
||||||
{
|
|
||||||
Unit unit = obj.ToUnit();
|
|
||||||
return unit != null && !unit.IsFullHealth();
|
|
||||||
}
|
|
||||||
|
|
||||||
List<ObjectGuid> _visualTargets;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Script] // 17 - Power Word: Shield
|
[Script] // 17 - Power Word: Shield
|
||||||
@@ -2227,12 +2206,12 @@ class spell_pri_divine_aegis : AuraScript
|
|||||||
return ValidateSpellEffect((SpellIds.DivineAegisAbsorb, 0));
|
return ValidateSpellEffect((SpellIds.DivineAegisAbsorb, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(ProcEventInfo eventInfo)
|
bool CheckProc(ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
return eventInfo.GetHealInfo() != null;
|
return eventInfo.GetHealInfo() != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
Unit caster = eventInfo.GetActor();
|
Unit caster = eventInfo.GetActor();
|
||||||
if (caster == null)
|
if (caster == null)
|
||||||
@@ -2486,7 +2465,7 @@ class spell_pri_holy_10_1_class_set_2pc : AuraScript
|
|||||||
&& ValidateSpellEffect((SpellIds.PrayerOfMending, 0));
|
&& ValidateSpellEffect((SpellIds.PrayerOfMending, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
bool CheckProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
return RandomHelper.randChance(aurEff.GetAmount());
|
return RandomHelper.randChance(aurEff.GetAmount());
|
||||||
}
|
}
|
||||||
@@ -3055,7 +3034,7 @@ class spell_pri_shadow_mend_periodic_damage : AuraScript
|
|||||||
GetTarget().CastSpell(GetTarget(), SpellIds.ShadowMendDamage, args);
|
GetTarget().CastSpell(GetTarget(), SpellIds.ShadowMendDamage, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(ProcEventInfo eventInfo)
|
bool CheckProc(ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
return eventInfo.GetDamageInfo() != null;
|
return eventInfo.GetDamageInfo() != null;
|
||||||
}
|
}
|
||||||
@@ -3133,7 +3112,7 @@ class spell_pri_surge_of_light : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.Smite, SpellIds.SurgeOfLightEffect);
|
return ValidateSpellInfo(SpellIds.Smite, SpellIds.SurgeOfLightEffect);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(ProcEventInfo eventInfo)
|
bool CheckProc(ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
if (eventInfo.GetSpellInfo().Id == SpellIds.Smite)
|
if (eventInfo.GetSpellInfo().Id == SpellIds.Smite)
|
||||||
return true;
|
return true;
|
||||||
@@ -3185,7 +3164,7 @@ class spell_pri_t5_heal_2p_bonus : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.ItemEfficiency);
|
return ValidateSpellInfo(SpellIds.ItemEfficiency);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(ProcEventInfo eventInfo)
|
bool CheckProc(ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
HealInfo healInfo = eventInfo.GetHealInfo();
|
HealInfo healInfo = eventInfo.GetHealInfo();
|
||||||
if (healInfo != null)
|
if (healInfo != null)
|
||||||
@@ -3312,13 +3291,13 @@ class spell_pri_train_of_thought : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.PowerWordShield, SpellIds.Penance);
|
return ValidateSpellInfo(SpellIds.PowerWordShield, SpellIds.Penance);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckEffect0(AuraEffect aurEff, ProcEventInfo eventInfo)
|
bool CheckEffect0(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
// Renew & Flash Heal
|
// Renew & Flash Heal
|
||||||
return eventInfo.GetSpellInfo().IsAffected(SpellFamilyNames.Priest, new FlagArray128(0x840));
|
return eventInfo.GetSpellInfo().IsAffected(SpellFamilyNames.Priest, new FlagArray128(0x840));
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool Check1(AuraEffect aurEff, ProcEventInfo eventInfo)
|
bool Check1(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
// Smite
|
// Smite
|
||||||
return eventInfo.GetSpellInfo().IsAffected(SpellFamilyNames.Priest, new FlagArray128(0x80));
|
return eventInfo.GetSpellInfo().IsAffected(SpellFamilyNames.Priest, new FlagArray128(0x80));
|
||||||
@@ -3347,7 +3326,7 @@ class spell_pri_train_of_thought : AuraScript
|
|||||||
[Script] // 265259 - Twist of Fate (Discipline)
|
[Script] // 265259 - Twist of Fate (Discipline)
|
||||||
class spell_pri_twist_of_fate : AuraScript
|
class spell_pri_twist_of_fate : AuraScript
|
||||||
{
|
{
|
||||||
static bool CheckProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
bool CheckProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
return eventInfo.GetProcTarget().GetHealthPct() < aurEff.GetAmount();
|
return eventInfo.GetProcTarget().GetHealthPct() < aurEff.GetAmount();
|
||||||
}
|
}
|
||||||
@@ -3422,7 +3401,7 @@ class spell_pri_vampiric_embrace : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.VampiricEmbraceHeal);
|
return ValidateSpellInfo(SpellIds.VampiricEmbraceHeal);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(ProcEventInfo eventInfo)
|
bool CheckProc(ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
// Not proc from Mind Sear
|
// Not proc from Mind Sear
|
||||||
return (eventInfo.GetDamageInfo().GetSpellInfo().SpellFamilyFlags[1] & 0x80000) == 0;
|
return (eventInfo.GetDamageInfo().GetSpellInfo().SpellFamilyFlags[1] & 0x80000) == 0;
|
||||||
|
|||||||
@@ -366,7 +366,7 @@ class spell_rog_deepening_shadows : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.ShadowDance);
|
return ValidateSpellInfo(SpellIds.ShadowDance);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(AuraEffect aurEff, ProcEventInfo procEvent)
|
bool CheckProc(AuraEffect aurEff, ProcEventInfo procEvent)
|
||||||
{
|
{
|
||||||
Spell procSpell = procEvent.GetProcSpell();
|
Spell procSpell = procEvent.GetProcSpell();
|
||||||
if (procSpell != null)
|
if (procSpell != null)
|
||||||
|
|||||||
@@ -357,7 +357,7 @@ class spell_sha_aftershock : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.AftershockEnergize);
|
return ValidateSpellInfo(SpellIds.AftershockEnergize);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
bool CheckProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
Spell procSpell = eventInfo.GetProcSpell();
|
Spell procSpell = eventInfo.GetProcSpell();
|
||||||
if (procSpell != null)
|
if (procSpell != null)
|
||||||
@@ -370,7 +370,7 @@ class spell_sha_aftershock : AuraScript
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HandleEffectProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
void HandleEffectProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
Spell procSpell = eventInfo.GetProcSpell();
|
Spell procSpell = eventInfo.GetProcSpell();
|
||||||
eventInfo.GetActor().CastSpell(eventInfo.GetActor(), SpellIds.AftershockEnergize, new CastSpellExtraArgs()
|
eventInfo.GetActor().CastSpell(eventInfo.GetActor(), SpellIds.AftershockEnergize, new CastSpellExtraArgs()
|
||||||
@@ -397,7 +397,7 @@ class spell_sha_ancestral_guidance : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.AncestralGuidanceHeal);
|
return ValidateSpellInfo(SpellIds.AncestralGuidanceHeal);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(ProcEventInfo eventInfo)
|
bool CheckProc(ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
if (eventInfo.GetSpellInfo() != null && eventInfo.GetSpellInfo().Id == SpellIds.AncestralGuidanceHeal)
|
if (eventInfo.GetSpellInfo() != null && eventInfo.GetSpellInfo().Id == SpellIds.AncestralGuidanceHeal)
|
||||||
return false;
|
return false;
|
||||||
@@ -433,11 +433,6 @@ class spell_sha_ancestral_guidance : AuraScript
|
|||||||
[Script] // 114911 - Ancestral Guidance Heal
|
[Script] // 114911 - Ancestral Guidance Heal
|
||||||
class spell_sha_ancestral_guidance_heal : SpellScript
|
class spell_sha_ancestral_guidance_heal : SpellScript
|
||||||
{
|
{
|
||||||
public override bool Validate(SpellInfo spellInfo)
|
|
||||||
{
|
|
||||||
return ValidateSpellInfo(SpellIds.AncestralGuidance);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResizeTargets(List<WorldObject> targets)
|
void ResizeTargets(List<WorldObject> targets)
|
||||||
{
|
{
|
||||||
SelectRandomInjuredTargets(targets, 3, true);
|
SelectRandomInjuredTargets(targets, 3, true);
|
||||||
@@ -511,7 +506,7 @@ class spell_sha_ascendance_restoration : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.RestorativeMists);
|
return ValidateSpellInfo(SpellIds.RestorativeMists);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(ProcEventInfo procInfo)
|
bool CheckProc(ProcEventInfo procInfo)
|
||||||
{
|
{
|
||||||
return procInfo.GetHealInfo() != null && procInfo.GetHealInfo().GetOriginalHeal() != 0 && procInfo.GetSpellInfo().Id != SpellIds.RestorativeMistsInitial;
|
return procInfo.GetHealInfo() != null && procInfo.GetHealInfo().GetOriginalHeal() != 0 && procInfo.GetSpellInfo().Id != SpellIds.RestorativeMistsInitial;
|
||||||
}
|
}
|
||||||
@@ -1030,7 +1025,7 @@ class spell_sha_earthen_rage_passive : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.EarthenRagePeriodic, SpellIds.EarthenRageDamage);
|
return ValidateSpellInfo(SpellIds.EarthenRagePeriodic, SpellIds.EarthenRageDamage);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(ProcEventInfo procInfo)
|
bool CheckProc(ProcEventInfo procInfo)
|
||||||
{
|
{
|
||||||
return procInfo.GetSpellInfo() != null && procInfo.GetSpellInfo().Id != SpellIds.EarthenRageDamage;
|
return procInfo.GetSpellInfo() != null && procInfo.GetSpellInfo().Id != SpellIds.EarthenRageDamage;
|
||||||
}
|
}
|
||||||
@@ -1581,7 +1576,7 @@ class spell_sha_healing_stream_totem_heal : SpellScript
|
|||||||
[Script] // 201900 - Hot Hand
|
[Script] // 201900 - Hot Hand
|
||||||
class spell_sha_hot_hand : AuraScript
|
class spell_sha_hot_hand : AuraScript
|
||||||
{
|
{
|
||||||
static bool CheckProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
bool CheckProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
return eventInfo.GetActor().HasAura(SpellIds.FlametongueWeaponAura);
|
return eventInfo.GetActor().HasAura(SpellIds.FlametongueWeaponAura);
|
||||||
}
|
}
|
||||||
@@ -1714,7 +1709,7 @@ class spell_sha_item_mana_surge : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.ItemManaSurge);
|
return ValidateSpellInfo(SpellIds.ItemManaSurge);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(ProcEventInfo eventInfo)
|
bool CheckProc(ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
return eventInfo.GetProcSpell() != null;
|
return eventInfo.GetProcSpell() != null;
|
||||||
}
|
}
|
||||||
@@ -2165,13 +2160,13 @@ class spell_sha_mastery_elemental_overload : AuraScript
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
bool CheckProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
SpellInfo spellInfo = eventInfo.GetSpellInfo();
|
SpellInfo spellInfo = eventInfo.GetSpellInfo();
|
||||||
if (spellInfo == null || eventInfo.GetProcSpell() == null)
|
if (spellInfo == null || eventInfo.GetProcSpell() == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (GetTriggeredSpellId(spellInfo.Id) == null)
|
if (GetTriggeredSpellId(spellInfo.Id) == 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
float chance = aurEff.GetAmount(); // Mastery % amount
|
float chance = aurEff.GetAmount(); // Mastery % amount
|
||||||
@@ -2380,13 +2375,13 @@ class spell_sha_natures_guardian : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.NaturesGuardianCooldown);
|
return ValidateSpellInfo(SpellIds.NaturesGuardianCooldown);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
bool CheckProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
return eventInfo.GetActionTarget().HealthBelowPct(aurEff.GetAmount())
|
return eventInfo.GetActionTarget().HealthBelowPct(aurEff.GetAmount())
|
||||||
&& !eventInfo.GetActionTarget().HasAura(SpellIds.NaturesGuardianCooldown);
|
&& !eventInfo.GetActionTarget().HasAura(SpellIds.NaturesGuardianCooldown);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void StartCooldown(AuraEffect aurEff, ProcEventInfo eventInfo)
|
void StartCooldown(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
Unit shaman = eventInfo.GetActionTarget();
|
Unit shaman = eventInfo.GetActionTarget();
|
||||||
shaman.CastSpell(shaman, SpellIds.NaturesGuardianCooldown, new CastSpellExtraArgs()
|
shaman.CastSpell(shaman, SpellIds.NaturesGuardianCooldown, new CastSpellExtraArgs()
|
||||||
@@ -2766,7 +2761,7 @@ class spell_sha_stormsurge : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.StormsurgeProc);
|
return ValidateSpellInfo(SpellIds.StormsurgeProc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
eventInfo.GetActor().CastSpell(eventInfo.GetActor(), SpellIds.StormsurgeProc, new CastSpellExtraArgs()
|
eventInfo.GetActor().CastSpell(eventInfo.GetActor(), SpellIds.StormsurgeProc, new CastSpellExtraArgs()
|
||||||
{
|
{
|
||||||
@@ -3194,7 +3189,7 @@ class spell_sha_unlimited_power : AuraScript
|
|||||||
return ValidateSpellInfo(SpellIds.UnlimitedPowerBuff);
|
return ValidateSpellInfo(SpellIds.UnlimitedPowerBuff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HandleProc(AuraEffect aurEff, ProcEventInfo procInfo)
|
void HandleProc(AuraEffect aurEff, ProcEventInfo procInfo)
|
||||||
{
|
{
|
||||||
Unit caster = procInfo.GetActor();
|
Unit caster = procInfo.GetActor();
|
||||||
Aura aura = caster.GetAura(SpellIds.UnlimitedPowerBuff);
|
Aura aura = caster.GetAura(SpellIds.UnlimitedPowerBuff);
|
||||||
@@ -3329,7 +3324,7 @@ class spell_sha_voltaic_blaze : SpellScript
|
|||||||
[Script] // 470058 - Voltaic Blaze
|
[Script] // 470058 - Voltaic Blaze
|
||||||
class spell_sha_voltaic_blaze_aura : AuraScript
|
class spell_sha_voltaic_blaze_aura : AuraScript
|
||||||
{
|
{
|
||||||
static bool CheckProc(ProcEventInfo eventInfo)
|
bool CheckProc(ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
// 470057 - Voltaic Blaze does not have any unique SpellFamilyFlags, check by id
|
// 470057 - Voltaic Blaze does not have any unique SpellFamilyFlags, check by id
|
||||||
return eventInfo.GetSpellInfo().Id == SpellIds.VoltaicBlazeDamage;
|
return eventInfo.GetSpellInfo().Id == SpellIds.VoltaicBlazeDamage;
|
||||||
@@ -3344,12 +3339,12 @@ class spell_sha_voltaic_blaze_aura : AuraScript
|
|||||||
[Script] // 470053 - Voltaic Blaze
|
[Script] // 470053 - Voltaic Blaze
|
||||||
class spell_sha_voltaic_blaze_talent : AuraScript
|
class spell_sha_voltaic_blaze_talent : AuraScript
|
||||||
{
|
{
|
||||||
static bool CheckProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
bool CheckProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
return RandomHelper.randChance(aurEff.GetAmount());
|
return RandomHelper.randChance(aurEff.GetAmount());
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
eventInfo.GetActor().CastSpell(eventInfo.GetActor(), SpellIds.VoltaicBlazeOverride);
|
eventInfo.GetActor().CastSpell(eventInfo.GetActor(), SpellIds.VoltaicBlazeOverride);
|
||||||
}
|
}
|
||||||
@@ -3474,7 +3469,7 @@ class areatrigger_sha_wind_rush_totem(AreaTrigger areaTrigger) : AreaTriggerAI(a
|
|||||||
CastSpeedBuff(caster, unit);
|
CastSpeedBuff(caster, unit);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void CastSpeedBuff(Unit caster, Unit unit)
|
void CastSpeedBuff(Unit caster, Unit unit)
|
||||||
{
|
{
|
||||||
if (!caster.IsValidAssistTarget(unit))
|
if (!caster.IsValidAssistTarget(unit))
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -1282,9 +1282,7 @@ class spell_warl_shadowburn : SpellScript
|
|||||||
OnCalcCritChance.Add(new(CalcCritChance));
|
OnCalcCritChance.Add(new(CalcCritChance));
|
||||||
}
|
}
|
||||||
|
|
||||||
public
|
public static void TryEnergize(Player caster, Unit target, SpellInfo spellInfo, Spell triggeringSpell, AuraEffect triggeringAura)
|
||||||
static void TryEnergize(Player caster, Unit target, SpellInfo spellInfo,
|
|
||||||
Spell triggeringSpell, AuraEffect triggeringAura)
|
|
||||||
{
|
{
|
||||||
if (caster == null)
|
if (caster == null)
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ namespace Scripts.Spells.Warrior
|
|||||||
static uint[] FurySpellIds = [SpellIds.Recklessness, SpellIds.Bladestorm, SpellIds.Ravager];
|
static uint[] FurySpellIds = [SpellIds.Recklessness, SpellIds.Bladestorm, SpellIds.Ravager];
|
||||||
static uint[] ProtectionSpellIds = [SpellIds.Avatar, SpellIds.ShieldWall];
|
static uint[] ProtectionSpellIds = [SpellIds.Avatar, SpellIds.ShieldWall];
|
||||||
|
|
||||||
static bool ValidateProc(AuraEffect aurEff, ProcEventInfo eventInfo, ChrSpecialization spec)
|
bool ValidateProc(AuraEffect aurEff, ProcEventInfo eventInfo, ChrSpecialization spec)
|
||||||
{
|
{
|
||||||
if (aurEff.GetAmount() == 0)
|
if (aurEff.GetAmount() == 0)
|
||||||
return false;
|
return false;
|
||||||
@@ -133,7 +133,7 @@ namespace Scripts.Spells.Warrior
|
|||||||
return player.GetPrimarySpecialization() == spec;
|
return player.GetPrimarySpecialization() == spec;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckArmsProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
bool CheckArmsProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
if (!ValidateProc(aurEff, eventInfo, ChrSpecialization.WarriorArms))
|
if (!ValidateProc(aurEff, eventInfo, ChrSpecialization.WarriorArms))
|
||||||
return false;
|
return false;
|
||||||
@@ -145,12 +145,12 @@ namespace Scripts.Spells.Warrior
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckFuryProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
bool CheckFuryProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
return ValidateProc(aurEff, eventInfo, ChrSpecialization.WarriorFury);
|
return ValidateProc(aurEff, eventInfo, ChrSpecialization.WarriorFury);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProtectionProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
bool CheckProtectionProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
return ValidateProc(aurEff, eventInfo, ChrSpecialization.WarriorProtection);
|
return ValidateProc(aurEff, eventInfo, ChrSpecialization.WarriorProtection);
|
||||||
}
|
}
|
||||||
@@ -200,7 +200,7 @@ namespace Scripts.Spells.Warrior
|
|||||||
[Script] // 392536 - Ashen Juggernaut
|
[Script] // 392536 - Ashen Juggernaut
|
||||||
class spell_warr_ashen_juggernaut : AuraScript
|
class spell_warr_ashen_juggernaut : AuraScript
|
||||||
{
|
{
|
||||||
static bool CheckProc(ProcEventInfo eventInfo)
|
bool CheckProc(ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
// should only proc on primary target
|
// should only proc on primary target
|
||||||
return eventInfo.GetActionTarget() == eventInfo.GetProcSpell().m_targets.GetUnitTarget();
|
return eventInfo.GetActionTarget() == eventInfo.GetProcSpell().m_targets.GetUnitTarget();
|
||||||
@@ -544,7 +544,7 @@ namespace Scripts.Spells.Warrior
|
|||||||
return ValidateSpellInfo(SpellIds.FreshMeatTalent, SpellIds.FreshMeatDebuff);
|
return ValidateSpellInfo(SpellIds.FreshMeatTalent, SpellIds.FreshMeatDebuff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckRampageProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
bool CheckRampageProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
SpellInfo spellInfo = eventInfo.GetSpellInfo();
|
SpellInfo spellInfo = eventInfo.GetSpellInfo();
|
||||||
if (spellInfo == null || !spellInfo.IsAffected(SpellFamilyNames.Warrior, new FlagArray128(0x0, 0x0, 0x0, 0x8000000))) // Rampage
|
if (spellInfo == null || !spellInfo.IsAffected(SpellFamilyNames.Warrior, new FlagArray128(0x0, 0x0, 0x0, 0x8000000))) // Rampage
|
||||||
@@ -553,13 +553,13 @@ namespace Scripts.Spells.Warrior
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool IsBloodthirst(SpellInfo spellInfo)
|
bool IsBloodthirst(SpellInfo spellInfo)
|
||||||
{
|
{
|
||||||
// Bloodthirst/Bloodbath
|
// Bloodthirst/Bloodbath
|
||||||
return spellInfo.IsAffected(SpellFamilyNames.Warrior, new FlagArray128(0x0, 0x400));
|
return spellInfo.IsAffected(SpellFamilyNames.Warrior, new FlagArray128(0x0, 0x400));
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckBloodthirstProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
bool CheckBloodthirstProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
SpellInfo spellInfo = eventInfo.GetSpellInfo();
|
SpellInfo spellInfo = eventInfo.GetSpellInfo();
|
||||||
if (spellInfo == null || !IsBloodthirst(spellInfo))
|
if (spellInfo == null || !IsBloodthirst(spellInfo))
|
||||||
@@ -630,7 +630,7 @@ namespace Scripts.Spells.Warrior
|
|||||||
[Script] // 260798 - Execute (Arms, Protection)
|
[Script] // 260798 - Execute (Arms, Protection)
|
||||||
class spell_warr_execute_damage : SpellScript
|
class spell_warr_execute_damage : SpellScript
|
||||||
{
|
{
|
||||||
static void CalculateExecuteDamage(SpellEffectInfo spellEffectInfo, Unit victim, ref int damageOrHealing, ref int flatMod, ref float pctMod)
|
void CalculateExecuteDamage(SpellEffectInfo spellEffectInfo, Unit victim, ref int damageOrHealing, ref int flatMod, ref float pctMod)
|
||||||
{
|
{
|
||||||
// tooltip has 2 multiplier hardcoded in it $damage=${2.0*$260798s1}
|
// tooltip has 2 multiplier hardcoded in it $damage=${2.0*$260798s1}
|
||||||
pctMod *= 2.0f;
|
pctMod *= 2.0f;
|
||||||
@@ -1288,7 +1288,7 @@ namespace Scripts.Spells.Warrior
|
|||||||
&& ValidateSpellEffect((SpellIds.Strategist, 0));
|
&& ValidateSpellEffect((SpellIds.Strategist, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CheckProc(AuraEffect aurEff, ProcEventInfo procEvent)
|
bool CheckProc(AuraEffect aurEff, ProcEventInfo procEvent)
|
||||||
{
|
{
|
||||||
return RandomHelper.randChance(aurEff.GetAmount());
|
return RandomHelper.randChance(aurEff.GetAmount());
|
||||||
}
|
}
|
||||||
@@ -1310,7 +1310,7 @@ namespace Scripts.Spells.Warrior
|
|||||||
[Script] // 280776 - Sudden Death
|
[Script] // 280776 - Sudden Death
|
||||||
class spell_warr_sudden_death : AuraScript
|
class spell_warr_sudden_death : AuraScript
|
||||||
{
|
{
|
||||||
static bool CheckProc(ProcEventInfo eventInfo)
|
bool CheckProc(ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
// should only proc on primary target
|
// should only proc on primary target
|
||||||
return eventInfo.GetActionTarget() == eventInfo.GetProcSpell().m_targets.GetUnitTarget();
|
return eventInfo.GetActionTarget() == eventInfo.GetProcSpell().m_targets.GetUnitTarget();
|
||||||
|
|||||||
Reference in New Issue
Block a user