using TMPro; using UdonSharp; using UnityEngine; using VRC.SDK3.Components; using VRC.SDKBase; using VRC.Udon.Common; [UdonBehaviourSyncMode(BehaviourSyncMode.Manual)] public class RiskCard : UdonSharpBehaviour { [UdonSynced] public int RiskAmount = 0; [SerializeField] private RiskCardGroup CardGroup = null; [SerializeField] private Collider _Holder; [Space] [SerializeField] private VRCPickup _Pickup; [SerializeField] private VRCObjectSync _ObjectSync; [SerializeField] private UdonSharpBehaviour _CardInteractObject; [Space] [SerializeField] private TextMeshProUGUI _RiskCardText; [SerializeField] private Transform _SpawnPosition; [SerializeField] private Transform _HeldPosition; [UdonSynced] private CardAnchorMode _AnchorMode = CardAnchorMode.AtSpawn; private bool _IsInHeldCollider = false; void Start() { _RiskCardText.text = RiskAmount.ToString(); } void OnTriggerEnter(Collider OtherCollider) { if (OtherCollider == _Holder) { _IsInHeldCollider = true; } } private void OnTriggerExit(Collider OtherCollider) { if (OtherCollider == _Holder) { _IsInHeldCollider = false; } } public override void OnOwnershipTransferred(VRCPlayerApi Player) { if (Utilities.IsValid(_Pickup)) { Networking.SetOwner(Player, _Pickup.gameObject); } base.OnOwnershipTransferred(Player); } public override void OnDeserialization(DeserializationResult Result) { _SetPosition_Synced(); base.OnDeserialization(Result); } public void RiskCardPickedUp() { CardGroup.RiskCardPickedUp(RiskAmount); _ObjectSync.enabled = true; } public void RiskCardDropped() { if (_IsInHeldCollider) { _AnchorMode = CardAnchorMode.AtSpawn; _SetPosition_Synced(); RequestSerialization(); } } public void RiskCardInteract() { CardGroup.RiskCardInteract(RiskAmount); _ObjectSync.enabled = false; } public new void DisableInteractive(bool Disable) { _CardInteractObject.DisableInteractive = (Networking.IsOwner(gameObject) && !Networking.LocalPlayer.IsUserInVR()) ? Disable : true; } public void SetPickupable(bool Pickupable) { _Pickup.pickupable = (Networking.IsOwner(gameObject) && Networking.LocalPlayer.IsUserInVR() && _AnchorMode != CardAnchorMode.InRiskCardHolder) ? Pickupable : false; } public void SetToHeldPosition() { _Pickup.Drop(); _ObjectSync.enabled = false; _Pickup.InteractionText = "Reveal"; _AnchorMode = CardAnchorMode.InHeldPosition; _SetPosition_Synced(); RequestSerialization(); } public void ResetPosition() { _Pickup.Drop(); _Pickup.InteractionText = "Choose"; _AnchorMode = CardAnchorMode.AtSpawn; _SetPosition_Synced(); RequestSerialization(); } private void _SetPosition_Synced() { _ObjectSync.enabled = false; switch (_AnchorMode) { case CardAnchorMode.AtSpawn: _Pickup.transform.SetParent(_SpawnPosition, false); _Pickup.transform.localPosition = Vector3.zero; _Pickup.transform.localRotation = Quaternion.identity; break; case CardAnchorMode.InHeldPosition: _Pickup.transform.SetParent(_HeldPosition, false); _Pickup.transform.localPosition = Vector3.zero; _Pickup.transform.localRotation = Quaternion.identity; break; case CardAnchorMode.InRiskCardHolder: _Pickup.transform.SetParent(_Holder.transform, false); _Pickup.transform.localPosition = Vector3.zero; _Pickup.transform.localRotation = Quaternion.identity; break; } } }