diff --git a/MiraAPI/Patches/Menu/HatsTabPatches.cs b/MiraAPI/Patches/Menu/HatsTabPatches.cs deleted file mode 100644 index e9cebd82..00000000 --- a/MiraAPI/Patches/Menu/HatsTabPatches.cs +++ /dev/null @@ -1,193 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using AmongUs.Data; -using HarmonyLib; -using MiraAPI.Utilities; -using MiraAPI.Utilities.Assets; -using Reactor.Utilities; -using Reactor.Utilities.Extensions; -using TMPro; -using UnityEngine; -using Object = UnityEngine.Object; - -namespace MiraAPI.Patches.Menu; - -[HarmonyPatch(typeof(HatsTab))] -public static class HatsTabPatches -{ - private static readonly Dictionary StoreNames = []; - private static SortedList> sortedHats = []; - private static int currentPage; - - private static void PreviousPage(HatsTab hatsTab) - { - currentPage--; - currentPage = currentPage < 0 ? sortedHats.Count - 1 : currentPage; - GenerateHats(hatsTab, currentPage); - } - - private static void NextPage(HatsTab hatsTab) - { - currentPage++; - currentPage = currentPage > sortedHats.Count - 1 ? 0 : currentPage; - GenerateHats(hatsTab, currentPage); - } - - [HarmonyPatch(nameof(HatsTab.OnEnable))] - [HarmonyPrefix] - [SuppressMessage("Style", "IDE0028:Collection initialization can be simplified", Justification = "Preview feature.")] - public static bool OnEnablePrefix(HatsTab __instance) - { - if (!AddressablesLoader.AddressableHatsExist) - { - return true; - } - - __instance.currentHat = HatManager.Instance.GetHatById(DataManager.Player.Customization.Hat); - var allHats = HatManager.Instance.GetUnlockedHats().ToImmutableList(); - - if (sortedHats.Count == 0) - { - var num = 0; - var comparer = new ControllableComparer(["vanilla"], [], StringComparer.InvariantCulture); - sortedHats = new SortedList>(comparer); - foreach (var hat in allHats) - { - if (!sortedHats.ContainsKey(hat.StoreName)) sortedHats[hat.StoreName] = []; - sortedHats[hat.StoreName].Add(hat); - - if (!StoreNames.ContainsValue(hat.StoreName)) - { - StoreNames.Add(num, hat.StoreName); - num++; - } - } - } - - InventoryUtility.CreateNextBackButtons(__instance, PreviousPage, NextPage); - - GenerateHats(__instance, currentPage); - - return false; - } - - [HarmonyPatch(typeof(HatsTab), nameof(HatsTab.Update))] - [HarmonyPrefix] - public static void UpdatePrefix(HatsTab __instance) - { - if (!AddressablesLoader.AddressableHatsExist) - { - return; - } - - if (sortedHats.Count == 0) return; - - if (Input.GetKeyDown(KeyCode.LeftControl) || Input.GetKeyDown(KeyCode.RightControl) || Input.GetKeyDown(KeyCode.LeftArrow)) - { - PreviousPage(__instance); - } - else if (Input.GetKeyDown(KeyCode.Tab) || Input.GetKeyDown(KeyCode.RightArrow)) - { - NextPage(__instance); - } - } - - private static IEnumerator? loadRoutine; - private static int hatIndex; - - private static void GenerateHats(HatsTab __instance, int page) - { - if (loadRoutine != null) Coroutines.Stop(loadRoutine); - - hatIndex = 0; - foreach (var instanceColorChip in __instance.ColorChips) instanceColorChip.gameObject.Destroy(); - __instance.ColorChips.Clear(); - __instance.scroller.Inner.GetComponentsInChildren().Do(x => x.gameObject.DeepDestroy(false)); - - var groupNameText = __instance.GetComponentInChildren(false); - var group = sortedHats.Where(x => x.Key == StoreNames[page]); - - foreach (var (groupName, hats) in group) - { - var text = Object.Instantiate(groupNameText, __instance.scroller.Inner); - text.enabled = true; - text.gameObject.transform.localScale = Vector3.one; - text.GetComponent().Destroy(); - text.EnableStencilMasking(); - text.text = $"{groupName} ({currentPage + 1}/{sortedHats.Count})"; - text.alignment = TextAlignmentOptions.Center; - text.fontSize = 5f; - text.fontSizeMax = 5f; - text.fontSizeMin = 0f; - var xLerp = __instance.XRange.Lerp(0.5f); - - // ReSharper disable once PossibleLossOfFraction (Justification: Intended.) - var yLerp = __instance.YStart - hatIndex / __instance.NumPerRow * __instance.YOffset; - text.transform.localPosition = new Vector3(xLerp, yLerp, -1f); - - hatIndex += 5; - loadRoutine = Coroutines.Start(CoGenerateChips(__instance, hats)); - } - - // ReSharper disable once PossibleLossOfFraction (Justification: Intended.) - __instance.scroller.ContentYBounds.max = -(__instance.YStart - (hatIndex + 1) / __instance.NumPerRow * __instance.YOffset) - 3f; - __instance.currentHatIsEquipped = true; - } - - private static IEnumerator CoGenerateChips(HatsTab __instance, List hats) - { - __instance.scroller.ScrollToTop(); - var batchSize = 5; - for (var i = 0; i < hats.Count; i += batchSize) - { - var batch = hats.Skip(i).Take(batchSize).ToList(); - - foreach (var hat in batch.OrderBy(HatManager.Instance.allHats.IndexOf)) - { - var hatXPosition = __instance.XRange.Lerp(hatIndex % __instance.NumPerRow / (__instance.NumPerRow - 1f)); - - // ReSharper disable once PossibleLossOfFraction (Justification: Intended.) - var hatYPosition = __instance.YStart - hatIndex / __instance.NumPerRow * __instance.YOffset; - GenerateColorChip(__instance, new Vector2(hatXPosition, hatYPosition), hat); - hatIndex += 1; - yield return null; - } - - __instance.SetScrollerBounds(); - yield return new WaitForSeconds(0.01f); - } - - __instance.currentHatIsEquipped = true; - loadRoutine = null; - } - - private static void GenerateColorChip(HatsTab __instance, Vector2 position, HatData hat) - { - var colorChip = Object.Instantiate(__instance.ColorTabPrefab, __instance.scroller.Inner); - colorChip.gameObject.name = hat.ProductId; - if (ActiveInputManager.currentControlType == ActiveInputManager.InputType.Keyboard) - { - colorChip.Button.OnClick.AddListener((Action)__instance.ClickEquip); - colorChip.Button.OnMouseOver.AddListener((Action)(() => __instance.SelectHat(hat))); - colorChip.Button.OnMouseOut.AddListener((Action)(() => __instance.SelectHat(HatManager.Instance.GetHatById(DataManager.Player.Customization.Hat)))); - } - else - { - colorChip.Button.OnClick.AddListener((Action)(() => __instance.SelectHat(hat))); - } - - colorChip.Inner.SetHat(hat, __instance.HasLocalPlayer() ? PlayerControl.LocalPlayer.Data.DefaultOutfit.ColorId : DataManager.Player.Customization.Color); - colorChip.Button.ClickMask = __instance.scroller.Hitbox; - colorChip.SelectionHighlight.gameObject.SetActive(false); - __instance.UpdateMaterials(colorChip.Inner.FrontLayer, hat); - colorChip.Inner.SetMaskType(PlayerMaterial.MaskType.SimpleUI); - colorChip.transform.localPosition = new Vector3(position.x, position.y, -1f); - colorChip.Inner.transform.localPosition = hat.ChipOffset + new Vector2(0f, -0.3f); - colorChip.Tag = hat; - __instance.ColorChips.Add(colorChip); - } -} diff --git a/MiraAPI/Patches/Menu/InventoryUtility.cs b/MiraAPI/Patches/Menu/InventoryUtility.cs deleted file mode 100644 index 82840059..00000000 --- a/MiraAPI/Patches/Menu/InventoryUtility.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using MiraAPI.Utilities.Assets; -using TMPro; -using UnityEngine; -using UnityEngine.Events; -using UnityEngine.UI; -using Object = UnityEngine.Object; - -namespace MiraAPI.Patches.Menu; - -public static class InventoryUtility -{ - public static void CreateNextBackButtons(T tab, Action previousPage, Action nextPage) - where T : InventoryTab - { - var title = tab.transform.FindChild("Text"); - title.localPosition = new Vector3(.9123f, -.23f, -55); - title.GetComponent().alignment = TextAlignmentOptions.Center; - - tab.scroller.Hitbox.transform.localScale -= new Vector3(0, 0.1f, 0); - tab.scroller.Hitbox.transform.localPosition -= new Vector3(0, 0.1f, 0); - - var leftButtonElement = Object.Instantiate(PlayerCustomizationMenu.Instance.BackButton.gameObject, tab.transform); - var leftSpriteRenderer = leftButtonElement.GetComponent(); - var leftButton = leftButtonElement.GetComponent(); - - leftButtonElement.transform.localPosition = new Vector3(-1.1f, -0.2f, -55); - leftSpriteRenderer.sprite = MiraAssets.NextButton.LoadAsset(); - leftSpriteRenderer.flipX = true; - - leftButton.OnMouseOver = new UnityEvent(); - leftButton.OnMouseOver.AddListener((Action)(() => leftSpriteRenderer.sprite = MiraAssets.NextButtonActive.LoadAsset())); - leftButton.OnMouseOut = new UnityEvent(); - leftButton.OnMouseOut.AddListener((Action)(() => leftSpriteRenderer.sprite = MiraAssets.NextButton.LoadAsset())); - - leftButton.OnClick = new Button.ButtonClickedEvent(); - leftButton.OnClick.AddListener((Action)(() => previousPage(tab))); - - var rightButtonElement = Object.Instantiate(leftButtonElement, tab.transform); - var rightSpriteRenderer = rightButtonElement.GetComponent(); - var rightButton = rightButtonElement.GetComponent(); - - rightButtonElement.transform.localPosition = new Vector3(2.8f, -0.2f, -55); - rightSpriteRenderer.sprite = MiraAssets.NextButton.LoadAsset(); - rightSpriteRenderer.flipX = false; - - rightButton.OnMouseOver = new UnityEvent(); - rightButton.OnMouseOver.AddListener((Action)(() => rightSpriteRenderer.sprite = MiraAssets.NextButtonActive.LoadAsset())); - rightButton.OnMouseOut = new UnityEvent(); - rightButton.OnMouseOut.AddListener((Action)(() => rightSpriteRenderer.sprite = MiraAssets.NextButton.LoadAsset())); - - rightButton.OnClick = new Button.ButtonClickedEvent(); - rightButton.OnClick.AddListener((Action)(() => nextPage(tab))); - } -} diff --git a/MiraAPI/Patches/Menu/MainMenuManagerPatches.cs b/MiraAPI/Patches/Menu/MainMenuManagerPatches.cs index 4ac5b379..aff0906a 100644 --- a/MiraAPI/Patches/Menu/MainMenuManagerPatches.cs +++ b/MiraAPI/Patches/Menu/MainMenuManagerPatches.cs @@ -2,7 +2,6 @@ using System.Collections; using HarmonyLib; using MiraAPI.LocalSettings; -using MiraAPI.Utilities.Assets; using Reactor.Utilities; using UnityEngine; @@ -23,10 +22,9 @@ public static class MainMenuManagerPatches [HarmonyPostfix] public static void AwakePostfix() { - var requiredVersion = new Version(2026, 6, 5); + var requiredVersion = new Version(2026, 9, 29); var version = Version.Parse(Application.version); NeedsDeepDestroy = version >= requiredVersion; - AddressablesLoader.LoadAll(); Coroutines.Start(SetFps()); } diff --git a/MiraAPI/Patches/Menu/NameplatesTabPatches.cs b/MiraAPI/Patches/Menu/NameplatesTabPatches.cs deleted file mode 100644 index c105eb14..00000000 --- a/MiraAPI/Patches/Menu/NameplatesTabPatches.cs +++ /dev/null @@ -1,161 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using AmongUs.Data; -using HarmonyLib; -using Innersloth.Assets; -using MiraAPI.Utilities; -using MiraAPI.Utilities.Assets; -using Reactor.Utilities.Extensions; -using TMPro; -using UnityEngine; -using Object = UnityEngine.Object; - -namespace MiraAPI.Patches.Menu; - -[HarmonyPatch(typeof(NameplatesTab))] -public static class NameplatesTabPatches -{ - [SuppressMessage("Style", "IDE0028:Collection initialization can be simplified", Justification = "Preview feature.")] - private static readonly SortedList> SortedNameplates = new(new ControllableComparer(["vanilla"], [], StringComparer.InvariantCulture)); - private static int currentPage; - - internal static void AddRange(IEnumerable<(string Key, NamePlateData Visor)> data) - { - foreach (var (key, visor) in data) - { - if (!SortedNameplates.ContainsKey(key)) SortedNameplates.Add(key, []); - SortedNameplates[key].Add(visor); - } - } - - private static void PreviousPage(NameplatesTab tab) - { - currentPage--; - currentPage = currentPage < 0 ? SortedNameplates.Count - 1 : currentPage; - GenerateHats(tab, currentPage); - } - - private static void NextPage(NameplatesTab tab) - { - currentPage++; - currentPage = currentPage > SortedNameplates.Count - 1 ? 0 : currentPage; - GenerateHats(tab, currentPage); - } - - [HarmonyPatch(nameof(NameplatesTab.OnEnable))] - [HarmonyPrefix] - public static bool OnEnablePrefix(NameplatesTab __instance) - { - if (!AddressablesLoader.AddressableNameplatesExist) - { - return true; - } - - __instance.plateId = HatManager.Instance.GetNamePlateById(DataManager.Player.Customization.namePlate).ProdId; - - if (!SortedNameplates.ContainsKey("Vanilla")) AddRange(HatManager.Instance.GetUnlockedNamePlates().Select(x => ("Vanilla", x))); - - InventoryUtility.CreateNextBackButtons(__instance, PreviousPage, NextPage); - - GenerateHats(__instance, currentPage); - - return false; - } - - [HarmonyPatch(typeof(NameplatesTab), nameof(NameplatesTab.Update))] - [HarmonyPrefix] - - public static void UpdatePrefix(NameplatesTab __instance) - { - if (!AddressablesLoader.AddressableNameplatesExist) - { - return; - } - - if (Input.GetKeyDown(KeyCode.LeftControl) || Input.GetKeyDown(KeyCode.RightControl) || Input.GetKeyDown(KeyCode.LeftArrow)) - { - PreviousPage(__instance); - } - else if (Input.GetKeyDown(KeyCode.Tab) || Input.GetKeyDown(KeyCode.RightArrow)) - { - NextPage(__instance); - } - } - - private static void GenerateHats(NameplatesTab __instance, int page) - { - foreach (var instanceColorChip in __instance.ColorChips) instanceColorChip.gameObject.Destroy(); - __instance.ColorChips.Clear(); - __instance.scroller.Inner.GetComponentsInChildren().Do(x => x.gameObject.DeepDestroy(false)); - - var groupNameText = __instance.GetComponentInChildren(false); - - var hatIndex = 0; - - var (groupName, nameplates) = SortedNameplates.ToArray()[page]; - var text = Object.Instantiate(groupNameText, __instance.scroller.Inner); - text.enabled = true; - text.gameObject.transform.localScale = Vector3.one; - text.GetComponent().Destroy(); - text.EnableStencilMasking(); - text.text = $"{groupName} ({currentPage + 1}/{SortedNameplates.Count})"; - text.alignment = TextAlignmentOptions.Center; - text.fontSize = 5f; - text.fontSizeMax = 5f; - text.fontSizeMin = 0f; - var xLerp = __instance.XRange.Lerp(0.5f); - var yLerp = __instance.YStart - __instance.YOffset; - text.transform.localPosition = new Vector3(xLerp, yLerp, -1f); - - hatIndex += 2; - foreach (var visor in nameplates.OrderBy(HatManager.Instance.allNamePlates.IndexOf)) - { - var hatXPosition = __instance.XRange.Lerp(hatIndex % __instance.NumPerRow / (__instance.NumPerRow - 1f)); - - // ReSharper disable once PossibleLossOfFraction (Justification: Intended.) - var hatYPosition = __instance.YStart - hatIndex / __instance.NumPerRow * __instance.YOffset; - GenerateColorChip(__instance, new Vector2(hatXPosition, hatYPosition), visor); - hatIndex += 1; - } - - __instance.SetScrollerBounds(); - __instance.currentNameplateIsEquipped = true; - } - - private static void GenerateColorChip(NameplatesTab __instance, Vector2 position, NamePlateData namePlate) - { - var colorChip = Object.Instantiate(__instance.ColorTabPrefab, __instance.scroller.Inner); - colorChip.gameObject.name = namePlate.ProductId; - - if (ActiveInputManager.currentControlType == ActiveInputManager.InputType.Keyboard) - { - colorChip.Button.OnClick.AddListener((Action)__instance.ClickEquip); - colorChip.Button.OnMouseOver.AddListener((Action)(() => __instance.SelectNameplate(namePlate))); - colorChip.Button.OnMouseOut.AddListener( - (Action)(() => __instance.SelectNameplate( - HatManager.Instance.GetNamePlateById(DataManager.Player.Customization.NamePlate)))); - } - else - { - colorChip.Button.OnClick.AddListener((Action)(() => __instance.SelectNameplate(namePlate))); - } - - colorChip.Button.ClickMask = __instance.scroller.Hitbox; - colorChip.ProductId = namePlate.ProdId; - - __instance.StartCoroutine(__instance.CoLoadAssetAsync(namePlate.GetAssetReference(), (Action?)LoadNameplate)); - colorChip.transform.localPosition = new Vector3(position.x, position.y, -1f); - colorChip.Tag = namePlate; - __instance.ColorChips.Add(colorChip); - return; - - void LoadNameplate(NamePlateViewData viewData) - { - colorChip.transform.GetChild(1).GetComponent().sprite = viewData.Image; - - // (colorChip as NameplateChip).image.sprite = viewData?.Image; - } - } -} diff --git a/MiraAPI/Patches/Menu/SkinsTabPatches.cs b/MiraAPI/Patches/Menu/SkinsTabPatches.cs deleted file mode 100644 index 08bfe8ce..00000000 --- a/MiraAPI/Patches/Menu/SkinsTabPatches.cs +++ /dev/null @@ -1,155 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using AmongUs.Data; -using HarmonyLib; -using MiraAPI.Utilities; -using MiraAPI.Utilities.Assets; -using Reactor.Utilities.Extensions; -using TMPro; -using UnityEngine; -using Object = UnityEngine.Object; - -namespace MiraAPI.Patches.Menu; - -[HarmonyPatch(typeof(SkinsTab))] -public static class SkinsTabPatches -{ - private static SortedList> sortedSkins = []; - private static int currentPage; - - private static void PreviousPage(SkinsTab tab) - { - currentPage--; - currentPage = currentPage < 0 ? sortedSkins.Count - 1 : currentPage; - GenerateHats(tab, currentPage); - } - - private static void NextPage(SkinsTab tab) - { - currentPage++; - currentPage = currentPage > sortedSkins.Count - 1 ? 0 : currentPage; - GenerateHats(tab, currentPage); - } - - [HarmonyPatch(nameof(SkinsTab.OnEnable))] - [HarmonyPrefix] - [SuppressMessage("Style", "IDE0028:Collection initialization can be simplified", Justification = "Preview feature.")] - public static bool OnEnablePrefix(SkinsTab __instance) - { - if (!AddressablesLoader.AddressableSkinsExist) - { - return true; - } - - __instance.skinId = HatManager.Instance.GetSkinById(DataManager.Player.Customization.Skin).ProdId; - var allSkins = HatManager.Instance.GetUnlockedSkins().ToImmutableList(); - - if (sortedSkins.Count == 0) - { - var comparer = new ControllableComparer(["vanilla"], [], StringComparer.InvariantCulture); - sortedSkins = new SortedList>(comparer); - foreach (var skin in allSkins) - { - if (!sortedSkins.ContainsKey(skin.StoreName)) sortedSkins[skin.StoreName] = []; - sortedSkins[skin.StoreName].Add(skin); - } - } - - InventoryUtility.CreateNextBackButtons(__instance, PreviousPage, NextPage); - - GenerateHats(__instance, currentPage); - - return false; - } - - [HarmonyPatch(typeof(SkinsTab), nameof(SkinsTab.Update))] - [HarmonyPrefix] - - public static void UpdatePrefix(SkinsTab __instance) - { - if (!AddressablesLoader.AddressableSkinsExist) - { - return; - } - - if (Input.GetKeyDown(KeyCode.LeftControl) || Input.GetKeyDown(KeyCode.RightControl) || Input.GetKeyDown(KeyCode.LeftArrow)) - { - PreviousPage(__instance); - } - else if (Input.GetKeyDown(KeyCode.Tab) || Input.GetKeyDown(KeyCode.RightArrow)) - { - NextPage(__instance); - } - } - - private static void GenerateHats(SkinsTab __instance, int page) - { - foreach (var instanceColorChip in __instance.ColorChips) instanceColorChip.gameObject.Destroy(); - __instance.ColorChips.Clear(); - __instance.scroller.Inner.GetComponentsInChildren().Do(x => x.gameObject.DeepDestroy(false)); - - var groupNameText = __instance.GetComponentInChildren(false); - - var hatIndex = 0; - - var (groupName, skins) = sortedSkins.ToArray()[page]; - var text = Object.Instantiate(groupNameText, __instance.scroller.Inner); - text.enabled = true; - text.gameObject.transform.localScale = Vector3.one; - text.GetComponent().Destroy(); - text.EnableStencilMasking(); - text.text = $"{groupName} ({currentPage + 1}/{sortedSkins.Count})"; - text.alignment = TextAlignmentOptions.Center; - text.fontSize = 5f; - text.fontSizeMax = 5f; - text.fontSizeMin = 0f; - var xLerp = __instance.XRange.Lerp(0.5f); - var yLerp = __instance.YStart - __instance.YOffset; - text.transform.localPosition = new Vector3(xLerp, yLerp, -1f); - - hatIndex += 5; - foreach (var skin in skins.OrderBy(HatManager.Instance.allSkins.IndexOf)) - { - var hatXPosition = __instance.XRange.Lerp(hatIndex % __instance.NumPerRow / (__instance.NumPerRow - 1f)); - - // ReSharper disable once PossibleLossOfFraction (Justification: Intended.) - var hatYPosition = __instance.YStart - hatIndex / __instance.NumPerRow * __instance.YOffset; - GenerateColorChip(__instance, new Vector2(hatXPosition, hatYPosition), skin); - hatIndex += 1; - } - - __instance.SetScrollerBounds(); - __instance.currentSkinIsEquipped = true; - } - - private static void GenerateColorChip(SkinsTab __instance, Vector2 position, SkinData skin) - { - var colorChip = Object.Instantiate(__instance.ColorTabPrefab, __instance.scroller.Inner); - colorChip.gameObject.name = skin.ProductId; - if (ActiveInputManager.currentControlType == ActiveInputManager.InputType.Keyboard) - { - colorChip.Button.OnClick.AddListener((Action)__instance.ClickEquip); - colorChip.Button.OnMouseOver.AddListener((Action)(() => __instance.SelectSkin(skin))); - colorChip.Button.OnMouseOut.AddListener( - (Action)(() => - __instance.SelectSkin(HatManager.Instance.GetSkinById(DataManager.Player.Customization.Skin)))); - } - else - { - colorChip.Button.OnClick.AddListener((Action)(() => __instance.SelectSkin(skin))); - } - - colorChip.Button.ClickMask = __instance.scroller.Hitbox; - colorChip.ProductId = skin.ProductId; - colorChip.SelectionHighlight.gameObject.SetActive(false); - __instance.UpdateMaterials(colorChip.Inner.FrontLayer, skin); - skin.SetPreview(colorChip.Inner.FrontLayer, __instance.HasLocalPlayer() ? PlayerControl.LocalPlayer.Data.DefaultOutfit.ColorId : DataManager.Player.Customization.Color); - colorChip.transform.localPosition = new Vector3(position.x, position.y, -1f); - colorChip.Inner.transform.localPosition = skin.ChipOffset + new Vector2(0f, -0.3f); - colorChip.Tag = skin; - __instance.ColorChips.Add(colorChip); - } -} diff --git a/MiraAPI/Patches/Menu/VisorsTabPatches.cs b/MiraAPI/Patches/Menu/VisorsTabPatches.cs deleted file mode 100644 index cc37c286..00000000 --- a/MiraAPI/Patches/Menu/VisorsTabPatches.cs +++ /dev/null @@ -1,154 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using AmongUs.Data; -using HarmonyLib; -using MiraAPI.Utilities; -using MiraAPI.Utilities.Assets; -using Reactor.Utilities.Extensions; -using TMPro; -using UnityEngine; -using Object = UnityEngine.Object; - -namespace MiraAPI.Patches.Menu; - -[HarmonyPatch(typeof(VisorsTab))] -public static class VisorsTabPatches -{ - [SuppressMessage("Style", "IDE0028:Collection initialization can be simplified", Justification = "Preview feature.")] - private static readonly SortedList> SortedVisors = new(new ControllableComparer(["vanilla"], [], StringComparer.InvariantCulture)); - private static int currentPage; - - internal static void AddRange(IEnumerable<(string Key, VisorData Visor)> data) - { - foreach (var (key, visor) in data) - { - if (!SortedVisors.ContainsKey(key)) SortedVisors.Add(key, []); - SortedVisors[key].Add(visor); - } - } - - private static void PreviousPage(VisorsTab tab) - { - currentPage--; - currentPage = currentPage < 0 ? SortedVisors.Count - 1 : currentPage; - GenerateHats(tab, currentPage); - } - - private static void NextPage(VisorsTab tab) - { - currentPage++; - currentPage = currentPage > SortedVisors.Count - 1 ? 0 : currentPage; - GenerateHats(tab, currentPage); - } - - [HarmonyPatch(nameof(VisorsTab.OnEnable))] - [HarmonyPrefix] - public static bool OnEnablePrefix(VisorsTab __instance) - { - if (!AddressablesLoader.AddressableVisorsExist) - { - return true; - } - - __instance.visorId = HatManager.Instance.GetVisorById(DataManager.Player.Customization.Visor).ProdId; - - if (!SortedVisors.ContainsKey("Vanilla")) AddRange(HatManager.Instance.GetUnlockedVisors().Select(x => ("Vanilla", x))); - - InventoryUtility.CreateNextBackButtons(__instance, PreviousPage, NextPage); - - GenerateHats(__instance, currentPage); - - return false; - } - - [HarmonyPatch(typeof(VisorsTab), nameof(VisorsTab.Update))] - [HarmonyPrefix] - - public static void UpdatePrefix(VisorsTab __instance) - { - if (!AddressablesLoader.AddressableVisorsExist) - { - return; - } - - if (Input.GetKeyDown(KeyCode.LeftControl) || Input.GetKeyDown(KeyCode.RightControl) || Input.GetKeyDown(KeyCode.LeftArrow)) - { - PreviousPage(__instance); - } - else if (Input.GetKeyDown(KeyCode.Tab) || Input.GetKeyDown(KeyCode.RightArrow)) - { - NextPage(__instance); - } - } - - private static void GenerateHats(VisorsTab __instance, int page) - { - foreach (var instanceColorChip in __instance.ColorChips) instanceColorChip.gameObject.Destroy(); - __instance.ColorChips.Clear(); - __instance.scroller.Inner.GetComponentsInChildren().Do(x => x.gameObject.DeepDestroy(false)); - - var groupNameText = __instance.GetComponentInChildren(false); - - var hatIndex = 0; - - var (groupName, visors) = SortedVisors.ToArray()[page]; - var text = Object.Instantiate(groupNameText, __instance.scroller.Inner); - text.enabled = true; - text.gameObject.transform.localScale = Vector3.one; - text.GetComponent().Destroy(); - text.EnableStencilMasking(); - text.text = $"{groupName} ({currentPage + 1}/{SortedVisors.Count})"; - text.alignment = TextAlignmentOptions.Center; - text.fontSize = 5f; - text.fontSizeMax = 5f; - text.fontSizeMin = 0f; - var xLerp = __instance.XRange.Lerp(0.5f); - var yLerp = __instance.YStart - __instance.YOffset; - text.transform.localPosition = new Vector3(xLerp, yLerp, -1f); - - hatIndex += 5; - foreach (var visor in visors.OrderBy(HatManager.Instance.allVisors.IndexOf)) - { - var hatXPosition = __instance.XRange.Lerp(hatIndex % __instance.NumPerRow / (__instance.NumPerRow - 1f)); - - // ReSharper disable once PossibleLossOfFraction (Justification: Intended.) - var hatYPosition = __instance.YStart - hatIndex / __instance.NumPerRow * __instance.YOffset; - GenerateColorChip(__instance, new Vector2(hatXPosition, hatYPosition), visor); - hatIndex += 1; - } - - __instance.SetScrollerBounds(); - __instance.currentVisorIsEquipped = true; - } - - private static void GenerateColorChip(VisorsTab __instance, Vector2 position, VisorData visor) - { - var colorChip = Object.Instantiate(__instance.ColorTabPrefab, __instance.scroller.Inner); - colorChip.gameObject.name = visor.ProductId; - - if (ActiveInputManager.currentControlType == ActiveInputManager.InputType.Keyboard) - { - colorChip.Button.OnClick.AddListener((Action)__instance.ClickEquip); - colorChip.Button.OnMouseOver.AddListener((Action)(() => __instance.SelectVisor(visor))); - colorChip.Button.OnMouseOut.AddListener( - (Action)(() => - __instance.SelectVisor(HatManager.Instance.GetVisorById(DataManager.Player.Customization.Visor)))); - } - else - { - colorChip.Button.OnClick.AddListener((Action)(() => __instance.SelectVisor(visor))); - } - - colorChip.Button.ClickMask = __instance.scroller.Hitbox; - colorChip.ProductId = visor.ProductId; - colorChip.SelectionHighlight.gameObject.SetActive(false); - __instance.UpdateMaterials(colorChip.Inner.FrontLayer, visor); - visor.SetPreview(colorChip.Inner.FrontLayer, __instance.HasLocalPlayer() ? PlayerControl.LocalPlayer.Data.DefaultOutfit.ColorId : DataManager.Player.Customization.Color); - colorChip.transform.localPosition = new Vector3(position.x, position.y, -1f); - colorChip.Inner.transform.localPosition = visor.ChipOffset + new Vector2(0f, -0.3f); - colorChip.Tag = visor; - __instance.ColorChips.Add(colorChip); - } -} diff --git a/MiraAPI/Utilities/Assets/AddressablesLoader.cs b/MiraAPI/Utilities/Assets/AddressablesLoader.cs index ec029729..980b6f75 100644 --- a/MiraAPI/Utilities/Assets/AddressablesLoader.cs +++ b/MiraAPI/Utilities/Assets/AddressablesLoader.cs @@ -1,4 +1,5 @@ -using System.Collections; +using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; @@ -13,6 +14,7 @@ namespace MiraAPI.Utilities.Assets; /// /// The component for loading Addressables, and cosmetics. /// +[Obsolete("This system has been deprecated in favour of CorsacCosmetics. This will be removed in a future version.", true)] public static class AddressablesLoader { private static readonly List<(string Location, string ProviderSuffix)> CatalogLocations = [];