Please disclose if any significant portion of your mod was created 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 Empress Module Manager v1.0.2
ModuleManager.dll
Decompiled 4 months 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 System.Text.RegularExpressions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using Photon.Pun; using TMPro; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("Omniscye")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+d6b9a17f444632a047419185c533d1083cae6463")] [assembly: AssemblyProduct("ModuleManager")] [assembly: AssemblyTitle("ModuleManager")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.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 Empress.ModuleBrowser { [BepInPlugin("Empress.ModuleBrowser", "Module Manager", "1.1.3")] public class ModuleBrowser : BaseUnityPlugin { private struct LevelOption { public string Name; public object Ref; } private struct ModuleEntry { public string Display; public string Key; public string ResourcePath; public int Difficulty; public int TypeKey; public object PrefabRef; public object LevelRef; public string LevelName; } [CompilerGenerated] private sealed class <>c__DisplayClass72_0 { public string levelName; internal bool <DiscoverRoutine>b__1(LevelOption l) { return string.Equals(l.Name, levelName, StringComparison.OrdinalIgnoreCase); } } [CompilerGenerated] private sealed class <DiscoverRoutine>d__72 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ModuleBrowser <>4__this; private Type <rmType>5__1; private FieldInfo <rm>5__2; private object <inst>5__3; private IEnumerable <levelsEnum>5__4; private (int typeKey, int diff, string field)[] <map>5__5; private int <totalFound>5__6; private IEnumerator <>s__7; private object <level>5__8; private <>c__DisplayClass72_0 <>8__9; private Type <levelType>5__10; private int <foundForLevel>5__11; private (int typeKey, int diff, string field)[] <>s__12; private int <>s__13; private int <typeKey>5__14; private int <diff>5__15; private string <field>5__16; private FieldInfo <fi>5__17; private IEnumerable <listObj>5__18; private IEnumerator <>s__19; private object <pref>5__20; private string <name>5__21; private string <resPath>5__22; private string <display>5__23; private string <key>5__24; private ModuleEntry <entry>5__25; private List<ModuleEntry> <bucket>5__26; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <DiscoverRoutine>d__72(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if (num == -3 || num == 1) { try { } finally { <>m__Finally1(); } } <rmType>5__1 = null; <rm>5__2 = null; <inst>5__3 = null; <levelsEnum>5__4 = null; <map>5__5 = null; <>s__7 = null; <level>5__8 = null; <>8__9 = null; <levelType>5__10 = null; <>s__12 = null; <field>5__16 = null; <fi>5__17 = null; <listObj>5__18 = null; <>s__19 = null; <pref>5__20 = null; <name>5__21 = null; <resPath>5__22 = null; <display>5__23 = null; <key>5__24 = null; <entry>5__25 = default(ModuleEntry); <bucket>5__26 = null; <>1__state = -2; } private bool MoveNext() { try { int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -3; <fi>5__17 = null; <listObj>5__18 = null; <field>5__16 = null; goto IL_068d; } <>1__state = -1; <>4__this._entries.Clear(); <>4__this._entriesByType.Clear(); <>4__this._moduleByKey.Clear(); <>4__this._levels.Clear(); <rmType>5__1 = FindTypeBySimpleName("RunManager"); <rm>5__2 = <rmType>5__1?.GetField("levels", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); <inst>5__3 = <rmType>5__1?.GetField("instance", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)?.GetValue(null); if (<inst>5__3 == null) { Logger.LogWarning((object)"RunManager.instance not found — open a save / be in-game."); return false; } <levelsEnum>5__4 = <rm>5__2?.GetValue(<inst>5__3) as IEnumerable; if (<levelsEnum>5__4 == null) { Logger.LogWarning((object)"RunManager.levels is null."); return false; } <map>5__5 = new(int, int, string)[12] { (0, 1, "ModulesNormal1"), (0, 2, "ModulesNormal2"), (0, 3, "ModulesNormal3"), (1, 1, "ModulesPassage1"), (1, 2, "ModulesPassage2"), (1, 3, "ModulesPassage3"), (2, 1, "ModulesDeadEnd1"), (2, 2, "ModulesDeadEnd2"), (2, 3, "ModulesDeadEnd3"), (3, 1, "ModulesExtraction1"), (3, 2, "ModulesExtraction2"), (3, 3, "ModulesExtraction3") }; <totalFound>5__6 = 0; <>s__7 = <levelsEnum>5__4.GetEnumerator(); <>1__state = -3; goto IL_0740; IL_0740: do { if (<>s__7.MoveNext()) { <level>5__8 = <>s__7.Current; <>8__9 = new <>c__DisplayClass72_0(); continue; } <>m__Finally1(); <>s__7 = null; <>4__this._levels.Sort((LevelOption a, LevelOption b) => string.Compare(a.Name, b.Name, StringComparison.OrdinalIgnoreCase)); <>4__this.UpdateLevelButtonText(); Logger.LogInfo((object)$"Discovered {<totalFound>5__6} modules across all levels."); if (_uiVisible) { <>4__this.RefreshCurrentTab(); } return false; } while (<level>5__8 == null); <levelType>5__10 = <level>5__8.GetType(); <>8__9.levelName = TryGetString(<level>5__8, "NarrativeName") ?? "(Unnamed Level)"; <foundForLevel>5__11 = 0; <>s__12 = <map>5__5; <>s__13 = 0; goto IL_069b; IL_068d: <>s__13++; goto IL_069b; IL_069b: if (<>s__13 < <>s__12.Length) { (int, int, string) tuple = <>s__12[<>s__13]; <typeKey>5__14 = tuple.Item1; <diff>5__15 = tuple.Item2; <field>5__16 = tuple.Item3; <fi>5__17 = <levelType>5__10.GetField(<field>5__16, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); <listObj>5__18 = <fi>5__17?.GetValue(<level>5__8) as IEnumerable; if (<listObj>5__18 == null) { goto IL_068d; } <>s__19 = <listObj>5__18.GetEnumerator(); try { while (<>s__19.MoveNext()) { <pref>5__20 = <>s__19.Current; if (<pref>5__20 == null) { continue; } <name>5__21 = TryGetString(<pref>5__20, "PrefabName"); <resPath>5__22 = TryGetString(<pref>5__20, "ResourcePath"); if (string.IsNullOrWhiteSpace(<name>5__21) && string.IsNullOrWhiteSpace(<resPath>5__22)) { continue; } <display>5__23 = ((!string.IsNullOrWhiteSpace(<name>5__21)) ? <name>5__21 : Path.GetFileName(<resPath>5__22)); <display>5__23 = <>4__this.RxModuleTrim.Replace(<display>5__23 ?? "", "").Trim(); <key>5__24 = ((!string.IsNullOrWhiteSpace(<name>5__21)) ? <name>5__21 : <resPath>5__22)?.ToLowerInvariant(); if (!string.IsNullOrEmpty(<key>5__24)) { <entry>5__25 = new ModuleEntry { Display = <display>5__23, Key = ((!string.IsNullOrWhiteSpace(<name>5__21)) ? <name>5__21 : <resPath>5__22), ResourcePath = <resPath>5__22, Difficulty = <diff>5__15, TypeKey = <typeKey>5__14, PrefabRef = <pref>5__20, LevelRef = <level>5__8, LevelName = <>8__9.levelName }; if (!<>4__this._entriesByType.TryGetValue(<typeKey>5__14, out <bucket>5__26)) { <bucket>5__26 = new List<ModuleEntry>(); <>4__this._entriesByType[<typeKey>5__14] = <bucket>5__26; } <bucket>5__26.Add(<entry>5__25); <>4__this._entries.Add(<entry>5__25); if (!<>4__this._moduleByKey.ContainsKey(<key>5__24)) { <>4__this._moduleByKey[<key>5__24] = <pref>5__20; } <totalFound>5__6++; <foundForLevel>5__11++; <name>5__21 = null; <resPath>5__22 = null; <display>5__23 = null; <key>5__24 = null; <entry>5__25 = default(ModuleEntry); <bucket>5__26 = null; <pref>5__20 = null; } } } finally { if (<>s__19 is IDisposable disposable) { disposable.Dispose(); } } <>s__19 = null; <>2__current = null; <>1__state = 1; return true; } <>s__12 = null; if (<foundForLevel>5__11 > 0 && !<>4__this._levels.Any((LevelOption l) => string.Equals(l.Name, <>8__9.levelName, StringComparison.OrdinalIgnoreCase))) { <>4__this._levels.Add(new LevelOption { Name = <>8__9.levelName, Ref = <level>5__8 }); } <>8__9 = null; <levelType>5__10 = null; <level>5__8 = null; goto IL_0740; } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<>s__7 is IDisposable disposable) { disposable.Dispose(); } } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <InitializeCanvasDelayed>d__52 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ModuleBrowser <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <InitializeCanvasDelayed>d__52(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(0.5f); <>1__state = 1; return true; case 1: <>1__state = -1; <>4__this.BuildCanvas(); 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 static bool _uiVisible; private int _tabIndex = 0; private readonly Regex RxModuleTrim = new Regex("^Module\\s*", RegexOptions.IgnoreCase | RegexOptions.Compiled); private readonly List<ModuleEntry> _entries = new List<ModuleEntry>(); private readonly Dictionary<int, List<ModuleEntry>> _entriesByType = new Dictionary<int, List<ModuleEntry>>(); private readonly Dictionary<string, object> _moduleByKey = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase); private readonly HashSet<string> _disabled = new HashSet<string>(StringComparer.OrdinalIgnoreCase); private readonly List<LevelOption> _levels = new List<LevelOption>(); private object _selectedLevelRef = null; private string _selectedLevelName = "All"; private GameObject _canvasRoot; private Canvas _canvas; private GameObject _panelRoot; private ScrollRect _scrollRect; private Transform _contentContainer; private TextMeshProUGUI _titleText; private TextMeshProUGUI _statusText; private TextMeshProUGUI _countText; private Button _refreshButton; private Button[] _tabButtons = (Button[])(object)new Button[4]; private GameObject _itemRowPrefab; private Button _allOnBtn; private Button _allOffBtn; private Button _levelBtn; private TextMeshProUGUI _levelBtnText; private GameObject _levelMenu; private ConfigEntry<KeyCode> _toggleKey; private ConfigEntry<float> _scrollSpeed; private ConfigEntry<string> _disabledCsv; private Color _bg = new Color(0.05f, 0.05f, 0.06f, 0.92f); private Color _bg2 = new Color(0.03f, 0.03f, 0.035f, 0.98f); private Color _fg = new Color(0.86f, 0.86f, 0.88f, 1f); private Color _mutedCol = new Color(0.75f, 0.75f, 0.8f, 0.75f); private Color _accentRed = new Color(0.85f, 0.15f, 0.15f, 1f); private Color _accentGreen = new Color(0.18f, 0.7f, 0.25f, 1f); private CursorLockMode _prevLock; private bool _prevVisible; internal static ModuleBrowser Instance { get; private set; } internal static ManualLogSource Logger => Instance._logger; private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger; internal Harmony? Harmony { get; set; } internal static bool UIActive => _uiVisible; private void Awake() { //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Expected O, but got Unknown //IL_013d: Unknown result type (might be due to invalid IL or missing references) Instance = this; ((Component)this).gameObject.transform.parent = null; ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject); _toggleKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Input", "ToggleKey", (KeyCode)277, "Key to toggle the Module Manager UI."); _scrollSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("UI", "ScrollSpeed", 35f, "Mouse wheel scroll sensitivity for the Module Manager list."); _disabledCsv = ((BaseUnityPlugin)this).Config.Bind<string>("Modules", "DisabledModuleKeys", "", "CSV of disabled modules (PrefabName preferred; ResourcePath allowed)."); foreach (string item in SplitCsv(_disabledCsv.Value)) { _disabled.Add(item); } Harmony = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID); Harmony.PatchAll(); Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} loaded. Press {_toggleKey.Value} to open/close the module manager."); ((MonoBehaviour)this).StartCoroutine(InitializeCanvasDelayed()); } [IteratorStateMachine(typeof(<InitializeCanvasDelayed>d__52))] private IEnumerator InitializeCanvasDelayed() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <InitializeCanvasDelayed>d__52(0) { <>4__this = this }; } private void OnDestroy() { Harmony? harmony = Harmony; if (harmony != null) { harmony.UnpatchSelf(); } if (_uiVisible) { RestoreCursor(); } if (Object.op_Implicit((Object)(object)_canvasRoot)) { Object.Destroy((Object)(object)_canvasRoot); } } private void Update() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) if (Input.GetKeyDown(_toggleKey.Value)) { _uiVisible = !_uiVisible; if (_uiVisible) { TakeCursor(); if (_entries.Count == 0) { ((MonoBehaviour)this).StartCoroutine(DiscoverRoutine()); } ShowCanvas(); } else { RestoreCursor(); HideCanvas(); } } if (_uiVisible) { KeepCursorFree(); } if ((Object)(object)_scrollRect != (Object)null && _scrollRect.scrollSensitivity != _scrollSpeed.Value) { _scrollRect.scrollSensitivity = _scrollSpeed.Value; } } private void BuildCanvas() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_008e: 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_0131: Unknown result type (might be due to invalid IL or missing references) //IL_0147: 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_0176: Unknown result type (might be due to invalid IL or missing references) //IL_01ac: Unknown result type (might be due to invalid IL or missing references) //IL_01c3: Unknown result type (might be due to invalid IL or missing references) //IL_01da: Unknown result type (might be due to invalid IL or missing references) //IL_01f1: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Unknown result type (might be due to invalid IL or missing references) //IL_02c5: Unknown result type (might be due to invalid IL or missing references) //IL_0377: Unknown result type (might be due to invalid IL or missing references) //IL_0381: Expected O, but got Unknown //IL_03dd: Unknown result type (might be due to invalid IL or missing references) //IL_03e7: Expected O, but got Unknown //IL_0443: Unknown result type (might be due to invalid IL or missing references) //IL_044d: Expected O, but got Unknown //IL_04a9: Unknown result type (might be due to invalid IL or missing references) //IL_04b3: Expected O, but got Unknown //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Expected O, but got Unknown //IL_051b: Unknown result type (might be due to invalid IL or missing references) //IL_0532: Unknown result type (might be due to invalid IL or missing references) //IL_0549: Unknown result type (might be due to invalid IL or missing references) //IL_0560: Unknown result type (might be due to invalid IL or missing references) //IL_0577: Unknown result type (might be due to invalid IL or missing references) //IL_0624: Unknown result type (might be due to invalid IL or missing references) //IL_0655: Unknown result type (might be due to invalid IL or missing references) //IL_065f: Expected O, but got Unknown //IL_06b9: Unknown result type (might be due to invalid IL or missing references) //IL_06d0: Unknown result type (might be due to invalid IL or missing references) //IL_06e7: Unknown result type (might be due to invalid IL or missing references) //IL_06fe: Unknown result type (might be due to invalid IL or missing references) //IL_0715: Unknown result type (might be due to invalid IL or missing references) //IL_0758: Unknown result type (might be due to invalid IL or missing references) //IL_07a1: Unknown result type (might be due to invalid IL or missing references) //IL_07b8: Unknown result type (might be due to invalid IL or missing references) //IL_07cf: Unknown result type (might be due to invalid IL or missing references) //IL_07e6: Unknown result type (might be due to invalid IL or missing references) //IL_084e: Unknown result type (might be due to invalid IL or missing references) //IL_085b: Unknown result type (might be due to invalid IL or missing references) //IL_0868: Unknown result type (might be due to invalid IL or missing references) //IL_08b2: Unknown result type (might be due to invalid IL or missing references) //IL_08c9: Unknown result type (might be due to invalid IL or missing references) //IL_08e0: Unknown result type (might be due to invalid IL or missing references) //IL_08f7: Unknown result type (might be due to invalid IL or missing references) //IL_0980: Unknown result type (might be due to invalid IL or missing references) //IL_0997: Unknown result type (might be due to invalid IL or missing references) //IL_09ae: Unknown result type (might be due to invalid IL or missing references) //IL_09c5: Unknown result type (might be due to invalid IL or missing references) //IL_09dc: Unknown result type (might be due to invalid IL or missing references) //IL_0a0c: Unknown result type (might be due to invalid IL or missing references) //IL_0a5d: Unknown result type (might be due to invalid IL or missing references) //IL_0a74: Unknown result type (might be due to invalid IL or missing references) //IL_0a8b: Unknown result type (might be due to invalid IL or missing references) //IL_0aa2: Unknown result type (might be due to invalid IL or missing references) //IL_0ab9: Unknown result type (might be due to invalid IL or missing references) //IL_0ae7: Unknown result type (might be due to invalid IL or missing references) //IL_0b17: Unknown result type (might be due to invalid IL or missing references) //IL_0b21: Expected O, but got Unknown _canvasRoot = new GameObject("ModuleManagerCanvas_EMPRESS"); Object.DontDestroyOnLoad((Object)(object)_canvasRoot); _canvasRoot.layer = LayerMask.NameToLayer("UI"); _canvas = _canvasRoot.AddComponent<Canvas>(); _canvas.renderMode = (RenderMode)0; _canvas.sortingOrder = 32767; _canvas.overrideSorting = true; CanvasScaler val = _canvasRoot.AddComponent<CanvasScaler>(); val.uiScaleMode = (ScaleMode)1; val.referenceResolution = new Vector2(1920f, 1080f); val.matchWidthOrHeight = 1f; _canvasRoot.AddComponent<GraphicRaycaster>(); if ((Object)(object)EventSystem.current == (Object)null) { GameObject val2 = new GameObject("EventSystem_EMPRESS"); Object.DontDestroyOnLoad((Object)(object)val2); val2.AddComponent<EventSystem>(); val2.AddComponent<StandaloneInputModule>(); } _panelRoot = CreateUIElement("Panel", _canvasRoot.transform); RectTransform component = _panelRoot.GetComponent<RectTransform>(); component.anchorMin = new Vector2(0.5f, 0.5f); component.anchorMax = new Vector2(0.5f, 0.5f); component.pivot = new Vector2(0.5f, 0.5f); component.sizeDelta = new Vector2(640f, 720f); Image val3 = _panelRoot.AddComponent<Image>(); ((Graphic)val3).color = _bg; GameObject val4 = CreateUIElement("Header", _panelRoot.transform); RectTransform component2 = val4.GetComponent<RectTransform>(); component2.anchorMin = new Vector2(0f, 1f); component2.anchorMax = new Vector2(1f, 1f); component2.pivot = new Vector2(0.5f, 1f); component2.sizeDelta = new Vector2(-28f, 60f); component2.anchoredPosition = new Vector2(0f, -14f); HorizontalLayoutGroup val5 = val4.AddComponent<HorizontalLayoutGroup>(); ((HorizontalOrVerticalLayoutGroup)val5).childControlWidth = true; ((HorizontalOrVerticalLayoutGroup)val5).childControlHeight = true; ((HorizontalOrVerticalLayoutGroup)val5).childForceExpandWidth = false; ((HorizontalOrVerticalLayoutGroup)val5).childForceExpandHeight = false; ((HorizontalOrVerticalLayoutGroup)val5).spacing = 10f; GameObject val6 = CreateUIElement("Title", val4.transform); LayoutElement val7 = val6.AddComponent<LayoutElement>(); val7.flexibleWidth = 1f; val7.minWidth = 200f; _titleText = val6.AddComponent<TextMeshProUGUI>(); ((TMP_Text)_titleText).text = "<b>▣ Module Manager</b> <color=#BBBBBB>— Empress</color>"; ((TMP_Text)_titleText).fontSize = 18f; ((TMP_Text)_titleText).fontStyle = (FontStyles)1; ((Graphic)_titleText).color = _fg; ((TMP_Text)_titleText).alignment = (TextAlignmentOptions)4097; GameObject val8 = CreateUIElement("Controls", val4.transform); HorizontalLayoutGroup val9 = val8.AddComponent<HorizontalLayoutGroup>(); ((HorizontalOrVerticalLayoutGroup)val9).spacing = 8f; ((HorizontalOrVerticalLayoutGroup)val9).childForceExpandHeight = false; ((HorizontalOrVerticalLayoutGroup)val9).childForceExpandWidth = false; GameObject val10 = CreateButton("AllOnBtn", val8.transform, "Enable All"); _allOnBtn = val10.GetComponent<Button>(); LayoutElement val11 = val10.AddComponent<LayoutElement>(); val11.preferredWidth = 110f; val11.preferredHeight = 26f; ((UnityEvent)_allOnBtn.onClick).AddListener((UnityAction)delegate { ToggleAllInCurrentTab(enable: true); }); GameObject val12 = CreateButton("AllOffBtn", val8.transform, "Disable All"); _allOffBtn = val12.GetComponent<Button>(); LayoutElement val13 = val12.AddComponent<LayoutElement>(); val13.preferredWidth = 110f; val13.preferredHeight = 26f; ((UnityEvent)_allOffBtn.onClick).AddListener((UnityAction)delegate { ToggleAllInCurrentTab(enable: false); }); GameObject val14 = CreateButton("RefreshBtn", val8.transform, "Refresh"); LayoutElement val15 = val14.AddComponent<LayoutElement>(); val15.preferredWidth = 90f; val15.preferredHeight = 26f; _refreshButton = val14.GetComponent<Button>(); ((UnityEvent)_refreshButton.onClick).AddListener((UnityAction)delegate { ((MonoBehaviour)this).StartCoroutine(DiscoverRoutine()); }); GameObject val16 = CreateButton("LevelBtn", val8.transform, "Level: All"); LayoutElement val17 = val16.AddComponent<LayoutElement>(); val17.preferredWidth = 180f; val17.preferredHeight = 26f; _levelBtn = val16.GetComponent<Button>(); ((UnityEvent)_levelBtn.onClick).AddListener(new UnityAction(ToggleLevelMenu)); Transform obj = val16.transform.Find("Text"); _levelBtnText = ((obj != null) ? ((Component)obj).GetComponent<TextMeshProUGUI>() : null); DrawDivider(_panelRoot.transform, -80f); GameObject val18 = CreateUIElement("TabBar", _panelRoot.transform); RectTransform component3 = val18.GetComponent<RectTransform>(); component3.anchorMin = new Vector2(0f, 1f); component3.anchorMax = new Vector2(1f, 1f); component3.pivot = new Vector2(0.5f, 1f); component3.sizeDelta = new Vector2(-28f, 34f); component3.anchoredPosition = new Vector2(0f, -88f); HorizontalLayoutGroup val19 = val18.AddComponent<HorizontalLayoutGroup>(); ((HorizontalOrVerticalLayoutGroup)val19).spacing = 10f; ((HorizontalOrVerticalLayoutGroup)val19).childForceExpandWidth = true; ((HorizontalOrVerticalLayoutGroup)val19).childForceExpandHeight = true; string[] array = new string[4] { "NORMAL", "PASSAGE", "DEAD END", "EXTRACTION" }; for (int i = 0; i < 4; i++) { int index = i; GameObject val20 = CreateButton($"Tab{i}", val18.transform, array[i]); Image component4 = val20.GetComponent<Image>(); ((Graphic)component4).color = _bg2; _tabButtons[i] = val20.GetComponent<Button>(); ((UnityEvent)_tabButtons[i].onClick).AddListener((UnityAction)delegate { SwitchTab(index); }); } DrawDivider(_panelRoot.transform, -128f); GameObject val21 = CreateUIElement("Status", _panelRoot.transform); RectTransform component5 = val21.GetComponent<RectTransform>(); component5.anchorMin = new Vector2(0f, 1f); component5.anchorMax = new Vector2(1f, 1f); component5.pivot = new Vector2(0.5f, 1f); component5.sizeDelta = new Vector2(-28f, 30f); component5.anchoredPosition = new Vector2(0f, -134f); _statusText = val21.AddComponent<TextMeshProUGUI>(); ((TMP_Text)_statusText).fontSize = 11f; ((Graphic)_statusText).color = new Color(0.95f, 0.75f, 0.3f, 1f); ((TMP_Text)_statusText).alignment = (TextAlignmentOptions)514; GameObject val22 = CreateUIElement("ScrollView", _panelRoot.transform); RectTransform component6 = val22.GetComponent<RectTransform>(); component6.anchorMin = new Vector2(0f, 0f); component6.anchorMax = new Vector2(1f, 1f); component6.offsetMin = new Vector2(14f, 50f); component6.offsetMax = new Vector2(-14f, -212f); _scrollRect = val22.AddComponent<ScrollRect>(); _scrollRect.horizontal = false; _scrollRect.vertical = true; _scrollRect.scrollSensitivity = _scrollSpeed.Value; GameObject val23 = CreateUIElement("Viewport", val22.transform); RectTransform component7 = val23.GetComponent<RectTransform>(); component7.anchorMin = Vector2.zero; component7.anchorMax = Vector2.one; component7.sizeDelta = Vector2.zero; val23.AddComponent<RectMask2D>(); _scrollRect.viewport = component7; GameObject val24 = CreateUIElement("Content", val23.transform); RectTransform component8 = val24.GetComponent<RectTransform>(); component8.anchorMin = new Vector2(0f, 1f); component8.anchorMax = new Vector2(1f, 1f); component8.pivot = new Vector2(0.5f, 1f); component8.sizeDelta = new Vector2(0f, 500f); VerticalLayoutGroup val25 = val24.AddComponent<VerticalLayoutGroup>(); ((HorizontalOrVerticalLayoutGroup)val25).spacing = 2f; ((HorizontalOrVerticalLayoutGroup)val25).childForceExpandWidth = true; ((HorizontalOrVerticalLayoutGroup)val25).childForceExpandHeight = false; val24.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2; _scrollRect.content = component8; _contentContainer = val24.transform; GameObject val26 = CreateUIElement("Count", _panelRoot.transform); RectTransform component9 = val26.GetComponent<RectTransform>(); component9.anchorMin = new Vector2(0f, 0f); component9.anchorMax = new Vector2(1f, 0f); component9.pivot = new Vector2(0.5f, 0f); component9.sizeDelta = new Vector2(-28f, 30f); component9.anchoredPosition = new Vector2(0f, 12f); _countText = val26.AddComponent<TextMeshProUGUI>(); ((TMP_Text)_countText).fontSize = 12f; ((Graphic)_countText).color = _mutedCol; ((TMP_Text)_countText).alignment = (TextAlignmentOptions)514; _levelMenu = CreateUIElement("LevelDropdown", _panelRoot.transform); RectTransform component10 = _levelMenu.GetComponent<RectTransform>(); component10.anchorMin = new Vector2(1f, 1f); component10.anchorMax = new Vector2(1f, 1f); component10.pivot = new Vector2(1f, 1f); component10.sizeDelta = new Vector2(240f, 10f); component10.anchoredPosition = new Vector2(-20f, -74f); Image val27 = _levelMenu.AddComponent<Image>(); ((Graphic)val27).color = new Color(0f, 0f, 0f, 0.9f); VerticalLayoutGroup val28 = _levelMenu.AddComponent<VerticalLayoutGroup>(); ((HorizontalOrVerticalLayoutGroup)val28).childForceExpandWidth = true; ((HorizontalOrVerticalLayoutGroup)val28).childForceExpandHeight = false; ((LayoutGroup)val28).padding = new RectOffset(6, 6, 6, 6); ((HorizontalOrVerticalLayoutGroup)val28).spacing = 4f; _levelMenu.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2; _levelMenu.SetActive(false); CreateItemRowPrefab(); _canvasRoot.SetActive(false); UpdateTabVisuals(); } private void CreateItemRowPrefab() { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: 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_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Unknown result type (might be due to invalid IL or missing references) _itemRowPrefab = CreateUIElement("ItemRowPrefab", _panelRoot.transform); _itemRowPrefab.SetActive(false); RectTransform component = _itemRowPrefab.GetComponent<RectTransform>(); component.sizeDelta = new Vector2(0f, 34f); HorizontalLayoutGroup val = _itemRowPrefab.AddComponent<HorizontalLayoutGroup>(); ((HorizontalOrVerticalLayoutGroup)val).childForceExpandWidth = true; ((HorizontalOrVerticalLayoutGroup)val).childForceExpandHeight = true; ((HorizontalOrVerticalLayoutGroup)val).spacing = 8f; TextMeshProUGUI val2 = CreateTextMeshPro("Label", _itemRowPrefab.transform, "", 13f, _fg, (TextAlignmentOptions)4097); LayoutElement val3 = ((Component)val2).gameObject.AddComponent<LayoutElement>(); val3.flexibleWidth = 1f; RectTransform component2 = ((Component)val2).GetComponent<RectTransform>(); component2.anchorMin = new Vector2(0f, 0f); component2.anchorMax = new Vector2(1f, 1f); component2.offsetMin = Vector2.zero; component2.offsetMax = Vector2.zero; GameObject val4 = CreateButton("ToggleBtn", _itemRowPrefab.transform, "ENABLED"); LayoutElement val5 = val4.AddComponent<LayoutElement>(); val5.preferredWidth = 110f; val5.preferredHeight = 26f; Image component3 = val4.GetComponent<Image>(); ((Graphic)component3).color = _accentGreen; } private GameObject CreateUIElement(string name, Transform parent) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown GameObject val = new GameObject(name); val.transform.SetParent(parent, false); val.AddComponent<RectTransform>(); return val; } private GameObject CreateButton(string name, Transform parent, string text) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: 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_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0078: 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_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) GameObject val = CreateUIElement(name, parent); Image val2 = val.AddComponent<Image>(); ((Graphic)val2).color = _bg2; Button val3 = val.AddComponent<Button>(); ((Selectable)val3).targetGraphic = (Graphic)(object)val2; ColorBlock colors = ((Selectable)val3).colors; ((ColorBlock)(ref colors)).normalColor = Color.white; ((ColorBlock)(ref colors)).highlightedColor = new Color(1f, 1f, 1f, 0.95f); ((ColorBlock)(ref colors)).pressedColor = new Color(1f, 1f, 1f, 0.85f); ((ColorBlock)(ref colors)).selectedColor = Color.white; ((ColorBlock)(ref colors)).disabledColor = new Color(1f, 1f, 1f, 0.5f); ((Selectable)val3).colors = colors; TextMeshProUGUI val4 = CreateTextMeshPro("Text", val.transform, text, 13f, _fg, (TextAlignmentOptions)514); TextMeshProUGUI val5 = val4; ((TMP_Text)val5).enableWordWrapping = false; ((TMP_Text)val5).overflowMode = (TextOverflowModes)1; RectTransform component = ((Component)val4).GetComponent<RectTransform>(); component.anchorMin = Vector2.zero; component.anchorMax = Vector2.one; component.sizeDelta = Vector2.zero; return val; } private TextMeshProUGUI CreateTextMeshPro(string name, Transform parent, string text, float fontSize, Color color, TextAlignmentOptions alignment) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) GameObject val = CreateUIElement(name, parent); TextMeshProUGUI val2 = val.AddComponent<TextMeshProUGUI>(); ((TMP_Text)val2).text = text; ((TMP_Text)val2).fontSize = fontSize; ((Graphic)val2).color = color; ((TMP_Text)val2).alignment = alignment; ((TMP_Text)val2).enableWordWrapping = false; ((TMP_Text)val2).overflowMode = (TextOverflowModes)1; return val2; } private void DrawDivider(Transform parent, float yPos) { //IL_0020: 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_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0062: 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) //IL_009b: Unknown result type (might be due to invalid IL or missing references) GameObject val = CreateUIElement("Divider", parent); RectTransform component = val.GetComponent<RectTransform>(); component.anchorMin = new Vector2(0f, 1f); component.anchorMax = new Vector2(1f, 1f); component.pivot = new Vector2(0.5f, 1f); component.sizeDelta = new Vector2(-28f, 1f); component.anchoredPosition = new Vector2(0f, yPos); Image val2 = val.AddComponent<Image>(); ((Graphic)val2).color = new Color(1f, 1f, 1f, 0.12f); } private void ShowCanvas() { if (Object.op_Implicit((Object)(object)_canvasRoot)) { _canvasRoot.SetActive(true); } RefreshCurrentTab(); } private void HideCanvas() { if (Object.op_Implicit((Object)(object)_canvasRoot)) { _canvasRoot.SetActive(false); } } private void SwitchTab(int index) { _tabIndex = index; UpdateTabVisuals(); RefreshCurrentTab(); } private void UpdateTabVisuals() { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) for (int i = 0; i < _tabButtons.Length; i++) { if (!((Object)(object)_tabButtons[i] == (Object)null)) { Image component = ((Component)_tabButtons[i]).GetComponent<Image>(); ((Graphic)component).color = (Color)((_tabIndex == i) ? new Color(0.12f, 0.12f, 0.14f, 1f) : _bg2); } } } private void RefreshCurrentTab() { //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Expected O, but got Unknown //IL_02a9: Unknown result type (might be due to invalid IL or missing references) //IL_02b3: Expected O, but got Unknown if ((Object)(object)_contentContainer == (Object)null) { return; } if ((Object)(object)_itemRowPrefab == (Object)null) { CreateItemRowPrefab(); } foreach (Transform item in _contentContainer) { Transform val = item; Object.Destroy((Object)(object)((Component)val).gameObject); } bool flag = HostControls(); ((TMP_Text)_statusText).text = (flag ? "Host controls module availability. Clients view-only." : "⚠ Host only — toggles are disabled for clients."); List<ModuleEntry> value; List<ModuleEntry> source = (_entriesByType.TryGetValue(_tabIndex, out value) ? value : new List<ModuleEntry>()); if (_selectedLevelRef != null) { source = source.Where((ModuleEntry e) => e.LevelRef == _selectedLevelRef).ToList(); } List<ModuleEntry> list = source.OrderBy((ModuleEntry e) => e.Difficulty).ThenBy<ModuleEntry, string>((ModuleEntry e) => e.Display, StringComparer.OrdinalIgnoreCase).ToList(); foreach (ModuleEntry item2 in list) { GameObject val2 = Object.Instantiate<GameObject>(_itemRowPrefab, _contentContainer); val2.SetActive(true); Transform obj = val2.transform.Find("Label"); TextMeshProUGUI val3 = ((obj != null) ? ((Component)obj).GetComponent<TextMeshProUGUI>() : null); if (Object.op_Implicit((Object)(object)val3)) { ((TMP_Text)val3).text = $"{item2.Display} <color=#888888>[d{item2.Difficulty}]</color>"; } Transform obj2 = val2.transform.Find("ToggleBtn"); Button val4 = ((obj2 != null) ? ((Component)obj2).GetComponent<Button>() : null); if (Object.op_Implicit((Object)(object)val4)) { bool enabled = !IsDisabledKey(item2.Key) && !IsDisabledKey(item2.ResourcePath); Image btnImage = ((Component)val4).GetComponent<Image>(); Transform obj3 = ((Component)val4).transform.Find("Text"); TextMeshProUGUI btnText = ((obj3 != null) ? ((Component)obj3).GetComponent<TextMeshProUGUI>() : null); UpdateToggleButtonVisual(btnImage, btnText, enabled); ((Selectable)val4).interactable = flag; string key = item2.Key; string alt = item2.ResourcePath; ((UnityEventBase)val4.onClick).RemoveAllListeners(); ((UnityEvent)val4.onClick).AddListener((UnityAction)delegate { bool flag2 = !IsDisabledKey(key) && !IsDisabledKey(alt); bool flag3 = !flag2; SetModuleEnabled(key, alt, flag3); UpdateToggleButtonVisual(btnImage, btnText, flag3); RefreshCounts(); }); } } RefreshCounts(); } private void RefreshCounts() { List<ModuleEntry> value; List<ModuleEntry> list = (_entriesByType.TryGetValue(_tabIndex, out value) ? value : new List<ModuleEntry>()); if (_selectedLevelRef != null) { list = list.Where((ModuleEntry e) => e.LevelRef == _selectedLevelRef).ToList(); } int count = list.Count; int num = list.Count((ModuleEntry e) => !IsDisabledKey(e.Key) && !IsDisabledKey(e.ResourcePath)); int tabIndex = _tabIndex; if (1 == 0) { } string text = tabIndex switch { 0 => "normal", 1 => "passage", 2 => "dead-end", 3 => "extraction", _ => "modules", }; if (1 == 0) { } string arg = text; ((TMP_Text)_countText).text = $"{num}/{count} {arg} enabled"; List<string> list2 = new List<string>(); int d; for (d = 1; d <= 3; d++) { if (list.Count((ModuleEntry e) => e.Difficulty == d && !IsDisabledKey(e.Key) && !IsDisabledKey(e.ResourcePath)) == 0) { list2.Add($"d{d} pool empty → fail-safe will ignore filters"); } } if (list2.Count > 0) { ((TMP_Text)_statusText).text = "⚠ " + string.Join(" · ", list2); } } private void UpdateToggleButtonVisual(Image img, TextMeshProUGUI txt, bool enabled) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)img)) { ((Graphic)img).color = (enabled ? _accentGreen : _accentRed); } if (Object.op_Implicit((Object)(object)txt)) { ((TMP_Text)txt).text = (enabled ? "ENABLED" : "DISABLED"); } } private void ToggleAllInCurrentTab(bool enable) { if (!_entriesByType.TryGetValue(_tabIndex, out List<ModuleEntry> value)) { return; } IEnumerable<ModuleEntry> enumerable = value; if (_selectedLevelRef != null) { enumerable = enumerable.Where((ModuleEntry e) => e.LevelRef == _selectedLevelRef); } foreach (ModuleEntry item in enumerable) { SetModuleEnabled(item.Key, item.ResourcePath, enable); } RefreshCurrentTab(); } private void SetModuleEnabled(string keyName, string altResourcePath, bool enable) { string text = ((!string.IsNullOrEmpty(keyName)) ? keyName : altResourcePath); if (string.IsNullOrEmpty(text)) { return; } if (!HostControls()) { Logger.LogWarning((object)"Client cannot change module filters. Only the host controls module pools."); return; } if (!enable) { _disabled.Add(text); } else { _disabled.Remove(text); } List<string> values = _disabled.ToList(); if (!string.IsNullOrEmpty(altResourcePath)) { if (enable) { _disabled.Remove(altResourcePath); } else { _disabled.Add(altResourcePath); } values = _disabled.Distinct<string>(StringComparer.OrdinalIgnoreCase).ToList(); } _disabledCsv.Value = string.Join(",", values); ((BaseUnityPlugin)this).Config.Save(); } private static IEnumerable<string> SplitCsv(string csv) { IEnumerable<string> result; if (!string.IsNullOrWhiteSpace(csv)) { result = from s in csv.Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries) select s.Trim() into s where !string.IsNullOrEmpty(s) select s; } else { IEnumerable<string> enumerable = Enumerable.Empty<string>(); result = enumerable; } return result; } private bool IsDisabledKey(string key) { return !string.IsNullOrEmpty(key) && _disabled.Contains(key); } [IteratorStateMachine(typeof(<DiscoverRoutine>d__72))] private IEnumerator DiscoverRoutine() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <DiscoverRoutine>d__72(0) { <>4__this = this }; } private void UpdateLevelButtonText() { if (Object.op_Implicit((Object)(object)_levelBtnText)) { ((TMP_Text)_levelBtnText).text = "Level: " + _selectedLevelName; } } private void ToggleLevelMenu() { if (!((Object)(object)_levelMenu == (Object)null)) { bool flag = !_levelMenu.activeSelf; if (flag) { BuildLevelMenu(); } _levelMenu.SetActive(flag); } } private void StyleMenuItem(GameObject go) { //IL_008f: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)go == (Object)null)) { LayoutElement val = go.GetComponent<LayoutElement>() ?? go.AddComponent<LayoutElement>(); val.preferredHeight = 26f; val.minHeight = 26f; val.flexibleWidth = 1f; Transform obj = go.transform.Find("Text"); TextMeshProUGUI val2 = ((obj != null) ? ((Component)obj).GetComponent<TextMeshProUGUI>() : null); if (Object.op_Implicit((Object)(object)val2)) { ((TMP_Text)val2).alignment = (TextAlignmentOptions)4097; ((TMP_Text)val2).margin = new Vector4(8f, 0f, 8f, 0f); } } } private void BuildLevelMenu() { //IL_0079: 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_00a8: Expected O, but got Unknown //IL_0108: 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_0143: Expected O, but got Unknown if ((Object)(object)_levelMenu == (Object)null) { return; } for (int num = _levelMenu.transform.childCount - 1; num >= 0; num--) { Object.Destroy((Object)(object)((Component)_levelMenu.transform.GetChild(num)).gameObject); } GameObject val = CreateButton("AllLevels", _levelMenu.transform, "All Levels"); ((Graphic)val.GetComponent<Image>()).color = _bg2; StyleMenuItem(val); ((UnityEvent)val.GetComponent<Button>().onClick).AddListener((UnityAction)delegate { _selectedLevelRef = null; _selectedLevelName = "All"; UpdateLevelButtonText(); _levelMenu.SetActive(false); RefreshCurrentTab(); }); foreach (LevelOption level in _levels) { GameObject val2 = CreateButton("Level_" + level.Name, _levelMenu.transform, level.Name); ((Graphic)val2.GetComponent<Image>()).color = _bg2; StyleMenuItem(val2); LevelOption cap = level; ((UnityEvent)val2.GetComponent<Button>().onClick).AddListener((UnityAction)delegate { _selectedLevelRef = cap.Ref; _selectedLevelName = cap.Name; UpdateLevelButtonText(); _levelMenu.SetActive(false); RefreshCurrentTab(); }); } } private void TakeCursor() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) _prevLock = Cursor.lockState; _prevVisible = Cursor.visible; try { Type type = FindTypeBySimpleName("CursorManager"); object obj = type?.GetField("instance", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)?.GetValue(null); type?.GetMethod("Unlock", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.Invoke(obj, new object[1] { 9999f }); } catch { } Cursor.lockState = (CursorLockMode)0; Cursor.visible = true; } private void KeepCursorFree() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 if ((int)Cursor.lockState > 0) { Cursor.lockState = (CursorLockMode)0; } if (!Cursor.visible) { Cursor.visible = true; } } private void RestoreCursor() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) Cursor.lockState = _prevLock; Cursor.visible = _prevVisible; if (Object.op_Implicit((Object)(object)_levelMenu)) { _levelMenu.SetActive(false); } } internal static Type? FindTypeBySimpleName(string simpleName) { string simpleName2 = simpleName; Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (Assembly assembly in assemblies) { Type type = null; try { type = assembly.GetTypes().FirstOrDefault((Type x) => x.Name == simpleName2 || (x.FullName?.EndsWith("." + simpleName2) ?? false)); } catch { } if (type != null) { return type; } } return null; } private static string TryGetString(object target, string memberName) { if (target == null || string.IsNullOrEmpty(memberName)) { return null; } Type type = target.GetType(); try { PropertyInfo property = type.GetProperty(memberName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (property != null) { return property.GetValue(target, null)?.ToString(); } } catch { } try { FieldInfo field = type.GetField(memberName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { return field.GetValue(target)?.ToString(); } } catch { } return null; } internal static bool HostControls() { try { if (!PhotonNetwork.InRoom) { return true; } return PhotonNetwork.IsMasterClient; } catch { return true; } } } [HarmonyPatch] internal static class Patch_LevelGenerator_PickModule { private static MethodBase TargetMethod() { Type type = ModuleBrowser.FindTypeBySimpleName("LevelGenerator"); if (type == null) { return null; } MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); foreach (MethodInfo methodInfo in methods) { if (!(methodInfo.Name != "PickModule")) { return methodInfo; } } return null; } private static void Prefix(object __instance, object _list1, object _list2, object _list3) { if (!ModuleBrowser.HostControls()) { return; } try { FilterOne(_list1); FilterOne(_list2); FilterOne(_list3); } catch (Exception ex) { ModuleBrowser.Logger.LogWarning((object)("PickModule filter failed: " + ex.Message)); } } private static void FilterOne(object listObj) { if (listObj == null) { return; } Type type = listObj.GetType(); object[] array = ((listObj is IEnumerable source) ? source.Cast<object>().ToArray() : null); if (array == null || array.Length == 0) { return; } List<object> list = new List<object>(array.Length); object[] array2 = array; foreach (object obj in array2) { string text = TryGetString(obj, "PrefabName"); string text2 = TryGetString(obj, "ResourcePath"); if ((string.IsNullOrEmpty(text) || !IsDisabled(text)) && (string.IsNullOrEmpty(text2) || !IsDisabled(text2))) { list.Add(obj); } } if (list.Count == 0) { return; } MethodInfo method = type.GetMethod("Clear", BindingFlags.Instance | BindingFlags.Public); MethodInfo method2 = type.GetMethod("Add", BindingFlags.Instance | BindingFlags.Public); method?.Invoke(listObj, null); foreach (object item in list) { method2?.Invoke(listObj, new object[1] { item }); } } private static bool IsDisabled(string key) { ModuleBrowser instance = ModuleBrowser.Instance; if ((Object)(object)instance == (Object)null) { return false; } return ((object)instance).GetType().GetField("_disabled", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(instance) is IEnumerable source && source.Cast<string>().Contains<string>(key, StringComparer.OrdinalIgnoreCase); } private static string TryGetString(object target, string memberName) { if (target == null || string.IsNullOrEmpty(memberName)) { return null; } Type type = target.GetType(); try { PropertyInfo property = type.GetProperty(memberName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (property != null) { return property.GetValue(target, null)?.ToString(); } } catch { } try { FieldInfo field = type.GetField(memberName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { return field.GetValue(target)?.ToString(); } } catch { } return null; } } [HarmonyPatch] internal static class Patch_CameraAim_Update { private static MethodBase TargetMethod() { return ModuleBrowser.FindTypeBySimpleName("CameraAim")?.GetMethod("Update", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) ?? null; } private static bool Prefix() { return !ModuleBrowser.UIActive; } } [HarmonyPatch(typeof(CursorManager))] internal static class Patch_CursorManager_Unlock { private static MethodBase TargetMethod() { return AccessTools.Method(typeof(CursorManager), "Unlock", (Type[])null, (Type[])null); } private static void Postfix() { if (ModuleBrowser.UIActive) { Cursor.lockState = (CursorLockMode)0; Cursor.visible = true; } } } }