Decompiled source of ImprovedClock v1.3.0

ImprovedClock.dll

Decompiled 3 days ago
#define DEBUG
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
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 ImprovedClock.Dependencies;
using LobbyCompatibility.Enums;
using LobbyCompatibility.Features;
using Microsoft.CodeAnalysis;
using MonoMod.Utils;
using TMPro;
using UnityEngine;
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: IgnoresAccessChecksTo("AmazingAssets.TerrainToMesh")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: IgnoresAccessChecksTo("ClientNetworkTransform")]
[assembly: IgnoresAccessChecksTo("DissonanceVoip")]
[assembly: IgnoresAccessChecksTo("Facepunch Transport for Netcode for GameObjects")]
[assembly: IgnoresAccessChecksTo("Facepunch.Steamworks.Win64")]
[assembly: IgnoresAccessChecksTo("Unity.AI.Navigation")]
[assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging")]
[assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging.DocCodeExamples")]
[assembly: IgnoresAccessChecksTo("Unity.Burst")]
[assembly: IgnoresAccessChecksTo("Unity.Burst.Unsafe")]
[assembly: IgnoresAccessChecksTo("Unity.Collections")]
[assembly: IgnoresAccessChecksTo("Unity.Collections.LowLevel.ILSupport")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem.ForUI")]
[assembly: IgnoresAccessChecksTo("Unity.Jobs")]
[assembly: IgnoresAccessChecksTo("Unity.Mathematics")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.Common")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.MetricTypes")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStats")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Component")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Configuration")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Implementation")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsReporting")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkProfiler.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkSolutionInterface")]
[assembly: IgnoresAccessChecksTo("Unity.Netcode.Components")]
[assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.Networking.Transport")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Csg")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.KdTree")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Poly2Tri")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Stl")]
[assembly: IgnoresAccessChecksTo("Unity.Profiling.Core")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.ShaderLibrary")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Config.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Authentication")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Analytics")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Configuration")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Device")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments.Internal")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Internal")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Networking")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Registration")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Scheduler")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Telemetry")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Threading")]
[assembly: IgnoresAccessChecksTo("Unity.Services.QoS")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Relay")]
[assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")]
[assembly: IgnoresAccessChecksTo("Unity.Timeline")]
[assembly: IgnoresAccessChecksTo("Unity.VisualEffectGraph.Runtime")]
[assembly: IgnoresAccessChecksTo("UnityEngine.ARModule")]
[assembly: IgnoresAccessChecksTo("UnityEngine.NVIDIAModule")]
[assembly: IgnoresAccessChecksTo("UnityEngine.UI")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("TestAccount666.ImprovedClock")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Your clock, but on steroids!")]
[assembly: AssemblyFileVersion("1.3.0.0")]
[assembly: AssemblyInformationalVersion("1.3.0+c9492439a46aa794840b8e4313afa0221c7d0a0f")]
[assembly: AssemblyProduct("ImprovedClock")]
[assembly: AssemblyTitle("TestAccount666.ImprovedClock")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.3.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 ImprovedClock
{
	public static class ConfigManager
	{
		public static ConfigEntry<bool> enableNormalHumanBeingClock;

		public static ConfigEntry<bool> enableRealtimeClock;

		public static ConfigEntry<bool> showClockInShip;

		public static ConfigEntry<int> clockVisibilityInShip;

		public static ConfigEntry<bool> showClockInFacility;

		public static ConfigEntry<int> clockVisibilityInFacility;

		public static ConfigEntry<bool> showClockInSpectator;

		public static ConfigEntry<int> clockVisibilityInSpectator;

		public static ConfigEntry<int> clockNumberColorRed;

		public static ConfigEntry<int> clockNumberColorGreen;

		public static ConfigEntry<int> clockNumberColorBlue;

		public static ConfigEntry<int> clockBoxColorRed;

		public static ConfigEntry<int> clockBoxColorGreen;

		public static ConfigEntry<int> clockBoxColorBlue;

		public static ConfigEntry<int> clockIconColorRed;

		public static ConfigEntry<int> clockIconColorGreen;

		public static ConfigEntry<int> clockIconColorBlue;

		public static ConfigEntry<int> clockShipLeaveIconColorRed;

		public static ConfigEntry<int> clockShipLeaveIconColorGreen;

		public static ConfigEntry<int> clockShipLeaveIconColorBlue;

		public static ConfigEntry<int> clockSizeMultiplier;

		public static ConfigEntry<bool> useAlternativeDangerIcon;

		public static ConfigEntry<string> disabledClockMoons;

		public static void Initialize(ConfigFile configFile)
		{
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Expected O, but got Unknown
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Expected O, but got Unknown
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Expected O, but got Unknown
			//IL_0135: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Expected O, but got Unknown
			//IL_0184: Unknown result type (might be due to invalid IL or missing references)
			//IL_018e: Expected O, but got Unknown
			//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bf: Expected O, but got Unknown
			//IL_01e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ef: Expected O, but got Unknown
			//IL_0219: Unknown result type (might be due to invalid IL or missing references)
			//IL_0223: Expected O, but got Unknown
			//IL_024a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0254: Expected O, but got Unknown
			//IL_027a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0284: Expected O, but got Unknown
			//IL_02ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b8: Expected O, but got Unknown
			//IL_02df: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e9: Expected O, but got Unknown
			//IL_030f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0319: Expected O, but got Unknown
			//IL_0343: Unknown result type (might be due to invalid IL or missing references)
			//IL_034d: Expected O, but got Unknown
			//IL_0374: Unknown result type (might be due to invalid IL or missing references)
			//IL_037e: Expected O, but got Unknown
			//IL_03a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ae: Expected O, but got Unknown
			enableNormalHumanBeingClock = configFile.Bind<bool>("General", "Enable 24 hour clock", true, "If true, will make the clock display 24 hour time instead of 12 hour time.");
			enableRealtimeClock = configFile.Bind<bool>("General", "Enable realtime clock", true, "If true, will make the clock update instantly.");
			showClockInShip = configFile.Bind<bool>("Visibility", "Show clock in ship", true, "If true, will show the click in the ship too.");
			clockVisibilityInShip = configFile.Bind<int>("Visibility", "Clock visibility in ship", 100, new ConfigDescription("The visibility percentage to use for clock visibility in ship.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>()));
			showClockInFacility = configFile.Bind<bool>("Visibility", "Show clock in facility", false, "If true, will show the click in the facility too.");
			clockVisibilityInFacility = configFile.Bind<int>("Visibility", "Clock visibility in facility", 100, new ConfigDescription("The visibility percentage to use for clock visibility in facility.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>()));
			showClockInSpectator = configFile.Bind<bool>("Visibility", "Show clock in spectator", true, "If true, will show the click in the spectator too.");
			clockVisibilityInSpectator = configFile.Bind<int>("Visibility", "Clock visibility in spectator", 100, new ConfigDescription("The visibility percentage to use for clock visibility in spectator.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>()));
			clockSizeMultiplier = configFile.Bind<int>("Clock Customization", "Clock Size Percentage", 100, new ConfigDescription("A multiplier applied to the clock's size.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(50, 200), Array.Empty<object>()));
			useAlternativeDangerIcon = configFile.Bind<bool>("Clock Customization", "Use Alternative Danger Icon", false, "If true, will use an alternative danger icon.");
			clockNumberColorRed = configFile.Bind<int>("Number Customization", "Color Red", 255, new ConfigDescription("Defines how much red is in the clock numbers' color", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 255), Array.Empty<object>()));
			clockNumberColorGreen = configFile.Bind<int>("Number Customization", "Color Green", 76, new ConfigDescription("Defines how much green is in the clock numbers' color", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 255), Array.Empty<object>()));
			clockNumberColorBlue = configFile.Bind<int>("Number Customization", "Color Blue", 0, new ConfigDescription("Defines how much blue is in the clock numbers' color", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 255), Array.Empty<object>()));
			clockBoxColorRed = configFile.Bind<int>("Box Customization", "Color Red", 255, new ConfigDescription("Defines how much red is in the clock box's color", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 255), Array.Empty<object>()));
			clockBoxColorGreen = configFile.Bind<int>("Box Customization", "Color Green", 76, new ConfigDescription("Defines how much green is in the clock box's color", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 255), Array.Empty<object>()));
			clockBoxColorBlue = configFile.Bind<int>("Box Customization", "Color Blue", 0, new ConfigDescription("Defines how much blue is in the clock box's color", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 255), Array.Empty<object>()));
			clockIconColorRed = configFile.Bind<int>("Icon Customization", "Color Red", 255, new ConfigDescription("Defines how much red is in the clock icon's color", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 255), Array.Empty<object>()));
			clockIconColorGreen = configFile.Bind<int>("Icon Customization", "Color Green", 76, new ConfigDescription("Defines how much green is in the clock icon's color", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 255), Array.Empty<object>()));
			clockIconColorBlue = configFile.Bind<int>("Icon Customization", "Color Blue", 0, new ConfigDescription("Defines how much blue is in the clock icon's color", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 255), Array.Empty<object>()));
			clockShipLeaveIconColorRed = configFile.Bind<int>("Ship Leave Icon Customization", "Color Red", 255, new ConfigDescription("Defines how much red is in the clock ship leave icon's color", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 255), Array.Empty<object>()));
			clockShipLeaveIconColorGreen = configFile.Bind<int>("Ship Leave Icon Customization", "Color Green", 76, new ConfigDescription("Defines how much green is in the clock ship leave icon's color", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 255), Array.Empty<object>()));
			clockShipLeaveIconColorBlue = configFile.Bind<int>("Ship Leave Icon Customization", "Color Blue", 0, new ConfigDescription("Defines how much blue is in the clock ship leave icon's color", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 255), Array.Empty<object>()));
			disabledClockMoons = configFile.Bind<string>("Special Cases", "Disabled Clock Moons", "Example1, Example2", "A comma-separated list of moons where the clock is disabled (Does *NOT* affect spectator clock.) Uses `contains`, so only names are required. For example, `Roid` will disable clock on Asteroid-13 and Asteroid-14.");
		}
	}
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("TestAccount666.ImprovedClock", "ImprovedClock", "1.3.0")]
	public class ImprovedClock : BaseUnityPlugin
	{
		public static SpectatorClock? spectatorClock;

		public static GameObject spectatorClockPrefab = null;

		public static Sprite skullAlternativeSprite = null;

		public static Sprite skullSprite = null;

		public static readonly HashSet<SelectableLevel> ClockDisabledLevels = new HashSet<SelectableLevel>();

		public static ImprovedClock Instance { get; private set; } = null;


		internal static ManualLogSource Logger { get; private set; } = null;


		internal static Harmony? Harmony { get; set; }

		internal static void Patch()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Expected O, but got Unknown
			if (Harmony == null)
			{
				Harmony = new Harmony("TestAccount666.ImprovedClock");
			}
			Logger.LogDebug((object)"Patching...");
			Harmony.PatchAll();
			Logger.LogDebug((object)"Finished patching!");
		}

		private void Awake()
		{
			Logger = ((BaseUnityPlugin)this).Logger;
			Instance = this;
			if (DependencyChecker.IsLobbyCompatibilityInstalled())
			{
				Logger.LogInfo((object)"Found LobbyCompatibility Mod, initializing support :)");
				LobbyCompatibilitySupport.Initialize();
			}
			ConfigManager.Initialize(((BaseUnityPlugin)this).Config);
			LoadAssetBundle();
			Patch();
			ConfigManager.clockNumberColorRed.SettingChanged += delegate
			{
				SetClockColorAndSize();
			};
			ConfigManager.clockNumberColorGreen.SettingChanged += delegate
			{
				SetClockColorAndSize();
			};
			ConfigManager.clockNumberColorBlue.SettingChanged += delegate
			{
				SetClockColorAndSize();
			};
			ConfigManager.clockBoxColorRed.SettingChanged += delegate
			{
				SetClockColorAndSize();
			};
			ConfigManager.clockBoxColorGreen.SettingChanged += delegate
			{
				SetClockColorAndSize();
			};
			ConfigManager.clockBoxColorBlue.SettingChanged += delegate
			{
				SetClockColorAndSize();
			};
			ConfigManager.clockIconColorRed.SettingChanged += delegate
			{
				SetClockColorAndSize();
			};
			ConfigManager.clockIconColorGreen.SettingChanged += delegate
			{
				SetClockColorAndSize();
			};
			ConfigManager.clockIconColorBlue.SettingChanged += delegate
			{
				SetClockColorAndSize();
			};
			ConfigManager.clockShipLeaveIconColorRed.SettingChanged += delegate
			{
				SetClockColorAndSize();
			};
			ConfigManager.clockShipLeaveIconColorGreen.SettingChanged += delegate
			{
				SetClockColorAndSize();
			};
			ConfigManager.clockShipLeaveIconColorBlue.SettingChanged += delegate
			{
				SetClockColorAndSize();
			};
			ConfigManager.clockSizeMultiplier.SettingChanged += delegate
			{
				SetClockColorAndSize();
			};
			ConfigManager.showClockInSpectator.SettingChanged += delegate
			{
				bool clockVisible = ConfigManager.showClockInSpectator.Value && (Object)(object)StartOfRound.Instance != (Object)null && (Object)(object)StartOfRound.Instance.localPlayerController != (Object)null && StartOfRound.Instance.localPlayerController.isPlayerDead;
				spectatorClock?.SetClockVisible(clockVisible);
			};
			ConfigManager.clockVisibilityInSpectator.SettingChanged += delegate
			{
				spectatorClock?.SetClockVisibility();
			};
			ConfigManager.useAlternativeDangerIcon.SettingChanged += delegate
			{
				//IL_0053: Unknown result type (might be due to invalid IL or missing references)
				if (!((Object)(object)HUDManager.Instance == (Object)null))
				{
					Sprite[] clockIcons = HUDManager.Instance.clockIcons;
					bool value = ConfigManager.useAlternativeDangerIcon.Value;
					clockIcons[^1] = (value ? skullAlternativeSprite : skullSprite);
					HUDManager.Instance.clockIcons = clockIcons;
					HUDManager.Instance.SetClockIcon(TimeOfDay.Instance.dayMode);
				}
			};
			Coroutine fetchDisabledMoonsRoutine = null;
			fetchDisabledMoonsRoutine = ((MonoBehaviour)this).StartCoroutine(WaitAndFetchDisabledMoons());
			ConfigManager.disabledClockMoons.SettingChanged += delegate
			{
				if (fetchDisabledMoonsRoutine != null)
				{
					((MonoBehaviour)this).StopCoroutine(fetchDisabledMoonsRoutine);
					fetchDisabledMoonsRoutine = null;
				}
				fetchDisabledMoonsRoutine = ((MonoBehaviour)this).StartCoroutine(WaitAndFetchDisabledMoons());
			};
			Logger.LogInfo((object)"TestAccount666.ImprovedClock v1.3.0 has loaded!");
		}

		private static IEnumerator WaitAndFetchDisabledMoons()
		{
			ClockDisabledLevels.Clear();
			string disabledMoonsString = ConfigManager.disabledClockMoons.Value;
			if (string.IsNullOrWhiteSpace(disabledMoonsString))
			{
				yield break;
			}
			List<string> disabledMoons = disabledMoonsString.Replace(", ", ",").Split(',').ToList();
			if (disabledMoons.Count <= 0)
			{
				yield break;
			}
			yield return (object)new WaitUntil((Func<bool>)(() => (Object)(object)StartOfRound.Instance != (Object)null && Object.op_Implicit((Object)(object)StartOfRound.Instance)));
			yield return (object)new WaitUntil((Func<bool>)(() => (Object)(object)StartOfRound.Instance.localPlayerController != (Object)null));
			SelectableLevel[] levels = StartOfRound.Instance.levels;
			foreach (SelectableLevel selectableLevel in levels)
			{
				string levelName = selectableLevel.PlanetName;
				foreach (string item in disabledMoons.Where((string disabledMoon) => levelName.ToLower().Contains(disabledMoon.ToLower())))
				{
					_ = item;
					ClockDisabledLevels.Add(selectableLevel);
				}
			}
		}

		private static void LoadAssetBundle()
		{
			Assembly executingAssembly = Assembly.GetExecutingAssembly();
			string directoryName = Path.GetDirectoryName(executingAssembly.Location);
			Debug.Assert(directoryName != null, "assemblyDirectory != null");
			AssetBundle val = AssetBundle.LoadFromFile(Path.Combine(directoryName, "improvedclock"));
			spectatorClockPrefab = val.LoadAsset<GameObject>("Assets/LethalCompany/Mods/ImprovedClock/SpectatorClock.prefab");
			Object.DontDestroyOnLoad((Object)(object)spectatorClockPrefab);
			skullAlternativeSprite = val.LoadAsset<Sprite>("Assets/LethalCompany/Mods/ImprovedClock/SkullAlternative.png");
		}

		internal static void Unpatch()
		{
			Logger.LogDebug((object)"Unpatching...");
			Harmony? harmony = Harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
			Logger.LogDebug((object)"Finished unpatching!");
		}

		public static void SetClockColorAndSize()
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: 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_014f: Unknown result type (might be due to invalid IL or missing references)
			//IL_016f: Unknown result type (might be due to invalid IL or missing references)
			//IL_017d: 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_01a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01de: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_0200: Unknown result type (might be due to invalid IL or missing references)
			//IL_0216: Unknown result type (might be due to invalid IL or missing references)
			//IL_0227: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)HUDManager.Instance == (Object)null))
			{
				Vector3 val = default(Vector3);
				((Vector3)(ref val))..ctor(-0.5893304f, 0.5893304f, 0.5893303f);
				val *= (float)ConfigManager.clockSizeMultiplier.Value / 100f;
				Color color = default(Color);
				((Color)(ref color))..ctor(0.003921569f * (float)ConfigManager.clockNumberColorRed.Value, 0.003921569f * (float)ConfigManager.clockNumberColorGreen.Value, 0.003921569f * (float)ConfigManager.clockNumberColorBlue.Value, 1f);
				Color color2 = default(Color);
				((Color)(ref color2))..ctor(0.003921569f * (float)ConfigManager.clockBoxColorRed.Value, 0.003921569f * (float)ConfigManager.clockBoxColorGreen.Value, 0.003921569f * (float)ConfigManager.clockBoxColorBlue.Value, 1f);
				Color color3 = default(Color);
				((Color)(ref color3))..ctor(0.003921569f * (float)ConfigManager.clockIconColorRed.Value, 0.003921569f * (float)ConfigManager.clockIconColorGreen.Value, 0.003921569f * (float)ConfigManager.clockIconColorBlue.Value, 1f);
				Color color4 = default(Color);
				((Color)(ref color4))..ctor(0.003921569f * (float)ConfigManager.clockShipLeaveIconColorRed.Value, 0.003921569f * (float)ConfigManager.clockShipLeaveIconColorGreen.Value, 0.003921569f * (float)ConfigManager.clockShipLeaveIconColorBlue.Value, 1f);
				TextMeshProUGUI clockNumber = HUDManager.Instance.clockNumber;
				((Graphic)clockNumber).color = color;
				Transform parent = ((TMP_Text)clockNumber).transform.parent;
				Image component = ((Component)parent).GetComponent<Image>();
				((Graphic)component).color = color2;
				((Component)parent).transform.localScale = val;
				Image clockIcon = HUDManager.Instance.clockIcon;
				((Graphic)clockIcon).color = color3;
				Image shipLeavingEarlyIcon = HUDManager.Instance.shipLeavingEarlyIcon;
				((Graphic)shipLeavingEarlyIcon).color = color4;
				if (!((Object)(object)spectatorClock == (Object)null) && Object.op_Implicit((Object)(object)spectatorClock))
				{
					((Graphic)spectatorClock.clockNumber).color = color;
					((Graphic)spectatorClock.clockIcon).color = color3;
					((Graphic)spectatorClock.clockBox).color = color2;
					((Component)spectatorClock.clockBox).transform.localScale = val;
					((Graphic)spectatorClock.shipLeaveIcon).color = color4;
				}
			}
		}
	}
	public class SpectatorClock : MonoBehaviour
	{
		public CanvasGroup canvasGroup;

		public TextMeshProUGUI clockNumber;

		public Image clockIcon;

		public Image clockBox;

		public Image shipLeaveIcon;

		private void Start()
		{
			SetClock();
			ImprovedClock.SetClockColorAndSize();
			SetClockVisibility();
		}

		public void SetClockVisibility()
		{
			canvasGroup.alpha = ConfigManager.clockVisibilityInSpectator.Value;
		}

		public void SetShipLeaveIconVisible(bool visible)
		{
			((Behaviour)shipLeaveIcon).enabled = visible && ((Behaviour)canvasGroup).enabled;
		}

		public void SetClock()
		{
			((TMP_Text)clockNumber).text = ((TMP_Text)HUDManager.Instance.clockNumber).text;
			clockIcon.sprite = HUDManager.Instance.clockIcon.sprite;
		}

		public void SetClockVisible(bool visible)
		{
			ImprovedClock.Logger.LogDebug((object)$"Toggling SpectatorClock visibility! Visible? {visible}");
			canvasGroup.alpha = (visible ? ((float)ConfigManager.clockVisibilityInSpectator.Value) : 0f);
			((Behaviour)canvasGroup).enabled = visible;
			((Behaviour)clockNumber).enabled = visible;
			((Behaviour)clockIcon).enabled = visible;
			((Behaviour)clockBox).enabled = visible;
			SetShipLeaveIconVisible(visible && TimeOfDay.Instance.shipLeavingAlertCalled);
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "TestAccount666.ImprovedClock";

		public const string PLUGIN_NAME = "ImprovedClock";

		public const string PLUGIN_VERSION = "1.3.0";
	}
}
namespace ImprovedClock.Patches
{
	[HarmonyPatch(typeof(HUDManager))]
	public static class HUDManagerPatch
	{
		public static bool skipAlphaCheck;

