2025-08-24 18:14:53 -04:00

92 lines
1.9 KiB
C#

using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;
using VRC.Udon.Common.Interfaces;
[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)]
public class JailChain : UdonSharpBehaviour
{
[SerializeField] private GameManagerRound2 _GameManager;
[Space]
[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 (!_HasBeenActivated && transform.localPosition.z < _PullTarget.transform.localPosition.z)
{
_HasBeenActivated = true;
RequestSerialization();
if (Networking.IsOwner(gameObject))
{
_GameManager.SendCustomNetworkEvent(NetworkEventTarget.All, "PlayInJailAnimation");
}
}
}
else
{
transform.localPosition = Vector3.Lerp(transform.localPosition, Vector3.zero, Time.deltaTime * _ReturnSpeedMultiplier);
}
_ChainPivot.LookAt(_ChainHome.transform);
base.PostLateUpdate();
}
public override void OnPickup()
{
_PullChain = true;
RequestSerialization();
base.OnPickup();
}
public override void OnDrop()
{
_PullChain = false;
RequestSerialization();
base.OnDrop();
}
public void Initialise()
{
_PullChain = false;
_HasBeenActivated = false;
transform.localPosition = Vector3.zero;
_ChainPivot.localRotation = Quaternion.identity;
Show = false;
RequestSerialization();
}
public bool Show
{
set
{
_Show = value;
_JailChainAnimator.SetBool("Show", _Show);
RequestSerialization();
}
get => _Show;
}
}