Error on parenting/transfer ownership - netcode

somehow, only the Host can grab the axe and i still cant figure out whats going on. can someone help me?

using UnityEngine;
using Unity.Netcode;

public class weaponController : NetworkBehaviour
{
    public Transform equipPosition;
    public float distance = 10f;

    private GameObject wp;
    private STM_PlayerController playerCon;
    private bool canGrab;

    private NetworkVariable<bool> isHoldingWeapon = new NetworkVariable<bool>(false, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Server);
    private NetworkVariable<NetworkObjectReference> currentWeaponRef = new NetworkVariable<NetworkObjectReference>();

    public override void OnNetworkSpawn()
    {
        if (!IsOwner) this.enabled = false;

        isHoldingWeapon.OnValueChanged += OnWeaponStateChanged;
    }

    private void Start()
    {
        playerCon = GetComponent<STM_PlayerController>();

        if (playerCon == null)
        {
            Debug.LogError("STM_PlayerController não foi encontrado no GameObject.");
            return;
        }

        playerCon.isHoldingWeapon = false;
        playerCon.attackRequested = false;
    }

    private void Update()
    {
        if (!IsOwner) return;

        CheckWeapons();

        if (canGrab && Input.GetKeyDown(KeyCode.E))
        {
            if (isHoldingWeapon.Value) DropWeaponServerRpc();
            else PickUpWeaponServerRpc();
        }

        if (isHoldingWeapon.Value && Input.GetKeyDown(KeyCode.Q))
        {
            DropWeaponServerRpc();
        }
    }

    private void CheckWeapons()
    {
        RaycastHit hit;

        Debug.DrawRay(Camera.main.transform.position, Camera.main.transform.forward * distance, Color.red);

        if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hit, distance))
        {
            if (hit.transform.CompareTag("CanGrab"))
            {
                canGrab = true;
                wp = hit.transform.gameObject;
            }
        }
        else
        {
            canGrab = false;
        }
    }

    [ServerRpc(RequireOwnership = false)]
    private void PickUpWeaponServerRpc(ServerRpcParams serverRpcParams = default)
    {
        if (wp == null)
        {
            Debug.LogWarning("Server: wp está null.");
            return;
        }

        var weaponNetworkObject = wp.GetComponent<NetworkObject>();
        if (weaponNetworkObject == null)
        {
            Debug.LogWarning("Server: NetworkObject da arma não encontrado.");
            return;
        }

        weaponNetworkObject.ChangeOwnership(serverRpcParams.Receive.SenderClientId);

        Debug.Log($"Server: Propriedade da arma transferida para {serverRpcParams.Receive.SenderClientId}");

        currentWeaponRef.Value = weaponNetworkObject;
        isHoldingWeapon.Value = true;

        PickUpWeaponClientRpc(weaponNetworkObject.NetworkObjectId);
    }

    [ClientRpc]
    private void PickUpWeaponClientRpc(ulong weaponId)
    {
        if (!NetworkManager.Singleton.SpawnManager.SpawnedObjects.TryGetValue(weaponId, out NetworkObject weaponNetworkObject))
        {
            Debug.LogError("Client: Weapon NetworkObject não encontrado.");
            return;
        }

        Debug.Log($"Client: Arma {weaponNetworkObject.name} encontrada, equipando.");

        var weapon = weaponNetworkObject.gameObject;

        weapon.transform.position = equipPosition.position;
        weapon.transform.parent = equipPosition;
        weapon.transform.localEulerAngles = Vector3.zero;
        weapon.GetComponent<Rigidbody>().isKinematic = true;

        playerCon.isHoldingWeapon = true;
    }


    [ServerRpc(RequireOwnership = false)]
    private void DropWeaponServerRpc()
    {
        if (!isHoldingWeapon.Value) return;

        isHoldingWeapon.Value = false;

        DropWeaponClientRpc();
    }

    [ClientRpc]
    private void DropWeaponClientRpc()
    {
        if (currentWeaponRef.Value.TryGet(out NetworkObject weaponNetworkObject))
        {
            var weapon = weaponNetworkObject.gameObject;
            weapon.transform.parent = null;
            weapon.GetComponent<Rigidbody>().isKinematic = false;
        }

        playerCon.isHoldingWeapon = false;
    }

    private void OnWeaponStateChanged(bool oldValue, bool newValue)
    {
        if (!newValue)
        {
            if (currentWeaponRef.Value.TryGet(out NetworkObject weaponNetworkObject))
            {
                weaponNetworkObject.gameObject.transform.parent = null;
            }
        }
    }

    public void EndOfAttack()
    {
        playerCon.attackEnded = true;
        playerCon.animator.SetBool("isAttacking", false);
        Debug.Log("playerCon.attackEnded");
    }
}

That’s almost always a problem of not considering ownership and the network roles of participants.

Maybe:

You only perform the CheckWeapons task for the owner of the script’s object. Perhaps this isn’t what you meant to do?

If not, please specify where in your script things go wrong eg what gets logged for host and client.