		[HarmonyPatch("OnEnable")]
		[HarmonyPostfix]
		private static void SetClockColor()
		{
			ImprovedClock.SetClockColorAndSize();
			Sprite[] clockIcons = HUDManager.Instance.clockIcons;
			ImprovedClock.skullSprite = clockIcons[^1];
			if (ConfigManager.useAlternativeDangerIcon.Value)
			{
				clockIcons[^1] = ImprovedClock.skullAlternativeSprite;
				HUDManager.Instance.clockIcons = clockIcons;
			}
		}

		[HarmonyPatch("SetClock")]
		[HarmonyPrefix]
		private static bool SetNormalHumanBeingClock(float timeNormalized, float numberOfHours, bool createNewLine, ref string __result)
		{
			if (!ConfigManager.enableNormalHumanBeingClock.Value)
			{
				ImprovedClock.spectatorClock?.SetClock();
				return true;
			}
			HUDManager instance = HUDManager.Instance;
			int num = (int)((double)timeNormalized * (60.0 * (double)numberOfHours)) + 360;
			int num2 = (int)Mathf.Floor((float)num / 60f);
			instance.newLine = (createNewLine ? "\n" : " ");
			instance.amPM = "12:00" + instance.newLine + "AM";
			if (num2 >= 24)
			{
				((TMP_Text)instance.clockNumber).text = "24:00 " + instance.newLine;
				__result = "24:00\n";
				ImprovedClock.spectatorClock?.SetClock();
				return false;
			}
			instance.amPM = ((num2 >= 12) ? (instance.newLine + "PM") : (instance.newLine + "AM"));
			int num3 = num % 60;
			string text = $"{num2:00}:{num3:00}";
			((TMP_Text)instance.clockNumber).text = text;
			__result = text;
			ImprovedClock.spectatorClock?.SetClock();
			return false;
		}

