private static void TagsDialog(SimulatedVRCPlayer player)
        {
            Dictionary <string, string> tags = player.GetRawTags();

            if (tags.Count > 0)
            {
                SimpleGUI.IndentWithHeader(
                    () => GUILayout.Label("Tags: "),
                    () =>
                {
                    foreach (string key in new List <string>(tags.Keys))
                    {
                        GUILayout.BeginHorizontal();
                        tags[key] = EditorGUILayout.TextField(key, tags[key]);
                        SimpleGUI.ActionButton("X", () => tags.Remove(key), GUILayout.MaxWidth(30));
                        GUILayout.EndHorizontal();
                    }
                }
                    );
            }

            GUILayout.BeginHorizontal();
            string tagName  = player.SetMetadata <string>("tagName", oldName => EditorGUILayout.TextField(oldName));
            string tagValue = player.SetMetadata <string>("tagValue", oldName => EditorGUILayout.TextField(oldName));

            SimpleGUI.ActionButton("Add tag", () => tags[tagName] = tagValue);
            GUILayout.EndHorizontal();
        }
        public static void DrawActiveRuntimePlayer(VRCEmulator emulator, SimulatedVRCPlayer player)
        {
            DrawRuntimePlayer(player);
            GUILayout.BeginHorizontal();
            if (emulator.GetAmountOfPlayers() > 1)
            {
                SimpleGUI.ActionButton("Disconnect", () => emulator.RemovePlayer(player));
            }

            if (!player.IsUsingVR())
            {
                SimpleGUI.ActionButton("Make VR", player.PromoteToVRUser);
            }
            else
            {
                SimpleGUI.ActionButton("Make Desktop", player.DemoteToDesktopUser);
            }

            SimpleGUI.ActionButton("Make Master", () => emulator.MakeMaster(player));
            SimpleGUI.ActionButton("Make Local", () => emulator.MakeLocal(player));
            GUILayout.EndHorizontal();

            SimpleGUI.DrawFoldout(player, "More settings", () =>
            {
                AvatarChangeDialog(player);
                TagsDialog(player);
            });
        }
        private static void AvatarChangeDialog(SimulatedVRCPlayer player)
        {
            GameObject avatar = player.SetMetadata <GameObject>("avatar",
                                                                oldValue => SimpleGUI.ObjectField("Avatar", oldValue, false));

            if (avatar != null)
            {
                SimpleGUI.ActionButton("Change Avatar", () => player.ChangeAvatar(avatar));
            }
        }
        private static void DrawRuntimePlayer(SimulatedVRCPlayer player)
        {
            string playerString = GetPlayerDisplayFormat(player);

            EditorGUILayout.HelpBox(
                $"{playerString}, (id: {player.Id}) In VR: {player.IsUsingVR()}\n" +
                $"Grounded: {player.IsGrounded()}\n" +
                $"Walk speed: {player.walkSpeed}, run speed: {player.runSpeed}\n" +
                $"Gravity: {player.gravityStrength}, jump: {player.jumpImpulse}" +
                (player.silencedLevel != 0 ? $"\nSilenced level: {player.silencedLevel}\n" : "\n") +
                GetPlayerSpecialMarks(player),
                MessageType.None
                );
        }
        private static string GetPlayerDisplayFormat(SimulatedVRCPlayer player)
        {
            string tag = "";

            if (player.VRCPlayer.isMaster)
            {
                tag = "MASTER ";
            }

            if (player.VRCPlayer.isLocal)
            {
                tag += "LOCAL ";
            }

            return(tag + player.Name);
        }
        private static string GetPlayerSpecialMarks(SimulatedVRCPlayer player)
        {
            string otherMarks = "";

            if (player.legacyLocomotion)
            {
                otherMarks += "Using legacy locomotion | ";
            }
            if (player.immobile)
            {
                otherMarks += "Immobile | ";
            }
            if (!player.visible)
            {
                otherMarks += "Invisible | ";
            }
            if (!player.pickupsEnabled)
            {
                otherMarks += "Pickups Disabled";
            }
            return(otherMarks);
        }
 public static void DrawAvailableRuntimePlayer(VRCEmulator emulator, SimulatedVRCPlayer player)
 {
     DrawRuntimePlayer(player);
     SimpleGUI.ActionButton("Connect", () => emulator.AddPlayer(player));
 }