Example #1
0
        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);
        }