Пример #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);
        }
Пример #2
0
        public SpellCastResult CheckExplicitTarget(Unit caster, Unit target)
        {
            if (ExplicitTargetType != SpellExplicitTargetType.Target)
            {
                return(SpellCastResult.Success);
            }

            if (ExplicitCastTargets.HasAnyFlag(SpellCastTargetFlags.UnitMask))
            {
                if (target == null)
                {
                    return(SpellCastResult.BadTargets);
                }

                if (target.IsDead && !HasAttribute(SpellAttributes.CanTargetDead))
                {
                    return(SpellCastResult.TargetDead);
                }

                if (!HasAttribute(SpellExtraAttributes.CanTargetInvisible) && !caster.CanSeeOrDetect(target))
                {
                    return(SpellCastResult.BadTargets);
                }

                if (ExplicitCastTargets.HasTargetFlag(SpellCastTargetFlags.UnitEnemy) && caster.IsHostileTo(target))
                {
                    return(SpellCastResult.Success);
                }

                if (ExplicitCastTargets.HasTargetFlag(SpellCastTargetFlags.UnitAlly) && caster.IsFriendlyTo(target))
                {
                    return(SpellCastResult.Success);
                }

                return(SpellCastResult.BadTargets);
            }

            return(SpellCastResult.Success);
        }