using TMPro; using UdonSharp; using UnityEngine; using VRC.SDK3.Components; using VRC.SDK3.Image; using VRC.SDK3.UdonNetworkCalling; using VRC.SDKBase; using VRC.Udon.Common.Interfaces; [UdonBehaviourSyncMode(BehaviourSyncMode.Manual)] public class ACMECrimenetComputer : UdonSharpBehaviour { [SerializeField] private GameManagerRound1 _GameManager; [SerializeField] private AudioManager _AudioManager; [SerializeField] private PermissionsPanel _PermissionsPanel; [Space] [SerializeField] private GameObject _ComputerBase; [SerializeField] private VRCObjectSync _ClueImageCard; [SerializeField] private MeshRenderer _ClueImageCardMesh; [Space] [SerializeField] private VRCObjectSync _UntranslatedCard; [SerializeField] private Transform _UntranslatedCardSpawn; [SerializeField] private Transform _UntranslatedCardAnimator; [SerializeField] private TextMeshProUGUI _UntranslatedTextGUI; [Space] [SerializeField] private VRCObjectSync _TranslatedCard; [SerializeField] private Transform _TranslatedCardAnimator; [SerializeField] private TextMeshProUGUI _TranslatedTextGUI; [Space] [SerializeField] private GameObject _HiddenTextCanvas; [SerializeField] private TextMeshProUGUI _HiddenTextGUI; [Space] [SerializeField] private GameObject[] _Interactables; [UdonSynced, FieldChangeCallback(nameof(Activate))] private bool _Activate = false; [UdonSynced, FieldChangeCallback(nameof(UntranslatedText))] private string _UntranslatedText = ""; [UdonSynced, FieldChangeCallback(nameof(TranslatedText))] private string _TranslatedText = ""; [UdonSynced, FieldChangeCallback(nameof(HiddenText))] private string _HiddenText = ""; [UdonSynced, FieldChangeCallback(nameof(ClueImage))] private int _ClueImage = -1; [UdonSynced, FieldChangeCallback(nameof(ClueImageScale))] private float _ClueImageScale = 1.0f; private VRCImageDownloader _ClueImageDownloader; private Animator _Animator; private void Start() { _ClueImageDownloader = new VRCImageDownloader(); _Animator = GetComponent(); } void OnDestroy() { _ClueImageDownloader.Dispose(); } private void SetUntranslatedText(string Untranslated) { _UntranslatedText = Untranslated; _UntranslatedTextGUI.text = _UntranslatedText; RequestSerialization(); } private void SetTranslatedText(string Translated) { _TranslatedText = Translated; _TranslatedTextGUI.text = _TranslatedText; RequestSerialization(); } private void SetHiddenText(string Hidden) { _HiddenText = Hidden; _HiddenTextGUI.text = _HiddenText; _HiddenTextCanvas.SetActive(_HiddenText != "" && _PermissionsPanel.IsPlayerHost(Networking.LocalPlayer)); RequestSerialization(); } private void _SwooceRightIn() { _Animator.SetBool("Swooce Right In", true); foreach (GameObject Interactable in _Interactables) { Interactable.SetActive(true); } _EnableCards(false); _DisableAllCardSync(); _AudioManager.SendCustomNetworkEvent(NetworkEventTarget.All, "PlayMusicLoop", MusicEventType.ACMECrimenetComputerIdle); } private void _SwooceRightBackOutAgain() { foreach (GameObject Interactable in _Interactables) { Interactable.SetActive(false); } _HiddenTextCanvas.SetActive(false); ClueImageScale = 1.0f; _Animator.SetBool("Swooce Right In", false); _Animator.SetBool("Open Compartment", false); _Animator.SetBool("Throw Clue Into The Air", false); _Animator.SetBool("Run Translator", false); _AudioManager.SendCustomNetworkEvent(NetworkEventTarget.All, "FadeOutMusic"); _ClueImageCard.transform.localPosition = Vector3.zero; _ClueImageCard.transform.localRotation = Quaternion.identity; _UntranslatedCard.transform.SetParent(_UntranslatedCardSpawn); _UntranslatedCard.transform.localPosition = Vector3.zero; _UntranslatedCard.transform.localRotation = Quaternion.identity; _TranslatedCard.transform.SetParent(_TranslatedCardAnimator); _TranslatedCard.transform.localPosition = Vector3.zero; _TranslatedCard.transform.localRotation = Quaternion.identity; _DisableAllCardSync(); _EnableCards(false); } public void EnableClueImageCardSync() { _ClueImageCard.enabled = true; } public void EnableUntranslatedCardSync() { _UntranslatedCard.enabled = true; } public void EnableTranslatedCardSync() { _TranslatedCard.enabled = true; } private void _DisableAllCardSync() { _ClueImageCard.enabled = false; _UntranslatedCard.enabled = false; _TranslatedCard.enabled = false; } private void _EnableCards(bool Enable) { _ClueImageCard.gameObject.SetActive(Enable); _UntranslatedCard.gameObject.SetActive(Enable); _TranslatedCard.gameObject.SetActive(Enable); } private void LoadClueImage() { TextureInfo AdditionalTextureInfo = new TextureInfo(); AdditionalTextureInfo.WrapModeU = TextureWrapMode.Clamp; AdditionalTextureInfo.WrapModeV = TextureWrapMode.Clamp; AdditionalTextureInfo.GenerateMipMaps = true; _ClueImageDownloader.DownloadImage( _GameManager.GetClueImageURL(_ClueImage), null, (IUdonEventReceiver)this, AdditionalTextureInfo); } public override void OnImageLoadSuccess(IVRCImageDownload Result) { _ClueImageCardMesh.material.SetTexture("_MainTex", Result.Result); base.OnImageLoadSuccess(Result); } [NetworkCallable] public void OpenCompartment() { _ClueImageCard.gameObject.SetActive(true); _AudioManager.PlaySFX(SFXEventType.LeverCartoon); _Animator.SetBool("Open Compartment", true); } [NetworkCallable] public void ThrowClueIntoTheAir() { _UntranslatedCard.gameObject.SetActive(true); _AudioManager.PlaySFX(SFXEventType.Boing); _Animator.SetBool("Throw Clue Into The Air", true); } [NetworkCallable] public void RunTranslator() { _AudioManager.PlaySFX(SFXEventType.Printer); _UntranslatedCard.transform.SetParent(_UntranslatedCardAnimator); _UntranslatedCard.transform.localPosition = Vector3.zero; _UntranslatedCard.transform.localRotation = Quaternion.identity; _TranslatedCard.transform.SetParent(_TranslatedCardAnimator); _TranslatedCard.transform.localPosition = Vector3.zero; _TranslatedCard.transform.localRotation = Quaternion.identity; _Animator.SetBool("Run Translator", true); _UntranslatedCard.enabled = false; } public bool Activate { set { _Activate = value; if (_Activate) { _SwooceRightIn(); } else { _SwooceRightBackOutAgain(); } RequestSerialization(); } get => _Activate; } public string UntranslatedText { set { SetUntranslatedText(value); } get => _UntranslatedText; } public string TranslatedText { set { SetTranslatedText(value); } get => _TranslatedText; } public string HiddenText { set { SetHiddenText(value); } get => _HiddenText; } public int ClueImage { set { if (_ClueImage != value) { _ClueImage = value; LoadClueImage(); RequestSerialization(); } } get => _ClueImage; } public float ClueImageScale { set { _ClueImageScale = value; _ClueImageCard.transform.localScale = new Vector3(_ClueImageScale, _ClueImageScale, _ClueImageScale); RequestSerialization(); } get => _ClueImageScale; } }