public static void IsInFrontOfCaster(SpellEffectHandler effectHandler, WorldObject target, ref SpellFailedReason failedReason, TargetFilter filter) { var caster = effectHandler.Cast.CasterObject; if (caster.IsPlayer && !target.IsInFrontOf(caster)) { failedReason = SpellFailedReason.NotInfront; } else { filter(effectHandler, target, ref failedReason); } }
/// <summary> /// Checks the current Cast when Players are using it /// </summary> protected SpellFailedReason CheckPlayerCast(WorldObject selected) { var caster = (Character)CasterUnit; if (Spell.TargetFlags != 0 && !IsAoE && selected == caster) { // Caster is selected by default return SpellFailedReason.NoValidTargets; } // target specific settings if (!IsAoE && caster != selected && selected != null) { // Target must be selected and in front of us if (caster.IsPlayer && !selected.IsInFrontOf(caster)) { // NPCs always face the Target return SpellFailedReason.UnitNotInfront; } if (Spell.HasHarmfulEffects && selected is Unit) { if (((Unit)selected).IsEvading || ((Unit)selected).IsInvulnerable) { return SpellFailedReason.TargetAurastate; } } //else if (Caster is Unit && !Caster.IsInFrontOfThis(TargetLoc)) //{ // ((Unit)Caster).Face(TargetLoc); //} } // we can't cast if we are dead else if (!caster.IsAlive) { return SpellFailedReason.CasterDead; } var err = Spell.CheckCasterConstraints(caster); if (err != SpellFailedReason.Ok) { return err; } // cancel looting caster.CancelLooting(); // check required skill if (Spell.Ability != null && Spell.Ability.RedValue > 0 && caster.Skills.GetValue(Spell.Ability.Skill.Id) < Spell.Ability.RedValue) { return SpellFailedReason.MinSkill; } // Taming needs some extra checks if (Spell.IsTame) { var target = selected as NPC; if (target == null) { return SpellFailedReason.BadTargets; } if (target.CurrentTamer != null) { return SpellFailedReason.AlreadyBeingTamed; } if (CheckTame(caster, target) != TameFailReason.Ok) { return SpellFailedReason.DontReport; } } if (!caster.HasEnoughPowerToCast(Spell, null) || (UsesRunes && !caster.PlayerSpells.Runes.HasEnoughRunes(Spell))) { return SpellFailedReason.NoPower; } // Item restrictions return Spell.CheckItemRestrictions(TargetItem, caster.Inventory); }