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