From 6f1c9c47e64c1debc2957f2d24f16b904e6d3d7b Mon Sep 17 00:00:00 2001 From: hondacrx Date: Sat, 30 Dec 2017 16:59:47 -0500 Subject: [PATCH] Core/Scripts: add checks to Master's Call script --- Source/Scripts/Spells/Hunter.cs | 62 +++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 22 deletions(-) diff --git a/Source/Scripts/Spells/Hunter.cs b/Source/Scripts/Spells/Hunter.cs index 4f6b9c8c1..21e1b54ca 100644 --- a/Source/Scripts/Spells/Hunter.cs +++ b/Source/Scripts/Spells/Hunter.cs @@ -230,40 +230,58 @@ namespace Scripts.Spells.Hunter { public override bool Validate(SpellInfo spellInfo) { - return ValidateSpellInfo(SpellIds.MastersCallTriggered, (uint)spellInfo.GetEffect(0).CalcValue()); + return spellInfo.GetEffect(0) != null && ValidateSpellInfo(SpellIds.MastersCallTriggered, (uint)spellInfo.GetEffect(0).CalcValue()); + } + + public override bool Load() + { + return GetCaster().IsPlayer(); + } + + SpellCastResult DoCheckCast() + { + Pet pet = GetCaster().ToPlayer().GetPet(); + if (pet == null || !pet.IsAlive()) + return SpellCastResult.CantDoThatRightNow; + + // Do a mini Spell::CheckCasterAuras on the pet, no other way of doing this + SpellCastResult result = SpellCastResult.SpellCastOk; + UnitFlags unitflag = (UnitFlags)pet.GetUInt32Value(UnitFields.Flags); + if (!pet.GetCharmerGUID().IsEmpty()) + result = SpellCastResult.Charmed; + else if (unitflag.HasAnyFlag(UnitFlags.Stunned)) + result = SpellCastResult.Stunned; + else if (unitflag.HasAnyFlag(UnitFlags.Fleeing)) + result = SpellCastResult.Fleeing; + else if (unitflag.HasAnyFlag(UnitFlags.Confused)) + result = SpellCastResult.Confused; + + if (result != SpellCastResult.SpellCastOk) + return result; + + Unit target = GetExplTargetUnit(); + if (!target) + return SpellCastResult.BadTargets; + + if (!pet.IsWithinLOSInMap(target)) + return SpellCastResult.LineOfSight; + + return SpellCastResult.SpellCastOk; } void HandleDummy(uint effIndex) { - Unit ally = GetHitUnit(); - if (ally) - { - Player caster = GetCaster().ToPlayer(); - if (caster) - { - Pet target = caster.GetPet(); - if (target) - { - TriggerCastFlags castMask = (TriggerCastFlags.FullMask & ~TriggerCastFlags.IgnoreCasterAurastate); - target.CastSpell(ally, (uint)GetEffectValue(), castMask); - } - } - } + GetCaster().ToPlayer().GetPet().CastSpell(GetHitUnit(), (uint)GetEffectValue(), true); } void HandleScriptEffect(uint effIndex) { - Unit target = GetHitUnit(); - if (target) - { - // Cannot be processed while pet is dead - TriggerCastFlags castMask = (TriggerCastFlags.FullMask & ~TriggerCastFlags.IgnoreCasterAurastate); - target.CastSpell(target, SpellIds.MastersCallTriggered, castMask); - } + GetHitUnit().CastSpell((Unit)null, SpellIds.MastersCallTriggered, true); } public override void Register() { + OnCheckCast.Add(new CheckCastHandler(DoCheckCast)); OnEffectHitTarget.Add(new EffectHandler(HandleDummy, 0, SpellEffectName.Dummy)); OnEffectHitTarget.Add(new EffectHandler(HandleScriptEffect, 1, SpellEffectName.ScriptEffect)); }