public bl_AICoverPoint GetCoverOnRadius(Transform target, float radius)
    {
        List <bl_AICoverPoint> list = new List <bl_AICoverPoint>();

        for (int i = 0; i < AllCovers.Count; i++)
        {
            float dis = bl_UtilityHelper.Distance(target.position, AllCovers[i].transform.position);
            if (dis <= radius)
            {
                list.Add(AllCovers[i]);
            }
        }
        bl_AICoverPoint cp = null;

        if (list.Count > 0)
        {
            cp = list[Random.Range(0, list.Count)];
        }
        if (cp == null)
        {
            cp = AllCovers[Random.Range(0, AllCovers.Count)];
        }

        return(cp);
    }
    /// <summary>
    ///
    /// </summary>
    bool Cover(bool overridePoint, bool toTarget = false)
    {
        Transform t = (!toTarget) ? transform : Target;

        if (overridePoint)
        {
            if (Agent.pathStatus == NavMeshPathStatus.PathComplete)
            {
                //look for another cover point
                CoverPoint = CoverManager.GetCloseCover(t, CoverPoint);
            }
        }
        else
        {
            //look for a near cover point
            CoverPoint = CoverManager.GetCloseCover(t);
        }
        if (CoverPoint != null)
        {
            Agent.stoppingDistance = 0.1f;
            Speed = playerInFront ? defaultSpeed : 6;
            Agent.SetDestination(CoverPoint.transform.position);
            AgentState = AIAgentState.Covering;
            CoverTime  = time;
            AIWeapon.Fire(bl_AIShooterWeapon.FireReason.OnMove);
            return(true);
        }
        else
        {
            //if there are not a near cover point
            if (Target != null)
            {
                //follow target
                Agent.SetDestination(Target.position);
                Speed      = playerInFront ? defaultSpeed : 7;
                personal   = true;
                AgentState = AIAgentState.Searching;
            }
            else
            {
                CoverPoint = CoverManager.GetCloseCoverForced(transform);
                Agent.SetDestination(CoverPoint.transform.position);
                Speed = defaultSpeed;
            }
            return(false);
        }
    }
    public bl_AICoverPoint GetCloseCover(Transform target, bl_AICoverPoint overrdidePoint)
    {
        bl_AICoverPoint cover = null;
        float           d     = MaxDistance;

        for (int i = 0; i < AllCovers.Count; i++)
        {
            float dis = bl_UtilityHelper.Distance(target.position, AllCovers[i].transform.position);
            if (dis < MaxDistance && dis < d && AllCovers[i] != overrdidePoint)
            {
                d     = dis;
                cover = AllCovers[i];
            }
        }

        return(cover);
    }
    public bl_AICoverPoint GetCloseCoverForced(Transform target)
    {
        bl_AICoverPoint cover = null;
        float           d     = 100000;

        for (int i = 0; i < AllCovers.Count; i++)
        {
            float dis = bl_UtilityHelper.Distance(target.position, AllCovers[i].transform.position);
            if (dis < d)
            {
                d     = dis;
                cover = AllCovers[i];
            }
        }

        return(cover);
    }
 public static void Register(bl_AICoverPoint co)
 {
     AllCovers.Add(co);
 }