Ejemplo n.º 1
0
        /// <summary>
        /// Check if the given cover is fitting.
        /// </summary>
        private bool doesCoverFit(Cover cover, bool checkDistance)
        {
            if (cover == null || cover.Top < _position.y + 0.5f)
            {
                return(false);
            }

            var position = _position + cover.Forward * _capsuleRadius;
            var distance = Vector3.Distance(position, cover.ClosestPointTo(position, 0, 0));

            float radius;

            if (cover == _current.Main)
            {
                radius = cover.CheckTall(_position.y) ? _settings.TallSideLeaveRadius : _settings.LowSideLeaveRadius;
            }
            else
            {
                radius = cover.CheckTall(_position.y) ? _settings.TallSideEnterRadius : _settings.LowSideEnterRadius;
            }

            var isInFront = cover.IsInFront(_position, cover == _current.Main) &&
                            (cover.IsInFront(_position + cover.Right * radius, cover == _current.Main) || cover.RightAdjacent != null) &&
                            (cover.IsInFront(_position + cover.Left * radius, cover == _current.Main) || cover.LeftAdjacent != null);

            if (checkDistance)
            {
                var isOld = isInFront && distance <= _settings.LeaveDistance && cover == _current.Main;
                if (isOld)
                {
                    return(true);
                }

                var isNew = isInFront && distance <= _settings.EnterDistance && cover != _current.Main;
                if (isNew)
                {
                    return(true);
                }

                return(false);
            }
            else
            {
                return(isInFront);
            }
        }
Ejemplo n.º 2
0
        private void consider(Cover cover, Vector3 position, int direction, Vector3 observer, float maxDistance)
        {
            if (float.IsNaN(position.x) || float.IsNaN(position.z))
            {
                return;
            }

            CoverItem item = new CoverItem();

            item.Cover      = cover;
            item.Position   = position;
            item.Position.y = cover.Bottom;
            item.Distance   = Vector3.Distance(observer, item.Position);
            item.Direction  = direction;

            var distanceToObserver = Vector3.Distance(observer, item.Position);

            if (distanceToObserver > maxDistance)
            {
                return;
            }

            var areThereOthers = false;

            const float threshold = 3;

            if (cover.IsTall)
            {
                if (!AIUtil.IsCoverPositionFree(cover, item.Position, threshold, null))
                {
                    areThereOthers = true;
                }
            }
            else
            {
                var hasChangedPosition = false;

                Vector3 side;

                if (Vector3.Dot((item.Position - observer).normalized, cover.Right) > 0)
                {
                    side = cover.Right;
                }
                else
                {
                    side = cover.Left;
                }

                do
                {
                    hasChangedPosition = false;

                    if (!AIUtil.IsCoverPositionFree(cover, item.Position, threshold, null))
                    {
                        var next = item.Position + side * 0.5f;

                        if (cover.IsInFront(next, false))
                        {
                            item.Position      = next;
                            hasChangedPosition = true;
                        }
                        else
                        {
                            areThereOthers = true;
                        }
                    }
                }while (hasChangedPosition);
            }

            if (areThereOthers)
            {
                return;
            }

            Items.Add(item);
        }