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); }
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); }