public AvatarModule() : base(ExpandedMenu.AvatarMenu, FavCatMod.Database.AvatarFavorites, GetListsParent(), false, false) { myCurrentAnnoyingMessage = CanPerformAdditiveActions ? "WillBeObsolete" : (CanShowExistingLists ? "CantAddWithCanny" : "NoFavorites"); MelonLogger.Msg("Adding button to UI - Looking up for Change Button"); var foundAvatarPage = Resources.FindObjectsOfTypeAll <PageAvatar>()?.FirstOrDefault(p => p.transform.Find("Change Button") != null); if (foundAvatarPage == null) { throw new ApplicationException("No avatar page, can't initialize extended favorites"); } myPageAvatar = foundAvatarPage; ExpansionKitApi.GetExpandedMenu(ExpandedMenu.UserDetailsMenu).AddSimpleButton("Search known public avatars", DoSearchKnownAvatars); var expandEnforcer = new GameObject(ExpandEnforcerGameObjectName, new[] { Il2CppType.Of <RectTransform>(), Il2CppType.Of <LayoutElement>() }); expandEnforcer.transform.SetParent(GetListsParent(), false); var layoutElement = expandEnforcer.GetComponent <LayoutElement>(); layoutElement.minWidth = 1534; layoutElement.minHeight = 0; myPageAvatar.gameObject.AddComponent <EnableDisableListener>().OnEnabled += () => { if (FavCatSettings.DontShowAnnoyingMessage == myCurrentAnnoyingMessage || myHasShownAnnoyingMessageThisRun) { return; } ShowAnnoyingMessage(); }; myInitialised = true; }
private void FavouriteOverriding_Tick() { if (!RoomManagerBaseWrappers.InRoom) { return; } try { PageAvatar pageAvatar = VRCUiManagerWrappers.Instance.GetPage("UserInterface/MenuContent/Screens/Avatar") as PageAvatar; if (pageAvatar != null && pageAvatar.GetShown()) { if (pageAvatar.favoriteButton == null) { return; } if (!pageAvatar.favoriteButton.enabled) { pageAvatar.favoriteButton.enabled = true; } } } catch { } }
public static void SwitchPedestalToAvatar(ApiAvatar avatar, bool confirm = false) { PageAvatar menu = GameObject.Find("Screens").transform.Find("Avatar").GetComponent <PageAvatar>(); UnityEngine.Object.Destroy(menu.avatar.field_Private_GameObject_0); menu.avatar.Method_Public_Void_ApiAvatar_0(avatar); if (confirm) { menu.ChangeToSelectedAvatar(); //menu.avatar.field_Internal_ApiAvatar_0 = avatar; } }
// Token: 0x0600004B RID: 75 RVA: 0x000036B4 File Offset: 0x000018B4 public void Update() { PageAvatar pageAvatar = MiscUtils.GetVRCUiManager().GetPage("UserInterface/MenuContent/Screens/Avatar") as PageAvatar; if (pageAvatar != null && pageAvatar.GetShown()) { UiAvatarList[] array = (UiAvatarList[])this.avatarListField.GetValue(pageAvatar); if (array != null) { foreach (UiAvatarList obj in array) { if ((int)this.categoryField.GetValue(obj) == 1) { object[] parameters = new object[] { AvatarUtils.SavedAvatars }; this.updateAvatarListMethod.Invoke(obj, parameters); } } } } }
public AvatarModule() : base(ExpandedMenu.AvatarMenu, FavCatMod.Database.AvatarFavorites, GetListsParent()) { MelonLogger.Log("Adding button to UI - Looking up for Change Button"); var foundAvatarPage = Resources.FindObjectsOfTypeAll <PageAvatar>()?.FirstOrDefault(p => p.transform.Find("Change Button") != null); if (foundAvatarPage == null) { throw new ApplicationException("No avatar page, can't initialize extended favorites"); } myPageAvatar = foundAvatarPage; ExpansionKitApi.GetExpandedMenu(ExpandedMenu.UserDetailsMenu).AddSimpleButton("Search known public avatars", DoSearchKnownAvatars); var expandEnforcer = new GameObject(ExpandEnforcerGameObjectName, new[] { Il2CppType.Of <RectTransform>(), Il2CppType.Of <LayoutElement>() }); expandEnforcer.transform.SetParent(GetListsParent(), false); var layoutElement = expandEnforcer.GetComponent <LayoutElement>(); layoutElement.minWidth = 1534; layoutElement.minHeight = 0; myInitialised = true; }
public override void UiInit() { GameObject gameObject = GameObject.Find("UserInterface/MenuContent/Screens/Avatar"); avatarPage = gameObject.GetComponent <PageAvatar>(); }
void OnLevelWasLoaded(int level) { VRCModLogger.Log("[AvatarFav] OnLevelWasLoaded (" + level + ")"); if (level == (Application.platform == RuntimePlatform.WindowsPlayer ? 1 : 2) && !alreadyLoaded) { alreadyLoaded = true; if (instance != null) { Debug.LogWarning("[AvatarFav] Trying to load the same plugin two time !"); return; } instance = this; VRCModLogger.Log("[AvatarFav] Adding button to UI - Looking up for Change Button"); // Add a "Favorite" / "Unfavorite" button over the "Choose" button of the AvatarPage Transform changeButton = null; pageAvatar = Resources.FindObjectsOfTypeAll <PageAvatar>().First(p => (changeButton = p.transform.Find("Change Button")) != null); VRCModLogger.Log("[AvatarFav] Adding avatar check on Change button"); baseChooseEvent = changeButton.GetComponent <Button>().onClick; changeButton.GetComponent <Button>().onClick = new Button.ButtonClickedEvent(); changeButton.GetComponent <Button>().onClick.AddListener(() => { VRCModLogger.Log("[AvatarFav] Fetching avatar releaseStatus for " + pageAvatar.avatar.apiAvatar.name + " (" + pageAvatar.avatar.apiAvatar.id + ")"); ModManager.StartCoroutine(CheckAndWearAvatar()); }); VRCModLogger.Log("[AvatarFav] Adding favorite button to UI - Duplicating Button"); favButton = UnityUiUtils.DuplicateButton(changeButton, "Favorite", new Vector2(0, 80)); favButton.name = "ToggleFavorite"; favButton.gameObject.SetActive(false); favButtonText = favButton.Find("Text").GetComponent <Text>(); favButton.GetComponent <Button>().interactable = false; favButton.GetComponent <Button>().onClick.AddListener(ToggleAvatarFavorite); VRCModLogger.Log("[AvatarFav] Storing default AvatarModel position"); avatarModel = pageAvatar.transform.Find("AvatarModel"); baseAvatarModelPosition = avatarModel.localPosition; FileInfo[] files = new DirectoryInfo(Environment.CurrentDirectory).GetFiles("Avatars.txt", SearchOption.AllDirectories); VRCModLogger.Log("[AvatarFavMod] Found " + files.Length + " Avatars.txt"); if (files.Length > 0) { VRCModLogger.Log("[AvatarFav] Adding import button to UI - Duplicating Button"); Transform importButton = UnityUiUtils.DuplicateButton(changeButton, "Import Avatars", new Vector2(0, 0)); importButton.name = "ImportAvatars"; importButton.GetComponent <RectTransform>().anchoredPosition = new Vector2(560, 371); importButton.GetComponent <Button>().onClick.AddListener(() => { VRCUiPopupManagerUtils.ShowPopup("AvatarFav", "Do you want to import the public avatars from your VRCheat avatar list ?", "Yes", () => { ModManager.StartCoroutine(VRCheatAvatarfileImporter.ImportAvatarfile()); }, "No", () => { VRCUiPopupManagerUtils.GetVRCUiPopupManager().HideCurrentPopup(); }); VRCheatAvatarfileImporter.ImportAvatarfile(); }); } favList = AvatarPageHelper.AddNewList("Favorite Avatar List (Unofficial)", 1); // Get Getter of VRCUiContentButton.PressAction applyAvatarField = typeof(VRCUiContentButton).GetFields(BindingFlags.NonPublic | BindingFlags.Instance).First((field) => field.FieldType == typeof(Action)); VRCModLogger.Log("[AvatarFav] Registering VRCModNetwork events"); VRCModNetworkManager.OnAuthenticated += () => { RequestAvatars(); }; VRCModNetworkManager.SetRPCListener("slaynash.avatarfav.serverconnected", (senderId, data) => { if (waitingForServer) { RequestAvatars(); } }); VRCModNetworkManager.SetRPCListener("slaynash.avatarfav.error", (senderId, data) => addError = data); VRCModNetworkManager.SetRPCListener("slaynash.avatarfav.avatarlistupdated", (senderId, data) => { lock (favoriteAvatarList) { // Update Ui favButton.GetComponent <Button>().interactable = true; SerializableApiAvatar[] serializedAvatars = SerializableApiAvatar.ParseJson(data); favoriteAvatarList.Clear(); foreach (SerializableApiAvatar serializedAvatar in serializedAvatars) { favoriteAvatarList.Add(serializedAvatar.id); } avatarAvailables = true; } }); VRCModLogger.Log("[AvatarFav] Adding avatar search list"); if (pageAvatar != null) { VRCUiPageHeader pageheader = VRCUiManagerUtils.GetVRCUiManager().GetComponentInChildren <VRCUiPageHeader>(true); if (pageheader != null) { searchbar = pageheader.searchBar; if (searchbar != null) { VRCModLogger.Log("[AvatarFav] creating avatar search list"); avatarSearchList = AvatarPageHelper.AddNewList("Search Results", 0); avatarSearchList.ClearAll(); avatarSearchList.gameObject.SetActive(false); avatarSearchList.collapsedCount = 50; avatarSearchList.expandedCount = 50; avatarSearchList.collapseRows = 5; avatarSearchList.extendRows = 5; avatarSearchList.contractedHeight = 850f; avatarSearchList.expandedHeight = 850f; avatarSearchList.GetComponent <LayoutElement>().minWidth = 1600f; avatarSearchList.GetComponentInChildren <GridLayoutGroup>(true).constraintCount = 5; avatarSearchList.expandButton.image.enabled = false; VRCModLogger.Log("[AvatarFav] Overwriting search button"); VRCUiManagerUtils.OnPageShown += (page) => { if (page.GetType() == typeof(PageAvatar)) { UiVRCList[] lists = page.GetComponentsInChildren <UiVRCList>(true); foreach (UiVRCList list in lists) { if (list != avatarSearchList && (list.GetType() != typeof(UiAvatarList) || ((int)categoryField.GetValue(list)) != 0)) { list.gameObject.SetActive(true); } else { list.gameObject.SetActive(false); } } VRCModLogger.Log("[AvatarFav] PageAvatar shown. Enabling searchbar next frame"); ModManager.StartCoroutine(EnableSearchbarNextFrame()); } }; VRCModNetworkManager.SetRPCListener("slaynash.avatarfav.searchresults", (senderid, data) => { AddMainAction(() => { if (data.StartsWith("ERROR")) { VRCUiPopupManagerUtils.ShowPopup("AvatarFav", "Unable to fetch avatars: Server returned error: " + data.Substring("ERROR ".Length), "Close", () => VRCUiPopupManagerUtils.GetVRCUiPopupManager().HideCurrentPopup()); } else { avatarSearchList.ClearSpecificList(); if (!avatarSearchList.gameObject.activeSelf) { UiVRCList[] lists = pageAvatar.GetComponentsInChildren <UiVRCList>(true); foreach (UiVRCList list in lists) { if (list != avatarSearchList) { list.gameObject.SetActive(false); } } } SerializableApiAvatar[] serializedAvatars = SerializableApiAvatar.ParseJson(data); string[] avatarsIds = new string[serializedAvatars.Length]; for (int i = 0; i < serializedAvatars.Length; i++) { avatarsIds[i] = serializedAvatars[i].id; } avatarSearchList.specificListIds = avatarsIds; if (avatarSearchList.gameObject.activeSelf) { avatarSearchList.Refresh(); } else { avatarSearchList.gameObject.SetActive(true); } } }); }); } else { VRCModLogger.LogError("[AvatarFav] Unable to find search bar"); } } else { VRCModLogger.LogError("[AvatarFav] Unable to find page header"); } } else { VRCModLogger.LogError("[AvatarFav] Unable to find avatar page"); } VRCModLogger.Log("[AvatarFav] AvatarFav Initialised !"); initialised = true; } }
public UtilsVRMenu(QMNestedButton parent, EthosVRButton config) : base(parent, config.X, config.Y, config.Name, config.Tooltip, GeneralUtils.GetColor(config.ColorScheme.Colors[0]), GeneralUtils.GetColor(config.ColorScheme.Colors[1]), GeneralUtils.GetColor(config.ColorScheme.Colors[2]), GeneralUtils.GetColor(config.ColorScheme.Colors[3])) { new QMToggleButton(this, 1, 0, "Enable\nESP", delegate { GeneralUtils.ESP = true; GameObject[] array = GameObject.FindGameObjectsWithTag("Player"); for (int i = 0; i < array.Length; i++) { if (array[i].transform.Find("SelectRegion")) { array[i].transform.Find("SelectRegion").GetComponent <Renderer>().material.color = Color.green; array[i].transform.Find("SelectRegion").GetComponent <Renderer>().sharedMaterial.color = Color.red; GeneralWrappers.GetHighlightsFX().EnableOutline(array[i].transform.Find("SelectRegion").GetComponent <Renderer>(), GeneralUtils.ESP); } } foreach (VRCSDK2.VRC_Interactable vrc_Interactable in Resources.FindObjectsOfTypeAll <VRCSDK2.VRC_Interactable>()) { GeneralWrappers.GetHighlightsFX().EnableOutline(vrc_Interactable.GetComponentInChildren <Renderer>(), GeneralUtils.ESP); } foreach (VRCSDK2.VRC_Pickup vrc_Pickup in Resources.FindObjectsOfTypeAll <VRCSDK2.VRC_Pickup>()) { GeneralWrappers.GetHighlightsFX().EnableOutline(vrc_Pickup.GetComponentInChildren <Renderer>(), GeneralUtils.ESP); } foreach (PortalInternal portalInternal in Resources.FindObjectsOfTypeAll <PortalInternal>()) { GeneralWrappers.GetHighlightsFX().EnableOutline(portalInternal.GetComponentInChildren <Renderer>(), GeneralUtils.ESP); } }, "Disable\nESP", delegate { GeneralUtils.ESP = false; GameObject[] array = GameObject.FindGameObjectsWithTag("Player"); for (int i = 0; i < array.Length; i++) { if (array[i].transform.Find("SelectRegion")) { array[i].transform.Find("SelectRegion").GetComponent <Renderer>().material.color = Color.green; array[i].transform.Find("SelectRegion").GetComponent <Renderer>().sharedMaterial.color = Color.red; GeneralWrappers.GetHighlightsFX().EnableOutline(array[i].transform.Find("SelectRegion").GetComponent <Renderer>(), GeneralUtils.ESP); } } foreach (VRCSDK2.VRC_Interactable vrc_Interactable in Resources.FindObjectsOfTypeAll <VRCSDK2.VRC_Interactable>()) { GeneralWrappers.GetHighlightsFX().EnableOutline(vrc_Interactable.GetComponentInChildren <Renderer>(), GeneralUtils.ESP); } foreach (VRCSDK2.VRC_Pickup vrc_Pickup in Resources.FindObjectsOfTypeAll <VRCSDK2.VRC_Pickup>()) { GeneralWrappers.GetHighlightsFX().EnableOutline(vrc_Pickup.GetComponentInChildren <Renderer>(), GeneralUtils.ESP); } foreach (PortalInternal portalInternal in Resources.FindObjectsOfTypeAll <PortalInternal>()) { GeneralWrappers.GetHighlightsFX().EnableOutline(portalInternal.GetComponentInChildren <Renderer>(), GeneralUtils.ESP); } }, "Decide whether you want the upper game, get an advantage, and see all players anywhere within the world.", Color.red, Color.white).setToggleState(GeneralUtils.ESP); new QMSingleButton(this, 2, 0, "Avatar\nBy\nID", delegate { ConsoleUtil.Info("Enter Avatar ID: "); string ID = Console.ReadLine(); PageAvatar PAviSaved = new PageAvatar() { avatar = new SimpleAvatarPedestal() }; new ApiAvatar() { id = ID }.Get(new Action <ApiContainer>(x => { PAviSaved.avatar.field_Internal_ApiAvatar_0 = x.Model.Cast <ApiAvatar>(); PAviSaved.ChangeToSelectedAvatar(); }), null, null, false); GeneralWrappers.GetVRCUiPopupManager().AlertPopup("<color=cyan>Success!</color>", "<color=green>Successfully cloned that avatar by It's Avatar ID.</color>"); }, "Sets your current avatar using an avatar ID.", Color.red, Color.white); new QMSingleButton(this, 3, 0, "Join\nBy\nID", delegate { ConsoleUtil.Info("Enter Instance ID: "); string ID = Console.ReadLine(); Networking.GoToRoom(ID); }, "Joins an instance by It's ID.", Color.red, Color.white); new QMSingleButton(this, 4, 0, "Copy\nRoom\nID", delegate { Clipboard.SetText($"{RoomManagerBase.field_Internal_Static_ApiWorld_0.id}:{RoomManagerBase.field_Internal_Static_ApiWorld_0.instanceId}"); }, "Copies the current instance's ID.", Color.red, Color.white); new QMToggleButton(this, 1, 1, "Can't Hear\non Non Friends", delegate { GeneralUtils.CantHearOnNonFriends = true; foreach (var player in GeneralWrappers.GetPlayerManager().GetAllPlayers()) { if (!APIUser.IsFriendsWith(player.GetAPIUser().id)) { player.GetVRCPlayer().field_Internal_Boolean_3 = false; } } }, "Can Hear\non Non Friends", delegate { GeneralUtils.CantHearOnNonFriends = false; foreach (var player in GeneralWrappers.GetPlayerManager().GetAllPlayers()) { if (!APIUser.IsFriendsWith(player.GetAPIUser().id)) { player.GetVRCPlayer().field_Internal_Boolean_3 = true; } } }, "Decide whether you want your friends to only hear you in game or not.", Color.red, Color.white).setToggleState(GeneralUtils.CantHearOnNonFriends); //new QMToggleButton(this, 2, 1, "Invisible\nOn", delegate //{ // GeneralUtils.Invisible = true; //}, "Invisible\nOff", delegate //{ // GeneralUtils.Invisible = false; //}, "Decide whether you want people to see you in game.", Color.red, Color.white).setToggleState(GeneralUtils.Invisible); }