261 lines
7.1 KiB
C#
261 lines
7.1 KiB
C#
|
|
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<GameObject>(_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<PermissionsPanelPlayerEntry>();
|
|
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<PermissionsPanelPlayerEntry>();
|
|
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<PermissionsPanelPlayerEntry>();
|
|
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<PermissionsPanelPlayerEntry>();
|
|
PlayerListItem.HostToggle.interactable = true;
|
|
}
|
|
}
|
|
|
|
if (IsPlayerCameraOperator(Networking.LocalPlayer))
|
|
{
|
|
for (int i = 0; i < PlayerData_Name.Length; i++)
|
|
{
|
|
PermissionsPanelPlayerEntry PlayerListItem = _ListContainer.GetChild(i).GetComponent<PermissionsPanelPlayerEntry>();
|
|
PlayerListItem.CameraToggle.interactable = true;
|
|
}
|
|
|
|
CameraConsole.Authorize();
|
|
}
|
|
else
|
|
{
|
|
CameraConsole.Deauthorize();
|
|
}
|
|
}
|
|
}
|