using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Core.Logging.Interpolation; using BepInEx.Logging; using BepInEx.Unity.IL2CPP; using HarmonyLib; using Il2CppInterop.Runtime.Injection; using Il2CppInterop.Runtime.InteropTypes; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Microsoft.CodeAnalysis; using SmolMods.Core; using UnityEngine; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("smolMods.DarkMenus")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+a3231e664cf7d257a8601fb862a89ade69b41d83")] [assembly: AssemblyProduct("smolMods.DarkMenus")] [assembly: AssemblyTitle("smolMods.DarkMenus")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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 SmolMods.DarkMenus { internal static class MenuTheme { private static readonly Color DarkPaper = new Color(0.11f, 0.11f, 0.13f); private static readonly Color LightInk = new Color(0.93f, 0.93f, 0.9f); private static readonly Dictionary Known = new Dictionary(); private static readonly List Panels = new List(); private static Transform _mainMenuPanel; private static GameObject _backdrop; private static readonly Dictionary OwnershipSkip = new Dictionary(); private static int _colorRootsVersion = -1; private const float DarkPaperAlpha = 0.31f; private static readonly Vector3[] CornerBuffer = (Vector3[])(object)new Vector3[4]; internal static void TrackMenu(Transform menuTransform) { AddPanel(PanelRootOf(menuTransform)); } private static void AddPanel(Transform panel) { //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Expected O, but got Unknown if ((Object)(object)panel == (Object)null) { return; } for (int num = Panels.Count - 1; num >= 0; num--) { if ((Object)(object)Panels[num] == (Object)null) { Panels.RemoveAt(num); } } foreach (Transform panel2 in Panels) { if ((Object)(object)panel2 == (Object)(object)panel) { return; } } Panels.Add(panel); ManualLogSource logger = Plugin.Logger; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(25, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[theme] tracking panel '"); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(((Object)panel).name); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("'"); } logger.LogInfo(val); } private static void TrackMainMenu() { //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Expected O, but got Unknown try { if ((Object)(object)_mainMenuPanel != (Object)null) { return; } MainMenuManager val = null; try { val = MainMenuManager.instance; } catch { } if ((Object)(object)val == (Object)null) { return; } Transform val2 = null; try { if ((Object)(object)val.titleMenu != (Object)null) { val2 = ((Component)val.titleMenu).transform; } } catch { } if ((Object)(object)val2 == (Object)null) { try { if ((Object)(object)val.settingsMenu != (Object)null) { val2 = ((Component)val.settingsMenu).transform; } } catch { } } if (!((Object)(object)val2 == (Object)null)) { Canvas componentInParent = ((Component)val2).GetComponentInParent(); if (!((Object)(object)componentInParent == (Object)null)) { AddPanel(_mainMenuPanel = (((Object)(object)componentInParent.rootCanvas != (Object)null) ? ((Component)componentInParent.rootCanvas).transform : ((Component)componentInParent).transform)); } } } catch (Exception ex) { ManualLogSource logger = Plugin.Logger; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val3 = new BepInExWarningLogInterpolatedStringHandler(30, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("[theme] TrackMainMenu failed: "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(ex.Message); } logger.LogWarning(val3); } } private static void EnsureBackdrop(bool enabled) { //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Expected O, but got Unknown //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Expected O, but got Unknown try { if ((Object)(object)_mainMenuPanel == (Object)null) { _backdrop = null; return; } if (!enabled) { if ((Object)(object)_backdrop != (Object)null && _backdrop.activeSelf) { _backdrop.SetActive(false); } return; } if ((Object)(object)_backdrop == (Object)null) { GameObject val = new GameObject("BigDarkMenusBackdrop"); val.transform.SetParent(_mainMenuPanel, false); RectTransform obj = val.AddComponent(); obj.anchorMin = Vector2.zero; obj.anchorMax = Vector2.one; obj.offsetMin = Vector2.zero; obj.offsetMax = Vector2.zero; Image obj2 = val.AddComponent(); ((Graphic)obj2).color = new Color(DarkPaper.r, DarkPaper.g, DarkPaper.b, 1f); ((Graphic)obj2).raycastTarget = false; _backdrop = val; Plugin.Logger.LogInfo((object)"[theme] main menu backdrop created"); } if (_backdrop.transform.GetSiblingIndex() != 0) { _backdrop.transform.SetSiblingIndex(0); } if (!_backdrop.activeSelf) { _backdrop.SetActive(true); } } catch (Exception ex) { ManualLogSource logger = Plugin.Logger; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(25, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("[theme] backdrop failed: "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(ex.Message); } logger.LogWarning(val2); _backdrop = null; } } private static Transform PanelRootOf(Transform t) { if ((Object)(object)t == (Object)null) { return null; } Canvas componentInParent = ((Component)t).GetComponentInParent(); if ((Object)(object)componentInParent == (Object)null) { return t; } Transform val = (((Object)(object)componentInParent.rootCanvas != (Object)null) ? ((Component)componentInParent.rootCanvas).transform : ((Component)componentInParent).transform); Transform val2 = t; while ((Object)(object)val2.parent != (Object)null && (Object)(object)val2.parent != (Object)(object)val) { val2 = val2.parent; } return val2; } internal static void Apply(bool enabled, bool force = true) { //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Expected O, but got Unknown TrackMainMenu(); EnsureBackdrop(enabled); if (!enabled) { if (Known.Count > 0) { RestoreForgotten(); Known.Clear(); } return; } bool flag = default(bool); for (int num = Panels.Count - 1; num >= 0; num--) { Transform val = Panels[num]; if ((Object)(object)val == (Object)null) { Panels.RemoveAt(num); } else { try { if (force || ((Component)val).gameObject.activeInHierarchy) { ApplyToPanel(val, enabled); } } catch (Exception ex) { ManualLogSource logger = Plugin.Logger; BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(27, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("[theme] panel pass failed: "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(ex.Message); } logger.LogWarning(val2); } } } } internal static bool IsInTrackedPanel(Transform t) { if ((Object)(object)t == (Object)null) { return false; } foreach (Transform panel in Panels) { if (!((Object)(object)panel == (Object)null) && ((Object)(object)t == (Object)(object)panel || t.IsChildOf(panel))) { return true; } } return false; } internal static void ApplyToSubtree(Transform root, bool enabled) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown if ((Object)(object)root == (Object)null) { return; } try { ApplyToPanel(root, enabled); } catch (Exception ex) { ManualLogSource logger = Plugin.Logger; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(29, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[theme] subtree pass failed: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } logger.LogWarning(val); } } private static void ApplyToPanel(Transform panel, bool enabled) { //IL_0116: 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_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_012b: 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) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_0148: 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_0163: 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_0186: Unknown result type (might be due to invalid IL or missing references) //IL_018b: Unknown result type (might be due to invalid IL or missing references) //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Unknown result type (might be due to invalid IL or missing references) bool isMainMenu = (Object)(object)_mainMenuPanel != (Object)null && (Object)(object)panel == (Object)(object)_mainMenuPanel; if (_colorRootsVersion != ModSettingsApi.ColorRootsVersion) { _colorRootsVersion = ModSettingsApi.ColorRootsVersion; OwnershipSkip.Clear(); } foreach (Graphic componentsInChild in ((Component)panel).GetComponentsInChildren(true)) { if ((Object)(object)componentsInChild == (Object)null) { continue; } int instanceID = ((Object)componentsInChild).GetInstanceID(); if (OwnershipSkip.TryGetValue(instanceID, out var value)) { if (value) { Known.Remove(instanceID); continue; } } else { value = HudTintApi.IsHudOwned(componentsInChild) || ModSettingsApi.IsColorManaged(((Component)componentsInChild).transform); OwnershipSkip[instanceID] = value; if (value) { Known.Remove(instanceID); continue; } } if (Plugin.IsCursorOwned(componentsInChild) || ((Object)(object)_backdrop != (Object)null && ((Object)((Component)componentsInChild).gameObject).GetInstanceID() == ((Object)_backdrop).GetInstanceID())) { continue; } Color val; bool flag; if (Known.TryGetValue(instanceID, out (Graphic, Color) value2)) { val = value2.Item2; flag = true; } else { val = componentsInChild.color; if (Saturation(val) >= 0.32f || val.a < 0.05f) { continue; } if (!IsLogoLettering(componentsInChild)) { val = RecoverOriginal(val); } flag = false; } Color val2 = (enabled ? Invert(val, isMainMenu, componentsInChild) : val); if (flag || !Approximately(val, val2)) { if (!flag) { Known[instanceID] = (componentsInChild, val); } if (!Approximately(componentsInChild.color, val2)) { componentsInChild.color = val2; } } } } private static void RestoreForgotten() { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) List list = new List(); foreach (KeyValuePair item2 in Known) { Graphic item = item2.Value.Item1; if ((Object)(object)item == (Object)null) { list.Add(item2.Key); } else if (!Approximately(item.color, item2.Value.Item2)) { item.color = item2.Value.Item2; } } foreach (int item3 in list) { Known.Remove(item3); } } private static Color RecoverOriginal(Color c) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: 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_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) if (IsThemeColor(c, DarkPaper)) { return new Color(1f, 1f, 1f, c.a); } if (IsThemeColor(c, LightInk)) { return new Color(0.09f, 0.09f, 0.09f, c.a); } return c; } private static bool IsThemeColor(Color c, Color theme) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) if (Mathf.Abs(c.r - theme.r) < 0.02f && Mathf.Abs(c.g - theme.g) < 0.02f) { return Mathf.Abs(c.b - theme.b) < 0.02f; } return false; } private static Color Invert(Color c, bool isMainMenu, Graphic g) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0098: 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_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) if (Luminance(c) > 0.5f) { if (isMainMenu) { if (!CoversMostOfScreen(g)) { return c; } return new Color(DarkPaper.r, DarkPaper.g, DarkPaper.b, c.a); } return new Color(DarkPaper.r, DarkPaper.g, DarkPaper.b, c.a * 0.31f); } return new Color(LightInk.r, LightInk.g, LightInk.b, c.a); } private static bool IsLogoLettering(Graphic g) { try { Image val = ((Il2CppObjectBase)g).TryCast(); return (Object)(object)val != (Object)null && (Object)(object)val.sprite != (Object)null && ((Object)val.sprite).name == "BigWalkLogo"; } catch { return false; } } private static bool CoversMostOfScreen(Graphic g) { try { RectTransform component = ((Component)g).GetComponent(); if ((Object)(object)component == (Object)null) { return false; } component.GetWorldCorners(Il2CppStructArray.op_Implicit(CornerBuffer)); float num = CornerBuffer[2].x - CornerBuffer[0].x; float num2 = CornerBuffer[2].y - CornerBuffer[0].y; return num >= (float)Screen.width * 0.6f && num2 >= (float)Screen.height * 0.6f; } catch { return false; } } private static bool Approximately(Color a, Color b) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) if (Mathf.Abs(a.r - b.r) < 0.004f && Mathf.Abs(a.g - b.g) < 0.004f && Mathf.Abs(a.b - b.b) < 0.004f) { return Mathf.Abs(a.a - b.a) < 0.004f; } return false; } internal static float Luminance(Color c) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) return 0.299f * c.r + 0.587f * c.g + 0.114f * c.b; } internal static float Saturation(Color c) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) float num = Mathf.Max(c.r, Mathf.Max(c.g, c.b)); float num2 = Mathf.Min(c.r, Mathf.Min(c.g, c.b)); if (!(num <= 0.0001f)) { return (num - num2) / num; } return 0f; } } [BepInPlugin("com.smolmods.darkmenus", "smolMods.DarkMenus", "1.0.2")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BasePlugin { public const string PluginGuid = "com.smolmods.darkmenus"; public const string PluginName = "smolMods.DarkMenus"; public const string PluginVersion = "1.0.2"; private const string HudClaimId = "darkmenus.icons"; internal static ManualLogSource Logger; internal static ModRowDef MenuRow; internal static ModRowDef HudDarkRow; private static bool _flipping; private static readonly Dictionary CursorGraphics = new Dictionary(); private static readonly List CursorShadows = new List(); private static NmouseObject[] _nmice; internal static bool MenusEnabled { get { if (MenuRow != null) { return MenuRow.Value == 1; } return false; } } public override void Load() { //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Expected O, but got Unknown //IL_012e: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Expected O, but got Unknown //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Expected O, but got Unknown Logger = ((BasePlugin)this).Log; MenuRow = ModSettingsApi.AddArrayRow(400, "Dark menus", "settings_mod_darkMenus", 1, new int[2] { 0, 1 }, (Func)((int v) => (v != 1) ? "Off" : "On"), (Action)delegate(int v) { MenuTheme.Apply(v == 1); }, (Func)null); HudDarkRow = ModSettingsApi.AddArrayRow(400, "Dark HUD icons", "settings_mod_darkHud", 0, new int[2] { 0, 1 }, (Func)((int v) => (v != 1) ? "Off" : "On"), (Action)delegate(int v) { if (!_flipping) { if (v == 1) { HudTintApi.Claim("darkmenus.icons", (Func)(() => HudTintApi.DefaultDarkIcon), (Action)OnPreempted); } else { HudTintApi.Release("darkmenus.icons"); } } }, (Func)null); bool flag = default(bool); try { ClassInjector.RegisterTypeInIl2Cpp(); GameObject val = new GameObject("SmolModsDarkMenusTicker"); Object.DontDestroyOnLoad((Object)val); ((Object)val).hideFlags = (HideFlags)61; val.AddComponent(); } catch (Exception ex) { ManualLogSource logger = Logger; BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(26, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Theme ticker unavailable: "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(ex.Message); } logger.LogWarning(val2); } Harmony val3 = new Harmony("com.smolmods.darkmenus"); val3.PatchAll(typeof(Plugin).Assembly); int num = 0; foreach (MethodBase patchedMethod in val3.GetPatchedMethods()) { _ = patchedMethod; num++; } ManualLogSource logger2 = Logger; BepInExInfoLogInterpolatedStringHandler val4 = new BepInExInfoLogInterpolatedStringHandler(27, 3, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val4).AppendFormatted("smolMods.DarkMenus"); ((BepInExLogInterpolatedStringHandler)val4).AppendLiteral(" "); ((BepInExLogInterpolatedStringHandler)val4).AppendFormatted("1.0.2"); ((BepInExLogInterpolatedStringHandler)val4).AppendLiteral(" loaded, "); ((BepInExLogInterpolatedStringHandler)val4).AppendFormatted(num); ((BepInExLogInterpolatedStringHandler)val4).AppendLiteral(" methods patched."); } logger2.LogInfo(val4); } private static void OnPreempted() { _flipping = true; try { HudDarkRow.SetValue(0, true); ModSettingsApi.RefreshRows(); } finally { _flipping = false; } } internal static bool IsCursorOwned(Graphic g) { return CursorGraphics.ContainsKey(((Object)g).GetInstanceID()); } internal static void ApplyCursor(bool enabled) { //IL_0269: Unknown result type (might be due to invalid IL or missing references) //IL_0270: Expected O, but got Unknown //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0213: Unknown result type (might be due to invalid IL or missing references) //IL_0218: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_0226: Unknown result type (might be due to invalid IL or missing references) //IL_01dd: Unknown result type (might be due to invalid IL or missing references) //IL_01f3: Unknown result type (might be due to invalid IL or missing references) try { if (!enabled) { foreach (var value in CursorGraphics.Values) { try { if ((Object)(object)value.g != (Object)null) { value.g.color = value.c; } } catch { } } CursorGraphics.Clear(); foreach (Shadow cursorShadow in CursorShadows) { try { if ((Object)(object)cursorShadow != (Object)null) { ((Behaviour)cursorShadow).enabled = false; } } catch { } } CursorShadows.Clear(); _nmice = null; return; } bool flag = _nmice == null || _nmice.Length == 0; NmouseObject[] nmice; if (!flag) { nmice = _nmice; for (int i = 0; i < nmice.Length; i++) { if ((Object)(object)nmice[i] == (Object)null) { flag = true; break; } } } if (flag) { _nmice = Il2CppArrayBase.op_Implicit(Object.FindObjectsOfType(true)); } nmice = _nmice; foreach (NmouseObject val in nmice) { if ((Object)(object)val == (Object)null) { continue; } GameObject cursor = val.cursor; if ((Object)(object)cursor == (Object)null) { continue; } foreach (Graphic componentsInChild in cursor.GetComponentsInChildren(true)) { int instanceID = ((Object)componentsInChild).GetInstanceID(); if (!CursorGraphics.ContainsKey(instanceID)) { CursorGraphics[instanceID] = (componentsInChild, componentsInChild.color); Shadow val2 = ((Component)componentsInChild).gameObject.GetComponent(); if ((Object)(object)val2 == (Object)null) { val2 = ((Component)componentsInChild).gameObject.AddComponent(); } val2.effectColor = new Color(0f, 0f, 0f, 0.65f); val2.effectDistance = new Vector2(3f, -3f); ((Behaviour)val2).enabled = true; CursorShadows.Add(val2); } if (componentsInChild.color != Color.white) { componentsInChild.color = Color.white; } } } } catch (Exception ex) { ManualLogSource logger = Logger; bool flag2 = default(bool); BepInExWarningLogInterpolatedStringHandler val3 = new BepInExWarningLogInterpolatedStringHandler(24, 1, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("Cursor recolour failed: "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(ex.Message); } logger.LogWarning(val3); } } } public class ThemeTicker : MonoBehaviour { private float _next; public ThemeTicker(IntPtr ptr) : base(ptr) { } private void Update() { if (Time.unscaledTime < _next) { return; } _next = Time.unscaledTime + 0.2f; try { MenuTheme.Apply(Plugin.MenusEnabled, force: false); } catch { } try { Plugin.ApplyCursor(Plugin.MenusEnabled); } catch { } } } [HarmonyPatch] internal static class MenuPatches { [HarmonyPostfix] [HarmonyPatch(typeof(SettingsMenu), "OnEnable")] private static void SettingsMenu_OnEnable(SettingsMenu __instance) { if (!__instance.isInMainMenu) { MenuTheme.TrackMenu(((Component)__instance).transform); } MenuTheme.Apply(Plugin.MenusEnabled); } [HarmonyPostfix] [HarmonyPatch(typeof(SettingsMenu), "PressCatagoryButton")] private static void SettingsMenu_PressCatagory() { MenuTheme.Apply(Plugin.MenusEnabled); } [HarmonyPostfix] [HarmonyPatch(typeof(SettingsMenu), "SwapToCatagory")] private static void SettingsMenu_SwapCatagory() { MenuTheme.Apply(Plugin.MenusEnabled); } [HarmonyPostfix] [HarmonyPatch(typeof(SettingsRow), "Refresh")] private static void SettingsRow_Refresh(SettingsRow __instance) { if (Plugin.MenusEnabled && MenuTheme.IsInTrackedPanel(((Component)__instance).transform)) { MenuTheme.ApplyToSubtree(((Component)__instance).transform, enabled: true); } } [HarmonyPostfix] [HarmonyPatch(typeof(WorldMenuManager), "OpenMenu")] private static void WorldMenu_OpenMenu(WorldMenuManager __instance) { if ((Object)(object)__instance.settingsMenu != (Object)null) { MenuTheme.TrackMenu(((Component)__instance.settingsMenu).transform); } if ((Object)(object)__instance.pauseMenuForCurrentMode != (Object)null) { MenuTheme.TrackMenu(((Component)__instance.pauseMenuForCurrentMode).transform); } MenuTheme.Apply(Plugin.MenusEnabled); } } }