using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using DG.Tweening; using DG.Tweening.Core; using DG.Tweening.Plugins.Options; using HarmonyLib; using Microsoft.CodeAnalysis; using PeakStatsEx.Compatibility; using PeakStatsEx.MonoBehaviours; using Photon.Pun; using TMPro; using TerrainCustomiser; using TerrainRandomiser; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; using Zorro.Core; using Zorro.Core.Editor; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("com.github.LengSword.PeakStatsEx")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.2.4.0")] [assembly: AssemblyInformationalVersion("1.2.4+11e9cd8b02b753dcde315f535dbe616d9ebb174f")] [assembly: AssemblyProduct("com.github.LengSword.PeakStatsEx")] [assembly: AssemblyTitle("PeakStatsEx")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.2.4.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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] [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] [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 BepInEx { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] internal sealed class BepInAutoPluginAttribute : Attribute { public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace BepInEx.Preloader.Core.Patching { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] internal sealed class PatcherAutoPluginAttribute : Attribute { public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace PeakStatsEx { [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.github.LengSword.PeakStatsEx", "PeakStatsEx", "1.2.4")] public class Plugin : BaseUnityPlugin { public const string Id = "com.github.LengSword.PeakStatsEx"; internal static ManualLogSource Logger { get; private set; } public static string Name => "PeakStatsEx"; public static string Version => "1.2.4"; private void Awake() { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Expected O, but got Unknown Logger = ((BaseUnityPlugin)this).Logger; Logger.LogInfo((object)("Plugin " + Name + " is loaded!")); PluginConfig.Initialize(((BaseUnityPlugin)this).Config, Logger); Harmony val = new Harmony("com.github.LengSword.PeakStatsEx"); val.PatchAll(); } } [HarmonyWrapSafe] internal sealed class Patches { [HarmonyPatch(typeof(GUIManager), "Start")] [HarmonyPostfix] private static void GUIManagerStartHook(GUIManager __instance) { //IL_0008: 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) Scene activeScene = SceneManager.GetActiveScene(); if (((Scene)(ref activeScene)).name != "Airport") { CreateTimerAndHeightStats(); CreateMapStats(); } FixBarGroup(); void CreateMapStats() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown //IL_0059: 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) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) Transform transform = ((Component)((Component)__instance).GetComponentInChildren()).transform; RectTransform val = (RectTransform)Object.Instantiate(transform, transform.parent); ((Object)val).name = "Map & Level UI"; Object.Destroy((Object)(object)((Component)val).GetComponent()); ((Component)val).gameObject.AddComponent(); Vector2 val2 = default(Vector2); ((Vector2)(ref val2))..ctor(1f, 1f); val.anchorMin = val2; Vector2 pivot = (val.anchorMax = val2); val.pivot = pivot; val.anchoredPosition = new Vector2(0f, 5f); } void CreateTimerAndHeightStats() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown //IL_0059: 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) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) Transform transform = ((Component)((Component)__instance).GetComponentInChildren()).transform; RectTransform val = (RectTransform)Object.Instantiate(transform, transform.parent); ((Object)val).name = "Timer & Height UI"; Object.Destroy((Object)(object)((Component)val).GetComponent()); ((Component)val).gameObject.AddComponent(); Vector2 val2 = default(Vector2); ((Vector2)(ref val2))..ctor(0.5f, 1f); val.anchorMin = val2; Vector2 pivot = (val.anchorMax = val2); val.pivot = pivot; val.anchoredPosition = Vector2.zero; } void FixBarGroup() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) RectTransform val = (RectTransform)((Component)__instance.bar).transform.parent; val.sizeDelta = new Vector2(600f, 1200f); Vector2 anchoredPosition = val.anchoredPosition; anchoredPosition.y = 660f; val.anchoredPosition = anchoredPosition; ((HorizontalOrVerticalLayoutGroup)((Component)val).GetComponent()).spacing = 25f; } } [HarmonyPatch(typeof(PlayerHandler), "RegisterCharacter")] [HarmonyPostfix] private static void PlayerHandlerRegisterCharacterHook(Character character) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)character != (Object)null && (Object)(object)((MonoBehaviourPun)character).photonView != (Object)null && ((MonoBehaviourPun)character).photonView.IsMine) { Scene activeScene = SceneManager.GetActiveScene(); if (((Scene)(ref activeScene)).name != "Airport") { ((Component)character).gameObject.AddComponent(); } } } [HarmonyPatch(typeof(LoadingScreenHandler), "LoadSceneProcess")] [HarmonyPostfix] private static void LoadSceneProcessHook(string sceneName) { if (sceneName.Contains("Level_")) { MapStats.currentLevelName = sceneName; MapStats.currentLevelIndex = -1; Plugin.Logger.LogDebug((object)("After: LoadingScreenHandler.LoadSceneProcess called. sceneName: " + sceneName)); } } } internal static class StringExtensions { public static string TrimToByteLength(this string input, int byteLength) { if (string.IsNullOrEmpty(input)) { return input; } int byteCount = Encoding.UTF8.GetByteCount(input); if (byteCount <= byteLength) { return input; } if (byteCount == input.Length) { return input.Substring(0, byteLength); } byte[] array = Encoding.UTF8.GetBytes(input); Array.Resize(ref array, byteLength); string text = Encoding.UTF8.GetString(array, 0, byteLength); return text.TrimEnd('\ufffd'); } } public static class PluginConfig { internal static ConfigEntry DisplayTimer { get; private set; } internal static ConfigEntry DisplayHeight { get; private set; } internal static ConfigEntry DisplayLevel { get; private set; } internal static ConfigEntry DisplayBiomes { get; private set; } internal static ConfigEntry DisplaySelfStaminaBar { get; private set; } internal static ConfigEntry DisplayDayNightCountdown { get; private set; } internal static ConfigEntry DisplayFog { get; private set; } internal static ConfigEntry DisplayLava { get; private set; } internal static ConfigEntry DisplayTerrainRandomiserSeed { get; private set; } internal static ConfigEntry DisplayTerrainCustomiserSeed { get; private set; } internal static ConfigEntry DisplayTeammateStaminaBars { get; private set; } internal static ConfigEntry TeammateStaminaBarProximity { get; private set; } internal static ConfigEntry TeammateStaminaBarLimit { get; private set; } internal static ConfigEntry TeammateStaminaBarScale { get; private set; } internal static ConfigEntry ShowInventorySlots { get; private set; } internal static ConfigEntry ShowStaminaInfo { get; private set; } internal static ConfigEntry StaminaInfoFontSize { get; private set; } internal static ConfigEntry StaminaInfoOutlineWidth { get; private set; } internal static ConfigEntry StaminaInfoRoundStaminaBars { get; private set; } internal static ConfigEntry StaminaInfoRoundAfflictionBars { get; private set; } internal static ConfigEntry StaminaInfoShowAfflictionCountdown { get; private set; } public static void Initialize(ConfigFile config, ManualLogSource logger) { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Expected O, but got Unknown //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Expected O, but got Unknown //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Expected O, but got Unknown DisplayTeammateStaminaBars = config.Bind("General", "Display Teammate Stamina Bars", true, "Displays your teammates' stamina bars at the bottom left of your screen"); TeammateStaminaBarProximity = config.Bind("General", "Teammate Stamina Bar Proximity", 30f, new ConfigDescription("How close you need to be to your teammate to see their stamina bar", (AcceptableValueBase)(object)new AcceptableValueRange(1f, 10000f), Array.Empty())); TeammateStaminaBarLimit = config.Bind("General", "Teammate Stamina Bar Limit", 4, new ConfigDescription("Max teammate stamina bars", (AcceptableValueBase)(object)new AcceptableValueRange(0, 16), Array.Empty())); TeammateStaminaBarScale = config.Bind("General", "Teammate Stamina Bar Scale (Default: 0.72)", 0.72f, new ConfigDescription("Teammate stamina bars scale", (AcceptableValueBase)(object)new AcceptableValueRange(0.2f, 1f), Array.Empty())); ShowInventorySlots = config.Bind("General", "Show Inventory Slots", true, "Show teammate inventory slots"); ShowStaminaInfo = config.Bind("General", "Show Stamina Info", true, "Show all stamina bars info number (current stamina, extra stamina, affliction bars) when stamina bar is visible"); DisplayTimer = config.Bind("Stats", "Display Timer", true, "Displays how long you've been climbing for, at the top of your screen"); DisplayHeight = config.Bind("Stats", "Display Height", true, "Displays how far you've climbed, in meters, at the top of your screen"); DisplayLevel = config.Bind("Stats", "Display Level", true, "Displays current map level name, at the top right of your screen"); DisplayBiomes = config.Bind("Stats", "Display Biomes", true, "Displays current map biomes name, at the top right of your screen"); DisplayDayNightCountdown = config.Bind("Stats", "Display Day Night Countdown", true, "Displays current day and night countdown, at the top of your screen"); DisplayFog = config.Bind("Stats", "Display Fog Stats", true, "Displays current fog stats, at the top of your screen"); DisplayLava = config.Bind("Stats", "Display Lava Stats", true, "Displays current lava stats, at the top of your screen"); DisplayTerrainRandomiserSeed = config.Bind("Stats", "Display Terrain Randomiser Seed", true, "Displays current terrain randomiser seed, at the top right of your screen"); DisplayTerrainCustomiserSeed = config.Bind("Stats", "Display Terrain Customiser Seed", true, "Displays current terrain customiser seed, at the top right of your screen"); StaminaInfoFontSize = config.Bind("StaminaInfo", "Bar Font Size", 20f, "Customize the Font Size for stamina bar text."); StaminaInfoOutlineWidth = config.Bind("StaminaInfo", "Bar Outline Width", 0.08f, "Customize the Outline Width for stamina bar text."); StaminaInfoRoundStaminaBars = config.Bind("StaminaInfo", "Round Stamina Bars", true, "If true, rounds to the nearest whole number for the stamina and extra stamina bars."); StaminaInfoRoundAfflictionBars = config.Bind("StaminaInfo", "Round Affliction Bars", false, "If true, rounds to the nearest whole number for affliction bars."); StaminaInfoShowAfflictionCountdown = config.Bind("StaminaInfo", "Show Affliction Countdown", false, "If true, show self affliction bars with countdown."); DisplaySelfStaminaBar = config.Bind("Debug", "Display Self Stamina Bar", false, "Displays your stamina bar at the bottom left of your screen"); logger.LogInfo((object)"Plugin Config Loaded."); } } [HarmonyWrapSafe] internal sealed class StaminaInfoPatch { internal static GUIManager guiManager = null; internal static Dictionary barTexts = new Dictionary(); internal static Dictionary lastKnownData = new Dictionary(); internal static Dictionary lastKnownAffData = new Dictionary(); internal static Dictionary lastAfflictionUpdateTime = new Dictionary(); private const float LargeBarThreshold = 30f; private const float SmallBarThreshold = 15f; private const float BarUnitSize = 6f; private const float AfflictionRefreshInterval = 0.5f; internal static Dictionary LastUpdateTime { get; set; } = new Dictionary(); [HarmonyPatch(typeof(StaminaBar), "Update")] [HarmonyPostfix] private static void StaminaInfoStaminaBarUpdate(StaminaBar __instance) { try { if ((Object)(object)guiManager == (Object)null) { barTexts = new Dictionary(); lastKnownData = new Dictionary(); lastKnownAffData = new Dictionary(); lastAfflictionUpdateTime = new Dictionary(); InitStaminaInfo(__instance); } if (!PluginConfig.ShowStaminaInfo.Value) { HideBarTexts(__instance); } else if ((Object)(object)Character.observedCharacter != (Object)null) { UpdateBarTexts(__instance); } } catch (Exception ex) { Plugin.Logger.LogError((object)(ex.Message + ex.StackTrace)); } } [HarmonyPatch(typeof(CharacterStaminaBar), "Update")] [HarmonyPostfix] public static void Update(CharacterStaminaBar __instance) { try { int instanceID = ((Object)__instance).GetInstanceID(); if (!LastUpdateTime.ContainsKey(instanceID)) { LastUpdateTime.Add(instanceID, -1f); } if (!barTexts.ContainsKey(GetCharacterStaminaKey(instanceID))) { InitCharacterStaminaInfo(__instance); } if (!PluginConfig.ShowStaminaInfo.Value) { HideCharacterBarTexts(__instance); } else if ((Object)(object)Character.observedCharacter != (Object)null && Time.time - LastUpdateTime[instanceID] > 1f) { UpdateCharacterBarTexts(__instance); LastUpdateTime[instanceID] = Time.time; } } catch (Exception ex) { Plugin.Logger.LogError((object)(ex.Message + ex.StackTrace)); } } private static void UpdateBarTexts(StaminaBar staminaBar) { //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) UpdateBarText(((Object)staminaBar.staminaBar).name, staminaBar.desiredStaminaSize, PluginConfig.StaminaInfoRoundStaminaBars.Value, trimWholeDecimal: false, lastKnownData); UpdateBarText("ExtraStamina", staminaBar.desiredExtraStaminaSize, PluginConfig.StaminaInfoRoundStaminaBars.Value, trimWholeDecimal: false, lastKnownData); BarAffliction[] afflictions = staminaBar.afflictions; foreach (BarAffliction val in afflictions) { string name = ((Object)val).name; bool flag = CanShowCountdown(val.afflictionType); bool flag2 = flag && val.size > 0f && (!lastAfflictionUpdateTime.ContainsKey(name) || Time.time - lastAfflictionUpdateTime[name] > 0.5f); string suffix = string.Empty; if (flag && PluginConfig.StaminaInfoShowAfflictionCountdown.Value) { float reductionTimeRemaining = GetReductionTimeRemaining(val.afflictionType); if (reductionTimeRemaining > 0f) { suffix = "(" + FormatTime(reductionTimeRemaining) + ")"; } } UpdateBarText(name, val.size, PluginConfig.StaminaInfoRoundAfflictionBars.Value, trimWholeDecimal: true, lastKnownAffData, suffix, flag2); if (flag2) { lastAfflictionUpdateTime[name] = Time.time; } } } public static void UpdateCharacterBarTexts(CharacterStaminaBar characterStaminaBar) { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)characterStaminaBar.ObservedCharacter == (Object)null) { return; } int instanceID = ((Object)characterStaminaBar).GetInstanceID(); float size = Mathf.Max(0f, characterStaminaBar.ObservedCharacter.data.currentStamina * characterStaminaBar.fullBarRectTransform.sizeDelta.x); UpdateBarText(GetCharacterStaminaKey(instanceID), size, PluginConfig.StaminaInfoRoundStaminaBars.Value, trimWholeDecimal: false, lastKnownData); float size2 = Mathf.Max(0f, characterStaminaBar.ObservedCharacter.data.extraStamina * characterStaminaBar.fullBarRectTransform.sizeDelta.x); UpdateBarText(GetCharacterExtraStaminaKey(instanceID), size2, PluginConfig.StaminaInfoRoundStaminaBars.Value, trimWholeDecimal: false, lastKnownData); foreach (CharacterBarAffliction characterBarAffliction in characterStaminaBar.characterBarAfflictions) { characterBarAffliction.FetchDesiredSize(); UpdateBarText(GetCharacterAfflictionKey(instanceID, characterBarAffliction), characterBarAffliction.size, PluginConfig.StaminaInfoRoundAfflictionBars.Value, trimWholeDecimal: true, lastKnownAffData); } } private static void UpdateBarText(string key, float size, bool roundLargeValue, bool trimWholeDecimal, Dictionary cache, string suffix = "", bool forceUpdate = false) { if (!barTexts.TryGetValue(key, out TextMeshProUGUI value) || (!forceUpdate && cache.ContainsKey(key) && Mathf.Approximately(cache[key], size) && ((Component)value).gameObject.activeSelf)) { return; } if (size < 15f) { ((Component)value).gameObject.SetActive(false); cache[key] = size; return; } string text; if (size >= 30f) { float num = size / 6f; if (roundLargeValue) { text = Mathf.Round(num).ToString(); } else { text = num.ToString("F1"); if (trimWholeDecimal) { text = text.Replace(".0", ""); } } } else { text = Mathf.Round(size / 6f).ToString(); } ((TMP_Text)value).text = (string.IsNullOrEmpty(suffix) ? text : (text + suffix)); ((Component)value).gameObject.SetActive(true); cache[key] = size; } private static void HideBarTexts(StaminaBar staminaBar) { HideText(((Object)staminaBar.staminaBar).name); HideText("ExtraStamina"); BarAffliction[] afflictions = staminaBar.afflictions; foreach (BarAffliction val in afflictions) { HideText(((Object)val).name); } } private static void HideCharacterBarTexts(CharacterStaminaBar characterStaminaBar) { int instanceID = ((Object)characterStaminaBar).GetInstanceID(); HideText(GetCharacterStaminaKey(instanceID)); HideText(GetCharacterExtraStaminaKey(instanceID)); foreach (CharacterBarAffliction characterBarAffliction in characterStaminaBar.characterBarAfflictions) { HideText(GetCharacterAfflictionKey(instanceID, characterBarAffliction)); } } private static void HideText(string key) { if (barTexts.TryGetValue(key, out TextMeshProUGUI value)) { ((Component)value).gameObject.SetActive(false); } } private static bool CanShowCountdown(STATUSTYPE afflictionType) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_0004: 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_0009: Invalid comparison between Unknown and I4 if ((int)afflictionType != 7 && (int)afflictionType != 0) { return (int)afflictionType != 5; } return false; } private static string GetCharacterStaminaKey(int id) { return id + "_Stamina"; } private static string GetCharacterExtraStaminaKey(int id) { return id + "_ExtraStamina"; } private static string GetCharacterAfflictionKey(int id, CharacterBarAffliction affliction) { return id + "_" + ((Object)((Component)affliction).gameObject).name; } private static void InitStaminaInfo(StaminaBar staminaBar) { GameObject val = GameObject.Find("GAME/GUIManager"); guiManager = val.GetComponent(); AddTextObject(((Component)staminaBar.staminaBar).gameObject, ((Object)staminaBar.staminaBar).name); AddTextObject(((Component)staminaBar.extraBarStamina).gameObject, "ExtraStamina"); BarAffliction[] afflictions = staminaBar.afflictions; foreach (BarAffliction val2 in afflictions) { AddTextObject(((Component)val2).gameObject, ((Object)((Component)val2).gameObject).name); } } public static void InitCharacterStaminaInfo(CharacterStaminaBar characterStaminaBar) { int instanceID = ((Object)characterStaminaBar).GetInstanceID(); AddTextObject(((Component)characterStaminaBar.staminaBarRectTransform).gameObject, GetCharacterStaminaKey(instanceID)); AddTextObject(((Component)characterStaminaBar.extraBarStamina).gameObject, GetCharacterExtraStaminaKey(instanceID)); foreach (CharacterBarAffliction characterBarAffliction in characterStaminaBar.characterBarAfflictions) { AddTextObject(((Component)characterBarAffliction).gameObject, GetCharacterAfflictionKey(instanceID, characterBarAffliction)); } } internal static void AddTextObject(GameObject gameObj, string barName) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) TMP_FontAsset font = ((TMP_Text)guiManager.heroDayText).font; GameObject val = new GameObject("StaminaInfo"); val.transform.SetParent(gameObj.transform); TextMeshProUGUI val2 = val.AddComponent(); RectTransform component = val.GetComponent(); gameObj.SetActive(true); ((TMP_Text)val2).font = font; ((TMP_Text)val2).fontSize = PluginConfig.StaminaInfoFontSize.Value; component.offsetMin = new Vector2(0f, 0f); component.offsetMax = new Vector2(0f, 0f); ((TMP_Text)val2).alignment = (TextAlignmentOptions)514; ((TMP_Text)val2).verticalAlignment = (VerticalAlignmentOptions)8192; ((TMP_Text)val2).textWrappingMode = (TextWrappingModes)0; ((TMP_Text)val2).text = ""; ((Component)val2).gameObject.SetActive(false); barTexts[barName] = val2; lastKnownData[barName] = 0f; lastKnownAffData[barName] = 0f; lastAfflictionUpdateTime[barName] = -1f; try { ((TMP_Text)val2).outlineWidth = PluginConfig.StaminaInfoOutlineWidth.Value; } catch { } } private static float GetReductionTimeRemaining(STATUSTYPE statusType) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Invalid comparison between Unknown and I4 //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) CharacterAfflictions val = Character.observedCharacter?.refs?.afflictions; if ((Object)(object)val == (Object)null) { return 0f; } if ((int)statusType == 9) { float num = 0f; int num2 = 0; foreach (ThornOnMe physicalThorn in val.physicalThorns) { if (physicalThorn.stuckIn) { num2++; num += Time.time - physicalThorn.popOutTime; } } if (num2 == 0) { return 0f; } return Mathf.Abs(num) / (float)num2; } float currentStatus = val.GetCurrentStatus(statusType); if (currentStatus <= 0f) { return 0f; } float reductionRate = GetReductionRate(val, statusType); if (reductionRate <= 0f) { return 0f; } float cooldown = GetCooldown(val, statusType); float num3 = val.LastAddedStatus(statusType); float time = Time.time; if (cooldown > 0f && time - num3 < cooldown) { float num4 = cooldown - (time - num3); float num5 = currentStatus / reductionRate; return num4 + num5; } return currentStatus / reductionRate; } private static float GetReductionRate(CharacterAfflictions afflictions, STATUSTYPE statusType) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_0004: 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_0020: Expected I4, but got Unknown if ((int)statusType != 3) { return (statusType - 6) switch { 2 => afflictions.hotReductionPerSecond, 4 => afflictions.sporesReductionPerSecond, 0 => afflictions.drowsyReductionPerSecond, _ => 0f, }; } return afflictions.poisonReductionPerSecond; } private static float GetCooldown(CharacterAfflictions afflictions, STATUSTYPE statusType) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_0004: 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_0020: Expected I4, but got Unknown if ((int)statusType != 3) { return (statusType - 6) switch { 2 => afflictions.hotReductionCooldown, 4 => afflictions.sporesReductionCooldown, 0 => afflictions.drowsyReductionCooldown, _ => 0f, }; } return afflictions.poisonReductionCooldown; } private static string FormatTime(float seconds) { if (seconds < 60f) { return Mathf.CeilToInt(seconds).ToString(); } if (seconds < 3600f) { int num = Mathf.FloorToInt(seconds / 60f); int num2 = Mathf.CeilToInt(seconds % 60f); return $"{num}:{num2:D2}"; } int num3 = Mathf.FloorToInt(seconds / 3600f); int num4 = Mathf.FloorToInt(seconds % 3600f / 60f); return $"{num3}:{num4:D2}"; } } } namespace PeakStatsEx.MonoBehaviours { internal sealed class CharacterBarAffliction : MonoBehaviour { internal STATUSTYPE afflictionType; private RectTransform rectTransform; private CharacterStaminaBar characterStaminaBar; internal float size; internal void FetchReferences() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown rectTransform = (RectTransform)((Component)this).transform; ((Component)((Component)this).transform.Find("Icon")).gameObject.SetActive(false); characterStaminaBar = ((Component)this).GetComponentInParent(); characterStaminaBar.AddCharacterBarAffliction(this); } internal void FetchDesiredSize() { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) CharacterStaminaBar characterStaminaBar = this.characterStaminaBar; Character observedCharacter = characterStaminaBar.ObservedCharacter; if (!Object.op_Implicit((Object)(object)observedCharacter)) { return; } float currentStatus = observedCharacter.refs.afflictions.GetCurrentStatus(afflictionType); size = this.characterStaminaBar.fullBarRectTransform.sizeDelta.x * currentStatus; if (currentStatus > 0.01f) { if (size < 15f) { size = 15f; } ((Component)this).gameObject.SetActive(true); } else { ((Component)this).gameObject.SetActive(false); } } internal void UpdateVisual() { //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_001b: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) RectTransform val = rectTransform; Vector2 sizeDelta = rectTransform.sizeDelta; sizeDelta.x = Mathf.Lerp(rectTransform.sizeDelta.x, size, Mathf.Min(Time.deltaTime * 10f, 0.1f)); val.sizeDelta = sizeDelta; } } internal sealed class CharacterStaminaBar : MonoBehaviour { private static readonly Color defaultBarColor = new Color(0.1035f, 0.2656f, 0.3019f, 1f); private static readonly Color outOfStaminaColor = new Color(0.566f, 0.0089f, 0.0089f, 1f); internal RectTransform fullBarRectTransform; internal RectTransform staminaBarRectTransform; internal RectTransform maxStaminaBarRectTransform; internal RectTransform staminaBarOutlineRectTransform; internal RectTransform staminaBarOutlineOverflowBar; internal Image barImage; internal Image glowImage; internal RectTransform extraBar; internal RectTransform extraBarStamina; internal RectTransform extraBarOutline; internal GameObject shieldIcon; internal GameObject campfireIcon; private float staminaBarOffset; internal readonly List characterBarAfflictions = new List(); private Coroutine? animateDisableCoroutine; private Character? _observedCharacter; private bool hadObservedCharacter; private bool outOfStamina; private bool sequencingExtraBar; private bool isEnabled; private float sinTime; private readonly float TAU = MathF.PI * 2f; private float desiredExtraStaminaSize; private float extraOutlineMaxWidth; private readonly List inventorySlotUIs = new List(); private readonly List backpackSlotUIs = new List(); private InventorySlotUI? heldItemSlot; internal Character? ObservedCharacter { get { return _observedCharacter; } set { if ((Object)(object)value != (Object)null) { hadObservedCharacter = true; } _observedCharacter = value; } } internal void AnimateEnable() { if (!isEnabled && animateDisableCoroutine == null) { isEnabled = true; ((Component)this).gameObject.SetActive(true); animateDisableCoroutine = ((MonoBehaviour)this).StartCoroutine(EnableIEnumerator()); } } internal void AnimateDisable() { if (isEnabled && animateDisableCoroutine == null) { isEnabled = false; animateDisableCoroutine = ((MonoBehaviour)this).StartCoroutine(DisableIEnumerator()); } } private void Awake() { Plugin.Logger.LogDebug((object)"[UpdateStaminaBar] CharacterStaminaBar Awake"); StaminaBar val = default(StaminaBar); if (((Component)this).TryGetComponent(ref val)) { staminaBarOffset = val.staminaBarOffset; } CacheStaminaBarReferences(); CreateInventorySlots(); CreateExtraStaminaBar(); if ((Object)(object)val?.extraBar != (Object)null) { ((Component)val.extraBar).gameObject.SetActive(false); } } private void Update() { if (!Object.op_Implicit((Object)(object)ObservedCharacter) || !((Component)ObservedCharacter).gameObject.activeSelf) { if (hadObservedCharacter) { Object.Destroy((Object)(object)((Component)this).gameObject); } return; } UpdateStaminaBar(); UpdateExtraStaminaBar(); if (PluginConfig.ShowInventorySlots.Value) { UpdateInventorySlots(); } else { ClearInventorySlots(); } } private void CacheStaminaBarReferences() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Expected O, but got Unknown //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Expected O, but got Unknown //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Expected O, but got Unknown fullBarRectTransform = (RectTransform)((Component)this).transform.Find("FullBar"); maxStaminaBarRectTransform = (RectTransform)((Component)this).transform.Find("LayoutGroup/MaxStamina"); staminaBarOutlineRectTransform = (RectTransform)((Component)this).transform.Find("OutlineMask/Outline"); staminaBarOutlineOverflowBar = (RectTransform)((Component)this).transform.Find("OutlineOverflowLine"); barImage = ((Component)((Transform)maxStaminaBarRectTransform).Find("Back")).GetComponent(); staminaBarRectTransform = (RectTransform)((Component)barImage).transform.Find("Stamina"); glowImage = ((Component)((Transform)staminaBarRectTransform).Find("Glow")).GetComponent(); campfireIcon = ((Component)((Transform)staminaBarOutlineRectTransform).Find("CampfireIcon")).gameObject; shieldIcon = ((Component)((Transform)staminaBarOutlineRectTransform).Find("ShieldIcon")).gameObject; } private void CreateExtraStaminaBar() { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown //IL_006c: 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) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_009d: 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_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: 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_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Unknown result type (might be due to invalid IL or missing references) //IL_0203: Unknown result type (might be due to invalid IL or missing references) //IL_0213: Unknown result type (might be due to invalid IL or missing references) //IL_0223: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)fullBarRectTransform == (Object)null) { Plugin.Logger.LogDebug((object)"[CreateExtraStaminaBar] fullBar not found"); return; } StaminaBar component = ((Component)this).GetComponent(); GameObject val = new GameObject("FriendExtraBar"); val.transform.SetParent(((Component)this).transform, false); extraBar = val.AddComponent(); RectTransform val2 = extraBar; RectTransform obj = extraBar; Vector2 val3 = default(Vector2); ((Vector2)(ref val3))..ctor(0f, 0.5f); obj.anchorMax = val3; Vector2 anchorMin = val3; val2.anchorMin = anchorMin; extraBar.pivot = new Vector2(0f, 0.5f); Vector2 anchoredPosition = fullBarRectTransform.anchoredPosition; extraBar.anchoredPosition = new Vector2(anchoredPosition.x, anchoredPosition.y - 31f); extraBar.sizeDelta = new Vector2(28f, 28f); if ((Object)(object)component?.extraBarOutline != (Object)null) { GameObject val4 = Object.Instantiate(((Component)component.extraBarOutline).gameObject, val.transform, false); ((Object)val4).name = "FriendExtraBarOutline"; extraBarOutline = val4.GetComponent(); Vector2 anchoredPosition2 = extraBarOutline.anchoredPosition; extraBarOutline.anchoredPosition = new Vector2(anchoredPosition2.x - 46f, anchoredPosition2.y - 1f); extraOutlineMaxWidth = fullBarRectTransform.sizeDelta.x * 0.7f + 12f; extraBarOutline.sizeDelta = new Vector2(extraOutlineMaxWidth, extraBarOutline.sizeDelta.y); RemoveAllScriptsExcept(val4); } if ((Object)(object)component?.extraBarStamina != (Object)null) { GameObject val5 = Object.Instantiate(((Component)component.extraBarStamina).gameObject, val.transform, false); ((Object)val5).name = "FriendExtraBarStamina"; extraBarStamina = val5.GetComponent(); extraBarStamina.sizeDelta = new Vector2(extraBarStamina.sizeDelta.x, extraBarStamina.sizeDelta.y * 0.5f); RemoveAllScriptsExcept(val5); } val.SetActive(false); } private void UpdateExtraStaminaBar() { //IL_0070: 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_00e2: 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_0139: 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_015f: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_01a5: Unknown result type (might be due to invalid IL or missing references) //IL_01c1: Unknown result type (might be due to invalid IL or missing references) //IL_01cb: Expected O, but got Unknown if ((Object)(object)extraBar == (Object)null || (Object)(object)extraBarStamina == (Object)null || (Object)(object)extraBarOutline == (Object)null || (Object)(object)ObservedCharacter == (Object)null) { return; } float extraStamina = ObservedCharacter.data.extraStamina; bool flag = extraStamina > 0f; if (!((Component)extraBar).gameObject.activeSelf && flag) { extraBar.sizeDelta = Vector2.zero; ShortcutExtensions.DOKill((Component)(object)extraBar, false); TweenSettingsExtensions.SetEase>(DOTweenModuleUI.DOSizeDelta(extraBar, new Vector2(28f, 28f), 0.25f, false), (Ease)9); ((Component)extraBar).gameObject.SetActive(true); } if (((Component)extraBar).gameObject.activeSelf) { desiredExtraStaminaSize = Mathf.Max(0f, extraStamina * fullBarRectTransform.sizeDelta.x * 0.7f); extraBarStamina.sizeDelta = new Vector2(Mathf.Lerp(extraBarStamina.sizeDelta.x, Mathf.Max(4f, desiredExtraStaminaSize), Time.deltaTime * 10f), extraBarStamina.sizeDelta.y); extraBarOutline.sizeDelta = new Vector2(extraOutlineMaxWidth, extraBarOutline.sizeDelta.y); if (!flag && !sequencingExtraBar) { sequencingExtraBar = true; TweenSettingsExtensions.OnComplete(TweenSettingsExtensions.Append(DOTween.Sequence(), (Tween)(object)DOTweenModuleUI.DOSizeDelta(extraBar, new Vector2(extraBar.sizeDelta.x, 0f), 0.2f, false)), new TweenCallback(DisableExtraBar)); } } shieldIcon.SetActive(ObservedCharacter.data.isInvincible); campfireIcon.SetActive(!ObservedCharacter.refs.afflictions.canGetHungry); } private void DisableExtraBar() { ((Component)extraBar).gameObject.SetActive(false); sequencingExtraBar = false; } private static void RemoveAllScriptsExcept(GameObject go) { MonoBehaviour[] components = go.GetComponents(); MonoBehaviour[] array = components; foreach (MonoBehaviour val in array) { if (((object)val).GetType() != typeof(T1) && ((object)val).GetType() != typeof(T2)) { Object.DestroyImmediate((Object)(object)val); } } } internal void AddCharacterBarAffliction(CharacterBarAffliction characterBarAffliction) { characterBarAfflictions.Add(characterBarAffliction); } private void CreateInventorySlots() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0063: 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_007c: 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) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: 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_010a: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) GUIManager instance = GUIManager.instance; Sprite sprite = instance.items[0].selectedSlotIcon.sprite; Color color = ((Graphic)instance.items[0].selectedSlotIcon).color; Transform label = FindNicknameLabel(); float num = GetNicknameLabelWidth(label) + 184f; for (int i = 0; i < 3; i++) { InventorySlotUI item = CreateInventorySlot($"InvSlot_{i}", new Vector2(32f, 32f), new Vector2(num + (float)(i * 38), 43f), sprite, color); inventorySlotUIs.Add(item); } heldItemSlot = CreateInventorySlot("HoldingItemSlot", new Vector2(38f, 38f), new Vector2(num + 114f, 43f), sprite, color); for (int j = 0; j < 4; j++) { InventorySlotUI item2 = CreateInventorySlot($"BackpackSlot_{j}", new Vector2(32f, 32f), new Vector2(num + 170f + (float)(j * 38), 43f), sprite, color); backpackSlotUIs.Add(item2); } } private void UpdateInventorySlots() { //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: 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_00ca: Expected O, but got Unknown Character? observedCharacter = ObservedCharacter; if (((observedCharacter == null) ? null : observedCharacter.player?.itemSlots) == null) { ClearInventorySlots(); return; } ItemSlot[] itemSlots = ObservedCharacter.player.itemSlots; Optionable currentSelectedSlot = ObservedCharacter.refs.items.currentSelectedSlot; for (int i = 0; i < inventorySlotUIs.Count && i < itemSlots.Length; i++) { bool selected = currentSelectedSlot.IsSome && currentSelectedSlot.Value == i; inventorySlotUIs[i].SetItem(itemSlots[i], selected); } Item currentItem = ObservedCharacter.data.currentItem; if ((Object)(object)heldItemSlot != (Object)null) { ItemSlot slot = new ItemSlot(byte.MaxValue) { prefab = currentItem }; heldItemSlot.SetItem(slot, selected: true); } if (!((ItemSlot)ObservedCharacter.player.backpackSlot).IsEmpty()) { BackpackData val = default(BackpackData); ((ItemSlot)ObservedCharacter.player.backpackSlot).data.TryGetDataEntry((DataEntryKey)7, ref val); ItemSlot[] itemSlots2 = val.itemSlots; for (int j = 0; j < backpackSlotUIs.Count && j < itemSlots2.Length; j++) { backpackSlotUIs[j].SetItem(itemSlots2[j], selected: false); } return; } foreach (InventorySlotUI backpackSlotUI in backpackSlotUIs) { backpackSlotUI.Clear(); } } private void ClearInventorySlots() { foreach (InventorySlotUI inventorySlotUI in inventorySlotUIs) { inventorySlotUI.Clear(); } heldItemSlot?.Clear(); } private InventorySlotUI CreateInventorySlot(string name, Vector2 size, Vector2 position, Sprite borderSprite, Color borderColor) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Expected O, but got Unknown //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0053: 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_0057: 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_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject(name, new Type[1] { typeof(RectTransform) }); val.transform.SetParent(((Component)this).transform, false); RectTransform component = val.GetComponent(); component.sizeDelta = size; Vector2 val2 = default(Vector2); ((Vector2)(ref val2))..ctor(0f, 0.5f); component.anchorMax = val2; Vector2 anchorMin = val2; component.anchorMin = anchorMin; component.pivot = new Vector2(0f, 0.5f); component.anchoredPosition = position; InventorySlotUI inventorySlotUI = val.AddComponent(); inventorySlotUI.Initialize(borderSprite, borderColor); return inventorySlotUI; } private Transform? FindNicknameLabel() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Expected O, but got Unknown foreach (Transform item in ((Component)this).transform) { Transform val = item; if (((Object)val).name.StartsWith("CharacterName")) { return val; } } return null; } private float GetNicknameLabelWidth(Transform? label) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)label)) { return 100f; } return ((Component)label).GetComponent().sizeDelta.x; } private void UpdateStaminaBar() { //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0115: 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_0153: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Unknown result type (might be due to invalid IL or missing references) //IL_01c5: Unknown result type (might be due to invalid IL or missing references) //IL_01dd: Unknown result type (might be due to invalid IL or missing references) //IL_01e7: Unknown result type (might be due to invalid IL or missing references) //IL_0225: Unknown result type (might be due to invalid IL or missing references) //IL_0237: Unknown result type (might be due to invalid IL or missing references) //IL_0241: Unknown result type (might be due to invalid IL or missing references) //IL_0275: Unknown result type (might be due to invalid IL or missing references) //IL_029c: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)ObservedCharacter == (Object)null) { Plugin.Logger.LogDebug((object)"[UpdateStaminaBar] observedCharacter not found"); return; } foreach (CharacterBarAffliction characterBarAffliction in characterBarAfflictions) { characterBarAffliction.FetchDesiredSize(); characterBarAffliction.UpdateVisual(); } float num = Mathf.Max(0f, ObservedCharacter.data.currentStamina * fullBarRectTransform.sizeDelta.x + staminaBarOffset); if (ObservedCharacter.data.currentStamina <= 0.005f && !outOfStamina) { outOfStamina = true; OutOfStaminaPulse(); } else if (ObservedCharacter.data.currentStamina > 0.005f) { outOfStamina = false; } float num2 = Time.deltaTime * 10f; staminaBarRectTransform.sizeDelta = new Vector2(Mathf.Lerp(staminaBarRectTransform.sizeDelta.x, num, num2), staminaBarRectTransform.sizeDelta.y); float num3 = Mathf.Clamp01((staminaBarRectTransform.sizeDelta.x - num) * 0.5f); sinTime += num2 * num3; Color color = ((Graphic)glowImage).color; color.a = num3 * 0.4f - Mathf.Abs(Mathf.Sin(sinTime)) * 0.2f; ((Graphic)glowImage).color = color; float num4 = Mathf.Max(0f, ObservedCharacter.GetMaxStamina() * fullBarRectTransform.sizeDelta.x + staminaBarOffset); maxStaminaBarRectTransform.sizeDelta = new Vector2(Mathf.Lerp(maxStaminaBarRectTransform.sizeDelta.x, num4, num2), maxStaminaBarRectTransform.sizeDelta.y); float statusSum = ObservedCharacter.refs.afflictions.statusSum; staminaBarOutlineRectTransform.sizeDelta = new Vector2(14f + Mathf.Max(1f, statusSum) * fullBarRectTransform.sizeDelta.x, staminaBarOutlineRectTransform.sizeDelta.y); ((Component)staminaBarOutlineOverflowBar).gameObject.SetActive(statusSum > 1.005f); ((Component)staminaBarRectTransform).gameObject.SetActive(staminaBarRectTransform.sizeDelta.x > 0f); ((Component)maxStaminaBarRectTransform).gameObject.SetActive(maxStaminaBarRectTransform.sizeDelta.x > 0f); if (sinTime > TAU) { sinTime -= TAU; } } private void OutOfStaminaPulse() { //IL_0006: 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) ((Graphic)barImage).color = outOfStaminaColor; DOTweenModuleUI.DOColor(barImage, defaultBarColor, 0.5f); } private IEnumerator EnableIEnumerator() { ((Component)this).transform.localScale = Vector3.zero; TweenSettingsExtensions.SetEase>(ShortcutExtensions.DOScale(((Component)this).transform, PluginConfig.TeammateStaminaBarScale.Value, 0.5f), (Ease)24); yield return (object)new WaitForSeconds(0.5f); animateDisableCoroutine = null; } private IEnumerator DisableIEnumerator() { ((Component)this).transform.localScale = Vector3.one * 0.72f; TweenSettingsExtensions.SetEase>(ShortcutExtensions.DOScale(((Component)this).transform, 0f, 0.5f), (Ease)17); yield return (object)new WaitForSeconds(0.5f); ((Component)this).gameObject.SetActive(false); animateDisableCoroutine = null; } } public class InventorySlotUI : MonoBehaviour { private RectTransform rectTransform; private RawImage icon; private Image fill; private GameObject? fuelBar; private Image? fuelBarFill; private Vector2 startingSizeDelta; private Item? currentItem; private ItemInstanceData? currentData; public void Initialize(Sprite selectedSprite, Color selectedColor) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) rectTransform = ((Component)this).GetComponent(); startingSizeDelta = rectTransform.sizeDelta; CreateFuelBar(); icon = ((Component)this).gameObject.AddComponent(); ((Graphic)icon).color = new Color(1f, 1f, 1f, 0f); ((Graphic)icon).raycastTarget = false; fill = CreateFillImage("Fill", selectedSprite, selectedColor); ((Behaviour)fill).enabled = false; } public void SetItem(ItemSlot slot, bool selected) { //IL_0078: Unknown result type (might be due to invalid IL or missing references) if (!slot.IsEmpty() && slot.prefab?.UIData != null) { currentItem = slot.prefab; currentData = slot.data; if (currentItem?.UIData != null) { icon.texture = (Texture)(object)currentItem.UIData.GetIcon(); ((Behaviour)icon).enabled = true; ((Graphic)icon).color = Color.white; } UpdateCookedColor(); UpdateFuelBar(); } else { Clear(); } SetSelected(selected); } public void Clear() { //IL_003e: Unknown result type (might be due to invalid IL or missing references) ((Behaviour)fill).enabled = false; ((Behaviour)icon).enabled = false; icon.texture = null; ((Graphic)icon).color = new Color(1f, 1f, 1f, 0f); currentItem = null; currentData = null; if (Object.op_Implicit((Object)(object)fuelBar)) { fuelBar.SetActive(false); } } private void SetSelected(bool isSelected) { //IL_015c: 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_012b: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)currentItem != (Object)null || isSelected) { if (isSelected) { ShortcutExtensions.DOKill((Component)(object)rectTransform, false); TweenSettingsExtensions.SetEase>(DOTweenModuleUI.DOSizeDelta(rectTransform, startingSizeDelta * 1.2f, 0.5f, false), (Ease)24); ((Behaviour)fill).enabled = true; ((Component)fill).transform.localScale = Vector3.zero; ShortcutExtensions.DOKill((Component)(object)((Component)fill).transform, false); TweenSettingsExtensions.SetEase>(ShortcutExtensions.DOScale(((Component)fill).transform, 1f, 0.25f), (Ease)9); } else { ShortcutExtensions.DOKill((Component)(object)rectTransform, false); TweenSettingsExtensions.SetEase>(DOTweenModuleUI.DOSizeDelta(rectTransform, startingSizeDelta, 0.2f, false), (Ease)9); ((Behaviour)fill).enabled = false; } } else if (isSelected) { ShortcutExtensions.DOKill((Component)(object)rectTransform, false); Sequence val = DOTween.Sequence(); TweenSettingsExtensions.Append(val, (Tween)(object)TweenSettingsExtensions.SetEase>(DOTweenModuleUI.DOSizeDelta(rectTransform, startingSizeDelta * 1.2f, 0.075f, false), (Ease)9)); TweenSettingsExtensions.Append(val, (Tween)(object)TweenSettingsExtensions.SetEase>(DOTweenModuleUI.DOSizeDelta(rectTransform, startingSizeDelta, 0.125f, false), (Ease)2)); } else { ShortcutExtensions.DOKill((Component)(object)rectTransform, false); rectTransform.sizeDelta = startingSizeDelta; } } private void UpdateCookedColor() { //IL_0021: Unknown result type (might be due to invalid IL or missing references) ItemInstanceData val = currentData; IntItemData val2 = default(IntItemData); if (val != null && val.TryGetDataEntry((DataEntryKey)1, ref val2)) { ((Graphic)icon).color = ItemCooking.GetCookColor(val2.Value); } } private void UpdateFuelBar() { if ((Object)(object)fuelBar == (Object)null) { return; } if ((Object)(object)Character.observedCharacter != (Object)(object)Character.localCharacter) { fuelBar.SetActive(false); return; } ItemInstanceData val = currentData; FloatItemData val2 = default(FloatItemData); if (val != null && val.TryGetDataEntry((DataEntryKey)11, ref val2)) { fuelBar.SetActive(true); if ((Object)(object)fuelBarFill != (Object)null) { fuelBarFill.fillAmount = val2.Value; } } else { fuelBar.SetActive(false); if ((Object)(object)fuelBarFill != (Object)null) { fuelBarFill.fillAmount = 1f; } } } private Image CreateFillImage(string name, Sprite sprite, Color color) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Expected O, but got Unknown //IL_0034: 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_004a: 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_0075: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject(name, new Type[1] { typeof(RectTransform) }); val.transform.SetParent(((Component)this).transform, false); RectTransform component = val.GetComponent(); component.anchorMin = Vector2.zero; component.anchorMax = Vector2.one; component.sizeDelta = Vector2.zero; component.anchoredPosition = Vector2.zero; Image val2 = val.AddComponent(); val2.sprite = sprite; val2.type = (Type)1; ((Graphic)val2).color = color; ((Graphic)val2).raycastTarget = false; return val2; } private void CreateFuelBar() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown //IL_004d: 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_0077: 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_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Expected O, but got Unknown //IL_010e: 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_0126: Unknown result type (might be due to invalid IL or missing references) //IL_0132: 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) GameObject val = new GameObject("FuelBar", new Type[1] { typeof(RectTransform) }); val.transform.SetParent(((Component)this).transform, false); val.transform.SetAsFirstSibling(); RectTransform component = val.GetComponent(); component.anchorMin = new Vector2(0f, 0f); component.anchorMax = new Vector2(1f, 0f); component.sizeDelta = new Vector2(0f, 4f); component.anchoredPosition = new Vector2(0f, 2f); Image val2 = val.AddComponent(); ((Graphic)val2).color = new Color(0f, 0f, 0f, 0.5f); Sprite sprite = (val2.sprite = CreateWhiteSprite()); val2.type = (Type)1; GameObject val4 = new GameObject("Fill", new Type[1] { typeof(RectTransform) }); val4.transform.SetParent(val.transform, false); RectTransform component2 = val4.GetComponent(); component2.anchorMin = Vector2.zero; component2.anchorMax = Vector2.one; component2.sizeDelta = Vector2.zero; component2.anchoredPosition = Vector2.zero; fuelBarFill = val4.AddComponent(); ((Graphic)fuelBarFill).color = Color.yellow; fuelBarFill.sprite = sprite; fuelBarFill.type = (Type)3; fuelBarFill.fillMethod = (FillMethod)0; fuelBarFill.fillOrigin = 0; fuelBar = val; fuelBar.SetActive(false); } private Sprite CreateWhiteSprite() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_000b: 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_0035: 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) Texture2D val = new Texture2D(1, 1); val.SetPixel(0, 0, Color.white); val.Apply(); return Sprite.Create(val, new Rect(0f, 0f, 1f, 1f), Vector2.one * 0.5f); } private void OnDisable() { //IL_0045: Unknown result type (might be due to invalid IL or missing references) RectTransform obj = rectTransform; if (obj != null) { ShortcutExtensions.DOKill((Component)(object)obj, false); } Image obj2 = fill; if (obj2 != null) { Transform transform = ((Component)obj2).transform; if (transform != null) { ShortcutExtensions.DOKill((Component)(object)transform, false); } } if (Object.op_Implicit((Object)(object)rectTransform)) { rectTransform.sizeDelta = startingSizeDelta; } if (Object.op_Implicit((Object)(object)fill)) { ((Behaviour)fill).enabled = false; } } } internal sealed class MapStats : MonoBehaviour { internal static string currentLevelName = ""; internal static int currentLevelIndex = -1; private static string currentBiomesNames = ""; private static int todayLevelIndex = -1; private static int currentMapSeed = -1; private TMP_Text tmpText; private MapBaker mapBaker; private MapHandler mapHandler; private NextLevelService nextLevelService; private void Awake() { mapBaker = SingletonAsset.Instance; mapHandler = Singleton.Instance; nextLevelService = GameHandler.GetService(); if (TerrainRandomiserCompatibility.Enabled) { currentMapSeed = TerrainRandomiserCompatibility.GetRandomizerSeed(); Plugin.Logger.LogInfo((object)$"Current map seed from TerrainRandomiser: {currentMapSeed}"); } else if (TerrainCustomiserCompatibility.Enabled) { currentMapSeed = TerrainCustomiserCompatibility.GetCustomiserSeed(); Plugin.Logger.LogInfo((object)$"Current map seed from TerrainCustomiser: {currentMapSeed}"); } } private void Start() { //IL_0062: Unknown result type (might be due to invalid IL or missing references) tmpText = ((Component)this).GetComponent(); tmpText.autoSizeTextContainer = true; tmpText.textWrappingMode = (TextWrappingModes)0; tmpText.alignment = (TextAlignmentOptions)260; tmpText.lineSpacing = -20f; tmpText.fontSize = 22f; tmpText.outlineColor = new Color32((byte)0, (byte)0, (byte)0, byte.MaxValue); tmpText.outlineWidth = 0.055f; } private unsafe void Update() { try { Character localCharacter = Character.localCharacter; if (!Object.op_Implicit((Object)(object)tmpText) || !Object.op_Implicit((Object)(object)localCharacter)) { return; } if (nextLevelService.Data.IsSome && todayLevelIndex == -1) { int num = nextLevelService.NextLevelIndexOrFallback + NextLevelService.debugLevelIndexOffset; todayLevelIndex = num % mapBaker.ScenePaths.Length; Plugin.Logger.LogInfo((object)$"todayLevelIndex set to {todayLevelIndex}"); } if (currentLevelIndex == -1) { int num2 = LevelNameToIndex(currentLevelName); if (num2 != -1) { currentLevelIndex = num2; } else if (todayLevelIndex != -1) { currentLevelIndex = todayLevelIndex; } Plugin.Logger.LogInfo((object)$"currentLevelIndex set to {currentLevelIndex}"); } string text = string.Empty; if (PluginConfig.DisplayLevel.Value && currentLevelIndex != -1) { currentLevelName = GetLevelName(currentLevelIndex); text = text + "(" + currentLevelName + ")"; } if (PluginConfig.DisplayBiomes.Value) { IEnumerable values = from x in mapHandler.biomes where (int)x != 0 && (int)x != 3 && (int)x != 5 select LocalizedText.GetText(((object)(*(BiomeType*)(&x))/*cast due to .constrained prefix*/).ToString(), true); currentBiomesNames = string.Join(", ", values); text = text + "[" + currentBiomesNames + "]"; } if ((PluginConfig.DisplayTerrainRandomiserSeed.Value || PluginConfig.DisplayTerrainCustomiserSeed.Value) && currentMapSeed != -1) { text += $"<{currentMapSeed}>"; } tmpText.text = text; } catch (Exception ex) { Plugin.Logger.LogInfo((object)ex.ToString()); } } private string GetLevelName(int levelIndex) { levelIndex %= mapBaker.ScenePaths.Length; return PathUtil.WithoutExtensions(PathUtil.GetFileName(mapBaker.ScenePaths[levelIndex])); } private int LevelNameToIndex(string levelName) { for (int i = 0; i < mapBaker.ScenePaths.Length; i++) { string levelName2 = GetLevelName(i); if (string.Equals(levelName2, levelName, StringComparison.OrdinalIgnoreCase)) { return i; } } return -1; } } internal sealed class ProximityStaminaManager : MonoBehaviour { private readonly Dictionary staminaBars = new Dictionary(); private static CharacterStaminaBar CreateStaminaBar(Character observedCharacter) { //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Expected O, but got Unknown //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_018d: Unknown result type (might be due to invalid IL or missing references) //IL_01b8: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01c8: Unknown result type (might be due to invalid IL or missing references) //IL_01d4: Unknown result type (might be due to invalid IL or missing references) Transform transform = ((Component)GUIManager.instance.bar).transform; Transform val = Object.Instantiate(transform, transform.parent); Transform[] componentsInChildren = ((Component)val).GetComponentsInChildren(true); Transform[] array = componentsInChildren; foreach (Transform val2 in array) { if (((Object)val2).name == "StaminaInfo") { Object.Destroy((Object)(object)((Component)val2).gameObject); } } val.SetAsFirstSibling(); Object.Destroy((Object)(object)((Component)val).GetComponent()); CharacterStaminaBar characterStaminaBar = ((Component)val).gameObject.AddComponent(); characterStaminaBar.ObservedCharacter = observedCharacter; BarAffliction[] componentsInChildren2 = ((Component)val).GetComponentsInChildren(true); BarAffliction[] array2 = componentsInChildren2; foreach (BarAffliction val3 in array2) { CharacterBarAffliction characterBarAffliction = ((Component)val3).gameObject.AddComponent(); characterBarAffliction.afflictionType = val3.afflictionType; characterBarAffliction.FetchReferences(); Object.Destroy((Object)(object)val3); } RectTransform val4 = (RectTransform)Object.Instantiate(((Component)((Component)GUIManager.instance).GetComponentInChildren()).transform, val); AscentUI component = ((Component)val4).GetComponent(); TextMeshProUGUI text = component.text; Object.Destroy((Object)(object)component); string characterName = observedCharacter.characterName; characterName = Regex.Replace(characterName, "(|)", ""); string text2 = (((TMP_Text)text).text = characterName.TrimToByteLength(18)); string text4 = text2; ((Object)val4).name = "CharacterName: " + text4; ((TMP_Text)text).textWrappingMode = (TextWrappingModes)0; ((TMP_Text)text).fontSize = 32f; ((TMP_Text)text).autoSizeTextContainer = true; ((Graphic)text).color = observedCharacter.refs.customization.PlayerColor; ((TMP_Text)text).outlineColor = new Color32((byte)0, (byte)0, (byte)0, byte.MaxValue); ((TMP_Text)text).outlineWidth = 0.055f; Vector2 val5 = default(Vector2); ((Vector2)(ref val5))..ctor(0f, 1f); val4.anchorMin = val5; val4.anchorMax = val5; val4.pivot = Vector2.zero; val4.anchoredPosition = Vector2.zero; characterStaminaBar.AnimateEnable(); return characterStaminaBar; } private void Update() { //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)Character.localCharacter) || (!PluginConfig.DisplayTeammateStaminaBars.Value && !PluginConfig.DisplaySelfStaminaBar.Value)) { foreach (KeyValuePair staminaBar in staminaBars) { staminaBar.Value.AnimateDisable(); } return; } int value = PluginConfig.TeammateStaminaBarLimit.Value; float value2 = PluginConfig.TeammateStaminaBarProximity.Value; Character val = (MainCameraMovement.IsSpectating ? MainCameraMovement.specCharacter : Character.localCharacter); Vector3 center = val.Center; List<(float, CharacterStaminaBar)> list = new List<(float, CharacterStaminaBar)>(); foreach (Character allCharacter in Character.AllCharacters) { bool flag = PluginConfig.DisplaySelfStaminaBar.Value || !allCharacter.IsLocal; if (((Behaviour)allCharacter).isActiveAndEnabled && flag) { if (!staminaBars.TryGetValue(allCharacter, out CharacterStaminaBar value3)) { staminaBars.TryAdd(allCharacter, value3 = CreateStaminaBar(allCharacter)); } float item = Vector3.Distance(center, allCharacter.Center); list.Add((item, value3)); } } List<(float, CharacterStaminaBar)> list2 = list.OrderBy<(float, CharacterStaminaBar), float>(((float distance, CharacterStaminaBar bar) x) => x.distance).ToList(); for (int num = 0; num < list2.Count; num++) { if (num < value && list2[num].Item1 < value2) { list2[num].Item2.AnimateEnable(); } else { list2[num].Item2.AnimateDisable(); } } } } internal sealed class TimerHeightStats : MonoBehaviour { private const float ORIGINAL_LAVA_TRAVEL_TIME = 1200f; private const float ORIGINAL_FOG_SPEED = 0.4f; private static int currentSegment = -1; private static int campfireHeight; private float lastFogUpdateTime = -1f; private float lastFogHeight = -1f; private float lastFogTime = -1f; private float lastLavaUpdateTime = -1f; private float lastLavaHeight = -1f; private float lastLavaTime = -1f; private TMP_Text tmpText; private DayNightManager _dayNightManager; private MapHandler _mapHandler; private OrbFogHandler _orbFogHandler; private LavaRising _lavaRising; private static string GetTimeString(float totalSeconds) { int num = Mathf.FloorToInt(totalSeconds); int num2 = num / 3600; int num3 = num % 3600 / 60; int num4 = num % 60; return $"{num2:00}:{num3:00}:{num4:00}"; } private static string FormatTime(float seconds) { if (seconds < 60f) { return Mathf.CeilToInt(seconds) + "s"; } if (seconds < 3600f) { int num = Mathf.FloorToInt(seconds / 60f); int num2 = Mathf.CeilToInt(seconds % 60f); return $"{num}:{num2:D2}"; } int num3 = Mathf.FloorToInt(seconds / 3600f); int num4 = Mathf.FloorToInt(seconds % 3600f / 60f); return $"{num3}:{num4:D2}"; } private void Awake() { _dayNightManager = Object.FindFirstObjectByType(); _mapHandler = Singleton.Instance; _orbFogHandler = Singleton.Instance; _lavaRising = Singleton.Instance; } private void Start() { //IL_0062: Unknown result type (might be due to invalid IL or missing references) tmpText = ((Component)this).GetComponent(); tmpText.autoSizeTextContainer = true; tmpText.textWrappingMode = (TextWrappingModes)0; tmpText.alignment = (TextAlignmentOptions)258; tmpText.lineSpacing = -40f; tmpText.fontSize = 26f; tmpText.outlineColor = new Color32((byte)0, (byte)0, (byte)0, byte.MaxValue); tmpText.outlineWidth = 0.055f; } private void Update() { try { Character localCharacter = Character.localCharacter; if (Object.op_Implicit((Object)(object)tmpText) && Object.op_Implicit((Object)(object)localCharacter)) { UpdateCachedCampfireHeight(); CharacterStats stats = Character.observedCharacter.refs.stats; StringBuilder stringBuilder = new StringBuilder(128); AppendTimerText(stringBuilder); AppendDayNightStatus(stringBuilder); AppendHeightInfo(stringBuilder, stats); AppendFogOrLavaStats(stringBuilder, stats); tmpText.text = stringBuilder.ToString(); } } catch (Exception ex) { Plugin.Logger.LogInfo((object)ex.ToString()); } } private void AppendTimerText(StringBuilder sb) { if (PluginConfig.DisplayTimer.Value) { string timeString = GetTimeString(RunManager.Instance.timeSinceRunStarted); sb.Append(timeString); } } private void AppendDayNightStatus(StringBuilder sb) { if (PluginConfig.DisplayDayNightCountdown.Value) { if (sb.Length > 0 && PluginConfig.DisplayTimer.Value) { sb.Append(" | "); } var (arg, num) = CalculateDayNightStatus(_dayNightManager.timeOfDay); sb.AppendFormat("({0}: {1:P0})", arg, num); } } private (string status, float countdown) CalculateDayNightStatus(float timeOfDay) { if (timeOfDay >= 5f && timeOfDay < 21f) { return (status: "Day", countdown: 1f - (timeOfDay - 5f) / 16f); } float num = ((timeOfDay < 5f) ? (timeOfDay + 24f) : timeOfDay); return (status: "Night", countdown: 1f - (num - 21f) / 8f); } private void AppendHeightInfo(StringBuilder sb, CharacterStats stats) { if (PluginConfig.DisplayHeight.Value) { if (sb.Length > 0 && (PluginConfig.DisplayTimer.Value || PluginConfig.DisplayDayNightCountdown.Value)) { sb.AppendLine(); } if (campfireHeight == -1) { sb.AppendFormat("{0}m", stats.heightInMeters); } else { sb.AppendFormat("{0}m/{1}m", stats.heightInMeters, campfireHeight); } } } private void UpdateCachedCampfireHeight() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected I4, but got Unknown //IL_0058: Unknown result type (might be due to invalid IL or missing references) int num = (int)_mapHandler.GetCurrentSegment(); if (currentSegment != num) { currentSegment = num; MapSegment val = _mapHandler.segments[currentSegment]; if ((Object)(object)((val != null) ? val.segmentCampfire : null) != (Object)null) { Campfire componentInChildren = val.segmentCampfire.GetComponentInChildren(); campfireHeight = Mathf.RoundToInt(CharacterStats.unitsToMeters * ((Component)componentInChildren).transform.position.y); } else { campfireHeight = -1; } } } private void AppendFogOrLavaStats(StringBuilder sb, CharacterStats stats) { //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: 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 (!PluginConfig.DisplayFog.Value && !PluginConfig.DisplayLava.Value) { return; } bool flag = PluginConfig.DisplayFog.Value && (Object)(object)_orbFogHandler != (Object)null && _orbFogHandler.isMoving; bool flag2 = PluginConfig.DisplayLava.Value && (Object)(object)_lavaRising != (Object)null && _lavaRising.started && !_lavaRising.ended; if (!flag && !flag2) { return; } string value = string.Empty; string value2 = string.Empty; if (flag && campfireHeight != -1) { if ((lastFogUpdateTime < 0f || Time.time - lastFogUpdateTime > 1f) && (Object)(object)_orbFogHandler?.sphere != (Object)null) { float num = Vector3.Distance(_orbFogHandler.sphere.fogPoint, stats.character.Center); float num2 = num - _orbFogHandler.currentSize; lastFogUpdateTime = Time.time; lastFogHeight = stats.heightInMeters - Math.Abs(num2); if (num2 < 0f && _orbFogHandler.speed > 0f) { lastFogTime = Mathf.Abs(num2 / _orbFogHandler.speed); } else { lastFogTime = 0f; } } if (lastFogHeight > 0f) { value = ((lastFogTime > 0f) ? $"(<#00BCFF>{Mathf.CeilToInt(lastFogHeight)}m/{FormatTime(Mathf.CeilToInt(lastFogTime))})" : $"(<#00BCFF>{Mathf.CeilToInt(lastFogHeight)}m)"); } } if (flag2 && campfireHeight == -1) { if (Time.time - lastLavaUpdateTime > 1f && (Object)(object)_lavaRising?.lava != (Object)null) { float num3 = ((Component)_lavaRising.lava).transform.position.y * CharacterStats.unitsToMeters; float num4 = stats.heightInMeters - num3; if (lastLavaUpdateTime >= 0f && num4 > 0f) { float num5 = Time.time - lastLavaUpdateTime; float num6 = num3 - lastLavaHeight; float num7 = num6 / Mathf.Max(0.0001f, num5); if (num7 > 0.001f) { lastLavaTime = num4 / num7; } else { lastLavaTime = 0f; } } lastLavaHeight = num3; lastLavaUpdateTime = Time.time; } if (lastLavaHeight > 0f) { value2 = ((lastLavaTime > 0f) ? $"(<#FF4500>{Mathf.CeilToInt(lastLavaHeight)}m/{FormatTime(Mathf.CeilToInt(lastLavaTime))})" : $"(<#FF4500>{Mathf.CeilToInt(lastLavaHeight)}m)"); } } if (string.IsNullOrEmpty(value) && string.IsNullOrEmpty(value2)) { return; } if (sb.Length > 0 && (PluginConfig.DisplayTimer.Value || PluginConfig.DisplayDayNightCountdown.Value || PluginConfig.DisplayHeight.Value)) { sb.Append(" | "); } if (!string.IsNullOrEmpty(value)) { sb.Append(value); if ((Object)(object)_orbFogHandler != (Object)null) { float num8 = _orbFogHandler.speed / 0.4f; sb.Append($" [<#00BCFF>{num8:F2}x]"); } } else if (!string.IsNullOrEmpty(value2)) { sb.Append(value2); if ((Object)(object)_lavaRising != (Object)null) { float num9 = 1200f / _lavaRising.travelTime; sb.Append($" [<#FF4500>{num9:F2}x]"); } } } } } namespace PeakStatsEx.Compatibility { internal static class TerrainCustomiserCompatibility { private const string PluginGuid = "com.snosz.terraincustomiser"; private const string PlayerInfoManagerTypeName = "TerrainCustomiser.Managers.PlayerInfoManager"; private const BindingFlags StaticFieldFlags = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; private const BindingFlags InstanceFieldFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; internal static bool Enabled => Chainloader.PluginInfos.ContainsKey("com.snosz.terraincustomiser"); [MethodImpl(MethodImplOptions.NoInlining)] internal static int GetCustomiserSeed() { object obj = typeof(Plugin).Assembly.GetType("TerrainCustomiser.Managers.PlayerInfoManager")?.GetField("currentMapSyncData", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)?.GetValue(null); object obj2 = obj?.GetType().GetField("seed", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.GetValue(obj); if (obj2 is int) { return (int)obj2; } return -1; } } internal static class TerrainRandomiserCompatibility { internal static bool Enabled => Chainloader.PluginInfos.ContainsKey("com.snosz.terrainrandomiser"); [MethodImpl(MethodImplOptions.NoInlining)] internal static bool IsEnableRandomizer() { if (Object.op_Implicit((Object)(object)Plugin.Instance)) { return Plugin.Instance.mapSettings.enableRandomiser; } return false; } [MethodImpl(MethodImplOptions.NoInlining)] internal static int GetRandomizerSeed() { if (!IsEnableRandomizer()) { return -1; } return Plugin.Instance.mapSettings.seed; } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }