public SpellCastResult CheckTarget(Unit caster, Unit target, Spell spell, bool isImplicit = true) { if (HasAttribute(SpellAttributes.CantTargetSelf) && caster == target) { return(SpellCastResult.BadTargets); } if (!HasAttribute(SpellExtraAttributes.CanTargetInvisible) && !caster.CanSeeOrDetect(target, isImplicit)) { return(SpellCastResult.BadTargets); } if (HasAttribute(SpellCustomAttributes.Pickpocket) && caster is Player && target is Player && caster != target) { return(SpellCastResult.BadTargets); } if (HasAttribute(SpellAttributes.OnlyTargetPlayers) && !(target is Player)) { return(SpellCastResult.TargetNotPlayer); } if (target != caster && (caster.IsControlledByPlayer || !IsPositive) && target is Player player && !player.IsVisible) { return(SpellCastResult.BmOrInvisGod); } if (target.HasState(UnitControlState.InFlight) && !HasAttribute(SpellCustomAttributes.AllowInFlightTarget)) { return(SpellCastResult.BadTargets); } if (target.HasAuraType(AuraEffectType.PreventResurrection)) { if (HasEffect(SpellEffectType.SelfResurrect) || HasEffect(SpellEffectType.Resurrect)) { return(SpellCastResult.TargetCannotBeResurrected); } } foreach (SpellCastCondition castCondition in targetingConditions) { if (castCondition.IsApplicableAndInvalid(caster, target, spell)) { return(castCondition.FailedResult); } } return(SpellCastResult.Success); }