using Unity.Netcode;
using UnityEngine;
using UnityEngine.XR.Content.Interaction;
namespace XRMultiplayer
{
[RequireComponent(typeof(XRLever))]
public class NetworkXRLever : NetworkBehaviour
{
///
/// The networked knob value.
///
NetworkVariable m_NetworkedLeverValue = new NetworkVariable(false, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Server);
XRLever m_XRLever;
void Awake()
{
// Get associated components
if (!TryGetComponent(out m_XRLever))
{
Utils.Log("Missing Components! Disabling Now.", 2);
enabled = false;
return;
}
}
///
public override void OnNetworkSpawn()
{
base.OnNetworkSpawn();
m_XRLever.onLeverActivate.AddListener(LeverChanged);
m_XRLever.onLeverDeactivate.AddListener(LeverChanged);
if (IsServer)
{
m_NetworkedLeverValue.Value = m_XRLever.value;
}
else
{
m_XRLever.value = m_NetworkedLeverValue.Value;
}
}
public override void OnNetworkDespawn()
{
base.OnNetworkDespawn();
m_XRLever.onLeverActivate.RemoveListener(LeverChanged);
m_XRLever.onLeverDeactivate.RemoveListener(LeverChanged);
}
void LeverChanged()
{
LeverChangedServerRpc(m_XRLever.value, NetworkManager.Singleton.LocalClientId);
}
[ServerRpc(RequireOwnership = false)]
void LeverChangedServerRpc(bool newValue, ulong clientId)
{
m_NetworkedLeverValue.Value = newValue;
LeverChangedClientRpc(newValue, clientId);
}
[ClientRpc]
void LeverChangedClientRpc(bool newValue, ulong clientId)
{
if (clientId != NetworkManager.Singleton.LocalClientId)
{
m_XRLever.onLeverActivate.RemoveListener(LeverChanged);
m_XRLever.onLeverDeactivate.RemoveListener(LeverChanged);
m_XRLever.value = newValue;
m_XRLever.onLeverActivate.AddListener(LeverChanged);
m_XRLever.onLeverDeactivate.AddListener(LeverChanged);
}
}
}
}