using UdonSharp; using UnityEngine; using VRC.SDK3.Components; using VRC.SDKBase; using VRC.Udon.Common.Interfaces; [UdonBehaviourSyncMode(BehaviourSyncMode.Manual)] public class JailChain : UdonSharpBehaviour { [SerializeField] private GameManagerRound2 _GameManager; [Space] [SerializeField] private VRCPickup _Pickup; [SerializeField] private Transform _ChainPivot; [SerializeField] private Transform _ChainHome; [SerializeField] private Transform _PullTarget; [Space] [SerializeField] private Animator _JailChainAnimator; [Space] [Tooltip("Speed at which the chain returns to its neutral pose.")] [SerializeField] private float _ReturnSpeedMultiplier = 5.0f; [UdonSynced, FieldChangeCallback(nameof(Show))] private bool _Show = false; [UdonSynced] private bool _PullChain = false; [UdonSynced] private bool _HasBeenActivated = false; public override void PostLateUpdate() { if (_PullChain) { if (Networking.IsOwner(gameObject) && !_HasBeenActivated && _Pickup.transform.localPosition.z < _PullTarget.transform.localPosition.z) { _HasBeenActivated = true; RequestSerialization(); _GameManager.SendCustomNetworkEvent(NetworkEventTarget.Owner, "PlayInJailAnimation"); } } else { _Pickup.transform.localPosition = Vector3.Lerp(_Pickup.transform.localPosition, Vector3.zero, Time.deltaTime * _ReturnSpeedMultiplier); } _ChainPivot.LookAt(_ChainHome.transform); base.PostLateUpdate(); } public void ChainPickedUp() { _PullChain = true; RequestSerialization(); } public void ChainDropped() { _PullChain = false; if (_HasBeenActivated) { _Pickup.pickupable = false; SendCustomEventDelayedSeconds(nameof(HideJailChain), 3.0f); } RequestSerialization(); } public void HideJailChain() { Show = false; } public void Initialise() { _PullChain = false; _HasBeenActivated = false; _Pickup.transform.localPosition = Vector3.zero; _ChainPivot.localRotation = Quaternion.identity; Show = false; RequestSerialization(); } public bool Show { set { _Show = value; if (_Show) _Pickup.pickupable = true; _JailChainAnimator.SetBool("Show", _Show); RequestSerialization(); } get => _Show; } }