195 lines
4.3 KiB
C#
195 lines
4.3 KiB
C#
|
|
using UdonSharp;
|
|
using UnityEngine;
|
|
using VRC.SDKBase;
|
|
using VRC.Udon.Common;
|
|
using VRC.Udon.Common.Interfaces;
|
|
|
|
|
|
[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)]
|
|
public class FilingCabinet : UdonSharpBehaviour
|
|
{
|
|
[SerializeField] private AudioManager _AudioManager;
|
|
[SerializeField] private Animator _Animator;
|
|
[SerializeField] private GameObject[] _DrawerHandleTriggers;
|
|
[SerializeField] private FilingCabinetNoteDispenser[] _NoteDispensers;
|
|
|
|
[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);
|
|
}
|
|
|
|
if (!_Activate)
|
|
{
|
|
for (int i = 0; i < DRAWER_COUNT; i++)
|
|
{
|
|
_DrawerIsOpen[i] = false;
|
|
ToggleDrawer(i);
|
|
}
|
|
}
|
|
|
|
RequestSerialization();
|
|
}
|
|
}
|
|
get => _Activate;
|
|
}
|
|
}
|