Reload system staying at full magazine for as long as reload time?

So, I am trying to implement a reload system into my game, and it works very well, except for one thing. When the gun is finished reloading, it stays at full capacity for as long as it’s reload time!
My code:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;

public class gunShoot : MonoBehaviour
{
public GameObject bullet;
public GameObject muzFlash;
public Transform bulletStart;
public bulletProp bProp;
public float reloadLeft;
public int shotsFired;
public bool ready;
public ParticleSystem muzSystem;
public TMP_Text shotText;
// Start is called before the first frame update
void Start()
{
shotsFired = 0;
bProp = bullet.GetComponent();
muzFlash = bulletStart.Find(“muzFlash”).gameObject;
muzSystem = muzFlash.GetComponent();
shotText = GameObject.Find(“shotsLeft”).GetComponent<TMP_Text>();
}

// Update is called once per frame
void Update()
{
    int shotsRemaining = bProp.maxShots - shotsFired;
    string shotsLeftText = shotsRemaining.ToString();
    shotText.SetText(shotsLeftText);
    if(reloadLeft < 0f)
    {
        ready = true;
    } else
    {
        ready = false;
        reloadLeft -= Time.deltaTime;
    }

    if(shotsFired >= bProp.maxShots)
    {
        IEnumerator reloadCoro = Reload(bProp.restockTime);
        StartCoroutine(reloadCoro);
    }

    switch (bProp.semiAuto)
    {
        case false:
            if (Input.GetMouseButton(0) && shotsFired < bProp.maxShots)
            {
                Shoot();
            }
            break;
        case true:
            if (Input.GetMouseButtonDown(0) && shotsFired < bProp.maxShots)
            {
                Shoot();
            }
            break;
    }
}

void Shoot()
{
    if(ready == true)
    {
        for (int i = 0; i < bProp.bulletCount; i++)
        {
            GameObject bulletInstance = Instantiate(bullet, bulletStart.position, bulletStart.rotation);
            Rigidbody2D bulletRb = bulletInstance.GetComponent<Rigidbody2D>();
            bulletInstance.transform.Rotate(0, 0, Random.Range(-bProp.spread, bProp.spread));
            bulletRb.AddForce(bProp.bulletSpeed * bulletInstance.transform.up * Time.deltaTime);
            shotsFired++;
        }
        muzSystem.Play();
        reloadLeft = bProp.reloadSpeed;
    }
}

IEnumerator Reload(float waitTime)
{
    yield return new WaitForSeconds(waitTime);
    shotsFired -= bProp.maxShots;
}

}

What’s happening is when shotsFired >= bProp.maxShots there is a delay of waitTime before shotsFired -= bProp.maxShots, for the entire time that delay is active you are calling your Coroutine every frame since shotsFired will be >= to bProp.maxShots until the Coroutine resolves. A simple bool should solve it:

bool reloading;

if(shotsFired >= bProp.maxShots && !reloading)
{
    reloading = true;
    IEnumerator reloadCoro = Reload(bProp.restockTime);
    StartCoroutine(reloadCoro);
}

and then in the Coroutine do:

IEnumerator Reload(float waitTime)
{
    yield return new WaitForSeconds(waitTime);
    shotsFired -= bProp.maxShots;
    reloading = false;
}