Network transform problem - Client spawns objects at origin not raycast hitpoint

I’m working on a Fortnite-esque game for Unity. Player spawns in, has ability to spawn cubes to make a “base”. Everything works perfectly well in mono but I’m having a strange issue with networking. On the server, my player can spawn the cubes perfectly according to the Raycast hitpoint while on the client, even though the player is a clone of the Player prefab, the spawned objects always either end up at the world origin, rather than Raycast hitpoint -or- if I remove “if (!isPlayLocal) {return;}” from the player’s script containing Raycast info, the cube spawns inaccurately and without its corresponding material. I’ll try and pinpoint the code so I can place it here but I imagine it could be a number of things. Local Player Auth is checked off on spawn prefabs and all prefabs have been registered in Network Manager.

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

public class BuildingSystemNew : NetworkBehaviour
{

    [SerializeField]
    private Camera playerCamera;

    [SerializeField]
    private GameObject blockTemplatePrefab;

    [SerializeField]
    private GameObject blockPrefab;

    [SerializeField]
    private Material templateMaterial;

    [SerializeField]
    private LayerMask buildableSurfacesLayer;

    private bool buildModeOn = false;
    private bool canBuild = false;
    private bool crossHairOn = false;
    private BlockSystem bSys;
    public Texture2D crosshairImage;
    private int blockSelectCounter = 0;
    private GameObject weapon;
    private Vector3 buildPos;
    private GameObject currentTemplateBlock;


    private void Start()
    {
        bSys = GetComponent<BlockSystem>();
    }

    private void Update()
    {

      if (isLocalPlayer == false)
        return;


      Cursor.lockState = CursorLockMode.Locked;
      Cursor.visible = false;

        if (Input.GetKeyDown("e"))
        {

            buildModeOn = !buildModeOn;

            if (buildModeOn)
            {
                // weapon.SetActive(false);

                crossHairOn = true;
            }
            else
            {
                // weapon.SetActive(true);

                crossHairOn = false;
            }
        }

        if (Input.GetKeyDown("r"))
        {
            blockSelectCounter++;
            if (blockSelectCounter >= bSys.allBlocks.Count) blockSelectCounter = 0;
        }

        if (buildModeOn)
        {
            RaycastHit buildPosHit;

            if (Physics.Raycast(playerCamera.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0)), out buildPosHit, 10, buildableSurfacesLayer))
            {
                Vector3 point = buildPosHit.point;
                buildPos = new Vector3(Mathf.Round(point.x), Mathf.Round(point.y), Mathf.Round(point.z));
                canBuild = true;
            }
            else
            {
                Destroy(currentTemplateBlock.gameObject);
                canBuild = false;
            }
        }

        if (!buildModeOn && currentTemplateBlock != null)
        {
            Destroy(currentTemplateBlock.gameObject);
            canBuild = false;
        }

        if (canBuild && currentTemplateBlock == null)
        {
            currentTemplateBlock = Instantiate(blockTemplatePrefab, buildPos, Quaternion.identity);
            currentTemplateBlock.GetComponent<MeshRenderer>().material = templateMaterial;
        }

        if (canBuild && currentTemplateBlock != null)
        {
            currentTemplateBlock.transform.position = buildPos;

            if (Input.GetMouseButtonDown(0))
            {
                placeBlock();
            }

            else if (Input.GetMouseButtonDown(1))
            {
              destroyBlock();
          }
        }

}

    private void placeBlock(){
      CmdPlaceBlock();
    }

    private void destroyBlock(){
      CmdDestroyBlock();
    }


    [Command]
    public void CmdPlaceBlock()
    {

        GameObject newBlock = Instantiate(blockPrefab, buildPos, Quaternion.identity);
        Block tempBlock = bSys.allBlocks[blockSelectCounter];
        newBlock.name = tempBlock.blockName + "-Block";
        newBlock.GetComponent<MeshRenderer>().material = tempBlock.blockMaterial;
        NetworkServer.SpawnWithClientAuthority(newBlock, connectionToClient);

    }

    [Command]
    private void CmdDestroyBlock(){
       RaycastHit hit;
       Ray ray = playerCamera.ScreenPointToRay(Input.mousePosition);

       // int mask = 0;
       //             mask |= (1 << LayerMask.NameToLayer("PlacedBlock"));
       //             mask = ~mask;

       if (Physics.Raycast(ray, out hit)) {
         var objectHit = hit.collider.gameObject;

         if (hit.collider.gameObject.tag == "Block") {

           Destroy(objectHit);
         }
       }
   }
  //   void OnGUI(){
  //    GUI.Box(new Rect(Screen.width/2,Screen.height/2, 10, 10), "");
  // }

    void OnGUI()
    {

      if (crossHairOn == true) {
        float xMin = (Screen.width / 2) - (crosshairImage.width / 2);
        float yMin = (Screen.height / 2) - (crosshairImage.height / 2);
        GUI.DrawTexture(new Rect(xMin, yMin, crosshairImage.width, crosshairImage.height), crosshairImage);
  }
}
}

[Command]
    public void CmdPlaceBlock(Vector3 pos)
    {
        GameObject newBlock = Instantiate(blockPrefab, pos, Quaternion.identity);
        Block tempBlock = bSys.allBlocks[blockSelectCounter];
        newBlock.name = tempBlock.blockName + "-Block";
        newBlock.GetComponent<MeshRenderer>().material = tempBlock.blockMaterial;
        NetworkServer.SpawnWithClientAuthority(newBlock, connectionToClient);
    }

Use this

Thanks for the feedback, unfortunately I’m getting the following error:
"
There is no argument given that corresponds to the required formal parameter ‘pos’ of ‘BuildingSystemNew.CmdPlaceBlock(Vector3)’
"

Dude write the position in wherever you called CmdPlaceBlock(WRITE POS HERE);