Network Shooting Loop for Client

Hey, I want to recreate the Tanks! game from the Unity tutorial series as multiplayer. I already watched the Network series for that as well. But I have a problem with implementing the shooting right. The tanks can charge up to increase the launch force of the bullet. It works for the host but the client gets stuck in firing.

The code:

 [ClientCallback]
    private void Update()
    {
        if (!isLocalPlayer)
            return;

        if (m_CurrentLaunchForce >= MaxLaunchForce && !m_Fired)
        {
            m_CurrentLaunchForce = MaxLaunchForce;
            Debug.Log("Max force achieved! Firing!");
            CmdFire();
        }
        else if (Input.GetButtonDown("Fire1"))
        {
            m_Fired = false;
            m_CurrentLaunchForce = MinLaunchForce;
            Debug.Log("Start charging up!");
        }
        else if (Input.GetButton("Fire1") && !m_Fired)
        {
            m_CurrentLaunchForce += m_ChargeSpeed * Time.deltaTime;
            Debug.Log("Charging up!");
        }
        else if (Input.GetButtonUp("Fire1") && !m_Fired)
        {
            Debug.Log("Firing with low force!");
            CmdFire();
        }
    }

[Command]
private void CmdFire()
{
    m_Fired = true;
    Rigidbody shellInstance = Instantiate(ShellPrefab, FireTransform.position, FireTransform.rotation);
    shellInstance.velocity = m_CurrentLaunchForce * transform.forward;
    m_CurrentLaunchForce = MinLaunchForce;
    NetworkServer.Spawn(shellInstance.gameObject);
    m_Fired = false;
}

The client which is not the host gets stuck in the second if case :

if (m_CurrentLaunchForce >= MaxLaunchForce && !m_Fired)

I checked the variables in the Debugger, and the currentLaunchForce gets never resetted to minLaunchForce.

I found the solution by myself. I implemented another function “fire()” which is called from the Update function first, which then again calls the command “cmdfire()”. In the fire command I reset the variables and in the command I just tell the server to spawn the projectile for alle clients with the force as parameter.

private void fire()
{
    m_Fired = true;
    CmdFire(m_CurrentLaunchForce);
    m_CurrentLaunchForce = MinLaunchForce;
    m_Fired = false;
    startReloadTime();
}


private void CmdFire(float launchForce)
    {
        Rigidbody bulletInstance = Instantiate(BulletPrefab, FireTransform.position, FireTransform.rotation);
        bulletInstance.velocity = launchForce * transform.forward;
        NetworkServer.Spawn(bulletInstance.gameObject);
    }

It seems that if you use certain variables to check certain conditions on the client, you also have to reset them on the client himself, like in my case:

private float m_CurrentLaunchForce;                                             
private bool m_Fired;

And then just tell the server to spawn your objects with options like force, position, rotation as function parameters to verify them, depending on how concerned you are about cheating.