196 lines
4.4 KiB
C#

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