using UdonSharp; using UnityEngine; using VRC.SDKBase; using VRC.Udon.Common; [UdonBehaviourSyncMode(BehaviourSyncMode.Manual)] public class FilingCabinet : UdonSharpBehaviour { [SerializeField] private AudioManager _AudioManager; [SerializeField] private Animator _Animator; [SerializeField] private GameObject[] _DrawerHandleTriggers; [SerializeField] private FilingCabinetNoteDispenser[] _NoteDispensers; [SerializeField] private CameraSwitchTrigger _CameraSwitcher; [UdonSynced, FieldChangeCallback(nameof(Activate))] private bool _Activate = false; [UdonSynced] public string[] ClueNotes = new string[DRAWER_COUNT] { "", "", "", "" }; [UdonSynced] public int[] ClueImages = new int[DRAWER_COUNT] { -1, -1, -1, -1 }; [UdonSynced] public float[] ClueImageScales = new float[DRAWER_COUNT] { 1.0f, 1.0f, 1.0f, 1.0f }; [UdonSynced] private bool[] _DrawerIsOpen = new bool[DRAWER_COUNT] { false, false, false, false }; private bool[] _CachedDrawerIsOpen = new bool[DRAWER_COUNT] { false, false, false, false }; private string[] _ClueNotesCache = new string[DRAWER_COUNT]; private int[] _ClueImagesCache = new int[DRAWER_COUNT]; private float[] _ClueImageScalesCache = new float[DRAWER_COUNT]; public const int DRAWER_COUNT = 4; private const float NOTE_DISPENSER_ACTIVATE_DELAY = 0.85f; public override void OnDeserialization(DeserializationResult Result) { { // Notes and image changes bool NotesChanged = false; for (int i = 0; i < DRAWER_COUNT; i++) { if (ClueNotes[i] != _ClueNotesCache[i] || ClueImages[i] != _ClueImagesCache[i] || ClueImageScales[i] != _ClueImageScalesCache[i]) { NotesChanged = true; break; } } if (NotesChanged) { UpdateNoteData(); } } for (int i = 0; i < DRAWER_COUNT; i++) { ToggleDrawer(i); } base.OnDeserialization(Result); } public override void OnOwnershipTransferred(VRCPlayerApi Player) { foreach (FilingCabinetNoteDispenser NoteDispenser in _NoteDispensers) { Networking.SetOwner(Player, NoteDispenser.gameObject); } base.OnOwnershipTransferred(Player); } public void OpenDrawer1() { _DrawerIsOpen[0] = !_DrawerIsOpen[0]; ToggleDrawer(0); RequestSerialization(); } public void OpenDrawer2() { _DrawerIsOpen[1] = !_DrawerIsOpen[1]; ToggleDrawer(1); RequestSerialization(); } public void OpenDrawer3() { _DrawerIsOpen[2] = !_DrawerIsOpen[2]; ToggleDrawer(2); RequestSerialization(); } public void OpenDrawer4() { _DrawerIsOpen[3] = !_DrawerIsOpen[3]; ToggleDrawer(3); RequestSerialization(); } private void ToggleDrawer(int Index) { _Animator.SetBool("Open Drawer " + (Index + 1), _DrawerIsOpen[Index]); if (Utilities.IsValid(_NoteDispensers[Index])) { if (_DrawerIsOpen[Index]) { SendCustomEventDelayedSeconds("ActivateNoteDispenser" + (Index + 1), NOTE_DISPENSER_ACTIVATE_DELAY); } else { SendCustomEvent("ActivateNoteDispenser" + (Index + 1)); } } if (_CachedDrawerIsOpen[Index] != _DrawerIsOpen[Index]) { if (_DrawerIsOpen[Index]) { _AudioManager.PlaySFX(SFXEventType.FileCabinetOpen); } else { _AudioManager.PlaySFX(SFXEventType.FileCabinetClose); } } _CachedDrawerIsOpen[Index] = _DrawerIsOpen[Index]; } public void UpdateNoteData() { for (int i = 0; i < _NoteDispensers.Length && i < DRAWER_COUNT; i++) { _NoteDispensers[i].Note = ClueNotes[i]; _NoteDispensers[i].Image = ClueImages[i]; _NoteDispensers[i].ImageScale = ClueImageScales[i]; _NoteDispensers[i].RequestSerialization(); } _ClueNotesCache = ClueNotes; _ClueImagesCache = ClueImages; _ClueImageScalesCache = ClueImageScales; } public void ActivateNoteDispenser1() { _NoteDispensers[0].Activate = _DrawerIsOpen[0]; } public void ActivateNoteDispenser2() { _NoteDispensers[1].Activate = _DrawerIsOpen[1]; } public void ActivateNoteDispenser3() { _NoteDispensers[2].Activate = _DrawerIsOpen[2]; } public void ActivateNoteDispenser4() { _NoteDispensers[3].Activate = _DrawerIsOpen[3]; } public bool Activate { set { if (_Activate != value) { _Activate = value; foreach (GameObject Trigger in _DrawerHandleTriggers) { Trigger.SetActive(_Activate); } _CameraSwitcher.gameObject.SetActive(_Activate); if (!_Activate) { for (int i = 0; i < DRAWER_COUNT; i++) { _DrawerIsOpen[i] = false; ToggleDrawer(i); } } RequestSerialization(); } } get => _Activate; } }