		[HarmonyPatch("SetClockVisible")]
		[HarmonyPrefix]
		private static void SetClockVisible(ref bool visible)
		{
			SelectableLevel currentLevel = StartOfRound.Instance.currentLevel;
			if (ImprovedClock.ClockDisabledLevels.Contains(currentLevel))
			{
				visible = false;
				return;
			}
			PlayerControllerB localPlayerController = StartOfRound.Instance.localPlayerController;
			if (localPlayerController.inTerminalMenu)
			{
				visible = false;
			}
			else if (visible)
			{
				skipAlphaCheck = true;
			}
			else if ((ConfigManager.showClockInShip.Value || !localPlayerController.isInHangarShipRoom) && (ConfigManager.showClockInFacility.Value || !localPlayerController.isInsideFactory))
			{
				visible = true;
			}
		}

		[HarmonyPatch("SetClockVisible")]
		[HarmonyTranspiler]
		private static IEnumerable<CodeInstruction> ModifyTargetAlpha(IEnumerable<CodeInstruction> instructions)
		{
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Expected O, but got Unknown
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Expected O, but got Unknown
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Expected O, but got Unknown
			List<CodeInstruction> list = instructions.ToList();
			try
			{
				List<CodeInstruction> list2 = list;
				List<CodeInstruction> list3 = new List<CodeInstruction>(list2.Count);
				list3.AddRange(list2);
				List<CodeInstruction> list4 = list3;
				for (int i = 0; i < list4.Count; i++)
				{
					CodeInstruction val = list4[i];
					if (!(val.opcode != OpCodes.Ldc_R4))
					{
						ImprovedClock.Logger.LogInfo((object)"Successfully found correct instruction!");
						list4[i] = new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(HUDManagerPatch), "GetTargetAlpha", (Type[])null, (Type[])null));
						list4.Insert(i + 1, new CodeInstruction(OpCodes.Stloc_0, (object)null));
						list4.Insert(i + 1, new CodeInstruction(OpCodes.Ldloc_0, (object)null));
						break;
					}
				}
				return list4;
			}
			catch (Exception ex)
			{
				Extensions.LogDetailed(ex, (string)null);
				return list;
			}
		}

		public static float GetTargetAlpha()
		{
			if (skipAlphaCheck)
			{
				skipAlphaCheck = false;
				return 1f;
			}
			PlayerControllerB localPlayerController = StartOfRound.Instance.localPlayerController;
			if (localPlayerController.isInsideFactory)
			{
				return (float)ConfigManager.clockVisibilityInFacility.Value / 100f;
			}
			return localPlayerController.isInHangarShipRoom ? ((float)ConfigManager.clockVisibilityInShip.Value / 100f) : 1f;
		}

		[HarmonyPatch("RemoveSpectateUI")]
		[HarmonyPostfix]
		private static void DisableSpectatorClock()
		{
			if ((Object)(object)ImprovedClock.spectatorClock == (Object)null)
			{
				ImprovedClock.Logger.LogError((object)"Couldn't find SpectatorClock!");
				return;
			}
			ImprovedClock.spectatorClock.SetClockVisible(visible: false);
			ImprovedClock.spectatorClock?.SetShipLeaveIconVisible(visible: false);
		}
	}
	[HarmonyPatch(typeof(PlayerControllerB))]
	public static class PlayerControllerPatch
	{
		[HarmonyPatch("Start")]
		[HarmonyPostfix]
		private static void CreateSpectatorClock(PlayerControllerB __instance)
		{
			((MonoBehaviour)__instance).StartCoroutine(WaitAndCreateSpectatorClock(__instance));
		}

		[HarmonyPatch("KillPlayer")]
		[HarmonyPrefix]
		private static void EnableSpectatorClock(PlayerControllerB __instance)
		{
			if (!ConfigManager.showClockInSpectator.Value || !StartOfRound.Instance.currentLevel.planetHasTime)
			{
				return;
			}
			PlayerControllerB localPlayerController = StartOfRound.Instance.localPlayerController;
			if (!((Object)(object)localPlayerController != (Object)(object)__instance))
			{
				if ((Object)(object)ImprovedClock.spectatorClock == (Object)null)
				{
					ImprovedClock.Logger.LogError((object)"Couldn't find SpectatorClock!");
				}
				else
				{
					ImprovedClock.spectatorClock.SetClockVisible(visible: true);
				}
			}
		}

		public static IEnumerator WaitAndCreateSpectatorClock(PlayerControllerB playerControllerB)
		{
			yield return (object)new WaitUntil((Func<bool>)(() => (Object)(object)StartOfRound.Instance != (Object)null && Object.op_Implicit((Object)(object)StartOfRound.Instance)));
			yield return (object)new WaitUntil((Func<bool>)(() => (Object)(object)StartOfRound.Instance.localPlayerController != (Object)null && Object.op_Implicit((Object)(object)StartOfRound.Instance.localPlayerController)));
			if ((Object)(object)StartOfRound.Instance.localPlayerController != (Object)(object)playerControllerB)
			{
				ImprovedClock.Logger.LogDebug((object)"Not local player!");
				yield break;
			}
			yield return (object)new WaitUntil((Func<bool>)(() => (Object)(object)HUDManager.Instance != (Object)null && Object.op_Implicit((Object)(object)HUDManager.Instance)));
			yield return (object)new WaitUntil((Func<bool>)(() => HUDManager.Instance.Clock != null));
			Transform canvasPanel = ((Component)HUDManager.Instance.Clock.canvasGroup).transform.parent.parent;
			GameObject spectatorClockObject = Object.Instantiate<GameObject>(ImprovedClock.spectatorClockPrefab, canvasPanel);
			spectatorClockObject.transform.SetSiblingIndex(1);
			ImprovedClock.spectatorClock = spectatorClockObject.GetComponent<SpectatorClock>();
			Object.DontDestroyOnLoad((Object)(object)ImprovedClock.spectatorClock);
			ImprovedClock.Logger.LogDebug((object)"Clock created!");
			ImprovedClock.spectatorClock.SetClockVisible(visible: false);
			ImprovedClock.spectatorClock?.SetShipLeaveIconVisible(visible: false);
		}
	}
	[HarmonyPatch(typeof(StartOfRound))]
	public static class StartOfRoundPatch
	{
		[HarmonyPatch(/*Could not decode attribute arguments.*/)]
		[HarmonyPrefix]
		private static void DisableSpectatorClock()
		{
			if ((Object)(object)ImprovedClock.spectatorClock == (Object)null)
			{
				ImprovedClock.Logger.LogError((object)"Couldn't find SpectatorClock!");
				return;
			}
			ImprovedClock.spectatorClock.SetClockVisible(visible: false);
			ImprovedClock.spectatorClock?.SetShipLeaveIconVisible(visible: false);
		}
	}
	[HarmonyPatch(typeof(TimeOfDay))]
	public static class TimeOfDayPatch
	{
		[HarmonyPatch("MoveTimeOfDay")]
		[HarmonyPrefix]
		private static void SetHudTimeRefresh()
		{
			if (ConfigManager.enableRealtimeClock.Value)
			{
				TimeOfDay.Instance.changeHUDTimeInterval = 4f;
			}
		}

		[HarmonyPatch("SetShipLeaveEarlyClientRpc")]
		[HarmonyPrefix]
		private static void SetShipLeaveIconVisibility()
		{
			ShipLeaving();
		}

		[HarmonyPatch("TimeOfDayEvents")]
		[HarmonyTranspiler]
		private static IEnumerable<CodeInstruction> ListenForShipLeave(IEnumerable<CodeInstruction> instructions)
		{
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Expected O, but got Unknown
			List<CodeInstruction> list = instructions.ToList();
			try
			{
				List<CodeInstruction> list2 = list;
				List<CodeInstruction> list3 = new List<CodeInstruction>(list2.Count);
				list3.AddRange(list2);
				List<CodeInstruction> list4 = list3;
				for (int i = 0; i < list4.Count; i++)
				{
					CodeInstruction val = list4[i];
					if (!(val.opcode != OpCodes.Stfld) && val.operand is FieldInfo fieldInfo && !(fieldInfo.FieldType != typeof(bool)) && fieldInfo.Name.Contains("shipLeavingAlertCalled"))
					{
						list4.Insert(i + 1, new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(TimeOfDayPatch), "ShipLeaving", (Type[])null, (Type[])null)));
						ImprovedClock.Logger.LogInfo((object)"Found ship leaving alert instruction!");
						break;
					}
				}
				return list4;
			}
			catch (Exception ex)
			{
				Extensions.LogDetailed(ex, (string)null);
				return list;
			}
		}

		public static void ShipLeaving()
		{
			ImprovedClock.spectatorClock?.SetShipLeaveIconVisible(visible: true);
		}
	}
}
namespace ImprovedClock.Dependencies
{
	internal static class DependencyChecker
	{
		internal static bool IsLobbyCompatibilityInstalled()
		{
			return Chainloader.PluginInfos.Values.Any((PluginInfo metadata) => metadata.Metadata.GUID.Contains("LobbyCompatibility"));
		}
	}
	internal static class LobbyCompatibilitySupport
	{
		internal static void Initialize()
		{
			PluginHelper.RegisterPlugin("TestAccount666.ImprovedClock", new Version("1.3.0"), (CompatibilityLevel)0, (VersionStrictness)2);
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}