Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of TooManySuits v2.0.3
TooManySuits.dll
Decompiled a month agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using LobbyCompatibility.Enums; using LobbyCompatibility.Features; using Microsoft.CodeAnalysis; using TMPro; using Unity.Netcode; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("TooManySuits")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("2.0.2.0")] [assembly: AssemblyInformationalVersion("2.0.2+490ae9fcaf3e9f6624950c46c3542f9a6ddee509")] [assembly: AssemblyProduct("TooManySuits")] [assembly: AssemblyTitle("TooManySuits")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("2.0.2.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace TooManySuits { internal class AssetManager { public TMP_FontAsset Vga437Font { get; private set; } public AssetManager() { Assembly executingAssembly = Assembly.GetExecutingAssembly(); using Stream stream = executingAssembly.GetManifestResourceStream("TooManySuits.AssetBundle") ?? throw new InvalidOperationException("Failed to load AssetBundle"); AssetBundle val = AssetBundle.LoadFromStream(stream); Vga437Font = val.LoadAsset<TMP_FontAsset>("Perfect DOS VGA 437 SDF") ?? throw new InvalidOperationException("Failed to load font 'Perfect DOS VGA 437 SDF' from AssetBundle"); } } internal class Config { private readonly ConfigEntry<float> _configLabelScale; private readonly ConfigEntry<int> _configSuitsPerPage; public float LabelScale => _configLabelScale.Value; public int SuitsPerPage => _configSuitsPerPage.Value; public Config(ConfigFile cfg) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Expected O, but got Unknown _configSuitsPerPage = cfg.Bind<int>("Pagination", "SuitsPerPage", 13, new ConfigDescription("Number of suits per page in the suit rack.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(13, 20), Array.Empty<object>())); _configLabelScale = cfg.Bind<float>("UI", "LabelScale", 1f, new ConfigDescription("Size of the text above the suit rack.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.5f, 3f), Array.Empty<object>())); cfg.OrphanedEntries.Clear(); cfg.Save(); } } internal static class LobbyCompatibility { public static void Init() { TooManySuits.Logger.LogInfo((object)"Registering plugin with LobbyCompatibility."); Version version = Version.Parse("2.0.2"); PluginHelper.RegisterPlugin("TooManySuits", version, (CompatibilityLevel)0, (VersionStrictness)0); } } public class PaginationController : MonoBehaviour { [CompilerGenerated] private sealed class <UpdateLabel>d__28 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public PaginationController <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <UpdateLabel>d__28(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; PaginationController paginationController = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; ((TMP_Text)paginationController._pageTextMesh).text = $"<b>{paginationController.CurrentPage + 1}/{paginationController.PageCount}</b>"; <>2__current = null; <>1__state = 1; return true; case 1: { <>1__state = -1; TMP_CharacterInfo[] characterInfo = ((TMP_Text)paginationController._pageTextMesh).textInfo.characterInfo; int characterCount = ((TMP_Text)paginationController._pageTextMesh).textInfo.characterCount; Vector3 val = default(Vector3); ((Vector3)(ref val))..ctor(2f, 0f, 0f); Vector3 val2 = new Vector3(0f, 1f, 0f) * ((TMP_Text)paginationController._pageTextMesh).outlineWidth; paginationController._previousGo.transform.localPosition = characterInfo[0].topLeft - val2 * 2f - val + new Vector3(0f, characterInfo[0].baseLine, 0f); paginationController._nextGo.transform.localPosition = characterInfo[characterCount - 1].topRight - val2 * 2f + val + new Vector3(0f, characterInfo[characterCount - 1].baseLine, 0f); paginationController._previousGo.SetActive(paginationController.PageCount > 0 && paginationController.CurrentPage > 0); paginationController._nextGo.SetActive(paginationController.PageCount > 0 && paginationController.CurrentPage < paginationController.PageCount - 1); paginationController._pageGo.SetActive(paginationController.PageCount > 0); return false; } } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private UnlockableSuit[] _allSuits; private TextMeshPro _pageTextMesh; private GameObject _pageGo; private GameObject _previousGo; private GameObject _nextGo; private bool _shouldUpdate; public int SuitsPerPage { get; set; } private int CurrentPage { get; set; } private int PageCount { get; set; } private static Sprite FindInteractIcon() { Terminal val = Object.FindObjectOfType<Terminal>() ?? throw new InvalidOperationException("Can't find Terminal object"); InteractTrigger val2 = ((Component)val).GetComponent<InteractTrigger>() ?? throw new InvalidOperationException("Can't find InteractTrigger component from Terminal object"); return val2.hoverIcon; } private void Awake() { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Expected O, but got Unknown //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Expected O, but got Unknown //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Expected O, but got Unknown //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Expected O, but got Unknown //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_0182: Unknown result type (might be due to invalid IL or missing references) //IL_0189: Expected O, but got Unknown //IL_01a7: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Unknown result type (might be due to invalid IL or missing references) if (SuitsPerPage <= 0) { throw new InvalidOperationException("SuitsPerPage must be >= 0"); } Vector2 val = default(Vector2); ((Vector2)(ref val))..ctor(10f, 10f); _pageGo = new GameObject("page"); _pageGo.transform.SetParent(((Component)this).transform, false); _pageTextMesh = CreateTMP(_pageGo, "Page"); _previousGo = new GameObject("previousButton"); RectTransform val2 = _previousGo.AddComponent<RectTransform>(); ((Transform)val2).SetParent(((Component)this).transform, false); val2.anchorMax = new Vector2(0f, 0.5f); val2.anchorMin = new Vector2(0f, 0.5f); CreateTMP(_previousGo, "<"); GameObject val3 = new GameObject("trigger"); RectTransform val4 = val3.AddComponent<RectTransform>(); ((Transform)val4).SetParent((Transform)(object)val2, false); BoxCollider val5 = val3.AddComponent<BoxCollider>(); val5.size = Vector2.op_Implicit(val); InteractTrigger val6 = CreateInteractTrigger(val3); ((UnityEvent<PlayerControllerB>)(object)val6.onInteract).AddListener((UnityAction<PlayerControllerB>)delegate { PreviousPage(); }); _nextGo = new GameObject("nextButton"); RectTransform val7 = _nextGo.AddComponent<RectTransform>(); ((Transform)val7).SetParent(((Component)this).transform, false); val7.anchorMax = new Vector2(1f, 0.5f); val7.anchorMin = new Vector2(1f, 0.5f); CreateTMP(_nextGo, ">"); GameObject val8 = new GameObject("trigger"); RectTransform val9 = val8.AddComponent<RectTransform>(); ((Transform)val9).SetParent((Transform)(object)val7, false); BoxCollider val10 = val8.AddComponent<BoxCollider>(); val10.size = Vector2.op_Implicit(val); InteractTrigger val11 = CreateInteractTrigger(val8); ((UnityEvent<PlayerControllerB>)(object)val11.onInteract).AddListener((UnityAction<PlayerControllerB>)delegate { NextPage(); }); static InteractTrigger CreateInteractTrigger(GameObject go) { //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Expected O, but got Unknown //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Expected O, but got Unknown //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Expected O, but got Unknown //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Expected O, but got Unknown //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Expected O, but got Unknown Sprite val12 = FindInteractIcon(); InteractTrigger val13 = go.AddComponent<InteractTrigger>(); ((Component)val13).gameObject.tag = "InteractTrigger"; ((Component)val13).gameObject.layer = LayerMask.NameToLayer("InteractableObject"); val13.interactable = true; val13.oneHandedItemAllowed = true; val13.holdInteraction = false; val13.interactCooldown = false; val13.onInteract = new InteractEvent(); val13.onInteractEarly = new InteractEvent(); val13.onCancelAnimation = new InteractEvent(); val13.onStopInteract = new InteractEvent(); val13.holdingInteractEvent = new InteractEventFloat(); val13.hoverTip = ""; val13.disabledHoverTip = ""; val13.hoverIcon = val12; val13.disabledHoverIcon = val12; return val13; } static TextMeshPro CreateTMP(GameObject go, string text) { //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) TextMeshPro val14 = go.AddComponent<TextMeshPro>(); ((TMP_Text)val14).autoSizeTextContainer = true; ((TMP_Text)val14).enableWordWrapping = false; ((TMP_Text)val14).alignment = (TextAlignmentOptions)514; ((TMP_Text)val14).text = text; ((TMP_Text)val14).font = TooManySuits.AssetManager.Vga437Font; ((TMP_Text)val14).fontMaterial = ((TMP_Asset)TooManySuits.AssetManager.Vga437Font).material; ((Graphic)val14).color = new Color(255f, 255f, 255f, 255f); ((TMP_Text)val14).outlineColor = new Color32((byte)0, (byte)0, (byte)0, byte.MaxValue); ((TMP_Text)val14).outlineWidth = 0.25f; return val14; } } private void Start() { TooManySuits.SuitManager.SuitsUpdated += OnSuitsUpdated; UpdateSuits(); } private void Update() { if (_shouldUpdate) { _shouldUpdate = false; UpdateSuits(); } } private void OnDestroy() { TooManySuits.SuitManager.SuitsUpdated -= OnSuitsUpdated; } private void OnSuitsUpdated() { _shouldUpdate = true; } private void UpdateSuits() { _allSuits = SuitManager.GetUnlockedSuits().ToArray(); PageCount = Mathf.CeilToInt((float)_allSuits.Length / (float)SuitsPerPage); if (CurrentPage > PageCount - 1) { CurrentPage = PageCount - 1; } DisplayCurrentPage(); } private void NextPage() { if (CurrentPage < PageCount - 1) { CurrentPage++; DisplayCurrentPage(); } } private void PreviousPage() { if (CurrentPage > 0) { CurrentPage--; DisplayCurrentPage(); } } private void DisplayCurrentPage() { //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_0160: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_0180: Unknown result type (might be due to invalid IL or missing references) int num = CurrentPage * SuitsPerPage; int num2 = Mathf.Min(num + SuitsPerPage, _allSuits.Length); float num3 = 0.18f; if (TooManySuits.Config.SuitsPerPage > 13 && _allSuits.Length > 13) { num3 /= (float)Mathf.Min(_allSuits.Length, TooManySuits.Config.SuitsPerPage) / 12f; } int num4 = 0; for (int i = 0; i < _allSuits.Length; i++) { UnlockableSuit val = _allSuits[i]; AutoParentToShip component = ((Component)val).gameObject.GetComponent<AutoParentToShip>(); if (!((Object)(object)component == (Object)null)) { bool flag = i >= num && i < num2; Renderer[] componentsInChildren = ((Component)val).gameObject.GetComponentsInChildren<Renderer>(); foreach (Renderer val2 in componentsInChildren) { val2.enabled = flag; } Collider[] componentsInChildren2 = ((Component)val).gameObject.GetComponentsInChildren<Collider>(); foreach (Collider val3 in componentsInChildren2) { val3.enabled = flag; } InteractTrigger component2 = ((Component)val).gameObject.GetComponent<InteractTrigger>(); ((Behaviour)component2).enabled = flag; component2.interactable = flag; if (flag) { component.overrideOffset = true; component.positionOffset = new Vector3(-2.45f, 2.75f, -8.41f) + StartOfRound.Instance.rightmostSuitPosition.forward * (num3 * (float)num4); component.rotationOffset = new Vector3(0f, 90f, 0f); num4++; } } } ((MonoBehaviour)this).StartCoroutine(UpdateLabel()); } [IteratorStateMachine(typeof(<UpdateLabel>d__28))] private IEnumerator UpdateLabel() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <UpdateLabel>d__28(0) { <>4__this = this }; } } [HarmonyPatch] internal class Patches { [HarmonyPostfix] [HarmonyPatch(typeof(StartOfRound), "Start")] [HarmonyPriority(600)] [HarmonyAfter(new string[] { "x753.More_Suits" })] private static void StartPatch() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("TooManySuitsPageLabel"); val.SetActive(false); RectTransform val2 = val.AddComponent<RectTransform>(); ((Transform)val2).SetParent(StartOfRound.Instance.rightmostSuitPosition, false); ((Transform)val2).localPosition = Vector3.zero; ((Transform)val2).localEulerAngles = Vector3.zero; ((Transform)val2).localScale = Vector3.one * TooManySuits.Config.LabelScale * 0.05f; PaginationController paginationController = val.AddComponent<PaginationController>(); paginationController.SuitsPerPage = TooManySuits.Config.SuitsPerPage; Vector3 val3 = StartOfRound.Instance.rightmostSuitPosition.forward * 2.0700002f / 2f; AutoParentToShip val4 = val.AddComponent<AutoParentToShip>(); val4.overrideOffset = true; val4.positionOffset = new Vector3(-2.45f, 3f, -8.41f) + val3; val4.rotationOffset = new Vector3(0f, 180f, 0f); val.SetActive(true); TooManySuits.SuitManager.UpdateSuits(); } [HarmonyPostfix] [HarmonyPatch(typeof(StartOfRound), "PositionSuitsOnRack")] [HarmonyPriority(600)] [HarmonyAfter(new string[] { "x753.More_Suits" })] private static void PositionSuitsOnRackPatch() { TooManySuits.SuitManager.UpdateSuits(); } } internal class SuitManager { public event Action? SuitsUpdated; public static IEnumerable<UnlockableSuit> GetUnlockedSuits() { return from suit in Resources.FindObjectsOfTypeAll<UnlockableSuit>() orderby suit.syncedSuitID.Value where ((NetworkBehaviour)suit).IsSpawned select suit; } internal void UpdateSuits() { this.SuitsUpdated?.Invoke(); } } [BepInPlugin("TooManySuits", "TooManySuits", "2.0.2")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class TooManySuits : BaseUnityPlugin { internal const string MoreSuitsGuid = "x753.More_Suits"; internal const int VanillaSuitsPerPage = 13; internal const float SuitThickness = 0.18f; private static readonly Harmony Harmony = new Harmony("TooManySuits"); internal static SuitManager SuitManager { get; } = new SuitManager(); internal static AssetManager AssetManager { get; } = new AssetManager(); internal static ManualLogSource Logger { get; private set; } = null; internal static Config Config { get; private set; } = null; private void Awake() { Logger = ((BaseUnityPlugin)this).Logger; Config = new Config(((BaseUnityPlugin)this).Config); Harmony.PatchAll(); if (Chainloader.PluginInfos.ContainsKey("BMX.LobbyCompatibility")) { LobbyCompatibility.Init(); } } } public static class MyPluginInfo { public const string PLUGIN_GUID = "TooManySuits"; public const string PLUGIN_NAME = "TooManySuits"; public const string PLUGIN_VERSION = "2.0.2"; } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { internal IgnoresAccessChecksToAttribute(string assemblyName) { } } }