using CameraSystem; 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; [SerializeField] private CameraSystem_Console CameraConsole; 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() { Networking.SetOwner(Networking.LocalPlayer, gameObject); for (int i = 0; i < PlayerData_Name.Length; i++) { PermissionsPanelPlayerEntry PlayerEntry = _ListContainer.GetChild(i).GetComponent(); PlayerData_Admin[i] = PlayerEntry.AdminToggle.isOn; PlayerData_Host[i] = PlayerEntry.HostToggle.isOn; PlayerData_Camera[i] = PlayerEntry.CameraToggle.isOn; } RebuildPlayerList(); RequestSerialization(); } public string[] GetAdmins() { return GetListOfUsers(PlayerData_Admin); } public string[] GetHosts() { return GetListOfUsers(PlayerData_Host); } public string[] GetCameraOperators() { return GetListOfUsers(PlayerData_Camera); } private string[] GetListOfUsers(bool[] ListToCheck) { string[] ListBig = new string[PlayerData_Name.Length]; int Count = 0; for (int i = 0; i < PlayerData_Name.Length; i++) { if (PlayerData_Name[i] != null && ListToCheck[i]) { ListBig[Count] = PlayerData_Name[i]; Count++; } } string[] List = new string[Count]; Count = 0; while (ListBig[Count] != null) { List[Count] = ListBig[Count]; Count++; } return List; } public bool IsPlayerAdmin(VRCPlayerApi Player) { return IsPlayerAdmin(Player.displayName); } public bool IsPlayerAdmin(string PlayerName) { for (int i = 0; i < PlayerData_Name.Length; i++) { if (PlayerName == PlayerData_Name[i]) { return PlayerData_Admin[i]; } } return false; } public bool IsPlayerHost(VRCPlayerApi Player) { return IsPlayerHost(Player.displayName); } public bool IsPlayerHost(string PlayerName) { for (int i = 0; i < PlayerData_Name.Length; i++) { if (PlayerName == PlayerData_Name[i]) { return PlayerData_Host[i]; } } return false; } public bool IsPlayerCameraOperator(VRCPlayerApi Player) { return IsPlayerCameraOperator(Player.displayName); } public bool IsPlayerCameraOperator(string PlayerName) { for (int i = 0; i < PlayerData_Name.Length; i++) { if (PlayerName == PlayerData_Name[i]) { return PlayerData_Camera[i]; } } return false; } private void RebuildPlayerList() { for (int i = 0; i < PlayerData_Name.Length; i++) { PermissionsPanelPlayerEntry PlayerListItem = _ListContainer.GetChild(i).GetComponent(); PlayerListItem.AdminToggle.interactable = false; PlayerListItem.HostToggle.interactable = false; PlayerListItem.CameraToggle.interactable = false; if (PlayerData_Name[i] != null) { PlayerListItem.PlayerNameUI.text = PlayerData_Name[i]; if (PlayerData_Admin[i] != PlayerListItem.AdminToggle.isOn) { Debug.Log("[PermissionsPanel] " + PlayerData_Name[i] + " is " + (PlayerData_Admin[i] ? "now" : "no longer") + " an admin."); } PlayerListItem.AdminToggle.SetIsOnWithoutNotify(PlayerData_Admin[i]); PlayerListItem.AdminToggle.interactable = (Networking.LocalPlayer.isInstanceOwner || Networking.LocalPlayer.isMaster); if (PlayerData_Host[i] != PlayerListItem.HostToggle.isOn) { Debug.Log("[PermissionsPanel] " + PlayerData_Name[i] + " is " + (PlayerData_Host[i] ? "now" : "no longer") + " a host."); } PlayerListItem.HostToggle.SetIsOnWithoutNotify(PlayerData_Host[i]); PlayerListItem.HostToggle.interactable = (Networking.LocalPlayer.isInstanceOwner || Networking.LocalPlayer.isMaster); if (PlayerData_Camera[i] != PlayerListItem.CameraToggle.isOn) { Debug.Log("[PermissionsPanel] " + PlayerData_Name[i] + " is " + (PlayerData_Camera[i] ? "now" : "no longer") + " a camera operator."); } PlayerListItem.CameraToggle.SetIsOnWithoutNotify(PlayerData_Camera[i]); PlayerListItem.CameraToggle.interactable = (Networking.LocalPlayer.isInstanceOwner || Networking.LocalPlayer.isMaster); PlayerListItem.gameObject.SetActive(true); } else { PlayerListItem.gameObject.SetActive(false); } } if (IsPlayerAdmin(Networking.LocalPlayer)) { for (int i = 0; i < PlayerData_Name.Length; i++) { PermissionsPanelPlayerEntry PlayerListItem = _ListContainer.GetChild(i).GetComponent(); PlayerListItem.AdminToggle.interactable = true; PlayerListItem.HostToggle.interactable = true; PlayerListItem.CameraToggle.interactable = true; } } if (IsPlayerHost(Networking.LocalPlayer)) { for (int i = 0; i < PlayerData_Name.Length; i++) { PermissionsPanelPlayerEntry PlayerListItem = _ListContainer.GetChild(i).GetComponent(); PlayerListItem.HostToggle.interactable = true; } } if (IsPlayerCameraOperator(Networking.LocalPlayer)) { for (int i = 0; i < PlayerData_Name.Length; i++) { PermissionsPanelPlayerEntry PlayerListItem = _ListContainer.GetChild(i).GetComponent(); PlayerListItem.CameraToggle.interactable = true; } CameraConsole.Authorize(); } else { CameraConsole.Deauthorize(); } } }