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 = 85; public override void OnPlayerJoined(VRCPlayerApi Player) { for (int i = 0; i < MAX_PLAYERS_IN_LIST; 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; } } RequestSerialization(); base.OnPlayerJoined(Player); } public override void OnPlayerLeft(VRCPlayerApi Player) { for (int i = 0; i < MAX_PLAYERS_IN_LIST; i++) { if (PlayerData_Name[i] == Player.displayName) { PlayerData_Name[i] = null; break; } } string[] NewPlayerData_Name = new string[MAX_PLAYERS_IN_LIST]; int[] NewPlayerData_ID = new int[MAX_PLAYERS_IN_LIST]; bool[] NewPlayerData_Admin = new bool[MAX_PLAYERS_IN_LIST]; bool[] NewPlayerData_Host = new bool[MAX_PLAYERS_IN_LIST]; bool[] NewPlayerData_Camera = new bool[MAX_PLAYERS_IN_LIST]; for (int i = 0; i < MAX_PLAYERS_IN_LIST; i++) { for (int j = i; j < MAX_PLAYERS_IN_LIST; j++) { if (PlayerData_Name[j] != null) { NewPlayerData_Name[i] = PlayerData_Name[j]; NewPlayerData_ID[i] = PlayerData_ID[j]; NewPlayerData_Admin[i] = PlayerData_Admin[j]; NewPlayerData_Host[i] = PlayerData_Host[j]; NewPlayerData_Camera[i] = PlayerData_Camera[j]; break; } } } PlayerData_Name = NewPlayerData_Name; PlayerData_ID = NewPlayerData_ID; PlayerData_Admin = NewPlayerData_Admin; PlayerData_Host = NewPlayerData_Host; PlayerData_Camera = NewPlayerData_Camera; RequestSerialization(); base.OnPlayerLeft(Player); } public override void OnDeserialization(DeserializationResult Result) { base.OnDeserialization(Result); } public void PermissionsChanged() { for (int i = 0; i < _ListContainer.childCount; 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() { int CurrentListCount = _ListContainer.childCount; for (int i = 0; i < CurrentListCount; i++) { Destroy(_ListContainer.GetChild(CurrentListCount - i - 1).gameObject); } for (int i = 0; i < VRCPlayerApi.GetPlayerCount(); i++) { GameObject NewListItem = Instantiate(_PlayerItemTemplate, _ListContainer, false); NewListItem.SetActive(true); PermissionsPanelPlayerEntry PlayerListItem = NewListItem.GetComponent(); 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 = false; PlayerListItem.HostToggle.interactable = false; PlayerListItem.CameraToggle.interactable = false; } } }