using System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using JG224.ModCore.API; using JG224.YetAnotherClock.Core; using JG224.YetAnotherClock.UI; using Microsoft.CodeAnalysis; using UnityEngine; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyCompany("YetAnotherClock")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("0.5.0.0")] [assembly: AssemblyInformationalVersion("0.5.0")] [assembly: AssemblyProduct("YetAnotherClock")] [assembly: AssemblyTitle("YetAnotherClock")] [assembly: AssemblyVersion("0.5.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 JG224.YetAnotherClock { [BepInPlugin("jg224.YetAnotherClock", "YetAnotherClock", "0.5.0")] [BepInProcess("valheim.exe")] [BepInDependency("com.jg224.modcore", "0.5.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public sealed class Plugin : BaseUnityPlugin { public const string PluginGuid = "jg224.YetAnotherClock"; public const string PluginName = "YetAnotherClock"; public const string PluginVersion = "0.5.0"; public const string ModCoreGuid = "com.jg224.modcore"; public const string GeneralTweaksGuid = "JG224.GeneralTweaks"; public const int ProtocolVersion = 1; public static readonly ModuleId ModuleId = new ModuleId("yetanotherclock"); private readonly List _registrations = new List(); private bool _active; private bool _shutDown; internal static ManualLogSource Log { get; private set; } internal static YetAnotherClockConfig Settings { get; private set; } internal static ICoreServices Core { get; private set; } private void Awake() { //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) Log = ((BaseUnityPlugin)this).Logger; Settings = YetAnotherClockConfig.Load((BaseUnityPlugin)(object)this, Paths.ConfigPath, ((BaseUnityPlugin)this).Logger); try { if (!ModCoreApi.IsAvailable) { throw new InvalidOperationException("ModCore did not initialize before YetAnotherClock."); } Core = ModCoreApi.Services; RegisterWithCore(); if (TryGetLegacyOwner(out var version)) { string text = "GeneralTweaks " + version?.ToString() + " still contains the clock; YetAnotherClock is paused to prevent duplicate overlays."; Core.Modules.SetState(ModuleId, (ModuleRuntimeState)3, text); ((BaseUnityPlugin)this).Logger.LogWarning((object)(text + " Update GeneralTweaks to 3.0.0 or newer.")); } else { _active = true; Core.Modules.SetState(ModuleId, (ModuleRuntimeState)2, "Client-local clock overlay ready."); Game.isModded = true; ((BaseUnityPlugin)this).Logger.LogInfo((object)("YetAnotherClock 0.5.0 loaded; protocol " + 1 + ".")); } } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogError((object)("YetAnotherClock failed to initialize safely: " + ex)); if (Core != null) { Core.Modules.SetState(ModuleId, (ModuleRuntimeState)5, ex.Message); } Shutdown(); throw; } } private void Update() { if (_active) { OverlayController.Tick(); } } private void OnDestroy() { Shutdown(); } private void RegisterWithCore() { //IL_0029: 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_0040: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Expected O, but got Unknown //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: 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_00e5: Expected O, but got Unknown //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) SemanticVersion val = default(SemanticVersion); if (!SemanticVersion.TryParse("0.5.0", ref val)) { throw new InvalidOperationException("YetAnotherClock has invalid release version metadata."); } _registrations.Add(Core.Modules.Register(new ModuleDescriptor(ModuleId, "jg224.YetAnotherClock", "YetAnotherClock", val, 1, (ModuleSide)1, (ModuleRequirement)1, 0uL, 1, 1))); foreach (IDisposable item in Settings.RegisterMetadata(Core, ModuleId)) { _registrations.Add(item); } _registrations.Add(Core.Namespaces.Register(ModuleId, (NamespaceKind)8, "jg224.yetanotherclock.", 1, Array.Empty())); _registrations.Add(Core.Ui.Reserve(new UiReservation(ModuleId, (UiSurface)6, "top-right.clock", 20, false))); _registrations.Add(Core.Lifecycle.Subscribe(ModuleId, (LifecycleEventKind)9, (Action)delegate { OverlayController.Destroy(); }, 0)); _registrations.Add(Core.Lifecycle.Subscribe(ModuleId, (LifecycleEventKind)3, (Action)delegate { OverlayController.Destroy(); }, 0)); } private static bool TryGetLegacyOwner(out Version version) { version = null; if (!Chainloader.PluginInfos.TryGetValue("JG224.GeneralTweaks", out var value)) { return false; } version = value.Metadata.Version; if (version != null) { return version.CompareTo(new Version(3, 0, 0)) < 0; } return false; } private void Shutdown() { //IL_0088: Unknown result type (might be due to invalid IL or missing references) if (_shutDown) { return; } _shutDown = true; _active = false; OverlayController.Destroy(); for (int num = _registrations.Count - 1; num >= 0; num--) { try { _registrations[num].Dispose(); } catch (Exception ex) { ManualLogSource logger = ((BaseUnityPlugin)this).Logger; if (logger != null) { logger.LogWarning((object)("Registration cleanup failed: " + ex.Message)); } } } _registrations.Clear(); if (Core != null) { Core.Metrics.RemoveOwner(ModuleId); } Core = null; Settings = null; Log = null; } } internal sealed class YetAnotherClockConfig { private readonly ConfigFile _file; private readonly List> _entries = new List>(); internal ConfigEntry Enabled { get; } internal ConfigEntry ShowDay { get; } internal ConfigEntry TwelveHour { get; } internal ConfigEntry ShowWhenHudHidden { get; } internal ConfigEntry RequireMinimap { get; } internal ConfigEntry Scale { get; } internal ConfigEntry AnchorToMinimap { get; } internal ConfigEntry OffsetX { get; } internal ConfigEntry OffsetY { get; } internal ConfigEntry Color { get; } internal ConfigEntry Opacity { get; } internal ConfigEntry DebugLogging { get; } private YetAnotherClockConfig(ConfigFile file) { _file = file; Enabled = Local("Clock", "Enabled", value: true, "Show the in-game 24-hour clock above the minimap."); ShowDay = Local("Clock", "ShowDay", value: true, "Include the current day before the time."); TwelveHour = Local("Clock", "TwelveHour", value: false, "Use 12-hour time with AM/PM instead of 24-hour time."); ShowWhenHudHidden = Local("Clock", "ShowWhenHudHidden", value: false, "Keep the clock visible when the HUD is hidden."); RequireMinimap = Local("Clock", "RequireMinimap", value: false, "Show the clock only while the small minimap is visible."); Scale = LocalRange("Clock", "Scale", 1f, 0.5f, 2f, "Clock display scale."); AnchorToMinimap = Local("Clock", "AnchorToMinimap", value: true, "Center the clock above the small minimap at any resolution, ignoring and disabling manual offsets. Disable to restore your saved position from the screen's top-right edge."); OffsetX = ManualOffset("OffsetX", "Horizontal offset in screen pixels from the screen's top-right edge. Positive moves right. Ignored and greyed out while AnchorToMinimap is enabled; the saved value is kept."); OffsetY = ManualOffset("OffsetY", "Vertical offset in screen pixels from the screen's top-right edge. Positive moves up. Ignored and greyed out while AnchorToMinimap is enabled; the saved value is kept."); Color = Local("Clock", "Color", "#F2E6C9", "Clock HTML color, for example #F2E6C9."); Opacity = LocalRange("Clock", "Opacity", 0.95f, 0f, 1f, "Clock opacity."); DebugLogging = Developer("Diagnostics", "DebugLogging", value: false, "Enable verbose clock diagnostics."); } internal static YetAnotherClockConfig Load(BaseUnityPlugin plugin, string configDirectory, ManualLogSource log) { //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Expected O, but got Unknown //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007a: 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) if (!Directory.Exists(configDirectory)) { Directory.CreateDirectory(configDirectory); } string text = LegacyClockConfigRules.FindImportSource(Directory.GetFiles(configDirectory, "*.cfg", SearchOption.TopDirectoryOnly)); string text2 = Path.Combine(configDirectory, "jg224.YetAnotherClock.cfg"); bool num = File.Exists(text2); if (num) { text = null; } string[] lines = (num ? File.ReadAllLines(text2) : Array.Empty()); bool flag = num && !LegacyClockConfigRules.HasSetting(lines, "Clock", "AnchorToMinimap"); float num2 = -32f; float num3 = -28f; if (flag) { ConfigFile val = new ConfigFile(text2, false) { SaveOnConfigSet = false }; num2 = val.Bind("Clock", "OffsetX", num2, (ConfigDescription)null).Value; num3 = val.Bind("Clock", "OffsetY", num3, (ConfigDescription)null).Value; } ConfigFile val2 = PluginConfigFiles.Attach(plugin, new ConfigFile(text2, false, plugin.Info.Metadata)); bool saveOnConfigSet = val2.SaveOnConfigSet; val2.SaveOnConfigSet = false; YetAnotherClockConfig yetAnotherClockConfig; try { yetAnotherClockConfig = new YetAnotherClockConfig(val2); if (text != null && yetAnotherClockConfig.ImportLegacyGeneralTweaks(text, log)) { yetAnotherClockConfig.MigrateLegacyPosition(yetAnotherClockConfig.OffsetX.Value, yetAnotherClockConfig.OffsetY.Value, log); } else if (flag) { yetAnotherClockConfig.MigrateLegacyPosition(num2, num3, log); } } finally { val2.SaveOnConfigSet = saveOnConfigSet; } val2.Save(); return yetAnotherClockConfig; } internal IEnumerable RegisterMetadata(ICoreServices services, ModuleId owner) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) foreach (Tuple entry2 in _entries) { ConfigEntryBase entry = entry2.Item1; yield return services.Configuration.Register(new ConfigSettingDescriptor(owner, entry.Definition.Section, entry.Definition.Key, entry2.Item2, (Func)(() => Convert.ToString(entry.BoxedValue, CultureInfo.InvariantCulture)), 1)); } } internal static Color ParseColor(string value, float opacity) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) Color result = default(Color); if (!ColorUtility.TryParseHtmlString(value ?? string.Empty, ref result)) { ((Color)(ref result))..ctor(0.95f, 0.9f, 0.79f); } result.a = Mathf.Clamp01(opacity); return result; } private bool ImportLegacyGeneralTweaks(string path, ManualLogSource log) { //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) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0052: 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_0090: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) try { ConfigFile val = new ConfigFile(path, false) { SaveOnConfigSet = false }; bool value = val.Bind("Clock", "Enabled", Enabled.Value, (ConfigDescription)null).Value; bool value2 = val.Bind("Clock", "ShowDay", ShowDay.Value, (ConfigDescription)null).Value; float value3 = val.Bind("Clock", "Scale", Scale.Value, (ConfigDescription)null).Value; float value4 = val.Bind("Clock", "OffsetX", -32f, (ConfigDescription)null).Value; float value5 = val.Bind("Clock", "OffsetY", -28f, (ConfigDescription)null).Value; string value6 = val.Bind("Clock", "Color", Color.Value, (ConfigDescription)null).Value; float value7 = val.Bind("Clock", "Opacity", Opacity.Value, (ConfigDescription)null).Value; Enabled.Value = value; ShowDay.Value = value2; Scale.Value = value3; OffsetX.Value = value4; OffsetY.Value = value5; Color.Value = value6; Opacity.Value = value7; if (log != null) { log.LogInfo((object)("Imported clock settings from " + Path.GetFileName(path) + " into jg224.YetAnotherClock.cfg.")); } return true; } catch (Exception ex) { if (log != null) { log.LogWarning((object)("Could not import clock settings from " + Path.GetFileName(path) + "; the source file was left unchanged. Review jg224.YetAnotherClock.cfg before adjusting your clock. " + ex.Message)); } return false; } } private void MigrateLegacyPosition(float offsetX, float offsetY, ManualLogSource log) { bool flag = ClockLayoutRules.HasLegacyDefaultOffsets(offsetX, offsetY); AnchorToMinimap.Value = flag; OffsetX.Value = (flag ? 0f : offsetX); OffsetY.Value = (flag ? 0f : offsetY); if (log != null) { log.LogInfo((object)(flag ? "Updated the default clock position to center above the minimap. Disable Clock.AnchorToMinimap to use manual offsets." : "Preserved your custom clock position with Clock.AnchorToMinimap=false. Enable it to center above the minimap without changing your saved offsets.")); } } private ConfigEntry ManualOffset(string key, string description) { //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Expected O, but got Unknown return Add(_file.Bind("Clock", key, 0f, new ConfigDescription(description, (AcceptableValueBase)(object)new AcceptableValueRange(-1000f, 1000f), new object[1] { new ConfigurationManagerAttributes { CustomDrawer = new OffsetSettingDrawer(() => AnchorToMinimap.Value).Draw } })), (ConfigScope)1); } private ConfigEntry Local(string section, string key, T value, string description) { return Add(_file.Bind(section, key, value, description), (ConfigScope)1); } private ConfigEntry LocalRange(string section, string key, float value, float min, float max, string description) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown return Add(_file.Bind(section, key, value, new ConfigDescription(description, (AcceptableValueBase)(object)new AcceptableValueRange(min, max), Array.Empty())), (ConfigScope)1); } private ConfigEntry Developer(string section, string key, T value, string description) { return Add(_file.Bind(section, key, value, description), (ConfigScope)5); } private ConfigEntry Add(ConfigEntry entry, ConfigScope scope) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) _entries.Add(Tuple.Create((ConfigEntryBase)(object)entry, scope)); return entry; } } } namespace JG224.YetAnotherClock.UI { internal sealed class ConfigurationManagerAttributes { public Action CustomDrawer; public bool HideDefaultButton = true; } internal sealed class OffsetSettingDrawer { private readonly Func _anchorToMinimap; private string _text; private float _displayedValue = float.NaN; internal OffsetSettingDrawer(Func anchorToMinimap) { _anchorToMinimap = anchorToMinimap; } internal void Draw(ConfigEntryBase setting) { ConfigEntry val = (ConfigEntry)(object)setting; AcceptableValueRange val2 = (AcceptableValueRange)(object)((ConfigEntryBase)val).Description.AcceptableValues; if (_text == null || _displayedValue != val.Value) { RefreshText(val.Value); } bool enabled = GUI.enabled; bool flag = enabled && !_anchorToMinimap(); try { GUI.enabled = flag; float num = GUILayout.HorizontalSlider(val.Value, val2.MinValue, val2.MaxValue, Array.Empty()); string text = GUILayout.TextField(_text, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(85f) }); bool flag2 = GUILayout.Button("Reset", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(55f) }); if (!flag) { return; } if (flag2) { val.Value = (float)((ConfigEntryBase)val).DefaultValue; RefreshText(val.Value); } else if (num != val.Value) { val.Value = num; RefreshText(val.Value); } else { if (!(text != _text)) { return; } _text = text; if (float.TryParse(text, NumberStyles.Float, CultureInfo.InvariantCulture, out var result) && !float.IsNaN(result) && !float.IsInfinity(result)) { val.Value = result; _displayedValue = val.Value; if (val.Value != result) { RefreshText(val.Value); } } } } finally { GUI.enabled = enabled; } } private void RefreshText(float value) { _displayedValue = value; _text = value.ToString(CultureInfo.InvariantCulture); } } internal static class OverlayController { [CompilerGenerated] private static class <>O { public static WillRenderCanvases <0>__UpdateLayout; } private static GameObject _root; private static RectTransform _canvasRect; private static Text _clock; private static Font _font; private static RectTransform _minimapRect; private static Canvas _minimapCanvas; private static int _minutes = -1; private static int _day = -1; private static bool _showDay; private static bool _twelveHour; private static string _color; private static float _opacity = -1f; internal static void Tick() { if (Application.isBatchMode || !Object.op_Implicit((Object)(object)Player.m_localPlayer) || !Object.op_Implicit((Object)(object)ZNet.instance)) { if (Object.op_Implicit((Object)(object)_root)) { _root.SetActive(false); } return; } EnsureCreated(); if (Object.op_Implicit((Object)(object)_root)) { _root.SetActive(true); UpdateClock(); } } internal static void Destroy() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown object obj = <>O.<0>__UpdateLayout; if (obj == null) { WillRenderCanvases val = UpdateLayout; <>O.<0>__UpdateLayout = val; obj = (object)val; } Canvas.preWillRenderCanvases -= (WillRenderCanvases)obj; if (Object.op_Implicit((Object)(object)_root)) { Object.Destroy((Object)(object)_root); } _root = null; _canvasRect = null; _clock = null; _font = null; _minimapRect = null; _minimapCanvas = null; _minutes = (_day = -1); _color = null; _opacity = -1f; } private static void EnsureCreated() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Expected O, but got Unknown //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_015f: 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_0197: Unknown result type (might be due to invalid IL or missing references) //IL_01b1: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01bc: Expected O, but got Unknown //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_01d6: Unknown result type (might be due to invalid IL or missing references) //IL_01dc: Expected O, but got Unknown if (Object.op_Implicit((Object)(object)_root)) { return; } _root = new GameObject("JG224.YetAnotherClock.Overlay"); Object.DontDestroyOnLoad((Object)(object)_root); Canvas obj = _root.AddComponent(); _canvasRect = (RectTransform)((Component)obj).transform; obj.renderMode = (RenderMode)0; obj.sortingOrder = 200; obj.pixelPerfect = false; _root.AddComponent().uiScaleMode = (ScaleMode)0; ((Behaviour)_root.AddComponent()).enabled = false; _font = Resources.GetBuiltinResource("Arial.ttf"); if (!Object.op_Implicit((Object)(object)_font)) { Font[] array = Resources.FindObjectsOfTypeAll(); if (array.Length != 0) { _font = array[0]; } } GameObject val = new GameObject("Clock", new Type[1] { typeof(RectTransform) }); val.transform.SetParent(_root.transform, false); _clock = val.AddComponent(); _clock.font = _font; _clock.fontSize = 18; _clock.fontStyle = (FontStyle)1; _clock.alignment = (TextAnchor)2; _clock.horizontalOverflow = (HorizontalWrapMode)1; _clock.verticalOverflow = (VerticalWrapMode)1; ((Graphic)_clock).raycastTarget = false; RectTransform rectTransform = ((Graphic)_clock).rectTransform; RectTransform rectTransform2 = ((Graphic)_clock).rectTransform; Vector2 val2 = default(Vector2); ((Vector2)(ref val2))..ctor(1f, 1f); rectTransform2.anchorMax = val2; rectTransform.anchorMin = val2; ((Graphic)_clock).rectTransform.pivot = new Vector2(1f, 1f); ((Graphic)_clock).rectTransform.sizeDelta = new Vector2(320f, 32f); object obj2 = <>O.<0>__UpdateLayout; if (obj2 == null) { WillRenderCanvases val3 = UpdateLayout; <>O.<0>__UpdateLayout = val3; obj2 = (object)val3; } Canvas.preWillRenderCanvases -= (WillRenderCanvases)obj2; object obj3 = <>O.<0>__UpdateLayout; if (obj3 == null) { WillRenderCanvases val4 = UpdateLayout; <>O.<0>__UpdateLayout = val4; obj3 = (object)val4; } Canvas.preWillRenderCanvases += (WillRenderCanvases)obj3; } private static void UpdateClock() { //IL_01c8: Unknown result type (might be due to invalid IL or missing references) YetAnotherClockConfig settings = Plugin.Settings; bool hudVisible = Object.op_Implicit((Object)(object)Hud.instance) && !Hud.IsUserHidden() && Object.op_Implicit((Object)(object)Hud.instance.m_rootObject) && Hud.instance.m_rootObject.activeInHierarchy; bool minimapVisible = Object.op_Implicit((Object)(object)Minimap.instance) && Object.op_Implicit((Object)(object)Minimap.instance.m_smallRoot) && Minimap.instance.m_smallRoot.activeInHierarchy; bool flag = settings != null && Object.op_Implicit((Object)(object)EnvMan.instance) && ClockRules.IsVisible(settings.Enabled.Value, hudVisible, minimapVisible, settings.ShowWhenHudHidden.Value, settings.RequireMinimap.Value); ((Component)_clock).gameObject.SetActive(flag); if (flag) { int num = ClockRules.DayMinutes(EnvMan.instance.GetDayFraction()); int day = EnvMan.instance.GetDay(); if (_minutes != num || _day != day || _showDay != settings.ShowDay.Value || _twelveHour != settings.TwelveHour.Value) { string text = ClockRules.FormatTime(num, settings.TwelveHour.Value); _clock.text = (settings.ShowDay.Value ? ("Day " + day + " — " + text) : text); _minutes = num; _day = day; _showDay = settings.ShowDay.Value; _twelveHour = settings.TwelveHour.Value; } if (_color != settings.Color.Value || _opacity != settings.Opacity.Value) { ((Graphic)_clock).color = YetAnotherClockConfig.ParseColor(settings.Color.Value, settings.Opacity.Value); _color = settings.Color.Value; _opacity = settings.Opacity.Value; } } } private static void UpdateLayout() { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004e: 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_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006a: 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_0072: 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_007e: 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_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_013f: 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_014f: 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_0148: Unknown result type (might be due to invalid IL or missing references) //IL_016a: 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_015e: Unknown result type (might be due to invalid IL or missing references) //IL_0180: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Unknown result type (might be due to invalid IL or missing references) //IL_0178: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Unknown result type (might be due to invalid IL or missing references) YetAnotherClockConfig settings = Plugin.Settings; if (Object.op_Implicit((Object)(object)_clock) && Object.op_Implicit((Object)(object)_canvasRect) && ((Behaviour)_clock).isActiveAndEnabled && settings != null) { RectTransform rectTransform = ((Graphic)_clock).rectTransform; Vector3 val = Vector3.one * settings.Scale.Value; if (((Transform)rectTransform).localScale != val) { ((Transform)rectTransform).localScale = val; } Vector2 val2 = Vector2.one; Vector2 one = Vector2.one; TextAnchor val3 = (TextAnchor)2; Vector2 left = default(Vector2); Vector2 right = default(Vector2); bool flag = settings.AnchorToMinimap.Value && TryGetMinimapTop(out left, out right); ClockPosition clockPosition = ClockLayoutRules.ResolvePosition(settings.AnchorToMinimap.Value, flag, left.x, right.x, (left.y + right.y) * 0.5f, settings.OffsetX.Value, settings.OffsetY.Value); Vector2 val4 = default(Vector2); ((Vector2)(ref val4))..ctor(clockPosition.X, clockPosition.Y); if (flag) { val2 = _canvasRect.pivot; ((Vector2)(ref one))..ctor(0.5f, 0f); val3 = (TextAnchor)7; } if (rectTransform.anchorMin != val2) { rectTransform.anchorMin = val2; } if (rectTransform.anchorMax != val2) { rectTransform.anchorMax = val2; } if (rectTransform.pivot != one) { rectTransform.pivot = one; } if (_clock.alignment != val3) { _clock.alignment = val3; } if (rectTransform.anchoredPosition != val4) { rectTransform.anchoredPosition = val4; } } } private static bool TryGetMinimapTop(out Vector2 left, out Vector2 right) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: 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_000d: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0016: 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_0091: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: 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_0112: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) left = (right = default(Vector2)); RectTransform val = ((Object.op_Implicit((Object)(object)Minimap.instance) && Object.op_Implicit((Object)(object)Minimap.instance.m_mapImageSmall)) ? ((Graphic)Minimap.instance.m_mapImageSmall).rectTransform : null); if (!Object.op_Implicit((Object)(object)val)) { return false; } if ((Object)(object)_minimapRect != (Object)(object)val || !Object.op_Implicit((Object)(object)_minimapCanvas)) { _minimapRect = val; _minimapCanvas = ((Component)val).GetComponentInParent(); } if (Object.op_Implicit((Object)(object)_minimapCanvas)) { Rect rect = val.rect; if (!(((Rect)(ref rect)).width <= 0f)) { rect = val.rect; if (!(((Rect)(ref rect)).height <= 0f)) { Camera obj = (((int)_minimapCanvas.renderMode == 0) ? null : _minimapCanvas.worldCamera); Rect rect2 = val.rect; Vector2 val2 = RectTransformUtility.WorldToScreenPoint(obj, ((Transform)val).TransformPoint(new Vector3(((Rect)(ref rect2)).xMin, ((Rect)(ref rect2)).yMax, 0f))); Vector2 val3 = RectTransformUtility.WorldToScreenPoint(obj, ((Transform)val).TransformPoint(new Vector3(((Rect)(ref rect2)).xMax, ((Rect)(ref rect2)).yMax, 0f))); if (RectTransformUtility.ScreenPointToLocalPointInRectangle(_canvasRect, val2, (Camera)null, ref left)) { return RectTransformUtility.ScreenPointToLocalPointInRectangle(_canvasRect, val3, (Camera)null, ref right); } return false; } } } return false; } } } namespace JG224.YetAnotherClock.Core { internal readonly struct ClockPosition { internal float X { get; } internal float Y { get; } internal ClockPosition(float x, float y) { X = x; Y = y; } } internal static class ClockLayoutRules { internal const float LegacyOffsetX = -32f; internal const float LegacyOffsetY = -28f; internal const float MinimapGap = 8f; internal static bool HasLegacyDefaultOffsets(float x, float y) { if (x == -32f) { return y == -28f; } return false; } internal static ClockPosition AboveMinimap(float left, float right, float top) { return new ClockPosition(left + (right - left) * 0.5f, top + 8f); } internal static ClockPosition ResolvePosition(bool anchorToMinimap, bool minimapAvailable, float left, float right, float top, float offsetX, float offsetY) { if (!anchorToMinimap) { return new ClockPosition(offsetX, offsetY); } if (!minimapAvailable) { return new ClockPosition(-32f, -28f); } return AboveMinimap(left, right, top); } } internal static class ClockRules { internal static int DayMinutes(float dayFraction) { if (float.IsNaN(dayFraction) || float.IsInfinity(dayFraction)) { return 0; } return (int)Math.Floor((dayFraction - (float)Math.Floor(dayFraction)) * 1440f) % 1440; } internal static string FormatTime(int minutes) { return FormatTime(minutes, twelveHour: false); } internal static string FormatTime(int minutes, bool twelveHour) { minutes = (minutes % 1440 + 1440) % 1440; if (twelveHour) { return ((minutes / 60 + 11) % 12 + 1).ToString(CultureInfo.InvariantCulture) + ":" + (minutes % 60).ToString("00", CultureInfo.InvariantCulture) + ((minutes < 720) ? " AM" : " PM"); } return (minutes / 60).ToString("00", CultureInfo.InvariantCulture) + ":" + (minutes % 60).ToString("00", CultureInfo.InvariantCulture); } internal static bool IsVisible(bool enabled, bool hudVisible, bool minimapVisible, bool showWhenHudHidden, bool requireMinimap) { if (enabled && (hudVisible || showWhenHudHidden)) { return !requireMinimap || minimapVisible; } return false; } } internal static class LegacyClockConfigRules { internal const string CurrentFileName = "jg224.YetAnotherClock.cfg"; internal const string GeneralTweaksFileName = "jg224.GeneralTweaks.cfg"; internal const string LegacyGeneralTweaksFileName = "JG224.GeneralTweaks.cfg"; internal static string FindImportSource(IEnumerable candidatePaths) { string[] paths = ((candidatePaths == null) ? Array.Empty() : candidatePaths.ToArray()); if (FindExact(paths, "jg224.YetAnotherClock.cfg") != null) { return null; } return FindExact(paths, "jg224.GeneralTweaks.cfg") ?? FindExact(paths, "JG224.GeneralTweaks.cfg"); } internal static bool HasSetting(IEnumerable lines, string section, string key) { if (lines == null) { return false; } string a = string.Empty; foreach (string line in lines) { string text = (line ?? string.Empty).Trim(); if (text.StartsWith("#", StringComparison.Ordinal)) { continue; } if (text.StartsWith("[", StringComparison.Ordinal) && text.EndsWith("]", StringComparison.Ordinal)) { a = text.Substring(1, text.Length - 2); continue; } int num = text.IndexOf('='); if (num >= 0 && string.Equals(a, section, StringComparison.Ordinal) && string.Equals(text.Substring(0, num).Trim(), key, StringComparison.Ordinal)) { return true; } } return false; } private static string FindExact(IEnumerable paths, string fileName) { return paths.FirstOrDefault((string path) => string.Equals(Path.GetFileName(path), fileName, StringComparison.Ordinal)); } } }