using UdonSharp; using UnityEngine; using VRC.SDK3.Data; using VRC.SDKBase; using VRC.Udon.Common; [UdonBehaviourSyncMode(BehaviourSyncMode.Manual)] public class PermissionsPanel : UdonSharpBehaviour { [UdonSynced] private string[] PlayerData_Name = new string[MAX_PLAYERS_IN_LIST]; [UdonSynced] private int[] PlayerData_ID = new int[MAX_PLAYERS_IN_LIST]; [UdonSynced] private bool[] PlayerData_Admin = new bool[MAX_PLAYERS_IN_LIST]; [UdonSynced] private bool[] PlayerData_Host = new bool[MAX_PLAYERS_IN_LIST]; [UdonSynced] private bool[] PlayerData_Camera = new bool[MAX_PLAYERS_IN_LIST]; [SerializeField] private RectTransform _ListContainer; [SerializeField] private GameObject _PlayerItemTemplate; private const int MAX_PLAYERS_IN_LIST = 100; void Start() { for (int i = 0; i < PlayerData_Name.Length; i++) { GameObject NewListItem = Instantiate(_PlayerItemTemplate, _ListContainer, false); NewListItem.SetActive(false); } } public override void OnPlayerJoined(VRCPlayerApi Player) { for (int i = 0; i < PlayerData_Name.Length; i++) { if (PlayerData_Name[i] == null) { PlayerData_Name[i] = Player.displayName; PlayerData_ID[i] = Player.playerId; PlayerData_Admin[i] = (Player.isInstanceOwner || Player.isMaster); PlayerData_Host[i] = (Player.isInstanceOwner || Player.isMaster); PlayerData_Camera[i] = (Player.isInstanceOwner || Player.isMaster); break; } } RebuildPlayerList(); RequestSerialization(); base.OnPlayerJoined(Player); } public override void OnPlayerLeft(VRCPlayerApi Player) { for (int i = 0; i < PlayerData_Name.Length; i++) { if (PlayerData_Name[i] == Player.displayName) { Debug.Log("[PermissionsPanel] Found exiting player " + PlayerData_Name[i] + "on the list. Removing..."); PlayerData_Name[i] = null; Debug.Log("[PermissionsPanel] PlayerData_Name[" + i + "] now equals " + PlayerData_Name[i]); break; } } RebuildPlayerList(); RequestSerialization(); base.OnPlayerLeft(Player); } public override void OnDeserialization(DeserializationResult Result) { RebuildPlayerList(); base.OnDeserialization(Result); } public void PermissionsChanged() { for (int i = 0; i < PlayerData_Name.Length; i++) { GameObject Entry = _ListContainer.GetChild(i).gameObject; PermissionsPanelPlayerEntry PlayerEntry = Entry.GetComponent(); PlayerData_Admin[i] = PlayerEntry.AdminToggle.isOn; PlayerData_Host[i] = PlayerEntry.HostToggle.isOn; PlayerData_Camera[i] = PlayerEntry.CameraToggle.isOn; } } private void RebuildPlayerList() { Debug.Log("[PermissionsPanel] Rebuilding the player list..."); for (int i = 0; i < PlayerData_Name.Length; i++) { Debug.Log("[PermissionsPanel] PlayerData_Name[" + i + "] is " + PlayerData_Name[i]); PermissionsPanelPlayerEntry PlayerListItem = _ListContainer.GetChild(i).GetComponent(); if (PlayerData_Name[i] != null) { PlayerListItem.PlayerNameUI.text = PlayerData_Name[i]; PlayerListItem.AdminToggle.SetIsOnWithoutNotify(PlayerData_Admin[i]); PlayerListItem.HostToggle.SetIsOnWithoutNotify(PlayerData_Host[i]); PlayerListItem.CameraToggle.SetIsOnWithoutNotify(PlayerData_Camera[i]); PlayerListItem.AdminToggle.interactable = (Networking.LocalPlayer.isInstanceOwner || Networking.LocalPlayer.isMaster); PlayerListItem.HostToggle.interactable = (Networking.LocalPlayer.isInstanceOwner || Networking.LocalPlayer.isMaster); PlayerListItem.CameraToggle.interactable = (Networking.LocalPlayer.isInstanceOwner || Networking.LocalPlayer.isMaster); PlayerListItem.gameObject.SetActive(true); } else { PlayerListItem.gameObject.SetActive(false); } } } }