157 lines
3.4 KiB
C#

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