Example #1
0
        public void SearchAreaTargets(List <Unit> targets, float radius, Vector3 center, Unit referer, SpellTargetChecks checkType)
        {
            int hitCount = Physics.OverlapSphereNonAlloc(center, radius, raycastResults, PhysicsReference.Mask.Characters);

            Assert.IsFalse(hitCount == raycastResults.Length, "Raycast results reached maximum!");
            for (int i = 0; i < hitCount; i++)
            {
                if (!WorldManager.UnitManager.TryFind(raycastResults[i], out Unit targetUnit) || targetUnit.Map != this)
                {
                    continue;
                }

                switch (checkType)
                {
                case SpellTargetChecks.Ally:
                    if (referer.IsHostileTo(targetUnit))
                    {
                        continue;
                    }
                    break;

                case SpellTargetChecks.Enemy:
                    if (!referer.IsHostileTo(targetUnit))
                    {
                        continue;
                    }
                    break;
                }

                targets.Add(targetUnit);
            }
        }
Example #2
0
            internal SpellMissType SpellHitResult(Unit victim, SpellInfo spellInfo, bool canReflect = false)
            {
                if (unit == victim)
                {
                    return(SpellMissType.None);
                }

                // all positive spells can`t miss
                if (spellInfo.IsPositive && !unit.IsHostileTo(victim))
                {
                    return(SpellMissType.None);
                }

                return(SpellMissType.None);
            }
        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);
        }
Example #4
0
        public SpellCastResult CheckExplicitTarget(Unit caster, Unit target)
        {
            if (ExplicitTargetType == SpellExplicitTargetType.None)
            {
                return(SpellCastResult.Success);
            }

            if (ExplicitCastTargets.HasAnyFlag(SpellCastTargetFlags.UnitMask))
            {
                if (target == null)
                {
                    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);
        }