using 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.4.0")] [assembly: AssemblyInformationalVersion("2.0.4+a36b94437c327c54898a4abc3ad9ec626cb1a995")] [assembly: AssemblyProduct("TooManySuits")] [assembly: AssemblyTitle("TooManySuits")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("2.0.4.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("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 _configLabelScale; private readonly ConfigEntry _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("Pagination", "SuitsPerPage", 13, new ConfigDescription("Number of suits per page in the suit rack.", (AcceptableValueBase)(object)new AcceptableValueRange(13, 20), Array.Empty())); _configLabelScale = cfg.Bind("UI", "LabelScale", 1f, new ConfigDescription("Size of the text above the suit rack.", (AcceptableValueBase)(object)new AcceptableValueRange(0.5f, 3f), Array.Empty())); 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.4"); PluginHelper.RegisterPlugin("TooManySuits", version, (CompatibilityLevel)0, (VersionStrictness)0); } } public class PaginationController : MonoBehaviour { [CompilerGenerated] private sealed class d__28 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public PaginationController <>4__this; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public 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 = $"{paginationController.CurrentPage + 1}/{paginationController.PageCount}"; <>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() ?? throw new InvalidOperationException("Can't find Terminal object"); InteractTrigger val2 = ((Component)val).GetComponent() ?? 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(); ((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(); ((Transform)val4).SetParent((Transform)(object)val2, false); BoxCollider val5 = val3.AddComponent(); val5.size = Vector2.op_Implicit(val); InteractTrigger val6 = CreateInteractTrigger(val3); ((UnityEvent)(object)val6.onInteract).AddListener((UnityAction)delegate { PreviousPage(); }); _nextGo = new GameObject("nextButton"); RectTransform val7 = _nextGo.AddComponent(); ((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(); ((Transform)val9).SetParent((Transform)(object)val7, false); BoxCollider val10 = val8.AddComponent(); val10.size = Vector2.op_Implicit(val); InteractTrigger val11 = CreateInteractTrigger(val8); ((UnityEvent)(object)val11.onInteract).AddListener((UnityAction)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(); ((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(); ((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(); if (!((Object)(object)component == (Object)null)) { bool flag = i >= num && i < num2; Renderer[] componentsInChildren = ((Component)val).gameObject.GetComponentsInChildren(); foreach (Renderer val2 in componentsInChildren) { val2.enabled = flag; } Collider[] componentsInChildren2 = ((Component)val).gameObject.GetComponentsInChildren(); foreach (Collider val3 in componentsInChildren2) { val3.enabled = flag; } InteractTrigger component2 = ((Component)val).gameObject.GetComponent(); ((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(d__28))] private IEnumerator UpdateLabel() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new 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(); ((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.SuitsPerPage = TooManySuits.Config.SuitsPerPage; Vector3 val3 = StartOfRound.Instance.rightmostSuitPosition.forward * 2.0700002f / 2f; AutoParentToShip val4 = val.AddComponent(); 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 GetUnlockedSuits() { return from suit in Resources.FindObjectsOfTypeAll() orderby suit.syncedSuitID.Value where ((NetworkBehaviour)suit).IsSpawned select suit; } internal void UpdateSuits() { this.SuitsUpdated?.Invoke(); } } [BepInPlugin("TooManySuits", "TooManySuits", "2.0.4")] [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.4"; } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { internal IgnoresAccessChecksToAttribute(string assemblyName) { } } }