public void ShootRound(GameObject target, GameObject shooter, Vector3 newShooterTransform)
    {
        AI_Follower_Script shooterUnit = shooter.GetComponent <AI_Follower_Script>();

        Vector3 up1 = new Vector3(0, 0.5f);

        RaycastHit[] hits;
        bool         shot = false;

        float distance = Vector3.Distance(newShooterTransform, target.transform.position);

        if (distance < shooterUnit.maxRange)
        {
            hits = Physics.RaycastAll(newShooterTransform + up1, (target.transform.position - newShooterTransform), distance);
            Vector3 lookDirection = target.transform.position;
            lookDirection.y = 0;
            shooter.transform.LookAt(lookDirection);
            foreach (RaycastHit h in hits)
            {
                if (h.collider.tag == "Tall Cover")
                {
                    if (Vector3.Distance(shooter.transform.position, h.transform.position) <= 2 && target != h.collider.gameObject)
                    {
                    }
                    else
                    {
                        Debug.Log("Hit Tall Cover");
                        shot = false;
                        shooterUnit.aiScript.GetComponent <AudioSource>().Play();
                        StartCoroutine(DelayedDamage(1.0f, h.collider.gameObject));
                        break;
                    }
                }
                else if (h.collider.tag == "Low Cover")
                {
                    if (distance - Vector3.Distance(shooter.transform.position, h.transform.position) <= 0.5)
                    {
                        Debug.Log("Hit Low Cover");
                        shot = false;
                        shooterUnit.aiScript.GetComponent <AudioSource>().Play();
                        StartCoroutine(DelayedDamage(1.0f, h.collider.gameObject));
                        break;
                    }
                    else if (distance - Vector3.Distance(shooter.transform.position, h.transform.position) <= 1.5)
                    {
                        if (target.tag == "Good Guy" || target.tag == "Bad Guy")
                        {
                            Debug.Log("Hit Low Cover");
                            shot = false;
                            shooterUnit.aiScript.GetComponent <AudioSource>().Play();
                            StartCoroutine(DelayedDamage(1.0f, h.collider.gameObject));
                            break;
                        }
                        else if (distance - Vector3.Distance(shooter.transform.position, h.transform.position) <= 0.5 && target.tag == "Low Cover")
                        {
                            Debug.Log("Hit Low Cover");
                            shot = false;
                            shooterUnit.aiScript.GetComponent <AudioSource>().Play();
                            StartCoroutine(DelayedDamage(1.0f, h.collider.gameObject));
                            break;
                        }
                        else
                        {
                            Debug.Log("Went Over Low Cover");
                        }
                    }
                    else
                    {
                        Debug.Log("Went Over Low Cover");
                    }
                }
                else if (h.collider.tag == "Good Guy")
                {
                    if (shooter.tag == "Bad Guy")
                    {
                        if (target == h.collider.gameObject)
                        {
                            shot        = true;
                            damagedUnit = h.collider.gameObject.GetComponent <AI_Follower_Script>();
                        }
                    }
                }
                else if (h.collider.tag == "Bad Guy")
                {
                    if (shooter.tag == "Good Guy")
                    {
                        if (target == h.collider.gameObject)
                        {
                            shot        = true;
                            damagedUnit = h.collider.gameObject.GetComponent <AI_Follower_Script>();
                        }
                    }
                }
            }
        }

        if (shot == true)
        {
            shooterUnit.DealDamage(damagedUnit);
            Debug.Log("Hit Unit");
        }
    }
    public Vector3 Shoot(GameObject target, GameObject shooter)
    {
        AI_Follower_Script shooterUnit = shooter.GetComponent <AI_Follower_Script>();

        Vector3 newPos = new Vector3(0, 0, 0);

        shooterUnit.aiScript.unitCamera.GetComponent <AudioSource>().Play();

        for (float i = 0; i < 2; i += 0.3f)
        {
            StartCoroutine(DelayedSpawn(i, shooterUnit));
        }

        Vector3 up1 = new Vector3(0, 0.5f);

        RaycastHit[] hits;

        float distance = Vector3.Distance(shooter.transform.position, target.transform.position);
        bool  shot     = false;

        if (distance < shooterUnit.maxRange)
        {
            hits = Physics.RaycastAll(shooter.transform.position + up1, (target.transform.position - shooter.transform.position), distance);
            Vector3 lookDirection = target.transform.position;
            lookDirection.y = 0;
            shooter.transform.LookAt(lookDirection);
            foreach (RaycastHit h in hits)
            {
                if (h.collider.tag == "Tall Cover")
                {
                    if (Vector3.Distance(shooter.transform.position, h.transform.position) <= 2 && target != h.collider.gameObject)
                    {
                        RaycastHit hit;
                        shooter.transform.position += shooter.transform.right;
                        Chunk_Script avoidChunk = shooter.GetComponent <AI_Follower_Script>().GetChunkUnder();
                        if (avoidChunk.impassable == false)
                        {
                            if (Physics.Raycast(shooter.transform.position + up1, shooter.transform.forward, out hit, 1.5f))
                            {
                                if (hit.collider.tag == ("Tall Cover"))
                                {
                                    Debug.Log("Attempted and hit cover still");
                                }
                                else
                                {
                                    ShootRound(target, shooter, shooter.transform.position);
                                    newPos = shooter.transform.position;
                                    Debug.Log("Attempted and didn't hit cover");
                                    shooter.transform.position += -shooter.transform.right;
                                    break;
                                }
                            }
                            else
                            {
                                ShootRound(target, shooter, shooter.transform.position);
                                newPos = shooter.transform.position;
                                Debug.Log("Attempted and didn't hit cover");
                                shooter.transform.position += -shooter.transform.right;
                                break;
                            }
                        }

                        shooter.transform.position += -shooter.transform.right;
                        shooter.transform.position += -shooter.transform.right;
                        avoidChunk = shooter.GetComponent <AI_Follower_Script>().GetChunkUnder();
                        if (avoidChunk.impassable == false)
                        {
                            if (Physics.Raycast(shooter.transform.position + up1, shooter.transform.forward, out hit, 1.5f))
                            {
                                if (hit.collider.tag == ("Tall Cover"))
                                {
                                    Debug.Log("Attempted and hit cover still");
                                    Debug.Log("Hit Tall Cover");
                                    shot = false;
                                    shooterUnit.aiScript.GetComponent <AudioSource>().Play();
                                    StartCoroutine(DelayedDamage(1.0f, h.collider.gameObject));
                                    break;
                                }
                                else
                                {
                                    ShootRound(target, shooter, shooter.transform.position);
                                    newPos = shooter.transform.position;
                                    Debug.Log("Attempted and didn't hit cover");
                                    shooter.transform.position += shooter.transform.right;
                                    break;
                                }
                            }
                            else
                            {
                                ShootRound(target, shooter, shooter.transform.position);
                                newPos = shooter.transform.position;
                                Debug.Log("Attempted and didn't hit cover");
                                shooter.transform.position += shooter.transform.right;
                                break;
                            }
                        }
                    }
                    else
                    {
                        Debug.Log("Hit Tall Cover");
                        shooterUnit.aiScript.GetComponent <AudioSource>().Play();
                        StartCoroutine(DelayedDamage(1.0f, h.collider.gameObject));
                        shot   = false;
                        newPos = shooterUnit.transform.position;
                        break;
                    }
                }
                else if (h.collider.tag == "Low Cover")
                {
                    if (Vector3.Distance(target.transform.position, h.transform.position) <= 0.5)
                    {
                        Debug.Log("Hit Low Cover");
                        shooterUnit.aiScript.GetComponent <AudioSource>().Play();
                        StartCoroutine(DelayedDamage(1.0f, h.collider.gameObject));
                        shot   = false;
                        newPos = shooterUnit.transform.position;
                        break;
                    }
                    else if (Vector3.Distance(target.transform.position, h.transform.position) <= 1.5)
                    {
                        if (target.tag == "Good Guy" || target.tag == "Bad Guy")
                        {
                            Debug.Log("Hit Low Cover");
                            shooterUnit.aiScript.GetComponent <AudioSource>().Play();
                            StartCoroutine(DelayedDamage(1.0f, h.collider.gameObject));
                            shot   = false;
                            newPos = shooterUnit.transform.position;
                            break;
                        }
                        else if (distance - Vector3.Distance(shooter.transform.position, h.transform.position) <= 0.5 && target.tag == "Low Cover")
                        {
                            Debug.Log("Hit Low Cover");
                            shooterUnit.aiScript.GetComponent <AudioSource>().Play();
                            StartCoroutine(DelayedDamage(1.0f, h.collider.gameObject));
                            shot   = false;
                            newPos = shooterUnit.transform.position;
                            break;
                        }
                        else
                        {
                            Debug.Log("Went Over Low Cover");
                        }
                    }
                    else if (target.transform == h.collider.gameObject.transform)
                    {
                        Debug.Log("Hit Low Cover");
                        shooterUnit.aiScript.GetComponent <AudioSource>().Play();
                        StartCoroutine(DelayedDamage(1.0f, h.collider.gameObject));
                        shot   = false;
                        newPos = shooterUnit.transform.position;
                        break;
                    }
                    else
                    {
                        Debug.Log("Went Over Low Cover");
                    }
                }
                else if (h.collider.tag == "Good Guy")
                {
                    if (shooter.tag == "Bad Guy")
                    {
                        if (target == h.collider.gameObject)
                        {
                            shot        = true;
                            damagedUnit = h.collider.gameObject.GetComponent <AI_Follower_Script>();
                        }
                    }
                }
                else if (h.collider.tag == "Bad Guy")
                {
                    if (shooter.tag == "Good Guy")
                    {
                        if (target == h.collider.gameObject)
                        {
                            shot        = true;
                            damagedUnit = h.collider.gameObject.GetComponent <AI_Follower_Script>();
                        }
                    }
                }
            }
        }
        if (shot == true)
        {
            shooterUnit.DealDamage(damagedUnit);
            Debug.Log("Hit Unit");
            newPos = shooterUnit.transform.position;
        }

        return(newPos);
    }