Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of ValheimClock v1.5.2
ValheimClock.dll
Decompiled 2 weeks agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using HarmonyLib; using UnityEngine; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("ValheimClock")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("ValheimClock")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("18563418-e175-483a-8c43-8b1defa61eca")] [assembly: AssemblyFileVersion("1.5.2.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.5.2.0")] namespace ClockMod; [HarmonyPatch(typeof(Hud), "UpdateStatusEffects", new Type[] { typeof(List<StatusEffect>) })] public static class HudPatches { [HarmonyAfter(new string[] { "randyknapp.mods.minimalstatuseffects" })] [HarmonyPostfix] public static void Postfix(RectTransform ___m_statusEffectListRoot) { //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) if (ClockPlugin.HasMSE && !((Object)(object)___m_statusEffectListRoot == (Object)null) && !(Mathf.Abs(ClockPlugin.ConfigPosX.Value) > 100f)) { float num = ClockPlugin.ConfigHeight.Value; if (ClockPlugin.ConfigLayoutStyle.Value == TextLayoutStyle.Stacked) { num += 20f; } if (ClockPlugin.ConfigShowWeather.Value) { num += 20f; } if (ClockPlugin.ConfigShowTimeSlider.Value) { num += 18f; } float num2 = Mathf.Abs(ClockPlugin.ConfigPosY.Value); float num3 = num + num2 + 15f; ___m_statusEffectListRoot.anchoredPosition = new Vector2(___m_statusEffectListRoot.anchoredPosition.x, ___m_statusEffectListRoot.anchoredPosition.y - num3); } } } [HarmonyPatch(typeof(Minimap))] public static class MinimapPatches { private static int _cachedDisplayDay = -1; private static int _cachedHours = -1; private static int _cachedMinutes = -1; private static TextLayoutStyle _cachedLayout = TextLayoutStyle.SingleLine; private static bool _cached12HourFormat = false; private static bool _cachedShowWeather = false; private static string _cachedWeather = ""; private static int _cachedWeatherFontSize = -1; private static int _cachedMainFontSize = -1; private static ClockTheme _cachedTheme = ClockTheme.Valheim; [HarmonyPatch("Start")] [HarmonyPostfix] public static void Start_Postfix(Minimap __instance) { if (!((Object)(object)__instance.m_smallRoot == (Object)null)) { ClockUI.Build(__instance.m_smallRoot.transform); } } [HarmonyPatch("Update")] [HarmonyPostfix] public static void Update_Postfix(Minimap __instance) { //IL_0257: Unknown result type (might be due to invalid IL or missing references) //IL_025c: Unknown result type (might be due to invalid IL or missing references) //IL_0260: Unknown result type (might be due to invalid IL or missing references) //IL_0265: Unknown result type (might be due to invalid IL or missing references) //IL_0269: Unknown result type (might be due to invalid IL or missing references) //IL_026e: Unknown result type (might be due to invalid IL or missing references) //IL_0272: Unknown result type (might be due to invalid IL or missing references) //IL_0277: Unknown result type (might be due to invalid IL or missing references) //IL_02a6: Unknown result type (might be due to invalid IL or missing references) //IL_02a8: Unknown result type (might be due to invalid IL or missing references) //IL_02ac: Unknown result type (might be due to invalid IL or missing references) //IL_02f9: Unknown result type (might be due to invalid IL or missing references) //IL_02fb: Unknown result type (might be due to invalid IL or missing references) //IL_02ff: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)ClockUI.ClockText == (Object)null || (Object)(object)EnvMan.instance == (Object)null || (Object)(object)ZNet.instance == (Object)null) { return; } bool activeSelf = __instance.m_smallRoot.activeSelf; ClockUI.Panel.SetActive(activeSelf); if (!activeSelf) { return; } double timeSeconds = ZNet.instance.GetTimeSeconds(); long dayLengthSec = EnvMan.instance.m_dayLengthSec; int day = EnvMan.instance.GetDay(timeSeconds); float num = (float)(timeSeconds % (double)dayLengthSec) / (float)dayLengthSec; int num2 = Mathf.FloorToInt(num * 24f); int num3 = Mathf.FloorToInt((num * 24f - (float)num2) * 60f); TextLayoutStyle value = ClockPlugin.ConfigLayoutStyle.Value; bool value2 = ClockPlugin.ConfigUse12HourFormat.Value; bool value3 = ClockPlugin.ConfigShowWeather.Value; int value4 = ClockPlugin.ConfigWeatherFontSize.Value; int value5 = ClockPlugin.ConfigFontSize.Value; ClockTheme value6 = ClockPlugin.ConfigTheme.Value; string internalName = ((!value3) ? "" : (EnvMan.instance.GetCurrentEnvironment()?.m_name ?? "")); internalName = TranslateWeather(internalName); if (day == _cachedDisplayDay && num2 == _cachedHours && num3 == _cachedMinutes && value == _cachedLayout && value2 == _cached12HourFormat && value3 == _cachedShowWeather && internalName == _cachedWeather && value4 == _cachedWeatherFontSize && value5 == _cachedMainFontSize && value6 == _cachedTheme) { return; } _cachedDisplayDay = day; _cachedHours = num2; _cachedMinutes = num3; _cachedLayout = value; _cached12HourFormat = value2; _cachedShowWeather = value3; _cachedWeather = internalName; _cachedWeatherFontSize = value4; _cachedMainFontSize = value5; _cachedTheme = value6; string text = ((value == TextLayoutStyle.Stacked) ? "\n" : " "); string text2; if (value2) { string arg = ((num2 >= 12) ? "PM" : "AM"); int num4 = num2 % 12; if (num4 == 0) { num4 = 12; } text2 = $"{num4:D2}:{num3:D2} {arg}"; } else { text2 = $"{num2:D2}:{num3:D2}"; } if (ClockPlugin.ConfigShowTimeSlider.Value && (Object)(object)ClockUI.TimeSlider != (Object)null) { ClockUI.TimeSlider.value = num; Color dayColor = ThemeManager.GetDayColor(value6); Color nightColor = ThemeManager.GetNightColor(value6); Color dayIconColor = ThemeManager.GetDayIconColor(value6); Color nightIconColor = ThemeManager.GetNightIconColor(value6); float num5 = Mathf.Abs(num - 0.5f) * 2f; num5 = Mathf.SmoothStep(0f, 1f, num5); ((Graphic)ClockUI.SliderFill).color = Color.Lerp(dayColor, nightColor, num5); if ((Object)(object)ClockUI.SliderIconText != (Object)null) { bool flag = num >= 0.25f && num < 0.75f; ClockUI.SliderIconText.text = (flag ? "☀" : "☾"); ((Graphic)ClockUI.SliderIconText).color = Color.Lerp(dayIconColor, nightIconColor, num5); } } string text3 = ((value3 && !string.IsNullOrEmpty(internalName)) ? ("\n" + internalName) : ""); ClockUI.ClockText.text = $"<size={value5}>Day {day}{text}{text2}</size>{text3}"; } private static string TranslateWeather(string internalName) { //IL_0644: Unknown result type (might be due to invalid IL or missing references) //IL_0649: Unknown result type (might be due to invalid IL or missing references) switch (internalName) { case "Clear": return "Clear Skies"; case "LightRain": return "Light Rain"; case "Rain": return "Raining"; case "ThunderStorm": return "Thunderstorm"; case "Snow": return "Snowing"; case "WarmSnow": return "Warm Snow"; case "WarmSnowStorm": return "Warm Snowstorm"; case "SnowStorm": return "Blizzard"; case "Ashlands_ashrain": return "Ash Rain"; case "Ashlands_ashrain_clear": return "Ash Clear"; case "Ashlands_CinderRain": return "Cinder Rain"; case "Ashlands_meteorshower": return "Meteor Shower"; case "Ashlands_misty": return "Ashlands Fog"; case "Ashlands_storm": return "Ashlands Storm"; case "Ashlands_SeaStorm": return "Ashlands Seastorm"; case "Darklands_dark": return "Mistlands Dark"; case "Mistlands_clear": return "Mislands Clear"; case "Mistlands_rain": return "Mistlands Rain"; case "Mistlands_thunder": return "Mistlands Thunder"; case "Twilight_Clear": return "Twilight Clear"; case "Twilight_Snow": return "Twilight Snow"; case "Twilight_SnowStorm": return "Twilight Snowstorm"; case "Heath_clear": return "Clear Skies"; case "DeepForest Mist": return "Black Forest Fog"; case "SwampRain": return "Swamp Rain"; case "Caves": return "Freezing"; case "CavesHildir": return "Freezing"; case "SunkenCrypt": return "Sunken Crypt"; case "Crypt": return "Crypt"; case "CryptHildir": return "Crypt Hildir"; case "InfectedMine": return "Infected Mine"; case "NightFrost": return "Night Frost"; case "Queen": return "Queen's Jam"; case "Eikthyr": return "Eikthyr's Thunderstorm"; case "GDKing": return "The Elder's Haze"; case "Bonemass": return "Bonemass' Downpour"; case "Moder": return "Moder's Vortex"; case "GoblinKing": return "Yagluth's Magic Blizzard"; case "Misty": { object obj; if (!((Object)(object)Player.m_localPlayer != (Object)null)) { obj = ""; } else { Biome currentBiome = Player.m_localPlayer.GetCurrentBiome(); obj = ((object)(Biome)(ref currentBiome)).ToString(); } string text = (string)obj; if (text == "Plains") { return "Plains Fog"; } if (text == "Ocean") { return "Ocean Fog"; } return "Fog"; } default: return internalName; } } } public static class ClockUI { private static Sprite _uiSprite; private static Sprite _knobSprite; public static GameObject Panel { get; private set; } public static Text ClockText { get; private set; } public static Slider TimeSlider { get; private set; } public static Image SliderFill { get; private set; } public static GameObject SliderRoot { get; private set; } public static Text SliderIconText { get; private set; } public static Image TopTrim { get; private set; } public static Image BottomTrim { get; private set; } public static void Build(Transform parentRoot) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Expected O, but got Unknown //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_0145: 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_017c: 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) //IL_01ae: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)Panel != (Object)null)) { Panel = new GameObject("ClockUI"); Panel.transform.SetParent(parentRoot, false); _uiSprite = ((IEnumerable<Sprite>)Resources.FindObjectsOfTypeAll<Sprite>()).FirstOrDefault((Func<Sprite, bool>)((Sprite s) => ((Object)s).name == "UISprite" || ((Object)s).name == "Background")); _knobSprite = ((IEnumerable<Sprite>)Resources.FindObjectsOfTypeAll<Sprite>()).FirstOrDefault((Func<Sprite, bool>)((Sprite s) => ((Object)s).name == "Knob")); RectTransform obj = Panel.AddComponent<RectTransform>(); obj.anchorMin = new Vector2(0.5f, 0f); obj.anchorMax = new Vector2(0.5f, 0f); obj.pivot = new Vector2(0.5f, 1f); ((Graphic)Panel.AddComponent<Image>()).color = new Color(0.05f, 0.05f, 0.05f, 0.95f); TopTrim = CreateBorder("TopTrim", new Vector2(0f, 1f), new Vector2(1f, 1f)); BottomTrim = CreateBorder("BottomTrim", new Vector2(0f, 0f), new Vector2(1f, 0f)); CreateRivet("TopLeftRivet", new Vector2(0f, 1f)); CreateRivet("TopRightRivet", new Vector2(1f, 1f)); CreateRivet("BottomLeftRivet", new Vector2(0f, 0f)); CreateRivet("BottomRightRivet", new Vector2(1f, 0f)); BuildTextElement(); BuildSliderElement(); ApplyConfigs(); } } private static void BuildTextElement() { //IL_0005: 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_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0027: 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_0047: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_012f: 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) GameObject val = new GameObject("ClockText"); val.transform.SetParent(Panel.transform, false); RectTransform obj = val.AddComponent<RectTransform>(); obj.anchorMin = Vector2.zero; obj.anchorMax = Vector2.one; obj.offsetMin = new Vector2(5f, 0f); obj.offsetMax = new Vector2(-5f, 0f); ClockText = val.AddComponent<Text>(); ClockText.alignment = (TextAnchor)4; ((Graphic)ClockText).color = Color.white; ClockText.lineSpacing = 0.9f; ClockText.text = "..."; ClockText.supportRichText = true; ClockText.horizontalOverflow = (HorizontalWrapMode)0; ClockText.verticalOverflow = (VerticalWrapMode)0; ClockText.resizeTextForBestFit = true; ClockText.resizeTextMinSize = 8; ClockText.resizeTextMaxSize = 30; Font val2 = ((IEnumerable<Font>)Resources.FindObjectsOfTypeAll<Font>()).FirstOrDefault((Func<Font, bool>)((Font f) => ((Object)f).name == "AveriaSerifLibre-Bold")); if ((Object)(object)val2 != (Object)null) { ClockText.font = val2; } Outline obj2 = val.AddComponent<Outline>(); ((Shadow)obj2).effectColor = Color.black; ((Shadow)obj2).effectDistance = new Vector2(1f, -1f); } private static void BuildSliderElement() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_008b: 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_00a6: 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_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Expected O, but got Unknown //IL_0138: 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_014d: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0173: 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_01cf: Unknown result type (might be due to invalid IL or missing references) //IL_01da: Unknown result type (might be due to invalid IL or missing references) //IL_01e5: Unknown result type (might be due to invalid IL or missing references) //IL_01f4: Unknown result type (might be due to invalid IL or missing references) //IL_01fa: Expected O, but got Unknown //IL_0217: Unknown result type (might be due to invalid IL or missing references) //IL_0222: Unknown result type (might be due to invalid IL or missing references) //IL_022c: Unknown result type (might be due to invalid IL or missing references) //IL_023b: Unknown result type (might be due to invalid IL or missing references) //IL_0240: Unknown result type (might be due to invalid IL or missing references) //IL_0252: Unknown result type (might be due to invalid IL or missing references) //IL_0266: Unknown result type (might be due to invalid IL or missing references) //IL_0270: Unknown result type (might be due to invalid IL or missing references) //IL_02ef: Unknown result type (might be due to invalid IL or missing references) //IL_0303: Unknown result type (might be due to invalid IL or missing references) SliderRoot = new GameObject("TimeSlider"); SliderRoot.transform.SetParent(Panel.transform, false); RectTransform obj = SliderRoot.AddComponent<RectTransform>(); obj.anchorMin = new Vector2(0f, 0f); obj.anchorMax = new Vector2(1f, 0f); obj.offsetMin = new Vector2(10f, 8f); obj.offsetMax = new Vector2(-10f, 12f); GameObject val = new GameObject("Background"); val.transform.SetParent(SliderRoot.transform, false); Image val2 = val.AddComponent<Image>(); ((Graphic)val2).color = new Color(0.1f, 0.1f, 0.1f, 1f); if ((Object)(object)_uiSprite != (Object)null) { val2.sprite = _uiSprite; val2.type = (Type)1; } RectTransform component = val.GetComponent<RectTransform>(); component.anchorMin = Vector2.zero; component.anchorMax = Vector2.one; component.sizeDelta = Vector2.zero; GameObject val3 = new GameObject("FillArea"); val3.transform.SetParent(SliderRoot.transform, false); RectTransform obj2 = val3.AddComponent<RectTransform>(); obj2.anchorMin = Vector2.zero; obj2.anchorMax = Vector2.one; obj2.sizeDelta = Vector2.zero; GameObject val4 = new GameObject("Fill"); val4.transform.SetParent(val3.transform, false); SliderFill = val4.AddComponent<Image>(); ((Graphic)SliderFill).color = new Color(1f, 0.75f, 0.3f, 1f); if ((Object)(object)_uiSprite != (Object)null) { SliderFill.sprite = _uiSprite; SliderFill.type = (Type)1; } RectTransform component2 = val4.GetComponent<RectTransform>(); component2.anchorMin = Vector2.zero; component2.anchorMax = Vector2.one; component2.sizeDelta = Vector2.zero; GameObject val5 = new GameObject("HandleArea"); val5.transform.SetParent(SliderRoot.transform, false); RectTransform obj3 = val5.AddComponent<RectTransform>(); obj3.anchorMin = Vector2.zero; obj3.anchorMax = Vector2.one; obj3.sizeDelta = Vector2.zero; GameObject val6 = new GameObject("Handle"); val6.transform.SetParent(val5.transform, false); RectTransform val7 = val6.AddComponent<RectTransform>(); val7.sizeDelta = new Vector2(25f, 25f); SliderIconText = val6.AddComponent<Text>(); SliderIconText.alignment = (TextAnchor)4; SliderIconText.horizontalOverflow = (HorizontalWrapMode)1; SliderIconText.verticalOverflow = (VerticalWrapMode)1; SliderIconText.fontSize = 16; Font val8 = ((IEnumerable<Font>)Resources.FindObjectsOfTypeAll<Font>()).FirstOrDefault((Func<Font, bool>)((Font f) => ((Object)f).name == "AveriaSerifLibre-Bold")); if ((Object)(object)val8 != (Object)null) { SliderIconText.font = val8; } Outline obj4 = val6.AddComponent<Outline>(); ((Shadow)obj4).effectColor = Color.black; ((Shadow)obj4).effectDistance = new Vector2(1f, -1f); TimeSlider = SliderRoot.AddComponent<Slider>(); ((Selectable)TimeSlider).interactable = false; ((Selectable)TimeSlider).transition = (Transition)0; TimeSlider.fillRect = component2; TimeSlider.handleRect = val7; TimeSlider.minValue = 0f; TimeSlider.maxValue = 1f; } private static Image CreateBorder(string name, Vector2 anchorMin, Vector2 anchorMax) { //IL_0001: 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_001c: 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_002a: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject(name); val.transform.SetParent(Panel.transform, false); RectTransform obj = val.AddComponent<RectTransform>(); obj.anchorMin = anchorMin; obj.anchorMax = anchorMax; obj.sizeDelta = new Vector2(0f, 2f); obj.anchoredPosition = Vector2.zero; Image obj2 = val.AddComponent<Image>(); ((Graphic)obj2).color = ThemeManager.GetBorderColor(ClockPlugin.ConfigTheme.Value); return obj2; } private static void CreateRivet(string name, Vector2 anchorPosition) { //IL_0001: 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_001c: 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_002a: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0045: 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) GameObject val = new GameObject(name); val.transform.SetParent(Panel.transform, false); RectTransform obj = val.AddComponent<RectTransform>(); obj.anchorMin = anchorPosition; obj.anchorMax = anchorPosition; obj.sizeDelta = new Vector2(8f, 8f); obj.anchoredPosition = Vector2.zero; Image val2 = val.AddComponent<Image>(); ((Graphic)val2).color = new Color(0.6f, 0.6f, 0.6f, 1f); if ((Object)(object)_knobSprite != (Object)null) { val2.sprite = _knobSprite; } } public static void ApplyConfigs() { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_005d: 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_0116: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)Panel == (Object)null) && !((Object)(object)ClockText == (Object)null)) { if ((Object)(object)TopTrim != (Object)null) { ((Graphic)TopTrim).color = ThemeManager.GetBorderColor(ClockPlugin.ConfigTheme.Value); } if ((Object)(object)BottomTrim != (Object)null) { ((Graphic)BottomTrim).color = ThemeManager.GetBorderColor(ClockPlugin.ConfigTheme.Value); } RectTransform component = Panel.GetComponent<RectTransform>(); component.anchoredPosition = new Vector2(ClockPlugin.ConfigPosX.Value, ClockPlugin.ConfigPosY.Value); float num = ClockPlugin.ConfigWidth.Value; float num2 = ClockPlugin.ConfigHeight.Value; if (ClockPlugin.ConfigUse12HourFormat.Value) { num += 20f; } if (ClockPlugin.ConfigLayoutStyle.Value == TextLayoutStyle.Stacked) { num2 += 20f; } if (ClockPlugin.ConfigShowWeather.Value) { num2 += 20f; } if (ClockPlugin.ConfigShowTimeSlider.Value) { num2 += 18f; SliderRoot.SetActive(true); ((Graphic)ClockText).rectTransform.offsetMin = new Vector2(5f, 18f); } else { SliderRoot.SetActive(false); ((Graphic)ClockText).rectTransform.offsetMin = new Vector2(5f, 0f); } component.sizeDelta = new Vector2(num, num2); ClockText.fontSize = ClockPlugin.ConfigWeatherFontSize.Value; ClockText.resizeTextMaxSize = ClockPlugin.ConfigWeatherFontSize.Value; } } } public enum ClockTheme { Valheim, Blood, Ocean, Nature, Monochrome } public enum TextLayoutStyle { SingleLine, Stacked } [BepInPlugin("com.orfox.valheimclock", "Valheim Clock", "1.5.2")] [BepInProcess("valheim.exe")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class ClockPlugin : BaseUnityPlugin { public const string PluginGUID = "com.orfox.valheimclock"; public const string PluginName = "Valheim Clock"; public const string PluginVersion = "1.5.2"; private readonly Harmony _harmony = new Harmony("com.orfox.valheimclock"); public static ConfigEntry<float> ConfigPosX; public static ConfigEntry<float> ConfigPosY; public static ConfigEntry<float> ConfigWidth; public static ConfigEntry<float> ConfigHeight; public static ConfigEntry<int> ConfigFontSize; public static ConfigEntry<int> ConfigWeatherFontSize; public static ConfigEntry<bool> ConfigUse12HourFormat; public static ConfigEntry<TextLayoutStyle> ConfigLayoutStyle; public static ConfigEntry<bool> ConfigShowWeather; public static ConfigEntry<bool> ConfigShowTimeSlider; public static ConfigEntry<ClockTheme> ConfigTheme; public static bool HasMSE { get; private set; } private void Awake() { HasMSE = Chainloader.PluginInfos.ContainsKey("randyknapp.mods.minimalstatuseffects"); ConfigPosX = ((BaseUnityPlugin)this).Config.Bind<float>("Position", "Offset X", 0f, "Horizontal offset relative to the bottom center of the minimap."); ConfigPosY = ((BaseUnityPlugin)this).Config.Bind<float>("Position", "Offset Y", -10f, "Vertical offset relative to the bottom center of the minimap."); ConfigWidth = ((BaseUnityPlugin)this).Config.Bind<float>("Visuals", "Panel Width", 160f, "Width of the clock panel."); ConfigHeight = ((BaseUnityPlugin)this).Config.Bind<float>("Visuals", "Panel Height", 34f, "Height of the clock panel."); ConfigFontSize = ((BaseUnityPlugin)this).Config.Bind<int>("Visuals", "Font Size", 18, "Size of the clock text."); ConfigWeatherFontSize = ((BaseUnityPlugin)this).Config.Bind<int>("Visuals", "Weather Font Size", 14, "Size of the weather text."); ConfigUse12HourFormat = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Use12HourFormat", false, "If true, displays the clock in a 12-hour format with AM/PM instead of 24-hour format time."); ConfigLayoutStyle = ((BaseUnityPlugin)this).Config.Bind<TextLayoutStyle>("Visuals", "Text Layout", TextLayoutStyle.SingleLine, "Day and time arrangement."); ConfigShowWeather = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Show Weather", false, "If true, displays the current weather/environment alongside the time."); ConfigShowTimeSlider = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Show Time Slider", false, "If true, displays a progress bar at the bottom tracking the day/night cycle."); ConfigTheme = ((BaseUnityPlugin)this).Config.Bind<ClockTheme>("Visuals", "Theme", ClockTheme.Valheim, "Color theme of the clock UI and slider."); PropertyInfo property = typeof(ConfigFile).GetProperty("OrphanedEntries", BindingFlags.Instance | BindingFlags.NonPublic); if (property != null) { (property.GetValue(((BaseUnityPlugin)this).Config, null) as IDictionary)?.Clear(); } _harmony.PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"ClockMod initialized."); SetupConfigWatcher(); } private void SetupConfigWatcher() { FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(Paths.ConfigPath, "com.orfox.valheimclock.cfg"); fileSystemWatcher.IncludeSubdirectories = true; fileSystemWatcher.SynchronizingObject = ThreadingHelper.SynchronizingObject; fileSystemWatcher.EnableRaisingEvents = true; fileSystemWatcher.Changed += ReloadConfig; fileSystemWatcher.Created += ReloadConfig; fileSystemWatcher.Renamed += ReloadConfig; } private void ReloadConfig(object sender, FileSystemEventArgs e) { if (!File.Exists(((BaseUnityPlugin)this).Config.ConfigFilePath)) { return; } try { ((BaseUnityPlugin)this).Config.Reload(); ClockUI.ApplyConfigs(); } catch { } } } public static class ThemeManager { public static Color GetBorderColor(ClockTheme theme) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0048: 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_007c: 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) return (Color)(theme switch { ClockTheme.Blood => new Color(0.6f, 0.1f, 0.1f, 1f), ClockTheme.Ocean => new Color(0.2f, 0.6f, 0.8f, 1f), ClockTheme.Nature => new Color(0.3f, 0.6f, 0.2f, 1f), ClockTheme.Monochrome => new Color(0.8f, 0.8f, 0.8f, 1f), _ => new Color(0.85f, 0.65f, 0.2f, 1f), }); } public static Color GetDayColor(ClockTheme theme) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0048: 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_007c: 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) return (Color)(theme switch { ClockTheme.Blood => new Color(0.8f, 0.2f, 0.2f, 1f), ClockTheme.Ocean => new Color(0.3f, 0.8f, 0.9f, 1f), ClockTheme.Nature => new Color(0.4f, 0.8f, 0.3f, 1f), ClockTheme.Monochrome => new Color(0.9f, 0.9f, 0.9f, 1f), _ => new Color(1f, 0.75f, 0.3f, 1f), }); } public static Color GetNightColor(ClockTheme theme) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0048: 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_007c: 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) return (Color)(theme switch { ClockTheme.Blood => new Color(0.3f, 0.05f, 0.05f, 1f), ClockTheme.Ocean => new Color(0.1f, 0.3f, 0.6f, 1f), ClockTheme.Nature => new Color(0.1f, 0.4f, 0.2f, 1f), ClockTheme.Monochrome => new Color(0.3f, 0.3f, 0.3f, 1f), _ => new Color(0.3f, 0.5f, 1f, 1f), }); } public static Color GetDayIconColor(ClockTheme theme) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0048: 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_007c: 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) return (Color)(theme switch { ClockTheme.Blood => new Color(1f, 0.4f, 0.4f, 1f), ClockTheme.Ocean => new Color(0.6f, 0.9f, 1f, 1f), ClockTheme.Nature => new Color(0.6f, 0.9f, 0.4f, 1f), ClockTheme.Monochrome => new Color(1f, 1f, 1f, 1f), _ => new Color(1f, 0.85f, 0.2f, 1f), }); } public static Color GetNightIconColor(ClockTheme theme) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0048: 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_007c: 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) return (Color)(theme switch { ClockTheme.Blood => new Color(0.5f, 0.1f, 0.1f, 1f), ClockTheme.Ocean => new Color(0.2f, 0.4f, 0.8f, 1f), ClockTheme.Nature => new Color(0.2f, 0.5f, 0.3f, 1f), ClockTheme.Monochrome => new Color(0.5f, 0.5f, 0.5f, 1f), _ => new Color(0.6f, 0.8f, 1f, 1f), }); } }