Standard function on networkBehaviour called on the server?

I must be missing something simple but I havent been able to find an answer so bear with me…

I have a script which is called from a [Command] function and inside has the PlayerDie funtion. (this script is on the player with the local authority).

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;

public class PlayerHealth : NetworkBehaviour {

    [SyncVar] int health = 100;

    public GameObject deathCam;

    public void TakeDamage(int damage)
    {
        health -= damage;
        if (health <= 0)
        {
            PlayerDie();
        }
    }

    void PlayerDie()
    {
        Instantiate(deathCam, transform.position, Quaternion.identity);
        NetworkServer.Destroy(gameObject);
    }

}

As you can see I am Instantiating a gameObject on that function and also destroying the player gameObject. The destruction happens on all the clients and the Instantiation happens only on the server even when the local client isn’t the host. My question is why?
From my understanding simple void functions should be called localy like a monoBehaviour script but I am noticing this getting called on the server instead although its not a command. As a result i am seeing the “deathCam” object get spawned on the host and not the client who “died”.

If you want to have the clients do something, you have to make it an RPC:

[TargetRpc]
void TargetPlayerDie(NetworkConnection connection)
{
    Instantiate(deathCam, transform.position, Quaternion.Identity);
}

Also, you probably want to Destroy from the Server:

[Command]
void CmdOnServer() { ...
playerHealth.TargetPlayerDie(playerHealth.connectionToClient);
NetworkServer.Destroy(playerHealth.gameObject);