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");
}
}