From 5f84efb6c7f91843cf911ab6339aa7dfe7dd6e1a Mon Sep 17 00:00:00 2001 From: Jamie Greunbaum Date: Fri, 22 Aug 2025 01:50:38 -0400 Subject: [PATCH] Started rework on the permissions panel. --- .../Player Permissions/PermissionsPanel.asset | 276 ++++++++++++++++-- .../Player Permissions/PermissionsPanel.cs | 128 ++++++-- 2 files changed, 357 insertions(+), 47 deletions(-) diff --git a/Assets/UdonSharp/Player Permissions/PermissionsPanel.asset b/Assets/UdonSharp/Player Permissions/PermissionsPanel.asset index 692bc74..6a7389b 100644 --- a/Assets/UdonSharp/Player Permissions/PermissionsPanel.asset +++ b/Assets/UdonSharp/Player Permissions/PermissionsPanel.asset @@ -44,25 +44,25 @@ MonoBehaviour: Data: - Name: Entry: 12 - Data: 3 + Data: 7 - Name: Entry: 7 Data: - Name: $k Entry: 1 - Data: _ListContainer + Data: PlayerData_Name - Name: $v Entry: 7 Data: 2|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor - Name: k__BackingField Entry: 1 - Data: _ListContainer + Data: PlayerData_Name - Name: k__BackingField Entry: 7 Data: 3|System.RuntimeType, mscorlib - Name: Entry: 1 - Data: UnityEngine.RectTransform, UnityEngine.CoreModule + Data: System.String[], mscorlib - Name: Entry: 8 Data: @@ -73,14 +73,14 @@ MonoBehaviour: Entry: 7 Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib - Name: - Entry: 6 - Data: + Entry: 3 + Data: 1 - Name: Entry: 8 Data: - Name: k__BackingField Entry: 5 - Data: true + Data: false - Name: _fieldAttributes Entry: 7 Data: 4|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib @@ -89,7 +89,7 @@ MonoBehaviour: Data: 1 - Name: Entry: 7 - Data: 5|UnityEngine.SerializeField, UnityEngine.CoreModule + Data: 5|UdonSharp.UdonSyncedAttribute, UdonSharp.Runtime - Name: Entry: 8 Data: @@ -110,19 +110,19 @@ MonoBehaviour: Data: - Name: $k Entry: 1 - Data: _PlayerItemTemplate + Data: PlayerData_ID - Name: $v Entry: 7 Data: 6|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor - Name: k__BackingField Entry: 1 - Data: _PlayerItemTemplate + Data: PlayerData_ID - Name: k__BackingField Entry: 7 Data: 7|System.RuntimeType, mscorlib - Name: Entry: 1 - Data: UnityEngine.GameObject, UnityEngine.CoreModule + Data: System.Int32[], mscorlib - Name: Entry: 8 Data: @@ -133,14 +133,14 @@ MonoBehaviour: Entry: 7 Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib - Name: - Entry: 6 - Data: + Entry: 3 + Data: 1 - Name: Entry: 8 Data: - Name: k__BackingField Entry: 5 - Data: true + Data: false - Name: _fieldAttributes Entry: 7 Data: 8|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib @@ -149,7 +149,7 @@ MonoBehaviour: Data: 1 - Name: Entry: 7 - Data: 9|UnityEngine.SerializeField, UnityEngine.CoreModule + Data: 9|UdonSharp.UdonSyncedAttribute, UdonSharp.Runtime - Name: Entry: 8 Data: @@ -170,19 +170,19 @@ MonoBehaviour: Data: - Name: $k Entry: 1 - Data: PlayerData + Data: PlayerData_Admin - Name: $v Entry: 7 Data: 10|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor - Name: k__BackingField Entry: 1 - Data: PlayerData + Data: PlayerData_Admin - Name: k__BackingField Entry: 7 Data: 11|System.RuntimeType, mscorlib - Name: Entry: 1 - Data: VRC.SDK3.Data.DataDictionary, VRCSDK3 + Data: System.Boolean[], mscorlib - Name: Entry: 8 Data: @@ -193,8 +193,8 @@ MonoBehaviour: Entry: 7 Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib - Name: - Entry: 6 - Data: + Entry: 3 + Data: 1 - Name: Entry: 8 Data: @@ -206,7 +206,241 @@ MonoBehaviour: Data: 12|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib - Name: Entry: 12 - Data: 0 + Data: 1 + - Name: + Entry: 7 + Data: 13|UdonSharp.UdonSyncedAttribute, UdonSharp.Runtime + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: PlayerData_Host + - Name: $v + Entry: 7 + Data: 14|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: PlayerData_Host + - Name: k__BackingField + Entry: 9 + Data: 11 + - Name: k__BackingField + Entry: 9 + Data: 11 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 3 + Data: 1 + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: false + - Name: _fieldAttributes + Entry: 7 + Data: 15|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 16|UdonSharp.UdonSyncedAttribute, UdonSharp.Runtime + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: PlayerData_Camera + - Name: $v + Entry: 7 + Data: 17|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: PlayerData_Camera + - Name: k__BackingField + Entry: 9 + Data: 11 + - Name: k__BackingField + Entry: 9 + Data: 11 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 3 + Data: 1 + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: false + - Name: _fieldAttributes + Entry: 7 + Data: 18|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 19|UdonSharp.UdonSyncedAttribute, UdonSharp.Runtime + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: _ListContainer + - Name: $v + Entry: 7 + Data: 20|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: _ListContainer + - Name: k__BackingField + Entry: 7 + Data: 21|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: UnityEngine.RectTransform, UnityEngine.CoreModule + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 21 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 22|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 23|UnityEngine.SerializeField, UnityEngine.CoreModule + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: _PlayerItemTemplate + - Name: $v + Entry: 7 + Data: 24|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: _PlayerItemTemplate + - Name: k__BackingField + Entry: 7 + Data: 25|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: UnityEngine.GameObject, UnityEngine.CoreModule + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 25 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 26|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 27|UnityEngine.SerializeField, UnityEngine.CoreModule + - Name: + Entry: 8 + Data: - Name: Entry: 13 Data: diff --git a/Assets/UdonSharp/Player Permissions/PermissionsPanel.cs b/Assets/UdonSharp/Player Permissions/PermissionsPanel.cs index dffc6ee..a4cb795 100644 --- a/Assets/UdonSharp/Player Permissions/PermissionsPanel.cs +++ b/Assets/UdonSharp/Player Permissions/PermissionsPanel.cs @@ -3,57 +3,133 @@ using UdonSharp; using UnityEngine; using VRC.SDK3.Data; using VRC.SDKBase; +using VRC.Udon.Common; [UdonBehaviourSyncMode(BehaviourSyncMode.Manual)] public class PermissionsPanel : UdonSharpBehaviour { - [SerializeField] private RectTransform _ListContainer; + [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 DataDictionary PlayerData = new DataDictionary(); + private const int MAX_PLAYERS_IN_LIST = 85; public override void OnPlayerJoined(VRCPlayerApi Player) { - GameObject NewListItem = Instantiate(_PlayerItemTemplate, _ListContainer, false); - NewListItem.SetActive(true); - PermissionsPanelPlayerEntry PlayerListItem = NewListItem.GetComponent(); - PlayerListItem.PlayerNameUI.text = Player.displayName; - - PlayerData[Player.displayName] = new DataDictionary(); - PlayerData[Player.displayName].DataDictionary["Admin"] = Player.isInstanceOwner; - PlayerData[Player.displayName].DataDictionary["Host"] = Player.isInstanceOwner; - PlayerData[Player.displayName].DataDictionary["Camera"] = Player.isInstanceOwner; - - if (Networking.LocalPlayer.isInstanceOwner) + for (int i = 0; i < MAX_PLAYERS_IN_LIST; i++) { - PlayerListItem.AdminToggle.interactable = true; - PlayerListItem.HostToggle.interactable = true; - PlayerListItem.CameraToggle.interactable = true; + if (PlayerData_Name[i] == null) + { + PlayerData_Name[i] = Player.displayName; + PlayerData_ID[i] = Player.playerId; - PlayerListItem.AdminToggle.SetIsOnWithoutNotify(true); - PlayerListItem.HostToggle.SetIsOnWithoutNotify(true); - PlayerListItem.CameraToggle.SetIsOnWithoutNotify(true); + 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) + 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(); - if (PlayerEntry != null && PlayerEntry.PlayerNameUI.text == player.displayName) - { - Destroy(Entry); - break; - } + + 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); } - base.OnPlayerLeft(player); + 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; + } } }